@smarterplan/ngx-smarterplan-admin 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/admin/admin.component.mjs +36 -0
- package/esm2022/lib/chevron/chevron.component.mjs +19 -0
- package/{esm2020 → esm2022}/lib/guest-link/guest-link.component.mjs +70 -62
- package/esm2022/lib/guide.guard.mjs +29 -0
- package/{esm2020 → esm2022}/lib/helpers.mjs +24 -24
- package/esm2022/lib/name-from-id.pipe.mjs +31 -0
- package/esm2022/lib/ngx-smarterplan-admin-routing.module.mjs +48 -0
- package/esm2022/lib/ngx-smarterplan-admin.module.mjs +89 -0
- package/esm2022/lib/ngx-smarterplan-admin.service.mjs +15 -0
- package/esm2022/lib/organisation/organisation.component.mjs +182 -0
- package/esm2022/lib/sp-admin.guard.mjs +29 -0
- package/esm2022/lib/user/detail-organisation/detail-organisation.component.mjs +207 -0
- package/esm2022/lib/user/form-mission/form-mission.component.mjs +290 -0
- package/esm2022/lib/user/form-organisation/form-organisation.component.mjs +139 -0
- package/esm2022/lib/user/user-mission-form/user-mission-form.component.mjs +132 -0
- package/esm2022/lib/user/user.component.mjs +353 -0
- package/esm2022/lib/visitor/create-batch/create-batch.component.mjs +112 -0
- package/esm2022/lib/visitor/template/template.component.mjs +295 -0
- package/esm2022/lib/visitor/visitor.component.mjs +318 -0
- package/{esm2020 → esm2022}/public-api.mjs +5 -5
- package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-admin.mjs +4 -4
- package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs +2205 -2065
- package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/admin/admin.component.d.ts +13 -13
- package/lib/chevron/chevron.component.d.ts +9 -9
- package/lib/guest-link/guest-link.component.d.ts +20 -20
- package/lib/guide.guard.d.ts +11 -11
- package/lib/helpers.d.ts +2 -2
- package/lib/name-from-id.pipe.d.ts +11 -11
- package/lib/ngx-smarterplan-admin-routing.module.d.ts +7 -7
- package/lib/ngx-smarterplan-admin.module.d.ts +26 -26
- package/lib/ngx-smarterplan-admin.service.d.ts +6 -6
- package/lib/organisation/organisation.component.d.ts +54 -54
- package/lib/sp-admin.guard.d.ts +11 -11
- package/lib/user/detail-organisation/detail-organisation.component.d.ts +49 -49
- package/lib/user/form-mission/form-mission.component.d.ts +63 -63
- package/lib/user/form-organisation/form-organisation.component.d.ts +32 -32
- package/lib/user/user-mission-form/user-mission-form.component.d.ts +32 -32
- package/lib/user/user.component.d.ts +102 -102
- package/lib/visitor/create-batch/create-batch.component.d.ts +23 -23
- package/lib/visitor/template/template.component.d.ts +58 -58
- package/lib/visitor/visitor.component.d.ts +70 -70
- package/package.json +10 -16
- package/public-api.d.ts +2 -2
- package/esm2020/lib/admin/admin.component.mjs +0 -34
- package/esm2020/lib/chevron/chevron.component.mjs +0 -19
- package/esm2020/lib/guide.guard.mjs +0 -26
- package/esm2020/lib/name-from-id.pipe.mjs +0 -29
- package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +0 -47
- package/esm2020/lib/ngx-smarterplan-admin.module.mjs +0 -88
- package/esm2020/lib/ngx-smarterplan-admin.service.mjs +0 -14
- package/esm2020/lib/organisation/organisation.component.mjs +0 -171
- package/esm2020/lib/sp-admin.guard.mjs +0 -26
- package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +0 -191
- package/esm2020/lib/user/form-mission/form-mission.component.mjs +0 -265
- package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +0 -125
- package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +0 -121
- package/esm2020/lib/user/user.component.mjs +0 -336
- package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +0 -106
- package/esm2020/lib/visitor/template/template.component.mjs +0 -277
- package/esm2020/lib/visitor/visitor.component.mjs +0 -299
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +0 -2245
- package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +0 -1
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { Component } from "@angular/core";
|
|
2
|
-
import { Validators, } from "@angular/forms";
|
|
3
|
-
import { ProfileEntity, removeNullKeysFromObject, RoleStatus } from "@smarterplan/ngx-smarterplan-core";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
6
|
-
import * as i2 from "@angular/forms";
|
|
7
|
-
import * as i3 from "@ngx-translate/core";
|
|
8
|
-
import * as i4 from "@angular/common";
|
|
9
|
-
import * as i5 from "../chevron/chevron.component";
|
|
10
|
-
export class OrganisationComponent {
|
|
11
|
-
constructor(orgService, fb, userService, missionService, translate, propertyService) {
|
|
12
|
-
this.orgService = orgService;
|
|
13
|
-
this.fb = fb;
|
|
14
|
-
this.userService = userService;
|
|
15
|
-
this.missionService = missionService;
|
|
16
|
-
this.translate = translate;
|
|
17
|
-
this.propertyService = propertyService;
|
|
18
|
-
this.admins = [];
|
|
19
|
-
this.clients = [];
|
|
20
|
-
this.details = -1;
|
|
21
|
-
this.query = "";
|
|
22
|
-
this.error = null;
|
|
23
|
-
this.create = false;
|
|
24
|
-
this.working = false;
|
|
25
|
-
this.isAddingAdmin = false;
|
|
26
|
-
this.loading = false;
|
|
27
|
-
this.editing = false;
|
|
28
|
-
// fullAccess true gives access to all orgs
|
|
29
|
-
// this is reserved to Smarterplan ADMINs
|
|
30
|
-
this.fullAccess = false;
|
|
31
|
-
}
|
|
32
|
-
async ngOnInit() {
|
|
33
|
-
this.resetList();
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* resetList fetches a fresh organisation list from server
|
|
37
|
-
*/
|
|
38
|
-
async resetList() {
|
|
39
|
-
this.loading = true;
|
|
40
|
-
await this.missionService
|
|
41
|
-
.getMissionsByOrderedOrganisation("6e28201f-4679-4c29-9d2d-8a325f57cee9")
|
|
42
|
-
.then(async (missions) => {
|
|
43
|
-
if (missions) {
|
|
44
|
-
const client = {};
|
|
45
|
-
await Promise.all(missions.map(async (m) => {
|
|
46
|
-
if (m.deletedAt) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (!client.hasOwnProperty(m.organisationID)) {
|
|
50
|
-
client[m.organisationID] = {
|
|
51
|
-
name: m.organisation.name,
|
|
52
|
-
organisation: m.organisation,
|
|
53
|
-
adminMissions: [],
|
|
54
|
-
properties: [],
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
if (m.role === RoleStatus.ADMIN) {
|
|
58
|
-
const alreadyAdmin = client[m.organisationID].adminMissions.filter((mis) => mis.user.id === m.userID);
|
|
59
|
-
if (alreadyAdmin.length === 0) {
|
|
60
|
-
client[m.organisationID].adminMissions.push({
|
|
61
|
-
user: new ProfileEntity(m.user),
|
|
62
|
-
mission: m,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// get properties
|
|
67
|
-
const properties = await this.propertyService.getPropertiesForOrganisation(m.organisationID);
|
|
68
|
-
client[m.organisationID].properties = properties
|
|
69
|
-
.filter((property) => !property.deletedAt && property.space)
|
|
70
|
-
.map((property) => property.space.name);
|
|
71
|
-
}));
|
|
72
|
-
this.clients = Object.values(client);
|
|
73
|
-
}
|
|
74
|
-
this.loading = false;
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* onToggleDetail folds/unfolds details for a given organisation
|
|
79
|
-
* @param i index of the organisation to be toggled
|
|
80
|
-
*/
|
|
81
|
-
onToggleDetail(index) {
|
|
82
|
-
this.details = index === this.details ? -1 : index;
|
|
83
|
-
}
|
|
84
|
-
onAdd() {
|
|
85
|
-
this.create = true;
|
|
86
|
-
this.form = this.fb.group({
|
|
87
|
-
name: [null, [Validators.required]],
|
|
88
|
-
address: [""],
|
|
89
|
-
city: [""],
|
|
90
|
-
postal: [null],
|
|
91
|
-
siret: [null],
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
onEdit(org) {
|
|
95
|
-
this.create = false;
|
|
96
|
-
this.editing = true;
|
|
97
|
-
this.form = this.fb.group({
|
|
98
|
-
id: [org.id],
|
|
99
|
-
name: [org.name, [Validators.required]],
|
|
100
|
-
address: [org.address],
|
|
101
|
-
city: [org.city],
|
|
102
|
-
postal: [org.postal],
|
|
103
|
-
siret: [org.siret],
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
onCancel() {
|
|
107
|
-
// this.form = null;
|
|
108
|
-
this.form.reset();
|
|
109
|
-
this.create = false;
|
|
110
|
-
this.editing = false;
|
|
111
|
-
}
|
|
112
|
-
get name() {
|
|
113
|
-
return this.form.get("name");
|
|
114
|
-
}
|
|
115
|
-
get email() {
|
|
116
|
-
return this.form.get("user").get("email");
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Handle creation or update of organisation
|
|
120
|
-
* @see 174
|
|
121
|
-
*/
|
|
122
|
-
async onSubmitOrg() {
|
|
123
|
-
this.working = true;
|
|
124
|
-
const formValue = this.form.value;
|
|
125
|
-
removeNullKeysFromObject(formValue);
|
|
126
|
-
let orga;
|
|
127
|
-
try {
|
|
128
|
-
if (this.create) {
|
|
129
|
-
orga = await this.orgService.createOrganisation(formValue);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
orga = await this.orgService.updateOrganisation(formValue);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
this.error = true;
|
|
137
|
-
console.error(error);
|
|
138
|
-
}
|
|
139
|
-
await this.resetList();
|
|
140
|
-
this.working = false;
|
|
141
|
-
this.create = false;
|
|
142
|
-
this.editing = false;
|
|
143
|
-
this.fileToUpload = null;
|
|
144
|
-
this.form.reset();
|
|
145
|
-
}
|
|
146
|
-
onArchive(_) {
|
|
147
|
-
console.log("Unimplemented");
|
|
148
|
-
}
|
|
149
|
-
onDismiss() {
|
|
150
|
-
this.error = null;
|
|
151
|
-
}
|
|
152
|
-
async onDeleteOrg(org) {
|
|
153
|
-
const message = this.translate.instant("confirm.deleteOrganisation");
|
|
154
|
-
if (window.confirm(message) &&
|
|
155
|
-
org.id !== "6e28201f-4679-4c29-9d2d-8a325f57cee9") {
|
|
156
|
-
const propertiesToDelete = await this.propertyService.getPropertiesForOrganisation(org.id);
|
|
157
|
-
await this.orgService.deleteOrganisation(org.id);
|
|
158
|
-
(await this.missionService.getMissionsByOrganisation(org.id)).map((m) => this.missionService.softDeleteMission(m.id));
|
|
159
|
-
await Promise.all(propertiesToDelete.map(async (property) => {
|
|
160
|
-
await this.propertyService.deleteProperty(property.id);
|
|
161
|
-
}));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
OrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.UntypedFormBuilder }, { token: i1.BaseUserService }, { token: i1.MissionService }, { token: i3.TranslateService }, { token: i1.PropertyService }], target: i0.ɵɵFactoryTarget.Component });
|
|
166
|
-
OrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OrganisationComponent, selector: "lib-organisation", ngImport: i0, template: "<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <h3>{{'SmarterPlan Client Organisations' | translate}}</h3>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\r\n <strong>{{'Error' | translate}}!</strong> We haven't been able to fulfil your request.\r\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" (click)=\"onDismiss()\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!create && !editing\">\r\n <div class=\"d-flex justify-content-between align-items-center p-1\">\r\n <input class=\"form-control search-button\" [(ngModel)]=\"query\" i18n-placeholder placeholder=\"Search\"\r\n type=\"text\"> \r\n </div>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAdd()\">{{'Add new client organisation' |\r\n translate}}</button> -->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of clients; index as index\"\r\n (click)=\"onToggleDetail(index)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.name}}\r\n <lib-chevron [conditionShowing]=\"index==details\"></lib-chevron>\r\n <!-- <ic-icon [icon]=\"index==details ? chevronDown : chevronRight\"></ic-icon> -->\r\n </div>\r\n\r\n <div *ngIf=\"index==details\">\r\n <ul class=\"list-group list-group-flush\">\r\n <!-- <li class=\"list-group-item bg-transparent\">{{'Activit\u00E9' | translate}}</li> -->\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{ a.organisation.address }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{ 'Postal Code' | translate}}: {{ a.organisation.postal }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate}}: {{ a.organisation.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate}}: {{ a.organisation.siret ?\r\n a.organisation.siret : 'Not provided' | translate }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate}}: {{ a.organisation.createdAt | date:'long' }}\r\n </li>\r\n <ng-container *ngIf=\"a.adminMissions.length > 0\">\r\n <li *ngIf=\"a.adminMissions.length <= 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User' | translate}} :</li>\r\n <li *ngIf=\"a.adminMissions.length > 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User(s)' | translate}} :</li>\r\n <li class=\"list-group-item list-group-item-action\"\r\n *ngFor=\"let admin of a.adminMissions; index as index\" (click)=\"onToggleDetail(index)\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\"> {{admin.user.displayName}} ({{admin.user.email}})\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill\" style=\"float: right;\"\r\n (click)=\"onRemoveAdmin(admin)\">\r\n {{'Remove'|translate}}</button> \r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Phone'}}: {{admin.user.phone}}</li> -->\r\n </ul>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"a.adminMissions.length == 0\">\r\n <li class=\"list-group-item bg-warning\"><span class=\"badge badge-warning\">\r\n {{'Warning' | translate}}</span> {{'No Administrator User'| translate}} </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"a.properties.length > 0\">\r\n <li class=\"list-group-item bg-transparent\">{{'Locations' | translate}}: </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let property of a.properties\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\">{{property}}</li>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onEdit(a.organisation)\">\r\n {{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onArchive(a.organisation)\" disabled>\r\n {{'Archive' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onDeleteOrg(a.organisation)\">\r\n {{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"form && (create || editing)\">\r\n <form (ngSubmit)=\"onSubmitOrg()\" [formGroup]=\"form\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name 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-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n <div *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Save' | 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 </form>\r\n </div>\r\n <!--<spOrganisationForm [model]=\" editingOrganisation\" (submit)=\"onSave($event)\" (cancel)=\"onCancel()\">\r\n </spOrganisationForm>-->\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- <div>{{'Administrator User' | translate}}</div>\r\n <div formGroupName=\"user\" *ngIf=\"create || isAddingAdmin\">\r\n <div *ngIf=\"form\" class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-9\">\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-3 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-9\">\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-3 col-form-label\">{{'Phone' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"phone\">\r\n </div>\r\n </div>\r\n </div> -->", styles: [".form-group{margin:1.5rem 0}.search-button{width:-moz-fit-content;width:fit-content}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "component", type: i5.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OrganisationComponent, decorators: [{
|
|
168
|
-
type: Component,
|
|
169
|
-
args: [{ selector: 'lib-organisation', template: "<div class=\"container-fluid\" class=\"dashboard-tab\">\r\n <h3>{{'SmarterPlan Client Organisations' | translate}}</h3>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n\r\n <div *ngIf=\"error\" class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\r\n <strong>{{'Error' | translate}}!</strong> We haven't been able to fulfil your request.\r\n <button type=\"button\" class=\"close\" data-dismiss=\"alert\" (click)=\"onDismiss()\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!create && !editing\">\r\n <div class=\"d-flex justify-content-between align-items-center p-1\">\r\n <input class=\"form-control search-button\" [(ngModel)]=\"query\" i18n-placeholder placeholder=\"Search\"\r\n type=\"text\"> \r\n </div>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill\" (click)=\"onAdd()\">{{'Add new client organisation' |\r\n translate}}</button> -->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of clients; index as index\"\r\n (click)=\"onToggleDetail(index)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.name}}\r\n <lib-chevron [conditionShowing]=\"index==details\"></lib-chevron>\r\n <!-- <ic-icon [icon]=\"index==details ? chevronDown : chevronRight\"></ic-icon> -->\r\n </div>\r\n\r\n <div *ngIf=\"index==details\">\r\n <ul class=\"list-group list-group-flush\">\r\n <!-- <li class=\"list-group-item bg-transparent\">{{'Activit\u00E9' | translate}}</li> -->\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate}}: {{ a.organisation.address }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{ 'Postal Code' | translate}}: {{ a.organisation.postal }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate}}: {{ a.organisation.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate}}: {{ a.organisation.siret ?\r\n a.organisation.siret : 'Not provided' | translate }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate}}: {{ a.organisation.createdAt | date:'long' }}\r\n </li>\r\n <ng-container *ngIf=\"a.adminMissions.length > 0\">\r\n <li *ngIf=\"a.adminMissions.length <= 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User' | translate}} :</li>\r\n <li *ngIf=\"a.adminMissions.length > 1\" class=\"list-group-item bg-transparent\">\r\n {{'Administrator User(s)' | translate}} :</li>\r\n <li class=\"list-group-item list-group-item-action\"\r\n *ngFor=\"let admin of a.adminMissions; index as index\" (click)=\"onToggleDetail(index)\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\"> {{admin.user.displayName}} ({{admin.user.email}})\r\n <!-- <button type=\"button\" class=\"btn btn-primary rounded-pill\" style=\"float: right;\"\r\n (click)=\"onRemoveAdmin(admin)\">\r\n {{'Remove'|translate}}</button> \r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Phone'}}: {{admin.user.phone}}</li> -->\r\n </ul>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"a.adminMissions.length == 0\">\r\n <li class=\"list-group-item bg-warning\"><span class=\"badge badge-warning\">\r\n {{'Warning' | translate}}</span> {{'No Administrator User'| translate}} </li>\r\n </ng-container>\r\n <ng-container *ngIf=\"a.properties.length > 0\">\r\n <li class=\"list-group-item bg-transparent\">{{'Locations' | translate}}: </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let property of a.properties\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"ml-4\">{{property}}</li>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onEdit(a.organisation)\">\r\n {{'Edit' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onArchive(a.organisation)\" disabled>\r\n {{'Archive' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill action-button\"\r\n (click)=\"onDeleteOrg(a.organisation)\">\r\n {{'Delete' | translate}}</button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"form && (create || editing)\">\r\n <form (ngSubmit)=\"onSubmitOrg()\" [formGroup]=\"form\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name 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-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n <div *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"working || form.invalid\">{{'Save' | 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 </form>\r\n </div>\r\n <!--<spOrganisationForm [model]=\" editingOrganisation\" (submit)=\"onSave($event)\" (cancel)=\"onCancel()\">\r\n </spOrganisationForm>-->\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- <div>{{'Administrator User' | translate}}</div>\r\n <div formGroupName=\"user\" *ngIf=\"create || isAddingAdmin\">\r\n <div *ngIf=\"form\" class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-9\">\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-3 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-9\">\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-3 col-form-label\">{{'Phone' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"phone\">\r\n </div>\r\n </div>\r\n </div> -->", styles: [".form-group{margin:1.5rem 0}.search-button{width:-moz-fit-content;width:fit-content}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
|
|
170
|
-
}], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.UntypedFormBuilder }, { type: i1.BaseUserService }, { type: i1.MissionService }, { type: i3.TranslateService }, { type: i1.PropertyService }]; } });
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pc2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL29yZ2FuaXNhdGlvbi9vcmdhbmlzYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvb3JnYW5pc2F0aW9uL29yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFJSCxVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQStFLGFBQWEsRUFBbUIsd0JBQXdCLEVBQUUsVUFBVSxFQUFrQixNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7O0FBUXROLE1BQU0sT0FBTyxxQkFBcUI7SUFrQzlCLFlBQ1ksVUFBK0IsRUFDL0IsRUFBc0IsRUFDdEIsV0FBNEIsRUFDNUIsY0FBOEIsRUFDOUIsU0FBMkIsRUFDM0IsZUFBZ0M7UUFMaEMsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFDL0IsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUF0QzVDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFFWixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWIsWUFBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLFVBQUssR0FBRyxJQUFJLENBQUM7UUFJYixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVo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TGpDLFNBQVM7K0JBQ0ksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gICAgVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gICAgVW50eXBlZEZvcm1Hcm91cCxcclxuICAgIEFic3RyYWN0Q29udHJvbCxcclxuICAgIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEJhc2VVc2VyU2VydmljZSwgTWlzc2lvblNlcnZpY2UsIE9yZ2FuaXNhdGlvbiwgT3JnYW5pc2F0aW9uU2VydmljZSwgUHJvZmlsZSwgUHJvZmlsZUVudGl0eSwgUHJvcGVydHlTZXJ2aWNlLCByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3QsIFJvbGVTdGF0dXMsIHVwbG9hZEZpbGVUb1MzIH0gZnJvbSBcIkBzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZVwiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItb3JnYW5pc2F0aW9uJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9vcmdhbmlzYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZ2FuaXNhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgYWRtaW5zID0gW107XHJcblxyXG4gICAgY2xpZW50cyA9IFtdO1xyXG5cclxuICAgIGRldGFpbHMgPSAtMTtcclxuXHJcbiAgICBxdWVyeSA9IFwiXCI7XHJcblxyXG4gICAgZXJyb3IgPSBudWxsO1xyXG5cclxuICAgIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gICAgY3JlYXRlID0gZmFsc2U7XHJcblxyXG4gICAgd29ya2luZyA9IGZhbHNlO1xyXG5cclxuICAgIGlzQWRkaW5nQWRtaW4gPSBmYWxzZTtcclxuXHJcbiAgICBtZTogUHJvZmlsZTtcclxuXHJcbiAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgZWRpdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGZ1bGxBY2Nlc3MgdHJ1ZSBnaXZlcyBhY2Nlc3MgdG8gYWxsIG9yZ3NcclxuICAgIC8vIHRoaXMgaXMgcmVzZXJ2ZWQgdG8gU21hcnRlcnBsYW4gQURNSU5zXHJcbiAgICBmdWxsQWNjZXNzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZmlsZVRvVXBsb2FkOiBGaWxlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgb3JnU2VydmljZTogT3JnYW5pc2F0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcHJvcGVydHlTZXJ2aWNlOiBQcm9wZXJ0eVNlcnZpY2UsXHJcbiAgICApIHsgfVxyXG5cclxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXNldExpc3QgZmV0Y2hlcyBhIGZyZXNoIG9yZ2FuaXNhdGlvbiBsaXN0IGZyb20gc2VydmVyXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlc2V0TGlzdCgpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2VcclxuICAgICAgICAgICAgLmdldE1pc3Npb25zQnlPcmRlcmVkT3JnYW5pc2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgXCI2ZTI4MjAxZi00Njc5LTRjMjktOWQyZC04YTMyNWY1N2NlZTlcIixcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAudGhlbihhc3luYyAobWlzc2lvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChtaXNzaW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW9ucy5tYXAoYXN5bmMgKG0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLmRlbGV0ZWRBdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xpZW50Lmhhc093blByb3BlcnR5KG0ub3JnYW5pc2F0aW9uSUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50W20ub3JnYW5pc2F0aW9uSURdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtLm9yZ2FuaXNhdGlvbi5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb246IG0ub3JnYW5pc2F0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbk1pc3Npb25zOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLnJvbGUgPT09IFJvbGVTdGF0dXMuQURNSU4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5QWRtaW4gPSBjbGllbnRbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ub3JnYW5pc2F0aW9uSURcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmFkbWluTWlzc2lvbnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlzKSA9PiBtaXMudXNlci5pZCA9PT0gbS51c2VySUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUFkbWluLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRbbS5vcmdhbmlzYXRpb25JRF0uYWRtaW5NaXNzaW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IG5ldyBQcm9maWxlRW50aXR5KG0udXNlciksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbjogbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHByb3BlcnRpZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvcGVydHlTZXJ2aWNlLmdldFByb3BlcnRpZXNGb3JPcmdhbmlzYXRpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFttLm9yZ2FuaXNhdGlvbklEXS5wcm9wZXJ0aWVzID0gcHJvcGVydGllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wZXJ0eSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwcm9wZXJ0eS5kZWxldGVkQXQgJiYgcHJvcGVydHkuc3BhY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5zcGFjZS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSBPYmplY3QudmFsdWVzKGNsaWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBvblRvZ2dsZURldGFpbCBmb2xkcy91bmZvbGRzIGRldGFpbHMgZm9yIGEgZ2l2ZW4gb3JnYW5pc2F0aW9uXHJcbiAgICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgb3JnYW5pc2F0aW9uIHRvIGJlIHRvZ2dsZWRcclxuICAgICAqL1xyXG4gICAgb25Ub2dnbGVEZXRhaWwoaW5kZXgpIHtcclxuICAgICAgICB0aGlzLmRldGFpbHMgPSBpbmRleCA9PT0gdGhpcy5kZXRhaWxzID8gLTEgOiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZCgpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIG5hbWU6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgICBhZGRyZXNzOiBbXCJcIl0sXHJcbiAgICAgICAgICAgIGNpdHk6IFtcIlwiXSxcclxuICAgICAgICAgICAgcG9zdGFsOiBbbnVsbF0sXHJcbiAgICAgICAgICAgIHNpcmV0OiBbbnVsbF0sXHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdChvcmc6IE9yZ2FuaXNhdGlvbikge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgaWQ6IFtvcmcuaWRdLFxyXG4gICAgICAgICAgICBuYW1lOiBbb3JnLm5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgICAgICAgIGFkZHJlc3M6IFtvcmcuYWRkcmVzc10sXHJcbiAgICAgICAgICAgIGNpdHk6IFtvcmcuY2l0eV0sXHJcbiAgICAgICAgICAgIHBvc3RhbDogW29yZy5wb3N0YWxdLFxyXG4gICAgICAgICAgICBzaXJldDogW29yZy5zaXJldF0sXHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FuY2VsKCkge1xyXG4gICAgICAgIC8vIHRoaXMuZm9ybSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwibmFtZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZW1haWwoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldChcInVzZXJcIikuZ2V0KFwiZW1haWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgY3JlYXRpb24gb3IgdXBkYXRlIG9mIG9yZ2FuaXNhdGlvblxyXG4gICAgICogQHNlZSAxNzRcclxuICAgICAqL1xyXG4gICAgYXN5bmMgb25TdWJtaXRPcmcoKSB7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0KGZvcm1WYWx1ZSk7XHJcbiAgICAgICAgbGV0IG9yZ2E7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3JlYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBvcmdhID0gYXdhaXQgdGhpcy5vcmdTZXJ2aWNlLmNyZWF0ZU9yZ2FuaXNhdGlvbihmb3JtVmFsdWUgYXMgT3JnYW5pc2F0aW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9yZ2EgPSBhd2FpdCB0aGlzLm9yZ1NlcnZpY2UudXBkYXRlT3JnYW5pc2F0aW9uKGZvcm1WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZpbGVUb1VwbG9hZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25BcmNoaXZlKF8pIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlVuaW1wbGVtZW50ZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgb25EaXNtaXNzKCkge1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlT3JnKG9yZzogT3JnYW5pc2F0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmRlbGV0ZU9yZ2FuaXNhdGlvblwiKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpICYmXHJcbiAgICAgICAgICAgIG9yZy5pZCAhPT0gXCI2ZTI4MjAxZi00Njc5LTRjMjktOWQyZC04YTMyNWY1N2NlZTlcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVG9EZWxldGUgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9wZXJ0eVNlcnZpY2UuZ2V0UHJvcGVydGllc0Zvck9yZ2FuaXNhdGlvbihvcmcuaWQpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9yZ1NlcnZpY2UuZGVsZXRlT3JnYW5pc2F0aW9uKG9yZy5pZCk7XHJcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlPcmdhbmlzYXRpb24ob3JnLmlkKSkubWFwKFxyXG4gICAgICAgICAgICAgICAgKG0pID0+IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obS5pZCksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1RvRGVsZXRlLm1hcChhc3luYyAocHJvcGVydHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb3BlcnR5U2VydmljZS5kZWxldGVQcm9wZXJ0eShwcm9wZXJ0eS5pZCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCIgY2xhc3M9XCJkYXNoYm9hcmQtdGFiXCI+XHJcbiAgPGgzPnt7J1NtYXJ0ZXJQbGFuIENsaWVudCBPcmdhbmlzYXRpb25zJyB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggY29sLWxnLTZcIj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGFsZXJ0LWRpc21pc3NpYmxlIGZhZGUgc2hvd1wiIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgIDxzdHJvbmc+e3snRXJyb3InIHwgdHJhbnNsYXRlfX0hPC9zdHJvbmc+IFdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGZ1bGZpbCB5b3VyIHJlcXVlc3QuXHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cImFsZXJ0XCIgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XHJcbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhY3JlYXRlICYmICFlZGl0aW5nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgcC0xXCI+XHJcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWJ1dHRvblwiIFsobmdNb2RlbCldPVwicXVlcnlcIiBpMThuLXBsYWNlaG9sZGVyIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIj4mbmJzcDtcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25BZGQoKVwiPnt7J0FkZCBuZXcgY2xpZW50IG9yZ2FuaXNhdGlvbicgfFxyXG4gICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCIgKm5nRm9yPVwibGV0IGEgb2YgY2xpZW50czsgaW5kZXggYXMgaW5kZXhcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWwoaW5kZXgpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAge3thLm5hbWV9fVxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJpbmRleD09ZGV0YWlsc1wiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgPCEtLSA8aWMtaWNvbiBbaWNvbl09XCJpbmRleD09ZGV0YWlscyA/IGNoZXZyb25Eb3duIDogY2hldnJvblJpZ2h0XCI+PC9pYy1pY29uPiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5kZXg9PWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWN0aXZpdMOpJyB8IHRyYW5zbGF0ZX19PC9saT4gLS0+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBZGRyZXNzJyB8IHRyYW5zbGF0ZX19OiB7eyBhLm9yZ2FuaXNhdGlvbi5hZGRyZXNzIH19PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7ICdQb3N0YWwgQ29kZScgfCB0cmFuc2xhdGV9fToge3sgYS5vcmdhbmlzYXRpb24ucG9zdGFsIH19XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ2l0eScgfCB0cmFuc2xhdGV9fToge3sgYS5vcmdhbmlzYXRpb24uY2l0eSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydTSVJFVCcgfCB0cmFuc2xhdGV9fToge3sgYS5vcmdhbmlzYXRpb24uc2lyZXQgP1xyXG4gICAgICAgICAgICAgICAgICBhLm9yZ2FuaXNhdGlvbi5zaXJldCA6ICdOb3QgcHJvdmlkZWQnIHwgdHJhbnNsYXRlIH19PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0NyZWF0ZWQnIHwgdHJhbnNsYXRlfX06IHt7IGEub3JnYW5pc2F0aW9uLmNyZWF0ZWRBdCB8IGRhdGU6J2xvbmcnIH19XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImEuYWRtaW5NaXNzaW9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImEuYWRtaW5NaXNzaW9ucy5sZW5ndGggPD0gMVwiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snQWRtaW5pc3RyYXRvciBVc2VyJyB8IHRyYW5zbGF0ZX19IDo8L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJhLmFkbWluTWlzc2lvbnMubGVuZ3RoID4gMVwiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snQWRtaW5pc3RyYXRvciBVc2VyKHMpJyB8IHRyYW5zbGF0ZX19IDo8L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFkbWluIG9mIGEuYWRtaW5NaXNzaW9uczsgaW5kZXggYXMgaW5kZXhcIiAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWwoaW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtbC00XCI+IHt7YWRtaW4udXNlci5kaXNwbGF5TmFtZX19ICh7e2FkbWluLnVzZXIuZW1haWx9fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiBzdHlsZT1cImZsb2F0OiByaWdodDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlQWRtaW4oYWRtaW4pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydSZW1vdmUnfHRyYW5zbGF0ZX19PC9idXR0b24+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydQaG9uZSd9fToge3thZG1pbi51c2VyLnBob25lfX08L2xpPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImEuYWRtaW5NaXNzaW9ucy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctd2FybmluZ1wiPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2Utd2FybmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3snV2FybmluZycgfCB0cmFuc2xhdGV9fTwvc3Bhbj4ge3snTm8gQWRtaW5pc3RyYXRvciBVc2VyJ3wgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImEucHJvcGVydGllcy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0xvY2F0aW9ucycgfCB0cmFuc2xhdGV9fTogPC9saT5cclxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgYS5wcm9wZXJ0aWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtbC00XCI+e3twcm9wZXJ0eX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdChhLm9yZ2FuaXNhdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAge3snRWRpdCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BcmNoaXZlKGEub3JnYW5pc2F0aW9uKVwiIGRpc2FibGVkPlxyXG4gICAgICAgICAgICAgICAgICB7eydBcmNoaXZlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZU9yZyhhLm9yZ2FuaXNhdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAge3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJmb3JtICYmIChjcmVhdGUgfHwgZWRpdGluZylcIj5cclxuICAgICAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXRPcmcoKVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snTmFtZScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJuYW1lLmludmFsaWQgJiYgbmFtZS50b3VjaGVkXCIgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAge3snQSBuYW1lIGlzIHJlcXVpcmVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0NpdHknIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydQb3N0YWwgY29kZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9zdGFsXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snU0lSRVQnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInNpcmV0XCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwid29ya2luZ1wiPlxyXG4gICAgICAgICAgICA8bGliLWxvYWRlcj48L2xpYi1sb2FkZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid29ya2luZyB8fCBmb3JtLmludmFsaWRcIj57eydTYXZlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cIndvcmtpbmdcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIj57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS08c3BPcmdhbmlzYXRpb25Gb3JtIFttb2RlbF09XCIgZWRpdGluZ09yZ2FuaXNhdGlvblwiIChzdWJtaXQpPVwib25TYXZlKCRldmVudClcIiAoY2FuY2VsKT1cIm9uQ2FuY2VsKClcIj5cclxuICAgICAgICAgICAgICA8L3NwT3JnYW5pc2F0aW9uRm9ybT4tLT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gPGRpdj57eydBZG1pbmlzdHJhdG9yIFVzZXInIHwgdHJhbnNsYXRlfX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwidXNlclwiICpuZ0lmPVwiY3JlYXRlIHx8IGlzQWRkaW5nQWRtaW5cIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybVwiIGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snRW1haWwnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJlbWFpbC5pbnZhbGlkICYmIGVtYWlsLnRvdWNoZWRcIiByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snQW4gZW1haWwgaXMgcmVxdWlyZWQnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXJzdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydMYXN0IG5hbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFzdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydQaG9uZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwaG9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT4iXX0=
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
4
|
-
import * as i2 from "@angular/router";
|
|
5
|
-
export class SpAdminGuard {
|
|
6
|
-
constructor(userService, router) {
|
|
7
|
-
this.userService = userService;
|
|
8
|
-
this.router = router;
|
|
9
|
-
}
|
|
10
|
-
canActivate(_route, _state) {
|
|
11
|
-
if (this.userService.cu && this.userService.isSPAdmin()) {
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
alert("You are not authorised to access this page");
|
|
15
|
-
return this.router.parseUrl('/');
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
SpAdminGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SpAdminGuard, deps: [{ token: i1.BaseUserService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
19
|
-
SpAdminGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SpAdminGuard, providedIn: 'root' });
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SpAdminGuard, decorators: [{
|
|
21
|
-
type: Injectable,
|
|
22
|
-
args: [{
|
|
23
|
-
providedIn: 'root'
|
|
24
|
-
}]
|
|
25
|
-
}], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i2.Router }]; } });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3AtYWRtaW4uZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi9zcC1hZG1pbi5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBUTNDLE1BQU0sT0FBTyxZQUFZO0lBQ3JCLFlBQW9CLFdBQTRCLEVBQVUsTUFBYztRQUFwRCxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQUksQ0FBQztJQUU3RSxXQUFXLENBQ1AsTUFBOEIsRUFDOUIsTUFBMkI7UUFFM0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7OzBHQVpRLFlBQVk7OEdBQVosWUFBWSxjQUZULE1BQU07NEZBRVQsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIENhbkFjdGl2YXRlLCBSb3V0ZXIsIFJvdXRlclN0YXRlU25hcHNob3QsIFVybFRyZWUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwQWRtaW5HdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikgeyB9XHJcblxyXG4gICAgY2FuQWN0aXZhdGUoXHJcbiAgICAgICAgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gICAgICAgIF9zdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdFxyXG4gICAgKTogYm9vbGVhbiB8IFVybFRyZWUge1xyXG4gICAgICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmN1ICYmIHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFsZXJ0KFwiWW91IGFyZSBub3QgYXV0aG9yaXNlZCB0byBhY2Nlc3MgdGhpcyBwYWdlXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5wYXJzZVVybCgnLycpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { deleteFromS3, getSignedFile, removeNullKeysFromObject, uploadFileToS3 } from '@smarterplan/ngx-smarterplan-core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
5
|
-
import * as i2 from "@angular/forms";
|
|
6
|
-
import * as i3 from "@ngx-translate/core";
|
|
7
|
-
import * as i4 from "@angular/common";
|
|
8
|
-
export class DetailOrganisationComponent {
|
|
9
|
-
constructor(organisationService,
|
|
10
|
-
// private localStripe: StripeService,
|
|
11
|
-
formBuilder, propertyService, missionService, translate) {
|
|
12
|
-
this.organisationService = organisationService;
|
|
13
|
-
this.formBuilder = formBuilder;
|
|
14
|
-
this.propertyService = propertyService;
|
|
15
|
-
this.missionService = missionService;
|
|
16
|
-
this.translate = translate;
|
|
17
|
-
this.orgChanged = new EventEmitter();
|
|
18
|
-
this.loading = false;
|
|
19
|
-
this.connectingStripe = false;
|
|
20
|
-
}
|
|
21
|
-
async ngOnInit() {
|
|
22
|
-
this.myOrg = this.currentOrg.id === this.org.id;
|
|
23
|
-
if (!this.org.connectedAccountStripeID && (this.myOrg || this.isSP)) {
|
|
24
|
-
this.setConnectStripeLink();
|
|
25
|
-
}
|
|
26
|
-
if (this.org.logoUrl) {
|
|
27
|
-
this.signedLogo = await getSignedFile(this.org.logoUrl);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
ngOnChanges() {
|
|
31
|
-
this.myOrg = this.currentOrg.id === this.org.id;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Tokens were supposed to be used if Organisation exists already (created by one account) and it should be resused (by another account) instead of creating a duplicate.
|
|
35
|
-
*/
|
|
36
|
-
// async onToken() {
|
|
37
|
-
// const token = uuidv4();
|
|
38
|
-
// const expires = new Date();
|
|
39
|
-
// expires.setDate(expires.getDate() + 7); // 7 days expiration
|
|
40
|
-
// this.org = await this.organisationService.updateOrganisation({
|
|
41
|
-
// id: this.org.id,
|
|
42
|
-
// shareToken: token,
|
|
43
|
-
// tokenExpiresAt: expires.getTime(),
|
|
44
|
-
// });
|
|
45
|
-
// this.orgChanged.emit(true);
|
|
46
|
-
// }
|
|
47
|
-
prettifyToken() {
|
|
48
|
-
const expirationDate = new Date(this.org.tokenExpiresAt);
|
|
49
|
-
const diffTime = expirationDate.getTime() - Date.now();
|
|
50
|
-
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
|
51
|
-
const expirationString = diffTime < 0 ? "expired!" : `expires in ${diffDays} days`;
|
|
52
|
-
return `${this.org.shareToken.slice(0, 6)}... ${expirationString}`;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Created New Stripe Account and launches onboarding procedure (mail, phone, business details..) by Stripe
|
|
56
|
-
* @returns null
|
|
57
|
-
*/
|
|
58
|
-
// async onCreateStripe() {
|
|
59
|
-
// this.loading = true;
|
|
60
|
-
// // Make the request
|
|
61
|
-
// const responseAccount = await API.post(
|
|
62
|
-
// "stripeApi",
|
|
63
|
-
// "/create/account",
|
|
64
|
-
// {},
|
|
65
|
-
// );
|
|
66
|
-
// console.log(responseAccount);
|
|
67
|
-
// if (responseAccount.err) {
|
|
68
|
-
// this.handleStripeError(responseAccount);
|
|
69
|
-
// return;
|
|
70
|
-
// }
|
|
71
|
-
// const { account } = responseAccount;
|
|
72
|
-
// // save account id to organisation
|
|
73
|
-
// await this.organisationService.update({
|
|
74
|
-
// id: this.org.id,
|
|
75
|
-
// connectedAccountStripeID: account.id,
|
|
76
|
-
// stripeOnBoardingCompleted: false,
|
|
77
|
-
// });
|
|
78
|
-
// const { origin } = document.location;
|
|
79
|
-
// const responseAccountLinks = await this.localStripe.createAccountLink(
|
|
80
|
-
// account.id,
|
|
81
|
-
// origin,
|
|
82
|
-
// );
|
|
83
|
-
// if (responseAccountLinks.err) {
|
|
84
|
-
// this.handleStripeError(responseAccountLinks);
|
|
85
|
-
// return;
|
|
86
|
-
// }
|
|
87
|
-
// window.location.href = responseAccountLinks.accountLinks.url;
|
|
88
|
-
// this.loading = false;
|
|
89
|
-
// }
|
|
90
|
-
// async onCompleteOnboardingStripe() {
|
|
91
|
-
// this.loading = true;
|
|
92
|
-
// const responseAccountLinks = await this.localStripe.createAccountLink(
|
|
93
|
-
// this.org.connectedAccountStripeID,
|
|
94
|
-
// origin,
|
|
95
|
-
// );
|
|
96
|
-
// if (responseAccountLinks.err) {
|
|
97
|
-
// this.handleStripeError(responseAccountLinks);
|
|
98
|
-
// return;
|
|
99
|
-
// }
|
|
100
|
-
// window.location.href = responseAccountLinks.accountLinks.url;
|
|
101
|
-
// this.loading = false;
|
|
102
|
-
// }
|
|
103
|
-
// handleStripeError(stripeResponse) {
|
|
104
|
-
// alert(stripeResponse.err.raw.message);
|
|
105
|
-
// this.loading = false;
|
|
106
|
-
// }
|
|
107
|
-
/**
|
|
108
|
-
* Generate link for Launching OAuth connection with Stripe: https://stripe.com/docs/connect/oauth-standard-accounts#integrating-oauth
|
|
109
|
-
*/
|
|
110
|
-
setConnectStripeLink() {
|
|
111
|
-
setTimeout(() => {
|
|
112
|
-
const hyperlink = document.querySelector("#linkStripe");
|
|
113
|
-
if (hyperlink) {
|
|
114
|
-
const clientID = "ca_KQhYOlgR1ipOxLBBQHfQeCLoaySRVD5P"; // TODO change for live Stripe Account
|
|
115
|
-
const { origin } = document.location;
|
|
116
|
-
const returnUrl = `${origin}/stripe/redirect`;
|
|
117
|
-
hyperlink.setAttribute("href", `https://connect.stripe.com/oauth/authorize?response_type=code&client_id=${clientID}&scope=read_write&redirect_uri=${returnUrl}&state=${this.org.id}`);
|
|
118
|
-
}
|
|
119
|
-
}, 200); // wait until the element is rendered
|
|
120
|
-
}
|
|
121
|
-
/** Edit */
|
|
122
|
-
onEdit() {
|
|
123
|
-
this.editForm = this.formBuilder.group({
|
|
124
|
-
id: this.org.id,
|
|
125
|
-
name: this.org.name,
|
|
126
|
-
siret: this.org.siret,
|
|
127
|
-
city: this.org.city,
|
|
128
|
-
address: this.org.address,
|
|
129
|
-
contactDetails: this.org.contactDetails,
|
|
130
|
-
postal: this.org.postal,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
get name() {
|
|
134
|
-
return this.editForm.get("name");
|
|
135
|
-
}
|
|
136
|
-
async onSubmit() {
|
|
137
|
-
const formValue = this.editForm.value;
|
|
138
|
-
removeNullKeysFromObject(formValue);
|
|
139
|
-
try {
|
|
140
|
-
const updatedOrg = await this.organisationService.updateOrganisation(formValue);
|
|
141
|
-
this.org = updatedOrg;
|
|
142
|
-
if (this.fileToUpload) {
|
|
143
|
-
if (this.org.logoUrl) {
|
|
144
|
-
// delete the previous
|
|
145
|
-
await deleteFromS3(this.org.logoUrl);
|
|
146
|
-
}
|
|
147
|
-
await uploadFileToS3("logos/", this.fileToUpload, this.org.id).then(async (url) => {
|
|
148
|
-
await this.organisationService.updateOrganisation({ id: this.org.id, logoUrl: url });
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
console.error(JSON.stringify(error));
|
|
154
|
-
}
|
|
155
|
-
this.editForm = null;
|
|
156
|
-
}
|
|
157
|
-
onCancel() {
|
|
158
|
-
this.editForm = null;
|
|
159
|
-
}
|
|
160
|
-
handleFileInput(event) {
|
|
161
|
-
const target = event.target;
|
|
162
|
-
this.fileToUpload = target.files.item(0);
|
|
163
|
-
}
|
|
164
|
-
async onDelete() {
|
|
165
|
-
const message = this.translate.instant("confirm.deleteOrganisation");
|
|
166
|
-
if (window.confirm(message) && this.org.id !== "6e28201f-4679-4c29-9d2d-8a325f57cee9") {
|
|
167
|
-
const propertiesToDelete = await this.propertyService.getPropertiesForOrganisation(this.org.id);
|
|
168
|
-
await this.organisationService.softDeteleOrg(this.org.id);
|
|
169
|
-
(await this.missionService.getMissionsByOrganisation(this.org.id)).map((m) => this.missionService.softDeleteMission(m.id));
|
|
170
|
-
await Promise.all(propertiesToDelete.map(async (property) => {
|
|
171
|
-
await this.propertyService.deleteProperty(property.id);
|
|
172
|
-
}));
|
|
173
|
-
this.orgChanged.emit(true);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
DetailOrganisationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailOrganisationComponent, deps: [{ token: i1.OrganisationService }, { token: i2.UntypedFormBuilder }, { token: i1.PropertyService }, { token: i1.MissionService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
178
|
-
DetailOrganisationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: { org: "org", currentOrg: "currentOrg", isSP: "isSP" }, outputs: { orgChanged: "orgChanged" }, usesOnChanges: true, ngImport: i0, template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Logo' | translate }}: {{ org.logoUrl ? \"\" : \"No logo uploaded\"}} \r\n <img class=\"logo-img\" *ngIf=\"signedLogo\" [src]=\"signedLogo\">\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <!-- <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" [cdkCopyToClipboard]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li> -->\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\"> {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onDelete()\"> {{'Delete' | translate}}</button>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate token' | translate}}</button> -->\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Logo' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Add logo image' | translate}}</label>\r\n <p class=\"fileToUploadName\" *ngIf=\"fileToUpload\">{{fileToUpload.name}}</p>\r\n </div>\r\n \r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <!-- <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul> -->\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}.logo-img{height:100px;object-fit:contain;margin:4px 10px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
179
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailOrganisationComponent, decorators: [{
|
|
180
|
-
type: Component,
|
|
181
|
-
args: [{ selector: 'lib-detail-organisation', template: "<div>\r\n <h5>{{'Organisation Details' | translate }}</h5>\r\n <div *ngIf=\"!editForm\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Name' | translate}}: {{ org.name }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Logo' | translate }}: {{ org.logoUrl ? \"\" : \"No logo uploaded\"}} \r\n <img class=\"logo-img\" *ngIf=\"signedLogo\" [src]=\"signedLogo\">\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'SIRET' | translate }}: {{\r\n org.siret ? org.siret : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Address' | translate }}: {{\r\n org.address ? org.address : (\"No data\" | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'City' | translate }}: {{org.city }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Contact information' | translate}}:\r\n {{ org.contactDetails ? org.contactDetails : (\"No data\" | translate)}}</li>\r\n <!-- <li class=\"list-group-item bg-transparent\" *ngIf=\"isSP\">\r\n <div class=\"row ml-0\">\r\n <div>\r\n {{'Active token' | translate }}:\r\n {{ org.shareToken ? prettifyToken() : ('No' | translate) }}\r\n </div>\r\n <div *ngIf=\"org.shareToken && !tokenExpired\" [cdkCopyToClipboard]=\"org.shareToken\"\r\n [style.cursor]=\"'pointer'\" style=\"margin-left: 5px; max-width: 20px;\" ngbTooltip=\"Copied!\"\r\n triggers=\"click:blur\">\r\n <span class=\"iconify\" data-icon=\"mdi:content-copy\" data-inline=\"false\" data-width=\"20\"\r\n data-height=\"20\"></span>\r\n </div>\r\n </div>\r\n </li> -->\r\n </ul>\r\n <div class=\"action-button-container\">\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP || myOrg\"\r\n (click)=\"onEdit()\"> {{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onDelete()\"> {{'Delete' | translate}}</button>\r\n <!-- <button class=\"btn btn-outline-primary rounded-pill mt-2 ml-3 action-button\" *ngIf=\"isSP\"\r\n (click)=\"onToken()\">{{'Generate token' | translate}}</button> -->\r\n </div>\r\n </div>\r\n\r\n <!--Edit Form-->\r\n <div *ngIf=\"editForm\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"editForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" [class.is-invalid]=\"name.invalid && name.touched\" required\r\n formControlName=\"name\">\r\n <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Contact information' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"contactDetails\"\r\n placeholder=\"{{'Name, phone, email' | translate}}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Address' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"address\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'City' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"city\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Postal code' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"postal\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'SIRET' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"siret\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'Logo' | translate}}</label>\r\n <div class=\"col-sm-9\">\r\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\r\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\r\n {{'Add logo image' | translate}}</label>\r\n <p class=\"fileToUploadName\" *ngIf=\"fileToUpload\">{{fileToUpload.name}}</p>\r\n </div>\r\n \r\n </div>\r\n <div class=\"action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"editForm.invalid\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <!--Loading-->\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <!--Stripe-->\r\n <!-- <hr>\r\n <h5>{{'stripe.account' | translate }}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.connectedAccountStripeID\">\r\n {{'stripe.connected' | translate }}: {{org.connectedAccountStripeID.substring(0, 15) }}...</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"(isSP || myOrg) && org.stripeOnBoardingCompleted !== null\">\r\n {{'stripe.completed' | translate }}: {{org.stripeOnBoardingCompleted }}</li>\r\n </ul> -->\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}.logo-img{height:100px;object-fit:contain;margin:4px 10px}\n"] }]
|
|
182
|
-
}], ctorParameters: function () { return [{ type: i1.OrganisationService }, { type: i2.UntypedFormBuilder }, { type: i1.PropertyService }, { type: i1.MissionService }, { type: i3.TranslateService }]; }, propDecorators: { org: [{
|
|
183
|
-
type: Input
|
|
184
|
-
}], currentOrg: [{
|
|
185
|
-
type: Input
|
|
186
|
-
}], isSP: [{
|
|
187
|
-
type: Input
|
|
188
|
-
}], orgChanged: [{
|
|
189
|
-
type: Output
|
|
190
|
-
}] } });
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2RldGFpbC1vcmdhbmlzYXRpb24vZGV0YWlsLW9yZ2FuaXNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFDSCxZQUFZLEVBQUUsYUFBYSxFQUMzQix3QkFBd0IsRUFBRSxjQUFjLEVBQzNDLE1BQU0sbUNBQW1DLENBQUM7Ozs7OztBQVMzQyxNQUFNLE9BQU8sMkJBQTJCO0lBMkJwQyxZQUNZLG1CQUF3QztJQUNoRCxzQ0FBc0M7SUFDOUIsV0FBK0IsRUFDL0IsZUFBZ0MsRUFDaEMsY0FBOEIsRUFDOUIsU0FBMkI7UUFMM0Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUV4QyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQTFCN0IsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFNbkQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFtQnJCLENBQUM7SUFFTCxLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsd0JBQXdCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUMvQjtRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNEO0lBRUwsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFDRDs7T0FFRztJQUNILG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsa0NBQWtDO0lBQ2xDLG1FQUFtRTtJQUNuRSxxRUFBcUU7SUFDckUsMkJBQTJCO0lBQzNCLDZCQUE2QjtJQUM3Qiw2Q0FBNkM7SUFDN0MsVUFBVTtJQUNWLGtDQUFrQztJQUNsQyxJQUFJO0lBRUosYUFBYTtRQUNULE1BQU0sY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxnQkFBZ0IsR0FDbEIsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLFFBQVEsT0FBTyxDQUFDO1FBQzlELE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLGdCQUFnQixFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQjtJQUMzQiwyQkFBMkI7SUFDM0IsMEJBQTBCO0lBQzFCLDhDQUE4QztJQUM5Qyx1QkFBdUI7SUFDdkIsNkJBQTZCO0lBQzdCLGNBQWM7SUFDZCxTQUFTO0lBQ1Qsb0NBQW9DO0lBQ3BDLGlDQUFpQztJQUNqQyxtREFBbUQ7SUFDbkQsa0JBQWtCO0lBQ2xCLFFBQVE7SUFFUiwyQ0FBMkM7SUFDM0MseUNBQXlDO0lBQ3pDLDhDQUE4QztJQUM5QywyQkFBMkI7SUFDM0IsZ0RBQWdEO0lBQ2hELDRDQUE0QztJQUM1QyxVQUFVO0lBRVYsNENBQTRDO0lBQzVDLDZFQUE2RTtJQUM3RSxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxzQ0FBc0M7SUFDdEMsd0RBQXdEO0lBQ3hELGtCQUFrQjtJQUNsQixRQUFRO0lBQ1Isb0VBQW9FO0lBQ3BFLDRCQUE0QjtJQUM1QixJQUFJO0lBRUosdUNBQXVDO0lBQ3ZDLDJCQUEyQjtJQUMzQiw2RUFBNkU7SUFDN0UsNkNBQTZDO0lBQzdDLGtCQUFrQjtJQUNsQixTQUFTO0lBQ1Qsc0NBQXNDO0lBQ3RDLHdEQUF3RDtJQUN4RCxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLG9FQUFvRTtJQUNwRSw0QkFBNEI7SUFDNUIsSUFBSTtJQUVKLHNDQUFzQztJQUN0Qyw2Q0FBNkM7SUFDN0MsNEJBQTRCO0lBQzVCLElBQUk7SUFFSjs7T0FFRztJQUNILG9CQUFvQjtRQUNoQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FDcEMsYUFBYSxDQUNELENBQUM7WUFDakIsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsTUFBTSxRQUFRLEdBQUcscUNBQXFDLENBQUMsQ0FBQyxzQ0FBc0M7Z0JBQzlGLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUNyQyxNQUFNLFNBQVMsR0FBRyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7Z0JBQzlDLFNBQVMsQ0FBQyxZQUFZLENBQ2xCLE1BQU0sRUFDTiwyRUFBMkUsUUFBUSxrQ0FBa0MsU0FBUyxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQ3hKLENBQUM7YUFDTDtRQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztJQUNsRCxDQUFDO0lBRUQsV0FBVztJQUNYLE1BQU07UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ25DLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUs7WUFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPO1lBQ3pCLGNBQWMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWM7WUFDdkMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTTtTQUMxQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDVixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN0Qyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQyxJQUFJO1lBQ0EsTUFBTSxVQUFVLEdBQ1osTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUM7WUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNuQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO29CQUNsQixzQkFBc0I7b0JBQ3RCLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3hDO2dCQUNELE1BQU0sY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUMvRCxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0JBQ1YsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3pGLENBQUMsQ0FDSixDQUFDO2FBQ0w7U0FDSjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDeEM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBWTtRQUN4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDckUsSUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLHNDQUFzQyxFQUNuRjtZQUNFLE1BQU0sa0JBQWtCLEdBQ3BCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFELENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQ2xFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDckQsQ0FBQztZQUNGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDYixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN0QyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzRCxDQUFDLENBQUMsQ0FDTCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7SUFDTCxDQUFDOzt5SEE1TlEsMkJBQTJCOzZHQUEzQiwyQkFBMkIsMkxDZHhDLDIwTkEySE07NEZEN0dPLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDSSx5QkFBeUI7cU9BSzFCLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICAgIGRlbGV0ZUZyb21TMywgZ2V0U2lnbmVkRmlsZSwgT3JnYW5pc2F0aW9uLCBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0LCB1cGxvYWRGaWxlVG9TMywgUHJvcGVydHlTZXJ2aWNlLCBNaXNzaW9uU2VydmljZVxyXG59IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtb3JnYW5pc2F0aW9uJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtb3JnYW5pc2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2RldGFpbC1vcmdhbmlzYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGV0YWlsT3JnYW5pc2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIEBJbnB1dCgpIG9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBpc1NQOiBib29sZWFuO1xyXG5cclxuICAgIEBPdXRwdXQoKSBvcmdDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICAgIG15T3JnOiBib29sZWFuO1xyXG5cclxuICAgIHRva2VuRXhwaXJlZDogYm9vbGVhbjtcclxuXHJcbiAgICBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgY29ubmVjdGluZ1N0cmlwZSA9IGZhbHNlO1xyXG5cclxuICAgIG1vZGFsUmVmO1xyXG5cclxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIGVkaXRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAgIGZpbGVUb1VwbG9hZDogRmlsZTtcclxuXHJcbiAgICBzaWduZWRMb2dvOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBvcmdhbmlzYXRpb25TZXJ2aWNlOiBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIC8vIHByaXZhdGUgbG9jYWxTdHJpcGU6IFN0cmlwZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgcHJvcGVydHlTZXJ2aWNlOiBQcm9wZXJ0eVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtaXNzaW9uU2VydmljZTogTWlzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICApIHsgfVxyXG5cclxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMubXlPcmcgPSB0aGlzLmN1cnJlbnRPcmcuaWQgPT09IHRoaXMub3JnLmlkO1xyXG4gICAgICAgIGlmICghdGhpcy5vcmcuY29ubmVjdGVkQWNjb3VudFN0cmlwZUlEICYmICh0aGlzLm15T3JnIHx8IHRoaXMuaXNTUCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0U3RyaXBlTGluaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcmcubG9nb1VybCkge1xyXG4gICAgICAgICAgICB0aGlzLnNpZ25lZExvZ28gPSBhd2FpdCBnZXRTaWduZWRGaWxlKHRoaXMub3JnLmxvZ29VcmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICAgICAgdGhpcy5teU9yZyA9IHRoaXMuY3VycmVudE9yZy5pZCA9PT0gdGhpcy5vcmcuaWQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRva2VucyB3ZXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgaWYgT3JnYW5pc2F0aW9uIGV4aXN0cyBhbHJlYWR5IChjcmVhdGVkIGJ5IG9uZSBhY2NvdW50KSBhbmQgaXQgc2hvdWxkIGJlIHJlc3VzZWQgKGJ5IGFub3RoZXIgYWNjb3VudCkgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGR1cGxpY2F0ZS5cclxuICAgICAqL1xyXG4gICAgLy8gYXN5bmMgb25Ub2tlbigpIHtcclxuICAgIC8vICAgICBjb25zdCB0b2tlbiA9IHV1aWR2NCgpO1xyXG4gICAgLy8gICAgIGNvbnN0IGV4cGlyZXMgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gICAgIGV4cGlyZXMuc2V0RGF0ZShleHBpcmVzLmdldERhdGUoKSArIDcpOyAvLyA3IGRheXMgZXhwaXJhdGlvblxyXG4gICAgLy8gICAgIHRoaXMub3JnID0gYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLnVwZGF0ZU9yZ2FuaXNhdGlvbih7XHJcbiAgICAvLyAgICAgICAgIGlkOiB0aGlzLm9yZy5pZCxcclxuICAgIC8vICAgICAgICAgc2hhcmVUb2tlbjogdG9rZW4sXHJcbiAgICAvLyAgICAgICAgIHRva2VuRXhwaXJlc0F0OiBleHBpcmVzLmdldFRpbWUoKSxcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICB0aGlzLm9yZ0NoYW5nZWQuZW1pdCh0cnVlKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcmV0dGlmeVRva2VuKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZXhwaXJhdGlvbkRhdGUgPSBuZXcgRGF0ZSh0aGlzLm9yZy50b2tlbkV4cGlyZXNBdCk7XHJcbiAgICAgICAgY29uc3QgZGlmZlRpbWUgPSBleHBpcmF0aW9uRGF0ZS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5jZWlsKGRpZmZUaW1lIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpKTtcclxuICAgICAgICBjb25zdCBleHBpcmF0aW9uU3RyaW5nID1cclxuICAgICAgICAgICAgZGlmZlRpbWUgPCAwID8gXCJleHBpcmVkIVwiIDogYGV4cGlyZXMgaW4gJHtkaWZmRGF5c30gZGF5c2A7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMub3JnLnNoYXJlVG9rZW4uc2xpY2UoMCwgNil9Li4uICR7ZXhwaXJhdGlvblN0cmluZ31gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlZCBOZXcgU3RyaXBlIEFjY291bnQgYW5kIGxhdW5jaGVzIG9uYm9hcmRpbmcgcHJvY2VkdXJlIChtYWlsLCBwaG9uZSwgYnVzaW5lc3MgZGV0YWlscy4uKSBieSBTdHJpcGVcclxuICAgICAqIEByZXR1cm5zIG51bGxcclxuICAgICAqL1xyXG4gICAgLy8gYXN5bmMgb25DcmVhdGVTdHJpcGUoKSB7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIC8vICAgICAvLyBNYWtlIHRoZSByZXF1ZXN0XHJcbiAgICAvLyAgICAgY29uc3QgcmVzcG9uc2VBY2NvdW50ID0gYXdhaXQgQVBJLnBvc3QoXHJcbiAgICAvLyAgICAgICAgIFwic3RyaXBlQXBpXCIsXHJcbiAgICAvLyAgICAgICAgIFwiL2NyZWF0ZS9hY2NvdW50XCIsXHJcbiAgICAvLyAgICAgICAgIHt9LFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2cocmVzcG9uc2VBY2NvdW50KTtcclxuICAgIC8vICAgICBpZiAocmVzcG9uc2VBY2NvdW50LmVycikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmhhbmRsZVN0cmlwZUVycm9yKHJlc3BvbnNlQWNjb3VudCk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHsgYWNjb3VudCB9ID0gcmVzcG9uc2VBY2NvdW50O1xyXG4gICAgLy8gICAgIC8vIHNhdmUgYWNjb3VudCBpZCB0byBvcmdhbmlzYXRpb25cclxuICAgIC8vICAgICBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UudXBkYXRlKHtcclxuICAgIC8vICAgICAgICAgaWQ6IHRoaXMub3JnLmlkLFxyXG4gICAgLy8gICAgICAgICBjb25uZWN0ZWRBY2NvdW50U3RyaXBlSUQ6IGFjY291bnQuaWQsXHJcbiAgICAvLyAgICAgICAgIHN0cmlwZU9uQm9hcmRpbmdDb21wbGV0ZWQ6IGZhbHNlLFxyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBjb25zdCB7IG9yaWdpbiB9ID0gZG9jdW1lbnQubG9jYXRpb247XHJcbiAgICAvLyAgICAgY29uc3QgcmVzcG9uc2VBY2NvdW50TGlua3MgPSBhd2FpdCB0aGlzLmxvY2FsU3RyaXBlLmNyZWF0ZUFjY291bnRMaW5rKFxyXG4gICAgLy8gICAgICAgICBhY2NvdW50LmlkLFxyXG4gICAgLy8gICAgICAgICBvcmlnaW4sXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vICAgICBpZiAocmVzcG9uc2VBY2NvdW50TGlua3MuZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuaGFuZGxlU3RyaXBlRXJyb3IocmVzcG9uc2VBY2NvdW50TGlua3MpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2VBY2NvdW50TGlua3MuYWNjb3VudExpbmtzLnVybDtcclxuICAgIC8vICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBhc3luYyBvbkNvbXBsZXRlT25ib2FyZGluZ1N0cmlwZSgpIHtcclxuICAgIC8vICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgLy8gICAgIGNvbnN0IHJlc3BvbnNlQWNjb3VudExpbmtzID0gYXdhaXQgdGhpcy5sb2NhbFN0cmlwZS5jcmVhdGVBY2NvdW50TGluayhcclxuICAgIC8vICAgICAgICAgdGhpcy5vcmcuY29ubmVjdGVkQWNjb3VudFN0cmlwZUlELFxyXG4gICAgLy8gICAgICAgICBvcmlnaW4sXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vICAgICBpZiAocmVzcG9uc2VBY2NvdW50TGlua3MuZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuaGFuZGxlU3RyaXBlRXJyb3IocmVzcG9uc2VBY2NvdW50TGlua3MpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2VBY2NvdW50TGlua3MuYWNjb3VudExpbmtzLnVybDtcclxuICAgIC8vICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBoYW5kbGVTdHJpcGVFcnJvcihzdHJpcGVSZXNwb25zZSkge1xyXG4gICAgLy8gICAgIGFsZXJ0KHN0cmlwZVJlc3BvbnNlLmVyci5yYXcubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZSBsaW5rIGZvciBMYXVuY2hpbmcgT0F1dGggY29ubmVjdGlvbiB3aXRoIFN0cmlwZTogaHR0cHM6Ly9zdHJpcGUuY29tL2RvY3MvY29ubmVjdC9vYXV0aC1zdGFuZGFyZC1hY2NvdW50cyNpbnRlZ3JhdGluZy1vYXV0aFxyXG4gICAgICovXHJcbiAgICBzZXRDb25uZWN0U3RyaXBlTGluaygpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaHlwZXJsaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICAgICAgIFwiI2xpbmtTdHJpcGVcIixcclxuICAgICAgICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGh5cGVybGluaykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2xpZW50SUQgPSBcImNhX0tRaFlPbGdSMWlwT3hMQkJRSGZRZUNMb2F5U1JWRDVQXCI7IC8vIFRPRE8gY2hhbmdlIGZvciBsaXZlIFN0cmlwZSBBY2NvdW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IG9yaWdpbiB9ID0gZG9jdW1lbnQubG9jYXRpb247XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5VcmwgPSBgJHtvcmlnaW59L3N0cmlwZS9yZWRpcmVjdGA7XHJcbiAgICAgICAgICAgICAgICBoeXBlcmxpbmsuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaHJlZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGBodHRwczovL2Nvbm5lY3Quc3RyaXBlLmNvbS9vYXV0aC9hdXRob3JpemU/cmVzcG9uc2VfdHlwZT1jb2RlJmNsaWVudF9pZD0ke2NsaWVudElEfSZzY29wZT1yZWFkX3dyaXRlJnJlZGlyZWN0X3VyaT0ke3JldHVyblVybH0mc3RhdGU9JHt0aGlzLm9yZy5pZH1gLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDIwMCk7IC8vIHdhaXQgdW50aWwgdGhlIGVsZW1lbnQgaXMgcmVuZGVyZWRcclxuICAgIH1cclxuXHJcbiAgICAvKiogRWRpdCAqL1xyXG4gICAgb25FZGl0KCkge1xyXG4gICAgICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMub3JnLmlkLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm9yZy5uYW1lLFxyXG4gICAgICAgICAgICBzaXJldDogdGhpcy5vcmcuc2lyZXQsXHJcbiAgICAgICAgICAgIGNpdHk6IHRoaXMub3JnLmNpdHksXHJcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMub3JnLmFkZHJlc3MsXHJcbiAgICAgICAgICAgIGNvbnRhY3REZXRhaWxzOiB0aGlzLm9yZy5jb250YWN0RGV0YWlscyxcclxuICAgICAgICAgICAgcG9zdGFsOiB0aGlzLm9yZy5wb3N0YWwsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lZGl0Rm9ybS5nZXQoXCJuYW1lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZWRpdEZvcm0udmFsdWU7XHJcbiAgICAgICAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0KGZvcm1WYWx1ZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZE9yZyA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UudXBkYXRlT3JnYW5pc2F0aW9uKGZvcm1WYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub3JnID0gdXBkYXRlZE9yZztcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsZVRvVXBsb2FkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcmcubG9nb1VybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxldGVGcm9tUzModGhpcy5vcmcubG9nb1VybCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB1cGxvYWRGaWxlVG9TMyhcImxvZ29zL1wiLCB0aGlzLmZpbGVUb1VwbG9hZCwgdGhpcy5vcmcuaWQpLnRoZW4oXHJcbiAgICAgICAgICAgICAgICAgICAgYXN5bmMgKHVybCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UudXBkYXRlT3JnYW5pc2F0aW9uKHsgaWQ6IHRoaXMub3JnLmlkLCBsb2dvVXJsOiB1cmwgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZWRpdEZvcm0gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FuY2VsKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdEZvcm0gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUZpbGVJbnB1dChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICB0aGlzLmZpbGVUb1VwbG9hZCA9IHRhcmdldC5maWxlcy5pdGVtKDApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlKCkge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiY29uZmlybS5kZWxldGVPcmdhbmlzYXRpb25cIik7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB3aW5kb3cuY29uZmlybShtZXNzYWdlKSAmJiB0aGlzLm9yZy5pZCAhPT0gXCI2ZTI4MjAxZi00Njc5LTRjMjktOWQyZC04YTMyNWY1N2NlZTlcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVG9EZWxldGUgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9wZXJ0eVNlcnZpY2UuZ2V0UHJvcGVydGllc0Zvck9yZ2FuaXNhdGlvbih0aGlzLm9yZy5pZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS5zb2Z0RGV0ZWxlT3JnKHRoaXMub3JnLmlkKTtcclxuICAgICAgICAgICAgKGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZ2FuaXNhdGlvbih0aGlzLm9yZy5pZCkpLm1hcChcclxuICAgICAgICAgICAgICAgIChtKSA9PiB0aGlzLm1pc3Npb25TZXJ2aWNlLnNvZnREZWxldGVNaXNzaW9uKG0uaWQpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0RlbGV0ZS5tYXAoYXN5bmMgKHByb3BlcnR5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9wZXJ0eVNlcnZpY2UuZGVsZXRlUHJvcGVydHkocHJvcGVydHkuaWQpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMub3JnQ2hhbmdlZC5lbWl0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gICAgPGg1Pnt7J09yZ2FuaXNhdGlvbiBEZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fTwvaDU+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWVkaXRGb3JtXCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX06IHt7IG9yZy5uYW1lIH19PC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTG9nbycgfCB0cmFuc2xhdGUgfX06IHt7IG9yZy5sb2dvVXJsID8gXCJcIiA6IFwiTm8gbG9nbyB1cGxvYWRlZFwifX0gXHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibG9nby1pbWdcIiAqbmdJZj1cInNpZ25lZExvZ29cIiBbc3JjXT1cInNpZ25lZExvZ29cIj5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snU0lSRVQnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgb3JnLnNpcmV0ID8gb3JnLnNpcmV0IDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGUgfX06IHt7XHJcbiAgICAgICAgICAgICAgICBvcmcuYWRkcmVzcyA/IG9yZy5hZGRyZXNzIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQ2l0eScgfCB0cmFuc2xhdGUgfX06IHt7b3JnLmNpdHkgfX08L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydDb250YWN0IGluZm9ybWF0aW9uJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICAgICAgICAgICAge3sgb3JnLmNvbnRhY3REZXRhaWxzID8gb3JnLmNvbnRhY3REZXRhaWxzIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgPCEtLSA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImlzU1BcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWwtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FjdGl2ZSB0b2tlbicgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZy5zaGFyZVRva2VuID8gcHJldHRpZnlUb2tlbigpIDogKCdObycgfCB0cmFuc2xhdGUpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9yZy5zaGFyZVRva2VuICYmICF0b2tlbkV4cGlyZWRcIiBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cIm9yZy5zaGFyZVRva2VuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7IG1heC13aWR0aDogMjBweDtcIiBuZ2JUb29sdGlwPVwiQ29waWVkIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiY2xpY2s6Ymx1clwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6Y29udGVudC1jb3B5XCIgZGF0YS1pbmxpbmU9XCJmYWxzZVwiIGRhdGEtd2lkdGg9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWhlaWdodD1cIjIwXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbGk+IC0tPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXQtMiBtbC0zIGFjdGlvbi1idXR0b25cIiAqbmdJZj1cImlzU1AgfHwgbXlPcmdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdCgpXCI+IHt7J0VkaXQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtdC0yIG1sLTMgYWN0aW9uLWJ1dHRvblwiICpuZ0lmPVwiaXNTUFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUoKVwiPiB7eydEZWxldGUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTIgbWwtMyBhY3Rpb24tYnV0dG9uXCIgKm5nSWY9XCJpc1NQXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRva2VuKClcIj57eydHZW5lcmF0ZSB0b2tlbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS1FZGl0IEZvcm0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJlZGl0Rm9ybVwiPlxyXG4gICAgICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJlZGl0Rm9ybVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snTmFtZScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmlzLWludmFsaWRdPVwibmFtZS5pbnZhbGlkICYmIG5hbWUudG91Y2hlZFwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydBIG5hbWUgaXMgcmVxdWlyZWQnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0NvbnRhY3QgaW5mb3JtYXRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjb250YWN0RGV0YWlsc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3snTmFtZSwgcGhvbmUsIGVtYWlsJyB8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snQWRkcmVzcycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydDaXR5JyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J1Bvc3RhbCBjb2RlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9zdGFsXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsXCI+e3snU0lSRVQnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJzaXJldFwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J0xvZ28nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlsZVwiIGNsYXNzPVwiYnRuIGJ0bi1sYWJlbC1maWxlIHJvdW5kZWQtcGlsbFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJmaWxlXCIgKGNoYW5nZSk9XCJoYW5kbGVGaWxlSW5wdXQoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICB7eydBZGQgbG9nbyBpbWFnZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZpbGVUb1VwbG9hZE5hbWVcIiAqbmdJZj1cImZpbGVUb1VwbG9hZFwiPnt7ZmlsZVRvVXBsb2FkLm5hbWV9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImVkaXRGb3JtLmludmFsaWRcIj57eydTYXZlJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCI+e3snQ2FuY2VsJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tTG9hZGluZy0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGxpYi1sb2FkZXI+PC9saWItbG9hZGVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLVN0cmlwZS0tPlxyXG4gICAgPCEtLSA8aHI+XHJcbiAgICA8aDU+e3snc3RyaXBlLmFjY291bnQnIHwgdHJhbnNsYXRlIH19PC9oNT5cclxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwiKGlzU1AgfHwgbXlPcmcpICYmIG9yZy5jb25uZWN0ZWRBY2NvdW50U3RyaXBlSURcIj5cclxuICAgICAgICAgICAge3snc3RyaXBlLmNvbm5lY3RlZCcgfCB0cmFuc2xhdGUgfX06IHt7b3JnLmNvbm5lY3RlZEFjY291bnRTdHJpcGVJRC5zdWJzdHJpbmcoMCwgMTUpIH19Li4uPC9saT5cclxuICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIihpc1NQIHx8IG15T3JnKSAmJiBvcmcuc3RyaXBlT25Cb2FyZGluZ0NvbXBsZXRlZCAhPT0gbnVsbFwiPlxyXG4gICAgICAgICAgICB7eydzdHJpcGUuY29tcGxldGVkJyB8IHRyYW5zbGF0ZSB9fToge3tvcmcuc3RyaXBlT25Cb2FyZGluZ0NvbXBsZXRlZCB9fTwvbGk+XHJcbiAgICA8L3VsPiAtLT5cclxuPC9kaXY+Il19
|