@smarterplan/ngx-smarterplan-admin 0.1.27
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.
- package/README.md +24 -0
- package/esm2020/lib/admin/admin.component.mjs +33 -0
- package/esm2020/lib/chevron/chevron.component.mjs +19 -0
- package/esm2020/lib/guest-link/guest-link.component.mjs +62 -0
- package/esm2020/lib/guide.guard.mjs +25 -0
- package/esm2020/lib/name-from-id.pipe.mjs +29 -0
- package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +47 -0
- package/esm2020/lib/ngx-smarterplan-admin.module.mjs +90 -0
- package/esm2020/lib/ngx-smarterplan-admin.service.mjs +14 -0
- package/esm2020/lib/organisation/organisation.component.mjs +166 -0
- package/esm2020/lib/sp-admin.guard.mjs +31 -0
- package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +160 -0
- package/esm2020/lib/user/form-mission/form-mission.component.mjs +205 -0
- package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +125 -0
- package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +106 -0
- package/esm2020/lib/user/user.component.mjs +325 -0
- package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +108 -0
- package/esm2020/lib/visitor/template/template.component.mjs +219 -0
- package/esm2020/lib/visitor/visitor.component.mjs +284 -0
- package/esm2020/public-api.mjs +6 -0
- package/esm2020/smarterplan-ngx-smarterplan-admin.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +2026 -0
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs +1921 -0
- package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +1 -0
- package/lib/admin/admin.component.d.ts +13 -0
- package/lib/chevron/chevron.component.d.ts +9 -0
- package/lib/guest-link/guest-link.component.d.ts +20 -0
- package/lib/guide.guard.d.ts +11 -0
- package/lib/name-from-id.pipe.d.ts +11 -0
- package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -0
- package/lib/ngx-smarterplan-admin.module.d.ts +26 -0
- package/lib/ngx-smarterplan-admin.service.d.ts +6 -0
- package/lib/organisation/organisation.component.d.ts +53 -0
- package/lib/sp-admin.guard.d.ts +12 -0
- package/lib/user/detail-organisation/detail-organisation.component.d.ts +39 -0
- package/lib/user/form-mission/form-mission.component.d.ts +54 -0
- package/lib/user/form-organisation/form-organisation.component.d.ts +32 -0
- package/lib/user/user-mission-form/user-mission-form.component.d.ts +28 -0
- package/lib/user/user.component.d.ts +100 -0
- package/lib/visitor/create-batch/create-batch.component.d.ts +23 -0
- package/lib/visitor/template/template.component.d.ts +52 -0
- package/lib/visitor/visitor.component.d.ts +65 -0
- package/package.json +39 -0
- package/public-api.d.ts +2 -0
- package/smarterplan-ngx-smarterplan-admin.d.ts +5 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/forms";
|
|
5
|
+
import * as i2 from "ngx-smarterplan-core";
|
|
6
|
+
import * as i3 from "@ngx-translate/core";
|
|
7
|
+
import * as i4 from "../form-mission/form-mission.component";
|
|
8
|
+
import * as i5 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i6 from "@angular/common";
|
|
10
|
+
export class UserMissionFormComponent {
|
|
11
|
+
constructor(fb, userService, translate) {
|
|
12
|
+
this.fb = fb;
|
|
13
|
+
this.userService = userService;
|
|
14
|
+
this.translate = translate;
|
|
15
|
+
this.createForExistingUser = false;
|
|
16
|
+
this.added = new EventEmitter();
|
|
17
|
+
this.working = false;
|
|
18
|
+
}
|
|
19
|
+
ngOnInit() {
|
|
20
|
+
this.onAddNewUserMissionToOrg();
|
|
21
|
+
}
|
|
22
|
+
async onAddNewUserMissionToOrg() {
|
|
23
|
+
this.form = this.fb.group({
|
|
24
|
+
email: [null, [Validators.required]],
|
|
25
|
+
lastName: [""],
|
|
26
|
+
firstName: [""],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
onCancel() {
|
|
30
|
+
this.added.emit(false);
|
|
31
|
+
}
|
|
32
|
+
get email() {
|
|
33
|
+
return this.form.get("email");
|
|
34
|
+
}
|
|
35
|
+
async onSubmit() {
|
|
36
|
+
this.working = true;
|
|
37
|
+
let p;
|
|
38
|
+
try {
|
|
39
|
+
const formValue = this.form.value;
|
|
40
|
+
p = await this.userService.profileForMail(formValue.email);
|
|
41
|
+
if (p) {
|
|
42
|
+
alert("User with this email exists already!");
|
|
43
|
+
this.working = false;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const profile = await this.userService.createUserAWSandProfile(formValue, true);
|
|
48
|
+
console.log("User created!", profile.metadata);
|
|
49
|
+
this.createdUser = profile;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.working = false;
|
|
53
|
+
alert(this.translate.instant(JSON.stringify(error)));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(error);
|
|
59
|
+
}
|
|
60
|
+
this.working = false;
|
|
61
|
+
}
|
|
62
|
+
// async updateAllMissionsFromTemplate(missionInput: UpdateMissionInput) {
|
|
63
|
+
// // all missions of this organisation
|
|
64
|
+
// const missionsFromTemplate =
|
|
65
|
+
// await this.missionService.getMissionsByTemplate(
|
|
66
|
+
// this.missionToEdit.id,
|
|
67
|
+
// );
|
|
68
|
+
// await Promise.all(
|
|
69
|
+
// missionsFromTemplate.map(async (mission) => {
|
|
70
|
+
// const missionTemplate = { ...missionInput };
|
|
71
|
+
// if (this.sendUpdate) {
|
|
72
|
+
// missionTemplate.emailStatus = EmailStatus.UPDATE_TO_DELIVER;
|
|
73
|
+
// }
|
|
74
|
+
// missionTemplate.id = mission.id;
|
|
75
|
+
// await this.missionService.update(missionTemplate);
|
|
76
|
+
// }),
|
|
77
|
+
// );
|
|
78
|
+
// }
|
|
79
|
+
async onMissionInput(mission) {
|
|
80
|
+
if (mission) {
|
|
81
|
+
this.missionInput = mission;
|
|
82
|
+
await this.userService.createOrUpdateMissionForOrgWithProperty(this.missionInput, this.missionInput.organisationID);
|
|
83
|
+
this.added.emit(true);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.added.emit(false);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
UserMissionFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BaseUserService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
+
UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", 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\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}.\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\">\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\">\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 type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Create user' | translate}}</button>\r\n <button 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 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"], components: [{ type: i2.LoaderComponent, selector: "lib-loader" }, { type: i4.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: i5.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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]" }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, decorators: [{
|
|
93
|
+
type: Component,
|
|
94
|
+
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\" [class.is-invalid]=\"email.invalid && email.touched\" required\r\n formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n {{'An email is required' | translate}}.\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\">\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\">\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 type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Create user' | translate}}</button>\r\n <button 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 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"] }]
|
|
95
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.BaseUserService }, { type: i3.TranslateService }]; }, propDecorators: { addToOrganisation: [{
|
|
96
|
+
type: Input
|
|
97
|
+
}], isSP: [{
|
|
98
|
+
type: Input
|
|
99
|
+
}], createForExistingUser: [{
|
|
100
|
+
type: Input
|
|
101
|
+
}], currentOrg: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], added: [{
|
|
104
|
+
type: Output
|
|
105
|
+
}] } });
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLW1pc3Npb24tZm9ybS91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXItbWlzc2lvbi1mb3JtL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBU3JGLE1BQU0sT0FBTyx3QkFBd0I7SUFvQmpDLFlBQ1ksRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFNBQTJCO1FBRjNCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFqQjlCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQU03QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUU5QyxZQUFPLEdBQUcsS0FBSyxDQUFDO0lBVWIsQ0FBQztJQUVKLFFBQVE7UUFDSixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QjtRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxRQUFR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RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE1pc3Npb24sIFByb2ZpbGUsIEJhc2VVc2VyU2VydmljZSB9IGZyb20gJ25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXVzZXItbWlzc2lvbi1mb3JtJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJNaXNzaW9uRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBcclxuICAgIEBJbnB1dCgpIGFkZFRvT3JnYW5pc2F0aW9uOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcclxuXHJcbiAgICBASW5wdXQoKSBjcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuXHJcbiAgICBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gICAgQElucHV0KCkgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBPdXRwdXQoKSBhZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgbWlzc2lvbklucHV0OiBNaXNzaW9uO1xyXG5cclxuICAgIGNyZWF0ZWRVc2VyOiBQcm9maWxlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQWRkTmV3VXNlck1pc3Npb25Ub09yZygpIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgZW1haWw6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogW1wiXCJdLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IFtcIlwiXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbWFpbCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiZW1haWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgcDogUHJvZmlsZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgICAgIHAgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnByb2ZpbGVGb3JNYWlsKGZvcm1WYWx1ZS5lbWFpbCk7XHJcbiAgICAgICAgICAgIGlmIChwKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydChcIlVzZXIgd2l0aCB0aGlzIGVtYWlsIGV4aXN0cyBhbHJlYWR5IVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyQVdTYW5kUHJvZmlsZShcclxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlVzZXIgY3JlYXRlZCFcIiwgcHJvZmlsZS5tZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWRVc2VyID0gcHJvZmlsZTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYWxlcnQodGhpcy50cmFuc2xhdGUuaW5zdGFudChKU09OLnN0cmluZ2lmeShlcnJvcikpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhc3luYyB1cGRhdGVBbGxNaXNzaW9uc0Zyb21UZW1wbGF0ZShtaXNzaW9uSW5wdXQ6IFVwZGF0ZU1pc3Npb25JbnB1dCkge1xyXG4gICAgLy8gICAgIC8vIGFsbCBtaXNzaW9ucyBvZiB0aGlzIG9yZ2FuaXNhdGlvblxyXG4gICAgLy8gICAgIGNvbnN0IG1pc3Npb25zRnJvbVRlbXBsYXRlID1cclxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5VGVtcGxhdGUoXHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLm1pc3Npb25Ub0VkaXQuaWQsXHJcbiAgICAvLyAgICAgICAgICk7XHJcbiAgICAvLyAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAvLyAgICAgICAgIG1pc3Npb25zRnJvbVRlbXBsYXRlLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbWlzc2lvblRlbXBsYXRlID0geyAuLi5taXNzaW9uSW5wdXQgfTtcclxuICAgIC8vICAgICAgICAgICAgIGlmICh0aGlzLnNlbmRVcGRhdGUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtaXNzaW9uVGVtcGxhdGUuZW1haWxTdGF0dXMgPSBFbWFpbFN0YXR1cy5VUERBVEVfVE9fREVMSVZFUjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIG1pc3Npb25UZW1wbGF0ZS5pZCA9IG1pc3Npb24uaWQ7XHJcbiAgICAvLyAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZShtaXNzaW9uVGVtcGxhdGUpO1xyXG4gICAgLy8gICAgICAgICB9KSxcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGFzeW5jIG9uTWlzc2lvbklucHV0KG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICBpZiAobWlzc2lvbikge1xyXG4gICAgICAgICAgICB0aGlzLm1pc3Npb25JbnB1dCA9IG1pc3Npb247XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlT3JVcGRhdGVNaXNzaW9uRm9yT3JnV2l0aFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQgYXMgTWlzc2lvbixcclxuICAgICAgICAgICAgICAgIHRoaXMubWlzc2lvbklucHV0Lm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRlZC5lbWl0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZvcm1cIj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInBlcnNvbmFsSW5mb1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnVXNlciBQZXJzb25hbCBJbmZvcm1hdGlvbicgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJlbWFpbC5pbnZhbGlkICYmIGVtYWlsLnRvdWNoZWRcIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FuIGVtYWlsIGlzIHJlcXVpcmVkJyB8IHRyYW5zbGF0ZX19LlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImxhc3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwid29ya2luZ1wiPlxyXG4gICAgICAgICAgICA8bGliLWxvYWRlcj48L2xpYi1sb2FkZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVkVXNlcjsgZWxzZSB3YWl0aW5nRm9yVXNlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAge3snVXNlciBzdWNjZXNzZnVsbHkgY3JlYXRlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGxpYi1mb3JtLW1pc3Npb24gW29yZ2FuaXNhdGlvbkZvck1pc3Npb25dPVwiYWRkVG9PcmdhbmlzYXRpb25cIiBbdXNlckZvck1pc3Npb25JRF09XCJjcmVhdGVkVXNlci5pZFwiXHJcbiAgICAgICAgICAgICAgICBbY3VycmVudFVzZXJPcmdhbmlzYXRpb25dPVwiY3VycmVudE9yZ1wiIFtpc1NQXT1cImlzU1BcIiAoYWRkZWRNaXNzaW9uSW5wdXQpPVwib25NaXNzaW9uSW5wdXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8L2xpYi1mb3JtLW1pc3Npb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN3YWl0aW5nRm9yVXNlcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0zIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3b3JraW5nIHx8IGZvcm0uaW52YWxpZFwiPnt7J0NyZWF0ZSB1c2VyJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiIFtkaXNhYmxlZF09XCJ3b3JraW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCI+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnTWlzc2lvbiBkZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmdiLWFsZXJ0IHR5cGU9XCJ3YXJuaW5nXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCI+e3snUGxlYXNlIGNyZWF0ZSBhIHVzZXIgZmlyc3QnIHwgdHJhbnNsYXRlfX0uPC9uZ2ItYWxlcnQ+XHJcblxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { DomainType, filterUniqueArrayByID, ProfileEntity, } from 'ngx-smarterplan-core';
|
|
3
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import { GuestLinkComponent } from '../guest-link/guest-link.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "ngx-smarterplan-core";
|
|
7
|
+
import * as i2 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
+
import * as i3 from "@ngx-translate/core";
|
|
9
|
+
import * as i4 from "../chevron/chevron.component";
|
|
10
|
+
import * as i5 from "./user-mission-form/user-mission-form.component";
|
|
11
|
+
import * as i6 from "./form-mission/form-mission.component";
|
|
12
|
+
import * as i7 from "./form-organisation/form-organisation.component";
|
|
13
|
+
import * as i8 from "./detail-organisation/detail-organisation.component";
|
|
14
|
+
import * as i9 from "@angular/common";
|
|
15
|
+
export class UserComponent {
|
|
16
|
+
constructor(userService, missionService, domainService, organisationService, modalService, translate) {
|
|
17
|
+
this.userService = userService;
|
|
18
|
+
this.missionService = missionService;
|
|
19
|
+
this.domainService = domainService;
|
|
20
|
+
this.organisationService = organisationService;
|
|
21
|
+
this.modalService = modalService;
|
|
22
|
+
this.translate = translate;
|
|
23
|
+
this.detailsUser = '-1';
|
|
24
|
+
this.detailsOrg = '-1';
|
|
25
|
+
this.query = '';
|
|
26
|
+
this.create = false;
|
|
27
|
+
this.edit = false;
|
|
28
|
+
this.working = false;
|
|
29
|
+
this.createForExistingUser = false;
|
|
30
|
+
this.isAddingOrg = false;
|
|
31
|
+
this.isAddingToExistingOrg = false;
|
|
32
|
+
this.isManager = false;
|
|
33
|
+
this.hideList = false;
|
|
34
|
+
this.orgsUsersMissions = [];
|
|
35
|
+
this.isSP = false;
|
|
36
|
+
this.isGuide = false;
|
|
37
|
+
this.clientsSP = [];
|
|
38
|
+
this.prestataireClients = [];
|
|
39
|
+
this.loading = false;
|
|
40
|
+
this.destroy$ = new Subject();
|
|
41
|
+
this.userService.isChanged
|
|
42
|
+
.pipe(takeUntil(this.destroy$))
|
|
43
|
+
.subscribe((isConnected) => {
|
|
44
|
+
if (isConnected) {
|
|
45
|
+
this.initInfo();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// @todo list my org and sub orgs
|
|
50
|
+
/**
|
|
51
|
+
* resetList fetches a fresh user list from server
|
|
52
|
+
*/
|
|
53
|
+
async resetList() {
|
|
54
|
+
this.orgsUsersMissions = [];
|
|
55
|
+
let allMissions = [];
|
|
56
|
+
this.loading = true;
|
|
57
|
+
if (this.isSP) {
|
|
58
|
+
this.orgsUsersMissions = await this.initListForSP();
|
|
59
|
+
this.filteredOrgsUsersMissions = this.orgsUsersMissions;
|
|
60
|
+
this.loading = false;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
allMissions = await this.missionService.getMissionsByOrderedOrganisation(this.currentOrg.id);
|
|
64
|
+
const currentOrgMissions = await this.missionService.getMissionsByOrganisation(this.currentOrg.id);
|
|
65
|
+
allMissions = [...allMissions, ...currentOrgMissions];
|
|
66
|
+
allMissions = allMissions.filter((mission) => mission.user && !mission.user.deletedAt);
|
|
67
|
+
allMissions = filterUniqueArrayByID(allMissions);
|
|
68
|
+
if (allMissions) {
|
|
69
|
+
const orgs = allMissions.map((mis) => mis.organisation);
|
|
70
|
+
const profiles = allMissions.map((mis) => mis.user);
|
|
71
|
+
const uniqueOrg = filterUniqueArrayByID(orgs);
|
|
72
|
+
const uniqueUsers = filterUniqueArrayByID(profiles);
|
|
73
|
+
uniqueOrg.map((org) => {
|
|
74
|
+
const orgMissions = allMissions.filter((mis) => {
|
|
75
|
+
return mis.organisationID === org.id;
|
|
76
|
+
});
|
|
77
|
+
let users = this.getUsersForOrgMissions(uniqueUsers, orgMissions);
|
|
78
|
+
users = users.sort((user) => (user.user.email ? 0 : -1));
|
|
79
|
+
const object = {
|
|
80
|
+
org,
|
|
81
|
+
users,
|
|
82
|
+
};
|
|
83
|
+
this.orgsUsersMissions.push(object);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
this.filteredOrgsUsersMissions = this.orgsUsersMissions;
|
|
87
|
+
this.loading = false;
|
|
88
|
+
}
|
|
89
|
+
async initInfo() {
|
|
90
|
+
const currentUser = this.userService.cu;
|
|
91
|
+
if (currentUser) {
|
|
92
|
+
this.me = currentUser;
|
|
93
|
+
this.currentOrg = this.userService.currentOrganisation();
|
|
94
|
+
this.isManager = this.userService.hasManagerRoleInAnyMission();
|
|
95
|
+
this.isSP = this.userService.isSPAdmin();
|
|
96
|
+
this.isGuide = this.userService.isGuide();
|
|
97
|
+
this.resetList();
|
|
98
|
+
this.setDomains();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async ngOnInit() {
|
|
102
|
+
this.initInfo();
|
|
103
|
+
}
|
|
104
|
+
ngOnDestroy() {
|
|
105
|
+
this.destroy$.next(true);
|
|
106
|
+
this.destroy$.complete();
|
|
107
|
+
}
|
|
108
|
+
async initListForSP() {
|
|
109
|
+
const results = [];
|
|
110
|
+
let allMissions = [];
|
|
111
|
+
let allOrgs = [];
|
|
112
|
+
allOrgs = await this.organisationService.listOrganisations();
|
|
113
|
+
await Promise.all(allOrgs.map(async (org) => {
|
|
114
|
+
const missions = await this.missionService.getMissionsByOrganisation(org.id);
|
|
115
|
+
allMissions = [...allMissions, ...missions];
|
|
116
|
+
}));
|
|
117
|
+
const profiles = allMissions
|
|
118
|
+
.map((mis) => mis.user)
|
|
119
|
+
.filter((user) => !user.deletedAt);
|
|
120
|
+
const uniqueUsers = filterUniqueArrayByID(profiles.filter((profile) => profile !== null));
|
|
121
|
+
allOrgs.map((org) => {
|
|
122
|
+
const orgMissions = allMissions.filter((mis) => {
|
|
123
|
+
return mis.organisationID === org.id;
|
|
124
|
+
});
|
|
125
|
+
if (orgMissions.length > 0) {
|
|
126
|
+
if (orgMissions.filter((m) => m.orderedOrganisationID === '6e28201f-4679-4c29-9d2d-8a325f57cee9').length > 0) {
|
|
127
|
+
this.clientsSP.push(org.id);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.prestataireClients.push({
|
|
131
|
+
orgOwner: orgMissions[0].orderedOrganisationID,
|
|
132
|
+
prestataire: org.id,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const users = this.getUsersForOrgMissions(uniqueUsers, orgMissions);
|
|
137
|
+
const object = {
|
|
138
|
+
org,
|
|
139
|
+
users,
|
|
140
|
+
};
|
|
141
|
+
results.push(object);
|
|
142
|
+
});
|
|
143
|
+
return results;
|
|
144
|
+
}
|
|
145
|
+
// eslint-disable-next-line class-methods-use-this
|
|
146
|
+
getUsersForOrgMissions(uniqueUsers, orgMissions) {
|
|
147
|
+
const users = uniqueUsers.map((user) => {
|
|
148
|
+
const userMissions = orgMissions.filter((m) => m.userID === user.id);
|
|
149
|
+
if (userMissions.length > 0) {
|
|
150
|
+
const userProfile = new ProfileEntity(user);
|
|
151
|
+
// once we got the user we check filter only active missions (not deleted)
|
|
152
|
+
const activeMissions = userMissions.filter((mis) => !mis.deletedAt);
|
|
153
|
+
return {
|
|
154
|
+
missions: activeMissions,
|
|
155
|
+
user: userProfile,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
});
|
|
160
|
+
return users.filter((us) => us !== null);
|
|
161
|
+
}
|
|
162
|
+
async setDomains() {
|
|
163
|
+
const domains = await this.domainService.getDomainsForOrgExcludingTypes([DomainType.FEATURE, DomainType.BOOKING], this.currentOrg.id);
|
|
164
|
+
this.domains = domains;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* onToggleDetail folds/unfolds details for a given organisation
|
|
168
|
+
* @param i index of the organisation to be toggled
|
|
169
|
+
*/
|
|
170
|
+
onToggleDetailOrg(index, org) {
|
|
171
|
+
this.detailsOrg = index === this.detailsOrg ? '-1' : index;
|
|
172
|
+
this.orgSelectedDetails = this.detailsOrg === '-1' ? null : org;
|
|
173
|
+
}
|
|
174
|
+
onToggleDetailUser(index) {
|
|
175
|
+
this.detailsUser = index === this.detailsUser ? '-1' : index;
|
|
176
|
+
}
|
|
177
|
+
async onAdd(org) {
|
|
178
|
+
this.create = true;
|
|
179
|
+
this.hideList = true;
|
|
180
|
+
this.addToOrg = org;
|
|
181
|
+
}
|
|
182
|
+
async onEdit(m) {
|
|
183
|
+
this.edit = true;
|
|
184
|
+
this.hideList = true;
|
|
185
|
+
this.missionToEdit = m;
|
|
186
|
+
}
|
|
187
|
+
onCancel() {
|
|
188
|
+
this.working = false;
|
|
189
|
+
this.create = false;
|
|
190
|
+
this.missionToEdit = null;
|
|
191
|
+
this.createForExistingUser = false;
|
|
192
|
+
}
|
|
193
|
+
onAddForUser(org, user) {
|
|
194
|
+
this.hideList = true;
|
|
195
|
+
this.createForExistingUser = true;
|
|
196
|
+
this.userForAddingMission = user;
|
|
197
|
+
this.addToOrg = org;
|
|
198
|
+
}
|
|
199
|
+
onAddOrg() {
|
|
200
|
+
this.hideList = true;
|
|
201
|
+
this.isAddingOrg = true;
|
|
202
|
+
}
|
|
203
|
+
orgAdded(isAdded) {
|
|
204
|
+
this.hideList = false;
|
|
205
|
+
this.isAddingOrg = false;
|
|
206
|
+
this.isAddingToExistingOrg = false;
|
|
207
|
+
if (isAdded) {
|
|
208
|
+
this.resetList();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
userAdded(isAdded) {
|
|
212
|
+
console.log(isAdded);
|
|
213
|
+
this.hideList = false;
|
|
214
|
+
this.create = false;
|
|
215
|
+
this.addToOrg = null;
|
|
216
|
+
this.createForExistingUser = false;
|
|
217
|
+
this.userForAddingMission = null;
|
|
218
|
+
if (isAdded) {
|
|
219
|
+
this.resetList();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async onMissionEdited(mission) {
|
|
223
|
+
this.edit = false;
|
|
224
|
+
this.missionToEdit = null;
|
|
225
|
+
if (mission) {
|
|
226
|
+
await this.userService.createOrUpdateMissionForOrgWithProperty(mission, mission.organisationID, false);
|
|
227
|
+
this.resetList();
|
|
228
|
+
}
|
|
229
|
+
this.hideList = false;
|
|
230
|
+
}
|
|
231
|
+
async onMissionCreated(mission) {
|
|
232
|
+
this.createForExistingUser = false;
|
|
233
|
+
this.userForAddingMission = null;
|
|
234
|
+
if (mission) {
|
|
235
|
+
await this.userService.createOrUpdateMissionForOrgWithProperty(mission, mission.organisationID);
|
|
236
|
+
this.resetList();
|
|
237
|
+
}
|
|
238
|
+
this.hideList = false;
|
|
239
|
+
}
|
|
240
|
+
getOrderedOrg(orgID) {
|
|
241
|
+
let name;
|
|
242
|
+
this.prestataireClients.map(async (presta) => {
|
|
243
|
+
if (presta.prestataire === orgID) {
|
|
244
|
+
const org = this.orgsUsersMissions.filter((object) => object.org.id === presta.orgOwner);
|
|
245
|
+
if (org.length > 0) {
|
|
246
|
+
name = org[0].org.name;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
return name;
|
|
251
|
+
}
|
|
252
|
+
domainIdsToStringForMission(mission) {
|
|
253
|
+
let names = '';
|
|
254
|
+
for (const domainID of mission.domains) {
|
|
255
|
+
const domain = this.domains.find((dom) => dom.id === domainID);
|
|
256
|
+
if (domain) {
|
|
257
|
+
names = `${names} ${domain.name},`;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return names.slice(0, -1); // to remove last comma
|
|
261
|
+
}
|
|
262
|
+
async onDeleteMission(mission) {
|
|
263
|
+
const message = this.translate.instant('confirm.deleteMission');
|
|
264
|
+
if (window.confirm(message)) {
|
|
265
|
+
await this.missionService.softDeleteMission(mission.id);
|
|
266
|
+
this.resetList();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async onDeleteUser(user) {
|
|
270
|
+
const message = this.translate.instant('confirm.deleteUser');
|
|
271
|
+
if (window.confirm(message)) {
|
|
272
|
+
const userMissions = await this.missionService.getMissionsFromUserID(user.id);
|
|
273
|
+
if (userMissions.length > 0) {
|
|
274
|
+
const resultDelete = [];
|
|
275
|
+
await Promise.all(userMissions.map(async (mission) => {
|
|
276
|
+
if (mission.orderedOrganisationID === this.currentOrg.id ||
|
|
277
|
+
this.isSP) {
|
|
278
|
+
const deletedMission = await this.missionService.softDeleteMission(mission.id);
|
|
279
|
+
if (deletedMission) {
|
|
280
|
+
resultDelete.push(deletedMission);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}));
|
|
284
|
+
if (resultDelete.length > 0) {
|
|
285
|
+
await this.userService.softDeleteUser(user.id);
|
|
286
|
+
await this.resetList();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
await this.userService.softDeleteUser(user.id);
|
|
291
|
+
await this.resetList();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
applyResultsSearchBar(results) {
|
|
296
|
+
this.orgSelectedDetails = null;
|
|
297
|
+
this.filteredOrgsUsersMissions = results || this.orgsUsersMissions;
|
|
298
|
+
}
|
|
299
|
+
onAddInExistingOrg() {
|
|
300
|
+
this.hideList = true;
|
|
301
|
+
this.isAddingToExistingOrg = true;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Creates encypted link and sets it for guestLink for Space.
|
|
305
|
+
* @param mis
|
|
306
|
+
*/
|
|
307
|
+
onSetForShareableLink(user, mission) {
|
|
308
|
+
const modalReference = this.modalService.open(GuestLinkComponent);
|
|
309
|
+
modalReference.componentInstance.username = user.email;
|
|
310
|
+
modalReference.componentInstance.spaceID = mission.spaceID;
|
|
311
|
+
}
|
|
312
|
+
async onClearToken(user) {
|
|
313
|
+
await this.userService.clearUserToken(user.user.id);
|
|
314
|
+
const firstMessage = this.translate.instant('firstTokenMessage');
|
|
315
|
+
const secondMessage = this.translate.instant('secondTokenMessage');
|
|
316
|
+
alert(firstMessage + user.user.displayName + secondMessage);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
UserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i1.DomainService }, { token: i1.OrganisationService }, { token: i2.NgbModal }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
320
|
+
UserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", 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=\"isManager && !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\">\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\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button 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\">\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\"></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\"\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 </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" 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 </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"], components: [{ type: i1.LoaderComponent, selector: "lib-loader" }, { type: i4.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: i5.UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: i7.FormOrganisationComponent, selector: "lib-form-organisation", inputs: ["currentOrg", "currentUser", "existing"], outputs: ["added"] }, { type: i8.DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: ["org", "currentOrg", "isSP"], outputs: ["orgChanged"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], pipes: { "translate": i3.TranslatePipe, "async": i9.AsyncPipe, "hashtagFromID": i1.HashtagFromIdPipe, "timeDateString": i1.TimeDateToLocalStringPipe } });
|
|
321
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, decorators: [{
|
|
322
|
+
type: Component,
|
|
323
|
+
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=\"isManager && !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\">\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\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button 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\">\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\"></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\"\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 </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" 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 </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"] }]
|
|
324
|
+
}], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i1.DomainService }, { type: i1.OrganisationService }, { type: i2.NgbModal }, { type: i3.TranslateService }]; } });
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUlMLFVBQVUsRUFDVixxQkFBcUIsRUFNckIsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBUXhFLE1BQU0sT0FBTyxhQUFhO0lBbUV4QixZQUNVLFdBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxZQUFzQixFQUN0QixTQUEyQjtRQUwzQixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUF0RXJDLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBRW5CLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFbEIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBRWIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQiwwQkFBcUIs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QUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ25FLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQzs7MEdBbGFVLGFBQWE7OEZBQWIsYUFBYSxnREN4QjFCLGt5U0E4SU07MkZEdEhPLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHtcclxuICBCYXNlVXNlclNlcnZpY2UsXHJcbiAgRG9tYWluLFxyXG4gIERvbWFpblNlcnZpY2UsXHJcbiAgRG9tYWluVHlwZSxcclxuICBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQsXHJcbiAgTWlzc2lvbixcclxuICBNaXNzaW9uU2VydmljZSxcclxuICBPcmdhbmlzYXRpb24sXHJcbiAgT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICBQcm9maWxlLFxyXG4gIFByb2ZpbGVFbnRpdHksXHJcbn0gZnJvbSAnbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR3Vlc3RMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3Vlc3QtbGluay9ndWVzdC1saW5rLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdXNlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VzZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHVzZXJzOiBBcnJheTxNaXNzaW9uICYgeyBuYW1lOiBzdHJpbmcgfT47XHJcblxyXG4gIGRldGFpbHNVc2VyID0gJy0xJztcclxuXHJcbiAgZGV0YWlsc09yZyA9ICctMSc7XHJcblxyXG4gIHF1ZXJ5ID0gJyc7XHJcblxyXG4gIGNyZWF0ZSA9IGZhbHNlO1xyXG5cclxuICBlZGl0ID0gZmFsc2U7XHJcblxyXG4gIHdvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgY3JlYXRlRm9yRXhpc3RpbmdVc2VyID0gZmFsc2U7XHJcblxyXG4gIGlzQWRkaW5nT3JnID0gZmFsc2U7XHJcblxyXG4gIGlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICB1c2VyRm9yQWRkaW5nTWlzc2lvbjogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICBtZTogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgaXNNYW5hZ2VyID0gZmFsc2U7XHJcblxyXG4gIGhpZGVMaXN0ID0gZmFsc2U7XHJcblxyXG4gIG9yZ3NVc2Vyc01pc3Npb25zOiBBcnJheTx7XHJcbiAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuICAgIHVzZXJzOiBBcnJheTx7XHJcbiAgICAgIG1pc3Npb25zOiBNaXNzaW9uW107XHJcbiAgICAgIHVzZXI6IFByb2ZpbGVFbnRpdHk7XHJcbiAgICB9PjtcclxuICB9PiA9IFtdO1xyXG5cclxuICBtaXNzaW9uVG9FZGl0OiBNaXNzaW9uO1xyXG5cclxuICBpc1NQID0gZmFsc2U7XHJcblxyXG4gIGlzR3VpZGUgPSBmYWxzZTtcclxuXHJcbiAgY2xpZW50c1NQOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwcmVzdGF0YWlyZUNsaWVudHM6IEFycmF5PHsgb3JnT3duZXI6IHN0cmluZzsgcHJlc3RhdGFpcmU6IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgYWRkVG9Pcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgb3JnU2VsZWN0ZWREZXRhaWxzOiBPcmdhbmlzYXRpb247XHJcblxyXG4gIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnM6IEFycmF5PHtcclxuICAgIG9yZzogT3JnYW5pc2F0aW9uO1xyXG4gICAgdXNlcnM6IEFycmF5PHtcclxuICAgICAgbWlzc2lvbnM6IE1pc3Npb25bXTtcclxuICAgICAgdXNlcjogUHJvZmlsZUVudGl0eTtcclxuICAgIH0+O1xyXG4gIH0+O1xyXG5cclxuICBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkb21haW5TZXJ2aWNlOiBEb21haW5TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBvcmdhbmlzYXRpb25TZXJ2aWNlOiBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuaXNDaGFuZ2VkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoaXNDb25uZWN0ZWQpID0+IHtcclxuICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuaW5pdEluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRvZG8gbGlzdCBteSBvcmcgYW5kIHN1YiBvcmdzXHJcblxyXG4gIC8qKlxyXG4gICAqIHJlc2V0TGlzdCBmZXRjaGVzIGEgZnJlc2ggdXNlciBsaXN0IGZyb20gc2VydmVyXHJcbiAgICovXHJcbiAgYXN5bmMgcmVzZXRMaXN0KCkge1xyXG4gICAgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucyA9IFtdO1xyXG4gICAgbGV0IGFsbE1pc3Npb25zID0gW107XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaXNTUCkge1xyXG4gICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zID0gYXdhaXQgdGhpcy5pbml0TGlzdEZvclNQKCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHRoaXMub3Jnc1VzZXJzTWlzc2lvbnM7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhbGxNaXNzaW9ucyA9IGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZGVyZWRPcmdhbmlzYXRpb24oXHJcbiAgICAgIHRoaXMuY3VycmVudE9yZy5pZFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRPcmdNaXNzaW9ucyA9XHJcbiAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZ2FuaXNhdGlvbih0aGlzLmN1cnJlbnRPcmcuaWQpO1xyXG4gICAgYWxsTWlzc2lvbnMgPSBbLi4uYWxsTWlzc2lvbnMsIC4uLmN1cnJlbnRPcmdNaXNzaW9uc107XHJcbiAgICBhbGxNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzc2lvbikgPT4gbWlzc2lvbi51c2VyICYmICFtaXNzaW9uLnVzZXIuZGVsZXRlZEF0KTtcclxuICAgIGFsbE1pc3Npb25zID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKGFsbE1pc3Npb25zKTtcclxuXHJcbiAgICBpZiAoYWxsTWlzc2lvbnMpIHtcclxuICAgICAgY29uc3Qgb3JncyA9IGFsbE1pc3Npb25zLm1hcCgobWlzKSA9PiBtaXMub3JnYW5pc2F0aW9uKTtcclxuICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9ucy5tYXAoKG1pcykgPT4gbWlzLnVzZXIpO1xyXG4gICAgICBjb25zdCB1bmlxdWVPcmcgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQob3Jncyk7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKHByb2ZpbGVzKTtcclxuICAgICAgdW5pcXVlT3JnLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3JnTWlzc2lvbnMgPSBhbGxNaXNzaW9ucy5maWx0ZXIoKG1pcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCB1c2VycyA9IHRoaXMuZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyh1bmlxdWVVc2Vycywgb3JnTWlzc2lvbnMpO1xyXG4gICAgICAgIHVzZXJzID0gdXNlcnMuc29ydCgodXNlcikgPT4gKHVzZXIudXNlci5lbWFpbCA/IDAgOiAtMSkpO1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHtcclxuICAgICAgICAgIG9yZyxcclxuICAgICAgICAgIHVzZXJzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucy5wdXNoKG9iamVjdCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zID0gdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdEluZm8oKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IHRoaXMudXNlclNlcnZpY2UuY3U7XHJcbiAgICBpZiAoY3VycmVudFVzZXIpIHtcclxuICAgICAgdGhpcy5tZSA9IGN1cnJlbnRVc2VyO1xyXG4gICAgICB0aGlzLmN1cnJlbnRPcmcgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKTtcclxuICAgICAgdGhpcy5pc01hbmFnZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc01hbmFnZXJSb2xlSW5BbnlNaXNzaW9uKCk7XHJcbiAgICAgIHRoaXMuaXNTUCA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XHJcbiAgICAgIHRoaXMuaXNHdWlkZSA9IHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZSgpO1xyXG4gICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICB0aGlzLnNldERvbWFpbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pbml0SW5mbygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0TGlzdEZvclNQKCk6IFByb21pc2U8YW55W10+IHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcclxuICAgIGxldCBhbGxNaXNzaW9ucyA9IFtdO1xyXG4gICAgbGV0IGFsbE9yZ3MgPSBbXTtcclxuICAgIGFsbE9yZ3MgPSBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UubGlzdE9yZ2FuaXNhdGlvbnMoKTtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBhbGxPcmdzLm1hcChhc3luYyAob3JnKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWlzc2lvbnMgPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlPcmdhbmlzYXRpb24oXHJcbiAgICAgICAgICBvcmcuaWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5taXNzaW9uc107XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHByb2ZpbGVzID0gYWxsTWlzc2lvbnNcclxuICAgICAgLm1hcCgobWlzKSA9PiBtaXMudXNlcilcclxuICAgICAgLmZpbHRlcigodXNlcikgPT4gIXVzZXIuZGVsZXRlZEF0KTtcclxuICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKFxyXG4gICAgICBwcm9maWxlcy5maWx0ZXIoKHByb2ZpbGUpID0+IHByb2ZpbGUgIT09IG51bGwpXHJcbiAgICApO1xyXG4gICAgYWxsT3Jncy5tYXAoKG9yZykgPT4ge1xyXG4gICAgICBjb25zdCBvcmdNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChvcmdNaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgb3JnTWlzc2lvbnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAobSkgPT5cclxuICAgICAgICAgICAgICBtLm9yZGVyZWRPcmdhbmlzYXRpb25JRCA9PT0gJzZlMjgyMDFmLTQ2NzktNGMyOS05ZDJkLThhMzI1ZjU3Y2VlOSdcclxuICAgICAgICAgICkubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRzU1AucHVzaChvcmcuaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnByZXN0YXRhaXJlQ2xpZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgb3JnT3duZXI6IG9yZ01pc3Npb25zWzBdLm9yZGVyZWRPcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgcHJlc3RhdGFpcmU6IG9yZy5pZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCB1c2VycyA9IHRoaXMuZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyh1bmlxdWVVc2Vycywgb3JnTWlzc2lvbnMpO1xyXG4gICAgICBjb25zdCBvYmplY3QgPSB7XHJcbiAgICAgICAgb3JnLFxyXG4gICAgICAgIHVzZXJzLFxyXG4gICAgICB9O1xyXG4gICAgICByZXN1bHRzLnB1c2gob2JqZWN0KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xyXG4gIGdldFVzZXJzRm9yT3JnTWlzc2lvbnMoXHJcbiAgICB1bmlxdWVVc2VyczogUHJvZmlsZVtdLFxyXG4gICAgb3JnTWlzc2lvbnM6IE1pc3Npb25bXVxyXG4gICk6IEFycmF5PHtcclxuICAgIG1pc3Npb25zOiBNaXNzaW9uW107XHJcbiAgICB1c2VyOiBQcm9maWxlRW50aXR5O1xyXG4gIH0+IHtcclxuICAgIGNvbnN0IHVzZXJzID0gdW5pcXVlVXNlcnMubWFwKCh1c2VyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHVzZXJNaXNzaW9ucyA9IG9yZ01pc3Npb25zLmZpbHRlcigobSkgPT4gbS51c2VySUQgPT09IHVzZXIuaWQpO1xyXG4gICAgICBpZiAodXNlck1pc3Npb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB1c2VyUHJvZmlsZSA9IG5ldyBQcm9maWxlRW50aXR5KHVzZXIpO1xyXG4gICAgICAgIC8vIG9uY2Ugd2UgZ290IHRoZSB1c2VyIHdlIGNoZWNrIGZpbHRlciBvbmx5IGFjdGl2ZSBtaXNzaW9ucyAobm90IGRlbGV0ZWQpXHJcbiAgICAgICAgY29uc3QgYWN0aXZlTWlzc2lvbnMgPSB1c2VyTWlzc2lvbnMuZmlsdGVyKChtaXMpID0+ICFtaXMuZGVsZXRlZEF0KTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbWlzc2lvbnM6IGFjdGl2ZU1pc3Npb25zLFxyXG4gICAgICAgICAgdXNlcjogdXNlclByb2ZpbGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcigodXMpID0+IHVzICE9PSBudWxsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldERvbWFpbnMoKSB7XHJcbiAgICBjb25zdCBkb21haW5zID0gYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JPcmdFeGNsdWRpbmdUeXBlcyhcclxuICAgICAgW0RvbWFpblR5cGUuRkVBVFVSRSwgRG9tYWluVHlwZS5CT09LSU5HXSxcclxuICAgICAgdGhpcy5jdXJyZW50T3JnLmlkXHJcbiAgICApO1xyXG4gICAgdGhpcy5kb21haW5zID0gZG9tYWlucztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG9uVG9nZ2xlRGV0YWlsIGZvbGRzL3VuZm9sZHMgZGV0YWlscyBmb3IgYSBnaXZlbiBvcmdhbmlzYXRpb25cclxuICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgb3JnYW5pc2F0aW9uIHRvIGJlIHRvZ2dsZWRcclxuICAgKi9cclxuICBvblRvZ2dsZURldGFpbE9yZyhpbmRleCwgb3JnKSB7XHJcbiAgICB0aGlzLmRldGFpbHNPcmcgPSBpbmRleCA9PT0gdGhpcy5kZXRhaWxzT3JnID8gJy0xJyA6IGluZGV4O1xyXG4gICAgdGhpcy5vcmdTZWxlY3RlZERldGFpbHMgPSB0aGlzLmRldGFpbHNPcmcgPT09ICctMScgPyBudWxsIDogb3JnO1xyXG4gIH1cclxuXHJcbiAgb25Ub2dnbGVEZXRhaWxVc2VyKGluZGV4KSB7XHJcbiAgICB0aGlzLmRldGFpbHNVc2VyID0gaW5kZXggPT09IHRoaXMuZGV0YWlsc1VzZXIgPyAnLTEnIDogaW5kZXg7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkFkZChvcmc6IE9yZ2FuaXNhdGlvbikge1xyXG4gICAgdGhpcy5jcmVhdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICB0aGlzLmFkZFRvT3JnID0gb3JnO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25FZGl0KG06IE1pc3Npb24pIHtcclxuICAgIHRoaXMuZWRpdCA9IHRydWU7XHJcbiAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG07XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcclxuICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25BZGRGb3JVc2VyKG9yZzogT3JnYW5pc2F0aW9uLCB1c2VyOiBQcm9maWxlRW50aXR5KSB7XHJcbiAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgIHRoaXMuY3JlYXRlRm9yRXhpc3RpbmdVc2VyID0gdHJ1ZTtcclxuICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSB1c2VyO1xyXG4gICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICB9XHJcblxyXG4gIG9uQWRkT3JnKCkge1xyXG4gICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICB0aGlzLmlzQWRkaW5nT3JnID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9yZ0FkZGVkKGlzQWRkZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBZGRpbmdPcmcgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBZGRpbmdUb0V4aXN0aW5nT3JnID0gZmFsc2U7XHJcbiAgICBpZiAoaXNBZGRlZCkge1xyXG4gICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXNlckFkZGVkKGlzQWRkZWQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnNvbGUubG9nKGlzQWRkZWQpO1xyXG4gICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcclxuICAgIHRoaXMuYWRkVG9PcmcgPSBudWxsO1xyXG4gICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSBudWxsO1xyXG4gICAgaWYgKGlzQWRkZWQpIHtcclxuICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTWlzc2lvbkVkaXRlZChtaXNzaW9uOiBNaXNzaW9uKSB7XHJcbiAgICB0aGlzLmVkaXQgPSBmYWxzZTtcclxuICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICBpZiAobWlzc2lvbikge1xyXG4gICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlTWlzc2lvbkZvck9yZ1dpdGhQcm9wZXJ0eShcclxuICAgICAgICBtaXNzaW9uLFxyXG4gICAgICAgIG1pc3Npb24ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgZmFsc2VcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgIH1cclxuICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uTWlzc2lvbkNyZWF0ZWQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSBudWxsO1xyXG4gICAgaWYgKG1pc3Npb24pIHtcclxuICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgbWlzc2lvbixcclxuICAgICAgICBtaXNzaW9uLm9yZ2FuaXNhdGlvbklEXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhpZGVMaXN0ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRPcmRlcmVkT3JnKG9yZ0lEOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGxldCBuYW1lO1xyXG4gICAgdGhpcy5wcmVzdGF0YWlyZUNsaWVudHMubWFwKGFzeW5jIChwcmVzdGEpID0+IHtcclxuICAgICAgaWYgKHByZXN0YS5wcmVzdGF0YWlyZSA9PT0gb3JnSUQpIHtcclxuICAgICAgICBjb25zdCBvcmcgPSB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgIChvYmplY3QpID0+IG9iamVjdC5vcmcuaWQgPT09IHByZXN0YS5vcmdPd25lclxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKG9yZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBuYW1lID0gb3JnWzBdLm9yZy5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXNzaW9uOiBNaXNzaW9uKTogc3RyaW5nIHtcclxuICAgIGxldCBuYW1lcyA9ICcnO1xyXG4gICAgZm9yIChjb25zdCBkb21haW5JRCBvZiBtaXNzaW9uLmRvbWFpbnMpIHtcclxuICAgICAgY29uc3QgZG9tYWluID0gdGhpcy5kb21haW5zLmZpbmQoKGRvbSkgPT4gZG9tLmlkID09PSBkb21haW5JRCk7XHJcbiAgICAgIGlmIChkb21haW4pIHtcclxuICAgICAgICBuYW1lcyA9IGAke25hbWVzfSAke2RvbWFpbi5uYW1lfSxgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZXMuc2xpY2UoMCwgLTEpOyAvLyB0byByZW1vdmUgbGFzdCBjb21tYVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGVNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdjb25maXJtLmRlbGV0ZU1pc3Npb24nKTtcclxuICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnNvZnREZWxldGVNaXNzaW9uKG1pc3Npb24uaWQpO1xyXG4gICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGVVc2VyKHVzZXIpIHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdjb25maXJtLmRlbGV0ZVVzZXInKTtcclxuICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICBjb25zdCB1c2VyTWlzc2lvbnMgPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zRnJvbVVzZXJJRChcclxuICAgICAgICB1c2VyLmlkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh1c2VyTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdERlbGV0ZSA9IFtdO1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgdXNlck1pc3Npb25zLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgbWlzc2lvbi5vcmRlcmVkT3JnYW5pc2F0aW9uSUQgPT09IHRoaXMuY3VycmVudE9yZy5pZCB8fFxyXG4gICAgICAgICAgICAgIHRoaXMuaXNTUFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBjb25zdCBkZWxldGVkTWlzc2lvbiA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnNvZnREZWxldGVNaXNzaW9uKG1pc3Npb24uaWQpO1xyXG4gICAgICAgICAgICAgIGlmIChkZWxldGVkTWlzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0RGVsZXRlLnB1c2goZGVsZXRlZE1pc3Npb24pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChyZXN1bHREZWxldGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5zb2Z0RGVsZXRlVXNlcih1c2VyLmlkKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwbHlSZXN1bHRzU2VhcmNoQmFyKHJlc3VsdHMpIHtcclxuICAgIHRoaXMub3JnU2VsZWN0ZWREZXRhaWxzID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHJlc3VsdHMgfHwgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICB9XHJcblxyXG4gIG9uQWRkSW5FeGlzdGluZ09yZygpIHtcclxuICAgIHRoaXMuaGlkZUxpc3QgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0FkZGluZ1RvRXhpc3RpbmdPcmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBlbmN5cHRlZCBsaW5rIGFuZCBzZXRzIGl0IGZvciBndWVzdExpbmsgZm9yIFNwYWNlLlxyXG4gICAqIEBwYXJhbSBtaXNcclxuICAgKi9cclxuICBvblNldEZvclNoYXJlYWJsZUxpbmsodXNlcjogUHJvZmlsZUVudGl0eSwgbWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgY29uc3QgbW9kYWxSZWZlcmVuY2UgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEd1ZXN0TGlua0NvbXBvbmVudCk7XHJcbiAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS51c2VybmFtZSA9IHVzZXIuZW1haWw7XHJcbiAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS5zcGFjZUlEID0gbWlzc2lvbi5zcGFjZUlEO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DbGVhclRva2VuKHVzZXIpIHtcclxuICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY2xlYXJVc2VyVG9rZW4odXNlci51c2VyLmlkKTtcclxuICAgIGNvbnN0IGZpcnN0TWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2ZpcnN0VG9rZW5NZXNzYWdlJyk7XHJcbiAgICBjb25zdCBzZWNvbmRNZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnc2Vjb25kVG9rZW5NZXNzYWdlJyk7XHJcbiAgICBhbGVydChmaXJzdE1lc3NhZ2UgKyB1c2VyLnVzZXIuZGlzcGxheU5hbWUgKyBzZWNvbmRNZXNzYWdlKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhc2hib2FyZC10YWJcIj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWRhc2hib2FyZC10YWJcIj5cclxuICAgIDxoMz57eydVc2VycycgfCB0cmFuc2xhdGV9fTwvaDM+XHJcbiAgICA8IS0tIDxhcHAtc2VhcmNoLWJhciAqbmdJZj1cIiFoaWRlTGlzdFwiIFtzZWFyY2hhYmxlXT1cIm9yZ3NVc2Vyc01pc3Npb25zXCIgb2JqZWN0VHlwZT1cIlVTRVJcIlxyXG4gICAgICAgIChzZWFyY2hFdmVudCk9XCJhcHBseVJlc3VsdHNTZWFyY2hCYXIoJGV2ZW50KVwiPlxyXG4gICAgICA8L2FwcC1zZWFyY2gtYmFyPiAtLT5cclxuICAgIDxocj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggY29sLWxnLTZcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtbC0wIG1iLTJcIiAqbmdJZj1cIiFoaWRlTGlzdFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWRkLWJ1dHRvblwiICpuZ0lmPVwiaXNNYW5hZ2VyICYmICFpc0d1aWRlXCIgKGNsaWNrKT1cIm9uQWRkT3JnKClcIj5cclxuICAgICAgICAgIHt7J0FkZCB1c2VyIHRvIG5ldyBvcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhaGlkZUxpc3RcIj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiAqbmdJZj1cImZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnNcIj5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCIgKm5nRm9yPVwibGV0IG8gb2YgZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBmb250LXdlaWdodC1ib2xkXCJcclxuICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiU2VlIGRldGFpbHMgYW5kIHVzZXJzXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsT3JnKG8ub3JnLmlkLCBvLm9yZylcIj5cclxuICAgICAgICAgICAgICB7e28ub3JnLm5hbWV9fSA8c21hbGwgKm5nSWY9XCJvLm9yZy5pZCA9PSBjdXJyZW50T3JnLmlkXCI+KHt7J015IG9yZ2FuaXNhdGlvbicgfCB0cmFuc2xhdGV9fSk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cImlzU1AgJiYgY2xpZW50c1NQLmluY2x1ZGVzKG8ub3JnLmlkKVwiPih7eydDbGllbnQgb2YgU21hcnRlclBsYW4nIHwgdHJhbnNsYXRlfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJpc1NQICYmIGdldE9yZGVyZWRPcmcoby5vcmcuaWQpXCI+KHt7J0NsaWVudCBvZiAnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIHt7Z2V0T3JkZXJlZE9yZyhvLm9yZy5pZCl9fSk8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzT3JnPT1vLm9yZy5pZFwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlzc2lvbnNcIiAqbmdJZj1cImRldGFpbHNPcmc9PW8ub3JnLmlkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXQtMyBtYi0zXCIgKGNsaWNrKT1cIm9uQWRkKG8ub3JnKVwiPnt7J0FkZCB1c2VyJyB8XHJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgYSBvZiBvLnVzZXJzXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsVXNlcihhLnVzZXIuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3thLnVzZXIuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzVXNlcj09YS51c2VyLmlkXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV0YWlsc1VzZXI9PWEudXNlci5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19OiB7e2EudXNlci5lbWFpbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihvLm9yZywgYS51c2VyKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25DbGVhclRva2VuKGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgVG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVVc2VyKGEudXNlcilcIj57eydEZWxldGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGEubWlzc2lvbnMubGVuZ3RoID4gMCA/ICgnQ3VycmVudCBNaXNzaW9ucycgfCB0cmFuc2xhdGUpIDogKCdObyBtaXNzaW9ucycgfCB0cmFuc2xhdGUpfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IG1pcyBvZiBhLm1pc3Npb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fToge3ttaXMuZGVzY3JpcHRpb259fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMudGVtcGxhdGVNaXNzaW9uSURcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0F0dGVuZGVlIG9mIHRvdXInIHwgdHJhbnNsYXRlfX06IHt7bWlzLnRlbXBsYXRlTWlzc2lvbi50aXRsZX19PC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fToge3sgbWlzLnJvbGUgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmhhc2h0YWdzICYmIG1pcy5oYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19OiA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBtaXMuaGFzaHRhZ3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGUgfX06IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXMubG9jYWxlID8gbWlzLmxvY2FsZSA6ICgnTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLmxldmVsfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J09yZGVyZWQgYnknIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLm9yZGVyZWRPcmdhbmlzYXRpb24ubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIm1pcy5kb21haW5zXCI+e3snRG9tYWlucycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21pcy5kb21haW5zID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXMpIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3BhY2UgPyBtaXMuc3BhY2UubmFtZSA6IFwiTm8gbG9jYXRpb25cIiB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWlzLnpvbmUgPyBtaXMuem9uZS5uYW1lIDogXCJBbGwgem9uZXMgYWxsb3dlZFwiIHwgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1N0YXJ0cycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3RhcnREYXRlVGltZSA/IChtaXMuc3RhcnREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LCB7eydFbmRzJyB8IHRyYW5zbGF0ZX19OiB7eyBtaXMuZW5kRGF0ZVRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1pcy5lbmREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTIgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FZGl0KG1pcylcIj57eydFZGl0JyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwibWlzLnJvbGUgPT09ICdWSVNJVE9SJyB8fCBtaXMucm9sZSA9PT0gJ1ZJU0lUT1JfTVVTRVVNJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0yIGFjdGlvbi1idXR0b24gc2hhcmUtdmlzaXRvci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2V0Rm9yU2hhcmVhYmxlTGluayhhLnVzZXIsIG1pcylcIj57eydHZW5lcmF0ZSBTaGFyZWFibGUgTGluaycgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZU1pc3Npb24obWlzKVwiPnt7J0RlbGV0ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVcIj5cclxuICAgICAgICA8bGliLXVzZXItbWlzc2lvbi1mb3JtIFthZGRUb09yZ2FuaXNhdGlvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZCk9XCJ1c2VyQWRkZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvbGliLXVzZXItbWlzc2lvbi1mb3JtPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cImVkaXRcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbbWlzc2lvblRvRWRpdF09XCJtaXNzaW9uVG9FZGl0XCIgW2N1cnJlbnRVc2VyT3JnYW5pc2F0aW9uXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25FZGl0ZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjcmVhdGVGb3JFeGlzdGluZ1VzZXJcIj5cclxuICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ1wiIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiXHJcbiAgICAgICAgICBbdXNlckZvck1pc3Npb25JRF09XCJ1c2VyRm9yQWRkaW5nTWlzc2lvbi5pZFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25DcmVhdGVkKCRldmVudClcIj5cclxuICAgICAgICA8L2xpYi1mb3JtLW1pc3Npb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNBZGRpbmdPcmcgfHwgaXNBZGRpbmdUb0V4aXN0aW5nT3JnXCI+XHJcbiAgICAgICAgPGxpYi1mb3JtLW9yZ2FuaXNhdGlvbiBbY3VycmVudE9yZ109XCJjdXJyZW50T3JnXCIgW2N1cnJlbnRVc2VyXT1cIm1lXCIgW2V4aXN0aW5nXT1cImlzQWRkaW5nVG9FeGlzdGluZ09yZ1wiXHJcbiAgICAgICAgICAoYWRkZWQpPVwib3JnQWRkZWQoJGV2ZW50KVwiPjwvbGliLWZvcm0tb3JnYW5pc2F0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBjb2wtbGctNlwiICpuZ0lmPVwib3JnU2VsZWN0ZWREZXRhaWxzICYmICFpc0d1aWRlXCI+XHJcbiAgICAgIDxsaWItZGV0YWlsLW9yZ2FuaXNhdGlvbiBbb3JnXT1cIm9yZ1NlbGVjdGVkRGV0YWlsc1wiIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAob3JnQ2hhbmdlZCk9J29yZ0FkZGVkKCRldmVudCknPjwvbGliLWRldGFpbC1vcmdhbmlzYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
|