@sumaris-net/ngx-components 18.12.13 → 18.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/doc/changelog.md +7 -0
  2. package/esm2022/public_api.mjs +3 -1
  3. package/esm2022/src/app/core/home/home.mjs +39 -19
  4. package/esm2022/src/app/core/home/home.module.mjs +7 -3
  5. package/esm2022/src/app/shared/observables.mjs +2 -2
  6. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +3 -2
  7. package/esm2022/src/app/social/config/social.config.mjs +9 -0
  8. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +21 -21
  9. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +111 -51
  10. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +49 -32
  11. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +81 -0
  12. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +27 -11
  13. package/esm2022/src/app/social/user-event/user-event.module.mjs +5 -4
  14. package/esm2022/src/app/social/user-event/user-event.service.mjs +3 -3
  15. package/fesm2022/sumaris-net.ngx-components.mjs +5473 -5282
  16. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  17. package/package.json +1 -1
  18. package/public_api.d.ts +2 -0
  19. package/src/app/core/home/home.d.ts +28 -20
  20. package/src/app/core/home/home.module.d.ts +2 -1
  21. package/src/app/shared/inputs.d.ts +1 -1
  22. package/src/app/shared/observables.d.ts +1 -1
  23. package/src/app/social/config/social.config.d.ts +4 -0
  24. package/src/app/social/job/progression/job-progression.icon.d.ts +14 -14
  25. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +23 -9
  26. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +20 -16
  27. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +36 -0
  28. package/src/app/social/user-event/testing/user-event.testing.d.ts +11 -2
  29. package/src/app/social/user-event/user-event.module.d.ts +7 -6
  30. package/src/app/social/user-event/user-event.service.d.ts +2 -2
  31. package/src/assets/i18n/fr.json +2 -1
  32. package/src/assets/manifest.json +1 -1
  33. package/src/theme/_ngx-components.scss +4 -1
  34. package/src/theme/_theme.variables.scss +1 -1
@@ -1,67 +1,85 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
2
2
  import { of } from 'rxjs';
3
3
  import { APP_USER_EVENT_SERVICE } from '../user-event.service';
4
4
  import { UserEventNotificationList } from './user-event-notification.list';
5
5
  import { map, tap } from 'rxjs/operators';
6
6
  import { isNil, toBoolean } from '../../../shared/functions';
7
+ import { UserEventNotificationModal } from './user-event-notification.modal';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "../../../core/services/account.service";
9
10
  import * as i2 from "@ionic/angular";
10
- import * as i3 from "@angular/common";
11
+ import * as i3 from "../../../core/services/local-settings.service";
11
12
  import * as i4 from "@angular/material/icon";
12
13
  import * as i5 from "@angular/material/button";
13
14
  import * as i6 from "@angular/material/badge";
14
- import * as i7 from "@ngx-translate/core";
15
+ import * as i7 from "@angular/common";
16
+ import * as i8 from "@ngx-translate/core";
17
+ import * as i9 from "../../../shared/pipes/colors.pipe";
18
+ import * as i10 from "../../../shared/pipes/badge.pipes";
15
19
  export class UserEventNotificationIcon {
16
20
  userEventService;
17
21
  accountService;
18
22
  popoverController;
23
+ modalController;
24
+ settings;
19
25
  cd;
20
26
  _logPrefix = '[user-event-notification] ';
21
27
  _readEvent = new EventEmitter();
22
28
  _readEvents = new EventEmitter();
23
- debug = false;
29
+ visible;
30
+ count$;
24
31
  titleI18n = 'SOCIAL.USER_EVENT.NOTIFICATION.TITLE';
25
32
  disabled = false;
26
33
  filter = null;
27
34
  autoHide = false;
28
35
  headerActions;
29
36
  footerActions;
30
- visible;
31
- countChanges$;
32
- constructor(userEventService, accountService, popoverController, cd) {
37
+ style = 'mat-button';
38
+ color;
39
+ unreadColor;
40
+ fill;
41
+ mobile;
42
+ listStyle;
43
+ debug = false;
44
+ onShowList = new EventEmitter();
45
+ constructor(userEventService, accountService, popoverController, modalController, settings, cd) {
33
46
  this.userEventService = userEventService;
34
47
  this.accountService = accountService;
35
48
  this.popoverController = popoverController;
49
+ this.modalController = modalController;
50
+ this.settings = settings;
36
51
  this.cd = cd;
37
- this.countChanges$ = !this.userEventService
52
+ this.mobile = settings.mobile;
53
+ this.listStyle = this.mobile ? 'modal' : 'popover';
54
+ this.count$ = !this.userEventService
38
55
  ? of()
39
56
  : this.userEventService.countSubject.pipe(tap((value) => {
40
57
  const visible = !this.autoHide || value > 0;
41
58
  this.setVisible(visible);
42
- }), map((value) => (value === 0 ? undefined : value))
43
- // FIXME: enable if zone lesse in timer
44
- //tap(_ => this.cd.detectChanges())
45
- );
59
+ }), map((value) => (value === 0 ? undefined : value)));
46
60
  }
47
61
  async ngOnInit() {
62
+ // Service is missing: fallback
48
63
  if (isNil(this.userEventService)) {
49
64
  console.warn(`${this._logPrefix}No service injected`);
50
65
  this.disabled = true;
51
66
  this.setVisible(false);
52
67
  return;
53
68
  }
54
- this.setVisible(toBoolean(this.visible, !this.autoHide));
55
- // Wait service
56
- await this.userEventService.ready();
57
- // Subscribe to read event
58
- this._readEvent.subscribe((item) => {
59
- // default: mark event as read
60
- this.userEventService.markAllAsRead([item]);
61
- });
62
- this._readEvents.subscribe((items) => {
63
- this.userEventService.markAllAsRead(items);
64
- });
69
+ // User event service exists
70
+ else {
71
+ this.setVisible(toBoolean(this.visible, !this.autoHide));
72
+ // Wait service
73
+ await this.userEventService.ready();
74
+ // Subscribe to read event
75
+ this._readEvent.subscribe((item) => {
76
+ // default: mark event as read
77
+ this.userEventService.markAllAsRead([item]);
78
+ });
79
+ this._readEvents.subscribe((items) => {
80
+ this.userEventService.markAllAsRead(items);
81
+ });
82
+ }
65
83
  }
66
84
  ngOnDestroy() {
67
85
  if (this.debug) {
@@ -70,27 +88,54 @@ export class UserEventNotificationIcon {
70
88
  this._readEvent.complete();
71
89
  this._readEvents.complete();
72
90
  }
73
- async showList(event) {
74
- // Reset count
75
- this.userEventService.resetCount();
76
- const popover = await this.popoverController.create({
77
- component: UserEventNotificationList,
78
- componentProps: {
79
- debug: this.debug,
80
- titleI18n: this.titleI18n,
81
- readEvent: this._readEvent,
82
- readEvents: this._readEvents,
83
- filter: this.filter,
84
- headerActions: this.headerActions,
85
- footerActions: this.footerActions,
86
- },
87
- backdropDismiss: true,
88
- keyboardClose: true,
89
- event,
90
- translucent: true,
91
- cssClass: 'popover-large popover-notifications',
92
- });
93
- await popover.present();
91
+ async showList(event = undefined, options) {
92
+ if (this.onShowList.observed) {
93
+ this.onShowList.emit(event);
94
+ return;
95
+ }
96
+ // Reset count (if not auto hide. else it will be hidden bellow)
97
+ if (!this.autoHide) {
98
+ this.userEventService.resetCount();
99
+ }
100
+ options = {
101
+ debug: this.debug,
102
+ titleI18n: this.titleI18n,
103
+ readEvent: this._readEvent,
104
+ readEvents: this._readEvents,
105
+ filter: this.filter,
106
+ headerActions: this.headerActions,
107
+ footerActions: this.footerActions,
108
+ ...options,
109
+ };
110
+ // Open using modal
111
+ const listStyle = options?.style || this.listStyle;
112
+ if (listStyle === 'modal') {
113
+ const modal = await this.modalController.create({
114
+ component: UserEventNotificationModal,
115
+ componentProps: options,
116
+ backdropDismiss: true,
117
+ keyboardClose: true,
118
+ cssClass: 'modal-notifications',
119
+ });
120
+ await modal.present();
121
+ }
122
+ // Open using popover
123
+ else {
124
+ const popover = await this.popoverController.create({
125
+ component: UserEventNotificationList,
126
+ componentProps: options,
127
+ backdropDismiss: true,
128
+ keyboardClose: true,
129
+ event,
130
+ translucent: true,
131
+ cssClass: 'popover-large popover-notifications',
132
+ });
133
+ await popover.present();
134
+ }
135
+ // Reset count (if auto hide - after list has been opened)
136
+ if (this.autoHide) {
137
+ this.userEventService.resetCount();
138
+ }
94
139
  }
95
140
  setVisible(value) {
96
141
  if (this.visible !== value) {
@@ -98,20 +143,18 @@ export class UserEventNotificationIcon {
98
143
  this.cd.markForCheck();
99
144
  }
100
145
  }
101
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEventNotificationIcon, deps: [{ token: APP_USER_EVENT_SERVICE, optional: true }, { token: i1.AccountService }, { token: i2.PopoverController }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
102
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserEventNotificationIcon, selector: "app-user-event-notification-icon", inputs: { debug: "debug", titleI18n: "titleI18n", disabled: "disabled", filter: "filter", autoHide: "autoHide", headerActions: "headerActions", footerActions: "footerActions" }, ngImport: i0, template: "<button\n mat-icon-button\n [title]=\"titleI18n | translate\"\n [disabled]=\"disabled\"\n *ngIf=\"visible\"\n (click)=\"showList($event)\"\n>\n <mat-icon\n [matBadge]=\"countChanges$ | async\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n notifications\n </mat-icon>\n</button>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i6.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
146
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEventNotificationIcon, deps: [{ token: APP_USER_EVENT_SERVICE, optional: true }, { token: i1.AccountService }, { token: i2.PopoverController }, { token: i2.ModalController }, { token: i3.LocalSettingsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
147
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: UserEventNotificationIcon, selector: "app-user-event-notification-icon", inputs: { titleI18n: "titleI18n", disabled: "disabled", filter: "filter", autoHide: "autoHide", headerActions: "headerActions", footerActions: "footerActions", style: "style", color: "color", unreadColor: "unreadColor", fill: "fill", mobile: "mobile", listStyle: "listStyle", debug: "debug" }, outputs: { onShowList: "showList" }, ngImport: i0, template: "@let count = (count$ | async);\n@if (visible) {\n @switch (style) {\n <!-- mat icon button (e.g. for home toolbar) -->\n @case ('mat-button') {\n <button\n mat-icon-button\n [color]=\"(count && unreadColor || color) | matColor\"\n [title]=\"titleI18n | translate\"\n [disabled]=\"disabled\"\n (click)=\"showList($event)\"\n >\n <mat-icon\n [matBadge]=\"count | badgeNumber\"\n [matBadgeHidden]=\"!count\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n notifications\n </mat-icon>\n </button>\n }\n\n <!-- ion button (e.g. for home toolbar) -->\n @case ('ion-button') {\n <ion-button\n [fill]=\"fill\"\n [color]=\"count && unreadColor || color\"\n [title]=\"titleI18n | translate\"\n [disabled]=\"disabled\"\n (click)=\"showList($event)\"\n >\n <mat-icon\n slot=\"icon-only\"\n [matBadge]=\"count | badgeNumber\"\n [matBadgeHidden]=\"!count\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n notifications\n </mat-icon>\n </ion-button>\n }\n }\n}\n", styles: ["ion-button{--overflow: visible}\n"], dependencies: [{ kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i6.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "pipe", type: i9.MatColorPipe, name: "matColor" }, { kind: "pipe", type: i10.BadgeNumberPipe, name: "badgeNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
103
148
  }
104
149
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEventNotificationIcon, decorators: [{
105
150
  type: Component,
106
- args: [{ selector: 'app-user-event-notification-icon', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n mat-icon-button\n [title]=\"titleI18n | translate\"\n [disabled]=\"disabled\"\n *ngIf=\"visible\"\n (click)=\"showList($event)\"\n>\n <mat-icon\n [matBadge]=\"countChanges$ | async\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n notifications\n </mat-icon>\n</button>\n" }]
151
+ args: [{ selector: 'app-user-event-notification-icon', changeDetection: ChangeDetectionStrategy.OnPush, template: "@let count = (count$ | async);\n@if (visible) {\n @switch (style) {\n <!-- mat icon button (e.g. for home toolbar) -->\n @case ('mat-button') {\n <button\n mat-icon-button\n [color]=\"(count && unreadColor || color) | matColor\"\n [title]=\"titleI18n | translate\"\n [disabled]=\"disabled\"\n (click)=\"showList($event)\"\n >\n <mat-icon\n [matBadge]=\"count | badgeNumber\"\n [matBadgeHidden]=\"!count\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n notifications\n </mat-icon>\n </button>\n }\n\n <!-- ion button (e.g. for home toolbar) -->\n @case ('ion-button') {\n <ion-button\n [fill]=\"fill\"\n [color]=\"count && unreadColor || color\"\n [title]=\"titleI18n | translate\"\n [disabled]=\"disabled\"\n (click)=\"showList($event)\"\n >\n <mat-icon\n slot=\"icon-only\"\n [matBadge]=\"count | badgeNumber\"\n [matBadgeHidden]=\"!count\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n notifications\n </mat-icon>\n </ion-button>\n }\n }\n}\n", styles: ["ion-button{--overflow: visible}\n"] }]
107
152
  }], ctorParameters: () => [{ type: undefined, decorators: [{
108
153
  type: Optional
109
154
  }, {
110
155
  type: Inject,
111
156
  args: [APP_USER_EVENT_SERVICE]
112
- }] }, { type: i1.AccountService }, { type: i2.PopoverController }, { type: i0.ChangeDetectorRef }], propDecorators: { debug: [{
113
- type: Input
114
- }], titleI18n: [{
157
+ }] }, { type: i1.AccountService }, { type: i2.PopoverController }, { type: i2.ModalController }, { type: i3.LocalSettingsService }, { type: i0.ChangeDetectorRef }], propDecorators: { titleI18n: [{
115
158
  type: Input
116
159
  }], disabled: [{
117
160
  type: Input
@@ -123,5 +166,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
123
166
  type: Input
124
167
  }], footerActions: [{
125
168
  type: Input
169
+ }], style: [{
170
+ type: Input
171
+ }], color: [{
172
+ type: Input
173
+ }], unreadColor: [{
174
+ type: Input
175
+ }], fill: [{
176
+ type: Input
177
+ }], mobile: [{
178
+ type: Input
179
+ }], listStyle: [{
180
+ type: Input
181
+ }], debug: [{
182
+ type: Input
183
+ }], onShowList: [{
184
+ type: Output,
185
+ args: ['showList']
126
186
  }] } });
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC91c2VyLWV2ZW50L25vdGlmaWNhdGlvbi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5pY29uLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxzQkFBc0IsRUFBcUIsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRixPQUFPLEVBQUUseUJBQXlCLEVBQW9DLE1BQU0sZ0NBQWdDLENBQUM7QUFHN0csT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7QUFPN0QsTUFBTSxPQUFPLHlCQUF5QjtJQWlCaUI7SUFDekM7SUFDQTtJQUNGO0lBbkJGLFVBQVUsR0FBRyw0QkFBNEIsQ0FBQztJQUMxQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFDakQsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO0lBRW5ELEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCxTQUFTLEdBQUcsc0NBQXNDLENBQUM7SUFDbkQsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixNQUFNLEdBQVEsSUFBSSxDQUFDO0lBQ25CLFFBQVEs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YW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBBUFBfVVNFUl9FVkVOVF9TRVJWSUNFLCBJVXNlckV2ZW50U2VydmljZSB9IGZyb20gJy4uL3VzZXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0LCBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9ucyB9IGZyb20gJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdCc7XG5pbXBvcnQgeyBJVXNlckV2ZW50LCBJVXNlckV2ZW50QWN0aW9uLCBJVXNlckV2ZW50RmlsdGVyIH0gZnJvbSAnLi4vdXNlci1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNOaWwsIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci1ldmVudC1ub3RpZmljYXRpb24taWNvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5pY29uLmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckV2ZW50Tm90aWZpY2F0aW9uSWNvbiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfbG9nUHJlZml4ID0gJ1t1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbl0gJztcbiAgcHJpdmF0ZSBfcmVhZEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxJVXNlckV2ZW50PGFueT4+KCk7XG4gIHByaXZhdGUgX3JlYWRFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55PltdPigpO1xuXG4gIEBJbnB1dCgpIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRpdGxlSTE4biA9ICdTT0NJQUwuVVNFUl9FVkVOVC5OT1RJRklDQVRJT04uVElUTEUnO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBmaWx0ZXI6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIGF1dG9IaWRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhlYWRlckFjdGlvbnM6IElVc2VyRXZlbnRBY3Rpb25bXTtcbiAgQElucHV0KCkgZm9vdGVyQWN0aW9uczogSVVzZXJFdmVudEFjdGlvbltdO1xuXG4gIHByb3RlY3RlZCB2aXNpYmxlOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY291bnRDaGFuZ2VzJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX1VTRVJfRVZFTlRfU0VSVklDRSkgcHVibGljIHVzZXJFdmVudFNlcnZpY2U6IElVc2VyRXZlbnRTZXJ2aWNlPElVc2VyRXZlbnQ8YW55PiwgSVVzZXJFdmVudEZpbHRlcjxhbnk+PixcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBwb3BvdmVyQ29udHJvbGxlcjogUG9wb3ZlckNvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5jb3VudENoYW5nZXMkID0gIXRoaXMudXNlckV2ZW50U2VydmljZVxuICAgICAgPyBvZigpXG4gICAgICA6IHRoaXMudXNlckV2ZW50U2VydmljZS5jb3VudFN1YmplY3QucGlwZShcbiAgICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlID0gIXRoaXMuYXV0b0hpZGUgfHwgdmFsdWUgPiAwO1xuICAgICAgICAgICAgdGhpcy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG1hcCgodmFsdWUpID0+ICh2YWx1ZSA9PT0gMCA/IHVuZGVmaW5lZCA6IHZhbHVlKSlcbiAgICAgICAgICAvLyBGSVhNRTogZW5hYmxlIGlmIHpvbmUgbGVzc2UgaW4gdGltZXJcbiAgICAgICAgICAvL3RhcChfID0+IHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpKVxuICAgICAgICApO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMudXNlckV2ZW50U2VydmljZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9Tm8gc2VydmljZSBpbmplY3RlZGApO1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0VmlzaWJsZSh0b0Jvb2xlYW4odGhpcy52aXNpYmxlLCAhdGhpcy5hdXRvSGlkZSkpO1xuXG4gICAgLy8gV2FpdCBzZXJ2aWNlXG4gICAgYXdhaXQgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLnJlYWR5KCk7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gcmVhZCBldmVudFxuICAgIHRoaXMuX3JlYWRFdmVudC5zdWJzY3JpYmUoKGl0ZW0pID0+IHtcbiAgICAgIC8vIGRlZmF1bHQ6IG1hcmsgZXZlbnQgYXMgcmVhZFxuICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLm1hcmtBbGxBc1JlYWQoW2l0ZW1dKTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZWFkRXZlbnRzLnN1YnNjcmliZSgoaXRlbXMpID0+IHtcbiAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5tYXJrQWxsQXNSZWFkKGl0ZW1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1EZXN0cm95aW5nYCk7XG4gICAgfVxuICAgIHRoaXMuX3JlYWRFdmVudC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3JlYWRFdmVudHMuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIHNob3dMaXN0KGV2ZW50OiBFdmVudCkge1xuICAgIC8vIFJlc2V0IGNvdW50XG4gICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLnJlc2V0Q291bnQoKTtcblxuICAgIGNvbnN0IHBvcG92ZXIgPSBhd2FpdCB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3QsXG4gICAgICBjb21wb25lbnRQcm9wczogPFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3RPcHRpb25zPntcbiAgICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICAgIHRpdGxlSTE4bjogdGhpcy50aXRsZUkxOG4sXG4gICAgICAgIHJlYWRFdmVudDogdGhpcy5fcmVhZEV2ZW50LFxuICAgICAgICByZWFkRXZlbnRzOiB0aGlzLl9yZWFkRXZlbnRzLFxuICAgICAgICBmaWx0ZXI6IHRoaXMuZmlsdGVyLFxuICAgICAgICBoZWFkZXJBY3Rpb25zOiB0aGlzLmhlYWRlckFjdGlvbnMsXG4gICAgICAgIGZvb3RlckFjdGlvbnM6IHRoaXMuZm9vdGVyQWN0aW9ucyxcbiAgICAgIH0sXG4gICAgICBiYWNrZHJvcERpc21pc3M6IHRydWUsXG4gICAgICBrZXlib2FyZENsb3NlOiB0cnVlLFxuICAgICAgZXZlbnQsXG4gICAgICB0cmFuc2x1Y2VudDogdHJ1ZSxcbiAgICAgIGNzc0NsYXNzOiAncG9wb3Zlci1sYXJnZSBwb3BvdmVyLW5vdGlmaWNhdGlvbnMnLFxuICAgIH0pO1xuICAgIGF3YWl0IHBvcG92ZXIucHJlc2VudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy52aXNpYmxlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy52aXNpYmxlID0gdmFsdWU7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxufVxuIiwiPGJ1dHRvblxuICBtYXQtaWNvbi1idXR0b25cbiAgW3RpdGxlXT1cInRpdGxlSTE4biB8IHRyYW5zbGF0ZVwiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICpuZ0lmPVwidmlzaWJsZVwiXG4gIChjbGljayk9XCJzaG93TGlzdCgkZXZlbnQpXCJcbj5cbiAgPG1hdC1pY29uXG4gICAgW21hdEJhZGdlXT1cImNvdW50Q2hhbmdlcyQgfCBhc3luY1wiXG4gICAgbWF0QmFkZ2VDb2xvcj1cImFjY2VudFwiXG4gICAgbWF0QmFkZ2VTaXplPVwic21hbGxcIlxuICAgIG1hdEJhZGdlUG9zaXRpb249XCJhYm92ZSBhZnRlclwiXG4gICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gID5cbiAgICBub3RpZmljYXRpb25zXG4gIDwvbWF0LWljb24+XG48L2J1dHRvbj5cbiJdfQ==
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC91c2VyLWV2ZW50L25vdGlmaWNhdGlvbi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5pY29uLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxzQkFBc0IsRUFBcUIsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRixPQUFPLEVBQUUseUJBQXlCLEVBQW9DLE1BQU0sZ0NBQWdDLENBQUM7QUFHN0csT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzdELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFRN0UsTUFBTSxPQUFPLHlCQUF5QjtJQXlCaUI7SUFDekM7SUFDQTtJQUNBO0lBQ0E7SUFDRjtJQTdCRixVQUFVLEdBQUcsNEJBQTRCLENBQUM7SUFDMUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBQ2pELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQUVsRCxPQUFPLENBQVU7SUFDUixNQUFNLENBQXFCO0lBRXJDLFNBQVMsR0FBRyxz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QjVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCO3VNQWpCbkMsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFYyxVQUFVO3NCQUE3QixNQUFNO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQb3BvdmVyQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEFQUF9VU0VSX0VWRU5UX1NFUlZJQ0UsIElVc2VyRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlci1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3QsIFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3RPcHRpb25zIH0gZnJvbSAnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0JztcbmltcG9ydCB7IElVc2VyRXZlbnQsIElVc2VyRXZlbnRBY3Rpb24sIElVc2VyRXZlbnRGaWx0ZXIgfSBmcm9tICcuLi91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc05pbCwgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBBcHBDb2xvcnMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlckV2ZW50Tm90aWZpY2F0aW9uTW9kYWwgfSBmcm9tICcuL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLm1vZGFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXItZXZlbnQtbm90aWZpY2F0aW9uLWljb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnROb3RpZmljYXRpb25JY29uIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9sb2dQcmVmaXggPSAnW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uXSAnO1xuICBwcml2YXRlIF9yZWFkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55Pj4oKTtcbiAgcHJpdmF0ZSBfcmVhZEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8SVVzZXJFdmVudDxhbnk+W10+KCk7XG5cbiAgcHJvdGVjdGVkIHZpc2libGU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBjb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBASW5wdXQoKSB0aXRsZUkxOG4gPSAnU09DSUFMLlVTRVJfRVZFTlQuTk9USUZJQ0FUSU9OLlRJVExFJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZmlsdGVyOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBhdXRvSGlkZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zOiBJVXNlckV2ZW50QWN0aW9uW107XG4gIEBJbnB1dCgpIGZvb3RlckFjdGlvbnM6IElVc2VyRXZlbnRBY3Rpb25bXTtcbiAgQElucHV0KCkgc3R5bGU6ICdtYXQtYnV0dG9uJyB8ICdpb24tYnV0dG9uJyA9ICdtYXQtYnV0dG9uJztcbiAgQElucHV0KCkgY29sb3I6IEFwcENvbG9ycztcbiAgQElucHV0KCkgdW5yZWFkQ29sb3I6IEFwcENvbG9ycztcbiAgQElucHV0KCkgZmlsbDogJ2NsZWFyJyB8ICdvdXRsaW5lJyB8ICdzb2xpZCc7XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgbGlzdFN0eWxlOiAncG9wb3ZlcicgfCAnbW9kYWwnO1xuICBASW5wdXQoKSBkZWJ1ZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ3Nob3dMaXN0Jykgb25TaG93TGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9FVkVOVF9TRVJWSUNFKSBwdWJsaWMgdXNlckV2ZW50U2VydmljZTogSVVzZXJFdmVudFNlcnZpY2U8SVVzZXJFdmVudDxhbnk+LCBJVXNlckV2ZW50RmlsdGVyPGFueT4+LFxuICAgIHByb3RlY3RlZCBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHBvcG92ZXJDb250cm9sbGVyOiBQb3BvdmVyQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgbW9kYWxDb250cm9sbGVyOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLm1vYmlsZSA9IHNldHRpbmdzLm1vYmlsZTtcbiAgICB0aGlzLmxpc3RTdHlsZSA9IHRoaXMubW9iaWxlID8gJ21vZGFsJyA6ICdwb3BvdmVyJztcbiAgICB0aGlzLmNvdW50JCA9ICF0aGlzLnVzZXJFdmVudFNlcnZpY2VcbiAgICAgID8gb2YoKVxuICAgICAgOiB0aGlzLnVzZXJFdmVudFNlcnZpY2UuY291bnRTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZSA9ICF0aGlzLmF1dG9IaWRlIHx8IHZhbHVlID4gMDtcbiAgICAgICAgICAgIHRoaXMuc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKHZhbHVlKSA9PiAodmFsdWUgPT09IDAgPyB1bmRlZmluZWQgOiB2YWx1ZSkpXG4gICAgICAgICk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAvLyBTZXJ2aWNlIGlzIG1pc3Npbmc6IGZhbGxiYWNrXG4gICAgaWYgKGlzTmlsKHRoaXMudXNlckV2ZW50U2VydmljZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9Tm8gc2VydmljZSBpbmplY3RlZGApO1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVzZXIgZXZlbnQgc2VydmljZSBleGlzdHNcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2V0VmlzaWJsZSh0b0Jvb2xlYW4odGhpcy52aXNpYmxlLCAhdGhpcy5hdXRvSGlkZSkpO1xuXG4gICAgICAvLyBXYWl0IHNlcnZpY2VcbiAgICAgIGF3YWl0IHRoaXMudXNlckV2ZW50U2VydmljZS5yZWFkeSgpO1xuXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gcmVhZCBldmVudFxuICAgICAgdGhpcy5fcmVhZEV2ZW50LnN1YnNjcmliZSgoaXRlbSkgPT4ge1xuICAgICAgICAvLyBkZWZhdWx0OiBtYXJrIGV2ZW50IGFzIHJlYWRcbiAgICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLm1hcmtBbGxBc1JlYWQoW2l0ZW1dKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcmVhZEV2ZW50cy5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB7XG4gICAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5tYXJrQWxsQXNSZWFkKGl0ZW1zKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1EZXN0cm95aW5nYCk7XG4gICAgfVxuICAgIHRoaXMuX3JlYWRFdmVudC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3JlYWRFdmVudHMuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIHNob3dMaXN0KFxuICAgIGV2ZW50OiBFdmVudCA9IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdE9wdGlvbnMgJiB7XG4gICAgICBzdHlsZTogJ21vZGFsJyB8ICdwb3BvdmVyJztcbiAgICB9XG4gICkge1xuICAgIGlmICh0aGlzLm9uU2hvd0xpc3Qub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMub25TaG93TGlzdC5lbWl0KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVzZXQgY291bnQgKGlmIG5vdCBhdXRvIGhpZGUuIGVsc2UgaXQgd2lsbCBiZSBoaWRkZW4gYmVsbG93KVxuICAgIGlmICghdGhpcy5hdXRvSGlkZSkge1xuICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLnJlc2V0Q291bnQoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0ge1xuICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICB0aXRsZUkxOG46IHRoaXMudGl0bGVJMThuLFxuICAgICAgcmVhZEV2ZW50OiB0aGlzLl9yZWFkRXZlbnQsXG4gICAgICByZWFkRXZlbnRzOiB0aGlzLl9yZWFkRXZlbnRzLFxuICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlcixcbiAgICAgIGhlYWRlckFjdGlvbnM6IHRoaXMuaGVhZGVyQWN0aW9ucyxcbiAgICAgIGZvb3RlckFjdGlvbnM6IHRoaXMuZm9vdGVyQWN0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIE9wZW4gdXNpbmcgbW9kYWxcbiAgICBjb25zdCBsaXN0U3R5bGUgPSBvcHRpb25zPy5zdHlsZSB8fCB0aGlzLmxpc3RTdHlsZTtcbiAgICBpZiAobGlzdFN0eWxlID09PSAnbW9kYWwnKSB7XG4gICAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDb250cm9sbGVyLmNyZWF0ZSh7XG4gICAgICAgIGNvbXBvbmVudDogVXNlckV2ZW50Tm90aWZpY2F0aW9uTW9kYWwsXG4gICAgICAgIGNvbXBvbmVudFByb3BzOiBvcHRpb25zLFxuICAgICAgICBiYWNrZHJvcERpc21pc3M6IHRydWUsXG4gICAgICAgIGtleWJvYXJkQ2xvc2U6IHRydWUsXG4gICAgICAgIGNzc0NsYXNzOiAnbW9kYWwtbm90aWZpY2F0aW9ucycsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG1vZGFsLnByZXNlbnQoKTtcbiAgICB9XG5cbiAgICAvLyBPcGVuIHVzaW5nIHBvcG92ZXJcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHBvcG92ZXIgPSBhd2FpdCB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmNyZWF0ZSh7XG4gICAgICAgIGNvbXBvbmVudDogVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdCxcbiAgICAgICAgY29tcG9uZW50UHJvcHM6IG9wdGlvbnMsXG4gICAgICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcbiAgICAgICAga2V5Ym9hcmRDbG9zZTogdHJ1ZSxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRyYW5zbHVjZW50OiB0cnVlLFxuICAgICAgICBjc3NDbGFzczogJ3BvcG92ZXItbGFyZ2UgcG9wb3Zlci1ub3RpZmljYXRpb25zJyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcG9wb3Zlci5wcmVzZW50KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgY291bnQgKGlmIGF1dG8gaGlkZSAtIGFmdGVyIGxpc3QgaGFzIGJlZW4gb3BlbmVkKVxuICAgIGlmICh0aGlzLmF1dG9IaWRlKSB7XG4gICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UucmVzZXRDb3VudCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMudmlzaWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHZhbHVlO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cbn1cbiIsIkBsZXQgY291bnQgPSAoY291bnQkIHwgYXN5bmMpO1xuQGlmICh2aXNpYmxlKSB7XG4gIEBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgPCEtLSBtYXQgaWNvbiBidXR0b24gKGUuZy4gZm9yIGhvbWUgdG9vbGJhcikgLS0+XG4gICAgQGNhc2UgKCdtYXQtYnV0dG9uJykge1xuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW2NvbG9yXT1cIihjb3VudCAmJiB1bnJlYWRDb2xvciB8fCBjb2xvcikgfCBtYXRDb2xvclwiXG4gICAgICAgIFt0aXRsZV09XCJ0aXRsZUkxOG4gfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwic2hvd0xpc3QoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgIFttYXRCYWRnZV09XCJjb3VudCB8IGJhZGdlTnVtYmVyXCJcbiAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIWNvdW50XCJcbiAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICBtYXRCYWRnZVNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbWF0QmFkZ2VQb3NpdGlvbj1cImFib3ZlIGFmdGVyXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgPlxuICAgICAgICAgIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDwhLS0gaW9uIGJ1dHRvbiAoZS5nLiBmb3IgaG9tZSB0b29sYmFyKSAtLT5cbiAgICBAY2FzZSAoJ2lvbi1idXR0b24nKSB7XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgW2NvbG9yXT1cImNvdW50ICYmIHVucmVhZENvbG9yIHx8IGNvbG9yXCJcbiAgICAgICAgW3RpdGxlXT1cInRpdGxlSTE4biB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJzaG93TGlzdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgc2xvdD1cImljb24tb25seVwiXG4gICAgICAgICAgW21hdEJhZGdlXT1cImNvdW50IHwgYmFkZ2VOdW1iZXJcIlxuICAgICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCIhY291bnRcIlxuICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgIG1hdEJhZGdlU2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBtYXRCYWRnZVBvc2l0aW9uPVwiYWJvdmUgYWZ0ZXJcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgICAgbm90aWZpY2F0aW9uc1xuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIH1cbiAgfVxufVxuIl19