ngx-edu-sharing-metaqs2 0.9.37 → 0.9.38

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.
@@ -1,40 +1,45 @@
1
- import { Component, computed, effect, Input, signal } from '@angular/core';
1
+ import { Component, computed, DestroyRef, Directive, inject, Input, signal } from '@angular/core';
2
2
  import { MatCard, MatCardContent, MatCardHeader, MatCardModule, MatCardTitle } from '@angular/material/card';
3
3
  import { MatTooltip } from '@angular/material/tooltip';
4
4
  import { MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, MatTableModule } from '@angular/material/table';
5
- import { BehaviorSubject, zip } from 'rxjs';
5
+ import { BehaviorSubject, of, Subject } from 'rxjs';
6
6
  import { TranslateModule } from '@ngx-translate/core';
7
7
  import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
8
+ import { MetaApiService } from '../meta-api.service';
8
9
  import { DateTime } from 'luxon';
9
- import { filter, finalize, map, skipWhile, switchMap, take, tap } from 'rxjs/operators';
10
+ import { distinctUntilChanged, filter, finalize, map, skipWhile, switchMap, take, tap, throttleTime, } from 'rxjs/operators';
10
11
  import { FormControl, FormGroup, FormsModule } from '@angular/forms';
11
12
  import { DatepickerComponent } from '../components/filter/datepicker/datepicker.component';
12
13
  import { MatIcon } from '@angular/material/icon';
13
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
+ import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
14
15
  import { MatSlideToggle } from '@angular/material/slide-toggle';
15
16
  import { ProgressSpinnerComponent } from '../components/loading_indicator/progress-spinner/progress-spinner.component';
17
+ import { EditorialLinkService } from '../components/editorial-link-service/editorial-link.service';
16
18
  import { MatRipple } from '@angular/material/core';
17
19
  import * as i0 from "@angular/core";
18
- import * as i1 from "../meta-api.service";
19
- import * as i2 from "../components/editorial-link-service/editorial-link.service";
20
- import * as i3 from "@angular/material/card";
21
- import * as i4 from "@angular/material/table";
22
- import * as i5 from "@ngx-translate/core";
23
- import * as i6 from "@angular/forms";
24
- export class CountsWithHistoryComponent {
25
- constructor(metaApi, destroyRef, linkService) {
26
- this.metaApi = metaApi;
27
- this.destroyRef = destroyRef;
28
- this.linkService = linkService;
20
+ import * as i1 from "@angular/material/card";
21
+ import * as i2 from "@angular/material/table";
22
+ import * as i3 from "@ngx-translate/core";
23
+ import * as i4 from "@angular/forms";
24
+ export class BaseHistoricDataTableDirective {
25
+ constructor() {
26
+ this.metaApi = inject(MetaApiService);
27
+ this.destroyRef = inject(DestroyRef);
28
+ this.linkService = inject(EditorialLinkService);
29
+ this.columnTranslationkey = null;
29
30
  this.loadingCount = signal(0);
30
31
  this.isLoading = computed(() => this.loadingCount() > 0);
32
+ this.isHistoryEnabled = signal(false);
33
+ this.isHistoryEnabled$ = toObservable(this.isHistoryEnabled);
31
34
  this.timeFilterLoaded = signal(false);
32
35
  this.recentTypeCount$ = new BehaviorSubject({ columns: [], rows: [] });
33
36
  this.pastTypeCount$ = new BehaviorSubject({ columns: [], rows: [] });
34
37
  this.DateTime = DateTime;
35
38
  this.columns = signal([]);
36
- this.apiMethod = 'getMaterialTypeCountsByReplicationSource';
37
- this.columnTranslationkey = null;
39
+ this.dataForPastData$ = new Subject();
40
+ this.dataForRecentData$ = new Subject();
41
+ this.startValues$ = this.dataForPastData$.pipe(filter((data) => this.validateLoadingData(data)), distinctUntilChanged((a, b) => this.compareLoadingDataEqual(a, b)), throttleTime(500), switchMap((start) => this.getCountByDate(start)), tap((it) => this.pastTypeCount$.next(it)), takeUntilDestroyed(this.destroyRef));
42
+ this.endValues$ = this.dataForRecentData$.pipe(filter((data) => this.validateLoadingData(data)), distinctUntilChanged((a, b) => this.compareLoadingDataEqual(a, b)), throttleTime(500), switchMap((end) => this.getCountByDate(end)), tap((it) => this.recentTypeCount$.next(it)), tap((it) => this.columns.set(it.columns.slice())), takeUntilDestroyed(this.destroyRef));
38
43
  /* In this widget's backend we do have data for today
39
44
  * therefore we set the end date to today and use the timerange() endpoint to only set the start date
40
45
  */
@@ -42,7 +47,11 @@ export class CountsWithHistoryComponent {
42
47
  start: new FormControl(),
43
48
  end: new FormControl(DateTime.utc().startOf('day'), { nonNullable: true }),
44
49
  });
45
- this.isHistoryEnabled = signal(false);
50
+ this.timerangeStart$ = of(undefined).pipe(switchMap(() => this.getAvailableDateRange()), take(1), map((rangeFilter) => this.getStartDateOfRange(rangeFilter)), tap((startDate) => {
51
+ //this is to have a default value for the start date => the min date of the range
52
+ this.range.setControl('start', new FormControl(startDate, { nonNullable: true }));
53
+ this.timeFilterLoaded.set(true);
54
+ }), takeUntilDestroyed(this.destroyRef));
46
55
  this.allColumns = computed(() => {
47
56
  if (!this.isHistoryEnabled()) {
48
57
  return this.recentColumns();
@@ -58,39 +67,9 @@ export class CountsWithHistoryComponent {
58
67
  this.pastColumns = computed(() => {
59
68
  return this.columns().map((c) => c.id + '_past');
60
69
  });
61
- effect(() => {
62
- this.range.controls.end.reset();
63
- if (!this.isHistoryEnabled()) {
64
- this.range.controls.start.setValue(this.range.controls.end.value.startOf('day'));
65
- }
66
- else {
67
- this.range.controls.start.reset();
68
- }
69
- });
70
70
  }
71
- ngOnInit() {
72
- this.getAvailableDateRange()
73
- .pipe(tap((rangeFilter) => {
74
- const startDate = this.getStartDateOfRange(rangeFilter);
75
- //this is to have a default value for the start date => the min date of the range
76
- this.range.setControl('start', new FormControl(startDate, { nonNullable: true }));
77
- }), finalize(() => {
78
- this.timeFilterLoaded.set(true);
79
- this.range.controls.start.reset();
80
- }), takeUntilDestroyed(this.destroyRef))
81
- .subscribe();
82
- this.getCountByDate(this.range.controls.end.value)
83
- .pipe(tap((response) => {
84
- this.columns.set(response.columns.slice());
85
- this.recentTypeCount$.next(response);
86
- }), takeUntilDestroyed(this.destroyRef))
87
- .subscribe();
88
- this.getValuesInDateRange()
89
- .pipe(tap(([past, recent]) => {
90
- this.pastTypeCount$.next(past);
91
- this.recentTypeCount$.next(recent);
92
- }), takeUntilDestroyed(this.destroyRef))
93
- .subscribe();
71
+ getAvailableDateRange() {
72
+ return of(undefined).pipe(tap(() => this.loadingCount.update((it) => it + 1)), switchMap(() => this.metaApi.getTimerangeFilter()), filter((filter) => filter != null), tap(() => this.loadingCount.update((it) => it - 1)));
94
73
  }
95
74
  getStartDateOfRange(rangeFilter) {
96
75
  return DateTime.fromISO(rangeFilter.values.find((v) => v.id === 'rangeStart')?.label, {
@@ -100,26 +79,6 @@ export class CountsWithHistoryComponent {
100
79
  columnIdent(_index, col) {
101
80
  return col.id;
102
81
  }
103
- getAvailableDateRange() {
104
- this.loadingCount.update((it) => it + 1);
105
- return this.metaApi.getTimerangeFilter().pipe(filter((filter) => filter != null), finalize(() => this.loadingCount.update((it) => it - 1)));
106
- }
107
- getValuesInDateRange() {
108
- return this.range.valueChanges.pipe(filter((range) => !!range.start?.isValid && !!range.end?.isValid), switchMap((range) => {
109
- return zip(this.getCountByDate(range.start), this.getCountByDate(range.end));
110
- }));
111
- }
112
- getCountByDate(date) {
113
- this.loadingCount.update((it) => it + 1);
114
- const filter = {
115
- field: 'asOf',
116
- values: [{ id: date.toISO({ includeOffset: false }), label: '' }],
117
- };
118
- return this.metaApi[this.apiMethod]([filter]).pipe(finalize(() => this.loadingCount.update((it) => it - 1)), map((response) => ({
119
- ...response,
120
- rows: response.rows.toSorted((a, b) => a.meta.label.localeCompare(b.meta.label)),
121
- })));
122
- }
123
82
  pastTypeCount(row, columnid) {
124
83
  if (!this.pastTypeCount$.value.rows.length) {
125
84
  return {};
@@ -144,8 +103,75 @@ export class CountsWithHistoryComponent {
144
103
  return this.linkService.createLinkForCountsWithHistory(this.sourceType, sourceId, issueId);
145
104
  }));
146
105
  }
147
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, deps: [{ token: i1.MetaApiService }, { token: i0.DestroyRef }, { token: i2.EditorialLinkService }], target: i0.ɵɵFactoryTarget.Component }); }
148
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CountsWithHistoryComponent, isStandalone: true, selector: "metaqs2-counts-with-history", inputs: { apiMethod: "apiMethod", columnTranslationkey: "columnTranslationkey", pageTitle: "pageTitle", sourceType: "sourceType" }, ngImport: i0, template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate }}{{ isLoading() ? \": Lade neue Daten.\" : \"\" }}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content class=\"toolbar\">\n <div style=\"flex: 1 1 auto\"></div>\n <metaqs2-datepicker style=\"display: inline-block\" matRipple #datepickerRipple=\"matRipple\" [disabled]=\"isLoading() || !isHistoryEnabled()\" [inputGroup]=\"range\" *ngIf=\"timeFilterLoaded() && isHistoryEnabled()\"></metaqs2-datepicker>\n <mat-slide-toggle [ngModel]=\"isHistoryEnabled()\" (ngModelChange)=\"isHistoryEnabled.set($event)\" [disabled]=\"isLoading()\" *ngIf=\"timeFilterLoaded()\">\n <label>Zeige historische Daten</label>\n </mat-slide-toggle>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <metaqs2-progress-spinner [displayProgressSpinner]=\"isLoading()\"></metaqs2-progress-spinner>\n <table [class.while-loading]=\"isLoading()\" mat-table [dataSource]=\"recentTypeCount$.value.rows\"\n class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th [attr.rowspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef>\n <div>Quelle</div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [matTooltip]=\"row.meta.alt_label\"\n class=\"label-col mat-cell-level-{{row.meta.level + 1}}\"\n >\n {{ row.meta.label }}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_type'\">\n <th [attr.colspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef [matTooltip]=\"col.label\">\n {{ columnTranslationkey ? (columnTranslationkey + col.label | translate) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef\n matTooltip=\"no tooltip\">{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}\n </th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? '\u2013' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\">\n {{ (pastTypeCount$ | async)?.rows?.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\" >\n <ng-container *ngIf=\"(pastTypeCount$ | async)?.rows?.length && pastTypeCount(row, col.id) as trend\">\n <span [class]=\"trend.trend\"> {{ trend.value ?? '\u2013' }}\n <mat-icon *ngIf=\"trend.value\" aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{ trend.trend }}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns()); sticky:true;\"></tr>\n <tr [hidden]=\"!isHistoryEnabled()\" mat-header-row *matHeaderRowDef=\"allColumns(); sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns())\"></tr>\n\n </table>\n</mat-card>\n", styles: [".while-loading{filter:blur(2px)}tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}.toolbar,.actionbar{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;gap:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatepickerComponent, selector: "metaqs2-datepicker", inputs: ["disabled", "inputGroup"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ProgressSpinnerComponent, selector: "metaqs2-progress-spinner", inputs: ["color", "diameter", "strokeWidth", "backdropEnabled", "positionGloballyCenter", "displayProgressSpinner"] }, { kind: "directive", type: MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }] }); }
106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseHistoricDataTableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
107
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: BaseHistoricDataTableDirective, inputs: { apiMethod: "apiMethod", columnTranslationkey: "columnTranslationkey", pageTitle: "pageTitle", sourceType: "sourceType" }, ngImport: i0 }); }
108
+ }
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseHistoricDataTableDirective, decorators: [{
110
+ type: Directive
111
+ }], propDecorators: { apiMethod: [{
112
+ type: Input
113
+ }], columnTranslationkey: [{
114
+ type: Input
115
+ }], pageTitle: [{
116
+ type: Input
117
+ }], sourceType: [{
118
+ type: Input,
119
+ args: [{ required: true }]
120
+ }] } });
121
+ export class CountsWithHistoryComponent extends BaseHistoricDataTableDirective {
122
+ ngOnInit() {
123
+ this.apiMethod ??= 'getMaterialTypeCountsByReplicationSource';
124
+ this.range.valueChanges
125
+ .pipe(tap((data) => {
126
+ this.dataForPastData$.next({ date: data.start });
127
+ this.dataForRecentData$.next({ date: data.end });
128
+ }), takeUntilDestroyed(this.destroyRef))
129
+ .subscribe();
130
+ this.isHistoryEnabled$
131
+ .pipe(tap((enabled) => {
132
+ this.range.controls.end.reset();
133
+ if (!enabled) {
134
+ this.startDateSubscription?.unsubscribe();
135
+ this.startValuesSubscription?.unsubscribe();
136
+ return;
137
+ }
138
+ this.range.controls.start.reset();
139
+ if (!this.timeFilterLoaded()) {
140
+ this.startDateSubscription = this.timerangeStart$
141
+ .pipe(take(1), tap(() => {
142
+ this.startValuesSubscription = this.startValues$.subscribe();
143
+ this.range.controls.start.reset();
144
+ }))
145
+ .subscribe();
146
+ }
147
+ else {
148
+ this.startValuesSubscription = this.startValues$.subscribe();
149
+ this.range.controls.start.reset();
150
+ }
151
+ }), takeUntilDestroyed(this.destroyRef))
152
+ .subscribe();
153
+ this.endValues$.subscribe();
154
+ }
155
+ getCountByDate(data) {
156
+ const filter = {
157
+ field: 'asOf',
158
+ values: [{ id: data.date.toISO({ includeOffset: false }), label: '' }],
159
+ };
160
+ return of(undefined).pipe(tap(() => this.loadingCount.update((it) => it + 1)), switchMap(() => {
161
+ return this.metaApi[this.apiMethod]([filter]).pipe(finalize(() => this.loadingCount.update((it) => it - 1)));
162
+ }), map((response) => ({
163
+ ...response,
164
+ rows: response.rows.toSorted((a, b) => a.meta.label.localeCompare(b.meta.label)),
165
+ })));
166
+ }
167
+ validateLoadingData(data) {
168
+ return data.date?.isValid ?? false;
169
+ }
170
+ compareLoadingDataEqual(a, b) {
171
+ return a.date.equals(b.date);
172
+ }
173
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
174
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CountsWithHistoryComponent, isStandalone: true, selector: "metaqs2-counts-with-history", usesInheritance: true, ngImport: i0, template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate }}{{ isLoading() ? \": Lade neue Daten.\" : \"\" }}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content class=\"toolbar\">\n <metaqs2-datepicker style=\"display: inline-block\" matRipple [disabled]=\"isLoading() || !isHistoryEnabled()\" [inputGroup]=\"range\" *ngIf=\"timeFilterLoaded() && isHistoryEnabled()\"></metaqs2-datepicker>\n <div style=\"flex: 1 1 auto\"></div>\n <mat-slide-toggle [ngModel]=\"isHistoryEnabled()\" (ngModelChange)=\"isHistoryEnabled.set($event)\" [disabled]=\"isLoading()\">\n <label>Zeige historische Daten</label>\n </mat-slide-toggle>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <metaqs2-progress-spinner [displayProgressSpinner]=\"isLoading()\"></metaqs2-progress-spinner>\n <table [class.while-loading]=\"isLoading()\" mat-table [dataSource]=\"recentTypeCount$.value.rows\"\n class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th [attr.rowspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef>\n <div>Quelle</div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [matTooltip]=\"row.meta.alt_label\"\n class=\"label-col mat-cell-level-{{row.meta.level + 1}}\"\n >\n {{ row.meta.label }}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_type'\">\n <th [attr.colspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef [matTooltip]=\"col.label\">\n {{ columnTranslationkey ? (columnTranslationkey + col.label | translate) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef\n matTooltip=\"no tooltip\">{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}\n </th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? '\u2013' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\">\n {{ (pastTypeCount$ | async)?.rows?.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\" >\n <ng-container *ngIf=\"(pastTypeCount$ | async)?.rows?.length && pastTypeCount(row, col.id) as trend\">\n <span [class]=\"trend.trend\"> {{ trend.value ?? '\u2013' }}\n <mat-icon *ngIf=\"trend.value\" aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{ trend.trend }}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns()); sticky:true;\"></tr>\n <tr [hidden]=\"!isHistoryEnabled()\" mat-header-row *matHeaderRowDef=\"allColumns(); sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns())\"></tr>\n\n </table>\n</mat-card>\n", styles: [".while-loading{filter:blur(2px)}tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}.toolbar,.actionbar{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;gap:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i1.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i1.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatepickerComponent, selector: "metaqs2-datepicker", inputs: ["disabled", "inputGroup"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ProgressSpinnerComponent, selector: "metaqs2-progress-spinner", inputs: ["color", "diameter", "strokeWidth", "backdropEnabled", "positionGloballyCenter", "displayProgressSpinner"] }, { kind: "directive", type: MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }] }); }
149
175
  }
150
176
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, decorators: [{
151
177
  type: Component,
@@ -172,16 +198,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
172
198
  AsyncPipe,
173
199
  ProgressSpinnerComponent,
174
200
  MatRipple,
175
- ], template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate }}{{ isLoading() ? \": Lade neue Daten.\" : \"\" }}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content class=\"toolbar\">\n <div style=\"flex: 1 1 auto\"></div>\n <metaqs2-datepicker style=\"display: inline-block\" matRipple #datepickerRipple=\"matRipple\" [disabled]=\"isLoading() || !isHistoryEnabled()\" [inputGroup]=\"range\" *ngIf=\"timeFilterLoaded() && isHistoryEnabled()\"></metaqs2-datepicker>\n <mat-slide-toggle [ngModel]=\"isHistoryEnabled()\" (ngModelChange)=\"isHistoryEnabled.set($event)\" [disabled]=\"isLoading()\" *ngIf=\"timeFilterLoaded()\">\n <label>Zeige historische Daten</label>\n </mat-slide-toggle>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <metaqs2-progress-spinner [displayProgressSpinner]=\"isLoading()\"></metaqs2-progress-spinner>\n <table [class.while-loading]=\"isLoading()\" mat-table [dataSource]=\"recentTypeCount$.value.rows\"\n class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th [attr.rowspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef>\n <div>Quelle</div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [matTooltip]=\"row.meta.alt_label\"\n class=\"label-col mat-cell-level-{{row.meta.level + 1}}\"\n >\n {{ row.meta.label }}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_type'\">\n <th [attr.colspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef [matTooltip]=\"col.label\">\n {{ columnTranslationkey ? (columnTranslationkey + col.label | translate) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef\n matTooltip=\"no tooltip\">{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}\n </th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? '\u2013' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\">\n {{ (pastTypeCount$ | async)?.rows?.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\" >\n <ng-container *ngIf=\"(pastTypeCount$ | async)?.rows?.length && pastTypeCount(row, col.id) as trend\">\n <span [class]=\"trend.trend\"> {{ trend.value ?? '\u2013' }}\n <mat-icon *ngIf=\"trend.value\" aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{ trend.trend }}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns()); sticky:true;\"></tr>\n <tr [hidden]=\"!isHistoryEnabled()\" mat-header-row *matHeaderRowDef=\"allColumns(); sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns())\"></tr>\n\n </table>\n</mat-card>\n", styles: [".while-loading{filter:blur(2px)}tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}.toolbar,.actionbar{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;gap:.5rem}\n"] }]
176
- }], ctorParameters: () => [{ type: i1.MetaApiService }, { type: i0.DestroyRef }, { type: i2.EditorialLinkService }], propDecorators: { apiMethod: [{
177
- type: Input,
178
- args: [{ required: true }]
179
- }], columnTranslationkey: [{
180
- type: Input
181
- }], pageTitle: [{
182
- type: Input
183
- }], sourceType: [{
184
- type: Input,
185
- args: [{ required: true }]
186
- }] } });
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckgsT0FBTyxFQUFFLGVBQWUsRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcs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OytJQWNELFNBQVM7c0JBRFIsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBSXpCLG9CQUFvQjtzQkFEbkIsS0FBSztnQkFHTixTQUFTO3NCQURSLEtBQUs7Z0JBR04sVUFBVTtzQkFEVCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgSW5wdXQsIE9uSW5pdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRDYXJkLCBNYXRDYXJkQ29udGVudCwgTWF0Q2FyZEhlYWRlciwgTWF0Q2FyZE1vZHVsZSwgTWF0Q2FyZFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBNYXRIZWFkZXJSb3csIE1hdEhlYWRlclJvd0RlZiwgTWF0Um93LCBNYXRSb3dEZWYsIE1hdFRhYmxlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNZXRhQXBpU2VydmljZSB9IGZyb20gJy4uL21ldGEtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyLCBNYXRyaXhSb3dXaXRoQ291bnRzLCBNYXRyaXhXaXRoQ291bnRzLCBRdWFsaXR5TWF0cml4SGVhZGVyIH0gZnJvbSAnLi4vamF2YS1hcGknO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpbmFsaXplLCBtYXAsIHNraXBXaGlsZSwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2ZpbHRlci9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IFByb2dyZXNzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbG9hZGluZ19pbmRpY2F0b3IvcHJvZ3Jlc3Mtc3Bpbm5lci9wcm9ncmVzcy1zcGlubmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGl0b3JpYWxMaW5rU2VydmljZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvZWRpdG9yaWFsLWxpbmstc2VydmljZS9lZGl0b3JpYWwtbGluay5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFJpcHBsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBNZXRob2RUeXBlID1cbiAgfCAoKGl0OiBGaWx0ZXJbXSkgPT4gT2JzZXJ2YWJsZTxNYXRyaXhXaXRoQ291bnRzPilcbiAgfCAoKHg6IHN0cmluZywgaXQ6IEZpbHRlcltdKSA9PiBPYnNlcnZhYmxlPE1hdHJpeFdpdGhDb3VudHM+KTtcblxuZXhwb3J0IHR5cGUgUGlja0tleXNCeVByb3BlcnR5VHlwZTxUT2JqZWN0IGV4dGVuZHMgb2JqZWN0LCBUUHJvcGVydHlUeXBlPiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVE9iamVjdF06IFRPYmplY3RbVEtleV0gZXh0ZW5kcyBUUHJvcGVydHlUeXBlID8gVEtleSA6IG5ldmVyO1xufVtrZXlvZiBUT2JqZWN0XTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWV0YXFzMi1jb3VudHMtd2l0aC1oaXN0b3J5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdENhcmRNb2R1bGUsXG4gICAgTWF0Q2FyZCxcbiAgICBNYXRDYXJkSGVhZGVyLFxuICAgIE1hdENhcmRUaXRsZSxcbiAgICBNYXRDYXJkQ29udGVudCxcbiAgICBNYXRUb29sdGlwLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFRhYmxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRIZWFkZXJSb3csXG4gICAgTWF0SGVhZGVyUm93RGVmLFxuICAgIE1hdFJvdyxcbiAgICBNYXRSb3dEZWYsXG4gICAgTmdGb3JPZixcbiAgICBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgIE1hdEljb24sXG4gICAgTmdJZixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgUHJvZ3Jlc3NTcGlubmVyQ29tcG9uZW50LFxuICAgIE1hdFJpcHBsZSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIENvdW50c1dpdGhIaXN0b3J5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvYWRpbmdDb3VudCA9IHNpZ25hbCgwKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTG9hZGluZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubG9hZGluZ0NvdW50KCkgPiAwKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVGaWx0ZXJMb2FkZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjZW50VHlwZUNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0cml4V2l0aENvdW50cz4oeyBjb2x1bW5zOiBbXSwgcm93czogW10gfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBwYXN0VHlwZUNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0cml4V2l0aENvdW50cz4oeyBjb2x1bW5zOiBbXSwgcm93czogW10gfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBEYXRlVGltZSA9IERhdGVUaW1lO1xuICBwdWJsaWMgY29sdW1ucyA9IHNpZ25hbChbXSBhcyBBcnJheTxRdWFsaXR5TWF0cml4SGVhZGVyPik7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgYXBpTWV0aG9kOiBQaWNrS2V5c0J5UHJvcGVydHlUeXBlPE1ldGFBcGlTZXJ2aWNlLCBNZXRob2RUeXBlPiA9ICdnZXRNYXRlcmlhbFR5cGVDb3VudHNCeVJlcGxpY2F0aW9uU291cmNlJztcblxuICBASW5wdXQoKVxuICBjb2x1bW5UcmFuc2xhdGlvbmtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzb3VyY2VUeXBlOiAncmVwbGljYXRpb25Tb3VyY2UnIHwgJ2NvbGxlY3Rpb24nO1xuXG4gIC8qIEluIHRoaXMgd2lkZ2V0J3MgYmFja2VuZCB3ZSBkbyBoYXZlIGRhdGEgZm9yIHRvZGF5XG4gICAqIHRoZXJlZm9yZSB3ZSBzZXQgdGhlIGVuZCBkYXRlIHRvIHRvZGF5IGFuZCB1c2UgdGhlIHRpbWVyYW5nZSgpIGVuZHBvaW50IHRvIG9ubHkgc2V0IHRoZSBzdGFydCBkYXRlXG4gICAqL1xuICByZWFkb25seSByYW5nZTogRm9ybUdyb3VwPHtcbiAgICBzdGFydDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICAgIGVuZDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICB9PiA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbChEYXRlVGltZS51dGMoKS5zdGFydE9mKCdkYXknKSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgfSk7XG4gIHJlYWRvbmx5IGlzSGlzdG9yeUVuYWJsZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGFsbENvbHVtbnMgPSBjb21wdXRlZDxBcnJheTxzdHJpbmc+PigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzSGlzdG9yeUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVjZW50Q29sdW1ucygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXN0Q29sdW1ucygpLmZsYXRNYXAoKGUsIGkpID0+IFtlLCB0aGlzLnJlY2VudENvbHVtbnMoKVtpXV0pO1xuICB9KTtcblxuICByZWFkb25seSB0eXBlQ29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zKCkubWFwKChjKSA9PiBjLmlkICsgJ190eXBlJyk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHJlY2VudENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucygpLm1hcCgoYykgPT4gYy5pZCArICdfcmVjZW50Jyk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHBhc3RDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMoKS5tYXAoKGMpID0+IGMuaWQgKyAnX3Bhc3QnKTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1ldGFBcGk6IE1ldGFBcGlTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbGlua1NlcnZpY2U6IEVkaXRvcmlhbExpbmtTZXJ2aWNlXG4gICkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLmVuZC5yZXNldCgpO1xuICAgICAgaWYgKCF0aGlzLmlzSGlzdG9yeUVuYWJsZWQoKSkge1xuICAgICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnNldFZhbHVlKHRoaXMucmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlLnN0YXJ0T2YoJ2RheScpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmFuZ2UuY29udHJvbHMuc3RhcnQucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0QXZhaWxhYmxlRGF0ZVJhbmdlKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJhbmdlRmlsdGVyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5nZXRTdGFydERhdGVPZlJhbmdlKHJhbmdlRmlsdGVyKTtcbiAgICAgICAgICAvL3RoaXMgaXMgdG8gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdGFydCBkYXRlID0+IHRoZSBtaW4gZGF0ZSBvZiB0aGUgcmFuZ2VcbiAgICAgICAgICB0aGlzLnJhbmdlLnNldENvbnRyb2woJ3N0YXJ0JywgbmV3IEZvcm1Db250cm9sPERhdGVUaW1lPHRydWU+PihzdGFydERhdGUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSkpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGltZUZpbHRlckxvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5yYW5nZS5jb250cm9scy5zdGFydC5yZXNldCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmdldENvdW50QnlEYXRlKHRoaXMucmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnMuc2V0KHJlc3BvbnNlLmNvbHVtbnMuc2xpY2UoKSk7XG4gICAgICAgICAgdGhpcy5yZWNlbnRUeXBlQ291bnQkLm5leHQocmVzcG9uc2UpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmdldFZhbHVlc0luRGF0ZVJhbmdlKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKFtwYXN0LCByZWNlbnRdKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYXN0VHlwZUNvdW50JC5uZXh0KHBhc3QpO1xuICAgICAgICAgIHRoaXMucmVjZW50VHlwZUNvdW50JC5uZXh0KHJlY2VudCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydERhdGVPZlJhbmdlKHJhbmdlRmlsdGVyOiBGaWx0ZXIpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUlTTyhyYW5nZUZpbHRlci52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gJ3JhbmdlU3RhcnQnKT8ubGFiZWwhLCB7XG4gICAgICB6b25lOiAndXRjJyxcbiAgICB9KS5zdGFydE9mKCdkYXknKSBhcyBEYXRlVGltZTx0cnVlPjtcbiAgfVxuXG4gIGNvbHVtbklkZW50KF9pbmRleDogbnVtYmVyLCBjb2w6IFF1YWxpdHlNYXRyaXhIZWFkZXIpIHtcbiAgICByZXR1cm4gY29sLmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdmFpbGFibGVEYXRlUmFuZ2UoKSB7XG4gICAgdGhpcy5sb2FkaW5nQ291bnQudXBkYXRlKChpdCkgPT4gaXQgKyAxKTtcbiAgICByZXR1cm4gdGhpcy5tZXRhQXBpLmdldFRpbWVyYW5nZUZpbHRlcigpLnBpcGUoXG4gICAgICBmaWx0ZXIoKGZpbHRlcik6IGZpbHRlciBpcyBGaWx0ZXIgPT4gZmlsdGVyICE9IG51bGwpLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5sb2FkaW5nQ291bnQudXBkYXRlKChpdCkgPT4gaXQgLSAxKSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFZhbHVlc0luRGF0ZVJhbmdlKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgZmlsdGVyKFxuICAgICAgICAocmFuZ2UpOiByYW5nZSBpcyB7IHN0YXJ0OiBEYXRlVGltZTx0cnVlPjsgZW5kOiBEYXRlVGltZTx0cnVlPiB9ID0+XG4gICAgICAgICAgISFyYW5nZS5zdGFydD8uaXNWYWxpZCAmJiAhIXJhbmdlLmVuZD8uaXNWYWxpZFxuICAgICAgKSxcbiAgICAgIHN3aXRjaE1hcCgocmFuZ2UpID0+IHtcbiAgICAgICAgcmV0dXJuIHppcCh0aGlzLmdldENvdW50QnlEYXRlKHJhbmdlLnN0YXJ0KSwgdGhpcy5nZXRDb3VudEJ5RGF0ZShyYW5nZS5lbmQpKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3VudEJ5RGF0ZShkYXRlOiBEYXRlVGltZSk6IE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz4ge1xuICAgIHRoaXMubG9hZGluZ0NvdW50LnVwZGF0ZSgoaXQpID0+IGl0ICsgMSk7XG4gICAgY29uc3QgZmlsdGVyOiBGaWx0ZXIgPSB7XG4gICAgICBmaWVsZDogJ2FzT2YnLFxuICAgICAgdmFsdWVzOiBbeyBpZDogZGF0ZS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pISwgbGFiZWw6ICcnIH1dLFxuICAgIH07XG5cbiAgICByZXR1cm4gKHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0gYXMgKGZpbHRlcnM6IEZpbHRlcltdKSA9PiBPYnNlcnZhYmxlPE1hdHJpeFdpdGhDb3VudHM+KShbZmlsdGVyXSkucGlwZShcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZ0NvdW50LnVwZGF0ZSgoaXQpID0+IGl0IC0gMSkpLFxuICAgICAgbWFwKChyZXNwb25zZSkgPT4gKHtcbiAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgIHJvd3M6IHJlc3BvbnNlLnJvd3MudG9Tb3J0ZWQoKGEsIGIpID0+IGEubWV0YS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubWV0YS5sYWJlbCkpLFxuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXN0VHlwZUNvdW50KFxuICAgIHJvdzogTWF0cml4Um93V2l0aENvdW50cyxcbiAgICBjb2x1bW5pZDogc3RyaW5nXG4gICk6IHsgZGVsdGE/OiBudW1iZXI7IHRyZW5kPzogc3RyaW5nOyB2YWx1ZT86IG51bWJlciB9IHtcbiAgICBpZiAoIXRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcGFzdF9yb3cgPSB0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MuZmluZCgocHIpID0+IHByLm1ldGEuaWQgPT0gcm93Lm1ldGEuaWQpO1xuICAgIGNvbnN0IHBhc3RfY29sdW1uID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zLmZpbmQoKGMpID0+IGMuaWQgPT0gY29sdW1uaWQpO1xuICAgIGlmICghcGFzdF9yb3cgfHwgIXBhc3RfY29sdW1uKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gcm93LmNvdW50c1tjb2x1bW5pZF07XG4gICAgY29uc3QgcGFzdFZhbHVlID0gcGFzdF9yb3cuY291bnRzW2NvbHVtbmlkXTtcblxuICAgIGNvbnN0IGRlbHRhID0gKGN1cnJlbnRWYWx1ZSB8fCAwKSAtIChwYXN0VmFsdWUgfHwgMCk7XG4gICAgY29uc3QgdHJlbmQgPSBkZWx0YSA9PT0gMCA/ICd0cmVuZGluZ19mbGF0JyA6IGRlbHRhIDwgMCA/ICd0cmVuZGluZ19kb3duJyA6ICd0cmVuZGluZ191cCc7XG4gICAgcmV0dXJuIHsgZGVsdGEsIHRyZW5kLCB2YWx1ZTogcGFzdFZhbHVlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3BlbkluRWRpdG9yKHNvdXJjZUlkOiBzdHJpbmcsIGlzc3VlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnNvdXJjZVR5cGUgPT09ICdyZXBsaWNhdGlvblNvdXJjZScpIHtcbiAgICAgIC8vIGZpbmQgdGhlIGxvbmcgbmFtZSBmb3IgdGhlIHNvdXJjZVxuICAgICAgc291cmNlSWQgPSB0aGlzLnJlY2VudFR5cGVDb3VudCQudmFsdWUucm93cy5maW5kKChyKSA9PiByLm1ldGEuaWQgPT09IHNvdXJjZUlkKT8ubWV0YS5sYWJlbCB8fCBzb3VyY2VJZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGlua1NlcnZpY2UudHlwZXNMb2FkZWQkLnBpcGUoXG4gICAgICBza2lwV2hpbGUoKGxvYWRlZCkgPT4gIWxvYWRlZCksXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlua1NlcnZpY2UuY3JlYXRlTGlua0ZvckNvdW50c1dpdGhIaXN0b3J5KHRoaXMuc291cmNlVHlwZSwgc291cmNlSWQsIGlzc3VlSWQpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCI8bWF0LWNhcmQgYXBwZWFyYW5jZT1cInJhaXNlZFwiPlxuICA8bWF0LWNhcmQtaGVhZGVyICpuZ0lmPVwicGFnZVRpdGxlXCI+XG4gICAgPG1hdC1jYXJkLXRpdGxlIGRhdGEtdGVzdC1pZD1cInBhZ2UtdGl0bGVcIj5cbiAgICAgIFF1YWxpdMOkdHNtZXRyaWs6IHt7IHBhZ2VUaXRsZSB8IHRyYW5zbGF0ZSB9fXt7IGlzTG9hZGluZygpID8gXCI6IExhZGUgbmV1ZSBEYXRlbi5cIiA6IFwiXCIgfX1cbiAgICA8L21hdC1jYXJkLXRpdGxlPlxuICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgPCEtLSBjb25zaWRlciB0byBwdXQgdGhlIGZpbHRlciBpbiB0aGUgdGFibGUgaGVhZGVyIHRvIGF2b2lkIHRoYXQgaXQgaXMgc2Nyb2xsZWQgb3V0IG9mIHZpZXctLT5cbiAgPCEtLSBzaG93IHRoZSBmaWx0ZXIgYWZ0ZXIgdGhlIHZhbHVlcyBhcmUgbG9hZGVkIHRvIGF2b2lkIGxvYWRpbmcgY3VycmVudCBkYXRhIHR3aWNlIC0tPlxuICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cInRvb2xiYXJcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMSAxIGF1dG9cIj48L2Rpdj5cbiAgICA8bWV0YXFzMi1kYXRlcGlja2VyIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrXCIgbWF0UmlwcGxlICNkYXRlcGlja2VyUmlwcGxlPVwibWF0UmlwcGxlXCIgW2Rpc2FibGVkXT1cImlzTG9hZGluZygpIHx8ICFpc0hpc3RvcnlFbmFibGVkKClcIiBbaW5wdXRHcm91cF09XCJyYW5nZVwiICpuZ0lmPVwidGltZUZpbHRlckxvYWRlZCgpICYmIGlzSGlzdG9yeUVuYWJsZWQoKVwiPjwvbWV0YXFzMi1kYXRlcGlja2VyPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtuZ01vZGVsXT1cImlzSGlzdG9yeUVuYWJsZWQoKVwiIChuZ01vZGVsQ2hhbmdlKT1cImlzSGlzdG9yeUVuYWJsZWQuc2V0KCRldmVudClcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nKClcIiAqbmdJZj1cInRpbWVGaWx0ZXJMb2FkZWQoKVwiPlxuICAgICAgPGxhYmVsPlplaWdlIGhpc3RvcmlzY2hlIERhdGVuPC9sYWJlbD5cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbjwvbWF0LWNhcmQ+XG48bWF0LWNhcmQ+XG4gIDxtZXRhcXMyLXByb2dyZXNzLXNwaW5uZXIgW2Rpc3BsYXlQcm9ncmVzc1NwaW5uZXJdPVwiaXNMb2FkaW5nKClcIj48L21ldGFxczItcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgPHRhYmxlIFtjbGFzcy53aGlsZS1sb2FkaW5nXT1cImlzTG9hZGluZygpXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInJlY2VudFR5cGVDb3VudCQudmFsdWUucm93c1wiXG4gICAgICAgICBjbGFzcz1cInF1YWxpdHktbWF0cml4XCI+XG4gICAgPCEtLSBEZWZpbmUgY29sdW1ucyBvZiB0YWJsZSAtLT5cbiAgICA8IS0tIFJvdyBIZWFkZXIgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFiZWwtY29sXCIgc3RpY2t5PlxuICAgICAgPHRoIFthdHRyLnJvd3NwYW5dPVwiaXNIaXN0b3J5RW5hYmxlZCgpID8gJzInIDogJzEnXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICA8ZGl2PlF1ZWxsZTwvZGl2PlxuICAgICAgPC90aD5cbiAgICAgIDx0ZFxuICAgICAgICBtYXQtY2VsbFxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJyb3cubWV0YS5hbHRfbGFiZWxcIlxuICAgICAgICBjbGFzcz1cImxhYmVsLWNvbCBtYXQtY2VsbC1sZXZlbC17e3Jvdy5tZXRhLmxldmVsICsgMX19XCJcbiAgICAgID5cbiAgICAgICAge3sgcm93Lm1ldGEubGFiZWwgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIChyZWNlbnRUeXBlQ291bnQkIHwgYXN5bmMpPy5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCJcbiAgICAgICAgICAgICAgICAgIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ190eXBlJ1wiPlxuICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwiaXNIaXN0b3J5RW5hYmxlZCgpID8gJzInIDogJzEnXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFttYXRUb29sdGlwXT1cImNvbC5sYWJlbFwiPlxuICAgICAgICB7eyBjb2x1bW5UcmFuc2xhdGlvbmtleSA/IChjb2x1bW5UcmFuc2xhdGlvbmtleSArIGNvbC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2wubGFiZWwgfX1cbiAgICAgIDwvdGg+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgZGF0ZS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiAocmVjZW50VHlwZUNvdW50JCB8IGFzeW5jKT8uY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiXG4gICAgICAgICAgICAgICAgICBbbWF0Q29sdW1uRGVmXT1cImNvbC5pZCArICdfcmVjZW50J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJubyB0b29sdGlwXCI+e3sgcmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICA8YSBbYXR0ci5ocmVmXT1cIm9wZW5JbkVkaXRvcihyb3cubWV0YS5pZCwgY29sLmlkKSB8IGFzeW5jXCIgdGFyZ2V0PVwiZWRpdG9yX2Zyb250ZW5kXCI+e3sgcm93LmNvdW50c1tjb2wuaWRdID8/ICfigJMnIH19PC9hPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG9sZGVyIGRhdGUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgKHJlY2VudFR5cGVDb3VudCQgfCBhc3luYyk/LmNvbHVtbnM7IHRyYWNrQnk6Y29sdW1uSWRlbnRcIlxuICAgICAgICAgICAgICAgICAgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3Bhc3QnXCI+XG4gICAgICA8dGggY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiPlxuICAgICAgICB7eyAocGFzdFR5cGVDb3VudCQgfCBhc3luYyk/LnJvd3M/Lmxlbmd0aCA/IHJhbmdlLmNvbnRyb2xzLnN0YXJ0LnZhbHVlLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpIDogJ25vIHBhc3QgZGF0YScgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztcIiA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIocGFzdFR5cGVDb3VudCQgfCBhc3luYyk/LnJvd3M/Lmxlbmd0aCAmJiBwYXN0VHlwZUNvdW50KHJvdywgY29sLmlkKSBhcyB0cmVuZFwiPlxuICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJ0cmVuZC50cmVuZFwiPiB7eyB0cmVuZC52YWx1ZSA/PyAn4oCTJyB9fVxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwidHJlbmQudmFsdWVcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVuZC50cmVuZFwiIFtmb250SWNvbl09XCJ0cmVuZC50cmVuZCFcIiAvPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57eyB0cmVuZC50cmVuZCB9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gZ2VuZXJhdGUgYWN0dWFsIHRhYmxlIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiWydsYWJlbC1jb2wnXS5jb25jYXQodHlwZUNvbHVtbnMoKSk7IHN0aWNreTp0cnVlO1wiPjwvdHI+XG4gICAgPHRyIFtoaWRkZW5dPVwiIWlzSGlzdG9yeUVuYWJsZWQoKVwiIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJhbGxDb2x1bW5zKCk7IHN0aWNreTogdHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2xhYmVsLWNvbCddLmNvbmNhdChhbGxDb2x1bW5zKCkpXCI+PC90cj5cblxuICA8L3RhYmxlPlxuPC9tYXQtY2FyZD5cbiJdfQ==
201
+ ], template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate }}{{ isLoading() ? \": Lade neue Daten.\" : \"\" }}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content class=\"toolbar\">\n <metaqs2-datepicker style=\"display: inline-block\" matRipple [disabled]=\"isLoading() || !isHistoryEnabled()\" [inputGroup]=\"range\" *ngIf=\"timeFilterLoaded() && isHistoryEnabled()\"></metaqs2-datepicker>\n <div style=\"flex: 1 1 auto\"></div>\n <mat-slide-toggle [ngModel]=\"isHistoryEnabled()\" (ngModelChange)=\"isHistoryEnabled.set($event)\" [disabled]=\"isLoading()\">\n <label>Zeige historische Daten</label>\n </mat-slide-toggle>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <metaqs2-progress-spinner [displayProgressSpinner]=\"isLoading()\"></metaqs2-progress-spinner>\n <table [class.while-loading]=\"isLoading()\" mat-table [dataSource]=\"recentTypeCount$.value.rows\"\n class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th [attr.rowspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef>\n <div>Quelle</div>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [matTooltip]=\"row.meta.alt_label\"\n class=\"label-col mat-cell-level-{{row.meta.level + 1}}\"\n >\n {{ row.meta.label }}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_type'\">\n <th [attr.colspan]=\"isHistoryEnabled() ? '2' : '1'\" mat-header-cell *matHeaderCellDef [matTooltip]=\"col.label\">\n {{ columnTranslationkey ? (columnTranslationkey + col.label | translate) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef\n matTooltip=\"no tooltip\">{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}\n </th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? '\u2013' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of (recentTypeCount$ | async)?.columns; trackBy:columnIdent\"\n [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\">\n {{ (pastTypeCount$ | async)?.rows?.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\" >\n <ng-container *ngIf=\"(pastTypeCount$ | async)?.rows?.length && pastTypeCount(row, col.id) as trend\">\n <span [class]=\"trend.trend\"> {{ trend.value ?? '\u2013' }}\n <mat-icon *ngIf=\"trend.value\" aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{ trend.trend }}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns()); sticky:true;\"></tr>\n <tr [hidden]=\"!isHistoryEnabled()\" mat-header-row *matHeaderRowDef=\"allColumns(); sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns())\"></tr>\n\n </table>\n</mat-card>\n", styles: [".while-loading{filter:blur(2px)}tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}.toolbar,.actionbar{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;gap:.5rem}\n"] }]
202
+ }] });
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWtCLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqQyxP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d0JBQXdCO3dCQUN4QixTQUFTO3FCQUNWIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBpbmplY3QsIElucHV0LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2FyZCwgTWF0Q2FyZENvbnRlbnQsIE1hdENhcmRIZWFkZXIsIE1hdENhcmRNb2R1bGUsIE1hdENhcmRUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0SGVhZGVyUm93LCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvdywgTWF0Um93RGVmLCBNYXRUYWJsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBVbnN1YnNjcmliYWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yT2YsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWV0YUFwaVNlcnZpY2UgfSBmcm9tICcuLi9tZXRhLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlciwgTWF0cml4Um93V2l0aENvdW50cywgTWF0cml4V2l0aENvdW50cywgUXVhbGl0eU1hdHJpeEhlYWRlciB9IGZyb20gJy4uL2phdmEtYXBpJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHtcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgZmluYWxpemUsXG4gIG1hcCxcbiAgc2tpcFdoaWxlLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbiAgdGhyb3R0bGVUaW1lLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2ZpbHRlci9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9sb2FkaW5nX2luZGljYXRvci9wcm9ncmVzcy1zcGlubmVyL3Byb2dyZXNzLXNwaW5uZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRvcmlhbExpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9lZGl0b3JpYWwtbGluay1zZXJ2aWNlL2VkaXRvcmlhbC1saW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0UmlwcGxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5cbmV4cG9ydCB0eXBlIFBpY2tLZXlzQnlQcm9wZXJ0eVR5cGU8VE9iamVjdCBleHRlbmRzIG9iamVjdCwgVFByb3BlcnR5VHlwZT4gPSB7XG4gIFtUS2V5IGluIGtleW9mIFRPYmplY3RdOiBUT2JqZWN0W1RLZXldIGV4dGVuZHMgVFByb3BlcnR5VHlwZSA/IFRLZXkgOiBuZXZlcjtcbn1ba2V5b2YgVE9iamVjdF07XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VIaXN0b3JpY0RhdGFUYWJsZURpcmVjdGl2ZTxcbiAgVExvYWRpbmdEYXRhIGV4dGVuZHMgb2JqZWN0LFxuICBUTWV0aG9kVHlwZSBleHRlbmRzIE1ldGFBcGlTZXJ2aWNlW2tleW9mIE1ldGFBcGlTZXJ2aWNlXSAmIEZ1bmN0aW9uXG4+IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1ldGFBcGkgPSBpbmplY3QoTWV0YUFwaVNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpbmtTZXJ2aWNlID0gaW5qZWN0KEVkaXRvcmlhbExpbmtTZXJ2aWNlKTtcblxuICBASW5wdXQoKVxuICBhcGlNZXRob2Q6IFBpY2tLZXlzQnlQcm9wZXJ0eVR5cGU8TWV0YUFwaVNlcnZpY2UsIFRNZXRob2RUeXBlPjtcbiAgQElucHV0KClcbiAgY29sdW1uVHJhbnNsYXRpb25rZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKVxuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc291cmNlVHlwZTogJ3JlcGxpY2F0aW9uU291cmNlJyB8ICdjb2xsZWN0aW9uJztcblxuICBwcm90ZWN0ZWQgbG9hZGluZ0NvdW50ID0gc2lnbmFsKDApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNMb2FkaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5sb2FkaW5nQ291bnQoKSA+IDApO1xuICByZWFkb25seSBpc0hpc3RvcnlFbmFibGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzSGlzdG9yeUVuYWJsZWQkID0gdG9PYnNlcnZhYmxlKHRoaXMuaXNIaXN0b3J5RW5hYmxlZCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVGaWx0ZXJMb2FkZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVjZW50VHlwZUNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoeyBjb2x1bW5zOiBbXSwgcm93czogW10gfSBhcyBNYXRyaXhXaXRoQ291bnRzKTtcbiAgcHJvdGVjdGVkIHBhc3RUeXBlQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7IGNvbHVtbnM6IFtdLCByb3dzOiBbXSB9IGFzIE1hdHJpeFdpdGhDb3VudHMpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRGF0ZVRpbWUgPSBEYXRlVGltZTtcbiAgcHVibGljIGNvbHVtbnMgPSBzaWduYWwoW10gYXMgQXJyYXk8UXVhbGl0eU1hdHJpeEhlYWRlcj4pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhRm9yUGFzdERhdGEkID0gbmV3IFN1YmplY3Q8UGFydGlhbDxUTG9hZGluZ0RhdGE+PigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YUZvclJlY2VudERhdGEkID0gbmV3IFN1YmplY3Q8UGFydGlhbDxUTG9hZGluZ0RhdGE+PigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdGFydFZhbHVlcyQgPSB0aGlzLmRhdGFGb3JQYXN0RGF0YSQucGlwZShcbiAgICBmaWx0ZXIoKGRhdGEpID0+IHRoaXMudmFsaWRhdGVMb2FkaW5nRGF0YShkYXRhKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IHRoaXMuY29tcGFyZUxvYWRpbmdEYXRhRXF1YWwoYSwgYikpLFxuICAgIHRocm90dGxlVGltZSg1MDApLFxuICAgIHN3aXRjaE1hcCgoc3RhcnQpID0+IHRoaXMuZ2V0Q291bnRCeURhdGUoc3RhcnQpKSxcbiAgICB0YXAoKGl0KSA9PiB0aGlzLnBhc3RUeXBlQ291bnQkLm5leHQoaXQpKSxcbiAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW5kVmFsdWVzJCA9IHRoaXMuZGF0YUZvclJlY2VudERhdGEkLnBpcGUoXG4gICAgZmlsdGVyKChkYXRhKSA9PiB0aGlzLnZhbGlkYXRlTG9hZGluZ0RhdGEoZGF0YSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiB0aGlzLmNvbXBhcmVMb2FkaW5nRGF0YUVxdWFsKGEsIGIpKSxcbiAgICB0aHJvdHRsZVRpbWUoNTAwKSxcbiAgICBzd2l0Y2hNYXAoKGVuZCkgPT4gdGhpcy5nZXRDb3VudEJ5RGF0ZShlbmQpKSxcbiAgICB0YXAoKGl0KSA9PiB0aGlzLnJlY2VudFR5cGVDb3VudCQubmV4dChpdCkpLFxuICAgIHRhcCgoaXQpID0+IHRoaXMuY29sdW1ucy5zZXQoaXQuY29sdW1ucy5zbGljZSgpKSksXG4gICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgKTtcblxuICBwcm90ZWN0ZWQgc3RhcnREYXRlU3Vic2NyaXB0aW9uOiBVbnN1YnNjcmliYWJsZSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHN0YXJ0VmFsdWVzU3Vic2NyaXB0aW9uOiBVbnN1YnNjcmliYWJsZSB8IHVuZGVmaW5lZDtcblxuICAvKiBJbiB0aGlzIHdpZGdldCdzIGJhY2tlbmQgd2UgZG8gaGF2ZSBkYXRhIGZvciB0b2RheVxuICAgKiB0aGVyZWZvcmUgd2Ugc2V0IHRoZSBlbmQgZGF0ZSB0byB0b2RheSBhbmQgdXNlIHRoZSB0aW1lcmFuZ2UoKSBlbmRwb2ludCB0byBvbmx5IHNldCB0aGUgc3RhcnQgZGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2U6IEZvcm1Hcm91cDx7XG4gICAgc3RhcnQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgICBlbmQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgfT4gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sKCksXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2woRGF0ZVRpbWUudXRjKCkuc3RhcnRPZignZGF5JyksIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0aW1lcmFuZ2VTdGFydCQgPSBvZih1bmRlZmluZWQpLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0QXZhaWxhYmxlRGF0ZVJhbmdlKCkpLFxuICAgIHRha2UoMSksXG4gICAgbWFwKChyYW5nZUZpbHRlcikgPT4gdGhpcy5nZXRTdGFydERhdGVPZlJhbmdlKHJhbmdlRmlsdGVyKSksXG4gICAgdGFwKChzdGFydERhdGUpID0+IHtcbiAgICAgIC8vdGhpcyBpcyB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN0YXJ0IGRhdGUgPT4gdGhlIG1pbiBkYXRlIG9mIHRoZSByYW5nZVxuICAgICAgdGhpcy5yYW5nZS5zZXRDb250cm9sKCdzdGFydCcsIG5ldyBGb3JtQ29udHJvbDxEYXRlVGltZTx0cnVlPj4oc3RhcnREYXRlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pKTtcbiAgICAgIHRoaXMudGltZUZpbHRlckxvYWRlZC5zZXQodHJ1ZSk7XG4gICAgfSksXG4gICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgKTtcblxuICByZWFkb25seSBhbGxDb2x1bW5zID0gY29tcHV0ZWQ8QXJyYXk8c3RyaW5nPj4oKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc0hpc3RvcnlFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlY2VudENvbHVtbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFzdENvbHVtbnMoKS5mbGF0TWFwKChlLCBpKSA9PiBbZSwgdGhpcy5yZWNlbnRDb2x1bW5zKClbaV1dKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdHlwZUNvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucygpLm1hcCgoYykgPT4gYy5pZCArICdfdHlwZScpO1xuICB9KTtcblxuICByZWFkb25seSByZWNlbnRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMoKS5tYXAoKGMpID0+IGMuaWQgKyAnX3JlY2VudCcpO1xuICB9KTtcblxuICByZWFkb25seSBwYXN0Q29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zKCkubWFwKChjKSA9PiBjLmlkICsgJ19wYXN0Jyk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDb3VudEJ5RGF0ZShkYXRlOiBUTG9hZGluZ0RhdGEpOiBPYnNlcnZhYmxlPE1hdHJpeFdpdGhDb3VudHM+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdmFsaWRhdGVMb2FkaW5nRGF0YShkYXRhOiBQYXJ0aWFsPFRMb2FkaW5nRGF0YT4pOiBkYXRhIGlzIFRMb2FkaW5nRGF0YTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbXBhcmVMb2FkaW5nRGF0YUVxdWFsKGE6IFRMb2FkaW5nRGF0YSwgYjogVExvYWRpbmdEYXRhKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRGF0ZVJhbmdlKCkge1xuICAgIHJldHVybiBvZih1bmRlZmluZWQpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nQ291bnQudXBkYXRlKChpdCkgPT4gaXQgKyAxKSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5tZXRhQXBpLmdldFRpbWVyYW5nZUZpbHRlcigpKSxcbiAgICAgIGZpbHRlcigoZmlsdGVyKTogZmlsdGVyIGlzIEZpbHRlciA9PiBmaWx0ZXIgIT0gbnVsbCksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nQ291bnQudXBkYXRlKChpdCkgPT4gaXQgLSAxKSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0U3RhcnREYXRlT2ZSYW5nZShyYW5nZUZpbHRlcjogRmlsdGVyKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21JU08ocmFuZ2VGaWx0ZXIudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09ICdyYW5nZVN0YXJ0Jyk/LmxhYmVsISwge1xuICAgICAgem9uZTogJ3V0YycsXG4gICAgfSkuc3RhcnRPZignZGF5JykgYXMgRGF0ZVRpbWU8dHJ1ZT47XG4gIH1cblxuICBwdWJsaWMgY29sdW1uSWRlbnQoX2luZGV4OiBudW1iZXIsIGNvbDogUXVhbGl0eU1hdHJpeEhlYWRlcikge1xuICAgIHJldHVybiBjb2wuaWQ7XG4gIH1cblxuICBwdWJsaWMgcGFzdFR5cGVDb3VudChyb3c6IE1hdHJpeFJvd1dpdGhDb3VudHMsIGNvbHVtbmlkOiBzdHJpbmcpOiB7IGRlbHRhPzogbnVtYmVyOyB0cmVuZD86IHN0cmluZzsgdmFsdWU/OiBudW1iZXIgfSB7XG4gICAgaWYgKCF0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3Rfcm93ID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmZpbmQoKHByKSA9PiBwci5tZXRhLmlkID09IHJvdy5tZXRhLmlkKTtcbiAgICBjb25zdCBwYXN0X2NvbHVtbiA9IHRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09IGNvbHVtbmlkKTtcbiAgICBpZiAoIXBhc3Rfcm93IHx8ICFwYXN0X2NvbHVtbikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHJvdy5jb3VudHNbY29sdW1uaWRdO1xuICAgIGNvbnN0IHBhc3RWYWx1ZSA9IHBhc3Rfcm93LmNvdW50c1tjb2x1bW5pZF07XG5cbiAgICBjb25zdCBkZWx0YSA9IChjdXJyZW50VmFsdWUgfHwgMCkgLSAocGFzdFZhbHVlIHx8IDApO1xuICAgIGNvbnN0IHRyZW5kID0gZGVsdGEgPT09IDAgPyAndHJlbmRpbmdfZmxhdCcgOiBkZWx0YSA8IDAgPyAndHJlbmRpbmdfZG93bicgOiAndHJlbmRpbmdfdXAnO1xuICAgIHJldHVybiB7IGRlbHRhLCB0cmVuZCwgdmFsdWU6IHBhc3RWYWx1ZSB9O1xuICB9XG5cbiAgcHVibGljIG9wZW5JbkVkaXRvcihzb3VyY2VJZDogc3RyaW5nLCBpc3N1ZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5zb3VyY2VUeXBlID09PSAncmVwbGljYXRpb25Tb3VyY2UnKSB7XG4gICAgICAvLyBmaW5kIHRoZSBsb25nIG5hbWUgZm9yIHRoZSBzb3VyY2VcbiAgICAgIHNvdXJjZUlkID0gdGhpcy5yZWNlbnRUeXBlQ291bnQkLnZhbHVlLnJvd3MuZmluZCgocikgPT4gci5tZXRhLmlkID09PSBzb3VyY2VJZCk/Lm1ldGEubGFiZWwgfHwgc291cmNlSWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpbmtTZXJ2aWNlLnR5cGVzTG9hZGVkJC5waXBlKFxuICAgICAgc2tpcFdoaWxlKChsb2FkZWQpID0+ICFsb2FkZWQpLFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtTZXJ2aWNlLmNyZWF0ZUxpbmtGb3JDb3VudHNXaXRoSGlzdG9yeSh0aGlzLnNvdXJjZVR5cGUsIHNvdXJjZUlkLCBpc3N1ZUlkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIExvYWRpbmdEYXRhID0ge1xuICBkYXRlOiBEYXRlVGltZTtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21ldGFxczItY291bnRzLXdpdGgtaGlzdG9yeScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRDYXJkTW9kdWxlLFxuICAgIE1hdENhcmQsXG4gICAgTWF0Q2FyZEhlYWRlcixcbiAgICBNYXRDYXJkVGl0bGUsXG4gICAgTWF0Q2FyZENvbnRlbnQsXG4gICAgTWF0VG9vbHRpcCxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRUYWJsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0SGVhZGVyUm93LFxuICAgIE1hdEhlYWRlclJvd0RlZixcbiAgICBNYXRSb3csXG4gICAgTWF0Um93RGVmLFxuICAgIE5nRm9yT2YsXG4gICAgRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICBNYXRJY29uLFxuICAgIE5nSWYsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0U2xpZGVUb2dnbGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIFByb2dyZXNzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBNYXRSaXBwbGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBDb3VudHNXaXRoSGlzdG9yeUNvbXBvbmVudFxuICBleHRlbmRzIEJhc2VIaXN0b3JpY0RhdGFUYWJsZURpcmVjdGl2ZTxMb2FkaW5nRGF0YSwgKGZpbHRlcnM6IEZpbHRlcltdKSA9PiBPYnNlcnZhYmxlPE1hdHJpeFdpdGhDb3VudHM+PlxuICBpbXBsZW1lbnRzIE9uSW5pdFxue1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwaU1ldGhvZCA/Pz0gJ2dldE1hdGVyaWFsVHlwZUNvdW50c0J5UmVwbGljYXRpb25Tb3VyY2UnO1xuXG4gICAgdGhpcy5yYW5nZS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGFGb3JQYXN0RGF0YSQubmV4dCh7IGRhdGU6IGRhdGEuc3RhcnQgfSk7XG4gICAgICAgICAgdGhpcy5kYXRhRm9yUmVjZW50RGF0YSQubmV4dCh7IGRhdGU6IGRhdGEuZW5kIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuaXNIaXN0b3J5RW5hYmxlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGVuYWJsZWQpID0+IHtcbiAgICAgICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLmVuZC5yZXNldCgpO1xuICAgICAgICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnJlc2V0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLnRpbWVGaWx0ZXJMb2FkZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVyYW5nZVN0YXJ0JFxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWVzU3Vic2NyaXB0aW9uID0gdGhpcy5zdGFydFZhbHVlcyQuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZXNTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXJ0VmFsdWVzJC5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2UuY29udHJvbHMuc3RhcnQucmVzZXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5lbmRWYWx1ZXMkLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvdW50QnlEYXRlKGRhdGE6IExvYWRpbmdEYXRhKTogT2JzZXJ2YWJsZTxNYXRyaXhXaXRoQ291bnRzPiB7XG4gICAgY29uc3QgZmlsdGVyOiBGaWx0ZXIgPSB7XG4gICAgICBmaWVsZDogJ2FzT2YnLFxuICAgICAgdmFsdWVzOiBbeyBpZDogZGF0YS5kYXRlLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkhLCBsYWJlbDogJycgfV0sXG4gICAgfTtcblxuICAgIHJldHVybiBvZih1bmRlZmluZWQpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nQ291bnQudXBkYXRlKChpdCkgPT4gaXQgKyAxKSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhQXBpW3RoaXMuYXBpTWV0aG9kXShbZmlsdGVyXSkucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmxvYWRpbmdDb3VudC51cGRhdGUoKGl0KSA9PiBpdCAtIDEpKSk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgocmVzcG9uc2UpID0+ICh7XG4gICAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgICByb3dzOiByZXNwb25zZS5yb3dzLnRvU29ydGVkKChhLCBiKSA9PiBhLm1ldGEubGFiZWwubG9jYWxlQ29tcGFyZShiLm1ldGEubGFiZWwpKSxcbiAgICAgIH0pKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVMb2FkaW5nRGF0YShkYXRhOiBQYXJ0aWFsPExvYWRpbmdEYXRhPik6IGRhdGEgaXMgTG9hZGluZ0RhdGEge1xuICAgIHJldHVybiBkYXRhLmRhdGU/LmlzVmFsaWQgPz8gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcGFyZUxvYWRpbmdEYXRhRXF1YWwoYTogTG9hZGluZ0RhdGEsIGI6IExvYWRpbmdEYXRhKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGEuZGF0ZS5lcXVhbHMoYi5kYXRlKTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJyYWlzZWRcIj5cbiAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cInBhZ2VUaXRsZVwiPlxuICAgIDxtYXQtY2FyZC10aXRsZSBkYXRhLXRlc3QtaWQ9XCJwYWdlLXRpdGxlXCI+XG4gICAgICBRdWFsaXTDpHRzbWV0cmlrOiB7eyBwYWdlVGl0bGUgfCB0cmFuc2xhdGUgfX17eyBpc0xvYWRpbmcoKSA/IFwiOiBMYWRlIG5ldWUgRGF0ZW4uXCIgOiBcIlwiIH19XG4gICAgPC9tYXQtY2FyZC10aXRsZT5cbiAgPC9tYXQtY2FyZC1oZWFkZXI+XG4gIDwhLS0gY29uc2lkZXIgdG8gcHV0IHRoZSBmaWx0ZXIgaW4gdGhlIHRhYmxlIGhlYWRlciB0byBhdm9pZCB0aGF0IGl0IGlzIHNjcm9sbGVkIG91dCBvZiB2aWV3LS0+XG4gIDwhLS0gc2hvdyB0aGUgZmlsdGVyIGFmdGVyIHRoZSB2YWx1ZXMgYXJlIGxvYWRlZCB0byBhdm9pZCBsb2FkaW5nIGN1cnJlbnQgZGF0YSB0d2ljZSAtLT5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJ0b29sYmFyXCI+XG4gICAgPG1ldGFxczItZGF0ZXBpY2tlciBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9ja1wiIG1hdFJpcHBsZSBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nKCkgfHwgIWlzSGlzdG9yeUVuYWJsZWQoKVwiIFtpbnB1dEdyb3VwXT1cInJhbmdlXCIgKm5nSWY9XCJ0aW1lRmlsdGVyTG9hZGVkKCkgJiYgaXNIaXN0b3J5RW5hYmxlZCgpXCI+PC9tZXRhcXMyLWRhdGVwaWNrZXI+XG4gICAgPGRpdiBzdHlsZT1cImZsZXg6IDEgMSBhdXRvXCI+PC9kaXY+XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgW25nTW9kZWxdPVwiaXNIaXN0b3J5RW5hYmxlZCgpXCIgKG5nTW9kZWxDaGFuZ2UpPVwiaXNIaXN0b3J5RW5hYmxlZC5zZXQoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJpc0xvYWRpbmcoKVwiPlxuICAgICAgPGxhYmVsPlplaWdlIGhpc3RvcmlzY2hlIERhdGVuPC9sYWJlbD5cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbjwvbWF0LWNhcmQ+XG48bWF0LWNhcmQ+XG4gIDxtZXRhcXMyLXByb2dyZXNzLXNwaW5uZXIgW2Rpc3BsYXlQcm9ncmVzc1NwaW5uZXJdPVwiaXNMb2FkaW5nKClcIj48L21ldGFxczItcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgPHRhYmxlIFtjbGFzcy53aGlsZS1sb2FkaW5nXT1cImlzTG9hZGluZygpXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInJlY2VudFR5cGVDb3VudCQudmFsdWUucm93c1wiXG4gICAgICAgICBjbGFzcz1cInF1YWxpdHktbWF0cml4XCI+XG4gICAgPCEtLSBEZWZpbmUgY29sdW1ucyBvZiB0YWJsZSAtLT5cbiAgICA8IS0tIFJvdyBIZWFkZXIgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFiZWwtY29sXCIgc3RpY2t5PlxuICAgICAgPHRoIFthdHRyLnJvd3NwYW5dPVwiaXNIaXN0b3J5RW5hYmxlZCgpID8gJzInIDogJzEnXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICA8ZGl2PlF1ZWxsZTwvZGl2PlxuICAgICAgPC90aD5cbiAgICAgIDx0ZFxuICAgICAgICBtYXQtY2VsbFxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJyb3cubWV0YS5hbHRfbGFiZWxcIlxuICAgICAgICBjbGFzcz1cImxhYmVsLWNvbCBtYXQtY2VsbC1sZXZlbC17e3Jvdy5tZXRhLmxldmVsICsgMX19XCJcbiAgICAgID5cbiAgICAgICAge3sgcm93Lm1ldGEubGFiZWwgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIChyZWNlbnRUeXBlQ291bnQkIHwgYXN5bmMpPy5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCJcbiAgICAgICAgICAgICAgICAgIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ190eXBlJ1wiPlxuICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwiaXNIaXN0b3J5RW5hYmxlZCgpID8gJzInIDogJzEnXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFttYXRUb29sdGlwXT1cImNvbC5sYWJlbFwiPlxuICAgICAgICB7eyBjb2x1bW5UcmFuc2xhdGlvbmtleSA/IChjb2x1bW5UcmFuc2xhdGlvbmtleSArIGNvbC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2wubGFiZWwgfX1cbiAgICAgIDwvdGg+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgZGF0ZS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiAocmVjZW50VHlwZUNvdW50JCB8IGFzeW5jKT8uY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiXG4gICAgICAgICAgICAgICAgICBbbWF0Q29sdW1uRGVmXT1cImNvbC5pZCArICdfcmVjZW50J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJubyB0b29sdGlwXCI+e3sgcmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICA8YSBbYXR0ci5ocmVmXT1cIm9wZW5JbkVkaXRvcihyb3cubWV0YS5pZCwgY29sLmlkKSB8IGFzeW5jXCIgdGFyZ2V0PVwiZWRpdG9yX2Zyb250ZW5kXCI+e3sgcm93LmNvdW50c1tjb2wuaWRdID8/ICfigJMnIH19PC9hPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG9sZGVyIGRhdGUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgKHJlY2VudFR5cGVDb3VudCQgfCBhc3luYyk/LmNvbHVtbnM7IHRyYWNrQnk6Y29sdW1uSWRlbnRcIlxuICAgICAgICAgICAgICAgICAgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3Bhc3QnXCI+XG4gICAgICA8dGggY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiPlxuICAgICAgICB7eyAocGFzdFR5cGVDb3VudCQgfCBhc3luYyk/LnJvd3M/Lmxlbmd0aCA/IHJhbmdlLmNvbnRyb2xzLnN0YXJ0LnZhbHVlLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpIDogJ25vIHBhc3QgZGF0YScgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztcIiA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIocGFzdFR5cGVDb3VudCQgfCBhc3luYyk/LnJvd3M/Lmxlbmd0aCAmJiBwYXN0VHlwZUNvdW50KHJvdywgY29sLmlkKSBhcyB0cmVuZFwiPlxuICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJ0cmVuZC50cmVuZFwiPiB7eyB0cmVuZC52YWx1ZSA/PyAn4oCTJyB9fVxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwidHJlbmQudmFsdWVcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVuZC50cmVuZFwiIFtmb250SWNvbl09XCJ0cmVuZC50cmVuZCFcIiAvPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57eyB0cmVuZC50cmVuZCB9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gZ2VuZXJhdGUgYWN0dWFsIHRhYmxlIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiWydsYWJlbC1jb2wnXS5jb25jYXQodHlwZUNvbHVtbnMoKSk7IHN0aWNreTp0cnVlO1wiPjwvdHI+XG4gICAgPHRyIFtoaWRkZW5dPVwiIWlzSGlzdG9yeUVuYWJsZWQoKVwiIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJhbGxDb2x1bW5zKCk7IHN0aWNreTogdHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2xhYmVsLWNvbCddLmNvbmNhdChhbGxDb2x1bW5zKCkpXCI+PC90cj5cblxuICA8L3RhYmxlPlxuPC9tYXQtY2FyZD5cbiJdfQ==
@@ -74,4 +74,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
74
74
  providedIn: 'root',
75
75
  }]
76
76
  }], ctorParameters: () => [{ type: i1.CollectionAPIService }, { type: i1.ReplicationSourceAPIService }, { type: i1.FilterAPIService }, { type: i1.EditorsAPIService }] });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9tZXRhLWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFjM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBSzNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFDVSxjQUFvQyxFQUNwQyxlQUE0QyxFQUM1QyxTQUEyQixFQUMzQixVQUE2QjtRQUg3QixtQkFBYyxHQUFkLGNBQWMsQ0FBc0I7UUFDcEMsb0JBQWUsR0FBZixlQUFlLENBQTZCO1FBQzVDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGVBQVUsR0FBVixVQUFVLENBQW1CO0lBQ3BDLENBQUM7SUFFSjs7O09BR0c7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDTSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBQ00sb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDRDs7O09BR0c7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxtQ0FBbUMsQ0FBQyxPQUFlLEVBQUUsT0FBaUI7UUFDcEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLG1DQUFtQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQseUJBQXlCLENBQUMsS0FBYTtRQUNyQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxJQUFtQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELDBCQUEwQixDQUFDLElBQXlCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsd0NBQXdDLENBQUMsSUFBYztRQUNyRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsZ0RBQWdELENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELG1DQUFtQyxDQUFDLElBQWM7UUFDaEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLG1EQUFtRCxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxLQUFhLEVBQUUsT0FBaUI7UUFDN0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxDQUM5RCxLQUFLLEVBQ0wsT0FBTyxDQUNtQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxvQ0FBb0MsQ0FBQyxJQUFjO1FBQ2pELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQscUNBQXFDLENBQUMsSUFBYztRQUNsRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELG9DQUFvQyxDQUFDLElBQWM7UUFDakQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDbEQsQ0FBQzsrR0E3RVUsY0FBYzttSEFBZCxjQUFjLGNBTGIsTUFBTTs7NEZBS1AsY0FBYztrQkFOMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIENvbGxlY3Rpb25BUElTZXJ2aWNlLFxuICBFZGl0b3JzQVBJU2VydmljZSxcbiAgRWR1Q29sbGVjdGlvbixcbiAgRmlsdGVyLFxuICBGaWx0ZXJBUElTZXJ2aWNlLFxuICBNYXRlcmlhbENvdW50RmlsdGVyLFxuICBNYXRyaXhXaXRoQ291bnRzLFxuICBRdWFsaXR5TWF0cml4LFxuICBSZXBsaWNhdGlvblNvdXJjZUFQSVNlcnZpY2UsXG59IGZyb20gJy4vamF2YS1hcGknO1xuaW1wb3J0IHsgbWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYSB0aGluIHdyYXBwZXIgYXJvdW5kIHRoZSBBUEkgc2VydmljZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRhQXBpU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29sbGVjdGlvbnNBUEk6IENvbGxlY3Rpb25BUElTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVwbGljYXRpb25zQVBJOiBSZXBsaWNhdGlvblNvdXJjZUFQSVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaWx0ZXJBUEk6IEZpbHRlckFQSVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlZGl0b3JzQVBJOiBFZGl0b3JzQVBJU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsdGVycyBmb3IgdGhlIHF1YWxpdHkgbWF0cml4LlxuICAgKiBJdCBwaXBlcyB0aGUgb2JzZXJ2YWJsZSB0byB0YWtlIG9ubHkgb25lIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldFNlYXJjaEZpbHRlcnMoKTogT2JzZXJ2YWJsZTxGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckFQSS5nZXRRdWFsaXR4TWF0cml4RmlsdGVycygpLnBpcGUodGFrZSgxKSk7XG4gIH1cbiAgcHVibGljIGdldENhdGVnb3J5RmlsdGVycygpOiBPYnNlcnZhYmxlPEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VhcmNoRmlsdGVycygpLnBpcGUobWFwKChmaWx0ZXJzKSA9PiBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuZmllbGQgIT09ICd0aW1lcmFuZ2UnKSkpO1xuICB9XG4gIHB1YmxpYyBnZXRDb2xsZWN0aW9uc0ZpbHRlcigpOiBPYnNlcnZhYmxlPEFycmF5PEVkdUNvbGxlY3Rpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbnNBUEkuZ2V0VG9wTGV2ZWxDb2xsZWN0aW9uKCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZXJhbmdlIGZpbHRlciBmb3IgdGhlIHF1YWxpdHkgbWF0cml4LlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBmaWx0ZXIgb2YgdGhlIGhpc3RvcmljYWwgdGltZXJhbmdlIGZpbHRlcnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGltZXJhbmdlRmlsdGVyKCk6IE9ic2VydmFibGU8RmlsdGVyIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQVBJLmdldEhpc3RvcmljYWxUaW1lcmFuZ2UoKS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIG1hcCgoZmlsdGVycykgPT4gZmlsdGVyc1swXSlcbiAgICApO1xuICB9XG5cbiAgZ2V0TWF0ZXJpYWxDb3VudE1hdHJpeFBlckNvbGxlY3Rpb24obm9kZVJlZjogc3RyaW5nLCBvZXJPbmx5PzogYm9vbGVhbik6IE9ic2VydmFibGU8UXVhbGl0eU1hdHJpeD4ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25zQVBJLmdldE1hdGVyaWFsQ291bnRNYXRyaXhQZXJDb2xsZWN0aW9uKG5vZGVSZWYsIG9lck9ubHkpO1xuICB9XG5cbiAgZ2V0Q29sbGVjdGlvbkNvbXBsZXRlbmVzcyhjb2xJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNYXRyaXhXaXRoQ291bnRzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbnNBUEkuZ2V0Q29tcGxldGVuZXNzKGNvbElkKTtcbiAgfVxuXG4gIGdldFF1YWxpdHlNYXRyaXhXaXRoRmlsdGVyc1YyKGJvZHk6IEFycmF5PEZpbHRlcj4pIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhdGlvbnNBUEkuZ2V0UXVhbGl0eU1hdHJpeFYyKGJvZHkpO1xuICB9XG5cbiAgZ2V0RWRpdG9yaWFsTWF0ZXJpYWxDb3VudHMoYm9keTogTWF0ZXJpYWxDb3VudEZpbHRlcikge1xuICAgIHJldHVybiB0aGlzLmVkaXRvcnNBUEkuZ2V0TWF0ZXJpYWxDb3VudChib2R5KTtcbiAgfVxuXG4gIGdldE1hdGVyaWFsVHlwZUNvdW50c0J5UmVwbGljYXRpb25Tb3VyY2UoYm9keTogRmlsdGVyW10pIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhdGlvbnNBUEkuZ2V0TWF0ZXJpYWxDb3VudE1hdHJpeEJ5UmVwbGljYXRpb25Tb3VyY2VBbmRUeXBlKGJvZHkpO1xuICB9XG5cbiAgZ2V0TGljZW5zZUNvdW50c0J5UmVwbGljYXRpb25Tb3VyY2UoYm9keTogRmlsdGVyW10pIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhdGlvbnNBUEkuZ2V0TWF0ZXJpYWxDb3VudE1hdHJpeEJ5UmVwbGljYXRpb25Tb3VyY2VBbmRMaWNlbnNlKGJvZHkpO1xuICB9XG5cbiAgZ2V0TGljZW5zZUNvdW50c0J5TGljZW5zZUdyb3VwKGNvbElkOiBzdHJpbmcsIGZpbHRlcnM6IEZpbHRlcltdKTogT2JzZXJ2YWJsZTxNYXRyaXhXaXRoQ291bnRzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbnNBUEkuZ2V0TWF0ZXJpYWxDb3VudE1hdHJpeEJ5TGljZW5zZUdyb3VwMShcbiAgICAgIGNvbElkLFxuICAgICAgZmlsdGVyc1xuICAgICkgYXMgdW5rbm93biBhcyBPYnNlcnZhYmxlPE1hdHJpeFdpdGhDb3VudHM+O1xuICB9XG5cbiAgZ2V0TWF0ZXJpYWxDb3VudE1hdHJpeEJ5TGljZW5zZUdyb3VwKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yc0FQSS5nZXRNYXRlcmlhbENvdW50TWF0cml4QnlMaWNlbnNlR3JvdXAoYm9keSk7XG4gIH1cblxuICBnZXRDb21wbGV0ZW5lc3NGb3JEaXNjaXBsaW5hcnlQb3J0YWxzKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yc0FQSS5nZXRDb21wbGV0ZW5lc3NGb3JEaXNjaXBsaW5hcnlQb3J0YWxzKGJvZHkpO1xuICB9XG5cbiAgZ2V0Q29tcGxldGVuZXNzRm9yUmVwbGljYXRpb25Tb3VyY2VzKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGljYXRpb25zQVBJLmdldENvbXBsZXRlbmVzc0ZvclJlcGxpY2F0aW9uU291cmNlcyhib2R5KTtcbiAgfVxuXG4gIGdldE1hdGVyaWFsVHlwZXNNYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckFQSS5nZXRNYXRlcmlhbFR5cGVzTWFwcGluZygpO1xuICB9XG59XG4iXX0=
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9tZXRhLWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFjM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBSzNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFDVSxjQUFvQyxFQUNwQyxlQUE0QyxFQUM1QyxTQUEyQixFQUMzQixVQUE2QjtRQUg3QixtQkFBYyxHQUFkLGNBQWMsQ0FBc0I7UUFDcEMsb0JBQWUsR0FBZixlQUFlLENBQTZCO1FBQzVDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGVBQVUsR0FBVixVQUFVLENBQW1CO0lBQ3BDLENBQUM7SUFFSjs7O09BR0c7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDTSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBQ00sb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDRDs7O09BR0c7SUFDSSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxtQ0FBbUMsQ0FBQyxPQUFlLEVBQUUsT0FBaUI7UUFDcEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLG1DQUFtQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQseUJBQXlCLENBQUMsS0FBYTtRQUNyQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxJQUFtQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELDBCQUEwQixDQUFDLElBQXlCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsd0NBQXdDLENBQUMsSUFBYztRQUNyRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsZ0RBQWdELENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELG1DQUFtQyxDQUFDLElBQWM7UUFDaEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLG1EQUFtRCxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxLQUFhLEVBQUUsT0FBaUI7UUFDN0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsb0NBQW9DLENBQUMsSUFBYztRQUNqRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELHFDQUFxQyxDQUFDLElBQWM7UUFDbEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxvQ0FBb0MsQ0FBQyxJQUFjO1FBQ2pELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2xELENBQUM7K0dBMUVVLGNBQWM7bUhBQWQsY0FBYyxjQUxiLE1BQU07OzRGQUtQLGNBQWM7a0JBTjFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBDb2xsZWN0aW9uQVBJU2VydmljZSxcbiAgRWRpdG9yc0FQSVNlcnZpY2UsXG4gIEVkdUNvbGxlY3Rpb24sXG4gIEZpbHRlcixcbiAgRmlsdGVyQVBJU2VydmljZSxcbiAgTWF0ZXJpYWxDb3VudEZpbHRlcixcbiAgTWF0cml4V2l0aENvdW50cyxcbiAgUXVhbGl0eU1hdHJpeCxcbiAgUmVwbGljYXRpb25Tb3VyY2VBUElTZXJ2aWNlLFxufSBmcm9tICcuL2phdmEtYXBpJztcbmltcG9ydCB7IG1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCB0aGUgQVBJIHNlcnZpY2VzLlxuICovXG5leHBvcnQgY2xhc3MgTWV0YUFwaVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbGxlY3Rpb25zQVBJOiBDb2xsZWN0aW9uQVBJU2VydmljZSxcbiAgICBwcml2YXRlIHJlcGxpY2F0aW9uc0FQSTogUmVwbGljYXRpb25Tb3VyY2VBUElTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsdGVyQVBJOiBGaWx0ZXJBUElTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWRpdG9yc0FQSTogRWRpdG9yc0FQSVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbHRlcnMgZm9yIHRoZSBxdWFsaXR5IG1hdHJpeC5cbiAgICogSXQgcGlwZXMgdGhlIG9ic2VydmFibGUgdG8gdGFrZSBvbmx5IG9uZSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTZWFyY2hGaWx0ZXJzKCk6IE9ic2VydmFibGU8RmlsdGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJBUEkuZ2V0UXVhbGl0eE1hdHJpeEZpbHRlcnMoKS5waXBlKHRha2UoMSkpO1xuICB9XG4gIHB1YmxpYyBnZXRDYXRlZ29yeUZpbHRlcnMoKTogT2JzZXJ2YWJsZTxGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLmdldFNlYXJjaEZpbHRlcnMoKS5waXBlKG1hcCgoZmlsdGVycykgPT4gZmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkICE9PSAndGltZXJhbmdlJykpKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29sbGVjdGlvbnNGaWx0ZXIoKTogT2JzZXJ2YWJsZTxBcnJheTxFZHVDb2xsZWN0aW9uPj4ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25zQVBJLmdldFRvcExldmVsQ29sbGVjdGlvbigpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHRpbWVyYW5nZSBmaWx0ZXIgZm9yIHRoZSBxdWFsaXR5IG1hdHJpeC5cbiAgICogUmV0dXJucyB0aGUgZmlyc3QgZmlsdGVyIG9mIHRoZSBoaXN0b3JpY2FsIHRpbWVyYW5nZSBmaWx0ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldFRpbWVyYW5nZUZpbHRlcigpOiBPYnNlcnZhYmxlPEZpbHRlciB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckFQSS5nZXRIaXN0b3JpY2FsVGltZXJhbmdlKCkucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAoKGZpbHRlcnMpID0+IGZpbHRlcnNbMF0pXG4gICAgKTtcbiAgfVxuXG4gIGdldE1hdGVyaWFsQ291bnRNYXRyaXhQZXJDb2xsZWN0aW9uKG5vZGVSZWY6IHN0cmluZywgb2VyT25seT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFF1YWxpdHlNYXRyaXg+IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uc0FQSS5nZXRNYXRlcmlhbENvdW50TWF0cml4UGVyQ29sbGVjdGlvbihub2RlUmVmLCBvZXJPbmx5KTtcbiAgfVxuXG4gIGdldENvbGxlY3Rpb25Db21wbGV0ZW5lc3MoY29sSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz4ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25zQVBJLmdldENvbXBsZXRlbmVzcyhjb2xJZCk7XG4gIH1cblxuICBnZXRRdWFsaXR5TWF0cml4V2l0aEZpbHRlcnNWMihib2R5OiBBcnJheTxGaWx0ZXI+KSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGljYXRpb25zQVBJLmdldFF1YWxpdHlNYXRyaXhWMihib2R5KTtcbiAgfVxuXG4gIGdldEVkaXRvcmlhbE1hdGVyaWFsQ291bnRzKGJvZHk6IE1hdGVyaWFsQ291bnRGaWx0ZXIpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JzQVBJLmdldE1hdGVyaWFsQ291bnQoYm9keSk7XG4gIH1cblxuICBnZXRNYXRlcmlhbFR5cGVDb3VudHNCeVJlcGxpY2F0aW9uU291cmNlKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGljYXRpb25zQVBJLmdldE1hdGVyaWFsQ291bnRNYXRyaXhCeVJlcGxpY2F0aW9uU291cmNlQW5kVHlwZShib2R5KTtcbiAgfVxuXG4gIGdldExpY2Vuc2VDb3VudHNCeVJlcGxpY2F0aW9uU291cmNlKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGljYXRpb25zQVBJLmdldE1hdGVyaWFsQ291bnRNYXRyaXhCeVJlcGxpY2F0aW9uU291cmNlQW5kTGljZW5zZShib2R5KTtcbiAgfVxuXG4gIGdldExpY2Vuc2VDb3VudHNCeUxpY2Vuc2VHcm91cChjb2xJZDogc3RyaW5nLCBmaWx0ZXJzOiBGaWx0ZXJbXSk6IE9ic2VydmFibGU8UXVhbGl0eU1hdHJpeD4ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25zQVBJLmdldE1hdGVyaWFsQ291bnRNYXRyaXhCeUxpY2Vuc2VHcm91cDEoY29sSWQsIGZpbHRlcnMpO1xuICB9XG5cbiAgZ2V0TWF0ZXJpYWxDb3VudE1hdHJpeEJ5TGljZW5zZUdyb3VwKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yc0FQSS5nZXRNYXRlcmlhbENvdW50TWF0cml4QnlMaWNlbnNlR3JvdXAoYm9keSk7XG4gIH1cblxuICBnZXRDb21wbGV0ZW5lc3NGb3JEaXNjaXBsaW5hcnlQb3J0YWxzKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yc0FQSS5nZXRDb21wbGV0ZW5lc3NGb3JEaXNjaXBsaW5hcnlQb3J0YWxzKGJvZHkpO1xuICB9XG5cbiAgZ2V0Q29tcGxldGVuZXNzRm9yUmVwbGljYXRpb25Tb3VyY2VzKGJvZHk6IEZpbHRlcltdKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGljYXRpb25zQVBJLmdldENvbXBsZXRlbmVzc0ZvclJlcGxpY2F0aW9uU291cmNlcyhib2R5KTtcbiAgfVxuXG4gIGdldE1hdGVyaWFsVHlwZXNNYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckFQSS5nZXRNYXRlcmlhbFR5cGVzTWFwcGluZygpO1xuICB9XG59XG4iXX0=