@sumaris-net/ngx-components 2.0.2 → 2.0.4

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 (31) hide show
  1. package/esm2020/public_api.mjs +3 -3
  2. package/esm2020/src/app/core/home/home.mjs +3 -3
  3. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +3 -3
  4. package/esm2020/src/app/shared/material/datetime/material.date.mjs +2 -2
  5. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +2 -2
  6. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +11 -8
  7. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +3 -3
  8. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +23 -0
  9. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +71 -0
  10. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +4 -5
  11. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +2 -2
  12. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +2 -2
  13. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +6 -1
  14. package/esm2020/src/app/social/user-event/user-event.model.mjs +1 -1
  15. package/fesm2015/sumaris-net.ngx-components.mjs +29 -25
  16. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
  17. package/fesm2020/sumaris-net.ngx-components.mjs +29 -24
  18. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
  19. package/package.json +1 -1
  20. package/public_api.d.ts +2 -2
  21. package/src/app/social/job/progression/job-progression.icon.d.ts +2 -2
  22. package/src/app/social/job/progression/job-progression.list.d.ts +1 -1
  23. package/src/app/social/job/progression/job-progression.model.d.ts +11 -0
  24. package/src/app/social/job/{job.service.d.ts → progression/job-progression.service.d.ts} +5 -5
  25. package/src/app/social/job/testing/job-progression.testing.d.ts +4 -4
  26. package/src/app/social/job/testing/job-progression.testing.service.d.ts +2 -2
  27. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +2 -0
  28. package/src/app/social/user-event/user-event.model.d.ts +2 -0
  29. package/esm2020/src/app/social/job/job.model.mjs +0 -26
  30. package/esm2020/src/app/social/job/job.service.mjs +0 -71
  31. package/src/app/social/job/job.model.d.ts +0 -33
@@ -171,10 +171,10 @@ export class UserEventNotificationList {
171
171
  }
172
172
  }
173
173
  UserEventNotificationList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: UserEventNotificationList, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PopoverController }, { token: i2.LocalSettingsService, optional: true }, { token: APP_USER_EVENT_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
174
- UserEventNotificationList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: UserEventNotificationList, selector: "app-user-event-notification-list", inputs: { debug: "debug", mobile: "mobile", titleI18n: "titleI18n", sortBy: "sortBy", sortDirection: "sortDirection", filter: "filter", enableInfiniteScroll: "enableInfiniteScroll", pageSize: "pageSize" }, outputs: { readEvent: "readEvent", readEvents: "readEvents" }, 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 <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-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-row>\n\n <ion-item\n *ngFor=\"let item of $items | async; trackBy: trackByFn; last as last\"\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\n <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\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\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 *ngIf=\"!action.default\" class=\"action\" (click)=\"executeAction($event, action, item)\" [title]=\"(action.title || action.name) |translate\">\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\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions|arrayFilter: isDefaultAction|isNotEmptyArray\">chevron_right</mat-icon>\n </ion-item>\n\n <!-- loading -->\n <ng-container *ngIf=\"!($items|async); 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\n [ngTemplateOutlet]=\"loadingItem\">\n </ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n <ion-row class=\"ion-list-footer column\">\n <ion-col>\n <ion-text *ngIf=\"$itemCount|async; let count\"\n class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></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){overflow-y:auto;user-select:none;max-height:calc(90vh - 20px)}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}.message p.unread{font-weight:700}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-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.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 });
174
+ UserEventNotificationList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: UserEventNotificationList, selector: "app-user-event-notification-list", inputs: { debug: "debug", mobile: "mobile", titleI18n: "titleI18n", sortBy: "sortBy", sortDirection: "sortDirection", filter: "filter", enableInfiniteScroll: "enableInfiniteScroll", pageSize: "pageSize" }, outputs: { readEvent: "readEvent", readEvents: "readEvents" }, 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 <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-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-row>\n\n <ion-item\n *ngFor=\"let item of $items | async; trackBy: trackByFn; last as last\"\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\n <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\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\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 *ngIf=\"!action.default\" class=\"action\" (click)=\"executeAction($event, action, item)\" [title]=\"(action.title || action.name) |translate\">\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\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions|arrayFilter: isDefaultAction|isNotEmptyArray\">chevron_right</mat-icon>\n </ion-item>\n\n <!-- loading -->\n <ng-container *ngIf=\"!($items|async); 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\n [ngTemplateOutlet]=\"loadingItem\">\n </ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n <ion-row class=\"ion-list-footer column\">\n <ion-col>\n <ion-text *ngIf=\"$itemCount|async; let count\"\n class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></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){overflow-y:auto;-webkit-user-select:none;user-select:none;max-height:calc(90vh - 20px)}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}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-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.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 });
175
175
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: UserEventNotificationList, decorators: [{
176
176
  type: Component,
177
- args: [{ selector: 'app-user-event-notification-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-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-row>\n\n <ion-item\n *ngFor=\"let item of $items | async; trackBy: trackByFn; last as last\"\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\n <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\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\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 *ngIf=\"!action.default\" class=\"action\" (click)=\"executeAction($event, action, item)\" [title]=\"(action.title || action.name) |translate\">\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\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions|arrayFilter: isDefaultAction|isNotEmptyArray\">chevron_right</mat-icon>\n </ion-item>\n\n <!-- loading -->\n <ng-container *ngIf=\"!($items|async); 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\n [ngTemplateOutlet]=\"loadingItem\">\n </ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n <ion-row class=\"ion-list-footer column\">\n <ion-col>\n <ion-text *ngIf=\"$itemCount|async; let count\"\n class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></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){overflow-y:auto;user-select:none;max-height:calc(90vh - 20px)}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}.message p.unread{font-weight:700}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-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"] }]
177
+ args: [{ selector: 'app-user-event-notification-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-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-row>\n\n <ion-item\n *ngFor=\"let item of $items | async; trackBy: trackByFn; last as last\"\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\n <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\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\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 *ngIf=\"!action.default\" class=\"action\" (click)=\"executeAction($event, action, item)\" [title]=\"(action.title || action.name) |translate\">\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\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions|arrayFilter: isDefaultAction|isNotEmptyArray\">chevron_right</mat-icon>\n </ion-item>\n\n <!-- loading -->\n <ng-container *ngIf=\"!($items|async); 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\n [ngTemplateOutlet]=\"loadingItem\">\n </ng-container>\n </ng-template>\n </ng-template>\n\n <!-- footer -->\n <ion-row class=\"ion-list-footer column\">\n <ion-col>\n <ion-text *ngIf=\"$itemCount|async; let count\"\n class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></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){overflow-y:auto;-webkit-user-select:none;user-select:none;max-height:calc(90vh - 20px)}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}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-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"] }]
178
178
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.PopoverController }, { type: i2.LocalSettingsService, decorators: [{
179
179
  type: Optional
180
180
  }] }, { type: undefined, decorators: [{
@@ -59,6 +59,7 @@ let UserEventTestFilter = class UserEventTestFilter extends EntityFilter {
59
59
  this.recipients = [];
60
60
  this.startDate = null;
61
61
  this.excludeRead = false;
62
+ this.jobId = null;
62
63
  }
63
64
  fromObject(source, opts) {
64
65
  super.fromObject(source, opts);
@@ -69,6 +70,7 @@ let UserEventTestFilter = class UserEventTestFilter extends EntityFilter {
69
70
  this.startDate = fromDateISOString(source.startDate);
70
71
  this.excludeRead = source.excludeRead || false;
71
72
  this.includedIds = source.includedIds || [];
73
+ this.jobId = source.jobId;
72
74
  }
73
75
  buildFilter() {
74
76
  const filterFns = super.buildFilter();
@@ -93,6 +95,9 @@ let UserEventTestFilter = class UserEventTestFilter extends EntityFilter {
93
95
  if (this.excludeRead === true) {
94
96
  filterFns.push(t => isNil(t.readSignature)); // todo or t.signature ?
95
97
  }
98
+ if (isNotNil(this.jobId)) {
99
+ filterFns.push(t => this.jobId === t.jobId);
100
+ }
96
101
  return filterFns;
97
102
  }
98
103
  asObject(opts) {
@@ -104,4 +109,4 @@ UserEventTestFilter = __decorate([
104
109
  EntityClass({ typename: 'UserEventTestFilterVO' })
105
110
  ], UserEventTestFilter);
106
111
  export { UserEventTestFilter };
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC50ZXN0aW5nLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC90ZXN0aW5nL3VzZXItZXZlbnQudGVzdGluZy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFdBQVc7QUFDWCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDM0UsT0FBTyxFQUFDLE1BQU0sRUFBd0IsTUFBTSwyQ0FBMkMsQ0FBQztBQUd4RixPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBRXZFLE9BQU8sRUFBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRzNFLFdBQVc7QUFFWCxJQUFhLGFBQWEscUJBQTFCLE1BQWEsYUFBYyxTQUFRLE1BQXFCO0lBd0J0RDtRQUNFLEtBQUssQ0FBQyxlQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUE0QjtRQUNuQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakQsb0JBQW9CO1FBQ3BCLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUN0QyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FB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QUM7UUFFdEMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDcEQ7UUFDRCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3BDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7U0FDbkU7UUFDRCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQzdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7U0FDdEU7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsUUFBUSxDQUFDLElBQTRCO1FBQ25DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGLENBQUE7QUF4RFksbUJBQW1CO0lBRC9CLFdBQVcsQ0FBQyxFQUFDLFFBQVEsRUFBRSx1QkFBdUIsRUFBQyxDQUFDO0dBQ3BDLG1CQUFtQixDQXdEL0I7U0F4RFksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGR5bmFtaWNcbmltcG9ydCB7RW50aXR5Q2xhc3N9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5LmRlY29yYXRvcnMnO1xuaW1wb3J0IHtFbnRpdHksIEVudGl0eUFzT2JqZWN0T3B0aW9uc30gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtNb21lbnR9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0ljb25SZWZ9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQge2Zyb21EYXRlSVNPU3RyaW5nLCB0b0RhdGVJU09TdHJpbmd9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9kYXRlcyc7XG5pbXBvcnQge0V2ZW50TGV2ZWwsIElVc2VyRXZlbnQsIElVc2VyRXZlbnRGaWx0ZXIsIElVc2VyRXZlbnRBY3Rpb259IGZyb20gJy4uL3VzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHtFbnRpdHlGaWx0ZXJ9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7RmlsdGVyRm59IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2lzTmlsLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7U3RvcmVPYmplY3R9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuXG4vLyBAZHluYW1pY1xuQEVudGl0eUNsYXNzKHt0eXBlbmFtZTogJ1VzZXJFdmVudFRlc3RWTyd9KVxuZXhwb3J0IGNsYXNzIFVzZXJFdmVudFRlc3QgZXh0ZW5kcyBFbnRpdHk8VXNlckV2ZW50VGVzdD4gaW1wbGVtZW50cyBJVXNlckV2ZW50PFVzZXJFdmVudFRlc3Q+IHtcblxuICBzdGF0aWMgZnJvbU9iamVjdDogKHNvdXJjZTogYW55LCBvcHRzPzogYW55KSA9PiBVc2VyRXZlbnRUZXN0O1xuXG4gIHR5cGU6IHN0cmluZztcbiAgbGV2ZWw6IEV2ZW50TGV2ZWw7XG4gIGlzc3Vlcjogc3RyaW5nO1xuICByZWNpcGllbnQ6IHN0cmluZztcbiAgdXBkYXRlRGF0ZTogTW9tZW50O1xuICBjcmVhdGlvbkRhdGU6IE1vbWVudDtcbiAgcmVhZERhdGU6IE1vbWVudDtcblxuICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnRlbnQ6IHN0cmluZyB8IGFueTtcbiAgaGFzaDogc3RyaW5nO1xuICBzaWduYXR1cmU6IHN0cmluZztcbiAgcmVhZFNpZ25hdHVyZTogc3RyaW5nO1xuXG4gIGF2YXRhcj86IHN0cmluZztcbiAgYXZhdGFySWNvbj86IEljb25SZWY7XG4gIGljb24/OiBJY29uUmVmO1xuXG4gIGFjdGlvbnM/OiBJVXNlckV2ZW50QWN0aW9uW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVXNlckV2ZW50VGVzdC5UWVBFTkFNRSk7XG4gIH1cblxuICBhc09iamVjdChvcHRzPzogRW50aXR5QXNPYmplY3RPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdXBlci5hc09iamVjdChvcHRzKTtcbiAgICB0YXJnZXQuY3JlYXRpb25EYXRlID0gdG9EYXRlSVNPU3RyaW5nKHRoaXMuY3JlYXRpb25EYXRlKTtcbiAgICB0YXJnZXQucmVhZERhdGUgPSB0b0RhdGVJU09TdHJpbmcodGhpcy5yZWFkRGF0ZSk7XG5cbiAgICAvLyBTZXJpYWxpemUgY29udGVudFxuICAgIGlmICh0eXBlb2YgdGFyZ2V0LmNvbnRlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICB0YXJnZXQuY29udGVudCA9IEpTT04uc3RyaW5naWZ5KHRhcmdldC5jb250ZW50KTtcbiAgICB9XG5cbiAgICBkZWxldGUgdGFyZ2V0LmF2YXRhcjtcbiAgICBkZWxldGUgdGFyZ2V0LmF2YXRhckljb247XG4gICAgZGVsZXRlIHRhcmdldC5pY29uO1xuICAgIGRlbGV0ZSB0YXJnZXQuYWN0aW9ucztcblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBmcm9tT2JqZWN0KHNvdXJjZTogYW55KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpOyAvLyBDb3B5IGFsbCBwcm9wZXJ0aWVzXG4gICAgc3VwZXIuZnJvbU9iamVjdChzb3VyY2UpO1xuICAgIHRoaXMuY3JlYXRpb25EYXRlID0gZnJvbURhdGVJU09TdHJpbmcoc291cmNlLmNyZWF0aW9uRGF0ZSk7XG4gICAgdGhpcy5yZWFkRGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKHNvdXJjZS5yZWFkRGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRGVzZXJpYWxpemUgY29udGVudFxuICAgICAgaWYgKHR5cGVvZiBzb3VyY2UuY29udGVudCA9PT0gJ3N0cmluZycgJiYgc291cmNlLmNvbnRlbnQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IEpTT04ucGFyc2Uoc291cmNlLmNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXNlcmlhbGl6ZSBjb250ZW50LmNvbnRleHRcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdHlwZW9mIHRoaXMuY29udGVudC5jb250ZXh0ID09PSAnc3RyaW5nJyAmJiB0aGlzLmNvbnRlbnQuY29udGV4dC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgdGhpcy5jb250ZW50LmNvbnRleHQgPSBKU09OLnBhcnNlKHRoaXMuY29udGVudC5jb250ZXh0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBVc2VyRXZlbnQgZGVzZXJpYWxpemF0aW9uJywgZXJyKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQGR5bmFtaWNcbkBFbnRpdHlDbGFzcyh7dHlwZW5hbWU6ICdVc2VyRXZlbnRUZXN0RmlsdGVyVk8nfSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRUZXN0RmlsdGVyIGV4dGVuZHMgRW50aXR5RmlsdGVyPFVzZXJFdmVudFRlc3RGaWx0ZXIsIFVzZXJFdmVudFRlc3Q+IGltcGxlbWVudHMgSVVzZXJFdmVudEZpbHRlcjxVc2VyRXZlbnRUZXN0PiB7XG5cbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkgPT4gVXNlckV2ZW50VGVzdEZpbHRlcjtcblxuICB0eXBlczogc3RyaW5nW10gPSBbXTtcbiAgbGV2ZWxzOiBFdmVudExldmVsW10gPSBbXTtcbiAgaXNzdWVyczogc3RyaW5nW10gPSBbXTtcbiAgcmVjaXBpZW50czogc3RyaW5nW10gPSBbXTtcbiAgc3RhcnREYXRlOiBNb21lbnQgPSBudWxsO1xuICBpbmNsdWRlZElkczogbnVtYmVyW107XG4gIGV4Y2x1ZGVSZWFkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkge1xuICAgIHN1cGVyLmZyb21PYmplY3Qoc291cmNlLCBvcHRzKTtcbiAgICB0aGlzLnR5cGVzID0gc291cmNlLnR5cGVzIHx8IFtdO1xuICAgIHRoaXMubGV2ZWxzID0gc291cmNlLmxldmVscyB8fCBbXTtcbiAgICB0aGlzLmlzc3VlcnMgPSBzb3VyY2UuaXNzdWVycyB8fCBbXTtcbiAgICB0aGlzLnJlY2lwaWVudHMgPSBzb3VyY2UucmVjaXBpZW50cyB8fCBbXTtcbiAgICB0aGlzLnN0YXJ0RGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKHNvdXJjZS5zdGFydERhdGUpO1xuICAgIHRoaXMuZXhjbHVkZVJlYWQgPSBzb3VyY2UuZXhjbHVkZVJlYWQgfHwgZmFsc2U7XG4gICAgdGhpcy5pbmNsdWRlZElkcyA9IHNvdXJjZS5pbmNsdWRlZElkcyB8fCBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEZpbHRlcigpOiBGaWx0ZXJGbjxVc2VyRXZlbnRUZXN0PltdIHtcbiAgICBjb25zdCBmaWx0ZXJGbnMgPSBzdXBlci5idWlsZEZpbHRlcigpO1xuXG4gICAgaWYgKGlzTm90RW1wdHlBcnJheSh0aGlzLnR5cGVzKSkge1xuICAgICAgZmlsdGVyRm5zLnB1c2godCA9PiB0aGlzLnR5cGVzLmluY2x1ZGVzKHQudHlwZSkpO1xuICAgIH1cbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMubGV2ZWxzKSkge1xuICAgICAgZmlsdGVyRm5zLnB1c2godCA9PiB0aGlzLmxldmVscy5pbmNsdWRlcyh0LmxldmVsKSk7XG4gICAgfVxuICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5pc3N1ZXJzKSkge1xuICAgICAgZmlsdGVyRm5zLnB1c2godCA9PiB0aGlzLmlzc3VlcnMuaW5jbHVkZXModC5pc3N1ZXIpKTtcbiAgICB9XG4gICAgaWYgKGlzTm90RW1wdHlBcnJheSh0aGlzLnJlY2lwaWVudHMpKSB7XG4gICAgICBmaWx0ZXJGbnMucHVzaCh0ID0+IHRoaXMucmVjaXBpZW50cy5pbmNsdWRlcyh0LnJlY2lwaWVudCkpO1xuICAgIH1cblxuICAgIGlmIChpc05vdE5pbCh0aGlzLnN0YXJ0RGF0ZSkpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gdGhpcy5zdGFydERhdGUuaXNTYW1lT3JCZWZvcmUodC5jcmVhdGlvbkRhdGUpKVxuICAgIH1cbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMuaW5jbHVkZWRJZHMpKSB7XG4gICAgICBmaWx0ZXJGbnMucHVzaCgodCkgPT4gdGhpcy5pbmNsdWRlZElkcy5pbmNsdWRlcyh0LmlkKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmV4Y2x1ZGVSZWFkID09PSB0cnVlKSB7XG4gICAgICBmaWx0ZXJGbnMucHVzaCh0ID0+IGlzTmlsKHQucmVhZFNpZ25hdHVyZSkpOyAvLyB0b2RvIG9yIHQuc2lnbmF0dXJlID9cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyRm5zO1xuICB9XG5cbiAgYXNPYmplY3Qob3B0cz86IEVudGl0eUFzT2JqZWN0T3B0aW9ucyk6IFN0b3JlT2JqZWN0IHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdXBlci5hc09iamVjdChvcHRzKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG59XG4iXX0=
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC50ZXN0aW5nLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC90ZXN0aW5nL3VzZXItZXZlbnQudGVzdGluZy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFdBQVc7QUFDWCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDM0UsT0FBTyxFQUFDLE1BQU0sRUFBd0IsTUFBTSwyQ0FBMkMsQ0FBQztBQUd4RixPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBRXZFLE9BQU8sRUFBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRzNFLFdBQVc7QUFFWCxJQUFhLGFBQWEscUJBQTFCLE1BQWEsYUFBYyxTQUFRLE1BQXFCO0lBeUJ0RDtRQUNFLEtBQUssQ0FBQyxlQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUE0QjtRQUNuQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakQsb0JBQW9CO1FBQ3BCLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUN0QyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FB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LEVBQUU7WUFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQzdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7U0FDdEU7UUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUE0QjtRQUNuQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRixDQUFBO0FBNURZLG1CQUFtQjtJQUQvQixXQUFXLENBQUMsRUFBQyxRQUFRLEVBQUUsdUJBQXVCLEVBQUMsQ0FBQztHQUNwQyxtQkFBbUIsQ0E0RC9CO1NBNURZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBkeW5hbWljXG5pbXBvcnQge0VudGl0eUNsYXNzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2VudGl0eS5kZWNvcmF0b3JzJztcbmltcG9ydCB7RW50aXR5LCBFbnRpdHlBc09iamVjdE9wdGlvbnN9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtJY29uUmVmfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHtmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHtFdmVudExldmVsLCBJVXNlckV2ZW50LCBJVXNlckV2ZW50RmlsdGVyLCBJVXNlckV2ZW50QWN0aW9ufSBmcm9tICcuLi91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7RW50aXR5RmlsdGVyfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2ZpbHRlci5tb2RlbCc7XG5pbXBvcnQge0ZpbHRlckZufSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1N0b3JlT2JqZWN0fSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcblxuLy8gQGR5bmFtaWNcbkBFbnRpdHlDbGFzcyh7dHlwZW5hbWU6ICdVc2VyRXZlbnRUZXN0Vk8nfSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRUZXN0IGV4dGVuZHMgRW50aXR5PFVzZXJFdmVudFRlc3Q+IGltcGxlbWVudHMgSVVzZXJFdmVudDxVc2VyRXZlbnRUZXN0PiB7XG5cbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkgPT4gVXNlckV2ZW50VGVzdDtcblxuICB0eXBlOiBzdHJpbmc7XG4gIGxldmVsOiBFdmVudExldmVsO1xuICBpc3N1ZXI6IHN0cmluZztcbiAgcmVjaXBpZW50OiBzdHJpbmc7XG4gIHVwZGF0ZURhdGU6IE1vbWVudDtcbiAgY3JlYXRpb25EYXRlOiBNb21lbnQ7XG4gIHJlYWREYXRlOiBNb21lbnQ7XG5cbiAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb250ZW50OiBzdHJpbmcgfCBhbnk7XG4gIGhhc2g6IHN0cmluZztcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG4gIHJlYWRTaWduYXR1cmU6IHN0cmluZztcblxuICBhdmF0YXI/OiBzdHJpbmc7XG4gIGF2YXRhckljb24/OiBJY29uUmVmO1xuICBpY29uPzogSWNvblJlZjtcbiAgam9iSWQ/OiBudW1iZXI7XG5cbiAgYWN0aW9ucz86IElVc2VyRXZlbnRBY3Rpb25bXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihVc2VyRXZlbnRUZXN0LlRZUEVOQU1FKTtcbiAgfVxuXG4gIGFzT2JqZWN0KG9wdHM/OiBFbnRpdHlBc09iamVjdE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHRhcmdldCA9IHN1cGVyLmFzT2JqZWN0KG9wdHMpO1xuICAgIHRhcmdldC5jcmVhdGlvbkRhdGUgPSB0b0RhdGVJU09TdHJpbmcodGhpcy5jcmVhdGlvbkRhdGUpO1xuICAgIHRhcmdldC5yZWFkRGF0ZSA9IHRvRGF0ZUlTT1N0cmluZyh0aGlzLnJlYWREYXRlKTtcblxuICAgIC8vIFNlcmlhbGl6ZSBjb250ZW50XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQuY29udGVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRhcmdldC5jb250ZW50ID0gSlNPTi5zdHJpbmdpZnkodGFyZ2V0LmNvbnRlbnQpO1xuICAgIH1cblxuICAgIGRlbGV0ZSB0YXJnZXQuYXZhdGFyO1xuICAgIGRlbGV0ZSB0YXJnZXQuYXZhdGFySWNvbjtcbiAgICBkZWxldGUgdGFyZ2V0Lmljb247XG4gICAgZGVsZXRlIHRhcmdldC5hY3Rpb25zO1xuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnkpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHNvdXJjZSk7IC8vIENvcHkgYWxsIHByb3BlcnRpZXNcbiAgICBzdXBlci5mcm9tT2JqZWN0KHNvdXJjZSk7XG4gICAgdGhpcy5jcmVhdGlvbkRhdGUgPSBmcm9tRGF0ZUlTT1N0cmluZyhzb3VyY2UuY3JlYXRpb25EYXRlKTtcbiAgICB0aGlzLnJlYWREYXRlID0gZnJvbURhdGVJU09TdHJpbmcoc291cmNlLnJlYWREYXRlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBEZXNlcmlhbGl6ZSBjb250ZW50XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZS5jb250ZW50ID09PSAnc3RyaW5nJyAmJiBzb3VyY2UuY29udGVudC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gSlNPTi5wYXJzZShzb3VyY2UuY29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlc2VyaWFsaXplIGNvbnRlbnQuY29udGV4dFxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0eXBlb2YgdGhpcy5jb250ZW50LmNvbnRleHQgPT09ICdzdHJpbmcnICYmIHRoaXMuY29udGVudC5jb250ZXh0LnN0YXJ0c1dpdGgoJ3snKSkge1xuICAgICAgICB0aGlzLmNvbnRlbnQuY29udGV4dCA9IEpTT04ucGFyc2UodGhpcy5jb250ZW50LmNvbnRleHQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIFVzZXJFdmVudCBkZXNlcmlhbGl6YXRpb24nLCBlcnIpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBAZHluYW1pY1xuQEVudGl0eUNsYXNzKHt0eXBlbmFtZTogJ1VzZXJFdmVudFRlc3RGaWx0ZXJWTyd9KVxuZXhwb3J0IGNsYXNzIFVzZXJFdmVudFRlc3RGaWx0ZXIgZXh0ZW5kcyBFbnRpdHlGaWx0ZXI8VXNlckV2ZW50VGVzdEZpbHRlciwgVXNlckV2ZW50VGVzdD4gaW1wbGVtZW50cyBJVXNlckV2ZW50RmlsdGVyPFVzZXJFdmVudFRlc3Q+IHtcblxuICBzdGF0aWMgZnJvbU9iamVjdDogKHNvdXJjZTogYW55LCBvcHRzPzogYW55KSA9PiBVc2VyRXZlbnRUZXN0RmlsdGVyO1xuXG4gIHR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXZlbHM6IEV2ZW50TGV2ZWxbXSA9IFtdO1xuICBpc3N1ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICByZWNpcGllbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBzdGFydERhdGU6IE1vbWVudCA9IG51bGw7XG4gIGluY2x1ZGVkSWRzOiBudW1iZXJbXTtcbiAgZXhjbHVkZVJlYWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgam9iSWQ6IG51bWJlciA9IG51bGw7XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkge1xuICAgIHN1cGVyLmZyb21PYmplY3Qoc291cmNlLCBvcHRzKTtcbiAgICB0aGlzLnR5cGVzID0gc291cmNlLnR5cGVzIHx8IFtdO1xuICAgIHRoaXMubGV2ZWxzID0gc291cmNlLmxldmVscyB8fCBbXTtcbiAgICB0aGlzLmlzc3VlcnMgPSBzb3VyY2UuaXNzdWVycyB8fCBbXTtcbiAgICB0aGlzLnJlY2lwaWVudHMgPSBzb3VyY2UucmVjaXBpZW50cyB8fCBbXTtcbiAgICB0aGlzLnN0YXJ0RGF0ZSA9IGZyb21EYXRlSVNPU3RyaW5nKHNvdXJjZS5zdGFydERhdGUpO1xuICAgIHRoaXMuZXhjbHVkZVJlYWQgPSBzb3VyY2UuZXhjbHVkZVJlYWQgfHwgZmFsc2U7XG4gICAgdGhpcy5pbmNsdWRlZElkcyA9IHNvdXJjZS5pbmNsdWRlZElkcyB8fCBbXTtcbiAgICB0aGlzLmpvYklkID0gc291cmNlLmpvYklkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRmlsdGVyKCk6IEZpbHRlckZuPFVzZXJFdmVudFRlc3Q+W10ge1xuICAgIGNvbnN0IGZpbHRlckZucyA9IHN1cGVyLmJ1aWxkRmlsdGVyKCk7XG5cbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMudHlwZXMpKSB7XG4gICAgICBmaWx0ZXJGbnMucHVzaCh0ID0+IHRoaXMudHlwZXMuaW5jbHVkZXModC50eXBlKSk7XG4gICAgfVxuICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5sZXZlbHMpKSB7XG4gICAgICBmaWx0ZXJGbnMucHVzaCh0ID0+IHRoaXMubGV2ZWxzLmluY2x1ZGVzKHQubGV2ZWwpKTtcbiAgICB9XG4gICAgaWYgKGlzTm90RW1wdHlBcnJheSh0aGlzLmlzc3VlcnMpKSB7XG4gICAgICBmaWx0ZXJGbnMucHVzaCh0ID0+IHRoaXMuaXNzdWVycy5pbmNsdWRlcyh0Lmlzc3VlcikpO1xuICAgIH1cbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMucmVjaXBpZW50cykpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gdGhpcy5yZWNpcGllbnRzLmluY2x1ZGVzKHQucmVjaXBpZW50KSk7XG4gICAgfVxuXG4gICAgaWYgKGlzTm90TmlsKHRoaXMuc3RhcnREYXRlKSkge1xuICAgICAgZmlsdGVyRm5zLnB1c2godCA9PiB0aGlzLnN0YXJ0RGF0ZS5pc1NhbWVPckJlZm9yZSh0LmNyZWF0aW9uRGF0ZSkpXG4gICAgfVxuICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5pbmNsdWRlZElkcykpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKCh0KSA9PiB0aGlzLmluY2x1ZGVkSWRzLmluY2x1ZGVzKHQuaWQpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXhjbHVkZVJlYWQgPT09IHRydWUpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gaXNOaWwodC5yZWFkU2lnbmF0dXJlKSk7IC8vIHRvZG8gb3IgdC5zaWduYXR1cmUgP1xuICAgIH1cbiAgICBpZiAoaXNOb3ROaWwodGhpcy5qb2JJZCkpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gdGhpcy5qb2JJZCA9PT0gdC5qb2JJZCk7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJGbnM7XG4gIH1cblxuICBhc09iamVjdChvcHRzPzogRW50aXR5QXNPYmplY3RPcHRpb25zKTogU3RvcmVPYmplY3Qge1xuICAgIGNvbnN0IHRhcmdldCA9IHN1cGVyLmFzT2JqZWN0KG9wdHMpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvdXNlci1ldmVudC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb21lbnR9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0VudGl0eSwgSUVudGl0eX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtJRW50aXR5RmlsdGVyfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2ZpbHRlci5tb2RlbCc7XG5pbXBvcnQge0FwcENvbG9ycywgSWNvblJlZn0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcblxuXG5leHBvcnQgdHlwZSBFdmVudExldmVsID0gJ0VSUk9SJyB8ICdXQVJOSU5HJyB8ICdJTkZPJyB8ICdERUJVRyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJFdmVudDxcbiAgRSBleHRlbmRzIEVudGl0eTxFLCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBVID0gc3RyaW5nLFxuICBMID0gRXZlbnRMZXZlbFxuICA+XG4gIGV4dGVuZHMgSUVudGl0eTxFLCBJRD4ge1xuXG4gIGlzc3VlcjogVTtcbiAgcmVjaXBpZW50OiBVO1xuICB0eXBlOiBzdHJpbmc7XG4gIGxldmVsOiBMO1xuXG4gIHVwZGF0ZURhdGU6IE1vbWVudDtcbiAgY3JlYXRpb25EYXRlOiBNb21lbnQ7XG4gIHJlYWREYXRlPzogTW9tZW50O1xuXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIGNvbnRlbnQ/OiBzdHJpbmcgfCBhbnk7XG5cbiAgYXZhdGFyPzogc3RyaW5nO1xuICBhdmF0YXJJY29uPzogSWNvblJlZjtcbiAgYXZhdGFySmRlbnRpY29uPzogYW55O1xuICBpY29uPzogSWNvblJlZjtcblxuICBhY3Rpb25zPzogSVVzZXJFdmVudEFjdGlvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRGaWx0ZXI8RSBleHRlbmRzIElVc2VyRXZlbnQ8RSwgSUQsIFUsIEw+LFxuICBJRCA9IG51bWJlcixcbiAgVSA9IHN0cmluZyxcbiAgTCA9IEV2ZW50TGV2ZWxcbiAgPlxuICBleHRlbmRzIElFbnRpdHlGaWx0ZXI8YW55LCBFPiB7XG5cbiAgdHlwZXM6IHN0cmluZ1tdO1xuICBsZXZlbHM6IExbXTtcbiAgaXNzdWVyczogVVtdO1xuICByZWNpcGllbnRzOiBVW107XG4gIHN0YXJ0RGF0ZTogTW9tZW50O1xuICBpbmNsdWRlZElkczogSURbXTtcbiAgZXhjbHVkZVJlYWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJFdmVudEFjdGlvbiB7XG5cbiAgbmFtZTogc3RyaW5nIHwgYW55O1xuICB0aXRsZT86IHN0cmluZztcbiAgY29sb3I/OiBBcHBDb2xvcnM7XG4gIGljb25SZWY/OiBJY29uUmVmO1xuICBkZWZhdWx0PzogYm9vbGVhbjtcblxuICBleGVjdXRlQWN0aW9uOiAoZXZlbnQ6IElVc2VyRXZlbnQ8YW55PikgPT4gYW55IHwgUHJvbWlzZTxhbnk+O1xuXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIElVc2VyRXZlbnRBY3Rpb24gaW5zdGVhZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJFdmVudEFjdGlvbiBleHRlbmRzIElVc2VyRXZlbnRBY3Rpb24ge1xuXG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvdXNlci1ldmVudC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb21lbnR9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0VudGl0eSwgSUVudGl0eX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtJRW50aXR5RmlsdGVyfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2ZpbHRlci5tb2RlbCc7XG5pbXBvcnQge0FwcENvbG9ycywgSWNvblJlZn0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcblxuXG5leHBvcnQgdHlwZSBFdmVudExldmVsID0gJ0VSUk9SJyB8ICdXQVJOSU5HJyB8ICdJTkZPJyB8ICdERUJVRyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJFdmVudDxcbiAgRSBleHRlbmRzIEVudGl0eTxFLCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBVID0gc3RyaW5nLFxuICBMID0gRXZlbnRMZXZlbFxuICA+XG4gIGV4dGVuZHMgSUVudGl0eTxFLCBJRD4ge1xuXG4gIGlzc3VlcjogVTtcbiAgcmVjaXBpZW50OiBVO1xuICB0eXBlOiBzdHJpbmc7XG4gIGxldmVsOiBMO1xuXG4gIHVwZGF0ZURhdGU6IE1vbWVudDtcbiAgY3JlYXRpb25EYXRlOiBNb21lbnQ7XG4gIHJlYWREYXRlPzogTW9tZW50O1xuXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIGNvbnRlbnQ/OiBzdHJpbmcgfCBhbnk7XG5cbiAgYXZhdGFyPzogc3RyaW5nO1xuICBhdmF0YXJJY29uPzogSWNvblJlZjtcbiAgYXZhdGFySmRlbnRpY29uPzogYW55O1xuICBpY29uPzogSWNvblJlZjtcblxuICBqb2JJZD86IG51bWJlcjtcblxuICBhY3Rpb25zPzogSVVzZXJFdmVudEFjdGlvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRGaWx0ZXI8RSBleHRlbmRzIElVc2VyRXZlbnQ8RSwgSUQsIFUsIEw+LFxuICBJRCA9IG51bWJlcixcbiAgVSA9IHN0cmluZyxcbiAgTCA9IEV2ZW50TGV2ZWxcbiAgPlxuICBleHRlbmRzIElFbnRpdHlGaWx0ZXI8YW55LCBFPiB7XG5cbiAgdHlwZXM6IHN0cmluZ1tdO1xuICBsZXZlbHM6IExbXTtcbiAgaXNzdWVyczogVVtdO1xuICByZWNpcGllbnRzOiBVW107XG4gIHN0YXJ0RGF0ZTogTW9tZW50O1xuICBpbmNsdWRlZElkczogSURbXTtcbiAgZXhjbHVkZVJlYWQ6IGJvb2xlYW47XG4gIGpvYklkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRBY3Rpb24ge1xuXG4gIG5hbWU6IHN0cmluZyB8IGFueTtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGNvbG9yPzogQXBwQ29sb3JzO1xuICBpY29uUmVmPzogSWNvblJlZjtcbiAgZGVmYXVsdD86IGJvb2xlYW47XG5cbiAgZXhlY3V0ZUFjdGlvbjogKGV2ZW50OiBJVXNlckV2ZW50PGFueT4pID0+IGFueSB8IFByb21pc2U8YW55PjtcblxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBJVXNlckV2ZW50QWN0aW9uIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyRXZlbnRBY3Rpb24gZXh0ZW5kcyBJVXNlckV2ZW50QWN0aW9uIHtcblxufVxuIl19