@sumaris-net/ngx-components 18.23.48 → 18.23.50

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 (78) hide show
  1. package/doc/changelog.md +4 -0
  2. package/esm2022/public_api.mjs +2 -1
  3. package/esm2022/src/app/admin/users/users.mjs +25 -22
  4. package/esm2022/src/app/core/account/new-token.form.mjs +12 -9
  5. package/esm2022/src/app/core/account/token.table.mjs +14 -11
  6. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +9 -6
  7. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +8 -5
  8. package/esm2022/src/app/core/form/list/list.form.mjs +8 -5
  9. package/esm2022/src/app/core/form/properties/properties.form.mjs +12 -9
  10. package/esm2022/src/app/core/form/properties/properties.table.mjs +15 -12
  11. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +10 -7
  12. package/esm2022/src/app/core/home/home.mjs +21 -18
  13. package/esm2022/src/app/core/menu/menu.component.mjs +10 -7
  14. package/esm2022/src/app/core/settings/settings.page.mjs +10 -7
  15. package/esm2022/src/app/core/table/column/actions-column.component.mjs +8 -5
  16. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +9 -6
  17. package/esm2022/src/app/core/table/testing/table.testing.mjs +27 -23
  18. package/esm2022/src/app/core/table/testing/table2.testing.mjs +25 -22
  19. package/esm2022/src/app/shared/constants.mjs +3 -1
  20. package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +35 -0
  21. package/esm2022/src/app/shared/directives/directives.module.mjs +33 -4
  22. package/esm2022/src/app/shared/functions.mjs +2 -2
  23. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +15 -12
  24. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +13 -11
  25. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -2
  26. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +5 -2
  27. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +9 -6
  28. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +15 -4
  29. package/esm2022/src/app/shared/material/chips/chips.module.mjs +5 -2
  30. package/esm2022/src/app/shared/material/chips/material.chips.mjs +14 -12
  31. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +8 -5
  32. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +11 -9
  33. package/esm2022/src/app/social/feed/feed.component.mjs +15 -12
  34. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +11 -8
  35. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +12 -9
  36. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +12 -8
  37. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +12 -9
  38. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +9 -6
  39. package/fesm2022/sumaris-net.ngx-components.mjs +195 -90
  40. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  41. package/package.json +1 -1
  42. package/public_api.d.ts +1 -0
  43. package/src/app/admin/users/users.d.ts +1 -0
  44. package/src/app/core/account/new-token.form.d.ts +1 -0
  45. package/src/app/core/account/token.table.d.ts +1 -0
  46. package/src/app/core/form/array/testing/form-array.test.d.ts +1 -0
  47. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -0
  48. package/src/app/core/form/list/list.form.d.ts +1 -0
  49. package/src/app/core/form/properties/properties.form.d.ts +1 -0
  50. package/src/app/core/form/properties/properties.table.d.ts +1 -0
  51. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -0
  52. package/src/app/core/home/home.d.ts +1 -0
  53. package/src/app/core/menu/menu.component.d.ts +1 -0
  54. package/src/app/core/settings/settings.page.d.ts +1 -0
  55. package/src/app/core/table/column/actions-column.component.d.ts +1 -0
  56. package/src/app/core/table/column/nav-actions-column.component.d.ts +1 -0
  57. package/src/app/core/table/testing/table.testing.d.ts +1 -0
  58. package/src/app/core/table/testing/table2.testing.d.ts +1 -0
  59. package/src/app/shared/constants.d.ts +2 -0
  60. package/src/app/shared/directives/autotooltip.directive.d.ts +14 -0
  61. package/src/app/shared/directives/directives.module.d.ts +4 -3
  62. package/src/app/shared/image/gallery/image-gallery.component.d.ts +1 -0
  63. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -0
  64. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +2 -1
  65. package/src/app/shared/material/boolean/boolean.module.d.ts +2 -1
  66. package/src/app/shared/material/boolean/material.boolean.d.ts +1 -0
  67. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +5 -0
  68. package/src/app/shared/material/chips/chips.module.d.ts +2 -1
  69. package/src/app/shared/material/chips/material.chips.d.ts +1 -0
  70. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -0
  71. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -0
  72. package/src/app/social/feed/feed.component.d.ts +1 -0
  73. package/src/app/social/job/progression/job-progression.icon.d.ts +1 -0
  74. package/src/app/social/job/progression/job-progression.list.d.ts +1 -0
  75. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +1 -0
  76. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +2 -0
  77. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +1 -0
  78. package/src/assets/manifest.json +1 -1
@@ -1,16 +1,19 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, inject, Input } from '@angular/core';
2
+ import { SHOW_TOOLTIP } from '../../../shared/constants';
2
3
  import * as i0 from "@angular/core";
3
4
  import * as i1 from "@ionic/angular";
4
- import * as i2 from "./job-progression.component";
5
- import * as i3 from "@angular/common";
6
- import * as i4 from "@ngx-translate/core";
7
- import * as i5 from "@rx-angular/template/push";
8
- import * as i6 from "../../../shared/pipes/arrays.pipe";
5
+ import * as i2 from "@angular/material/tooltip";
6
+ import * as i3 from "./job-progression.component";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@ngx-translate/core";
9
+ import * as i6 from "@rx-angular/template/push";
10
+ import * as i7 from "../../../shared/pipes/arrays.pipe";
9
11
  export class JobProgressionList {
10
12
  popoverController;
11
13
  titleI18n;
12
14
  headerActions;
13
15
  jobProgressions;
16
+ showTooltip = inject(SHOW_TOOLTIP);
14
17
  constructor(popoverController) {
15
18
  this.popoverController = popoverController;
16
19
  }
@@ -32,11 +35,11 @@ export class JobProgressionList {
32
35
  }
33
36
  }
34
37
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: JobProgressionList, deps: [{ token: i1.PopoverController }], target: i0.ɵɵFactoryTarget.Component });
35
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: JobProgressionList, selector: "app-job-progression-list", inputs: { titleI18n: "titleI18n", headerActions: "headerActions", jobProgressions: "jobProgressions" }, ngImport: i0, template: "<ion-list class=\"ion-list-popover\">\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{ titleI18n | translate }}</ion-label>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n @for (action of headerActions; track $index) {\n <ion-text>\n <a (click)=\"executeAction($event, action)\" [title]=\"action.title || action.name | translate\">\n {{ action.name | translate }}\n </a>\n </ion-text>\n }\n </ion-col>\n </ion-row>\n\n @if (jobProgressions | async | isEmptyArray) {\n <ion-item>\n {{ 'SOCIAL.JOB.PROGRESSION.EMPTY' | translate }}\n </ion-item>\n }\n @for (jobProgression$ of jobProgressions | push; track $index) {\n <app-job-progression-component [jobProgression$]=\"jobProgression$\"></app-job-progression-component>\n }\n</ion-list>\n", styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;user-select:none}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.JobProgressionComponent, selector: "app-job-progression-component", inputs: ["showName", "jobProgression$"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i5.RxPush, name: "push" }, { kind: "pipe", type: i6.EmptyArrayPipe, name: "isEmptyArray" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
38
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: JobProgressionList, selector: "app-job-progression-list", inputs: { titleI18n: "titleI18n", headerActions: "headerActions", jobProgressions: "jobProgressions" }, ngImport: i0, template: "<ion-list class=\"ion-list-popover\">\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{ titleI18n | translate }}</ion-label>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n @for (action of headerActions; track $index) {\n <ion-text>\n <a\n (click)=\"executeAction($event, action)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n {{ action.name | translate }}\n </a>\n </ion-text>\n }\n </ion-col>\n </ion-row>\n\n @if (jobProgressions | async | isEmptyArray) {\n <ion-item>\n {{ 'SOCIAL.JOB.PROGRESSION.EMPTY' | translate }}\n </ion-item>\n }\n @for (jobProgression$ of jobProgressions | push; track $index) {\n <app-job-progression-component [jobProgression$]=\"jobProgression$\"></app-job-progression-component>\n }\n</ion-list>\n", styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;user-select:none}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i3.JobProgressionComponent, selector: "app-job-progression-component", inputs: ["showName", "jobProgression$"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i6.RxPush, name: "push" }, { kind: "pipe", type: i7.EmptyArrayPipe, name: "isEmptyArray" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
36
39
  }
37
40
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: JobProgressionList, decorators: [{
38
41
  type: Component,
39
- args: [{ selector: 'app-job-progression-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-list class=\"ion-list-popover\">\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{ titleI18n | translate }}</ion-label>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n @for (action of headerActions; track $index) {\n <ion-text>\n <a (click)=\"executeAction($event, action)\" [title]=\"action.title || action.name | translate\">\n {{ action.name | translate }}\n </a>\n </ion-text>\n }\n </ion-col>\n </ion-row>\n\n @if (jobProgressions | async | isEmptyArray) {\n <ion-item>\n {{ 'SOCIAL.JOB.PROGRESSION.EMPTY' | translate }}\n </ion-item>\n }\n @for (jobProgression$ of jobProgressions | push; track $index) {\n <app-job-progression-component [jobProgression$]=\"jobProgression$\"></app-job-progression-component>\n }\n</ion-list>\n", styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;user-select:none}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}\n"] }]
42
+ args: [{ selector: 'app-job-progression-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-list class=\"ion-list-popover\">\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{ titleI18n | translate }}</ion-label>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n @for (action of headerActions; track $index) {\n <ion-text>\n <a\n (click)=\"executeAction($event, action)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n {{ action.name | translate }}\n </a>\n </ion-text>\n }\n </ion-col>\n </ion-row>\n\n @if (jobProgressions | async | isEmptyArray) {\n <ion-item>\n {{ 'SOCIAL.JOB.PROGRESSION.EMPTY' | translate }}\n </ion-item>\n }\n @for (jobProgression$ of jobProgressions | push; track $index) {\n <app-job-progression-component [jobProgression$]=\"jobProgression$\"></app-job-progression-component>\n }\n</ion-list>\n", styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;user-select:none}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}\n"] }]
40
43
  }], ctorParameters: () => [{ type: i1.PopoverController }], propDecorators: { titleI18n: [{
41
44
  type: Input
42
45
  }], headerActions: [{
@@ -44,4 +47,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
44
47
  }], jobProgressions: [{
45
48
  type: Input
46
49
  }] } });
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLXByb2dyZXNzaW9uLmxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9qb2IvcHJvZ3Jlc3Npb24vam9iLXByb2dyZXNzaW9uLmxpc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9qb2IvcHJvZ3Jlc3Npb24vam9iLXByb2dyZXNzaW9uLmxpc3QuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFpQjFFLE1BQU0sT0FBTyxrQkFBa0I7SUFLUDtJQUpiLFNBQVMsQ0FBUztJQUNsQixhQUFhLENBQXFCO0lBQ2xDLGVBQWUsQ0FBMkM7SUFFbkUsWUFBc0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFBRyxDQUFDO0lBRTlELEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBWSxFQUFFLE1BQXdCO1FBQ3hELElBQUksS0FBSyxFQUFFLGdCQUFnQjtZQUFFLE9BQU8sQ0FBQyxvQkFBb0I7UUFFekQsK0RBQStEO1FBQy9ELElBQUksS0FBSztZQUFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUVsQyw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLFlBQVksT0FBTztnQkFBRSxNQUFNLEdBQUcsQ0FBQztRQUN4QyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7d0dBckJVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLHdLQ2pCL0IsczJCQXlCQTs7NEZEUmEsa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLDBCQUEwQixtQkFHbkIsdUJBQXVCLENBQUMsTUFBTTtzRkFHdEMsU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSm9iUHJvZ3Jlc3Npb24gfSBmcm9tICcuL2pvYi1wcm9ncmVzc2lvbi5tb2RlbCc7XG5pbXBvcnQgeyBJVXNlckV2ZW50QWN0aW9uIH0gZnJvbSAnLi4vLi4vdXNlci1ldmVudC91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IFBvcG92ZXJDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEpvYlByb2dyZXNzaW9uTGlzdE9wdGlvbnMge1xuICB0aXRsZUkxOG4/OiBzdHJpbmc7XG4gIGhlYWRlckFjdGlvbnM/OiBJVXNlckV2ZW50QWN0aW9uW107XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1qb2ItcHJvZ3Jlc3Npb24tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9qb2ItcHJvZ3Jlc3Npb24ubGlzdC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vam9iLXByb2dyZXNzaW9uLmxpc3Quc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSm9iUHJvZ3Jlc3Npb25MaXN0IGltcGxlbWVudHMgSm9iUHJvZ3Jlc3Npb25MaXN0T3B0aW9ucyB7XG4gIEBJbnB1dCgpIHRpdGxlSTE4bjogc3RyaW5nO1xuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zOiBJVXNlckV2ZW50QWN0aW9uW107XG4gIEBJbnB1dCgpIGpvYlByb2dyZXNzaW9uczogT2JzZXJ2YWJsZTxPYnNlcnZhYmxlPEpvYlByb2dyZXNzaW9uPltdPjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyKSB7fVxuXG4gIGFzeW5jIGV4ZWN1dGVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246IElVc2VyRXZlbnRBY3Rpb24pIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjsgLy8gU2tpcCBpZiBwcmV2ZW50ZWRcblxuICAgIC8vIERpc2FibGUgZGVmYXVsdCBhY3Rpb24gKC5lLmcgYXZvaWQgdG8gY2FsbCBjbGljaygpIGZ1bmN0aW9uKVxuICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIEV4ZWN1dGUgdGhlbiBjbG9zZSBwb3BvdmVyXG4gICAgdGhpcy5wb3BvdmVyQ29udHJvbGxlci5kaXNtaXNzKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGFjdGlvbi5leGVjdXRlQWN0aW9uKHVuZGVmaW5lZCk7XG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkgYXdhaXQgcmVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgfVxufVxuIiwiPGlvbi1saXN0IGNsYXNzPVwiaW9uLWxpc3QtcG9wb3ZlclwiPlxuICA8aW9uLXJvdyBjbGFzcz1cImlvbi1saXN0LWhlYWRlciBjb2x1bW5cIj5cbiAgICA8aW9uLWNvbD5cbiAgICAgIDxpb24tbGFiZWw+e3sgdGl0bGVJMThuIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgPC9pb24tY29sPlxuICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJoZWFkZXItYWN0aW9uXCI+XG4gICAgICBAZm9yIChhY3Rpb24gb2YgaGVhZGVyQWN0aW9uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxpb24tdGV4dD5cbiAgICAgICAgICA8YSAoY2xpY2spPVwiZXhlY3V0ZUFjdGlvbigkZXZlbnQsIGFjdGlvbilcIiBbdGl0bGVdPVwiYWN0aW9uLnRpdGxlIHx8IGFjdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgIH1cbiAgICA8L2lvbi1jb2w+XG4gIDwvaW9uLXJvdz5cblxuICBAaWYgKGpvYlByb2dyZXNzaW9ucyB8IGFzeW5jIHwgaXNFbXB0eUFycmF5KSB7XG4gICAgPGlvbi1pdGVtPlxuICAgICAge3sgJ1NPQ0lBTC5KT0IuUFJPR1JFU1NJT04uRU1QVFknIHwgdHJhbnNsYXRlIH19XG4gICAgPC9pb24taXRlbT5cbiAgfVxuICBAZm9yIChqb2JQcm9ncmVzc2lvbiQgb2Ygam9iUHJvZ3Jlc3Npb25zIHwgcHVzaDsgdHJhY2sgJGluZGV4KSB7XG4gICAgPGFwcC1qb2ItcHJvZ3Jlc3Npb24tY29tcG9uZW50IFtqb2JQcm9ncmVzc2lvbiRdPVwiam9iUHJvZ3Jlc3Npb24kXCI+PC9hcHAtam9iLXByb2dyZXNzaW9uLWNvbXBvbmVudD5cbiAgfVxuPC9pb24tbGlzdD5cbiJdfQ==
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLXByb2dyZXNzaW9uLmxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9qb2IvcHJvZ3Jlc3Npb24vam9iLXByb2dyZXNzaW9uLmxpc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9qb2IvcHJvZ3Jlc3Npb24vam9iLXByb2dyZXNzaW9uLmxpc3QuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7QUFhekQsTUFBTSxPQUFPLGtCQUFrQjtJQU9QO0lBTmIsU0FBUyxDQUFTO0lBQ2xCLGFBQWEsQ0FBcUI7SUFDbEMsZUFBZSxDQUEyQztJQUVuRSxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRW5DLFlBQXNCLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBQUcsQ0FBQztJQUU5RCxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQVksRUFBRSxNQUF3QjtRQUN4RCxJQUFJLEtBQUssRUFBRSxnQkFBZ0I7WUFBRSxPQUFPLENBQUMsb0JBQW9CO1FBRXpELCtEQUErRDtRQUMvRCxJQUFJLEtBQUs7WUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFbEMsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxZQUFZLE9BQU87Z0JBQUUsTUFBTSxHQUFHLENBQUM7UUFDeEMsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO3dHQXZCVSxrQkFBa0I7NEZBQWxCLGtCQUFrQix3S0NuQi9CLDYvQkE2QkE7OzRGRFZhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU07c0ZBR3RDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSm9iUHJvZ3Jlc3Npb24gfSBmcm9tICcuL2pvYi1wcm9ncmVzc2lvbi5tb2RlbCc7XG5pbXBvcnQgeyBJVXNlckV2ZW50QWN0aW9uIH0gZnJvbSAnLi4vLi4vdXNlci1ldmVudC91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IFBvcG92ZXJDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBKb2JQcm9ncmVzc2lvbkxpc3RPcHRpb25zIHtcbiAgdGl0bGVJMThuPzogc3RyaW5nO1xuICBoZWFkZXJBY3Rpb25zPzogSVVzZXJFdmVudEFjdGlvbltdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtam9iLXByb2dyZXNzaW9uLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vam9iLXByb2dyZXNzaW9uLmxpc3QuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2pvYi1wcm9ncmVzc2lvbi5saXN0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEpvYlByb2dyZXNzaW9uTGlzdCBpbXBsZW1lbnRzIEpvYlByb2dyZXNzaW9uTGlzdE9wdGlvbnMge1xuICBASW5wdXQoKSB0aXRsZUkxOG46IHN0cmluZztcbiAgQElucHV0KCkgaGVhZGVyQWN0aW9uczogSVVzZXJFdmVudEFjdGlvbltdO1xuICBASW5wdXQoKSBqb2JQcm9ncmVzc2lvbnM6IE9ic2VydmFibGU8T2JzZXJ2YWJsZTxKb2JQcm9ncmVzc2lvbj5bXT47XG5cbiAgc2hvd1Rvb2x0aXAgPSBpbmplY3QoU0hPV19UT09MVElQKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyKSB7fVxuXG4gIGFzeW5jIGV4ZWN1dGVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246IElVc2VyRXZlbnRBY3Rpb24pIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjsgLy8gU2tpcCBpZiBwcmV2ZW50ZWRcblxuICAgIC8vIERpc2FibGUgZGVmYXVsdCBhY3Rpb24gKC5lLmcgYXZvaWQgdG8gY2FsbCBjbGljaygpIGZ1bmN0aW9uKVxuICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIEV4ZWN1dGUgdGhlbiBjbG9zZSBwb3BvdmVyXG4gICAgdGhpcy5wb3BvdmVyQ29udHJvbGxlci5kaXNtaXNzKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGFjdGlvbi5leGVjdXRlQWN0aW9uKHVuZGVmaW5lZCk7XG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkgYXdhaXQgcmVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgfVxufVxuIiwiPGlvbi1saXN0IGNsYXNzPVwiaW9uLWxpc3QtcG9wb3ZlclwiPlxuICA8aW9uLXJvdyBjbGFzcz1cImlvbi1saXN0LWhlYWRlciBjb2x1bW5cIj5cbiAgICA8aW9uLWNvbD5cbiAgICAgIDxpb24tbGFiZWw+e3sgdGl0bGVJMThuIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgPC9pb24tY29sPlxuICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJoZWFkZXItYWN0aW9uXCI+XG4gICAgICBAZm9yIChhY3Rpb24gb2YgaGVhZGVyQWN0aW9uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxpb24tdGV4dD5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4ZWN1dGVBY3Rpb24oJGV2ZW50LCBhY3Rpb24pXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoYWN0aW9uLnRpdGxlIHx8IGFjdGlvbi5uYW1lIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKGFjdGlvbi50aXRsZSB8fCBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgYWN0aW9uLm5hbWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICB9XG4gICAgPC9pb24tY29sPlxuICA8L2lvbi1yb3c+XG5cbiAgQGlmIChqb2JQcm9ncmVzc2lvbnMgfCBhc3luYyB8IGlzRW1wdHlBcnJheSkge1xuICAgIDxpb24taXRlbT5cbiAgICAgIHt7ICdTT0NJQUwuSk9CLlBST0dSRVNTSU9OLkVNUFRZJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvaW9uLWl0ZW0+XG4gIH1cbiAgQGZvciAoam9iUHJvZ3Jlc3Npb24kIG9mIGpvYlByb2dyZXNzaW9ucyB8IHB1c2g7IHRyYWNrICRpbmRleCkge1xuICAgIDxhcHAtam9iLXByb2dyZXNzaW9uLWNvbXBvbmVudCBbam9iUHJvZ3Jlc3Npb24kXT1cImpvYlByb2dyZXNzaW9uJFwiPjwvYXBwLWpvYi1wcm9ncmVzc2lvbi1jb21wb25lbnQ+XG4gIH1cbjwvaW9uLWxpc3Q+XG4iXX0=
@@ -1,10 +1,11 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, inject, 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
7
  import { UserEventNotificationModal } from './user-event-notification.modal';
8
+ import { SHOW_TOOLTIP } from '../../../shared/constants';
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "../../../core/services/account.service";
10
11
  import * as i2 from "@ionic/angular";
@@ -12,10 +13,11 @@ import * as i3 from "../../../core/services/local-settings.service";
12
13
  import * as i4 from "@angular/material/icon";
13
14
  import * as i5 from "@angular/material/button";
14
15
  import * as i6 from "@angular/material/badge";
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";
16
+ import * as i7 from "@angular/material/tooltip";
17
+ import * as i8 from "@angular/common";
18
+ import * as i9 from "@ngx-translate/core";
19
+ import * as i10 from "../../../shared/pipes/colors.pipe";
20
+ import * as i11 from "../../../shared/pipes/badge.pipes";
19
21
  export class UserEventNotificationIcon {
20
22
  userEventService;
21
23
  accountService;
@@ -42,6 +44,7 @@ export class UserEventNotificationIcon {
42
44
  listStyle;
43
45
  debug = false;
44
46
  onShowList = new EventEmitter();
47
+ showTooltip = inject(SHOW_TOOLTIP);
45
48
  constructor(userEventService, accountService, popoverController, modalController, settings, cd) {
46
49
  this.userEventService = userEventService;
47
50
  this.accountService = accountService;
@@ -105,6 +108,7 @@ export class UserEventNotificationIcon {
105
108
  filter: this.filter,
106
109
  headerActions: this.headerActions,
107
110
  footerActions: this.footerActions,
111
+ showTooltip: this.showTooltip,
108
112
  ...options,
109
113
  };
110
114
  // Open using modal
@@ -144,11 +148,11 @@ export class UserEventNotificationIcon {
144
148
  }
145
149
  }
146
150
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", 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.14", 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 });
151
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", 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]=\"!showTooltip ? (titleI18n | translate) : ''\"\n [matTooltip]=\"showTooltip ? (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]=\"!showTooltip ? (titleI18n | translate) : ''\"\n [matTooltip]=\"showTooltip ? (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: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.MatColorPipe, name: "matColor" }, { kind: "pipe", type: i11.BadgeNumberPipe, name: "badgeNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
148
152
  }
149
153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEventNotificationIcon, decorators: [{
150
154
  type: Component,
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"] }]
155
+ 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]=\"!showTooltip ? (titleI18n | translate) : ''\"\n [matTooltip]=\"showTooltip ? (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]=\"!showTooltip ? (titleI18n | translate) : ''\"\n [matTooltip]=\"showTooltip ? (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"] }]
152
156
  }], ctorParameters: () => [{ type: undefined, decorators: [{
153
157
  type: Optional
154
158
  }, {
@@ -184,4 +188,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
184
188
  type: Output,
185
189
  args: ['showList']
186
190
  }] } });
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC91c2VyLWV2ZW50L25vdGlmaWNhdGlvbi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5pY29uLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxzQkFBc0IsRUFBcUIsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRixPQUFPLEVBQUUseUJBQXlCLEVBQW9DLE1BQU0sZ0NBQWdDLENBQUM7QUFHN0csT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzdELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFRN0UsTUFBTSxPQUFPLHlCQUF5QjtJQXlCaUI7SUFDekM7SUFDQTtJQUNBO0lBQ0E7SUFDRjtJQTdCRixVQUFVLEdBQUcsNEJBQTRCLENBQUM7SUFDMUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBQ2pELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQUVsRCxPQUFPLENBQVU7SUFDUixNQUFNLENBQXFCO0lBRXJDLFNBQVMsR0FBRyxz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QjVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCO3VNQWpCbkMsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFYyxVQUFVO3NCQUE3QixNQUFNO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQb3BvdmVyQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEFQUF9VU0VSX0VWRU5UX1NFUlZJQ0UsIElVc2VyRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlci1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3QsIFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3RPcHRpb25zIH0gZnJvbSAnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0JztcbmltcG9ydCB7IElVc2VyRXZlbnQsIElVc2VyRXZlbnRBY3Rpb24sIElVc2VyRXZlbnRGaWx0ZXIgfSBmcm9tICcuLi91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc05pbCwgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBBcHBDb2xvcnMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlckV2ZW50Tm90aWZpY2F0aW9uTW9kYWwgfSBmcm9tICcuL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLm1vZGFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXItZXZlbnQtbm90aWZpY2F0aW9uLWljb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnROb3RpZmljYXRpb25JY29uIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9sb2dQcmVmaXggPSAnW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uXSAnO1xuICBwcml2YXRlIF9yZWFkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55Pj4oKTtcbiAgcHJpdmF0ZSBfcmVhZEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8SVVzZXJFdmVudDxhbnk+W10+KCk7XG5cbiAgcHJvdGVjdGVkIHZpc2libGU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBjb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBASW5wdXQoKSB0aXRsZUkxOG4gPSAnU09DSUFMLlVTRVJfRVZFTlQuTk9USUZJQ0FUSU9OLlRJVExFJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZmlsdGVyOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBhdXRvSGlkZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zOiBJVXNlckV2ZW50QWN0aW9uW107XG4gIEBJbnB1dCgpIGZvb3RlckFjdGlvbnM6IElVc2VyRXZlbnRBY3Rpb25bXTtcbiAgQElucHV0KCkgc3R5bGU6ICdtYXQtYnV0dG9uJyB8ICdpb24tYnV0dG9uJyA9ICdtYXQtYnV0dG9uJztcbiAgQElucHV0KCkgY29sb3I6IEFwcENvbG9ycztcbiAgQElucHV0KCkgdW5yZWFkQ29sb3I6IEFwcENvbG9ycztcbiAgQElucHV0KCkgZmlsbDogJ2NsZWFyJyB8ICdvdXRsaW5lJyB8ICdzb2xpZCc7XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgbGlzdFN0eWxlOiAncG9wb3ZlcicgfCAnbW9kYWwnO1xuICBASW5wdXQoKSBkZWJ1ZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ3Nob3dMaXN0Jykgb25TaG93TGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9FVkVOVF9TRVJWSUNFKSBwdWJsaWMgdXNlckV2ZW50U2VydmljZTogSVVzZXJFdmVudFNlcnZpY2U8SVVzZXJFdmVudDxhbnk+LCBJVXNlckV2ZW50RmlsdGVyPGFueT4+LFxuICAgIHByb3RlY3RlZCBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHBvcG92ZXJDb250cm9sbGVyOiBQb3BvdmVyQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgbW9kYWxDb250cm9sbGVyOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLm1vYmlsZSA9IHNldHRpbmdzLm1vYmlsZTtcbiAgICB0aGlzLmxpc3RTdHlsZSA9IHRoaXMubW9iaWxlID8gJ21vZGFsJyA6ICdwb3BvdmVyJztcbiAgICB0aGlzLmNvdW50JCA9ICF0aGlzLnVzZXJFdmVudFNlcnZpY2VcbiAgICAgID8gb2YoKVxuICAgICAgOiB0aGlzLnVzZXJFdmVudFNlcnZpY2UuY291bnRTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZSA9ICF0aGlzLmF1dG9IaWRlIHx8IHZhbHVlID4gMDtcbiAgICAgICAgICAgIHRoaXMuc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKHZhbHVlKSA9PiAodmFsdWUgPT09IDAgPyB1bmRlZmluZWQgOiB2YWx1ZSkpXG4gICAgICAgICk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAvLyBTZXJ2aWNlIGlzIG1pc3Npbmc6IGZhbGxiYWNrXG4gICAgaWYgKGlzTmlsKHRoaXMudXNlckV2ZW50U2VydmljZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9Tm8gc2VydmljZSBpbmplY3RlZGApO1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVzZXIgZXZlbnQgc2VydmljZSBleGlzdHNcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2V0VmlzaWJsZSh0b0Jvb2xlYW4odGhpcy52aXNpYmxlLCAhdGhpcy5hdXRvSGlkZSkpO1xuXG4gICAgICAvLyBXYWl0IHNlcnZpY2VcbiAgICAgIGF3YWl0IHRoaXMudXNlckV2ZW50U2VydmljZS5yZWFkeSgpO1xuXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gcmVhZCBldmVudFxuICAgICAgdGhpcy5fcmVhZEV2ZW50LnN1YnNjcmliZSgoaXRlbSkgPT4ge1xuICAgICAgICAvLyBkZWZhdWx0OiBtYXJrIGV2ZW50IGFzIHJlYWRcbiAgICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLm1hcmtBbGxBc1JlYWQoW2l0ZW1dKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcmVhZEV2ZW50cy5zdWJzY3JpYmUoKGl0ZW1zKSA9PiB7XG4gICAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5tYXJrQWxsQXNSZWFkKGl0ZW1zKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1EZXN0cm95aW5nYCk7XG4gICAgfVxuICAgIHRoaXMuX3JlYWRFdmVudC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3JlYWRFdmVudHMuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIHNob3dMaXN0KFxuICAgIGV2ZW50OiBFdmVudCA9IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdE9wdGlvbnMgJiB7XG4gICAgICBzdHlsZTogJ21vZGFsJyB8ICdwb3BvdmVyJztcbiAgICB9XG4gICkge1xuICAgIGlmICh0aGlzLm9uU2hvd0xpc3Qub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMub25TaG93TGlzdC5lbWl0KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVzZXQgY291bnQgKGlmIG5vdCBhdXRvIGhpZGUuIGVsc2UgaXQgd2lsbCBiZSBoaWRkZW4gYmVsbG93KVxuICAgIGlmICghdGhpcy5hdXRvSGlkZSkge1xuICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLnJlc2V0Q291bnQoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0ge1xuICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICB0aXRsZUkxOG46IHRoaXMudGl0bGVJMThuLFxuICAgICAgcmVhZEV2ZW50OiB0aGlzLl9yZWFkRXZlbnQsXG4gICAgICByZWFkRXZlbnRzOiB0aGlzLl9yZWFkRXZlbnRzLFxuICAgICAgZmlsdGVyOiB0aGlzLmZpbHRlcixcbiAgICAgIGhlYWRlckFjdGlvbnM6IHRoaXMuaGVhZGVyQWN0aW9ucyxcbiAgICAgIGZvb3RlckFjdGlvbnM6IHRoaXMuZm9vdGVyQWN0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIE9wZW4gdXNpbmcgbW9kYWxcbiAgICBjb25zdCBsaXN0U3R5bGUgPSBvcHRpb25zPy5zdHlsZSB8fCB0aGlzLmxpc3RTdHlsZTtcbiAgICBpZiAobGlzdFN0eWxlID09PSAnbW9kYWwnKSB7XG4gICAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDb250cm9sbGVyLmNyZWF0ZSh7XG4gICAgICAgIGNvbXBvbmVudDogVXNlckV2ZW50Tm90aWZpY2F0aW9uTW9kYWwsXG4gICAgICAgIGNvbXBvbmVudFByb3BzOiBvcHRpb25zLFxuICAgICAgICBiYWNrZHJvcERpc21pc3M6IHRydWUsXG4gICAgICAgIGtleWJvYXJkQ2xvc2U6IHRydWUsXG4gICAgICAgIGNzc0NsYXNzOiAnbW9kYWwtbm90aWZpY2F0aW9ucycsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG1vZGFsLnByZXNlbnQoKTtcbiAgICB9XG5cbiAgICAvLyBPcGVuIHVzaW5nIHBvcG92ZXJcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHBvcG92ZXIgPSBhd2FpdCB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmNyZWF0ZSh7XG4gICAgICAgIGNvbXBvbmVudDogVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdCxcbiAgICAgICAgY29tcG9uZW50UHJvcHM6IG9wdGlvbnMsXG4gICAgICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcbiAgICAgICAga2V5Ym9hcmRDbG9zZTogdHJ1ZSxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRyYW5zbHVjZW50OiB0cnVlLFxuICAgICAgICBjc3NDbGFzczogJ3BvcG92ZXItbGFyZ2UgcG9wb3Zlci1ub3RpZmljYXRpb25zJyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcG9wb3Zlci5wcmVzZW50KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgY291bnQgKGlmIGF1dG8gaGlkZSAtIGFmdGVyIGxpc3QgaGFzIGJlZW4gb3BlbmVkKVxuICAgIGlmICh0aGlzLmF1dG9IaWRlKSB7XG4gICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UucmVzZXRDb3VudCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMudmlzaWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHZhbHVlO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cbn1cbiIsIkBsZXQgY291bnQgPSAoY291bnQkIHwgYXN5bmMpO1xuQGlmICh2aXNpYmxlKSB7XG4gIEBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgPCEtLSBtYXQgaWNvbiBidXR0b24gKGUuZy4gZm9yIGhvbWUgdG9vbGJhcikgLS0+XG4gICAgQGNhc2UgKCdtYXQtYnV0dG9uJykge1xuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW2NvbG9yXT1cIihjb3VudCAmJiB1bnJlYWRDb2xvciB8fCBjb2xvcikgfCBtYXRDb2xvclwiXG4gICAgICAgIFt0aXRsZV09XCJ0aXRsZUkxOG4gfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwic2hvd0xpc3QoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgIFttYXRCYWRnZV09XCJjb3VudCB8IGJhZGdlTnVtYmVyXCJcbiAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIWNvdW50XCJcbiAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICBtYXRCYWRnZVNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbWF0QmFkZ2VQb3NpdGlvbj1cImFib3ZlIGFmdGVyXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgPlxuICAgICAgICAgIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDwhLS0gaW9uIGJ1dHRvbiAoZS5nLiBmb3IgaG9tZSB0b29sYmFyKSAtLT5cbiAgICBAY2FzZSAoJ2lvbi1idXR0b24nKSB7XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgW2NvbG9yXT1cImNvdW50ICYmIHVucmVhZENvbG9yIHx8IGNvbG9yXCJcbiAgICAgICAgW3RpdGxlXT1cInRpdGxlSTE4biB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJzaG93TGlzdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgc2xvdD1cImljb24tb25seVwiXG4gICAgICAgICAgW21hdEJhZGdlXT1cImNvdW50IHwgYmFkZ2VOdW1iZXJcIlxuICAgICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCIhY291bnRcIlxuICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgIG1hdEJhZGdlU2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBtYXRCYWRnZVBvc2l0aW9uPVwiYWJvdmUgYWZ0ZXJcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgICAgbm90aWZpY2F0aW9uc1xuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIH1cbiAgfVxufVxuIl19
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC91c2VyLWV2ZW50L25vdGlmaWNhdGlvbi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5pY29uLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHlCQUF5QixFQUFvQyxNQUFNLGdDQUFnQyxDQUFDO0FBRzdHLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc3RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFRekQsTUFBTSxPQUFPLHlCQUF5QjtJQTJCaUI7SUFDekM7SUFDQTtJQUNBO0lBQ0E7SUFDRjtJQS9CRixVQUFVLEdBQUcsNEJBQTRCLENBQUM7SUFDMUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBQ2pELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBcUIs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QW5KVSx5QkFBeUIsa0JBMkJkLHNCQUFzQjs0RkEzQmpDLHlCQUF5QixtWkNqQ3RDLDhoREFtREE7OzRGRGxCYSx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0Usa0NBQWtDLG1CQUczQix1QkFBdUIsQ0FBQyxNQUFNOzswQkE2QjVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCO3VNQW5CbkMsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFYyxVQUFVO3NCQUE3QixNQUFNO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIFBvcG92ZXJDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQVBQX1VTRVJfRVZFTlRfU0VSVklDRSwgSVVzZXJFdmVudFNlcnZpY2UgfSBmcm9tICcuLi91c2VyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdCwgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdE9wdGlvbnMgfSBmcm9tICcuL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QnO1xuaW1wb3J0IHsgSVVzZXJFdmVudCwgSVVzZXJFdmVudEFjdGlvbiwgSVVzZXJFdmVudEZpbHRlciB9IGZyb20gJy4uL3VzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzTmlsLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEFwcENvbG9ycyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyRXZlbnROb3RpZmljYXRpb25Nb2RhbCB9IGZyb20gJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24ubW9kYWwnO1xuXG5pbXBvcnQgeyBTSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXItZXZlbnQtbm90aWZpY2F0aW9uLWljb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnROb3RpZmljYXRpb25JY29uIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9sb2dQcmVmaXggPSAnW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uXSAnO1xuICBwcml2YXRlIF9yZWFkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55Pj4oKTtcbiAgcHJpdmF0ZSBfcmVhZEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8SVVzZXJFdmVudDxhbnk+W10+KCk7XG5cbiAgcHJvdGVjdGVkIHZpc2libGU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBjb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBASW5wdXQoKSB0aXRsZUkxOG4gPSAnU09DSUFMLlVTRVJfRVZFTlQuTk9USUZJQ0FUSU9OLlRJVExFJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZmlsdGVyOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBhdXRvSGlkZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zOiBJVXNlckV2ZW50QWN0aW9uW107XG4gIEBJbnB1dCgpIGZvb3RlckFjdGlvbnM6IElVc2VyRXZlbnRBY3Rpb25bXTtcbiAgQElucHV0KCkgc3R5bGU6ICdtYXQtYnV0dG9uJyB8ICdpb24tYnV0dG9uJyA9ICdtYXQtYnV0dG9uJztcbiAgQElucHV0KCkgY29sb3I6IEFwcENvbG9ycztcbiAgQElucHV0KCkgdW5yZWFkQ29sb3I6IEFwcENvbG9ycztcbiAgQElucHV0KCkgZmlsbDogJ2NsZWFyJyB8ICdvdXRsaW5lJyB8ICdzb2xpZCc7XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgbGlzdFN0eWxlOiAncG9wb3ZlcicgfCAnbW9kYWwnO1xuICBASW5wdXQoKSBkZWJ1ZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ3Nob3dMaXN0Jykgb25TaG93TGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgc2hvd1Rvb2x0aXAgPSBpbmplY3QoU0hPV19UT09MVElQKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9VU0VSX0VWRU5UX1NFUlZJQ0UpIHB1YmxpYyB1c2VyRXZlbnRTZXJ2aWNlOiBJVXNlckV2ZW50U2VydmljZTxJVXNlckV2ZW50PGFueT4sIElVc2VyRXZlbnRGaWx0ZXI8YW55Pj4sXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMubW9iaWxlID0gc2V0dGluZ3MubW9iaWxlO1xuICAgIHRoaXMubGlzdFN0eWxlID0gdGhpcy5tb2JpbGUgPyAnbW9kYWwnIDogJ3BvcG92ZXInO1xuICAgIHRoaXMuY291bnQkID0gIXRoaXMudXNlckV2ZW50U2VydmljZVxuICAgICAgPyBvZigpXG4gICAgICA6IHRoaXMudXNlckV2ZW50U2VydmljZS5jb3VudFN1YmplY3QucGlwZShcbiAgICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlID0gIXRoaXMuYXV0b0hpZGUgfHwgdmFsdWUgPiAwO1xuICAgICAgICAgICAgdGhpcy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG1hcCgodmFsdWUpID0+ICh2YWx1ZSA9PT0gMCA/IHVuZGVmaW5lZCA6IHZhbHVlKSlcbiAgICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIC8vIFNlcnZpY2UgaXMgbWlzc2luZzogZmFsbGJhY2tcbiAgICBpZiAoaXNOaWwodGhpcy51c2VyRXZlbnRTZXJ2aWNlKSkge1xuICAgICAgY29uc29sZS53YXJuKGAke3RoaXMuX2xvZ1ByZWZpeH1ObyBzZXJ2aWNlIGluamVjdGVkYCk7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXNlciBldmVudCBzZXJ2aWNlIGV4aXN0c1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5zZXRWaXNpYmxlKHRvQm9vbGVhbih0aGlzLnZpc2libGUsICF0aGlzLmF1dG9IaWRlKSk7XG5cbiAgICAgIC8vIFdhaXQgc2VydmljZVxuICAgICAgYXdhaXQgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLnJlYWR5KCk7XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byByZWFkIGV2ZW50XG4gICAgICB0aGlzLl9yZWFkRXZlbnQuc3Vic2NyaWJlKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIGRlZmF1bHQ6IG1hcmsgZXZlbnQgYXMgcmVhZFxuICAgICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UubWFya0FsbEFzUmVhZChbaXRlbV0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9yZWFkRXZlbnRzLnN1YnNjcmliZSgoaXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLm1hcmtBbGxBc1JlYWQoaXRlbXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fURlc3Ryb3lpbmdgKTtcbiAgICB9XG4gICAgdGhpcy5fcmVhZEV2ZW50LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcmVhZEV2ZW50cy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgYXN5bmMgc2hvd0xpc3QoXG4gICAgZXZlbnQ6IEV2ZW50ID0gdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9ucyAmIHtcbiAgICAgIHN0eWxlOiAnbW9kYWwnIHwgJ3BvcG92ZXInO1xuICAgIH1cbiAgKSB7XG4gICAgaWYgKHRoaXMub25TaG93TGlzdC5vYnNlcnZlZCkge1xuICAgICAgdGhpcy5vblNob3dMaXN0LmVtaXQoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXNldCBjb3VudCAoaWYgbm90IGF1dG8gaGlkZS4gZWxzZSBpdCB3aWxsIGJlIGhpZGRlbiBiZWxsb3cpXG4gICAgaWYgKCF0aGlzLmF1dG9IaWRlKSB7XG4gICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UucmVzZXRDb3VudCgpO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSB7XG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgIHRpdGxlSTE4bjogdGhpcy50aXRsZUkxOG4sXG4gICAgICByZWFkRXZlbnQ6IHRoaXMuX3JlYWRFdmVudCxcbiAgICAgIHJlYWRFdmVudHM6IHRoaXMuX3JlYWRFdmVudHMsXG4gICAgICBmaWx0ZXI6IHRoaXMuZmlsdGVyLFxuICAgICAgaGVhZGVyQWN0aW9uczogdGhpcy5oZWFkZXJBY3Rpb25zLFxuICAgICAgZm9vdGVyQWN0aW9uczogdGhpcy5mb290ZXJBY3Rpb25zLFxuICAgICAgc2hvd1Rvb2x0aXA6IHRoaXMuc2hvd1Rvb2x0aXAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyBPcGVuIHVzaW5nIG1vZGFsXG4gICAgY29uc3QgbGlzdFN0eWxlID0gb3B0aW9ucz8uc3R5bGUgfHwgdGhpcy5saXN0U3R5bGU7XG4gICAgaWYgKGxpc3RTdHlsZSA9PT0gJ21vZGFsJykge1xuICAgICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ29udHJvbGxlci5jcmVhdGUoe1xuICAgICAgICBjb21wb25lbnQ6IFVzZXJFdmVudE5vdGlmaWNhdGlvbk1vZGFsLFxuICAgICAgICBjb21wb25lbnRQcm9wczogb3B0aW9ucyxcbiAgICAgICAgYmFja2Ryb3BEaXNtaXNzOiB0cnVlLFxuICAgICAgICBrZXlib2FyZENsb3NlOiB0cnVlLFxuICAgICAgICBjc3NDbGFzczogJ21vZGFsLW5vdGlmaWNhdGlvbnMnLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBtb2RhbC5wcmVzZW50KCk7XG4gICAgfVxuXG4gICAgLy8gT3BlbiB1c2luZyBwb3BvdmVyXG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBwb3BvdmVyID0gYXdhaXQgdGhpcy5wb3BvdmVyQ29udHJvbGxlci5jcmVhdGUoe1xuICAgICAgICBjb21wb25lbnQ6IFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3QsXG4gICAgICAgIGNvbXBvbmVudFByb3BzOiBvcHRpb25zLFxuICAgICAgICBiYWNrZHJvcERpc21pc3M6IHRydWUsXG4gICAgICAgIGtleWJvYXJkQ2xvc2U6IHRydWUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0cmFuc2x1Y2VudDogdHJ1ZSxcbiAgICAgICAgY3NzQ2xhc3M6ICdwb3BvdmVyLWxhcmdlIHBvcG92ZXItbm90aWZpY2F0aW9ucycsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHBvcG92ZXIucHJlc2VudCgpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGNvdW50IChpZiBhdXRvIGhpZGUgLSBhZnRlciBsaXN0IGhhcyBiZWVuIG9wZW5lZClcbiAgICBpZiAodGhpcy5hdXRvSGlkZSkge1xuICAgICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLnJlc2V0Q291bnQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnZpc2libGUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCJAbGV0IGNvdW50ID0gY291bnQkIHwgYXN5bmM7XG5AaWYgKHZpc2libGUpIHtcbiAgQHN3aXRjaCAoc3R5bGUpIHtcbiAgICA8IS0tIG1hdCBpY29uIGJ1dHRvbiAoZS5nLiBmb3IgaG9tZSB0b29sYmFyKSAtLT5cbiAgICBAY2FzZSAoJ21hdC1idXR0b24nKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBbY29sb3JdPVwiKGNvdW50ICYmIHVucmVhZENvbG9yKSB8fCBjb2xvciB8IG1hdENvbG9yXCJcbiAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICh0aXRsZUkxOG4gfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICh0aXRsZUkxOG4gfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwic2hvd0xpc3QoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgIFttYXRCYWRnZV09XCJjb3VudCB8IGJhZGdlTnVtYmVyXCJcbiAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIWNvdW50XCJcbiAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICBtYXRCYWRnZVNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbWF0QmFkZ2VQb3NpdGlvbj1cImFib3ZlIGFmdGVyXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICAgICAgPlxuICAgICAgICAgIG5vdGlmaWNhdGlvbnNcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDwhLS0gaW9uIGJ1dHRvbiAoZS5nLiBmb3IgaG9tZSB0b29sYmFyKSAtLT5cbiAgICBAY2FzZSAoJ2lvbi1idXR0b24nKSB7XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgW2NvbG9yXT1cIihjb3VudCAmJiB1bnJlYWRDb2xvcikgfHwgY29sb3JcIlxuICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKHRpdGxlSTE4biB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKHRpdGxlSTE4biB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJzaG93TGlzdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgc2xvdD1cImljb24tb25seVwiXG4gICAgICAgICAgW21hdEJhZGdlXT1cImNvdW50IHwgYmFkZ2VOdW1iZXJcIlxuICAgICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCIhY291bnRcIlxuICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgIG1hdEJhZGdlU2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBtYXRCYWRnZVBvc2l0aW9uPVwiYWJvdmUgYWZ0ZXJcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgICAgbm90aWZpY2F0aW9uc1xuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIH1cbiAgfVxufVxuIl19
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Inject, InjectionToken, Input, Optional, Output, ViewChild, ViewChildren, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, inject, Inject, InjectionToken, Input, Optional, Output, ViewChild, ViewChildren, } from '@angular/core';
2
2
  import { BehaviorSubject, Subscription } from 'rxjs';
3
3
  import { IonContent, IonItem } from '@ionic/angular';
4
4
  import { APP_USER_EVENT_SERVICE } from '../user-event.service';
@@ -6,17 +6,19 @@ import { isNotEmptyArray, removeDuplicatesFromArray } from '../../../shared/func
6
6
  import { fromScrollEndEvent } from '../../../shared/events';
7
7
  import { waitFor } from '../../../shared/observables';
8
8
  import { debounceTime, distinctUntilChanged, filter, first, map, switchMap } from 'rxjs/operators';
9
+ import { SHOW_TOOLTIP } from '../../../shared/constants';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "@ionic/angular";
11
12
  import * as i2 from "../../../core/services/local-settings.service";
12
13
  import * as i3 from "@angular/common";
13
14
  import * as i4 from "ngx-jdenticon";
14
15
  import * as i5 from "@angular/material/icon";
15
- import * as i6 from "../../../core/icon/icon.component";
16
- import * as i7 from "@ngx-translate/core";
17
- import * as i8 from "../../../shared/pipes/date-format.pipe";
18
- import * as i9 from "../../../shared/pipes/date-from-now.pipe";
19
- import * as i10 from "../../../shared/pipes/arrays.pipe";
16
+ import * as i6 from "@angular/material/tooltip";
17
+ import * as i7 from "../../../core/icon/icon.component";
18
+ import * as i8 from "@ngx-translate/core";
19
+ import * as i9 from "../../../shared/pipes/date-format.pipe";
20
+ import * as i10 from "../../../shared/pipes/date-from-now.pipe";
21
+ import * as i11 from "../../../shared/pipes/arrays.pipe";
20
22
  export const APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD = new InjectionToken('infiniteScrollThreshold');
21
23
  export class UserEventNotificationList {
22
24
  cd;
@@ -65,6 +67,7 @@ export class UserEventNotificationList {
65
67
  get canFetchMore() {
66
68
  return this.enableInfiniteScroll && !!this._fetchMoreFn;
67
69
  }
70
+ showTooltip = inject(SHOW_TOOLTIP);
68
71
  constructor(cd, popoverController, settings, userEventService, infiniteScrollThresholdFromToken) {
69
72
  this.cd = cd;
70
73
  this.popoverController = popoverController;
@@ -218,11 +221,11 @@ export class UserEventNotificationList {
218
221
  return this._panelElement;
219
222
  }
220
223
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEventNotificationList, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PopoverController }, { token: i2.LocalSettingsService, optional: true }, { token: APP_USER_EVENT_SERVICE, optional: true }, { token: APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD, optional: true }], target: i0.ɵɵFactoryTarget.Component });
221
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UserEventNotificationList, selector: "app-user-event-notification-list", inputs: { titleI18n: "titleI18n", sortBy: "sortBy", sortDirection: "sortDirection", filter: "filter", enableInfiniteScroll: "enableInfiniteScroll", infiniteScrollThreshold: "infiniteScrollThreshold", headerActions: "headerActions", footerActions: "footerActions", showHeader: "showHeader", showFooter: "showFooter", mobile: "mobile", debug: "debug", pageSize: "pageSize" }, outputs: { readEvent: "readEvent", readEvents: "readEvents", dismiss: "dismiss" }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true }, { propertyName: "ionItems", predicate: IonItem, descendants: true }], ngImport: i0, template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n\n <!-- header -->\n @if (showHeader) {\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n @if (titleI18n) {\n <ion-label>{{ titleI18n | translate }}</ion-label>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\" *ngIf=\"$items | async | isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a (click)=\"markAllAsRead($event)\">{{ 'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate }}</a>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n <ion-text *ngFor=\"let action of headerActions\">\n <a (click)=\"executeAction($event, action, undefined)\" [title]=\"action.title || action.name | translate\">\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n @for (item of $items | async; track item.id; let last = $last) {\n <ion-item\n [lines]=\"last ? 'none' : undefined\"\n [class.unread]=\"!item.readDate\"\n [class.tappable]=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\"\n (click)=\"click($event, item)\"\n >\n <ion-avatar slot=\"start\">\n <ion-img *ngIf=\"item.avatar; else avatarIcon\" [src]=\"item.avatar\" />\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"item.avatarIcon; else generateIcon\"\n [ref]=\"item.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n <ng-template #generateIcon>\n <div class=\"avatar\" *ngIf=\"item.avatarJdenticon\">\n <svg width=\"40\" width=\"40\" [data-jdenticon-value]=\"item.avatarJdenticon\"></svg>\n </div>\n </ng-template>\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <ion-text class=\"ion-text-wrap\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <!-- date -->\n <ion-row>\n <ion-col size=\"12\">\n <app-icon\n *ngIf=\"item.icon\"\n [ref]=\"item.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{ item.creationDate | dateFromNow }}</span>\n <span style=\"color: gray\">{{ ' | ' + (item.creationDate | dateFormat: { time: true }) }}</span>\n </small>\n </ion-col>\n </ion-row>\n\n <!-- actions -->\n <ion-row *ngIf=\"item.actions | isNotEmptyArray\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngFor=\"let action of item.actions\">\n <a\n *ngIf=\"!action.default\"\n class=\"action\"\n (click)=\"executeAction($event, action, item)\"\n [title]=\"action.title || action.name | translate\"\n >\n <app-icon *ngIf=\"action.iconRef\" slot=\"start\" height=\"20\" width=\"20\" [ref]=\"action.iconRef\"></app-icon>\n <span>{{ action.name | translate }}</span>\n </a>\n </ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\">\n chevron_right\n </mat-icon>\n </ion-item>\n }\n <!-- loading -->\n <ng-container *ngIf=\"($items | async) === undefined; else notLoading\">\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <ng-template #notLoading>\n <!-- no result -->\n <ion-item *ngIf=\"$items | async | isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{ 'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate }}</ion-text>\n </ion-item>\n\n <!-- Fetching more -->\n <ng-container *ngIf=\"fetchingMore; else infiniteLoop\" lines=\"none\" disabled>\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <!-- Infinite loop -->\n <ng-template #infiniteLoop>\n <ng-container *ngIf=\"canFetchMore\" lines=\"none\" disabled [ngTemplateOutlet]=\"loadingItem\"></ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n @if (showFooter) {\n <ion-row class=\"ion-list-footer column\">\n <ion-col size=\"auto\" class=\"footer-action\">\n <ion-text *ngFor=\"let action of footerActions\">\n <a (click)=\"executeAction($event, action, undefined)\" [title]=\"action.title || action.name | translate\">\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n <ion-col>\n <ion-text *ngIf=\"$itemCount | async; let count\" class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </ion-list>\n</ion-content>\n\n\n<!-- loading -->\n<ng-template #loadingItem>\n <ion-item lines=\"none\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n</ng-template>\n", styles: [":host(.popover-viewport) ion-content{overflow-y:auto;-webkit-user-select:none;user-select:none;max-height:var(--max-height)}ion-list ion-item.tappable{cursor:pointer}ion-list ion-item.tappable:hover{--ion-item-background: var(--ion-item-background-color-hover)}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}.footer-action{text-align:start;margin-left:8px}.footer-action a{cursor:pointer;color:var(--ion-color-contrast)}.footer-action a:hover{text-decoration:underline}a.action{font-size:.9em;margin-right:10px;cursor:pointer}a.action:hover span{text-decoration:underline}a.action app-icon{vertical-align:middle}ion-avatar img,ion-avatar .avatar svg{border:1px solid rgba(var(--ion-color-secondary-rgb, .5));border-radius:50%}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.SvgJdenticonDirective, selector: "svg[data-jdenticon-hash],svg[data-jdenticon-value]", inputs: ["data-jdenticon-hash", "data-jdenticon-value", "width", "height"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.AppIconComponent, selector: "app-icon", inputs: ["icon", "matIcon", "matSvgIcon", "color", "height", "width", "ref"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }, { kind: "pipe", type: i8.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i9.DateFromNowPipe, name: "dateFromNow" }, { kind: "pipe", type: i10.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i10.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i10.ArrayFilterPipe, name: "arrayFilter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
224
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UserEventNotificationList, selector: "app-user-event-notification-list", inputs: { titleI18n: "titleI18n", sortBy: "sortBy", sortDirection: "sortDirection", filter: "filter", enableInfiniteScroll: "enableInfiniteScroll", infiniteScrollThreshold: "infiniteScrollThreshold", headerActions: "headerActions", footerActions: "footerActions", showHeader: "showHeader", showFooter: "showFooter", mobile: "mobile", debug: "debug", pageSize: "pageSize" }, outputs: { readEvent: "readEvent", readEvents: "readEvents", dismiss: "dismiss" }, viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true }, { propertyName: "ionItems", predicate: IonItem, descendants: true }], ngImport: i0, template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n <!-- header -->\n @if (showHeader) {\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n @if (titleI18n) {\n <ion-label>{{ titleI18n | translate }}</ion-label>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\" *ngIf=\"$items | async | isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a\n (click)=\"markAllAsRead($event)\"\n [title]=\"!showTooltip ? ('SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate) : ''\"\n >\n {{ 'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate }}\n </a>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n <ion-text *ngFor=\"let action of headerActions\">\n <a\n (click)=\"executeAction($event, action, undefined)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n @for (item of $items | async; track item.id; let last = $last) {\n <ion-item\n [lines]=\"last ? 'none' : undefined\"\n [class.unread]=\"!item.readDate\"\n [class.tappable]=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\"\n (click)=\"click($event, item)\"\n >\n <ion-avatar slot=\"start\">\n <ion-img *ngIf=\"item.avatar; else avatarIcon\" [src]=\"item.avatar\" />\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"item.avatarIcon; else generateIcon\"\n [ref]=\"item.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n <ng-template #generateIcon>\n <div class=\"avatar\" *ngIf=\"item.avatarJdenticon\">\n <svg width=\"40\" width=\"40\" [data-jdenticon-value]=\"item.avatarJdenticon\"></svg>\n </div>\n </ng-template>\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <ion-text class=\"ion-text-wrap\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <!-- date -->\n <ion-row>\n <ion-col size=\"12\">\n <app-icon\n *ngIf=\"item.icon\"\n [ref]=\"item.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{ item.creationDate | dateFromNow }}</span>\n <span style=\"color: gray\">{{ ' | ' + (item.creationDate | dateFormat: { time: true }) }}</span>\n </small>\n </ion-col>\n </ion-row>\n\n <!-- actions -->\n <ion-row *ngIf=\"item.actions | isNotEmptyArray\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngFor=\"let action of item.actions\">\n <a\n *ngIf=\"!action.default\"\n class=\"action\"\n (click)=\"executeAction($event, action, item)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n <app-icon\n *ngIf=\"action.iconRef\"\n slot=\"start\"\n height=\"20\"\n width=\"20\"\n [ref]=\"action.iconRef\"\n ></app-icon>\n <span>{{ action.name | translate }}</span>\n </a>\n </ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\">\n chevron_right\n </mat-icon>\n </ion-item>\n }\n <!-- loading -->\n <ng-container *ngIf=\"($items | async) === undefined; else notLoading\">\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <ng-template #notLoading>\n <!-- no result -->\n <ion-item *ngIf=\"$items | async | isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{ 'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate }}</ion-text>\n </ion-item>\n\n <!-- Fetching more -->\n <ng-container *ngIf=\"fetchingMore; else infiniteLoop\" lines=\"none\" disabled>\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <!-- Infinite loop -->\n <ng-template #infiniteLoop>\n <ng-container *ngIf=\"canFetchMore\" lines=\"none\" disabled [ngTemplateOutlet]=\"loadingItem\"></ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n @if (showFooter) {\n <ion-row class=\"ion-list-footer column\">\n <ion-col size=\"auto\" class=\"footer-action\">\n <ion-text *ngFor=\"let action of footerActions\">\n <a\n (click)=\"executeAction($event, action, undefined)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n <ion-col>\n <ion-text *ngIf=\"$itemCount | async; let count\" class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </ion-list>\n</ion-content>\n\n<!-- loading -->\n<ng-template #loadingItem>\n <ion-item lines=\"none\" [disabled]>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n</ng-template>\n", styles: [":host(.popover-viewport) ion-content{overflow-y:auto;-webkit-user-select:none;user-select:none;max-height:var(--max-height)}ion-list ion-item.tappable{cursor:pointer}ion-list ion-item.tappable:hover{--ion-item-background: var(--ion-item-background-color-hover)}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}.footer-action{text-align:start;margin-left:8px}.footer-action a{cursor:pointer;color:var(--ion-color-contrast)}.footer-action a:hover{text-decoration:underline}a.action{font-size:.9em;margin-right:10px;cursor:pointer}a.action:hover span{text-decoration:underline}a.action app-icon{vertical-align:middle}ion-avatar img,ion-avatar .avatar svg{border:1px solid rgba(var(--ion-color-secondary-rgb, .5));border-radius:50%}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.SvgJdenticonDirective, selector: "svg[data-jdenticon-hash],svg[data-jdenticon-value]", inputs: ["data-jdenticon-hash", "data-jdenticon-value", "width", "height"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i7.AppIconComponent, selector: "app-icon", inputs: ["icon", "matIcon", "matSvgIcon", "color", "height", "width", "ref"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "pipe", type: i9.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i10.DateFromNowPipe, name: "dateFromNow" }, { kind: "pipe", type: i11.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i11.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i11.ArrayFilterPipe, name: "arrayFilter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
222
225
  }
223
226
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserEventNotificationList, decorators: [{
224
227
  type: Component,
225
- args: [{ selector: 'app-user-event-notification-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n\n <!-- header -->\n @if (showHeader) {\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n @if (titleI18n) {\n <ion-label>{{ titleI18n | translate }}</ion-label>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\" *ngIf=\"$items | async | isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a (click)=\"markAllAsRead($event)\">{{ 'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate }}</a>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n <ion-text *ngFor=\"let action of headerActions\">\n <a (click)=\"executeAction($event, action, undefined)\" [title]=\"action.title || action.name | translate\">\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n @for (item of $items | async; track item.id; let last = $last) {\n <ion-item\n [lines]=\"last ? 'none' : undefined\"\n [class.unread]=\"!item.readDate\"\n [class.tappable]=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\"\n (click)=\"click($event, item)\"\n >\n <ion-avatar slot=\"start\">\n <ion-img *ngIf=\"item.avatar; else avatarIcon\" [src]=\"item.avatar\" />\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"item.avatarIcon; else generateIcon\"\n [ref]=\"item.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n <ng-template #generateIcon>\n <div class=\"avatar\" *ngIf=\"item.avatarJdenticon\">\n <svg width=\"40\" width=\"40\" [data-jdenticon-value]=\"item.avatarJdenticon\"></svg>\n </div>\n </ng-template>\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <ion-text class=\"ion-text-wrap\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <!-- date -->\n <ion-row>\n <ion-col size=\"12\">\n <app-icon\n *ngIf=\"item.icon\"\n [ref]=\"item.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{ item.creationDate | dateFromNow }}</span>\n <span style=\"color: gray\">{{ ' | ' + (item.creationDate | dateFormat: { time: true }) }}</span>\n </small>\n </ion-col>\n </ion-row>\n\n <!-- actions -->\n <ion-row *ngIf=\"item.actions | isNotEmptyArray\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngFor=\"let action of item.actions\">\n <a\n *ngIf=\"!action.default\"\n class=\"action\"\n (click)=\"executeAction($event, action, item)\"\n [title]=\"action.title || action.name | translate\"\n >\n <app-icon *ngIf=\"action.iconRef\" slot=\"start\" height=\"20\" width=\"20\" [ref]=\"action.iconRef\"></app-icon>\n <span>{{ action.name | translate }}</span>\n </a>\n </ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\">\n chevron_right\n </mat-icon>\n </ion-item>\n }\n <!-- loading -->\n <ng-container *ngIf=\"($items | async) === undefined; else notLoading\">\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <ng-template #notLoading>\n <!-- no result -->\n <ion-item *ngIf=\"$items | async | isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{ 'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate }}</ion-text>\n </ion-item>\n\n <!-- Fetching more -->\n <ng-container *ngIf=\"fetchingMore; else infiniteLoop\" lines=\"none\" disabled>\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <!-- Infinite loop -->\n <ng-template #infiniteLoop>\n <ng-container *ngIf=\"canFetchMore\" lines=\"none\" disabled [ngTemplateOutlet]=\"loadingItem\"></ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n @if (showFooter) {\n <ion-row class=\"ion-list-footer column\">\n <ion-col size=\"auto\" class=\"footer-action\">\n <ion-text *ngFor=\"let action of footerActions\">\n <a (click)=\"executeAction($event, action, undefined)\" [title]=\"action.title || action.name | translate\">\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n <ion-col>\n <ion-text *ngIf=\"$itemCount | async; let count\" class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </ion-list>\n</ion-content>\n\n\n<!-- loading -->\n<ng-template #loadingItem>\n <ion-item lines=\"none\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n</ng-template>\n", styles: [":host(.popover-viewport) ion-content{overflow-y:auto;-webkit-user-select:none;user-select:none;max-height:var(--max-height)}ion-list ion-item.tappable{cursor:pointer}ion-list ion-item.tappable:hover{--ion-item-background: var(--ion-item-background-color-hover)}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}.footer-action{text-align:start;margin-left:8px}.footer-action a{cursor:pointer;color:var(--ion-color-contrast)}.footer-action a:hover{text-decoration:underline}a.action{font-size:.9em;margin-right:10px;cursor:pointer}a.action:hover span{text-decoration:underline}a.action app-icon{vertical-align:middle}ion-avatar img,ion-avatar .avatar svg{border:1px solid rgba(var(--ion-color-secondary-rgb, .5));border-radius:50%}\n"] }]
228
+ args: [{ selector: 'app-user-event-notification-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n <!-- header -->\n @if (showHeader) {\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n @if (titleI18n) {\n <ion-label>{{ titleI18n | translate }}</ion-label>\n }\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\" *ngIf=\"$items | async | isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a\n (click)=\"markAllAsRead($event)\"\n [title]=\"!showTooltip ? ('SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate) : ''\"\n >\n {{ 'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate }}\n </a>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\" class=\"header-action\">\n <ion-text *ngFor=\"let action of headerActions\">\n <a\n (click)=\"executeAction($event, action, undefined)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n\n @for (item of $items | async; track item.id; let last = $last) {\n <ion-item\n [lines]=\"last ? 'none' : undefined\"\n [class.unread]=\"!item.readDate\"\n [class.tappable]=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\"\n (click)=\"click($event, item)\"\n >\n <ion-avatar slot=\"start\">\n <ion-img *ngIf=\"item.avatar; else avatarIcon\" [src]=\"item.avatar\" />\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"item.avatarIcon; else generateIcon\"\n [ref]=\"item.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n <ng-template #generateIcon>\n <div class=\"avatar\" *ngIf=\"item.avatarJdenticon\">\n <svg width=\"40\" width=\"40\" [data-jdenticon-value]=\"item.avatarJdenticon\"></svg>\n </div>\n </ng-template>\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <ion-text class=\"ion-text-wrap\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <!-- date -->\n <ion-row>\n <ion-col size=\"12\">\n <app-icon\n *ngIf=\"item.icon\"\n [ref]=\"item.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{ item.creationDate | dateFromNow }}</span>\n <span style=\"color: gray\">{{ ' | ' + (item.creationDate | dateFormat: { time: true }) }}</span>\n </small>\n </ion-col>\n </ion-row>\n\n <!-- actions -->\n <ion-row *ngIf=\"item.actions | isNotEmptyArray\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngFor=\"let action of item.actions\">\n <a\n *ngIf=\"!action.default\"\n class=\"action\"\n (click)=\"executeAction($event, action, item)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n <app-icon\n *ngIf=\"action.iconRef\"\n slot=\"start\"\n height=\"20\"\n width=\"20\"\n [ref]=\"action.iconRef\"\n ></app-icon>\n <span>{{ action.name | translate }}</span>\n </a>\n </ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\">\n chevron_right\n </mat-icon>\n </ion-item>\n }\n <!-- loading -->\n <ng-container *ngIf=\"($items | async) === undefined; else notLoading\">\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <ng-template #notLoading>\n <!-- no result -->\n <ion-item *ngIf=\"$items | async | isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{ 'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate }}</ion-text>\n </ion-item>\n\n <!-- Fetching more -->\n <ng-container *ngIf=\"fetchingMore; else infiniteLoop\" lines=\"none\" disabled>\n <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n </ng-container>\n\n <!-- Infinite loop -->\n <ng-template #infiniteLoop>\n <ng-container *ngIf=\"canFetchMore\" lines=\"none\" disabled [ngTemplateOutlet]=\"loadingItem\"></ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n @if (showFooter) {\n <ion-row class=\"ion-list-footer column\">\n <ion-col size=\"auto\" class=\"footer-action\">\n <ion-text *ngFor=\"let action of footerActions\">\n <a\n (click)=\"executeAction($event, action, undefined)\"\n [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n >\n {{ action.name | translate }}\n </a>\n </ion-text>\n </ion-col>\n <ion-col>\n <ion-text *ngIf=\"$itemCount | async; let count\" class=\"ion-float-end ion-padding-end\">\n <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n </ion-text>\n </ion-col>\n </ion-row>\n }\n </ion-list>\n</ion-content>\n\n<!-- loading -->\n<ng-template #loadingItem>\n <ion-item lines=\"none\" [disabled]>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n</ng-template>\n", styles: [":host(.popover-viewport) ion-content{overflow-y:auto;-webkit-user-select:none;user-select:none;max-height:var(--max-height)}ion-list ion-item.tappable{cursor:pointer}ion-list ion-item.tappable:hover{--ion-item-background: var(--ion-item-background-color-hover)}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.header-action{text-align:end;margin-right:8px}.header-action a{cursor:pointer;color:var(--ion-color-contrast)}.header-action a:hover{text-decoration:underline}.footer-action{text-align:start;margin-left:8px}.footer-action a{cursor:pointer;color:var(--ion-color-contrast)}.footer-action a:hover{text-decoration:underline}a.action{font-size:.9em;margin-right:10px;cursor:pointer}a.action:hover span{text-decoration:underline}a.action app-icon{vertical-align:middle}ion-avatar img,ion-avatar .avatar svg{border:1px solid rgba(var(--ion-color-secondary-rgb, .5));border-radius:50%}\n"] }]
226
229
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.PopoverController }, { type: i2.LocalSettingsService, decorators: [{
227
230
  type: Optional
228
231
  }] }, { type: undefined, decorators: [{
@@ -274,4 +277,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
274
277
  type: ViewChildren,
275
278
  args: [IonItem]
276
279
  }] } });
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC91c2VyLWV2ZW50L25vdGlmaWNhdGlvbi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEYsT0FBTyxFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7QUFFbkcsTUFBTSxDQUFDLE1BQU0sNkNBQTZDLEdBQUcsSUFBSSxjQUFjLENBQVMseUJBQXlCLENBQUMsQ0FBQztBQXFCbkgs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QkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFTyxRQUFRO3NCQUFwQixLQUFLO2dCQWtCSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFFZ0IsVUFBVTtzQkFBaEMsU0FBUzt1QkFBQyxVQUFVO2dCQUNFLFFBQVE7c0JBQTlCLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJVXNlckV2ZW50LCBJVXNlckV2ZW50QWN0aW9uLCBJVXNlckV2ZW50RmlsdGVyIH0gZnJvbSAnLi4vdXNlci1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW9uQ29udGVudCwgSW9uSXRlbSwgUG9wb3ZlckNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBBUFBfVVNFUl9FVkVOVF9TRVJWSUNFLCBJVXNlckV2ZW50U2VydmljZSB9IGZyb20gJy4uL3VzZXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBGZXRjaE1vcmVGbiwgTG9hZFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBpc05vdEVtcHR5QXJyYXksIHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IGZyb21TY3JvbGxFbmRFdmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9ldmVudHMnO1xuaW1wb3J0IHsgd2FpdEZvciB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGNvbnN0IEFQUF9VU0VSX0VWRU5UX0xJU1RfSU5GSU5JVEVfU0NST0xMX1RIUkVTSE9MRCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdpbmZpbml0ZVNjcm9sbFRocmVzaG9sZCcpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3RPcHRpb25zPFxuICBFIGV4dGVuZHMgSVVzZXJFdmVudDxhbnk+ID0gSVVzZXJFdmVudDxhbnk+LFxuICBGIGV4dGVuZHMgSVVzZXJFdmVudEZpbHRlcjxhbnk+ID0gSVVzZXJFdmVudEZpbHRlcjxhbnk+LFxuPiB7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgdGl0bGVJMThuPzogc3RyaW5nO1xuICByZWFkRXZlbnQ/OiBFdmVudEVtaXR0ZXI8RT47XG4gIHJlYWRFdmVudHM/OiBFdmVudEVtaXR0ZXI8RVtdPjtcbiAgZmlsdGVyPzogUGFydGlhbDxGPjtcbiAgaGVhZGVyQWN0aW9ucz86IElVc2VyRXZlbnRBY3Rpb25bXTtcbiAgZm9vdGVyQWN0aW9ucz86IElVc2VyRXZlbnRBY3Rpb25bXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXItZXZlbnQtbm90aWZpY2F0aW9uLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0PEUgZXh0ZW5kcyBJVXNlckV2ZW50PGFueT4gPSBJVXNlckV2ZW50PGFueT4sIEYgZXh0ZW5kcyBJVXNlckV2ZW50RmlsdGVyPGFueT4gPSBJVXNlckV2ZW50RmlsdGVyPGFueT4+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3RPcHRpb25zPEUsIEY+XG57XG4gIHByb3RlY3RlZCBmZXRjaGluZ01vcmUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkICRpdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlRm46IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8RT4+O1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgXyRwYWdlU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigyMCk7XG4gIHByb3RlY3RlZCBfcGFuZWxFbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGw7XG5cbiAgQElucHV0KCkgdGl0bGVJMThuOiBzdHJpbmcgPSAnU09DSUFMLlVTRVJfRVZFTlQuTk9USUZJQ0FUSU9OLlRJVExFJztcbiAgQElucHV0KCkgc29ydEJ5ID0gJ2NyZWF0aW9uRGF0ZSc7XG4gIEBJbnB1dCgpIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gIEBJbnB1dCgpIGZpbHRlcjogUGFydGlhbDxGPjtcbiAgQElucHV0KCkgZW5hYmxlSW5maW5pdGVTY3JvbGwgPSB0cnVlO1xuICBASW5wdXQoKSBpbmZpbml0ZVNjcm9sbFRocmVzaG9sZDogc3RyaW5nO1xuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zOiBJVXNlckV2ZW50QWN0aW9uW107XG4gIEBJbnB1dCgpIGZvb3RlckFjdGlvbnM6IElVc2VyRXZlbnRBY3Rpb25bXTtcbiAgQElucHV0KCkgc2hvd0hlYWRlciA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dGb290ZXIgPSB0cnVlO1xuICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRlYnVnID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPiAwICYmIHZhbHVlICE9PSB0aGlzLl8kcGFnZVNpemUudmFsdWUpIHRoaXMuXyRwYWdlU2l6ZS5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gICRpdGVtQ291bnQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4odW5kZWZpbmVkKTtcblxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhZ2VTaXplLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGhhc0l0ZW0kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLiRpdGVtcy5waXBlKG1hcChpc05vdEVtcHR5QXJyYXkpKTtcbiAgfVxuXG4gIGdldCBpdGVtQ291bnQkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuJGl0ZW1Db3VudC5waXBlKG1hcCgodmFsdWUpID0+IHZhbHVlID8/IDApKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSByZWFkRXZlbnQ6IEV2ZW50RW1pdHRlcjxFPjtcbiAgQE91dHB1dCgpIHJlYWRFdmVudHM6IEV2ZW50RW1pdHRlcjxFW10+O1xuICBAT3V0cHV0KCkgZGlzbWlzcyA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgQFZpZXdDaGlsZChJb25Db250ZW50KSBpb25Db250ZW50OiBJb25Db250ZW50O1xuICBAVmlld0NoaWxkcmVuKElvbkl0ZW0pIGlvbkl0ZW1zOiBRdWVyeUxpc3Q8SW9uSXRlbT47XG5cbiAgZ2V0IGNhbkZldGNoTW9yZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVJbmZpbml0ZVNjcm9sbCAmJiAhIXRoaXMuX2ZldGNoTW9yZUZuO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9FVkVOVF9TRVJWSUNFKSBwdWJsaWMgdXNlckV2ZW50U2VydmljZTogSVVzZXJFdmVudFNlcnZpY2U8RSwgSVVzZXJFdmVudEZpbHRlcjxhbnk+PixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9VU0VSX0VWRU5UX0xJU1RfSU5GSU5JVEVfU0NST0xMX1RIUkVTSE9MRCkgcHVibGljIGluZmluaXRlU2Nyb2xsVGhyZXNob2xkRnJvbVRva2VuOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLnNldHRpbmdzPy5tb2JpbGUgfHwgZmFsc2U7XG4gICAgdGhpcy5pbmZpbml0ZVNjcm9sbFRocmVzaG9sZCA9IGluZmluaXRlU2Nyb2xsVGhyZXNob2xkRnJvbVRva2VuO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gV2F0Y2ggYWxsIHVzZXIgZXZlbnRzXG4gICAgaWYgKHRoaXMudXNlckV2ZW50U2VydmljZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgIHRoaXMuXyRwYWdlU2l6ZVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgocGFnZVNpemUpID0+IHRoaXMudXNlckV2ZW50U2VydmljZS53YXRjaEFsbCgwLCBwYWdlU2l6ZSwgdGhpcy5zb3J0QnksIHRoaXMuc29ydERpcmVjdGlvbiwgdGhpcy5maWx0ZXIpKSxcbiAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLWxpc3RdIFJlY2VpdmluZyAke3Jlc3VsdC50b3RhbH0gdXNlciBldmVudHNgLCByZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLiRpdGVtcy5uZXh0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuJGl0ZW1Db3VudC5uZXh0KHJlc3VsdC50b3RhbCA/PyByZXN1bHQuZGF0YT8ubGVuZ3RoID8/IDApO1xuICAgICAgICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXN1bHQuZmV0Y2hNb3JlO1xuICAgICAgICAgICAgdGhpcy5mZXRjaGluZ01vcmUgPSBmYWxzZTsgLy8gQWxsb3cgdG8gcmVmZXRjaCBtb3JlXG4gICAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBMaXN0ZW4gY2hhbmdlc1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZVxuICAgICAgICAgIC5saXN0ZW5BbGxDaGFuZ2VzKHRoaXMuZmlsdGVyKVxuICAgICAgICAgIC5waXBlKGZpbHRlcihpc05vdEVtcHR5QXJyYXkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gUmVjZWl2aW5nICR7ZGF0YS5sZW5ndGh9IG5ldyB1c2VyIGV2ZW50cyAoYnkgV1MpYCwgZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBvbGRJdGVtc0NvdW50ID0gdGhpcy4kaXRlbUNvdW50LnZhbHVlIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXkoWy4uLmRhdGEsIC4uLih0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSldLCAnaWQnKTtcblxuICAgICAgICAgICAgLy8gQ29tcHV0ZSBkZWx0YSBjb3VudFxuICAgICAgICAgICAgLy8gV2hlbiBhbiBleGlzdGluZyBldmVudCBpcyB1cGRhdGUsIHRoZSBkZWx0YSBjb3VudCBzaG91bGQgYmUgPSAwXG4gICAgICAgICAgICBjb25zdCBkZWx0YUNvdW50ID0gaXRlbXMubGVuZ3RoIC0gb2xkSXRlbXNDb3VudDtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIG9ic2VydmFibGVzXG4gICAgICAgICAgICB0aGlzLiRpdGVtcy5uZXh0KGl0ZW1zKTtcbiAgICAgICAgICAgIGlmIChkZWx0YUNvdW50ICE9PSAwKSB0aGlzLiRpdGVtQ291bnQubmV4dChvbGRJdGVtc0NvdW50ICsgZGVsdGFDb3VudCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmVuYWJsZUluZmluaXRlU2Nyb2xsKSB0aGlzLmluaXRJbmZpbml0ZVNjcm9sbCh0aGlzLmluZmluaXRlU2Nyb2xsVGhyZXNob2xkKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy4kaXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLiRpdGVtQ291bnQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrKGV2ZW50OiBFdmVudCwgdXNlckV2ZW50OiBFKSB7XG4gICAgaWYgKCF1c2VyRXZlbnQpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gTWFya0FzUmVhZFxuICAgIHRoaXMubWFya0FzUmVhZChldmVudCwgdXNlckV2ZW50KTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCBhY3Rpb24gKGlmIGFueSlcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gKHVzZXJFdmVudD8uYWN0aW9ucyB8fCBbXSkuZmluZCgoYSkgPT4gYS5kZWZhdWx0KTtcblxuICAgIGlmIChkZWZhdWx0QWN0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBY3Rpb24oZXZlbnQsIGRlZmF1bHRBY3Rpb24sIHVzZXJFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgaXNEZWZhdWx0QWN0aW9uKGFjdGlvbjogSVVzZXJFdmVudEFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoYWN0aW9uICYmIGFjdGlvbi5kZWZhdWx0KSB8fCBmYWxzZTtcbiAgfVxuXG4gIG1hcmtBc1JlYWQoZXZlbnQ6IEV2ZW50LCB1c2VyRXZlbnQ6IEUpIHtcbiAgICBpZiAodXNlckV2ZW50Py5yZWFkRGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50Py5lbWl0KHVzZXJFdmVudCk7XG4gIH1cblxuICBtYXJrQWxsQXNSZWFkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHVucmVhZFVzZXJFdmVudHMgPSAodGhpcy4kaXRlbXMudmFsdWUgfHwgW10pLmZpbHRlcigodmFsdWUpID0+ICF2YWx1ZS5yZWFkRGF0ZSk7XG4gICAgaWYgKCF1bnJlYWRVc2VyRXZlbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50cz8uZW1pdCh1bnJlYWRVc2VyRXZlbnRzKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246IElVc2VyRXZlbnRBY3Rpb24sIHVzZXJFdmVudDogSVVzZXJFdmVudDxhbnk+KSB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47IC8vIFNraXAgaWYgcHJldmVudGVkXG5cbiAgICAvLyBEaXNhYmxlIGRlZmF1bHQgYWN0aW9uICguZS5nIGF2b2lkIHRvIGNhbGwgY2xpY2soKSBmdW5jdGlvbilcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBFeGVjdXRlIHRoZW4gY2xvc2UgcG9wb3ZlclxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhY3Rpb24uZXhlY3V0ZUFjdGlvbih1c2VyRXZlbnQpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIGF3YWl0IHJlcztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5kaXNtaXNzLm9ic2VydmVkKSB7XG4gICAgICB0aGlzLmRpc21pc3MuZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmRpc21pc3MoKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBjb3VudGVyIChuZWVkIGlmIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkIHdoaWxlIHBvcG92ZXIgaWYgb3BlbilcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2U/LnJlc2V0Q291bnQoKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShldmVudD86IEN1c3RvbUV2ZW50ICYgeyB0YXJnZXQ/OiBFdmVudFRhcmdldCAmIHsgY29tcGxldGU/OiAoKSA9PiB2b2lkIH0gfSkge1xuICAgIGlmICghdGhpcy5fZmV0Y2hNb3JlRm4gfHwgdGhpcy5mZXRjaGluZ01vcmUpIHJldHVybjtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1t1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0XSBGZXRjaGluZyBtb3JlIG5vdGlmaWNhdGlvbnMuLi4nLCBldmVudCk7XG4gICAgdGhpcy5mZXRjaGluZ01vcmUgPSB0cnVlO1xuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fZmV0Y2hNb3JlRm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcbiAgICAgIGxldCBkYXRhID0gWy4uLih0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSksIC4uLnJlc3VsdC5kYXRhXTtcblxuICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0aW9uIChlLmcuIHdoZW4gbmV3IHVzZXIgZXZlbnQgd2FzIGFkZGVkIGJ5IHN1YnNjcmlwdGlvbilcbiAgICAgIGRhdGEgPSByZW1vdmVEdXBsaWNhdGVzRnJvbUFycmF5KGRhdGEsICdpZCcpO1xuXG4gICAgICAvLyBmZXRjaCBtb3JlIGNoYW5nZXMgKGUuZy4gaWYgd2F0Y2hBbGwgb2JzZXJ2YWJsZSBhcyBiZWVuIHJlZnJlc2hlZClcbiAgICAgIGlmIChmZXRjaE1vcmVGbiAhPT0gdGhpcy5fZmV0Y2hNb3JlRm4pIHJldHVybjsgLy8gU2tpcFxuXG4gICAgICB0aGlzLiRpdGVtcy5uZXh0KGRhdGEpO1xuICAgICAgdGhpcy4kaXRlbUNvdW50Lm5leHQocmVzdWx0LnRvdGFsID8/IHJlc3VsdC5kYXRhPy5sZW5ndGggPz8gMCk7XG4gICAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHJlc3VsdC5mZXRjaE1vcmU7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGFnZSBzaXplLCB0byBrZWVwIHNhbWUgc2Nyb2xsIGhlaWdodCwgYWZ0ZXIgdGhlIG5leHQgcmVmcmVzaFxuICAgICAgLy90aGlzLnBhZ2VTaXplID0gTWF0aC5tYXgodGhpcy5wYWdlU2l6ZSwgZGF0YS5sZW5ndGgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSB1bmRlZmluZWQ7IC8vIEZvcmdldCB0aGUgZnVuY3Rpb25cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuZmV0Y2hpbmdNb3JlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gSW5pdCBpbmZpbml0ZSBsb29wJyk7XG4gICAgaWYgKHRoaXMuX2ZldGNoTW9yZVN1YnNjcmlwdGlvbikgdGhpcy5fZmV0Y2hNb3JlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgKHRoaXMubW9iaWxlID8gJzE1JScgOiAnMiUnKTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+ICEhdGhpcy5pb25Db250ZW50LCB7IGR1ZVRpbWU6IDI1MCwgdGltZW91dDogMTAwMCB9KTtcbiAgICBjb25zdCBwYW5lbCA9IGF3YWl0IHRoaXMuZ2V0UGFuZWxFbGVtZW50KCk7XG5cbiAgICAvLyBUcmlnZ2VyIGZldGNoIG1vcmUsIGVuZCBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9mZXRjaE1vcmVTdWJzY3JpcHRpb24gPSB0aGlzLiRpdGVtc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jYW5GZXRjaE1vcmUpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gZnJvbVNjcm9sbEVuZEV2ZW50KHBhbmVsLCB0aHJlc2hvbGQsIDI1MCAvKmZvcmNlIHRvIGNoZWNrIHdoZW4gbm8gc2Nyb2xsYmFyIC0gZS5nLiBpbiBsYXJnZSBzY3JlZW4qLykpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZmV0Y2hNb3JlKCkpO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5fZmV0Y2hNb3JlU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRQYW5lbEVsZW1lbnQoKTogUHJvbWlzZTxIVE1MRWxlbWVudD4ge1xuICAgIGlmICghdGhpcy5fcGFuZWxFbGVtZW50KSB7XG4gICAgICB0aGlzLl9wYW5lbEVsZW1lbnQgPSBhd2FpdCB0aGlzLmlvbkNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFuZWxFbGVtZW50O1xuICB9XG59XG4iLCI8aW9uLWNvbnRlbnQ+XG4gIDxpb24tbGlzdCBjbGFzcz1cImlvbi1saXN0LXBvcG92ZXJcIj5cblxuICAgIDwhLS0gaGVhZGVyIC0tPlxuICAgIEBpZiAoc2hvd0hlYWRlcikge1xuICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbGlzdC1oZWFkZXIgY29sdW1uXCI+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIEBpZiAodGl0bGVJMThuKSB7XG4gICAgICAgICAgICA8aW9uLWxhYmVsPnt7IHRpdGxlSTE4biB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiaGVhZGVyLWFjdGlvblwiICpuZ0lmPVwiJGl0ZW1zIHwgYXN5bmMgfCBpc05vdEVtcHR5QXJyYXlcIj5cbiAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICA8YSAoY2xpY2spPVwibWFya0FsbEFzUmVhZCgkZXZlbnQpXCI+e3sgJ1NPQ0lBTC5VU0VSX0VWRU5ULk5PVElGSUNBVElPTi5SRUFEX0FMTCcgfCB0cmFuc2xhdGUgfX08L2E+XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiaGVhZGVyLWFjdGlvblwiPlxuICAgICAgICAgIDxpb24tdGV4dCAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGhlYWRlckFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxhIChjbGljayk9XCJleGVjdXRlQWN0aW9uKCRldmVudCwgYWN0aW9uLCB1bmRlZmluZWQpXCIgW3RpdGxlXT1cImFjdGlvbi50aXRsZSB8fCBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG5cbiAgICBAZm9yIChpdGVtIG9mICRpdGVtcyB8IGFzeW5jOyB0cmFjayBpdGVtLmlkOyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICA8aW9uLWl0ZW1cbiAgICAgICAgW2xpbmVzXT1cImxhc3QgPyAnbm9uZScgOiB1bmRlZmluZWRcIlxuICAgICAgICBbY2xhc3MudW5yZWFkXT1cIiFpdGVtLnJlYWREYXRlXCJcbiAgICAgICAgW2NsYXNzLnRhcHBhYmxlXT1cIml0ZW0uYWN0aW9ucyB8IGFycmF5RmlsdGVyOiBpc0RlZmF1bHRBY3Rpb24gfCBpc05vdEVtcHR5QXJyYXlcIlxuICAgICAgICAoY2xpY2spPVwiY2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICA+XG4gICAgICAgIDxpb24tYXZhdGFyIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24taW1nICpuZ0lmPVwiaXRlbS5hdmF0YXI7IGVsc2UgYXZhdGFySWNvblwiIFtzcmNdPVwiaXRlbS5hdmF0YXJcIiAvPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhdmF0YXJJY29uPlxuICAgICAgICAgICAgPGFwcC1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5hdmF0YXJJY29uOyBlbHNlIGdlbmVyYXRlSWNvblwiXG4gICAgICAgICAgICAgIFtyZWZdPVwiaXRlbS5hdmF0YXJJY29uXCJcbiAgICAgICAgICAgICAgaGVpZ2h0PVwiNDBcIlxuICAgICAgICAgICAgICB3aWR0aD1cIjQwXCJcbiAgICAgICAgICAgID48L2FwcC1pY29uPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2dlbmVyYXRlSWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXJcIiAqbmdJZj1cIml0ZW0uYXZhdGFySmRlbnRpY29uXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIHdpZHRoPVwiNDBcIiBbZGF0YS1qZGVudGljb24tdmFsdWVdPVwiaXRlbS5hdmF0YXJKZGVudGljb25cIj48L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvaW9uLWF2YXRhcj5cblxuICAgICAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tbWFyZ2luIGlvbi1uby1wYWRkaW5nIG1lc3NhZ2VcIj5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiPlxuICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPHAgW2NsYXNzLnVucmVhZF09XCIhaXRlbS5yZWFkRGF0ZVwiIFtpbm5lckhUTUxdPVwiaXRlbS5tZXNzYWdlXCI+PC9wPlxuICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICAgIDwhLS0gZGF0ZSAtLT5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiPlxuICAgICAgICAgICAgICA8YXBwLWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgW3JlZl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBzdWI7IG1hcmdpbi1yaWdodDogM3B4XCJcbiAgICAgICAgICAgICAgPjwvYXBwLWljb24+XG4gICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmNyZWF0aW9uRGF0ZSB8IGRhdGVGcm9tTm93IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IGdyYXlcIj57eyAnIHwgJyArIChpdGVtLmNyZWF0aW9uRGF0ZSB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgICA8IS0tIGFjdGlvbnMgLS0+XG4gICAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJpdGVtLmFjdGlvbnMgfCBpc05vdEVtcHR5QXJyYXlcIj5cbiAgICAgICAgICAgIDxpb24tY29sPjwvaW9uLWNvbD5cbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBpdGVtLmFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYWN0aW9uLmRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4ZWN1dGVBY3Rpb24oJGV2ZW50LCBhY3Rpb24sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJhY3Rpb24udGl0bGUgfHwgYWN0aW9uLm5hbWUgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxhcHAtaWNvbiAqbmdJZj1cImFjdGlvbi5pY29uUmVmXCIgc2xvdD1cInN0YXJ0XCIgaGVpZ2h0PVwiMjBcIiB3aWR0aD1cIjIwXCIgW3JlZl09XCJhY3Rpb24uaWNvblJlZlwiPjwvYXBwLWljb24+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgPC9pb24tZ3JpZD5cblxuICAgICAgICA8bWF0LWljb24gc2xvdD1cImVuZFwiICpuZ0lmPVwiaXRlbS5hY3Rpb25zIHwgYXJyYXlGaWx0ZXI6IGlzRGVmYXVsdEFjdGlvbiB8IGlzTm90RW1wdHlBcnJheVwiPlxuICAgICAgICAgIGNoZXZyb25fcmlnaHRcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgfVxuICAgIDwhLS0gbG9hZGluZyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCRpdGVtcyB8IGFzeW5jKSA9PT0gdW5kZWZpbmVkOyBlbHNlIG5vdExvYWRpbmdcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nSXRlbVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub3RMb2FkaW5nPlxuICAgICAgPCEtLSBubyByZXN1bHQgLS0+XG4gICAgICA8aW9uLWl0ZW0gKm5nSWY9XCIkaXRlbXMgfCBhc3luYyB8IGlzRW1wdHlBcnJheVwiIGxpbmVzPVwibm9uZVwiPlxuICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJkYXJrXCIgY2xhc3M9XCJ0ZXh0LWl0YWxpY1wiPnt7ICdTT0NJQUwuVVNFUl9FVkVOVC5OT1RJRklDQVRJT04uRU1QVFknIHwgdHJhbnNsYXRlIH19PC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG5cbiAgICAgIDwhLS0gRmV0Y2hpbmcgbW9yZSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmZXRjaGluZ01vcmU7IGVsc2UgaW5maW5pdGVMb29wXCIgbGluZXM9XCJub25lXCIgZGlzYWJsZWQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nSXRlbVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gSW5maW5pdGUgbG9vcCAtLT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjaW5maW5pdGVMb29wPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuRmV0Y2hNb3JlXCIgbGluZXM9XCJub25lXCIgZGlzYWJsZWQgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ0l0ZW1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gZm9vdGVyIC0tPlxuICAgIEBpZiAoc2hvd0Zvb3Rlcikge1xuICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbGlzdC1mb290ZXIgY29sdW1uXCI+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJmb290ZXItYWN0aW9uXCI+XG4gICAgICAgICAgPGlvbi10ZXh0ICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgZm9vdGVyQWN0aW9uc1wiPlxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cImV4ZWN1dGVBY3Rpb24oJGV2ZW50LCBhY3Rpb24sIHVuZGVmaW5lZClcIiBbdGl0bGVdPVwiYWN0aW9uLnRpdGxlIHx8IGFjdGlvbi5uYW1lIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgIHt7IGFjdGlvbi5uYW1lIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8aW9uLXRleHQgKm5nSWY9XCIkaXRlbUNvdW50IHwgYXN5bmM7IGxldCBjb3VudFwiIGNsYXNzPVwiaW9uLWZsb2F0LWVuZCBpb24tcGFkZGluZy1lbmRcIj5cbiAgICAgICAgICAgIDxpPnt7ICdDT01NT04uUkVTVUxUX0NPVU5UJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogY291bnQgfSB9fTwvaT5cbiAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfVxuICA8L2lvbi1saXN0PlxuPC9pb24tY29udGVudD5cblxuXG48IS0tIGxvYWRpbmcgLS0+XG48bmctdGVtcGxhdGUgI2xvYWRpbmdJdGVtPlxuICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCIgZGlzYWJsZWQ+XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gIDwvaW9uLWl0ZW0+XG48L25nLXRlbXBsYXRlPlxuIl19
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC91c2VyLWV2ZW50L25vdGlmaWNhdGlvbi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQXFCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHNCQUFzQixFQUFxQixNQUFNLHVCQUF1QixDQUFDO0FBR2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFFekQsTUFBTSxDQUFDLE1B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Qzt5Q0FqRDFELFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBa0JJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUVnQixVQUFVO3NCQUFoQyxTQUFTO3VCQUFDLFVBQVU7Z0JBQ0UsUUFBUTtzQkFBOUIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVVzZXJFdmVudCwgSVVzZXJFdmVudEFjdGlvbiwgSVVzZXJFdmVudEZpbHRlciB9IGZyb20gJy4uL3VzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElvbkNvbnRlbnQsIElvbkl0ZW0sIFBvcG92ZXJDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQVBQX1VTRVJfRVZFTlRfU0VSVklDRSwgSVVzZXJFdmVudFNlcnZpY2UgfSBmcm9tICcuLi91c2VyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmV0Y2hNb3JlRm4sIExvYWRSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgaXNOb3RFbXB0eUFycmF5LCByZW1vdmVEdXBsaWNhdGVzRnJvbUFycmF5IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBmcm9tU2Nyb2xsRW5kRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZXZlbnRzJztcbmltcG9ydCB7IHdhaXRGb3IgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNIT1dfVE9PTFRJUCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgQVBQX1VTRVJfRVZFTlRfTElTVF9JTkZJTklURV9TQ1JPTExfVEhSRVNIT0xEID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ2luZmluaXRlU2Nyb2xsVGhyZXNob2xkJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdE9wdGlvbnM8XG4gIEUgZXh0ZW5kcyBJVXNlckV2ZW50PGFueT4gPSBJVXNlckV2ZW50PGFueT4sXG4gIEYgZXh0ZW5kcyBJVXNlckV2ZW50RmlsdGVyPGFueT4gPSBJVXNlckV2ZW50RmlsdGVyPGFueT4sXG4+IHtcbiAgZGVidWc/OiBib29sZWFuO1xuICB0aXRsZUkxOG4/OiBzdHJpbmc7XG4gIHJlYWRFdmVudD86IEV2ZW50RW1pdHRlcjxFPjtcbiAgcmVhZEV2ZW50cz86IEV2ZW50RW1pdHRlcjxFW10+O1xuICBmaWx0ZXI/OiBQYXJ0aWFsPEY+O1xuICBoZWFkZXJBY3Rpb25zPzogSVVzZXJFdmVudEFjdGlvbltdO1xuICBmb290ZXJBY3Rpb25zPzogSVVzZXJFdmVudEFjdGlvbltdO1xuICBzaG93VG9vbHRpcD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3Quc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdDxFIGV4dGVuZHMgSVVzZXJFdmVudDxhbnk+ID0gSVVzZXJFdmVudDxhbnk+LCBGIGV4dGVuZHMgSVVzZXJFdmVudEZpbHRlcjxhbnk+ID0gSVVzZXJFdmVudEZpbHRlcjxhbnk+PlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9uczxFLCBGPlxue1xuICBwcm90ZWN0ZWQgZmV0Y2hpbmdNb3JlID0gZmFsc2U7XG4gIHByb3RlY3RlZCAkaXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVbXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZUZuOiBGZXRjaE1vcmVGbjxMb2FkUmVzdWx0PEU+PjtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIF8kcGFnZVNpemUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMjApO1xuICBwcm90ZWN0ZWQgX3BhbmVsRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHRpdGxlSTE4bjogc3RyaW5nID0gJ1NPQ0lBTC5VU0VSX0VWRU5ULk5PVElGSUNBVElPTi5USVRMRSc7XG4gIEBJbnB1dCgpIHNvcnRCeSA9ICdjcmVhdGlvbkRhdGUnO1xuICBASW5wdXQoKSBzb3J0RGlyZWN0aW9uOiBTb3J0RGlyZWN0aW9uID0gJ2Rlc2MnO1xuICBASW5wdXQoKSBmaWx0ZXI6IFBhcnRpYWw8Rj47XG4gIEBJbnB1dCgpIGVuYWJsZUluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgQElucHV0KCkgaW5maW5pdGVTY3JvbGxUaHJlc2hvbGQ6IHN0cmluZztcbiAgQElucHV0KCkgaGVhZGVyQWN0aW9uczogSVVzZXJFdmVudEFjdGlvbltdO1xuICBASW5wdXQoKSBmb290ZXJBY3Rpb25zOiBJVXNlckV2ZW50QWN0aW9uW107XG4gIEBJbnB1dCgpIHNob3dIZWFkZXIgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Rm9vdGVyID0gdHJ1ZTtcbiAgQElucHV0KCkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoKSBkZWJ1ZyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSAhPT0gdGhpcy5fJHBhZ2VTaXplLnZhbHVlKSB0aGlzLl8kcGFnZVNpemUubmV4dCh2YWx1ZSk7XG4gIH1cblxuICAkaXRlbUNvdW50ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KHVuZGVmaW5lZCk7XG5cbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYWdlU2l6ZS52YWx1ZTtcbiAgfVxuXG4gIGdldCBoYXNJdGVtJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy4kaXRlbXMucGlwZShtYXAoaXNOb3RFbXB0eUFycmF5KSk7XG4gIH1cblxuICBnZXQgaXRlbUNvdW50JCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLiRpdGVtQ291bnQucGlwZShtYXAoKHZhbHVlKSA9PiB2YWx1ZSA/PyAwKSk7XG4gIH1cblxuICBAT3V0cHV0KCkgcmVhZEV2ZW50OiBFdmVudEVtaXR0ZXI8RT47XG4gIEBPdXRwdXQoKSByZWFkRXZlbnRzOiBFdmVudEVtaXR0ZXI8RVtdPjtcbiAgQE91dHB1dCgpIGRpc21pc3MgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIEBWaWV3Q2hpbGQoSW9uQ29udGVudCkgaW9uQ29udGVudDogSW9uQ29udGVudDtcbiAgQFZpZXdDaGlsZHJlbihJb25JdGVtKSBpb25JdGVtczogUXVlcnlMaXN0PElvbkl0ZW0+O1xuXG4gIGdldCBjYW5GZXRjaE1vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwgJiYgISF0aGlzLl9mZXRjaE1vcmVGbjtcbiAgfVxuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KFNIT1dfVE9PTFRJUCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9FVkVOVF9TRVJWSUNFKSBwdWJsaWMgdXNlckV2ZW50U2VydmljZTogSVVzZXJFdmVudFNlcnZpY2U8RSwgSVVzZXJFdmVudEZpbHRlcjxhbnk+PixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9VU0VSX0VWRU5UX0xJU1RfSU5GSU5JVEVfU0NST0xMX1RIUkVTSE9MRCkgcHVibGljIGluZmluaXRlU2Nyb2xsVGhyZXNob2xkRnJvbVRva2VuOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLnNldHRpbmdzPy5tb2JpbGUgfHwgZmFsc2U7XG4gICAgdGhpcy5pbmZpbml0ZVNjcm9sbFRocmVzaG9sZCA9IGluZmluaXRlU2Nyb2xsVGhyZXNob2xkRnJvbVRva2VuO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gV2F0Y2ggYWxsIHVzZXIgZXZlbnRzXG4gICAgaWYgKHRoaXMudXNlckV2ZW50U2VydmljZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgIHRoaXMuXyRwYWdlU2l6ZVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgocGFnZVNpemUpID0+IHRoaXMudXNlckV2ZW50U2VydmljZS53YXRjaEFsbCgwLCBwYWdlU2l6ZSwgdGhpcy5zb3J0QnksIHRoaXMuc29ydERpcmVjdGlvbiwgdGhpcy5maWx0ZXIpKSxcbiAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLWxpc3RdIFJlY2VpdmluZyAke3Jlc3VsdC50b3RhbH0gdXNlciBldmVudHNgLCByZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLiRpdGVtcy5uZXh0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuJGl0ZW1Db3VudC5uZXh0KHJlc3VsdC50b3RhbCA/PyByZXN1bHQuZGF0YT8ubGVuZ3RoID8/IDApO1xuICAgICAgICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXN1bHQuZmV0Y2hNb3JlO1xuICAgICAgICAgICAgdGhpcy5mZXRjaGluZ01vcmUgPSBmYWxzZTsgLy8gQWxsb3cgdG8gcmVmZXRjaCBtb3JlXG4gICAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBMaXN0ZW4gY2hhbmdlc1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZVxuICAgICAgICAgIC5saXN0ZW5BbGxDaGFuZ2VzKHRoaXMuZmlsdGVyKVxuICAgICAgICAgIC5waXBlKGZpbHRlcihpc05vdEVtcHR5QXJyYXkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gUmVjZWl2aW5nICR7ZGF0YS5sZW5ndGh9IG5ldyB1c2VyIGV2ZW50cyAoYnkgV1MpYCwgZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBvbGRJdGVtc0NvdW50ID0gdGhpcy4kaXRlbUNvdW50LnZhbHVlIHx8IDA7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXkoWy4uLmRhdGEsIC4uLih0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSldLCAnaWQnKTtcblxuICAgICAgICAgICAgLy8gQ29tcHV0ZSBkZWx0YSBjb3VudFxuICAgICAgICAgICAgLy8gV2hlbiBhbiBleGlzdGluZyBldmVudCBpcyB1cGRhdGUsIHRoZSBkZWx0YSBjb3VudCBzaG91bGQgYmUgPSAwXG4gICAgICAgICAgICBjb25zdCBkZWx0YUNvdW50ID0gaXRlbXMubGVuZ3RoIC0gb2xkSXRlbXNDb3VudDtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIG9ic2VydmFibGVzXG4gICAgICAgICAgICB0aGlzLiRpdGVtcy5uZXh0KGl0ZW1zKTtcbiAgICAgICAgICAgIGlmIChkZWx0YUNvdW50ICE9PSAwKSB0aGlzLiRpdGVtQ291bnQubmV4dChvbGRJdGVtc0NvdW50ICsgZGVsdGFDb3VudCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmVuYWJsZUluZmluaXRlU2Nyb2xsKSB0aGlzLmluaXRJbmZpbml0ZVNjcm9sbCh0aGlzLmluZmluaXRlU2Nyb2xsVGhyZXNob2xkKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy4kaXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLiRpdGVtQ291bnQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrKGV2ZW50OiBFdmVudCwgdXNlckV2ZW50OiBFKSB7XG4gICAgaWYgKCF1c2VyRXZlbnQpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gTWFya0FzUmVhZFxuICAgIHRoaXMubWFya0FzUmVhZChldmVudCwgdXNlckV2ZW50KTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCBhY3Rpb24gKGlmIGFueSlcbiAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gKHVzZXJFdmVudD8uYWN0aW9ucyB8fCBbXSkuZmluZCgoYSkgPT4gYS5kZWZhdWx0KTtcblxuICAgIGlmIChkZWZhdWx0QWN0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBY3Rpb24oZXZlbnQsIGRlZmF1bHRBY3Rpb24sIHVzZXJFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgaXNEZWZhdWx0QWN0aW9uKGFjdGlvbjogSVVzZXJFdmVudEFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoYWN0aW9uICYmIGFjdGlvbi5kZWZhdWx0KSB8fCBmYWxzZTtcbiAgfVxuXG4gIG1hcmtBc1JlYWQoZXZlbnQ6IEV2ZW50LCB1c2VyRXZlbnQ6IEUpIHtcbiAgICBpZiAodXNlckV2ZW50Py5yZWFkRGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50Py5lbWl0KHVzZXJFdmVudCk7XG4gIH1cblxuICBtYXJrQWxsQXNSZWFkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHVucmVhZFVzZXJFdmVudHMgPSAodGhpcy4kaXRlbXMudmFsdWUgfHwgW10pLmZpbHRlcigodmFsdWUpID0+ICF2YWx1ZS5yZWFkRGF0ZSk7XG4gICAgaWYgKCF1bnJlYWRVc2VyRXZlbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50cz8uZW1pdCh1bnJlYWRVc2VyRXZlbnRzKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246IElVc2VyRXZlbnRBY3Rpb24sIHVzZXJFdmVudDogSVVzZXJFdmVudDxhbnk+KSB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47IC8vIFNraXAgaWYgcHJldmVudGVkXG5cbiAgICAvLyBEaXNhYmxlIGRlZmF1bHQgYWN0aW9uICguZS5nIGF2b2lkIHRvIGNhbGwgY2xpY2soKSBmdW5jdGlvbilcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBFeGVjdXRlIHRoZW4gY2xvc2UgcG9wb3ZlclxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhY3Rpb24uZXhlY3V0ZUFjdGlvbih1c2VyRXZlbnQpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIGF3YWl0IHJlcztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5kaXNtaXNzLm9ic2VydmVkKSB7XG4gICAgICB0aGlzLmRpc21pc3MuZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmRpc21pc3MoKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBjb3VudGVyIChuZWVkIGlmIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkIHdoaWxlIHBvcG92ZXIgaWYgb3BlbilcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2U/LnJlc2V0Q291bnQoKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShldmVudD86IEN1c3RvbUV2ZW50ICYgeyB0YXJnZXQ/OiBFdmVudFRhcmdldCAmIHsgY29tcGxldGU/OiAoKSA9PiB2b2lkIH0gfSkge1xuICAgIGlmICghdGhpcy5fZmV0Y2hNb3JlRm4gfHwgdGhpcy5mZXRjaGluZ01vcmUpIHJldHVybjtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1t1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0XSBGZXRjaGluZyBtb3JlIG5vdGlmaWNhdGlvbnMuLi4nLCBldmVudCk7XG4gICAgdGhpcy5mZXRjaGluZ01vcmUgPSB0cnVlO1xuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fZmV0Y2hNb3JlRm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcbiAgICAgIGxldCBkYXRhID0gWy4uLih0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSksIC4uLnJlc3VsdC5kYXRhXTtcblxuICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0aW9uIChlLmcuIHdoZW4gbmV3IHVzZXIgZXZlbnQgd2FzIGFkZGVkIGJ5IHN1YnNjcmlwdGlvbilcbiAgICAgIGRhdGEgPSByZW1vdmVEdXBsaWNhdGVzRnJvbUFycmF5KGRhdGEsICdpZCcpO1xuXG4gICAgICAvLyBmZXRjaCBtb3JlIGNoYW5nZXMgKGUuZy4gaWYgd2F0Y2hBbGwgb2JzZXJ2YWJsZSBhcyBiZWVuIHJlZnJlc2hlZClcbiAgICAgIGlmIChmZXRjaE1vcmVGbiAhPT0gdGhpcy5fZmV0Y2hNb3JlRm4pIHJldHVybjsgLy8gU2tpcFxuXG4gICAgICB0aGlzLiRpdGVtcy5uZXh0KGRhdGEpO1xuICAgICAgdGhpcy4kaXRlbUNvdW50Lm5leHQocmVzdWx0LnRvdGFsID8/IHJlc3VsdC5kYXRhPy5sZW5ndGggPz8gMCk7XG4gICAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHJlc3VsdC5mZXRjaE1vcmU7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGFnZSBzaXplLCB0byBrZWVwIHNhbWUgc2Nyb2xsIGhlaWdodCwgYWZ0ZXIgdGhlIG5leHQgcmVmcmVzaFxuICAgICAgLy90aGlzLnBhZ2VTaXplID0gTWF0aC5tYXgodGhpcy5wYWdlU2l6ZSwgZGF0YS5sZW5ndGgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSB1bmRlZmluZWQ7IC8vIEZvcmdldCB0aGUgZnVuY3Rpb25cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuZmV0Y2hpbmdNb3JlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGluaXRJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gSW5pdCBpbmZpbml0ZSBsb29wJyk7XG4gICAgaWYgKHRoaXMuX2ZldGNoTW9yZVN1YnNjcmlwdGlvbikgdGhpcy5fZmV0Y2hNb3JlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgKHRoaXMubW9iaWxlID8gJzE1JScgOiAnMiUnKTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+ICEhdGhpcy5pb25Db250ZW50LCB7IGR1ZVRpbWU6IDI1MCwgdGltZW91dDogMTAwMCB9KTtcbiAgICBjb25zdCBwYW5lbCA9IGF3YWl0IHRoaXMuZ2V0UGFuZWxFbGVtZW50KCk7XG5cbiAgICAvLyBUcmlnZ2VyIGZldGNoIG1vcmUsIGVuZCBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9mZXRjaE1vcmVTdWJzY3JpcHRpb24gPSB0aGlzLiRpdGVtc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jYW5GZXRjaE1vcmUpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gZnJvbVNjcm9sbEVuZEV2ZW50KHBhbmVsLCB0aHJlc2hvbGQsIDI1MCAvKmZvcmNlIHRvIGNoZWNrIHdoZW4gbm8gc2Nyb2xsYmFyIC0gZS5nLiBpbiBsYXJnZSBzY3JlZW4qLykpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZmV0Y2hNb3JlKCkpO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5fZmV0Y2hNb3JlU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRQYW5lbEVsZW1lbnQoKTogUHJvbWlzZTxIVE1MRWxlbWVudD4ge1xuICAgIGlmICghdGhpcy5fcGFuZWxFbGVtZW50KSB7XG4gICAgICB0aGlzLl9wYW5lbEVsZW1lbnQgPSBhd2FpdCB0aGlzLmlvbkNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFuZWxFbGVtZW50O1xuICB9XG59XG4iLCI8aW9uLWNvbnRlbnQ+XG4gIDxpb24tbGlzdCBjbGFzcz1cImlvbi1saXN0LXBvcG92ZXJcIj5cbiAgICA8IS0tIGhlYWRlciAtLT5cbiAgICBAaWYgKHNob3dIZWFkZXIpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWxpc3QtaGVhZGVyIGNvbHVtblwiPlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICBAaWYgKHRpdGxlSTE4bikge1xuICAgICAgICAgICAgPGlvbi1sYWJlbD57eyB0aXRsZUkxOG4gfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIiBjbGFzcz1cImhlYWRlci1hY3Rpb25cIiAqbmdJZj1cIiRpdGVtcyB8IGFzeW5jIHwgaXNOb3RFbXB0eUFycmF5XCI+XG4gICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm1hcmtBbGxBc1JlYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ1NPQ0lBTC5VU0VSX0VWRU5ULk5PVElGSUNBVElPTi5SRUFEX0FMTCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnU09DSUFMLlVTRVJfRVZFTlQuTk9USUZJQ0FUSU9OLlJFQURfQUxMJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdTT0NJQUwuVVNFUl9FVkVOVC5OT1RJRklDQVRJT04uUkVBRF9BTEwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiaGVhZGVyLWFjdGlvblwiPlxuICAgICAgICAgIDxpb24tdGV4dCAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGhlYWRlckFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIChjbGljayk9XCJleGVjdXRlQWN0aW9uKCRldmVudCwgYWN0aW9uLCB1bmRlZmluZWQpXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IChhY3Rpb24udGl0bGUgfHwgYWN0aW9uLm5hbWUgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChhY3Rpb24udGl0bGUgfHwgYWN0aW9uLm5hbWUgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG5cbiAgICBAZm9yIChpdGVtIG9mICRpdGVtcyB8IGFzeW5jOyB0cmFjayBpdGVtLmlkOyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICA8aW9uLWl0ZW1cbiAgICAgICAgW2xpbmVzXT1cImxhc3QgPyAnbm9uZScgOiB1bmRlZmluZWRcIlxuICAgICAgICBbY2xhc3MudW5yZWFkXT1cIiFpdGVtLnJlYWREYXRlXCJcbiAgICAgICAgW2NsYXNzLnRhcHBhYmxlXT1cIml0ZW0uYWN0aW9ucyB8IGFycmF5RmlsdGVyOiBpc0RlZmF1bHRBY3Rpb24gfCBpc05vdEVtcHR5QXJyYXlcIlxuICAgICAgICAoY2xpY2spPVwiY2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICA+XG4gICAgICAgIDxpb24tYXZhdGFyIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24taW1nICpuZ0lmPVwiaXRlbS5hdmF0YXI7IGVsc2UgYXZhdGFySWNvblwiIFtzcmNdPVwiaXRlbS5hdmF0YXJcIiAvPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhdmF0YXJJY29uPlxuICAgICAgICAgICAgPGFwcC1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5hdmF0YXJJY29uOyBlbHNlIGdlbmVyYXRlSWNvblwiXG4gICAgICAgICAgICAgIFtyZWZdPVwiaXRlbS5hdmF0YXJJY29uXCJcbiAgICAgICAgICAgICAgaGVpZ2h0PVwiNDBcIlxuICAgICAgICAgICAgICB3aWR0aD1cIjQwXCJcbiAgICAgICAgICAgID48L2FwcC1pY29uPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2dlbmVyYXRlSWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXJcIiAqbmdJZj1cIml0ZW0uYXZhdGFySmRlbnRpY29uXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIHdpZHRoPVwiNDBcIiBbZGF0YS1qZGVudGljb24tdmFsdWVdPVwiaXRlbS5hdmF0YXJKZGVudGljb25cIj48L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvaW9uLWF2YXRhcj5cblxuICAgICAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tbWFyZ2luIGlvbi1uby1wYWRkaW5nIG1lc3NhZ2VcIj5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiPlxuICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPHAgW2NsYXNzLnVucmVhZF09XCIhaXRlbS5yZWFkRGF0ZVwiIFtpbm5lckhUTUxdPVwiaXRlbS5tZXNzYWdlXCI+PC9wPlxuICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICAgIDwhLS0gZGF0ZSAtLT5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiPlxuICAgICAgICAgICAgICA8YXBwLWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgW3JlZl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBzdWI7IG1hcmdpbi1yaWdodDogM3B4XCJcbiAgICAgICAgICAgICAgPjwvYXBwLWljb24+XG4gICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmNyZWF0aW9uRGF0ZSB8IGRhdGVGcm9tTm93IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IGdyYXlcIj57eyAnIHwgJyArIChpdGVtLmNyZWF0aW9uRGF0ZSB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgICA8IS0tIGFjdGlvbnMgLS0+XG4gICAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJpdGVtLmFjdGlvbnMgfCBpc05vdEVtcHR5QXJyYXlcIj5cbiAgICAgICAgICAgIDxpb24tY29sPjwvaW9uLWNvbD5cbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBpdGVtLmFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYWN0aW9uLmRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4ZWN1dGVBY3Rpb24oJGV2ZW50LCBhY3Rpb24sIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoYWN0aW9uLnRpdGxlIHx8IGFjdGlvbi5uYW1lIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKGFjdGlvbi50aXRsZSB8fCBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGFwcC1pY29uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aW9uLmljb25SZWZcIlxuICAgICAgICAgICAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjBcIlxuICAgICAgICAgICAgICAgICAgICBbcmVmXT1cImFjdGlvbi5pY29uUmVmXCJcbiAgICAgICAgICAgICAgICAgID48L2FwcC1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgYWN0aW9uLm5hbWUgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgIDwvaW9uLWdyaWQ+XG5cbiAgICAgICAgPG1hdC1pY29uIHNsb3Q9XCJlbmRcIiAqbmdJZj1cIml0ZW0uYWN0aW9ucyB8IGFycmF5RmlsdGVyOiBpc0RlZmF1bHRBY3Rpb24gfCBpc05vdEVtcHR5QXJyYXlcIj5cbiAgICAgICAgICBjaGV2cm9uX3JpZ2h0XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIH1cbiAgICA8IS0tIGxvYWRpbmcgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIigkaXRlbXMgfCBhc3luYykgPT09IHVuZGVmaW5lZDsgZWxzZSBub3RMb2FkaW5nXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ0l0ZW1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm90TG9hZGluZz5cbiAgICAgIDwhLS0gbm8gcmVzdWx0IC0tPlxuICAgICAgPGlvbi1pdGVtICpuZ0lmPVwiJGl0ZW1zIHwgYXN5bmMgfCBpc0VtcHR5QXJyYXlcIiBsaW5lcz1cIm5vbmVcIj5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFya1wiIGNsYXNzPVwidGV4dC1pdGFsaWNcIj57eyAnU09DSUFMLlVTRVJfRVZFTlQuTk9USUZJQ0FUSU9OLkVNUFRZJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuXG4gICAgICA8IS0tIEZldGNoaW5nIG1vcmUgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmV0Y2hpbmdNb3JlOyBlbHNlIGluZmluaXRlTG9vcFwiIGxpbmVzPVwibm9uZVwiIGRpc2FibGVkPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ0l0ZW1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEluZmluaXRlIGxvb3AgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgI2luZmluaXRlTG9vcD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbkZldGNoTW9yZVwiIGxpbmVzPVwibm9uZVwiIGRpc2FibGVkIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxvYWRpbmdJdGVtXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIGZvb3RlciAtLT5cbiAgICBAaWYgKHNob3dGb290ZXIpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWxpc3QtZm9vdGVyIGNvbHVtblwiPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiZm9vdGVyLWFjdGlvblwiPlxuICAgICAgICAgIDxpb24tdGV4dCAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGZvb3RlckFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIChjbGljayk9XCJleGVjdXRlQWN0aW9uKCRldmVudCwgYWN0aW9uLCB1bmRlZmluZWQpXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/IChhY3Rpb24udGl0bGUgfHwgYWN0aW9uLm5hbWUgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChhY3Rpb24udGl0bGUgfHwgYWN0aW9uLm5hbWUgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPGlvbi10ZXh0ICpuZ0lmPVwiJGl0ZW1Db3VudCB8IGFzeW5jOyBsZXQgY291bnRcIiBjbGFzcz1cImlvbi1mbG9hdC1lbmQgaW9uLXBhZGRpbmctZW5kXCI+XG4gICAgICAgICAgICA8aT57eyAnQ09NTU9OLlJFU1VMVF9DT1VOVCcgfCB0cmFuc2xhdGU6IHsgY291bnQ6IGNvdW50IH0gfX08L2k+XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgPC9pb24tbGlzdD5cbjwvaW9uLWNvbnRlbnQ+XG5cbjwhLS0gbG9hZGluZyAtLT5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ0l0ZW0+XG4gIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiBbZGlzYWJsZWRdPlxuICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICA8L2lvbi1pdGVtPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==