@smarterplan/ngx-smarterplan-admin 0.2.0 → 0.2.2

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 (35) hide show
  1. package/esm2020/lib/admin/admin.component.mjs +4 -4
  2. package/esm2020/lib/chevron/chevron.component.mjs +4 -4
  3. package/esm2020/lib/guest-link/guest-link.component.mjs +4 -4
  4. package/esm2020/lib/guide.guard.mjs +4 -4
  5. package/esm2020/lib/name-from-id.pipe.mjs +4 -4
  6. package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +5 -5
  7. package/esm2020/lib/ngx-smarterplan-admin.module.mjs +5 -5
  8. package/esm2020/lib/ngx-smarterplan-admin.service.mjs +4 -4
  9. package/esm2020/lib/organisation/organisation.component.mjs +5 -5
  10. package/esm2020/lib/sp-admin.guard.mjs +4 -4
  11. package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +4 -4
  12. package/esm2020/lib/user/form-mission/form-mission.component.mjs +4 -4
  13. package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +4 -4
  14. package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +4 -4
  15. package/esm2020/lib/user/user.component.mjs +5 -5
  16. package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +4 -4
  17. package/esm2020/lib/visitor/template/template.component.mjs +4 -4
  18. package/esm2020/lib/visitor/visitor.component.mjs +5 -5
  19. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +59 -59
  20. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
  21. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs +59 -59
  22. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
  23. package/lib/admin/admin.component.d.ts +1 -1
  24. package/lib/chevron/chevron.component.d.ts +1 -1
  25. package/lib/guest-link/guest-link.component.d.ts +1 -1
  26. package/lib/organisation/organisation.component.d.ts +1 -1
  27. package/lib/user/detail-organisation/detail-organisation.component.d.ts +1 -1
  28. package/lib/user/form-mission/form-mission.component.d.ts +1 -1
  29. package/lib/user/form-organisation/form-organisation.component.d.ts +1 -1
  30. package/lib/user/user-mission-form/user-mission-form.component.d.ts +1 -1
  31. package/lib/user/user.component.d.ts +1 -1
  32. package/lib/visitor/create-batch/create-batch.component.d.ts +1 -1
  33. package/lib/visitor/template/template.component.d.ts +1 -1
  34. package/lib/visitor/visitor.component.d.ts +1 -1
  35. package/package.json +7 -7
@@ -102,9 +102,9 @@ export class UserMissionFormComponent {
102
102
  }
103
103
  }
104
104
  }
105
- UserMissionFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UserMissionFormComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.BaseUserService }, { token: i3.TranslateService }, { token: i2.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
106
- UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: { addToOrganisation: "addToOrganisation", isSP: "isSP", createForExistingUser: "createForExistingUser", currentOrg: "currentOrg" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\r\n required formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \r\n || isFormError(form.controls['email'])\">\r\n {{validatorsService.getError(form.controls['email']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \r\n || isFormError(form.controls['lastName'])\">\r\n {{validatorsService.getError(form.controls['lastName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \r\n || isFormError(form.controls['firstName'])\">\r\n {{validatorsService.getError(form.controls['firstName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working\">{{'Create user' | translate}}</button>\r\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], dependencies: [{ kind: "component", type: i4.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
107
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UserMissionFormComponent, decorators: [{
105
+ UserMissionFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserMissionFormComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.BaseUserService }, { token: i3.TranslateService }, { token: i2.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
106
+ UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: { addToOrganisation: "addToOrganisation", isSP: "isSP", createForExistingUser: "createForExistingUser", currentOrg: "currentOrg" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\r\n required formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \r\n || isFormError(form.controls['email'])\">\r\n {{validatorsService.getError(form.controls['email']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \r\n || isFormError(form.controls['lastName'])\">\r\n {{validatorsService.getError(form.controls['lastName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \r\n || isFormError(form.controls['firstName'])\">\r\n {{validatorsService.getError(form.controls['firstName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working\">{{'Create user' | translate}}</button>\r\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], dependencies: [{ kind: "component", type: i4.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserMissionFormComponent, decorators: [{
108
108
  type: Component,
109
109
  args: [{ selector: 'lib-user-mission-form', template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\r\n required formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \r\n || isFormError(form.controls['email'])\">\r\n {{validatorsService.getError(form.controls['email']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \r\n || isFormError(form.controls['lastName'])\">\r\n {{validatorsService.getError(form.controls['lastName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \r\n || isFormError(form.controls['firstName'])\">\r\n {{validatorsService.getError(form.controls['firstName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working\">{{'Create user' | translate}}</button>\r\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
110
110
  }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.BaseUserService }, { type: i3.TranslateService }, { type: i2.ValidatorsService }]; }, propDecorators: { addToOrganisation: [{
@@ -118,4 +118,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
118
118
  }], added: [{
119
119
  type: Output
120
120
  }] } });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLW1pc3Npb24tZm9ybS91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXItbWlzc2lvbi1mb3JtL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUF3QyxVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFzRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0FBT3hLLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmpDLFlBQ1ksRUFBc0IsRUFDdEIsV0FBNEIsRUFDNUIsU0FBMkIsRUFDNUIsaUJBQW9DO1FBSG5DLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUM1QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBcEJ0QywwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFNN0IsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFOUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQU1oQixjQUFTLEdBQVksS0FBSyxDQUFDO0lBT3ZCLENBQUM7SUFFTCxRQUFRO1FBQ0osSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0I7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN0QixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDdEQsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDaEYsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7U0FDcEYsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFVLENBQUM7UUFDZixJQUFJO1lBQ0EsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDbEMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxFQUFFO2dCQUNILEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsT0FBTzthQUNWO1lBQ0QsSUFBSTtnQkFDQSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQzFELFNBQVMsRUFDVCxJQUFJLENBQ1AsQ0FBQztnQkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO2FBQzlCO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsT0FBTzthQUNWO1NBQ0o7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDJDQUEyQztJQUMzQyxtQ0FBbUM7SUFDbkMsMkRBQTJEO0lBQzNELHFDQUFxQztJQUNyQyxhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLHdEQUF3RDtJQUN4RCwyREFBMkQ7SUFDM0QscUNBQXFDO0lBQ3JDLCtFQUErRTtJQUMvRSxnQkFBZ0I7SUFDaEIsK0NBQStDO0lBQy9DLGlFQUFpRTtJQUNqRSxjQUFjO0lBQ2QsU0FBUztJQUNULElBQUk7SUFFSixLQUFLLENBQUMsY0FBYyxDQUFDLE9BQWdCO1FBQ2pDLElBQUksT0FBTyxFQUFFO1lBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDNUIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHVDQUF1QyxDQUMxRCxJQUFJLENBQUMsWUFBdUIsRUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQ25DLENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQU87UUFDZixPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUdELFlBQVk7UUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDMUI7SUFFTCxDQUFDOztxSEE1SFEsd0JBQXdCO3lHQUF4Qix3QkFBd0Isc09DVnJDLGlsS0FtRk07MkZEekVPLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDSSx1QkFBdUI7c01BTXhCLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE1pc3Npb24sIFByb2ZpbGUsIEJhc2VVc2VyU2VydmljZSwgVmFsaWRhdG9yc1NlcnZpY2UsIHRleHRWYWxpZGF0b3IsIG5vRW1wdHlWYWxpZGF0b3IsIGVtYWlsVmFsaWRhdG9yIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItdXNlci1taXNzaW9uLWZvcm0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJNaXNzaW9uRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgQElucHV0KCkgYWRkVG9PcmdhbmlzYXRpb246IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBpc1NQOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpIGNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG5cclxuICAgIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gICAgQElucHV0KCkgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBPdXRwdXQoKSBhZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgbWlzc2lvbklucHV0OiBNaXNzaW9uO1xyXG5cclxuICAgIGNyZWF0ZWRVc2VyOiBQcm9maWxlO1xyXG5cclxuICAgIGVycm9yRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlOiBWYWxpZGF0b3JzU2VydmljZVxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgZW1haWw6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZW1haWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogW1wiXCIsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbWFpbCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiZW1haWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwOiBQcm9maWxlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS52YWx1ZTtcclxuICAgICAgICAgICAgcCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UucHJvZmlsZUZvck1haWwoZm9ybVZhbHVlLmVtYWlsKTtcclxuICAgICAgICAgICAgaWYgKHApIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiVXNlciB3aXRoIHRoaXMgZW1haWwgZXhpc3RzIGFscmVhZHkhXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXJBV1NhbmRQcm9maWxlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBjcmVhdGVkIVwiLCBwcm9maWxlLm1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZFVzZXIgPSBwcm9maWxlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhbGVydCh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KEpTT04uc3RyaW5naWZ5KGVycm9yKSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFzeW5jIHVwZGF0ZUFsbE1pc3Npb25zRnJvbVRlbXBsYXRlKG1pc3Npb25JbnB1dDogVXBkYXRlTWlzc2lvbklucHV0KSB7XHJcbiAgICAvLyAgICAgLy8gYWxsIG1pc3Npb25zIG9mIHRoaXMgb3JnYW5pc2F0aW9uXHJcbiAgICAvLyAgICAgY29uc3QgbWlzc2lvbnNGcm9tVGVtcGxhdGUgPVxyXG4gICAgLy8gICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlUZW1wbGF0ZShcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMubWlzc2lvblRvRWRpdC5pZCxcclxuICAgIC8vICAgICAgICAgKTtcclxuICAgIC8vICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgIC8vICAgICAgICAgbWlzc2lvbnNGcm9tVGVtcGxhdGUubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBtaXNzaW9uVGVtcGxhdGUgPSB7IC4uLm1pc3Npb25JbnB1dCB9O1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2VuZFVwZGF0ZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIG1pc3Npb25UZW1wbGF0ZS5lbWFpbFN0YXR1cyA9IEVtYWlsU3RhdHVzLlVQREFURV9UT19ERUxJVkVSO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgbWlzc2lvblRlbXBsYXRlLmlkID0gbWlzc2lvbi5pZDtcclxuICAgIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UudXBkYXRlKG1pc3Npb25UZW1wbGF0ZSk7XHJcbiAgICAvLyAgICAgICAgIH0pLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgYXN5bmMgb25NaXNzaW9uSW5wdXQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIGlmIChtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvbklucHV0ID0gbWlzc2lvbjtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25JbnB1dCBhcyBNaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWQuZW1pdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0Zvcm1FcnJvcihjb250cm9sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIHRoaXMuZXJyb3JGb3JtO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBvbkZvcm1DaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JGb3JtICYmIHRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZvcm1cIj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInBlcnNvbmFsSW5mb1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnVXNlciBQZXJzb25hbCBJbmZvcm1hdGlvbicgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydlbWFpbCddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFzdCBuYW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFzdE5hbWVcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydsYXN0TmFtZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiIGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJ3b3JraW5nXCI+XHJcbiAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZWRVc2VyOyBlbHNlIHdhaXRpbmdGb3JVc2VyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICB7eydVc2VyIHN1Y2Nlc3NmdWxseSBjcmVhdGVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ2FuaXNhdGlvblwiIFt1c2VyRm9yTWlzc2lvbklEXT1cImNyZWF0ZWRVc2VyLmlkXCJcclxuICAgICAgICAgICAgICAgIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25JbnB1dCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3dhaXRpbmdGb3JVc2VyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1zdWJtaXQtYnRuXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTMgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndvcmtpbmdcIj57eydDcmVhdGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWNhbmNlbC1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cImVycm9yRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWZvcm0taW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uaW5mb0J0bicgfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgPGg0Pnt7ICdNaXNzaW9uIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19PC9oND5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZ2ItYWxlcnQgdHlwZT1cIndhcm5pbmdcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIj57eydQbGVhc2UgY3JlYXRlIGEgdXNlciBmaXJzdCcgfCB0cmFuc2xhdGV9fS48L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLW1pc3Npb24tZm9ybS91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXItbWlzc2lvbi1mb3JtL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUF3QyxVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFzRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0FBT3hLLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmpDLFlBQ1ksRUFBc0IsRUFDdEIsV0FBNEIsRUFDNUIsU0FBMkIsRUFDNUIsaUJBQW9DO1FBSG5DLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUM1QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBcEJ0QywwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFNN0IsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFOUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQU1oQixjQUFTLEdBQVksS0FBSyxDQUFDO0lBT3ZCLENBQUM7SUFFTCxRQUFRO1FBQ0osSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELEtB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SUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQ25DLENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQU87UUFDZixPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUdELFlBQVk7UUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDMUI7SUFFTCxDQUFDOztzSEE1SFEsd0JBQXdCOzBHQUF4Qix3QkFBd0Isc09DVnJDLGlsS0FtRk07NEZEekVPLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDSSx1QkFBdUI7c01BTXhCLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE1pc3Npb24sIFByb2ZpbGUsIEJhc2VVc2VyU2VydmljZSwgVmFsaWRhdG9yc1NlcnZpY2UsIHRleHRWYWxpZGF0b3IsIG5vRW1wdHlWYWxpZGF0b3IsIGVtYWlsVmFsaWRhdG9yIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItdXNlci1taXNzaW9uLWZvcm0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJNaXNzaW9uRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgQElucHV0KCkgYWRkVG9PcmdhbmlzYXRpb246IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBpc1NQOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpIGNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG5cclxuICAgIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gICAgQElucHV0KCkgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBPdXRwdXQoKSBhZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgbWlzc2lvbklucHV0OiBNaXNzaW9uO1xyXG5cclxuICAgIGNyZWF0ZWRVc2VyOiBQcm9maWxlO1xyXG5cclxuICAgIGVycm9yRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlOiBWYWxpZGF0b3JzU2VydmljZVxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgZW1haWw6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZW1haWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogW1wiXCIsIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbWFpbCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiZW1haWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwOiBQcm9maWxlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS52YWx1ZTtcclxuICAgICAgICAgICAgcCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UucHJvZmlsZUZvck1haWwoZm9ybVZhbHVlLmVtYWlsKTtcclxuICAgICAgICAgICAgaWYgKHApIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiVXNlciB3aXRoIHRoaXMgZW1haWwgZXhpc3RzIGFscmVhZHkhXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXJBV1NhbmRQcm9maWxlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBjcmVhdGVkIVwiLCBwcm9maWxlLm1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZFVzZXIgPSBwcm9maWxlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhbGVydCh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KEpTT04uc3RyaW5naWZ5KGVycm9yKSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFzeW5jIHVwZGF0ZUFsbE1pc3Npb25zRnJvbVRlbXBsYXRlKG1pc3Npb25JbnB1dDogVXBkYXRlTWlzc2lvbklucHV0KSB7XHJcbiAgICAvLyAgICAgLy8gYWxsIG1pc3Npb25zIG9mIHRoaXMgb3JnYW5pc2F0aW9uXHJcbiAgICAvLyAgICAgY29uc3QgbWlzc2lvbnNGcm9tVGVtcGxhdGUgPVxyXG4gICAgLy8gICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlUZW1wbGF0ZShcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMubWlzc2lvblRvRWRpdC5pZCxcclxuICAgIC8vICAgICAgICAgKTtcclxuICAgIC8vICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgIC8vICAgICAgICAgbWlzc2lvbnNGcm9tVGVtcGxhdGUubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBtaXNzaW9uVGVtcGxhdGUgPSB7IC4uLm1pc3Npb25JbnB1dCB9O1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2VuZFVwZGF0ZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIG1pc3Npb25UZW1wbGF0ZS5lbWFpbFN0YXR1cyA9IEVtYWlsU3RhdHVzLlVQREFURV9UT19ERUxJVkVSO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgbWlzc2lvblRlbXBsYXRlLmlkID0gbWlzc2lvbi5pZDtcclxuICAgIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UudXBkYXRlKG1pc3Npb25UZW1wbGF0ZSk7XHJcbiAgICAvLyAgICAgICAgIH0pLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgYXN5bmMgb25NaXNzaW9uSW5wdXQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIGlmIChtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvbklucHV0ID0gbWlzc2lvbjtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25JbnB1dCBhcyBNaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWQuZW1pdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0Zvcm1FcnJvcihjb250cm9sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIHRoaXMuZXJyb3JGb3JtO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBvbkZvcm1DaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JGb3JtICYmIHRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZvcm1cIj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInBlcnNvbmFsSW5mb1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnVXNlciBQZXJzb25hbCBJbmZvcm1hdGlvbicgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydlbWFpbCddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFzdCBuYW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFzdE5hbWVcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydsYXN0TmFtZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiIGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJ3b3JraW5nXCI+XHJcbiAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZWRVc2VyOyBlbHNlIHdhaXRpbmdGb3JVc2VyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICB7eydVc2VyIHN1Y2Nlc3NmdWxseSBjcmVhdGVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ2FuaXNhdGlvblwiIFt1c2VyRm9yTWlzc2lvbklEXT1cImNyZWF0ZWRVc2VyLmlkXCJcclxuICAgICAgICAgICAgICAgIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25JbnB1dCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3dhaXRpbmdGb3JVc2VyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1zdWJtaXQtYnRuXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTMgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndvcmtpbmdcIj57eydDcmVhdGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWNhbmNlbC1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cImVycm9yRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWZvcm0taW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uaW5mb0J0bicgfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgPGg0Pnt7ICdNaXNzaW9uIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19PC9oND5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZ2ItYWxlcnQgdHlwZT1cIndhcm5pbmdcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIj57eydQbGVhc2UgY3JlYXRlIGEgdXNlciBmaXJzdCcgfCB0cmFuc2xhdGV9fS48L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19
@@ -327,10 +327,10 @@ export class UserComponent {
327
327
  return data.replace(/\s/g, '');
328
328
  }
329
329
  }
330
- UserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UserComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i1.DomainService }, { token: i1.OrganisationService }, { token: i2.NgbModal }, { token: i3.TranslateService }, { token: i1.ProfileService }], target: i0.ɵɵFactoryTarget.Component });
331
- UserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: UserComponent, selector: "lib-user", ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate }}:\r\n {{ mis.createdAt | timeDateString: \"day_time_zone\" | async }}\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\" >\r\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\r\n {{\"Users without missions\" | translate}}\r\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \r\n (click)=\"onToggleDetailUser(profile.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{profile.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"detailsUser==profile.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{profile.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:fit-content}\n"], dependencies: [{ kind: "directive", type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i5.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { kind: "component", type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { kind: "component", type: i7.UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { kind: "component", type: i8.FormOrganisationComponent, selector: "lib-form-organisation", inputs: ["currentOrg", "currentUser", "existing"], outputs: ["added"] }, { kind: "component", type: i9.DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: ["org", "currentOrg", "isSP"], outputs: ["orgChanged"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TimeDateToLocalStringPipe, name: "timeDateString" }, { kind: "pipe", type: i1.HashtagFromIdPipe, name: "hashtagFromID" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
332
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: UserComponent, decorators: [{
330
+ UserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i1.DomainService }, { token: i1.OrganisationService }, { token: i2.NgbModal }, { token: i3.TranslateService }, { token: i1.ProfileService }], target: i0.ɵɵFactoryTarget.Component });
331
+ UserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserComponent, selector: "lib-user", ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate }}:\r\n {{ mis.createdAt | timeDateString: \"day_time_zone\" | async }}\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\" >\r\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\r\n {{\"Users without missions\" | translate}}\r\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \r\n (click)=\"onToggleDetailUser(profile.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{profile.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"detailsUser==profile.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{profile.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"], dependencies: [{ kind: "directive", type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i5.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { kind: "component", type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { kind: "component", type: i7.UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { kind: "component", type: i8.FormOrganisationComponent, selector: "lib-form-organisation", inputs: ["currentOrg", "currentUser", "existing"], outputs: ["added"] }, { kind: "component", type: i9.DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: ["org", "currentOrg", "isSP"], outputs: ["orgChanged"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TimeDateToLocalStringPipe, name: "timeDateString" }, { kind: "pipe", type: i1.HashtagFromIdPipe, name: "hashtagFromID" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserComponent, decorators: [{
333
333
  type: Component,
334
- args: [{ selector: 'lib-user', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate }}:\r\n {{ mis.createdAt | timeDateString: \"day_time_zone\" | async }}\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\" >\r\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\r\n {{\"Users without missions\" | translate}}\r\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \r\n (click)=\"onToggleDetailUser(profile.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{profile.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"detailsUser==profile.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{profile.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:fit-content}\n"] }]
334
+ args: [{ selector: 'lib-user', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate }}:\r\n {{ mis.createdAt | timeDateString: \"day_time_zone\" | async }}\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\" >\r\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\r\n {{\"Users without missions\" | translate}}\r\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \r\n (click)=\"onToggleDetailUser(profile.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{profile.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"detailsUser==profile.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{profile.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"] }]
335
335
  }], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i1.DomainService }, { type: i1.OrganisationService }, { type: i2.NgbModal }, { type: i3.TranslateService }, { type: i1.ProfileService }]; } });
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUlILFVBQVUsRUFDVixxQkFBcUIsRUFNckIsYUFBYSxFQUViLFNBQVMsR0FDWixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBUXhFLE1BQU0sT0FBTyxhQUFhO0lBbUV0QixZQUNZLFdBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxZQUFzQixFQUN0QixTQUEyQixFQUMzQixjQUE4QjtRQU45QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBdkUxQyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsU0FBSSxHQUFHLEtBQUssQ0FB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Z0xNOzJGRHRKTyxhQUFhO2tCQUx6QixTQUFTOytCQUNJLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICBEb21haW4sXHJcbiAgICBEb21haW5TZXJ2aWNlLFxyXG4gICAgRG9tYWluVHlwZSxcclxuICAgIGZpbHRlclVuaXF1ZUFycmF5QnlJRCxcclxuICAgIE1pc3Npb24sXHJcbiAgICBNaXNzaW9uU2VydmljZSxcclxuICAgIE9yZ2FuaXNhdGlvbixcclxuICAgIE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgICBQcm9maWxlLFxyXG4gICAgUHJvZmlsZUVudGl0eSxcclxuICAgIFByb2ZpbGVTZXJ2aWNlLFxyXG4gICAgd2FpdFVudGlsLFxyXG59IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR3Vlc3RMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3Vlc3QtbGluay9ndWVzdC1saW5rLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi11c2VyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91c2VyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgdXNlcnM6IEFycmF5PE1pc3Npb24gJiB7IG5hbWU6IHN0cmluZzsgfT47XHJcblxyXG4gICAgZGV0YWlsc1VzZXIgPSAnLTEnO1xyXG5cclxuICAgIGRldGFpbHNPcmcgPSAnLTEnO1xyXG5cclxuICAgIHF1ZXJ5ID0gJyc7XHJcblxyXG4gICAgY3JlYXRlID0gZmFsc2U7XHJcblxyXG4gICAgZWRpdCA9IGZhbHNlO1xyXG5cclxuICAgIHdvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBjcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuXHJcbiAgICBpc0FkZGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICAgIGlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICAgIHVzZXJGb3JBZGRpbmdNaXNzaW9uOiBQcm9maWxlRW50aXR5O1xyXG5cclxuICAgIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBtZTogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgICBoaWRlTGlzdCA9IGZhbHNlO1xyXG5cclxuICAgIG9yZ3NVc2Vyc01pc3Npb25zOiBBcnJheTx7XHJcbiAgICAgICAgb3JnOiBPcmdhbmlzYXRpb247XHJcbiAgICAgICAgdXNlcnM6IEFycmF5PHtcclxuICAgICAgICAgICAgbWlzc2lvbnM6IE1pc3Npb25bXTtcclxuICAgICAgICAgICAgdXNlcjogUHJvZmlsZUVudGl0eTtcclxuICAgICAgICB9PjtcclxuICAgIH0+ID0gW107XHJcblxyXG4gICAgbWlzc2lvblRvRWRpdDogTWlzc2lvbjtcclxuXHJcbiAgICBpc1NQID0gZmFsc2U7XHJcblxyXG4gICAgaXNHdWlkZSA9IGZhbHNlO1xyXG5cclxuICAgIGNsaWVudHNTUDogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBwcmVzdGF0YWlyZUNsaWVudHM6IEFycmF5PHsgb3JnT3duZXI6IHN0cmluZzsgcHJlc3RhdGFpcmU6IHN0cmluZzsgfT4gPSBbXTtcclxuXHJcbiAgICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgICBhZGRUb09yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIG9yZ1NlbGVjdGVkRGV0YWlsczogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnM6IEFycmF5PHtcclxuICAgICAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuICAgICAgICB1c2VyczogQXJyYXk8e1xyXG4gICAgICAgICAgICBtaXNzaW9uczogTWlzc2lvbltdO1xyXG4gICAgICAgICAgICB1c2VyOiBQcm9maWxlRW50aXR5O1xyXG4gICAgICAgIH0+O1xyXG4gICAgfT47XHJcblxyXG4gICAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIHByb2ZpbGVzV2l0aG91dE1pc3Npb246IFByb2ZpbGVFbnRpdHlbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1pc3Npb25TZXJ2aWNlOiBNaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGRvbWFpblNlcnZpY2U6IERvbWFpblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBvcmdhbmlzYXRpb25TZXJ2aWNlOiBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcclxuICAgICkgeyB9XHJcblxyXG4gICAgLy8gQHRvZG8gbGlzdCBteSBvcmcgYW5kIHN1YiBvcmdzXHJcblxyXG5cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLmluaXRJbmZvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJlc2V0TGlzdCBmZXRjaGVzIGEgZnJlc2ggdXNlciBsaXN0IGZyb20gc2VydmVyXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlc2V0TGlzdCgpIHtcclxuICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zID0gW107XHJcbiAgICAgICAgbGV0IGFsbE1pc3Npb25zID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5pc1NQKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3Jnc1VzZXJzTWlzc2lvbnMgPSBhd2FpdCB0aGlzLmluaXRMaXN0Rm9yU1AoKTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zID0gdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzR3VpZGUpIHtcclxuICAgICAgICAgICAgLy8gZ3VpZGUgc2VlcyBvbmx5IGl0cyBvd24gb3JnYW5pc2F0aW9uXHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZ2FuaXNhdGlvbih0aGlzLmN1cnJlbnRPcmcuaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JkZXJlZE9yZ2FuaXNhdGlvbihcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZy5pZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T3JnTWlzc2lvbnMgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKHRoaXMuY3VycmVudE9yZy5pZCk7XHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5jdXJyZW50T3JnTWlzc2lvbnNdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWxsTWlzc2lvbnMgPSBhbGxNaXNzaW9ucy5maWx0ZXIoKG1pc3Npb24pID0+IG1pc3Npb24udXNlciAmJiAhbWlzc2lvbi51c2VyLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgYWxsTWlzc2lvbnMgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQoYWxsTWlzc2lvbnMpO1xyXG5cclxuICAgICAgICBpZiAoYWxsTWlzc2lvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3JncyA9IGFsbE1pc3Npb25zLm1hcCgobWlzKSA9PiBtaXMub3JnYW5pc2F0aW9uKTtcclxuICAgICAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9ucy5tYXAoKG1pcykgPT4gbWlzLnVzZXIpO1xyXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVPcmcgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQob3Jncyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKHByb2ZpbGVzKTtcclxuICAgICAgICAgICAgdW5pcXVlT3JnLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmdNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSB0aGlzLmdldFVzZXJzRm9yT3JnTWlzc2lvbnModW5pcXVlVXNlcnMsIG9yZ01pc3Npb25zKTtcclxuICAgICAgICAgICAgICAgIHVzZXJzID0gdXNlcnMuc29ydCgodXNlcikgPT4gKHVzZXIudXNlci5lbWFpbCA/IDAgOiAtMSkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yZyxcclxuICAgICAgICAgICAgICAgICAgICB1c2VycyxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLnB1c2gob2JqZWN0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHRoaXMub3Jnc1VzZXJzTWlzc2lvbnM7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdEluZm8oKSB7XHJcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKCgpID0+IHRoaXMudXNlclNlcnZpY2UuY3UgIT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5tZSA9IHRoaXMudXNlclNlcnZpY2UuY3U7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50T3JnID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5pc1NQID0gdGhpcy51c2VyU2VydmljZS5pc1NQQWRtaW4oKTtcclxuICAgICAgICB0aGlzLmlzR3VpZGUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUoKTtcclxuICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgIHRoaXMuc2V0RG9tYWlucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRMaXN0Rm9yU1AoKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcclxuICAgICAgICBsZXQgYWxsTWlzc2lvbnMgPSBbXTtcclxuICAgICAgICBsZXQgYWxsT3JncyA9IFtdO1xyXG4gICAgICAgIGFsbE9yZ3MgPSBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UubGlzdE9yZ2FuaXNhdGlvbnMoKTtcclxuICAgICAgICBhbGxPcmdzID0gYWxsT3Jncy5maWx0ZXIoKG8pID0+ICFvLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIGFsbE9yZ3MubWFwKGFzeW5jIChvcmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZy5pZFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5taXNzaW9uc107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9uc1xyXG4gICAgICAgICAgICAubWFwKChtaXMpID0+IG1pcy51c2VyKVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh1c2VyKSA9PiAhdXNlci5kZWxldGVkQXQpO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKFxyXG4gICAgICAgICAgICBwcm9maWxlcy5maWx0ZXIoKHByb2ZpbGUpID0+IHByb2ZpbGUgIT09IG51bGwpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhbGxPcmdzLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yZ01pc3Npb25zID0gYWxsTWlzc2lvbnMuZmlsdGVyKChtaXMpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtaXMub3JnYW5pc2F0aW9uSUQgPT09IG9yZy5pZDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3JnTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZ01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm9yZGVyZWRPcmdhbmlzYXRpb25JRCA9PT0gJzZlMjgyMDFmLTQ2NzktNGMyOS05ZDJkLThhMzI1ZjU3Y2VlOSdcclxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50c1NQLnB1c2gob3JnLmlkKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVzdGF0YWlyZUNsaWVudHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ093bmVyOiBvcmdNaXNzaW9uc1swXS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXN0YXRhaXJlOiBvcmcuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSB0aGlzLmdldFVzZXJzRm9yT3JnTWlzc2lvbnModW5pcXVlVXNlcnMsIG9yZ01pc3Npb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgb3JnLFxyXG4gICAgICAgICAgICAgICAgdXNlcnMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChvYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBnZXQgcHJvZmlsZXMgd2l0aG91dCBNaXNzaW9uc1xyXG4gICAgICAgIGxldCBwcm9maWxlc1dpdGhvdXRNaXNzaW9uID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5saXN0Q3VycmVudFByb2ZpbGVzKCk7XHJcbiAgICAgICAgcHJvZmlsZXNXaXRob3V0TWlzc2lvbiA9IHByb2ZpbGVzV2l0aG91dE1pc3Npb24uZmlsdGVyKChwcm9maWxlKSA9PiAhdW5pcXVlVXNlcnMubWFwKChwKSA9PiBwLmlkKS5pbmNsdWRlcyhwcm9maWxlLmlkKSk7XHJcbiAgICAgICAgaWYgKHByb2ZpbGVzV2l0aG91dE1pc3Npb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24gPSBbXTtcclxuICAgICAgICAgICAgcHJvZmlsZXNXaXRob3V0TWlzc2lvbi5mb3JFYWNoKChwcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFByb2ZpbGVFbnRpdHkocHJvZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24ucHVzaCh1c2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xyXG4gICAgZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyhcclxuICAgICAgICB1bmlxdWVVc2VyczogUHJvZmlsZVtdLFxyXG4gICAgICAgIG9yZ01pc3Npb25zOiBNaXNzaW9uW11cclxuICAgICk6IEFycmF5PHtcclxuICAgICAgICBtaXNzaW9uczogTWlzc2lvbltdO1xyXG4gICAgICAgIHVzZXI6IFByb2ZpbGVFbnRpdHk7XHJcbiAgICB9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlcnMgPSB1bmlxdWVVc2Vycy5tYXAoKHVzZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdXNlck1pc3Npb25zID0gb3JnTWlzc2lvbnMuZmlsdGVyKChtKSA9PiBtLnVzZXJJRCA9PT0gdXNlci5pZCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VyTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlclByb2ZpbGUgPSBuZXcgUHJvZmlsZUVudGl0eSh1c2VyKTtcclxuICAgICAgICAgICAgICAgIC8vIG9uY2Ugd2UgZ290IHRoZSB1c2VyIHdlIGNoZWNrIGZpbHRlciBvbmx5IGFjdGl2ZSBtaXNzaW9ucyAobm90IGRlbGV0ZWQpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVNaXNzaW9ucyA9IHVzZXJNaXNzaW9ucy5maWx0ZXIoKG1pcykgPT4gIW1pcy5kZWxldGVkQXQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBtaXNzaW9uczogYWN0aXZlTWlzc2lvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogdXNlclByb2ZpbGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1c2Vycy5maWx0ZXIoKHVzKSA9PiB1cyAhPT0gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0RG9tYWlucygpIHtcclxuICAgICAgICBjb25zdCBkb21haW5zID0gYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JPcmdFeGNsdWRpbmdUeXBlcyhcclxuICAgICAgICAgICAgW0RvbWFpblR5cGUuRkVBVFVSRSwgRG9tYWluVHlwZS5CT09LSU5HXSxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3JnLmlkXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmRvbWFpbnMgPSBkb21haW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogb25Ub2dnbGVEZXRhaWwgZm9sZHMvdW5mb2xkcyBkZXRhaWxzIGZvciBhIGdpdmVuIG9yZ2FuaXNhdGlvblxyXG4gICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIG9yZ2FuaXNhdGlvbiB0byBiZSB0b2dnbGVkXHJcbiAgICAgKi9cclxuICAgIG9uVG9nZ2xlRGV0YWlsT3JnKGluZGV4LCBvcmcpIHtcclxuICAgICAgICB0aGlzLmRldGFpbHNPcmcgPSBpbmRleCA9PT0gdGhpcy5kZXRhaWxzT3JnID8gJy0xJyA6IGluZGV4O1xyXG4gICAgICAgIHRoaXMub3JnU2VsZWN0ZWREZXRhaWxzID0gdGhpcy5kZXRhaWxzT3JnID09PSAnLTEnID8gbnVsbCA6IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBvblRvZ2dsZURldGFpbFVzZXIoaW5kZXgpIHtcclxuICAgICAgICB0aGlzLmRldGFpbHNVc2VyID0gaW5kZXggPT09IHRoaXMuZGV0YWlsc1VzZXIgPyAnLTEnIDogaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZGQob3JnOiBPcmdhbmlzYXRpb24pIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkVkaXQobTogTWlzc2lvbikge1xyXG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5taXNzaW9uVG9FZGl0ID0gbTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZEZvclVzZXIob3JnOiBPcmdhbmlzYXRpb24sIHVzZXI6IFByb2ZpbGVFbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy51c2VyRm9yQWRkaW5nTWlzc2lvbiA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZE9yZygpIHtcclxuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nT3JnID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBvcmdBZGRlZChpc0FkZGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNBZGRpbmdPcmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChpc0FkZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVzZXJBZGRlZChpc0FkZGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnVzZXJGb3JBZGRpbmdNaXNzaW9uID0gbnVsbDtcclxuICAgICAgICBpZiAoaXNBZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbk1pc3Npb25FZGl0ZWQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICAgICAgaWYgKG1pc3Npb24pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbk1pc3Npb25DcmVhdGVkKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSBudWxsO1xyXG4gICAgICAgIGlmIChtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlT3JVcGRhdGVNaXNzaW9uRm9yT3JnV2l0aFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbixcclxuICAgICAgICAgICAgICAgIG1pc3Npb24ub3JnYW5pc2F0aW9uSURcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9yZGVyZWRPcmcob3JnSUQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGxldCBuYW1lO1xyXG4gICAgICAgIHRoaXMucHJlc3RhdGFpcmVDbGllbnRzLm1hcChhc3luYyAocHJlc3RhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwcmVzdGEucHJlc3RhdGFpcmUgPT09IG9yZ0lEKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmcgPSB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3Qub3JnLmlkID09PSBwcmVzdGEub3JnT3duZXJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAob3JnLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gb3JnWzBdLm9yZy5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZG9tYWluSWRzVG9TdHJpbmdGb3JNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBuYW1lcyA9ICcnO1xyXG4gICAgICAgIGZvciAoY29uc3QgZG9tYWluSUQgb2YgbWlzc2lvbi5kb21haW5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZG9tYWlucy5maW5kKChkb20pID0+IGRvbS5pZCA9PT0gZG9tYWluSUQpO1xyXG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lcyA9IGAke25hbWVzfSAke2RvbWFpbi5uYW1lfSxgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lcy5zbGljZSgwLCAtMSk7IC8vIHRvIHJlbW92ZSBsYXN0IGNvbW1hXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25EZWxldGVNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnY29uZmlybS5kZWxldGVNaXNzaW9uJyk7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlVXNlcih1c2VyKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NvbmZpcm0uZGVsZXRlVXNlcicpO1xyXG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyTWlzc2lvbnMgPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zRnJvbVVzZXJJRChcclxuICAgICAgICAgICAgICAgIHVzZXIuaWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHVzZXJNaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHREZWxldGUgPSBbXTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJNaXNzaW9ucy5tYXAoYXN5bmMgKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbi5vcmRlcmVkT3JnYW5pc2F0aW9uSUQgPT09IHRoaXMuY3VycmVudE9yZy5pZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NQXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlZE1pc3Npb24gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZE1pc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREZWxldGUucHVzaChkZWxldGVkTWlzc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHREZWxldGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5UmVzdWx0c1NlYXJjaEJhcihyZXN1bHRzKSB7XHJcbiAgICAgICAgdGhpcy5vcmdTZWxlY3RlZERldGFpbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHJlc3VsdHMgfHwgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZEluRXhpc3RpbmdPcmcoKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0FkZGluZ1RvRXhpc3RpbmdPcmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBlbmN5cHRlZCBsaW5rIGFuZCBzZXRzIGl0IGZvciBndWVzdExpbmsgZm9yIFNwYWNlLlxyXG4gICAgICogQHBhcmFtIG1pc1xyXG4gICAgICovXHJcbiAgICBvblNldEZvclNoYXJlYWJsZUxpbmsodXNlcjogUHJvZmlsZUVudGl0eSwgbWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIGNvbnN0IG1vZGFsUmVmZXJlbmNlID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihHdWVzdExpbmtDb21wb25lbnQpO1xyXG4gICAgICAgIG1vZGFsUmVmZXJlbmNlLmNvbXBvbmVudEluc3RhbmNlLnVzZXJuYW1lID0gdXNlci5lbWFpbDtcclxuICAgICAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS5zcGFjZUlEID0gbWlzc2lvbi5zcGFjZUlEO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2xlYXJUb2tlbih1c2VyKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jbGVhclVzZXJUb2tlbih1c2VyLnVzZXIuaWQpO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2ZpcnN0VG9rZW5NZXNzYWdlJyk7XHJcbiAgICAgICAgY29uc3Qgc2Vjb25kTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3NlY29uZFRva2VuTWVzc2FnZScpO1xyXG4gICAgICAgIGFsZXJ0KGZpcnN0TWVzc2FnZSArIHVzZXIudXNlci5kaXNwbGF5TmFtZSArIHNlY29uZE1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZ05vU3BhY2UoZGF0YSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXRhYlwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXItZGFzaGJvYXJkLXRhYlwiPlxyXG4gICAgPGgzPnt7J1VzZXJzJyB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICAgIDwhLS0gPGFwcC1zZWFyY2gtYmFyICpuZ0lmPVwiIWhpZGVMaXN0XCIgW3NlYXJjaGFibGVdPVwib3Jnc1VzZXJzTWlzc2lvbnNcIiBvYmplY3RUeXBlPVwiVVNFUlwiXHJcbiAgICAgICAgKHNlYXJjaEV2ZW50KT1cImFwcGx5UmVzdWx0c1NlYXJjaEJhcigkZXZlbnQpXCI+XHJcbiAgICAgIDwvYXBwLXNlYXJjaC1iYXI+IC0tPlxyXG4gICAgPGhyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOCBjb2wtbGctNlwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1sLTAgbWItMlwiICpuZ0lmPVwiIWhpZGVMaXN0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhZGQtYnV0dG9uXCIgKm5nSWY9XCIhaXNHdWlkZVwiIChjbGljayk9XCJvbkFkZE9yZygpXCI+XHJcbiAgICAgICAgICB7eydBZGQgdXNlciB0byBuZXcgb3JnYW5pc2F0aW9uJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICA8bGliLWxvYWRlcj48L2xpYi1sb2FkZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWhpZGVMaXN0XCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgKm5nSWY9XCJmaWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLW9yZ2FuaXNhdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBvIG9mIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNlZSBkZXRhaWxzIGFuZCB1c2Vyc1wiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbE9yZyhvLm9yZy5pZCwgby5vcmcpXCI+XHJcbiAgICAgICAgICAgICAge3tvLm9yZy5uYW1lfX0gPHNtYWxsICpuZ0lmPVwiby5vcmcuaWQgPT0gY3VycmVudE9yZy5pZFwiPih7eydNeSBvcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJpc1NQICYmIGNsaWVudHNTUC5pbmNsdWRlcyhvLm9yZy5pZClcIj4oe3snQ2xpZW50IG9mIFNtYXJ0ZXJQbGFuJyB8IHRyYW5zbGF0ZX19KTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNTUCAmJiBnZXRPcmRlcmVkT3JnKG8ub3JnLmlkKVwiPih7eydDbGllbnQgb2YgJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICB7e2dldE9yZGVyZWRPcmcoby5vcmcuaWQpfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW2NvbmRpdGlvblNob3dpbmddPVwiZGV0YWlsc09yZz09by5vcmcuaWRcIiAgW25nQ2xhc3NdPVwiW2dldFN0cmluZ05vU3BhY2Uoby5vcmcubmFtZSldXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXNzaW9uc1wiICpuZ0lmPVwiZGV0YWlsc09yZz09by5vcmcuaWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cInVzZXItbmV3LWJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTMgbWItM1wiIChjbGljayk9XCJvbkFkZChvLm9yZylcIj57eydBZGQgdXNlcicgfFxyXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tdXNlci1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBhIG9mIG8udXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWxVc2VyKGEudXNlci5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2EudXNlci5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIiBbbmdDbGFzc109XCJbZ2V0U3RyaW5nTm9TcGFjZShhLnVzZXIuZGlzcGxheU5hbWUpXVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydFbWFpbCcgfCB0cmFuc2xhdGV9fToge3thLnVzZXIuZW1haWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tbmV3LWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihvLm9yZywgYS51c2VyKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25DbGVhclRva2VuKGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgVG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVVc2VyKGEudXNlcilcIj57eydEZWxldGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGEubWlzc2lvbnMubGVuZ3RoID4gMCA/ICgnQ3VycmVudCBNaXNzaW9ucycgfCB0cmFuc2xhdGUpIDogKCdObyBtaXNzaW9ucycgfCB0cmFuc2xhdGUpfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IG1pcyBvZiBhLm1pc3Npb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fToge3ttaXMuZGVzY3JpcHRpb259fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMudGVtcGxhdGVNaXNzaW9uSURcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0F0dGVuZGVlIG9mIHRvdXInIHwgdHJhbnNsYXRlfX06IHt7bWlzLnRlbXBsYXRlTWlzc2lvbi50aXRsZX19PC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fToge3sgbWlzLnJvbGUgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmhhc2h0YWdzICYmIG1pcy5oYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19OiA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBtaXMuaGFzaHRhZ3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGUgfX06IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXMubG9jYWxlID8gbWlzLmxvY2FsZSA6ICgnTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLmxldmVsfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J09yZGVyZWQgYnknIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLm9yZGVyZWRPcmdhbmlzYXRpb24ubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIm1pcy5kb21haW5zXCI+e3snRG9tYWlucycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21pcy5kb21haW5zID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXMpIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3BhY2UgPyBtaXMuc3BhY2UubmFtZSA6IFwiTm8gbG9jYXRpb25cIiB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWlzLnpvbmUgPyBtaXMuem9uZS5uYW1lIDogXCJBbGwgem9uZXMgYWxsb3dlZFwiIHwgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1N0YXJ0cycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3RhcnREYXRlVGltZSA/IChtaXMuc3RhcnREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LCB7eydFbmRzJyB8IHRyYW5zbGF0ZX19OiB7eyBtaXMuZW5kRGF0ZVRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1pcy5lbmREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydDcmVhdGVkJyB8IHRyYW5zbGF0ZSB9fTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1pcy5jcmVhdGVkQXQgIHwgdGltZURhdGVTdHJpbmc6IFwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS10ZXN0aWQ9XCJlZGl0LW1pc3Npb24tYnRuXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItMiBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXQobWlzKVwiPnt7J0VkaXQnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJtaXMucm9sZSA9PT0gJ1ZJU0lUT1InIHx8IG1pcy5yb2xlID09PSAnVklTSVRPUl9NVVNFVU0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTIgYWN0aW9uLWJ1dHRvbiBzaGFyZS12aXNpdG9yLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZXRGb3JTaGFyZWFibGVMaW5rKGEudXNlciwgbWlzKVwiPnt7J0dlbmVyYXRlIFNoYXJlYWJsZSBMaW5rJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlTWlzc2lvbihtaXMpXCI+e3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdJZj1cInByb2ZpbGVzV2l0aG91dE1pc3Npb24gJiYgcHJvZmlsZXNXaXRob3V0TWlzc2lvbi5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGZvbnQtd2VpZ2h0LWJvbGRcIlxyXG4gICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJTZWUgZGV0YWlsc1wiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbE9yZygnLTInLCBudWxsKVwiPlxyXG4gICAgICAgICAgICAgIHt7XCJVc2VycyB3aXRob3V0IG1pc3Npb25zXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzT3JnPT0nLTInXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXNzaW9uc1wiICpuZ0lmPVwiZGV0YWlsc09yZz09Jy0yJ1wiPlxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiIGRhdGEtdGVzdGlkPVwibWlzc2lvbi1vcmdhbmlzYXRpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgcHJvZmlsZSBvZiBwcm9maWxlc1dpdGhvdXRNaXNzaW9uXCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWxVc2VyKHByb2ZpbGUuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e3Byb2ZpbGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzVXNlcj09cHJvZmlsZS5pZFwiIFtuZ0NsYXNzXT1cIltnZXRTdHJpbmdOb1NwYWNlKHByb2ZpbGUuZGlzcGxheU5hbWUpXVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbHNVc2VyPT1wcm9maWxlLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snRW1haWwnIHwgdHJhbnNsYXRlfX06IHt7cHJvZmlsZS5lbWFpbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiIGRhdGEtdGVzdGlkPVwibWlzc2lvbi1uZXctYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihjdXJyZW50T3JnLCBwcm9maWxlKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVVzZXIocHJvZmlsZSlcIj57eydEZWxldGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVcIj5cclxuICAgICAgICA8bGliLXVzZXItbWlzc2lvbi1mb3JtIFthZGRUb09yZ2FuaXNhdGlvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZCk9XCJ1c2VyQWRkZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvbGliLXVzZXItbWlzc2lvbi1mb3JtPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cImVkaXRcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbbWlzc2lvblRvRWRpdF09XCJtaXNzaW9uVG9FZGl0XCIgW2N1cnJlbnRVc2VyT3JnYW5pc2F0aW9uXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25FZGl0ZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVGb3JFeGlzdGluZ1VzZXJcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiXHJcbiAgICAgICAgICBbdXNlckZvck1pc3Npb25JRF09XCJ1c2VyRm9yQWRkaW5nTWlzc2lvbi5pZFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25DcmVhdGVkKCRldmVudClcIj5cclxuICAgICAgICA8L2xpYi1mb3JtLW1pc3Npb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNBZGRpbmdPcmcgfHwgaXNBZGRpbmdUb0V4aXN0aW5nT3JnXCI+XHJcbiAgICAgICAgPGxpYi1mb3JtLW9yZ2FuaXNhdGlvbiBbY3VycmVudE9yZ109XCJjdXJyZW50T3JnXCIgW2N1cnJlbnRVc2VyXT1cIm1lXCIgW2V4aXN0aW5nXT1cImlzQWRkaW5nVG9FeGlzdGluZ09yZ1wiXHJcbiAgICAgICAgICAoYWRkZWQpPVwib3JnQWRkZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tb3JnYW5pc2F0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBjb2wtbGctNlwiICpuZ0lmPVwib3JnU2VsZWN0ZWREZXRhaWxzICYmICFpc0d1aWRlXCI+XHJcbiAgICAgIDxsaWItZGV0YWlsLW9yZ2FuaXNhdGlvbiBbb3JnXT1cIm9yZ1NlbGVjdGVkRGV0YWlsc1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAob3JnQ2hhbmdlZCk9J29yZ0FkZGVkKCRldmVudCknPjwvbGliLWRldGFpbC1vcmdhbmlzYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUlILFVBQVUsRUFDVixxQkFBcUIsRUFNckIsYUFBYSxFQUViLFNBQVMsR0FDWixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBUXhFLE1BQU0sT0FBTyxhQUFhO0lBbUV0QixZQUNZLFdBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxZQUFzQixFQUN0QixTQUEyQixFQUMzQixjQUE4QjtRQU45QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBdkUxQyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsU0FBSSxHQUFHLEtBQUssQ0FB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Z0xNOzRGRHRKTyxhQUFhO2tCQUx6QixTQUFTOytCQUNJLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICBEb21haW4sXHJcbiAgICBEb21haW5TZXJ2aWNlLFxyXG4gICAgRG9tYWluVHlwZSxcclxuICAgIGZpbHRlclVuaXF1ZUFycmF5QnlJRCxcclxuICAgIE1pc3Npb24sXHJcbiAgICBNaXNzaW9uU2VydmljZSxcclxuICAgIE9yZ2FuaXNhdGlvbixcclxuICAgIE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgICBQcm9maWxlLFxyXG4gICAgUHJvZmlsZUVudGl0eSxcclxuICAgIFByb2ZpbGVTZXJ2aWNlLFxyXG4gICAgd2FpdFVudGlsLFxyXG59IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR3Vlc3RMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3Vlc3QtbGluay9ndWVzdC1saW5rLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi11c2VyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91c2VyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgdXNlcnM6IEFycmF5PE1pc3Npb24gJiB7IG5hbWU6IHN0cmluZzsgfT47XHJcblxyXG4gICAgZGV0YWlsc1VzZXIgPSAnLTEnO1xyXG5cclxuICAgIGRldGFpbHNPcmcgPSAnLTEnO1xyXG5cclxuICAgIHF1ZXJ5ID0gJyc7XHJcblxyXG4gICAgY3JlYXRlID0gZmFsc2U7XHJcblxyXG4gICAgZWRpdCA9IGZhbHNlO1xyXG5cclxuICAgIHdvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBjcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuXHJcbiAgICBpc0FkZGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICAgIGlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICAgIHVzZXJGb3JBZGRpbmdNaXNzaW9uOiBQcm9maWxlRW50aXR5O1xyXG5cclxuICAgIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBtZTogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgICBoaWRlTGlzdCA9IGZhbHNlO1xyXG5cclxuICAgIG9yZ3NVc2Vyc01pc3Npb25zOiBBcnJheTx7XHJcbiAgICAgICAgb3JnOiBPcmdhbmlzYXRpb247XHJcbiAgICAgICAgdXNlcnM6IEFycmF5PHtcclxuICAgICAgICAgICAgbWlzc2lvbnM6IE1pc3Npb25bXTtcclxuICAgICAgICAgICAgdXNlcjogUHJvZmlsZUVudGl0eTtcclxuICAgICAgICB9PjtcclxuICAgIH0+ID0gW107XHJcblxyXG4gICAgbWlzc2lvblRvRWRpdDogTWlzc2lvbjtcclxuXHJcbiAgICBpc1NQID0gZmFsc2U7XHJcblxyXG4gICAgaXNHdWlkZSA9IGZhbHNlO1xyXG5cclxuICAgIGNsaWVudHNTUDogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBwcmVzdGF0YWlyZUNsaWVudHM6IEFycmF5PHsgb3JnT3duZXI6IHN0cmluZzsgcHJlc3RhdGFpcmU6IHN0cmluZzsgfT4gPSBbXTtcclxuXHJcbiAgICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgICBhZGRUb09yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIG9yZ1NlbGVjdGVkRGV0YWlsczogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnM6IEFycmF5PHtcclxuICAgICAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuICAgICAgICB1c2VyczogQXJyYXk8e1xyXG4gICAgICAgICAgICBtaXNzaW9uczogTWlzc2lvbltdO1xyXG4gICAgICAgICAgICB1c2VyOiBQcm9maWxlRW50aXR5O1xyXG4gICAgICAgIH0+O1xyXG4gICAgfT47XHJcblxyXG4gICAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIHByb2ZpbGVzV2l0aG91dE1pc3Npb246IFByb2ZpbGVFbnRpdHlbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1pc3Npb25TZXJ2aWNlOiBNaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGRvbWFpblNlcnZpY2U6IERvbWFpblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBvcmdhbmlzYXRpb25TZXJ2aWNlOiBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcclxuICAgICkgeyB9XHJcblxyXG4gICAgLy8gQHRvZG8gbGlzdCBteSBvcmcgYW5kIHN1YiBvcmdzXHJcblxyXG5cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLmluaXRJbmZvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJlc2V0TGlzdCBmZXRjaGVzIGEgZnJlc2ggdXNlciBsaXN0IGZyb20gc2VydmVyXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlc2V0TGlzdCgpIHtcclxuICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zID0gW107XHJcbiAgICAgICAgbGV0IGFsbE1pc3Npb25zID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5pc1NQKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3Jnc1VzZXJzTWlzc2lvbnMgPSBhd2FpdCB0aGlzLmluaXRMaXN0Rm9yU1AoKTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zID0gdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzR3VpZGUpIHtcclxuICAgICAgICAgICAgLy8gZ3VpZGUgc2VlcyBvbmx5IGl0cyBvd24gb3JnYW5pc2F0aW9uXHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZ2FuaXNhdGlvbih0aGlzLmN1cnJlbnRPcmcuaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JkZXJlZE9yZ2FuaXNhdGlvbihcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZy5pZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T3JnTWlzc2lvbnMgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKHRoaXMuY3VycmVudE9yZy5pZCk7XHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5jdXJyZW50T3JnTWlzc2lvbnNdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWxsTWlzc2lvbnMgPSBhbGxNaXNzaW9ucy5maWx0ZXIoKG1pc3Npb24pID0+IG1pc3Npb24udXNlciAmJiAhbWlzc2lvbi51c2VyLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgYWxsTWlzc2lvbnMgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQoYWxsTWlzc2lvbnMpO1xyXG5cclxuICAgICAgICBpZiAoYWxsTWlzc2lvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3JncyA9IGFsbE1pc3Npb25zLm1hcCgobWlzKSA9PiBtaXMub3JnYW5pc2F0aW9uKTtcclxuICAgICAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9ucy5tYXAoKG1pcykgPT4gbWlzLnVzZXIpO1xyXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVPcmcgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQob3Jncyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKHByb2ZpbGVzKTtcclxuICAgICAgICAgICAgdW5pcXVlT3JnLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmdNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSB0aGlzLmdldFVzZXJzRm9yT3JnTWlzc2lvbnModW5pcXVlVXNlcnMsIG9yZ01pc3Npb25zKTtcclxuICAgICAgICAgICAgICAgIHVzZXJzID0gdXNlcnMuc29ydCgodXNlcikgPT4gKHVzZXIudXNlci5lbWFpbCA/IDAgOiAtMSkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yZyxcclxuICAgICAgICAgICAgICAgICAgICB1c2VycyxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLnB1c2gob2JqZWN0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHRoaXMub3Jnc1VzZXJzTWlzc2lvbnM7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdEluZm8oKSB7XHJcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKCgpID0+IHRoaXMudXNlclNlcnZpY2UuY3UgIT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5tZSA9IHRoaXMudXNlclNlcnZpY2UuY3U7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50T3JnID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5pc1NQID0gdGhpcy51c2VyU2VydmljZS5pc1NQQWRtaW4oKTtcclxuICAgICAgICB0aGlzLmlzR3VpZGUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUoKTtcclxuICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgIHRoaXMuc2V0RG9tYWlucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRMaXN0Rm9yU1AoKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcclxuICAgICAgICBsZXQgYWxsTWlzc2lvbnMgPSBbXTtcclxuICAgICAgICBsZXQgYWxsT3JncyA9IFtdO1xyXG4gICAgICAgIGFsbE9yZ3MgPSBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UubGlzdE9yZ2FuaXNhdGlvbnMoKTtcclxuICAgICAgICBhbGxPcmdzID0gYWxsT3Jncy5maWx0ZXIoKG8pID0+ICFvLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIGFsbE9yZ3MubWFwKGFzeW5jIChvcmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZy5pZFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5taXNzaW9uc107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9uc1xyXG4gICAgICAgICAgICAubWFwKChtaXMpID0+IG1pcy51c2VyKVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh1c2VyKSA9PiAhdXNlci5kZWxldGVkQXQpO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKFxyXG4gICAgICAgICAgICBwcm9maWxlcy5maWx0ZXIoKHByb2ZpbGUpID0+IHByb2ZpbGUgIT09IG51bGwpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhbGxPcmdzLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yZ01pc3Npb25zID0gYWxsTWlzc2lvbnMuZmlsdGVyKChtaXMpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtaXMub3JnYW5pc2F0aW9uSUQgPT09IG9yZy5pZDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3JnTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZ01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm9yZGVyZWRPcmdhbmlzYXRpb25JRCA9PT0gJzZlMjgyMDFmLTQ2NzktNGMyOS05ZDJkLThhMzI1ZjU3Y2VlOSdcclxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50c1NQLnB1c2gob3JnLmlkKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVzdGF0YWlyZUNsaWVudHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ093bmVyOiBvcmdNaXNzaW9uc1swXS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXN0YXRhaXJlOiBvcmcuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSB0aGlzLmdldFVzZXJzRm9yT3JnTWlzc2lvbnModW5pcXVlVXNlcnMsIG9yZ01pc3Npb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgb3JnLFxyXG4gICAgICAgICAgICAgICAgdXNlcnMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChvYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBnZXQgcHJvZmlsZXMgd2l0aG91dCBNaXNzaW9uc1xyXG4gICAgICAgIGxldCBwcm9maWxlc1dpdGhvdXRNaXNzaW9uID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5saXN0Q3VycmVudFByb2ZpbGVzKCk7XHJcbiAgICAgICAgcHJvZmlsZXNXaXRob3V0TWlzc2lvbiA9IHByb2ZpbGVzV2l0aG91dE1pc3Npb24uZmlsdGVyKChwcm9maWxlKSA9PiAhdW5pcXVlVXNlcnMubWFwKChwKSA9PiBwLmlkKS5pbmNsdWRlcyhwcm9maWxlLmlkKSk7XHJcbiAgICAgICAgaWYgKHByb2ZpbGVzV2l0aG91dE1pc3Npb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24gPSBbXTtcclxuICAgICAgICAgICAgcHJvZmlsZXNXaXRob3V0TWlzc2lvbi5mb3JFYWNoKChwcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFByb2ZpbGVFbnRpdHkocHJvZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24ucHVzaCh1c2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xyXG4gICAgZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyhcclxuICAgICAgICB1bmlxdWVVc2VyczogUHJvZmlsZVtdLFxyXG4gICAgICAgIG9yZ01pc3Npb25zOiBNaXNzaW9uW11cclxuICAgICk6IEFycmF5PHtcclxuICAgICAgICBtaXNzaW9uczogTWlzc2lvbltdO1xyXG4gICAgICAgIHVzZXI6IFByb2ZpbGVFbnRpdHk7XHJcbiAgICB9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlcnMgPSB1bmlxdWVVc2Vycy5tYXAoKHVzZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdXNlck1pc3Npb25zID0gb3JnTWlzc2lvbnMuZmlsdGVyKChtKSA9PiBtLnVzZXJJRCA9PT0gdXNlci5pZCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VyTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlclByb2ZpbGUgPSBuZXcgUHJvZmlsZUVudGl0eSh1c2VyKTtcclxuICAgICAgICAgICAgICAgIC8vIG9uY2Ugd2UgZ290IHRoZSB1c2VyIHdlIGNoZWNrIGZpbHRlciBvbmx5IGFjdGl2ZSBtaXNzaW9ucyAobm90IGRlbGV0ZWQpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVNaXNzaW9ucyA9IHVzZXJNaXNzaW9ucy5maWx0ZXIoKG1pcykgPT4gIW1pcy5kZWxldGVkQXQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBtaXNzaW9uczogYWN0aXZlTWlzc2lvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogdXNlclByb2ZpbGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1c2Vycy5maWx0ZXIoKHVzKSA9PiB1cyAhPT0gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0RG9tYWlucygpIHtcclxuICAgICAgICBjb25zdCBkb21haW5zID0gYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JPcmdFeGNsdWRpbmdUeXBlcyhcclxuICAgICAgICAgICAgW0RvbWFpblR5cGUuRkVBVFVSRSwgRG9tYWluVHlwZS5CT09LSU5HXSxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3JnLmlkXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmRvbWFpbnMgPSBkb21haW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogb25Ub2dnbGVEZXRhaWwgZm9sZHMvdW5mb2xkcyBkZXRhaWxzIGZvciBhIGdpdmVuIG9yZ2FuaXNhdGlvblxyXG4gICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIG9yZ2FuaXNhdGlvbiB0byBiZSB0b2dnbGVkXHJcbiAgICAgKi9cclxuICAgIG9uVG9nZ2xlRGV0YWlsT3JnKGluZGV4LCBvcmcpIHtcclxuICAgICAgICB0aGlzLmRldGFpbHNPcmcgPSBpbmRleCA9PT0gdGhpcy5kZXRhaWxzT3JnID8gJy0xJyA6IGluZGV4O1xyXG4gICAgICAgIHRoaXMub3JnU2VsZWN0ZWREZXRhaWxzID0gdGhpcy5kZXRhaWxzT3JnID09PSAnLTEnID8gbnVsbCA6IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBvblRvZ2dsZURldGFpbFVzZXIoaW5kZXgpIHtcclxuICAgICAgICB0aGlzLmRldGFpbHNVc2VyID0gaW5kZXggPT09IHRoaXMuZGV0YWlsc1VzZXIgPyAnLTEnIDogaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZGQob3JnOiBPcmdhbmlzYXRpb24pIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkVkaXQobTogTWlzc2lvbikge1xyXG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5taXNzaW9uVG9FZGl0ID0gbTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZEZvclVzZXIob3JnOiBPcmdhbmlzYXRpb24sIHVzZXI6IFByb2ZpbGVFbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy51c2VyRm9yQWRkaW5nTWlzc2lvbiA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZE9yZygpIHtcclxuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nT3JnID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBvcmdBZGRlZChpc0FkZGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNBZGRpbmdPcmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChpc0FkZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVzZXJBZGRlZChpc0FkZGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnVzZXJGb3JBZGRpbmdNaXNzaW9uID0gbnVsbDtcclxuICAgICAgICBpZiAoaXNBZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbk1pc3Npb25FZGl0ZWQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICAgICAgaWYgKG1pc3Npb24pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbk1pc3Npb25DcmVhdGVkKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSBudWxsO1xyXG4gICAgICAgIGlmIChtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlT3JVcGRhdGVNaXNzaW9uRm9yT3JnV2l0aFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbixcclxuICAgICAgICAgICAgICAgIG1pc3Npb24ub3JnYW5pc2F0aW9uSURcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9yZGVyZWRPcmcob3JnSUQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGxldCBuYW1lO1xyXG4gICAgICAgIHRoaXMucHJlc3RhdGFpcmVDbGllbnRzLm1hcChhc3luYyAocHJlc3RhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwcmVzdGEucHJlc3RhdGFpcmUgPT09IG9yZ0lEKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmcgPSB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3Qub3JnLmlkID09PSBwcmVzdGEub3JnT3duZXJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAob3JnLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gb3JnWzBdLm9yZy5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZG9tYWluSWRzVG9TdHJpbmdGb3JNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBuYW1lcyA9ICcnO1xyXG4gICAgICAgIGZvciAoY29uc3QgZG9tYWluSUQgb2YgbWlzc2lvbi5kb21haW5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZG9tYWlucy5maW5kKChkb20pID0+IGRvbS5pZCA9PT0gZG9tYWluSUQpO1xyXG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lcyA9IGAke25hbWVzfSAke2RvbWFpbi5uYW1lfSxgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lcy5zbGljZSgwLCAtMSk7IC8vIHRvIHJlbW92ZSBsYXN0IGNvbW1hXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25EZWxldGVNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnY29uZmlybS5kZWxldGVNaXNzaW9uJyk7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlVXNlcih1c2VyKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NvbmZpcm0uZGVsZXRlVXNlcicpO1xyXG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyTWlzc2lvbnMgPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zRnJvbVVzZXJJRChcclxuICAgICAgICAgICAgICAgIHVzZXIuaWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHVzZXJNaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHREZWxldGUgPSBbXTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJNaXNzaW9ucy5tYXAoYXN5bmMgKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbi5vcmRlcmVkT3JnYW5pc2F0aW9uSUQgPT09IHRoaXMuY3VycmVudE9yZy5pZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NQXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlZE1pc3Npb24gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZE1pc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREZWxldGUucHVzaChkZWxldGVkTWlzc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHREZWxldGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5UmVzdWx0c1NlYXJjaEJhcihyZXN1bHRzKSB7XHJcbiAgICAgICAgdGhpcy5vcmdTZWxlY3RlZERldGFpbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHJlc3VsdHMgfHwgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZEluRXhpc3RpbmdPcmcoKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0FkZGluZ1RvRXhpc3RpbmdPcmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBlbmN5cHRlZCBsaW5rIGFuZCBzZXRzIGl0IGZvciBndWVzdExpbmsgZm9yIFNwYWNlLlxyXG4gICAgICogQHBhcmFtIG1pc1xyXG4gICAgICovXHJcbiAgICBvblNldEZvclNoYXJlYWJsZUxpbmsodXNlcjogUHJvZmlsZUVudGl0eSwgbWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIGNvbnN0IG1vZGFsUmVmZXJlbmNlID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihHdWVzdExpbmtDb21wb25lbnQpO1xyXG4gICAgICAgIG1vZGFsUmVmZXJlbmNlLmNvbXBvbmVudEluc3RhbmNlLnVzZXJuYW1lID0gdXNlci5lbWFpbDtcclxuICAgICAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS5zcGFjZUlEID0gbWlzc2lvbi5zcGFjZUlEO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2xlYXJUb2tlbih1c2VyKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jbGVhclVzZXJUb2tlbih1c2VyLnVzZXIuaWQpO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2ZpcnN0VG9rZW5NZXNzYWdlJyk7XHJcbiAgICAgICAgY29uc3Qgc2Vjb25kTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3NlY29uZFRva2VuTWVzc2FnZScpO1xyXG4gICAgICAgIGFsZXJ0KGZpcnN0TWVzc2FnZSArIHVzZXIudXNlci5kaXNwbGF5TmFtZSArIHNlY29uZE1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZ05vU3BhY2UoZGF0YSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXRhYlwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXItZGFzaGJvYXJkLXRhYlwiPlxyXG4gICAgPGgzPnt7J1VzZXJzJyB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICAgIDwhLS0gPGFwcC1zZWFyY2gtYmFyICpuZ0lmPVwiIWhpZGVMaXN0XCIgW3NlYXJjaGFibGVdPVwib3Jnc1VzZXJzTWlzc2lvbnNcIiBvYmplY3RUeXBlPVwiVVNFUlwiXHJcbiAgICAgICAgKHNlYXJjaEV2ZW50KT1cImFwcGx5UmVzdWx0c1NlYXJjaEJhcigkZXZlbnQpXCI+XHJcbiAgICAgIDwvYXBwLXNlYXJjaC1iYXI+IC0tPlxyXG4gICAgPGhyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOCBjb2wtbGctNlwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1sLTAgbWItMlwiICpuZ0lmPVwiIWhpZGVMaXN0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhZGQtYnV0dG9uXCIgKm5nSWY9XCIhaXNHdWlkZVwiIChjbGljayk9XCJvbkFkZE9yZygpXCI+XHJcbiAgICAgICAgICB7eydBZGQgdXNlciB0byBuZXcgb3JnYW5pc2F0aW9uJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICA8bGliLWxvYWRlcj48L2xpYi1sb2FkZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWhpZGVMaXN0XCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgKm5nSWY9XCJmaWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLW9yZ2FuaXNhdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBvIG9mIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNlZSBkZXRhaWxzIGFuZCB1c2Vyc1wiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbE9yZyhvLm9yZy5pZCwgby5vcmcpXCI+XHJcbiAgICAgICAgICAgICAge3tvLm9yZy5uYW1lfX0gPHNtYWxsICpuZ0lmPVwiby5vcmcuaWQgPT0gY3VycmVudE9yZy5pZFwiPih7eydNeSBvcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJpc1NQICYmIGNsaWVudHNTUC5pbmNsdWRlcyhvLm9yZy5pZClcIj4oe3snQ2xpZW50IG9mIFNtYXJ0ZXJQbGFuJyB8IHRyYW5zbGF0ZX19KTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNTUCAmJiBnZXRPcmRlcmVkT3JnKG8ub3JnLmlkKVwiPih7eydDbGllbnQgb2YgJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICB7e2dldE9yZGVyZWRPcmcoby5vcmcuaWQpfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW2NvbmRpdGlvblNob3dpbmddPVwiZGV0YWlsc09yZz09by5vcmcuaWRcIiAgW25nQ2xhc3NdPVwiW2dldFN0cmluZ05vU3BhY2Uoby5vcmcubmFtZSldXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXNzaW9uc1wiICpuZ0lmPVwiZGV0YWlsc09yZz09by5vcmcuaWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cInVzZXItbmV3LWJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTMgbWItM1wiIChjbGljayk9XCJvbkFkZChvLm9yZylcIj57eydBZGQgdXNlcicgfFxyXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tdXNlci1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBhIG9mIG8udXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWxVc2VyKGEudXNlci5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2EudXNlci5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIiBbbmdDbGFzc109XCJbZ2V0U3RyaW5nTm9TcGFjZShhLnVzZXIuZGlzcGxheU5hbWUpXVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydFbWFpbCcgfCB0cmFuc2xhdGV9fToge3thLnVzZXIuZW1haWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tbmV3LWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihvLm9yZywgYS51c2VyKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25DbGVhclRva2VuKGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgVG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVVc2VyKGEudXNlcilcIj57eydEZWxldGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGEubWlzc2lvbnMubGVuZ3RoID4gMCA/ICgnQ3VycmVudCBNaXNzaW9ucycgfCB0cmFuc2xhdGUpIDogKCdObyBtaXNzaW9ucycgfCB0cmFuc2xhdGUpfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IG1pcyBvZiBhLm1pc3Npb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fToge3ttaXMuZGVzY3JpcHRpb259fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMudGVtcGxhdGVNaXNzaW9uSURcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0F0dGVuZGVlIG9mIHRvdXInIHwgdHJhbnNsYXRlfX06IHt7bWlzLnRlbXBsYXRlTWlzc2lvbi50aXRsZX19PC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fToge3sgbWlzLnJvbGUgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmhhc2h0YWdzICYmIG1pcy5oYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19OiA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBtaXMuaGFzaHRhZ3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGUgfX06IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXMubG9jYWxlID8gbWlzLmxvY2FsZSA6ICgnTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLmxldmVsfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J09yZGVyZWQgYnknIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLm9yZGVyZWRPcmdhbmlzYXRpb24ubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIm1pcy5kb21haW5zXCI+e3snRG9tYWlucycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21pcy5kb21haW5zID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXMpIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3BhY2UgPyBtaXMuc3BhY2UubmFtZSA6IFwiTm8gbG9jYXRpb25cIiB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWlzLnpvbmUgPyBtaXMuem9uZS5uYW1lIDogXCJBbGwgem9uZXMgYWxsb3dlZFwiIHwgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1N0YXJ0cycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3RhcnREYXRlVGltZSA/IChtaXMuc3RhcnREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LCB7eydFbmRzJyB8IHRyYW5zbGF0ZX19OiB7eyBtaXMuZW5kRGF0ZVRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1pcy5lbmREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydDcmVhdGVkJyB8IHRyYW5zbGF0ZSB9fTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1pcy5jcmVhdGVkQXQgIHwgdGltZURhdGVTdHJpbmc6IFwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS10ZXN0aWQ9XCJlZGl0LW1pc3Npb24tYnRuXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItMiBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXQobWlzKVwiPnt7J0VkaXQnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJtaXMucm9sZSA9PT0gJ1ZJU0lUT1InIHx8IG1pcy5yb2xlID09PSAnVklTSVRPUl9NVVNFVU0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTIgYWN0aW9uLWJ1dHRvbiBzaGFyZS12aXNpdG9yLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZXRGb3JTaGFyZWFibGVMaW5rKGEudXNlciwgbWlzKVwiPnt7J0dlbmVyYXRlIFNoYXJlYWJsZSBMaW5rJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlTWlzc2lvbihtaXMpXCI+e3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdJZj1cInByb2ZpbGVzV2l0aG91dE1pc3Npb24gJiYgcHJvZmlsZXNXaXRob3V0TWlzc2lvbi5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGZvbnQtd2VpZ2h0LWJvbGRcIlxyXG4gICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJTZWUgZGV0YWlsc1wiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbE9yZygnLTInLCBudWxsKVwiPlxyXG4gICAgICAgICAgICAgIHt7XCJVc2VycyB3aXRob3V0IG1pc3Npb25zXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzT3JnPT0nLTInXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXNzaW9uc1wiICpuZ0lmPVwiZGV0YWlsc09yZz09Jy0yJ1wiPlxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiIGRhdGEtdGVzdGlkPVwibWlzc2lvbi1vcmdhbmlzYXRpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgcHJvZmlsZSBvZiBwcm9maWxlc1dpdGhvdXRNaXNzaW9uXCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWxVc2VyKHByb2ZpbGUuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e3Byb2ZpbGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzVXNlcj09cHJvZmlsZS5pZFwiIFtuZ0NsYXNzXT1cIltnZXRTdHJpbmdOb1NwYWNlKHByb2ZpbGUuZGlzcGxheU5hbWUpXVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbHNVc2VyPT1wcm9maWxlLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snRW1haWwnIHwgdHJhbnNsYXRlfX06IHt7cHJvZmlsZS5lbWFpbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiIGRhdGEtdGVzdGlkPVwibWlzc2lvbi1uZXctYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihjdXJyZW50T3JnLCBwcm9maWxlKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVVzZXIocHJvZmlsZSlcIj57eydEZWxldGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVcIj5cclxuICAgICAgICA8bGliLXVzZXItbWlzc2lvbi1mb3JtIFthZGRUb09yZ2FuaXNhdGlvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZCk9XCJ1c2VyQWRkZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvbGliLXVzZXItbWlzc2lvbi1mb3JtPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cImVkaXRcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbbWlzc2lvblRvRWRpdF09XCJtaXNzaW9uVG9FZGl0XCIgW2N1cnJlbnRVc2VyT3JnYW5pc2F0aW9uXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25FZGl0ZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVGb3JFeGlzdGluZ1VzZXJcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiXHJcbiAgICAgICAgICBbdXNlckZvck1pc3Npb25JRF09XCJ1c2VyRm9yQWRkaW5nTWlzc2lvbi5pZFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25DcmVhdGVkKCRldmVudClcIj5cclxuICAgICAgICA8L2xpYi1mb3JtLW1pc3Npb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNBZGRpbmdPcmcgfHwgaXNBZGRpbmdUb0V4aXN0aW5nT3JnXCI+XHJcbiAgICAgICAgPGxpYi1mb3JtLW9yZ2FuaXNhdGlvbiBbY3VycmVudE9yZ109XCJjdXJyZW50T3JnXCIgW2N1cnJlbnRVc2VyXT1cIm1lXCIgW2V4aXN0aW5nXT1cImlzQWRkaW5nVG9FeGlzdGluZ09yZ1wiXHJcbiAgICAgICAgICAoYWRkZWQpPVwib3JnQWRkZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tb3JnYW5pc2F0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBjb2wtbGctNlwiICpuZ0lmPVwib3JnU2VsZWN0ZWREZXRhaWxzICYmICFpc0d1aWRlXCI+XHJcbiAgICAgIDxsaWItZGV0YWlsLW9yZ2FuaXNhdGlvbiBbb3JnXT1cIm9yZ1NlbGVjdGVkRGV0YWlsc1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAob3JnQ2hhbmdlZCk9J29yZ0FkZGVkKCRldmVudCknPjwvbGliLWRldGFpbC1vcmdhbmlzYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19