@smarterplan/ngx-smarterplan-core 1.2.45 → 1.2.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -59
- package/esm2020/lib/components/loader/loader.component.mjs +23 -23
- package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +80 -80
- package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +99 -99
- package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +384 -384
- package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +147 -147
- package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +40 -40
- package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -63
- package/esm2020/lib/components/support-modal/support-modal.component.mjs +66 -66
- package/esm2020/lib/config.mjs +4 -4
- package/esm2020/lib/helpers.service.mjs +470 -470
- package/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +69 -69
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +51 -51
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +61 -61
- package/esm2020/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +158 -158
- package/esm2020/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +85 -85
- package/esm2020/lib/matterport-extensions/scene-component/SceneComponent.mjs +128 -128
- package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +249 -249
- package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +98 -98
- package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +64 -64
- package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +221 -221
- package/esm2020/lib/mattertagData.mjs +165 -165
- package/esm2020/lib/ngx-smarterplan-core.module.mjs +122 -122
- package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -14
- package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -66
- package/esm2020/lib/pipes/format-date-number-to-digits.pipe.mjs +30 -30
- package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -26
- package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -20
- package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -104
- package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -29
- package/esm2020/lib/services/amplify-cache.service.mjs +72 -72
- package/esm2020/lib/services/base-tab.service.mjs +24 -24
- package/esm2020/lib/services/baseVisibility.service.mjs +18 -18
- package/esm2020/lib/services/content.service.mjs +135 -135
- package/esm2020/lib/services/filter.service.mjs +599 -599
- package/esm2020/lib/services/intervention.service.mjs +236 -236
- package/esm2020/lib/services/locale.service.mjs +45 -45
- package/esm2020/lib/services/matterport-import.service.mjs +340 -340
- package/esm2020/lib/services/matterport.service.mjs +1587 -1587
- package/esm2020/lib/services/models/affectation.service.mjs +60 -60
- package/esm2020/lib/services/models/base-object.service.mjs +70 -70
- package/esm2020/lib/services/models/capture.service.mjs +34 -34
- package/esm2020/lib/services/models/comment.service.mjs +98 -98
- package/esm2020/lib/services/models/domain.service.mjs +78 -78
- package/esm2020/lib/services/models/equipment.service.mjs +683 -683
- package/esm2020/lib/services/models/event.service.mjs +128 -128
- package/esm2020/lib/services/models/feature.service.mjs +380 -380
- package/esm2020/lib/services/models/hashtag.service.mjs +38 -38
- package/esm2020/lib/services/models/layer.service.mjs +33 -33
- package/esm2020/lib/services/models/measurement.service.mjs +199 -199
- package/esm2020/lib/services/models/mission.service.mjs +206 -206
- package/esm2020/lib/services/models/navigation.service.mjs +92 -92
- package/esm2020/lib/services/models/node.service.mjs +31 -31
- package/esm2020/lib/services/models/object3D.service.mjs +364 -364
- package/esm2020/lib/services/models/operation.service.mjs +59 -59
- package/esm2020/lib/services/models/organisation.service.mjs +73 -73
- package/esm2020/lib/services/models/plan.service.mjs +799 -799
- package/esm2020/lib/services/models/poi.service.mjs +103 -103
- package/esm2020/lib/services/models/profile.service.mjs +58 -58
- package/esm2020/lib/services/models/property.service.mjs +44 -44
- package/esm2020/lib/services/models/space.service.mjs +204 -204
- package/esm2020/lib/services/models/template.service.mjs +41 -41
- package/esm2020/lib/services/models/ticket.service.mjs +526 -526
- package/esm2020/lib/services/models/visit.service.mjs +130 -130
- package/esm2020/lib/services/models/zone.service.mjs +225 -225
- package/esm2020/lib/services/navigator.service.mjs +212 -212
- package/esm2020/lib/services/s3.service.mjs +137 -137
- package/esm2020/lib/services/search.service.mjs +124 -124
- package/esm2020/lib/services/support.service.mjs +42 -42
- package/esm2020/lib/services/tag.service.mjs +111 -111
- package/esm2020/lib/services/user.service.mjs +501 -501
- package/esm2020/lib/services/validators.service.mjs +50 -50
- package/esm2020/lib/services/viewer.service.mjs +389 -389
- package/esm2020/lib/services/zone-drawer.service.mjs +76 -76
- package/esm2020/lib/services/zoneChange.service.mjs +30 -30
- package/esm2020/lib/types.service.mjs +311 -311
- package/esm2020/lib/validators/email.directive.mjs +7 -7
- package/esm2020/lib/validators/no-empty.directive.mjs +12 -12
- package/esm2020/lib/validators/number.directive.mjs +12 -12
- package/esm2020/lib/validators/text.directive.mjs +12 -12
- package/esm2020/public-api.mjs +72 -72
- package/esm2020/smarterplan-ngx-smarterplan-core.mjs +4 -4
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +13014 -13014
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12263 -12263
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/components/csv-export/csv-export.component.d.ts +18 -18
- package/lib/components/loader/loader.component.d.ts +10 -10
- package/lib/components/menu-bar/avatar/avatar.component.d.ts +21 -21
- package/lib/components/menu-bar/menu-bar.component.d.ts +38 -38
- package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +73 -73
- package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +35 -35
- package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -22
- package/lib/components/search-bar/search-bar.component.d.ts +16 -16
- package/lib/components/support-modal/support-modal.component.d.ts +26 -26
- package/lib/config.d.ts +22 -22
- package/lib/helpers.service.d.ts +79 -79
- package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -26
- package/lib/matterport-extensions/nest-thermostat/CanvasImage.d.ts +31 -31
- package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +37 -37
- package/lib/matterport-extensions/nest-thermostat/NestThermostat.d.ts +42 -42
- package/lib/matterport-extensions/nest-thermostat/PlaneRenderer.d.ts +46 -46
- package/lib/matterport-extensions/scene-component/SceneComponent.d.ts +388 -388
- package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +47 -47
- package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -26
- package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -26
- package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -43
- package/lib/mattertagData.d.ts +70 -70
- package/lib/ngx-smarterplan-core.module.d.ts +29 -29
- package/lib/ngx-smarterplan-core.service.d.ts +6 -6
- package/lib/pipes/duration-to-string.pipe.d.ts +12 -12
- package/lib/pipes/format-date-number-to-digits.pipe.d.ts +10 -10
- package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -10
- package/lib/pipes/safe-url.pipe.d.ts +10 -10
- package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -16
- package/lib/pipes/username-from-id.pipe.d.ts +11 -11
- package/lib/services/amplify-cache.service.d.ts +37 -37
- package/lib/services/base-tab.service.d.ts +10 -10
- package/lib/services/baseVisibility.service.d.ts +9 -9
- package/lib/services/content.service.d.ts +28 -28
- package/lib/services/filter.service.d.ts +60 -60
- package/lib/services/intervention.service.d.ts +25 -25
- package/lib/services/locale.service.d.ts +23 -23
- package/lib/services/matterport-import.service.d.ts +53 -53
- package/lib/services/matterport.service.d.ts +336 -336
- package/lib/services/models/affectation.service.d.ts +14 -14
- package/lib/services/models/base-object.service.d.ts +20 -20
- package/lib/services/models/capture.service.d.ts +13 -13
- package/lib/services/models/comment.service.d.ts +26 -26
- package/lib/services/models/domain.service.d.ts +19 -19
- package/lib/services/models/equipment.service.d.ts +93 -93
- package/lib/services/models/event.service.d.ts +43 -43
- package/lib/services/models/feature.service.d.ts +75 -75
- package/lib/services/models/hashtag.service.d.ts +13 -13
- package/lib/services/models/layer.service.d.ts +11 -11
- package/lib/services/models/measurement.service.d.ts +51 -51
- package/lib/services/models/mission.service.d.ts +39 -39
- package/lib/services/models/navigation.service.d.ts +29 -29
- package/lib/services/models/node.service.d.ts +12 -12
- package/lib/services/models/object3D.service.d.ts +57 -57
- package/lib/services/models/operation.service.d.ts +15 -15
- package/lib/services/models/organisation.service.d.ts +19 -19
- package/lib/services/models/plan.service.d.ts +133 -133
- package/lib/services/models/poi.service.d.ts +25 -25
- package/lib/services/models/profile.service.d.ts +16 -16
- package/lib/services/models/property.service.d.ts +13 -13
- package/lib/services/models/space.service.d.ts +46 -46
- package/lib/services/models/template.service.d.ts +15 -15
- package/lib/services/models/ticket.service.d.ts +93 -93
- package/lib/services/models/visit.service.d.ts +24 -24
- package/lib/services/models/zone.service.d.ts +50 -50
- package/lib/services/navigator.service.d.ts +61 -61
- package/lib/services/s3.service.d.ts +14 -14
- package/lib/services/search.service.d.ts +20 -20
- package/lib/services/support.service.d.ts +17 -17
- package/lib/services/tag.service.d.ts +29 -29
- package/lib/services/user.service.d.ts +118 -118
- package/lib/services/validators.service.d.ts +18 -18
- package/lib/services/viewer.service.d.ts +110 -110
- package/lib/services/zone-drawer.service.d.ts +7 -7
- package/lib/services/zoneChange.service.d.ts +17 -17
- package/lib/types.service.d.ts +842 -842
- package/lib/validators/email.directive.d.ts +2 -2
- package/lib/validators/no-empty.directive.d.ts +2 -2
- package/lib/validators/number.directive.d.ts +2 -2
- package/lib/validators/text.directive.d.ts +2 -2
- package/package.json +2 -2
- package/public-api.d.ts +64 -64
- package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
|
@@ -1,683 +1,683 @@
|
|
|
1
|
-
import { Injectable, Inject } from '@angular/core';
|
|
2
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
-
import { openModalForVisitSwitch, removeNullKeysFromObject, } from '../../helpers.service';
|
|
4
|
-
import { TypeNote, EventStatus, EventType, PoiType, RoleStatus, } from '../../types.service';
|
|
5
|
-
import { deleteFromS3, getSignedFile, getSignedImageUrlForEquipment, uploadFileToS3, } from '../s3.service';
|
|
6
|
-
import { BaseObjectService } from './base-object.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./poi.service";
|
|
9
|
-
import * as i2 from "./navigation.service";
|
|
10
|
-
import * as i3 from "./operation.service";
|
|
11
|
-
import * as i4 from "./ticket.service";
|
|
12
|
-
import * as i5 from "../navigator.service";
|
|
13
|
-
import * as i6 from "../filter.service";
|
|
14
|
-
import * as i7 from "../user.service";
|
|
15
|
-
import * as i8 from "../viewer.service";
|
|
16
|
-
import * as i9 from "@ng-bootstrap/ng-bootstrap";
|
|
17
|
-
import * as i10 from "../zoneChange.service";
|
|
18
|
-
export class EquipmentService extends BaseObjectService {
|
|
19
|
-
constructor(apiInjected, awsKinesisAnalyticsInjected, poiService, navigationService, operationService, ticketsService, navigatorService, filterService, userService, viewerService, modalService, zoneChangeService) {
|
|
20
|
-
super(poiService, navigationService);
|
|
21
|
-
this.operationService = operationService;
|
|
22
|
-
this.ticketsService = ticketsService;
|
|
23
|
-
this.navigatorService = navigatorService;
|
|
24
|
-
this.filterService = filterService;
|
|
25
|
-
this.userService = userService;
|
|
26
|
-
this.viewerService = viewerService;
|
|
27
|
-
this.modalService = modalService;
|
|
28
|
-
this.zoneChangeService = zoneChangeService;
|
|
29
|
-
this.prefix = {
|
|
30
|
-
technical: 'equipments/note/technical/',
|
|
31
|
-
image: 'equipments/note/image/',
|
|
32
|
-
financial: 'equipments/note/financial/',
|
|
33
|
-
information: 'equipments/note/information/',
|
|
34
|
-
other: 'equipments/note/other/',
|
|
35
|
-
contractual: 'equipments/note/contractual/',
|
|
36
|
-
};
|
|
37
|
-
this.equipmentsUpdated = new Subject();
|
|
38
|
-
this.currentEquipments = {
|
|
39
|
-
space: [],
|
|
40
|
-
zonesMap: new Map(),
|
|
41
|
-
};
|
|
42
|
-
this.equipmentsTags = new Subject();
|
|
43
|
-
this.floorsPerSpace = null;
|
|
44
|
-
/** Null means we do not apply a filter, empty array ([]), means we that we hide all equipment */
|
|
45
|
-
this.equipmentDomainFilter = null;
|
|
46
|
-
this.updating = new Subject();
|
|
47
|
-
this.currentlyUpdating = false;
|
|
48
|
-
this.deleteObservable = new Subject();
|
|
49
|
-
this.createObservable = new Subject();
|
|
50
|
-
this.updateObservable = new Subject();
|
|
51
|
-
this.selectedFloor = null;
|
|
52
|
-
this.isMuseumUser = false;
|
|
53
|
-
this.destroy$ = new Subject();
|
|
54
|
-
this.API = apiInjected;
|
|
55
|
-
this.awsKinesisAnalytics = awsKinesisAnalyticsInjected;
|
|
56
|
-
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
57
|
-
this.initSubscriptions();
|
|
58
|
-
this.userService.isChanged.subscribe((isConnected) => {
|
|
59
|
-
if (isConnected) {
|
|
60
|
-
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
61
|
-
this.initSubscriptions();
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
this.unsubscribe();
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
this.zoneChangeService.floorHasChanged.subscribe((floor) => {
|
|
68
|
-
if (floor) {
|
|
69
|
-
this.selectedFloor = floor;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
async readEquipment(id) {
|
|
74
|
-
return this.API.__proto__.GetEquipment(id).then(async (receivedEquip) => {
|
|
75
|
-
let equip;
|
|
76
|
-
if (receivedEquip) {
|
|
77
|
-
equip = receivedEquip;
|
|
78
|
-
equip = await this.getSignedUrlsForEquipment(receivedEquip);
|
|
79
|
-
if (equip.domain) {
|
|
80
|
-
if (equip.domain.parentID) {
|
|
81
|
-
equip.childDomain = equip.domain;
|
|
82
|
-
equip.parentDomain = equip.domain.parent;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
equip.parentDomain = equip.domain;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (equip.subequipmentsIDs) {
|
|
89
|
-
const subEquips = [];
|
|
90
|
-
await Promise.all(equip.subequipmentsIDs.map(async (subId) => {
|
|
91
|
-
const subEquip = await this.API.GetEquipment(subId);
|
|
92
|
-
subEquips.push(subEquip);
|
|
93
|
-
}));
|
|
94
|
-
equip.subEquipments = subEquips;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return equip;
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
async createEquipment(equip, imageFile, documentFile) {
|
|
101
|
-
removeNullKeysFromObject(equip);
|
|
102
|
-
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
103
|
-
this.awsKinesisAnalytics.getInstance().record(
|
|
104
|
-
// @ts-ignore
|
|
105
|
-
{
|
|
106
|
-
data: {
|
|
107
|
-
eventType: 'Object Creation',
|
|
108
|
-
objectType: 'equipment',
|
|
109
|
-
poi: equip,
|
|
110
|
-
user: this.userService.cu,
|
|
111
|
-
locationId: this.currentSpaceID,
|
|
112
|
-
timestamp: new Date(),
|
|
113
|
-
zoneId: this.currentZone.id,
|
|
114
|
-
floorId: this.selectedFloor?.id,
|
|
115
|
-
},
|
|
116
|
-
streamName: 'smarterplanKinesis-analytics',
|
|
117
|
-
// partitionKey: "",
|
|
118
|
-
}, 'AWSKinesis');
|
|
119
|
-
}
|
|
120
|
-
return this.API.CreateEquipment(equip).then(async (receivedEquipment) => {
|
|
121
|
-
let equipment = receivedEquipment;
|
|
122
|
-
if (equipment) {
|
|
123
|
-
console.log('equipment created:', equipment);
|
|
124
|
-
if (documentFile) {
|
|
125
|
-
await this.uploadDoc(equipment, documentFile, TypeNote.TECHNICAL);
|
|
126
|
-
}
|
|
127
|
-
if (imageFile) {
|
|
128
|
-
await this.uploadImage(equipment, imageFile);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return equipment;
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
async getSignedUrlsForEquipment(equip) {
|
|
135
|
-
const equipment = { ...equip };
|
|
136
|
-
if (equipment.notes.items.length > 0) {
|
|
137
|
-
const docs = [];
|
|
138
|
-
await Promise.all(equipment.notes.items.map(async (note) => {
|
|
139
|
-
equipment.documentationImageUrlSigned =
|
|
140
|
-
await getSignedImageUrlForEquipment(equipment);
|
|
141
|
-
if (note.attachment) {
|
|
142
|
-
const { length } = note.attachment.split('/');
|
|
143
|
-
const filename = note.attachment.split('/')[length - 1];
|
|
144
|
-
const attachment = await getSignedFile(note.attachment);
|
|
145
|
-
if (attachment) {
|
|
146
|
-
docs.push({
|
|
147
|
-
filename,
|
|
148
|
-
url: note.attachment,
|
|
149
|
-
urlSigned: attachment,
|
|
150
|
-
noteID: note.id,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}));
|
|
155
|
-
equipment.documents = docs;
|
|
156
|
-
return equipment;
|
|
157
|
-
}
|
|
158
|
-
return equipment;
|
|
159
|
-
}
|
|
160
|
-
async getEquipmentsForTicket(ticket) {
|
|
161
|
-
const operations = ticket.operations.items;
|
|
162
|
-
if (operations.length > 0) {
|
|
163
|
-
operations.sort((a, b) =>
|
|
164
|
-
// @ts-ignore
|
|
165
|
-
// eslint-disable-next-line prettier/prettier
|
|
166
|
-
new Date(b.createdAt) - new Date(a.createdAt));
|
|
167
|
-
await Promise.all(operations.map(async (operation) => {
|
|
168
|
-
operation.equipment = await this.readEquipment(operation.equipmentID);
|
|
169
|
-
}));
|
|
170
|
-
}
|
|
171
|
-
// to keep the sorting by createdAt
|
|
172
|
-
return operations.map((o) => o.equipment);
|
|
173
|
-
}
|
|
174
|
-
async getEquipmentsForSpace(spaceID) {
|
|
175
|
-
// split by 100
|
|
176
|
-
const limit = 100;
|
|
177
|
-
let equipsToken = { equips: [], nextToken: null };
|
|
178
|
-
do {
|
|
179
|
-
equipsToken = await this.mergeEquipmentsForSpaceWithNextTokenWithLimit(spaceID, limit, equipsToken);
|
|
180
|
-
} while (equipsToken.nextToken);
|
|
181
|
-
return equipsToken.equips;
|
|
182
|
-
}
|
|
183
|
-
async mergeEquipmentsForSpaceWithNextTokenWithLimit(spaceID, limit, equipsToken) {
|
|
184
|
-
return this.API.__proto__
|
|
185
|
-
.EquipmentsBySpace(spaceID, null, 'DESC', null, limit, equipsToken.nextToken // nextToken
|
|
186
|
-
)
|
|
187
|
-
.then((response) => {
|
|
188
|
-
const equipsLimit = response.items;
|
|
189
|
-
const equipsObject = {
|
|
190
|
-
equips: [...equipsToken.equips, ...equipsLimit],
|
|
191
|
-
nextToken: response.nextToken,
|
|
192
|
-
};
|
|
193
|
-
return equipsObject;
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
async uploadImageForAllEquipments(equipments, imageFile) {
|
|
197
|
-
if (equipments.length === 0) {
|
|
198
|
-
return [];
|
|
199
|
-
}
|
|
200
|
-
return uploadFileToS3(this.prefix.image, imageFile, 'BATCH').then(async (url) => {
|
|
201
|
-
if (url) {
|
|
202
|
-
const equips = [];
|
|
203
|
-
for (const equip of equipments) {
|
|
204
|
-
const currentMission = this.userService.currentMission(equip.spaceID);
|
|
205
|
-
await this.API.__proto__.CreateNote({
|
|
206
|
-
attachment: url,
|
|
207
|
-
type: TypeNote.IMAGE,
|
|
208
|
-
equipmentID: equip.id,
|
|
209
|
-
ownerMissionID: currentMission ? currentMission.id : null,
|
|
210
|
-
});
|
|
211
|
-
const update = await this.API.__proto__.UpdateEquipment({
|
|
212
|
-
id: equip.id,
|
|
213
|
-
photo: url,
|
|
214
|
-
});
|
|
215
|
-
equips.push(update);
|
|
216
|
-
}
|
|
217
|
-
return equips;
|
|
218
|
-
}
|
|
219
|
-
return [];
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
async uploadImage(equipment, imageFile) {
|
|
223
|
-
return uploadFileToS3(this.prefix.image, imageFile, equipment.id).then(async (url) => {
|
|
224
|
-
if (url) {
|
|
225
|
-
const currentMission = this.userService.currentMission(equipment.spaceID);
|
|
226
|
-
const note = await this.API.__proto__.CreateNote({
|
|
227
|
-
attachment: url,
|
|
228
|
-
type: TypeNote.IMAGE,
|
|
229
|
-
equipmentID: equipment.id,
|
|
230
|
-
ownerMissionID: currentMission ? currentMission.id : null,
|
|
231
|
-
});
|
|
232
|
-
await this.API.__proto__.UpdateEquipment({
|
|
233
|
-
id: equipment.id,
|
|
234
|
-
photo: url,
|
|
235
|
-
});
|
|
236
|
-
return note;
|
|
237
|
-
}
|
|
238
|
-
return null;
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
async updateEquipment(equip, file = null, noteType = null) {
|
|
242
|
-
return this.API.__proto__
|
|
243
|
-
.UpdateEquipment(equip)
|
|
244
|
-
.then(async (receivedEquipment) => {
|
|
245
|
-
let equipment = receivedEquipment;
|
|
246
|
-
if (equipment) {
|
|
247
|
-
console.log('equipment updated:', equipment);
|
|
248
|
-
if (noteType) {
|
|
249
|
-
switch (noteType) {
|
|
250
|
-
case TypeNote.IMAGE:
|
|
251
|
-
await this.uploadImage(equipment, file);
|
|
252
|
-
break;
|
|
253
|
-
default:
|
|
254
|
-
await this.uploadDoc(equipment, file, noteType);
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return equipment;
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
getPrefixDoc(type) {
|
|
263
|
-
let prefix;
|
|
264
|
-
switch (type) {
|
|
265
|
-
case TypeNote.INFORMATION:
|
|
266
|
-
prefix = this.prefix.information;
|
|
267
|
-
break;
|
|
268
|
-
case TypeNote.FINANCIAL:
|
|
269
|
-
prefix = this.prefix.financial;
|
|
270
|
-
break;
|
|
271
|
-
case TypeNote.CONTRACTUAL:
|
|
272
|
-
prefix = this.prefix.contractual;
|
|
273
|
-
break;
|
|
274
|
-
case TypeNote.OTHER:
|
|
275
|
-
prefix = this.prefix.other;
|
|
276
|
-
break;
|
|
277
|
-
case TypeNote.IMAGE:
|
|
278
|
-
prefix = this.prefix.image;
|
|
279
|
-
break;
|
|
280
|
-
default:
|
|
281
|
-
prefix = this.prefix.technical;
|
|
282
|
-
break;
|
|
283
|
-
}
|
|
284
|
-
return prefix;
|
|
285
|
-
}
|
|
286
|
-
async uploadDocForAllEquipments(equipments, documentFile, type) {
|
|
287
|
-
if (equipments.length === 0) {
|
|
288
|
-
return [];
|
|
289
|
-
}
|
|
290
|
-
const prefix = this.getPrefixDoc(type);
|
|
291
|
-
const url = await uploadFileToS3(prefix, documentFile, 'BATCH');
|
|
292
|
-
if (url) {
|
|
293
|
-
const updateList = [];
|
|
294
|
-
for (const equip of equipments) {
|
|
295
|
-
const mission = this.userService.currentMission(equip.spaceID);
|
|
296
|
-
const newEquip = await this.API.__proto__.CreateNote({
|
|
297
|
-
attachment: url,
|
|
298
|
-
type,
|
|
299
|
-
equipmentID: equip.id,
|
|
300
|
-
ownerMissionID: mission ? mission.id : null,
|
|
301
|
-
});
|
|
302
|
-
updateList.push(newEquip);
|
|
303
|
-
}
|
|
304
|
-
return updateList;
|
|
305
|
-
}
|
|
306
|
-
return [];
|
|
307
|
-
}
|
|
308
|
-
async uploadDoc(equipment, documentFile, type) {
|
|
309
|
-
const prefix = this.getPrefixDoc(type);
|
|
310
|
-
const mission = this.userService.currentMission(equipment.spaceID);
|
|
311
|
-
return uploadFileToS3(prefix, documentFile, equipment.id).then(async (url) => {
|
|
312
|
-
if (url) {
|
|
313
|
-
return this.API.__proto__.CreateNote({
|
|
314
|
-
attachment: url,
|
|
315
|
-
type,
|
|
316
|
-
equipmentID: equipment.id,
|
|
317
|
-
ownerMissionID: mission ? mission.id : null,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
return null;
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
async deleteEquipment(equip) {
|
|
324
|
-
const deleted = await this.API.__proto__.DeleteEquipment({ id: equip.id });
|
|
325
|
-
console.log('Deleted equipment', deleted);
|
|
326
|
-
// delete POI
|
|
327
|
-
const [poi] = equip.pois.items;
|
|
328
|
-
if (poi) {
|
|
329
|
-
await this.poiService.deletePoi(poi.id);
|
|
330
|
-
}
|
|
331
|
-
// delete notes related
|
|
332
|
-
if (equip.notes.items.length > 0) {
|
|
333
|
-
await Promise.all(equip.notes.items.map(async (note) => {
|
|
334
|
-
// delete files from S3
|
|
335
|
-
/** Not shared with other equipment */
|
|
336
|
-
if (note.attachment &&
|
|
337
|
-
!note.attachment.split('/').pop().startsWith('BATCH_')) {
|
|
338
|
-
await deleteFromS3(note.attachment);
|
|
339
|
-
}
|
|
340
|
-
await this.API.__proto__.DeleteNote({ id: note.id });
|
|
341
|
-
}));
|
|
342
|
-
}
|
|
343
|
-
// delete operations (remove from linked tickets)
|
|
344
|
-
await this.operationService.deleteOperationsForEquipment(equip.id);
|
|
345
|
-
return deleted;
|
|
346
|
-
}
|
|
347
|
-
async updateEquipmentLocation(equip, tagData) {
|
|
348
|
-
const poiInput = {
|
|
349
|
-
coordinate: tagData.getCoordinateString(),
|
|
350
|
-
type: PoiType.EQUIPMENT,
|
|
351
|
-
elementID: equip.id,
|
|
352
|
-
metadata: tagData.getMetadataString(),
|
|
353
|
-
matterportSweepID: tagData.getSweepID(),
|
|
354
|
-
};
|
|
355
|
-
const poi = await this.poiService.createPOIForSpaceID(poiInput);
|
|
356
|
-
return poi;
|
|
357
|
-
}
|
|
358
|
-
async removeTicketFromEquipment(ticket, equip) {
|
|
359
|
-
const operationEquip = await this.operationService.getOperationsByEquipmentID(equip.id);
|
|
360
|
-
const operationToDelete = operationEquip.find((op) => op.ticketID === ticket.id);
|
|
361
|
-
return this.operationService
|
|
362
|
-
.deleteOperation(operationToDelete.id)
|
|
363
|
-
.then((res) => {
|
|
364
|
-
this.ticketsService.addEventToTicket(ticket, {
|
|
365
|
-
title: 'Equipement retiré du ticket',
|
|
366
|
-
description: `Equipement ${equip.name} a été retiré du ticket`,
|
|
367
|
-
status: EventStatus.UNLINKED_FROM_EQUIPMENT,
|
|
368
|
-
type: EventType.TICKET,
|
|
369
|
-
translationPath: 'ticketEvent.ticket.unlinkedFromEquipment',
|
|
370
|
-
metadata: JSON.stringify({ equipment: equip.name }),
|
|
371
|
-
});
|
|
372
|
-
return res;
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
async initEquips() {
|
|
376
|
-
if (!this.currentSpaceID) {
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
this.updating.next(true);
|
|
380
|
-
this.currentlyUpdating = true;
|
|
381
|
-
let eqList = await this.getEquipmentsForSpace(this.currentSpaceID);
|
|
382
|
-
eqList = await this.filterService.filterEquipmentsForCurrentUserInSpace(this.currentSpaceID, eqList);
|
|
383
|
-
// console.log(eqList);
|
|
384
|
-
if (eqList.length > 0) {
|
|
385
|
-
let filteredEquips = eqList.filter((equipment) => !this.isArchived(equipment));
|
|
386
|
-
await Promise.all(filteredEquips.map(async (equip) => {
|
|
387
|
-
equip.documentationImageUrlSigned =
|
|
388
|
-
await getSignedImageUrlForEquipment(equip);
|
|
389
|
-
}));
|
|
390
|
-
if (this.equipmentDomainFilter) {
|
|
391
|
-
filteredEquips = this.filterService.filterEquipmentsByDomainList(filteredEquips, this.equipmentDomainFilter);
|
|
392
|
-
}
|
|
393
|
-
this.currentEquipments.space = filteredEquips;
|
|
394
|
-
if (this.zoneIDFilter) {
|
|
395
|
-
filteredEquips = (await this.filterService.filterObjectsForZone(filteredEquips, this.zoneIDFilter, this.currentZone));
|
|
396
|
-
}
|
|
397
|
-
this.currentEquipments.zonesMap.set(this.zoneIDFilter, filteredEquips);
|
|
398
|
-
this.equipmentsTags.next(filteredEquips); // adding tags only for the current zone
|
|
399
|
-
this.equipmentsUpdated.next({
|
|
400
|
-
space: this.currentEquipments.space,
|
|
401
|
-
zone: filteredEquips,
|
|
402
|
-
}); // for lateral menu
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
if (this.zoneIDFilter) {
|
|
406
|
-
this.currentEquipments.zonesMap.set(this.zoneIDFilter, []);
|
|
407
|
-
}
|
|
408
|
-
this.equipmentsUpdated.next({ space: [], zone: [] }); // for lateral menu
|
|
409
|
-
}
|
|
410
|
-
// console.log(this.currentEquipments);
|
|
411
|
-
this.updating.next(false);
|
|
412
|
-
this.currentlyUpdating = false;
|
|
413
|
-
}
|
|
414
|
-
async getEquipmentsForCurrentUserForSpace(spaceID, missions) {
|
|
415
|
-
let results = [];
|
|
416
|
-
const spaceMissions = missions.filter((m) => m.spaceID === spaceID);
|
|
417
|
-
if (spaceMissions.length === 0) {
|
|
418
|
-
return results;
|
|
419
|
-
}
|
|
420
|
-
const canSeeEquips = spaceMissions.some((m) => this.userService.managers.includes(m.role) ||
|
|
421
|
-
m.role === RoleStatus.SERVICE);
|
|
422
|
-
if (!canSeeEquips) {
|
|
423
|
-
return results;
|
|
424
|
-
}
|
|
425
|
-
let domains = [];
|
|
426
|
-
for (const m of spaceMissions) {
|
|
427
|
-
domains = [...domains, m.domains];
|
|
428
|
-
}
|
|
429
|
-
if (domains.length === 0) {
|
|
430
|
-
return results;
|
|
431
|
-
}
|
|
432
|
-
results = await this.getEquipmentsForSpace(spaceID);
|
|
433
|
-
// results = this.filterService.filterEquipmentsByDomainList(
|
|
434
|
-
// results,
|
|
435
|
-
// domains,
|
|
436
|
-
// );
|
|
437
|
-
return results;
|
|
438
|
-
}
|
|
439
|
-
async updateIconForAllEquipmentsInSpace(tagIcon, spaceID, domainID = null) {
|
|
440
|
-
let equips = await this.getEquipmentsForSpace(spaceID);
|
|
441
|
-
if (domainID) {
|
|
442
|
-
equips = equips.filter((equip) => equip.domainID === domainID);
|
|
443
|
-
}
|
|
444
|
-
const pois = await this.updateIconForAllObjects(equips, tagIcon);
|
|
445
|
-
return { equips, pois };
|
|
446
|
-
}
|
|
447
|
-
/** Return true if the current user has archived this equipment */
|
|
448
|
-
isArchived(equipment) {
|
|
449
|
-
return equipment.archivedForMissionID
|
|
450
|
-
? equipment.archivedForMissionID.includes(this.userService.currentMission(equipment.spaceID).id)
|
|
451
|
-
: false;
|
|
452
|
-
}
|
|
453
|
-
setArchived(equipment, archived) {
|
|
454
|
-
let archivedList = equipment.archivedForMissionID
|
|
455
|
-
? equipment.archivedForMissionID
|
|
456
|
-
: [];
|
|
457
|
-
const missionID = this.userService.currentMission(equipment.spaceID).id;
|
|
458
|
-
archivedList = archivedList.filter((m) => m !== missionID);
|
|
459
|
-
if (archived) {
|
|
460
|
-
archivedList.push(missionID);
|
|
461
|
-
}
|
|
462
|
-
return this.updateEquipment({
|
|
463
|
-
id: equipment.id,
|
|
464
|
-
archivedForMissionID: archivedList,
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
async deleteFile(document_) {
|
|
468
|
-
await deleteFromS3(document_.url);
|
|
469
|
-
await this.API.DeleteNote({ id: document_.noteID });
|
|
470
|
-
}
|
|
471
|
-
async navigateToEquipmentIn3D(equipment, forceSwitchVisit = false) {
|
|
472
|
-
let url = `visit/${equipment.spaceID}`;
|
|
473
|
-
if (forceSwitchVisit) {
|
|
474
|
-
url += `/equip/${equipment.id}`;
|
|
475
|
-
}
|
|
476
|
-
const canGoToTag = await this.viewerService.action_move_to_tag(`${equipment.id}`);
|
|
477
|
-
if (canGoToTag) {
|
|
478
|
-
return;
|
|
479
|
-
}
|
|
480
|
-
const result = await this.getModel3dAndSweep(equipment);
|
|
481
|
-
if (!result || !result.model3D) {
|
|
482
|
-
alert('Error while getting virtual visit model');
|
|
483
|
-
return;
|
|
484
|
-
}
|
|
485
|
-
if (!forceSwitchVisit) {
|
|
486
|
-
// check if we are moving within the same 3D model
|
|
487
|
-
const currentModel = localStorage.getItem('model3D');
|
|
488
|
-
if (currentModel && currentModel === result.model3D) {
|
|
489
|
-
// we add tag to the visit
|
|
490
|
-
const poi = equipment.pois.items[0];
|
|
491
|
-
if (poi.coordinate) {
|
|
492
|
-
// we force add because we might be in an another zone
|
|
493
|
-
await this.viewerService.actionAddObjectFromPOI(equipment, poi);
|
|
494
|
-
await this.viewerService.action_move_to_tag(equipment.id);
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
else {
|
|
498
|
-
/** Si on ne force pas la visite, on demande si on veut etre switch */
|
|
499
|
-
openModalForVisitSwitch(this.modalService, result.model3D, equipment.spaceID, { sweepToMove: result.sweep, rotation: result.rotation });
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
else {
|
|
503
|
-
/** Si on force le switch de la visit */
|
|
504
|
-
window.open(`${url}?model3D=${result.model3D}&sweep=true`, '_blank');
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
async updateEquipsForZone() {
|
|
508
|
-
this.updating.next(true);
|
|
509
|
-
let filteredEquips = [];
|
|
510
|
-
if (this.currentEquipments.space.length > 0) {
|
|
511
|
-
if (this.zoneIDFilter &&
|
|
512
|
-
this.currentEquipments.zonesMap.has(this.zoneIDFilter)) {
|
|
513
|
-
filteredEquips = this.currentEquipments.zonesMap.get(this.zoneIDFilter);
|
|
514
|
-
// console.log("i have equips for this zone", filteredEquips);
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
filteredEquips = (await this.filterService.filterObjectsForZone(this.currentEquipments.space, this.zoneIDFilter, this.currentZone));
|
|
518
|
-
this.currentEquipments.zonesMap.set(this.zoneIDFilter, [
|
|
519
|
-
...filteredEquips,
|
|
520
|
-
]);
|
|
521
|
-
}
|
|
522
|
-
if (this.equipmentDomainFilter) {
|
|
523
|
-
filteredEquips = this.filterService.filterEquipmentsByDomainList(filteredEquips, this.equipmentDomainFilter);
|
|
524
|
-
}
|
|
525
|
-
this.equipmentsTags.next(filteredEquips); // adding tags only for the current zone
|
|
526
|
-
this.equipmentsUpdated.next({
|
|
527
|
-
space: this.currentEquipments.space,
|
|
528
|
-
zone: filteredEquips,
|
|
529
|
-
}); // for lateral menu
|
|
530
|
-
}
|
|
531
|
-
else {
|
|
532
|
-
this.equipmentsUpdated.next({ space: [], zone: [] }); // for lateral menu
|
|
533
|
-
}
|
|
534
|
-
this.updating.next(false);
|
|
535
|
-
}
|
|
536
|
-
updateDueToDelete(deletedEquipment) {
|
|
537
|
-
// console.log("update due to delete", deletedEquipment);
|
|
538
|
-
const equip = this.currentEquipments.space.find((_equip) => _equip.id === deletedEquipment.id);
|
|
539
|
-
if (equip) {
|
|
540
|
-
const index = this.currentEquipments.space.indexOf(equip);
|
|
541
|
-
this.currentEquipments.space.splice(index, 1);
|
|
542
|
-
}
|
|
543
|
-
for (const zone of this.currentEquipments.zonesMap.keys()) {
|
|
544
|
-
const equipToDelete = this.currentEquipments.zonesMap
|
|
545
|
-
.get(zone)
|
|
546
|
-
.find((_equip) => _equip.id === deletedEquipment.id);
|
|
547
|
-
if (equipToDelete) {
|
|
548
|
-
const index = this.currentEquipments.zonesMap
|
|
549
|
-
.get(zone)
|
|
550
|
-
.indexOf(equipToDelete);
|
|
551
|
-
this.currentEquipments.zonesMap.get(zone).splice(index, 1);
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
this.equipmentsUpdated.next({
|
|
555
|
-
space: this.currentEquipments.space,
|
|
556
|
-
zone: this.currentEquipments.zonesMap.get(this.zoneIDFilter),
|
|
557
|
-
}); // for lateral menu
|
|
558
|
-
}
|
|
559
|
-
updateDueToCreate(createdEquip) {
|
|
560
|
-
this.currentEquipments.space.unshift(createdEquip);
|
|
561
|
-
this.currentEquipments.zonesMap
|
|
562
|
-
.get(this.zoneIDFilter)
|
|
563
|
-
.unshift(createdEquip);
|
|
564
|
-
this.equipmentsUpdated.next({
|
|
565
|
-
space: this.currentEquipments.space,
|
|
566
|
-
zone: this.currentEquipments.zonesMap.get(this.zoneIDFilter),
|
|
567
|
-
}); // for lateral menu
|
|
568
|
-
}
|
|
569
|
-
updateDueToEquipUpdated(updatedEquip) {
|
|
570
|
-
const equip = this.currentEquipments.space.find((_equip) => _equip.id === updatedEquip.id);
|
|
571
|
-
if (equip) {
|
|
572
|
-
const index = this.currentEquipments.space.indexOf(equip);
|
|
573
|
-
if (this.isArchived(equip)) {
|
|
574
|
-
// we remove archived equipment
|
|
575
|
-
this.currentEquipments.space.splice(index, 1);
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
this.currentEquipments.space.splice(index, 1, updatedEquip);
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
for (const zone of this.currentEquipments.zonesMap.keys()) {
|
|
582
|
-
const equipToUpd = this.currentEquipments.zonesMap
|
|
583
|
-
.get(zone)
|
|
584
|
-
.find((_equip) => _equip.id === updatedEquip.id);
|
|
585
|
-
if (equipToUpd) {
|
|
586
|
-
const index = this.currentEquipments.zonesMap
|
|
587
|
-
.get(zone)
|
|
588
|
-
.indexOf(equipToUpd);
|
|
589
|
-
if (this.isArchived(equip)) {
|
|
590
|
-
this.currentEquipments.zonesMap.get(zone).splice(index, 1);
|
|
591
|
-
}
|
|
592
|
-
else {
|
|
593
|
-
this.currentEquipments.zonesMap
|
|
594
|
-
.get(zone)
|
|
595
|
-
.splice(index, 1, updatedEquip);
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
this.equipmentsUpdated.next({
|
|
600
|
-
space: this.currentEquipments.space,
|
|
601
|
-
zone: this.currentEquipments.zonesMap.get(this.zoneIDFilter),
|
|
602
|
-
}); // for lateral menu
|
|
603
|
-
}
|
|
604
|
-
initSubscriptions() {
|
|
605
|
-
if (!this.isMuseumUser) {
|
|
606
|
-
this.zoneChangeService.zoneChange
|
|
607
|
-
.pipe(takeUntil(this.destroy$))
|
|
608
|
-
.subscribe((zone) => {
|
|
609
|
-
if (!zone || !this.navigatorService.currentSpaceID) {
|
|
610
|
-
this.currentSpaceID = this.navigatorService.currentSpaceID;
|
|
611
|
-
this.equipmentsTags.next(null);
|
|
612
|
-
this.equipmentsUpdated.next({ space: [], zone: null });
|
|
613
|
-
this.zoneIDFilter = null;
|
|
614
|
-
this.currentEquipments = {
|
|
615
|
-
space: [],
|
|
616
|
-
zonesMap: new Map(),
|
|
617
|
-
};
|
|
618
|
-
return;
|
|
619
|
-
}
|
|
620
|
-
if (zone.id !== this.zoneIDFilter) {
|
|
621
|
-
this.zoneIDFilter = zone.id;
|
|
622
|
-
this.currentZone = zone;
|
|
623
|
-
if (this.currentSpaceID === this.navigatorService.currentSpaceID) {
|
|
624
|
-
// same space, only zone update
|
|
625
|
-
// console.log(
|
|
626
|
-
// "going to update equips for zone (same space)",
|
|
627
|
-
// zone,
|
|
628
|
-
// );
|
|
629
|
-
this.updateEquipsForZone();
|
|
630
|
-
}
|
|
631
|
-
else {
|
|
632
|
-
this.currentSpaceID = this.navigatorService.currentSpaceID;
|
|
633
|
-
// console.log(
|
|
634
|
-
// "going to init equips for zone for new space",
|
|
635
|
-
// this.currentSpaceID,
|
|
636
|
-
// );
|
|
637
|
-
this.initEquips();
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
});
|
|
641
|
-
this.deleteObservable
|
|
642
|
-
.pipe(takeUntil(this.destroy$))
|
|
643
|
-
.subscribe((equipment) => {
|
|
644
|
-
if (this.currentSpaceID) {
|
|
645
|
-
this.updateDueToDelete(equipment);
|
|
646
|
-
}
|
|
647
|
-
});
|
|
648
|
-
this.createObservable
|
|
649
|
-
.pipe(takeUntil(this.destroy$))
|
|
650
|
-
.subscribe((equipment) => {
|
|
651
|
-
if (this.currentSpaceID) {
|
|
652
|
-
this.updateDueToCreate(equipment);
|
|
653
|
-
}
|
|
654
|
-
});
|
|
655
|
-
this.updateObservable
|
|
656
|
-
.pipe(takeUntil(this.destroy$))
|
|
657
|
-
.subscribe((equipment) => {
|
|
658
|
-
if (this.currentSpaceID) {
|
|
659
|
-
this.updateDueToEquipUpdated(equipment);
|
|
660
|
-
}
|
|
661
|
-
});
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
unsubscribe() {
|
|
665
|
-
this.destroy$.next(true);
|
|
666
|
-
this.destroy$.complete();
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
EquipmentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EquipmentService, deps: [{ token: 'currentAPIService' }, { token: 'currentAwsKinesisAnalyticsService' }, { token: i1.PoiService }, { token: i2.NavigationService }, { token: i3.OperationService }, { token: i4.TicketsService }, { token: i5.NavigatorService }, { token: i6.FilterService }, { token: i7.BaseUserService }, { token: i8.ViewerService }, { token: i9.NgbModal }, { token: i10.ZoneChangeService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
670
|
-
EquipmentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EquipmentService, providedIn: 'root' });
|
|
671
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EquipmentService, decorators: [{
|
|
672
|
-
type: Injectable,
|
|
673
|
-
args: [{
|
|
674
|
-
providedIn: 'root',
|
|
675
|
-
}]
|
|
676
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
677
|
-
type: Inject,
|
|
678
|
-
args: ['currentAPIService']
|
|
679
|
-
}] }, { type: undefined, decorators: [{
|
|
680
|
-
type: Inject,
|
|
681
|
-
args: ['currentAwsKinesisAnalyticsService']
|
|
682
|
-
}] }, { type: i1.PoiService }, { type: i2.NavigationService }, { type: i3.OperationService }, { type: i4.TicketsService }, { type: i5.NavigatorService }, { type: i6.FilterService }, { type: i7.BaseUserService }, { type: i8.ViewerService }, { type: i9.NgbModal }, { type: i10.ZoneChangeService }]; } });
|
|
683
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1aXBtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21vZGVscy9lcXVpcG1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixHQUV6QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFNTCxRQUFRLEVBRVIsV0FBVyxFQUNYLFNBQVMsRUFHVCxPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFHN0IsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsNkJBQTZCLEVBQzdCLGNBQWMsR0FDZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBVXhELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxpQkFBaUI7SUF5RHJELFlBQytCLFdBQWdCLEVBRTNDLDJCQUFnQyxFQUNsQyxVQUFzQixFQUN0QixpQkFBb0MsRUFDNUIsZ0JBQWtDLEVBQ2xDLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixXQUE0QixFQUM1QixhQUE0QixFQUM1QixZQUFzQixFQUN0QixpQkFBb0M7UUFFNUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBVDdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEs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QUFJLENBQUMsZ0JBQWdCO2lCQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNuQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUwsSUFBSSxDQUFDLGdCQUFnQjtpQkFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzlCLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDekM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OzZHQXAwQlUsZ0JBQWdCLGtCQTBEakIsbUJBQW1CLGFBQ25CLG1DQUFtQztpSEEzRGxDLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBMkRJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsTUFBTTsyQkFBQyxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIEluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nYk1vZGFsfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQge1N1YmplY3QsIHRha2VVbnRpbH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBvcGVuTW9kYWxGb3JWaXNpdFN3aXRjaCxcbiAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0LFxuICB3YWl0VW50aWwsXG59IGZyb20gJy4uLy4uL2hlbHBlcnMuc2VydmljZSc7XG5pbXBvcnQge01hdHRlcnRhZ0RhdGF9IGZyb20gJy4uLy4uL21hdHRlcnRhZ0RhdGEnO1xuaW1wb3J0IHtcbiAgTm90ZSxcbiAgWm9uZSxcbiAgRXF1aXBtZW50LFxuICBFcXVpcG1lbnREb2N1bWVudCxcbiAgVGlja2V0LFxuICBUeXBlTm90ZSxcbiAgTWlzc2lvbixcbiAgRXZlbnRTdGF0dXMsXG4gIEV2ZW50VHlwZSxcbiAgT3BlcmF0aW9uLFxuICBQT0ksXG4gIFBvaVR5cGUsXG4gIFJvbGVTdGF0dXMsXG59IGZyb20gJy4uLy4uL3R5cGVzLnNlcnZpY2UnO1xuaW1wb3J0IHtGaWx0ZXJTZXJ2aWNlfSBmcm9tICcuLi9maWx0ZXIuc2VydmljZSc7XG5pbXBvcnQge05hdmlnYXRvclNlcnZpY2V9IGZyb20gJy4uL25hdmlnYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIGRlbGV0ZUZyb21TMyxcbiAgZ2V0U2lnbmVkRmlsZSxcbiAgZ2V0U2lnbmVkSW1hZ2VVcmxGb3JFcXVpcG1lbnQsXG4gIHVwbG9hZEZpbGVUb1MzLFxufSBmcm9tICcuLi9zMy5zZXJ2aWNlJztcbmltcG9ydCB7QmFzZVVzZXJTZXJ2aWNlfSBmcm9tICcuLi91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtWaWV3ZXJTZXJ2aWNlfSBmcm9tICcuLi92aWV3ZXIuc2VydmljZSc7XG5pbXBvcnQge0Jhc2VPYmplY3RTZXJ2aWNlfSBmcm9tICcuL2Jhc2Utb2JqZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHtOYXZpZ2F0aW9uU2VydmljZX0gZnJvbSAnLi9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtPcGVyYXRpb25TZXJ2aWNlfSBmcm9tICcuL29wZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7UG9pU2VydmljZX0gZnJvbSAnLi9wb2kuc2VydmljZSc7XG5pbXBvcnQge1RpY2tldHNTZXJ2aWNlfSBmcm9tICcuL3RpY2tldC5zZXJ2aWNlJztcbmltcG9ydCB7Wm9uZUNoYW5nZVNlcnZpY2V9IGZyb20gXCIuLi96b25lQ2hhbmdlLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEVxdWlwbWVudFNlcnZpY2UgZXh0ZW5kcyBCYXNlT2JqZWN0U2VydmljZSB7XG4gIHByaXZhdGUgcHJlZml4ID0ge1xuICAgIHRlY2huaWNhbDogJ2VxdWlwbWVudHMvbm90ZS90ZWNobmljYWwvJyxcbiAgICBpbWFnZTogJ2VxdWlwbWVudHMvbm90ZS9pbWFnZS8nLFxuICAgIGZpbmFuY2lhbDogJ2VxdWlwbWVudHMvbm90ZS9maW5hbmNpYWwvJyxcbiAgICBpbmZvcm1hdGlvbjogJ2VxdWlwbWVudHMvbm90ZS9pbmZvcm1hdGlvbi8nLFxuICAgIG90aGVyOiAnZXF1aXBtZW50cy9ub3RlL290aGVyLycsXG4gICAgY29udHJhY3R1YWw6ICdlcXVpcG1lbnRzL25vdGUvY29udHJhY3R1YWwvJyxcbiAgfTtcblxuICBlcXVpcG1lbnRzVXBkYXRlZDogU3ViamVjdDx7XG4gICAgc3BhY2U6IEVxdWlwbWVudFtdO1xuICAgIHpvbmU6IEVxdWlwbWVudFtdO1xuICB9PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY3VycmVudEVxdWlwbWVudHM6IHtcbiAgICBzcGFjZTogRXF1aXBtZW50W107XG4gICAgem9uZXNNYXA6IE1hcDxzdHJpbmcsIEVxdWlwbWVudFtdPjtcbiAgfSA9IHtcbiAgICBzcGFjZTogW10sXG4gICAgem9uZXNNYXA6IG5ldyBNYXAoKSxcbiAgfTtcblxuICBlcXVpcG1lbnRzVGFnczogU3ViamVjdDxFcXVpcG1lbnRbXT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHpvbmVJREZpbHRlcjogc3RyaW5nO1xuXG4gIGN1cnJlbnRab25lOiBab25lO1xuXG4gIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmc7XG5cbiAgZmxvb3JzUGVyU3BhY2U6IFpvbmVbXSA9IG51bGw7XG5cbiAgLyoqIE51bGwgbWVhbnMgd2UgZG8gbm90IGFwcGx5IGEgZmlsdGVyLCBlbXB0eSBhcnJheSAoW10pLCBtZWFucyB3ZSB0aGF0IHdlIGhpZGUgYWxsIGVxdWlwbWVudCAqL1xuICBlcXVpcG1lbnREb21haW5GaWx0ZXI6IHN0cmluZ1tdID0gbnVsbDtcblxuICB1cGRhdGluZzogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY3VycmVudGx5VXBkYXRpbmcgPSBmYWxzZTtcblxuICBjdXJyZW50U3dlZXA6IHN0cmluZztcblxuICBkZWxldGVPYnNlcnZhYmxlOiBTdWJqZWN0PEVxdWlwbWVudD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNyZWF0ZU9ic2VydmFibGU6IFN1YmplY3Q8RXF1aXBtZW50PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgdXBkYXRlT2JzZXJ2YWJsZTogU3ViamVjdDxFcXVpcG1lbnQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBzZWxlY3RlZEZsb29yOiBab25lID0gbnVsbDtcblxuICBBUEk6IGFueTsgLy9BV1NcbiAgYXdzS2luZXNpc0FuYWx5dGljczogYW55OyAvL0FXU1xuXG4gIGlzTXVzZXVtVXNlciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ2N1cnJlbnRBUElTZXJ2aWNlJykgYXBpSW5qZWN0ZWQ6IGFueSxcbiAgICBASW5qZWN0KCdjdXJyZW50QXdzS2luZXNpc0FuYWx5dGljc1NlcnZpY2UnKVxuICAgICAgYXdzS2luZXNpc0FuYWx5dGljc0luamVjdGVkOiBhbnksXG4gICAgcG9pU2VydmljZTogUG9pU2VydmljZSxcbiAgICBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvcGVyYXRpb25TZXJ2aWNlOiBPcGVyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdGlja2V0c1NlcnZpY2U6IFRpY2tldHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmF2aWdhdG9yU2VydmljZTogTmF2aWdhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgcHJpdmF0ZSB6b25lQ2hhbmdlU2VydmljZTogWm9uZUNoYW5nZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIocG9pU2VydmljZSwgbmF2aWdhdGlvblNlcnZpY2UpO1xuXG4gICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcbiAgICB0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MgPSBhd3NLaW5lc2lzQW5hbHl0aWNzSW5qZWN0ZWQ7XG5cbiAgICB0aGlzLmlzTXVzZXVtVXNlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzT25seU11c2V1bVJvbGUoKTtcbiAgICB0aGlzLmluaXRTdWJzY3JpcHRpb25zKCk7XG4gICAgdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xuICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xuICAgICAgICB0aGlzLmluaXRTdWJzY3JpcHRpb25zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnpvbmVDaGFuZ2VTZXJ2aWNlLmZsb29ySGFzQ2hhbmdlZC5zdWJzY3JpYmUoKGZsb29yKT0+e1xuICAgICAgaWYgKGZsb29yKXtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gZmxvb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWFkRXF1aXBtZW50KGlkOiBzdHJpbmcpOiBQcm9taXNlPEVxdWlwbWVudD4ge1xuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uR2V0RXF1aXBtZW50KGlkKS50aGVuKGFzeW5jIChyZWNlaXZlZEVxdWlwKSA9PiB7XG4gICAgICBsZXQgZXF1aXA6IEVxdWlwbWVudDtcbiAgICAgIGlmIChyZWNlaXZlZEVxdWlwKSB7XG4gICAgICAgIGVxdWlwID0gcmVjZWl2ZWRFcXVpcDtcbiAgICAgICAgZXF1aXAgPSBhd2FpdCB0aGlzLmdldFNpZ25lZFVybHNGb3JFcXVpcG1lbnQocmVjZWl2ZWRFcXVpcCk7XG4gICAgICAgIGlmIChlcXVpcC5kb21haW4pIHtcbiAgICAgICAgICBpZiAoZXF1aXAuZG9tYWluLnBhcmVudElEKSB7XG4gICAgICAgICAgICBlcXVpcC5jaGlsZERvbWFpbiA9IGVxdWlwLmRvbWFpbjtcbiAgICAgICAgICAgIGVxdWlwLnBhcmVudERvbWFpbiA9IGVxdWlwLmRvbWFpbi5wYXJlbnQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVxdWlwLnBhcmVudERvbWFpbiA9IGVxdWlwLmRvbWFpbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVxdWlwLnN1YmVxdWlwbWVudHNJRHMpIHtcbiAgICAgICAgICBjb25zdCBzdWJFcXVpcHMgPSBbXTtcbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGVxdWlwLnN1YmVxdWlwbWVudHNJRHMubWFwKGFzeW5jIChzdWJJZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzdWJFcXVpcCA9IGF3YWl0IHRoaXMuQVBJLkdldEVxdWlwbWVudChzdWJJZCk7XG4gICAgICAgICAgICAgIHN1YkVxdWlwcy5wdXNoKHN1YkVxdWlwKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcXVpcC5zdWJFcXVpcG1lbnRzID0gc3ViRXF1aXBzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZXF1aXA7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVFcXVpcG1lbnQoXG4gICAgZXF1aXA6IEVxdWlwbWVudCxcbiAgICBpbWFnZUZpbGU6IEZpbGUsXG4gICAgZG9jdW1lbnRGaWxlOiBGaWxlXG4gICk6IFByb21pc2U8RXF1aXBtZW50IHwgdm9pZD4ge1xuICAgIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdChlcXVpcCk7XG4gICAgaWYgKCEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzICYmICEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLnJlY29yZCAmJiB0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MucmVjb3JkKCkpIHtcbiAgICAgIHRoaXMuYXdzS2luZXNpc0FuYWx5dGljcy5nZXRJbnN0YW5jZSgpLnJlY29yZChcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnT2JqZWN0IENyZWF0aW9uJyxcbiAgICAgICAgICAgIG9iamVjdFR5cGU6ICdlcXVpcG1lbnQnLFxuICAgICAgICAgICAgcG9pOiBlcXVpcCxcbiAgICAgICAgICAgIHVzZXI6IHRoaXMudXNlclNlcnZpY2UuY3UsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiB0aGlzLmN1cnJlbnRTcGFjZUlELFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgem9uZUlkOiB0aGlzLmN1cnJlbnRab25lLmlkLFxuICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5zZWxlY3RlZEZsb29yPy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cmVhbU5hbWU6ICdzbWFydGVycGxhbktpbmVzaXMtYW5hbHl0aWNzJyxcbiAgICAgICAgICAvLyBwYXJ0aXRpb25LZXk6IFwiXCIsXG4gICAgICAgIH0sXG4gICAgICAgICdBV1NLaW5lc2lzJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuQVBJLkNyZWF0ZUVxdWlwbWVudChlcXVpcCkudGhlbihhc3luYyAocmVjZWl2ZWRFcXVpcG1lbnQpID0+IHtcbiAgICAgIGxldCBlcXVpcG1lbnQgPSByZWNlaXZlZEVxdWlwbWVudCBhcyBFcXVpcG1lbnQ7XG4gICAgICBpZiAoZXF1aXBtZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlcXVpcG1lbnQgY3JlYXRlZDonLCBlcXVpcG1lbnQpO1xuICAgICAgICBpZiAoZG9jdW1lbnRGaWxlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWREb2MoZXF1aXBtZW50LCBkb2N1bWVudEZpbGUsIFR5cGVOb3RlLlRFQ0hOSUNBTCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGltYWdlRmlsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudXBsb2FkSW1hZ2UoZXF1aXBtZW50LCBpbWFnZUZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZXF1aXBtZW50O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0U2lnbmVkVXJsc0ZvckVxdWlwbWVudChlcXVpcDogRXF1aXBtZW50KTogUHJvbWlzZTxFcXVpcG1lbnQ+IHtcbiAgICBjb25zdCBlcXVpcG1lbnQgPSB7Li4uZXF1aXB9O1xuICAgIGlmIChlcXVpcG1lbnQubm90ZXMuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZG9jcyA9IFtdO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGVxdWlwbWVudC5ub3Rlcy5pdGVtcy5tYXAoYXN5bmMgKG5vdGUpID0+IHtcbiAgICAgICAgICBlcXVpcG1lbnQuZG9jdW1lbnRhdGlvbkltYWdlVXJsU2lnbmVkID1cbiAgICAgICAgICAgIGF3YWl0IGdldFNpZ25lZEltYWdlVXJsRm9yRXF1aXBtZW50KGVxdWlwbWVudCk7XG4gICAgICAgICAgaWYgKG5vdGUuYXR0YWNobWVudCkge1xuICAgICAgICAgICAgY29uc3Qge2xlbmd0aH0gPSBub3RlLmF0dGFjaG1lbnQuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gbm90ZS5hdHRhY2htZW50LnNwbGl0KCcvJylbbGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgZ2V0U2lnbmVkRmlsZShub3RlLmF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQpIHtcbiAgICAgICAgICAgICAgZG9jcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICB1cmw6IG5vdGUuYXR0YWNobWVudCxcbiAgICAgICAgICAgICAgICB1cmxTaWduZWQ6IGF0dGFjaG1lbnQsXG4gICAgICAgICAgICAgICAgbm90ZUlEOiBub3RlLmlkLFxuICAgICAgICAgICAgICB9IGFzIEVxdWlwbWVudERvY3VtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgZXF1aXBtZW50LmRvY3VtZW50cyA9IGRvY3M7XG4gICAgICByZXR1cm4gZXF1aXBtZW50O1xuICAgIH1cbiAgICByZXR1cm4gZXF1aXBtZW50O1xuICB9XG5cbiAgYXN5bmMgZ2V0RXF1aXBtZW50c0ZvclRpY2tldCh0aWNrZXQ6IFRpY2tldCk6IFByb21pc2U8RXF1aXBtZW50W10+IHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gdGlja2V0Lm9wZXJhdGlvbnMuaXRlbXM7XG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgb3BlcmF0aW9ucy5zb3J0KFxuICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZXR0aWVyL3ByZXR0aWVyXG4gICAgICAgICAgbmV3IERhdGUoYi5jcmVhdGVkQXQpIC0gbmV3IERhdGUoYS5jcmVhdGVkQXQpXG4gICAgICApO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIG9wZXJhdGlvbnMubWFwKGFzeW5jIChvcGVyYXRpb24pID0+IHtcbiAgICAgICAgICBvcGVyYXRpb24uZXF1aXBtZW50ID0gYXdhaXQgdGhpcy5yZWFkRXF1aXBtZW50KG9wZXJhdGlvbi5lcXVpcG1lbnRJRCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICAvLyB0byBrZWVwIHRoZSBzb3J0aW5nIGJ5IGNyZWF0ZWRBdFxuICAgIHJldHVybiBvcGVyYXRpb25zLm1hcCgobykgPT4gby5lcXVpcG1lbnQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0RXF1aXBtZW50c0ZvclNwYWNlKHNwYWNlSUQ6IHN0cmluZyk6IFByb21pc2U8RXF1aXBtZW50W10+IHtcbiAgICAvLyBzcGxpdCBieSAxMDBcbiAgICBjb25zdCBsaW1pdCA9IDEwMDtcbiAgICBsZXQgZXF1aXBzVG9rZW4gPSB7ZXF1aXBzOiBbXSwgbmV4dFRva2VuOiBudWxsfTtcbiAgICBkbyB7XG4gICAgICBlcXVpcHNUb2tlbiA9IGF3YWl0IHRoaXMubWVyZ2VFcXVpcG1lbnRzRm9yU3BhY2VXaXRoTmV4dFRva2VuV2l0aExpbWl0KFxuICAgICAgICBzcGFjZUlELFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgZXF1aXBzVG9rZW5cbiAgICAgICk7XG4gICAgfSB3aGlsZSAoZXF1aXBzVG9rZW4ubmV4dFRva2VuKTtcbiAgICByZXR1cm4gZXF1aXBzVG9rZW4uZXF1aXBzO1xuICB9XG5cbiAgYXN5bmMgbWVyZ2VFcXVpcG1lbnRzRm9yU3BhY2VXaXRoTmV4dFRva2VuV2l0aExpbWl0KFxuICAgIHNwYWNlSUQ6IHN0cmluZyxcbiAgICBsaW1pdDogbnVtYmVyLFxuICAgIGVxdWlwc1Rva2VuOiB7IGVxdWlwczogRXF1aXBtZW50W107IG5leHRUb2tlbjogc3RyaW5nIHwgbnVsbCB9XG4gICk6IFByb21pc2U8eyBlcXVpcHM6IEVxdWlwbWVudFtdOyBuZXh0VG9rZW46IHN0cmluZyB8IG51bGwgfT4ge1xuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX19cbiAgICAgIC5FcXVpcG1lbnRzQnlTcGFjZShcbiAgICAgICAgc3BhY2VJRCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgJ0RFU0MnLFxuICAgICAgICBudWxsLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgZXF1aXBzVG9rZW4ubmV4dFRva2VuIC8vIG5leHRUb2tlblxuICAgICAgKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVxdWlwc0xpbWl0ID0gcmVzcG9uc2UuaXRlbXM7XG4gICAgICAgIGNvbnN0IGVxdWlwc09iamVjdCA9IHtcbiAgICAgICAgICBlcXVpcHM6IFsuLi5lcXVpcHNUb2tlbi5lcXVpcHMsIC4uLmVxdWlwc0xpbWl0XSxcbiAgICAgICAgICBuZXh0VG9rZW46IHJlc3BvbnNlLm5leHRUb2tlbixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGVxdWlwc09iamVjdDtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBsb2FkSW1hZ2VGb3JBbGxFcXVpcG1lbnRzKFxuICAgIGVxdWlwbWVudHM6IEVxdWlwbWVudFtdLFxuICAgIGltYWdlRmlsZTogRmlsZVxuICApOiBQcm9taXNlPEVxdWlwbWVudFtdPiB7XG4gICAgaWYgKGVxdWlwbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwbG9hZEZpbGVUb1MzKHRoaXMucHJlZml4LmltYWdlLCBpbWFnZUZpbGUsICdCQVRDSCcpLnRoZW4oXG4gICAgICBhc3luYyAodXJsKSA9PiB7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBjb25zdCBlcXVpcHMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVxdWlwIG9mIGVxdWlwbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbihcbiAgICAgICAgICAgICAgZXF1aXAuc3BhY2VJRFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVOb3RlKHtcbiAgICAgICAgICAgICAgYXR0YWNobWVudDogdXJsLFxuICAgICAgICAgICAgICB0eXBlOiBUeXBlTm90ZS5JTUFHRSxcbiAgICAgICAgICAgICAgZXF1aXBtZW50SUQ6IGVxdWlwLmlkLFxuICAgICAgICAgICAgICBvd25lck1pc3Npb25JRDogY3VycmVudE1pc3Npb24gPyBjdXJyZW50TWlzc2lvbi5pZCA6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5VcGRhdGVFcXVpcG1lbnQoe1xuICAgICAgICAgICAgICBpZDogZXF1aXAuaWQsXG4gICAgICAgICAgICAgIHBob3RvOiB1cmwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVxdWlwcy5wdXNoKHVwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlcXVpcHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyB1cGxvYWRJbWFnZShlcXVpcG1lbnQ6IEVxdWlwbWVudCwgaW1hZ2VGaWxlOiBGaWxlKTogUHJvbWlzZTxOb3RlPiB7XG4gICAgcmV0dXJuIHVwbG9hZEZpbGVUb1MzKHRoaXMucHJlZml4LmltYWdlLCBpbWFnZUZpbGUsIGVxdWlwbWVudC5pZCkudGhlbihcbiAgICAgIGFzeW5jICh1cmwpID0+IHtcbiAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRNaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbihcbiAgICAgICAgICAgIGVxdWlwbWVudC5zcGFjZUlEXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBub3RlID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkNyZWF0ZU5vdGUoe1xuICAgICAgICAgICAgYXR0YWNobWVudDogdXJsLFxuICAgICAgICAgICAgdHlwZTogVHlwZU5vdGUuSU1BR0UsXG4gICAgICAgICAgICBlcXVpcG1lbnRJRDogZXF1aXBtZW50LmlkLFxuICAgICAgICAgICAgb3duZXJNaXNzaW9uSUQ6IGN1cnJlbnRNaXNzaW9uID8gY3VycmVudE1pc3Npb24uaWQgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5VcGRhdGVFcXVpcG1lbnQoe1xuICAgICAgICAgICAgaWQ6IGVxdWlwbWVudC5pZCxcbiAgICAgICAgICAgIHBob3RvOiB1cmwsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUVxdWlwbWVudChcbiAgICBlcXVpcDogYW55LFxuICAgIGZpbGU6IEZpbGUgPSBudWxsLFxuICAgIG5vdGVUeXBlOiBUeXBlTm90ZSA9IG51bGxcbiAgKTogUHJvbWlzZTxFcXVpcG1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fXG4gICAgICAuVXBkYXRlRXF1aXBtZW50KGVxdWlwKVxuICAgICAgLnRoZW4oYXN5bmMgKHJlY2VpdmVkRXF1aXBtZW50KSA9PiB7XG4gICAgICAgIGxldCBlcXVpcG1lbnQgPSByZWNlaXZlZEVxdWlwbWVudCBhcyBFcXVpcG1lbnQ7XG4gICAgICAgIGlmIChlcXVpcG1lbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXF1aXBtZW50IHVwZGF0ZWQ6JywgZXF1aXBtZW50KTtcbiAgICAgICAgICBpZiAobm90ZVR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobm90ZVR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBUeXBlTm90ZS5JTUFHRTpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZEltYWdlKGVxdWlwbWVudCwgZmlsZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWREb2MoZXF1aXBtZW50LCBmaWxlLCBub3RlVHlwZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcXVpcG1lbnQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFByZWZpeERvYyh0eXBlOiBUeXBlTm90ZSkge1xuICAgIGxldCBwcmVmaXg7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFR5cGVOb3RlLklORk9STUFUSU9OOlxuICAgICAgICBwcmVmaXggPSB0aGlzLnByZWZpeC5pbmZvcm1hdGlvbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFR5cGVOb3RlLkZJTkFOQ0lBTDpcbiAgICAgICAgcHJlZml4ID0gdGhpcy5wcmVmaXguZmluYW5jaWFsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHlwZU5vdGUuQ09OVFJBQ1RVQUw6XG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4LmNvbnRyYWN0dWFsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHlwZU5vdGUuT1RIRVI6XG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4Lm90aGVyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHlwZU5vdGUuSU1BR0U6XG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4LmltYWdlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4LnRlY2huaWNhbDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXg7XG4gIH1cblxuICBhc3luYyB1cGxvYWREb2NGb3JBbGxFcXVpcG1lbnRzKFxuICAgIGVxdWlwbWVudHM6IEVxdWlwbWVudFtdLFxuICAgIGRvY3VtZW50RmlsZTogRmlsZSxcbiAgICB0eXBlOiBUeXBlTm90ZVxuICApIHtcbiAgICBpZiAoZXF1aXBtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRQcmVmaXhEb2ModHlwZSk7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgdXBsb2FkRmlsZVRvUzMocHJlZml4LCBkb2N1bWVudEZpbGUsICdCQVRDSCcpO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZUxpc3QgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZXF1aXAgb2YgZXF1aXBtZW50cykge1xuICAgICAgICBjb25zdCBtaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbihlcXVpcC5zcGFjZUlEKTtcbiAgICAgICAgY29uc3QgbmV3RXF1aXAgPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uQ3JlYXRlTm90ZSh7XG4gICAgICAgICAgYXR0YWNobWVudDogdXJsLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgZXF1aXBtZW50SUQ6IGVxdWlwLmlkLFxuICAgICAgICAgIG93bmVyTWlzc2lvbklEOiBtaXNzaW9uID8gbWlzc2lvbi5pZCA6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGVMaXN0LnB1c2gobmV3RXF1aXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZUxpc3Q7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZERvYyhcbiAgICBlcXVpcG1lbnQ6IEVxdWlwbWVudCxcbiAgICBkb2N1bWVudEZpbGU6IEZpbGUsXG4gICAgdHlwZTogVHlwZU5vdGVcbiAgKTogUHJvbWlzZTxOb3RlPiB7XG4gICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRQcmVmaXhEb2ModHlwZSk7XG4gICAgY29uc3QgbWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oZXF1aXBtZW50LnNwYWNlSUQpO1xuICAgIHJldHVybiB1cGxvYWRGaWxlVG9TMyhwcmVmaXgsIGRvY3VtZW50RmlsZSwgZXF1aXBtZW50LmlkKS50aGVuKFxuICAgICAgYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVOb3RlKHtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQ6IHVybCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBlcXVpcG1lbnRJRDogZXF1aXBtZW50LmlkLFxuICAgICAgICAgICAgb3duZXJNaXNzaW9uSUQ6IG1pc3Npb24gPyBtaXNzaW9uLmlkIDogbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRXF1aXBtZW50KGVxdWlwOiBFcXVpcG1lbnQpOiBQcm9taXNlPEVxdWlwbWVudD4ge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlRXF1aXBtZW50KHtpZDogZXF1aXAuaWR9KTtcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlZCBlcXVpcG1lbnQnLCBkZWxldGVkKTtcblxuICAgIC8vIGRlbGV0ZSBQT0lcbiAgICBjb25zdCBbcG9pXSA9IGVxdWlwLnBvaXMuaXRlbXM7XG4gICAgaWYgKHBvaSkge1xuICAgICAgYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmRlbGV0ZVBvaShwb2kuaWQpO1xuICAgIH1cbiAgICAvLyBkZWxldGUgbm90ZXMgcmVsYXRlZFxuICAgIGlmIChlcXVpcC5ub3Rlcy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZXF1aXAubm90ZXMuaXRlbXMubWFwKGFzeW5jIChub3RlOiBOb3RlKSA9PiB7XG4gICAgICAgICAgLy8gZGVsZXRlIGZpbGVzIGZyb20gUzNcbiAgICAgICAgICAvKiogTm90IHNoYXJlZCB3aXRoIG90aGVyIGVxdWlwbWVudCAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vdGUuYXR0YWNobWVudCAmJlxuICAgICAgICAgICAgIW5vdGUuYXR0YWNobWVudC5zcGxpdCgnLycpLnBvcCgpLnN0YXJ0c1dpdGgoJ0JBVENIXycpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVGcm9tUzMobm90ZS5hdHRhY2htZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZU5vdGUoe2lkOiBub3RlLmlkfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBkZWxldGUgb3BlcmF0aW9ucyAocmVtb3ZlIGZyb20gbGlua2VkIHRpY2tldHMpXG4gICAgYXdhaXQgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmRlbGV0ZU9wZXJhdGlvbnNGb3JFcXVpcG1lbnQoZXF1aXAuaWQpO1xuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRXF1aXBtZW50TG9jYXRpb24oXG4gICAgZXF1aXA6IEVxdWlwbWVudCxcbiAgICB0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhXG4gICk6IFByb21pc2U8UE9JPiB7XG4gICAgY29uc3QgcG9pSW5wdXQgPSB7XG4gICAgICBjb29yZGluYXRlOiB0YWdEYXRhLmdldENvb3JkaW5hdGVTdHJpbmcoKSxcbiAgICAgIHR5cGU6IFBvaVR5cGUuRVFVSVBNRU5ULFxuICAgICAgZWxlbWVudElEOiBlcXVpcC5pZCxcbiAgICAgIG1ldGFkYXRhOiB0YWdEYXRhLmdldE1ldGFkYXRhU3RyaW5nKCksXG4gICAgICBtYXR0ZXJwb3J0U3dlZXBJRDogdGFnRGF0YS5nZXRTd2VlcElEKCksXG4gICAgfSBhcyBQT0k7XG4gICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmNyZWF0ZVBPSUZvclNwYWNlSUQocG9pSW5wdXQpO1xuICAgIHJldHVybiBwb2k7XG4gIH1cblxuICBhc3luYyByZW1vdmVUaWNrZXRGcm9tRXF1aXBtZW50KFxuICAgIHRpY2tldDogVGlja2V0LFxuICAgIGVxdWlwOiBFcXVpcG1lbnRcbiAgKTogUHJvbWlzZTxPcGVyYXRpb24+IHtcbiAgICBjb25zdCBvcGVyYXRpb25FcXVpcCA9XG4gICAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuZ2V0T3BlcmF0aW9uc0J5RXF1aXBtZW50SUQoZXF1aXAuaWQpO1xuICAgIGNvbnN0IG9wZXJhdGlvblRvRGVsZXRlID0gb3BlcmF0aW9uRXF1aXAuZmluZChcbiAgICAgIChvcCkgPT4gb3AudGlja2V0SUQgPT09IHRpY2tldC5pZFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uU2VydmljZVxuICAgICAgLmRlbGV0ZU9wZXJhdGlvbihvcGVyYXRpb25Ub0RlbGV0ZS5pZClcbiAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy50aWNrZXRzU2VydmljZS5hZGRFdmVudFRvVGlja2V0KHRpY2tldCBhcyBUaWNrZXQsIHtcbiAgICAgICAgICB0aXRsZTogJ0VxdWlwZW1lbnQgcmV0aXLDqSBkdSB0aWNrZXQnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgRXF1aXBlbWVudCAke2VxdWlwLm5hbWV9IGEgw6l0w6kgcmV0aXLDqSBkdSB0aWNrZXRgLFxuICAgICAgICAgIHN0YXR1czogRXZlbnRTdGF0dXMuVU5MSU5LRURfRlJPTV9FUVVJUE1FTlQsXG4gICAgICAgICAgdHlwZTogRXZlbnRUeXBlLlRJQ0tFVCxcbiAgICAgICAgICB0cmFuc2xhdGlvblBhdGg6ICd0aWNrZXRFdmVudC50aWNrZXQudW5saW5rZWRGcm9tRXF1aXBtZW50JyxcbiAgICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoe2VxdWlwbWVudDogZXF1aXAubmFtZX0pLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdEVxdWlwcygpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGluZy5uZXh0KHRydWUpO1xuICAgIHRoaXMuY3VycmVudGx5VXBkYXRpbmcgPSB0cnVlO1xuXG4gICAgbGV0IGVxTGlzdCA9IGF3YWl0IHRoaXMuZ2V0RXF1aXBtZW50c0ZvclNwYWNlKHRoaXMuY3VycmVudFNwYWNlSUQpO1xuICAgIGVxTGlzdCA9IGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJFcXVpcG1lbnRzRm9yQ3VycmVudFVzZXJJblNwYWNlKFxuICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCxcbiAgICAgIGVxTGlzdFxuICAgICk7XG4gICAgLy8gY29uc29sZS5sb2coZXFMaXN0KTtcbiAgICBpZiAoZXFMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmaWx0ZXJlZEVxdWlwcyA9IGVxTGlzdC5maWx0ZXIoXG4gICAgICAgIChlcXVpcG1lbnQpID0+ICF0aGlzLmlzQXJjaGl2ZWQoZXF1aXBtZW50KVxuICAgICAgKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbHRlcmVkRXF1aXBzLm1hcChhc3luYyAoZXF1aXApID0+IHtcbiAgICAgICAgICBlcXVpcC5kb2N1bWVudGF0aW9uSW1hZ2VVcmxTaWduZWQgPVxuICAgICAgICAgICAgYXdhaXQgZ2V0U2lnbmVkSW1hZ2VVcmxGb3JFcXVpcG1lbnQoZXF1aXApO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLmVxdWlwbWVudERvbWFpbkZpbHRlcikge1xuICAgICAgICBmaWx0ZXJlZEVxdWlwcyA9IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJFcXVpcG1lbnRzQnlEb21haW5MaXN0KFxuICAgICAgICAgIGZpbHRlcmVkRXF1aXBzLFxuICAgICAgICAgIHRoaXMuZXF1aXBtZW50RG9tYWluRmlsdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlID0gZmlsdGVyZWRFcXVpcHM7XG4gICAgICBpZiAodGhpcy56b25lSURGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyZWRFcXVpcHMgPSAoYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3Jab25lKFxuICAgICAgICAgIGZpbHRlcmVkRXF1aXBzLFxuICAgICAgICAgIHRoaXMuem9uZUlERmlsdGVyLFxuICAgICAgICAgIHRoaXMuY3VycmVudFpvbmVcbiAgICAgICAgKSkgYXMgRXF1aXBtZW50W107XG4gICAgICB9XG4gICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLnNldCh0aGlzLnpvbmVJREZpbHRlciwgZmlsdGVyZWRFcXVpcHMpO1xuICAgICAgdGhpcy5lcXVpcG1lbnRzVGFncy5uZXh0KGZpbHRlcmVkRXF1aXBzKTsgLy8gYWRkaW5nIHRhZ3Mgb25seSBmb3IgdGhlIGN1cnJlbnQgem9uZVxuICAgICAgdGhpcy5lcXVpcG1lbnRzVXBkYXRlZC5uZXh0KHtcbiAgICAgICAgc3BhY2U6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXG4gICAgICAgIHpvbmU6IGZpbHRlcmVkRXF1aXBzLFxuICAgICAgfSk7IC8vIGZvciBsYXRlcmFsIG1lbnVcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuem9uZUlERmlsdGVyKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXAuc2V0KHRoaXMuem9uZUlERmlsdGVyLCBbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmVxdWlwbWVudHNVcGRhdGVkLm5leHQoe3NwYWNlOiBbXSwgem9uZTogW119KTsgLy8gZm9yIGxhdGVyYWwgbWVudVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnRFcXVpcG1lbnRzKTtcbiAgICB0aGlzLnVwZGF0aW5nLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuY3VycmVudGx5VXBkYXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGdldEVxdWlwbWVudHNGb3JDdXJyZW50VXNlckZvclNwYWNlKFxuICAgIHNwYWNlSUQsXG4gICAgbWlzc2lvbnM6IE1pc3Npb25bXVxuICApOiBQcm9taXNlPEVxdWlwbWVudFtdPiB7XG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcblxuICAgIGNvbnN0IHNwYWNlTWlzc2lvbnMgPSBtaXNzaW9ucy5maWx0ZXIoKG0pID0+IG0uc3BhY2VJRCA9PT0gc3BhY2VJRCk7XG4gICAgaWYgKHNwYWNlTWlzc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgY29uc3QgY2FuU2VlRXF1aXBzID0gc3BhY2VNaXNzaW9ucy5zb21lKFxuICAgICAgKG0pID0+XG4gICAgICAgIHRoaXMudXNlclNlcnZpY2UubWFuYWdlcnMuaW5jbHVkZXMobS5yb2xlKSB8fFxuICAgICAgICBtLnJvbGUgPT09IFJvbGVTdGF0dXMuU0VSVklDRVxuICAgICk7XG4gICAgaWYgKCFjYW5TZWVFcXVpcHMpIHtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBsZXQgZG9tYWlucyA9IFtdO1xuICAgIGZvciAoY29uc3QgbSBvZiBzcGFjZU1pc3Npb25zKSB7XG4gICAgICBkb21haW5zID0gWy4uLmRvbWFpbnMsIG0uZG9tYWluc107XG4gICAgfVxuICAgIGlmIChkb21haW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldEVxdWlwbWVudHNGb3JTcGFjZShzcGFjZUlEKTtcbiAgICAvLyByZXN1bHRzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlckVxdWlwbWVudHNCeURvbWFpbkxpc3QoXG4gICAgLy8gICAgIHJlc3VsdHMsXG4gICAgLy8gICAgIGRvbWFpbnMsXG4gICAgLy8gKTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUljb25Gb3JBbGxFcXVpcG1lbnRzSW5TcGFjZShcbiAgICB0YWdJY29uOiBzdHJpbmcsXG4gICAgc3BhY2VJRDogc3RyaW5nLFxuICAgIGRvbWFpbklEOiBzdHJpbmcgPSBudWxsXG4gICk6IFByb21pc2U8eyBlcXVpcHM6IEVxdWlwbWVudFtdOyBwb2lzOiBQT0lbXSB9PiB7XG4gICAgbGV0IGVxdWlwcyA9IGF3YWl0IHRoaXMuZ2V0RXF1aXBtZW50c0ZvclNwYWNlKHNwYWNlSUQpO1xuICAgIGlmIChkb21haW5JRCkge1xuICAgICAgZXF1aXBzID0gZXF1aXBzLmZpbHRlcigoZXF1aXApID0+IGVxdWlwLmRvbWFpbklEID09PSBkb21haW5JRCk7XG4gICAgfVxuICAgIGNvbnN0IHBvaXMgPSBhd2FpdCB0aGlzLnVwZGF0ZUljb25Gb3JBbGxPYmplY3RzKGVxdWlwcywgdGFnSWNvbik7XG4gICAgcmV0dXJuIHtlcXVpcHMsIHBvaXN9O1xuICB9XG5cbiAgLyoqIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHVzZXIgaGFzIGFyY2hpdmVkIHRoaXMgZXF1aXBtZW50ICovXG4gIGlzQXJjaGl2ZWQoZXF1aXBtZW50OiBFcXVpcG1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXF1aXBtZW50LmFyY2hpdmVkRm9yTWlzc2lvbklEXG4gICAgICA/IGVxdWlwbWVudC5hcmNoaXZlZEZvck1pc3Npb25JRC5pbmNsdWRlcyhcbiAgICAgICAgdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbihlcXVpcG1lbnQuc3BhY2VJRCkuaWRcbiAgICAgIClcbiAgICAgIDogZmFsc2U7XG4gIH1cblxuICBzZXRBcmNoaXZlZChlcXVpcG1lbnQ6IEVxdWlwbWVudCwgYXJjaGl2ZWQ6IGJvb2xlYW4pIHtcbiAgICBsZXQgYXJjaGl2ZWRMaXN0ID0gZXF1aXBtZW50LmFyY2hpdmVkRm9yTWlzc2lvbklEXG4gICAgICA/IGVxdWlwbWVudC5hcmNoaXZlZEZvck1pc3Npb25JRFxuICAgICAgOiBbXTtcbiAgICBjb25zdCBtaXNzaW9uSUQgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKGVxdWlwbWVudC5zcGFjZUlEKS5pZDtcblxuICAgIGFyY2hpdmVkTGlzdCA9IGFyY2hpdmVkTGlzdC5maWx0ZXIoKG0pID0+IG0gIT09IG1pc3Npb25JRCk7XG5cbiAgICBpZiAoYXJjaGl2ZWQpIHtcbiAgICAgIGFyY2hpdmVkTGlzdC5wdXNoKG1pc3Npb25JRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRXF1aXBtZW50KHtcbiAgICAgIGlkOiBlcXVpcG1lbnQuaWQsXG4gICAgICBhcmNoaXZlZEZvck1pc3Npb25JRDogYXJjaGl2ZWRMaXN0LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRmlsZShkb2N1bWVudF86IEVxdWlwbWVudERvY3VtZW50KSB7XG4gICAgYXdhaXQgZGVsZXRlRnJvbVMzKGRvY3VtZW50Xy51cmwpO1xuICAgIGF3YWl0IHRoaXMuQVBJLkRlbGV0ZU5vdGUoe2lkOiBkb2N1bWVudF8ubm90ZUlEfSk7XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvRXF1aXBtZW50SW4zRChcbiAgICBlcXVpcG1lbnQ6IEVxdWlwbWVudCxcbiAgICBmb3JjZVN3aXRjaFZpc2l0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgbGV0IHVybCA9IGB2aXNpdC8ke2VxdWlwbWVudC5zcGFjZUlEfWA7XG4gICAgaWYgKGZvcmNlU3dpdGNoVmlzaXQpIHtcbiAgICAgIHVybCArPSBgL2VxdWlwLyR7ZXF1aXBtZW50LmlkfWA7XG4gICAgfVxuICAgIGNvbnN0IGNhbkdvVG9UYWcgPSBhd2FpdCB0aGlzLnZpZXdlclNlcnZpY2UuYWN0aW9uX21vdmVfdG9fdGFnKFxuICAgICAgYCR7ZXF1aXBtZW50LmlkfWBcbiAgICApO1xuICAgIGlmIChjYW5Hb1RvVGFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0TW9kZWwzZEFuZFN3ZWVwKGVxdWlwbWVudCk7XG5cbiAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0Lm1vZGVsM0QpIHtcbiAgICAgIGFsZXJ0KCdFcnJvciB3aGlsZSBnZXR0aW5nIHZpcnR1YWwgdmlzaXQgbW9kZWwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFmb3JjZVN3aXRjaFZpc2l0KSB7XG4gICAgICAvLyBjaGVjayBpZiB3ZSBhcmUgbW92aW5nIHdpdGhpbiB0aGUgc2FtZSAzRCBtb2RlbFxuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vZGVsM0QnKTtcbiAgICAgIGlmIChjdXJyZW50TW9kZWwgJiYgY3VycmVudE1vZGVsID09PSByZXN1bHQubW9kZWwzRCkge1xuICAgICAgICAvLyB3ZSBhZGQgdGFnIHRvIHRoZSB2aXNpdFxuICAgICAgICBjb25zdCBwb2kgPSBlcXVpcG1lbnQucG9pcy5pdGVtc1swXTtcbiAgICAgICAgaWYgKHBvaS5jb29yZGluYXRlKSB7XG4gICAgICAgICAgLy8gd2UgZm9yY2UgYWRkIGJlY2F1c2Ugd2UgbWlnaHQgYmUgaW4gYW4gYW5vdGhlciB6b25lXG4gICAgICAgICAgYXdhaXQgdGhpcy52aWV3ZXJTZXJ2aWNlLmFjdGlvbkFkZE9iamVjdEZyb21QT0koZXF1aXBtZW50LCBwb2kpO1xuICAgICAgICAgIGF3YWl0IHRoaXMudmlld2VyU2VydmljZS5hY3Rpb25fbW92ZV90b190YWcoZXF1aXBtZW50LmlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyoqIFNpIG9uIG5lIGZvcmNlIHBhcyBsYSB2aXNpdGUsIG9uIGRlbWFuZGUgc2kgb24gdmV1dCBldHJlIHN3aXRjaCAqL1xuICAgICAgICBvcGVuTW9kYWxGb3JWaXNpdFN3aXRjaChcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZSxcbiAgICAgICAgICByZXN1bHQubW9kZWwzRCxcbiAgICAgICAgICBlcXVpcG1lbnQuc3BhY2VJRCxcbiAgICAgICAgICB7c3dlZXBUb01vdmU6IHJlc3VsdC5zd2VlcCwgcm90YXRpb246IHJlc3VsdC5yb3RhdGlvbn1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoqIFNpIG9uIGZvcmNlIGxlIHN3aXRjaCBkZSBsYSB2aXNpdCAqL1xuICAgICAgd2luZG93Lm9wZW4oYCR7dXJsfT9tb2RlbDNEPSR7cmVzdWx0Lm1vZGVsM0R9JnN3ZWVwPXRydWVgLCAnX2JsYW5rJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlRXF1aXBzRm9yWm9uZSgpIHtcbiAgICB0aGlzLnVwZGF0aW5nLm5leHQodHJ1ZSk7XG4gICAgbGV0IGZpbHRlcmVkRXF1aXBzID0gW107XG4gICAgaWYgKHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnpvbmVJREZpbHRlciAmJlxuICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmhhcyh0aGlzLnpvbmVJREZpbHRlcilcbiAgICAgICkge1xuICAgICAgICBmaWx0ZXJlZEVxdWlwcyA9IHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJpIGhhdmUgZXF1aXBzIGZvciB0aGlzIHpvbmVcIiwgZmlsdGVyZWRFcXVpcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyZWRFcXVpcHMgPSAoYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3Jab25lKFxuICAgICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXG4gICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIsXG4gICAgICAgICAgdGhpcy5jdXJyZW50Wm9uZVxuICAgICAgICApKSBhcyBFcXVpcG1lbnRbXTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLnNldCh0aGlzLnpvbmVJREZpbHRlciwgW1xuICAgICAgICAgIC4uLmZpbHRlcmVkRXF1aXBzLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVxdWlwbWVudERvbWFpbkZpbHRlcikge1xuICAgICAgICBmaWx0ZXJlZEVxdWlwcyA9IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJFcXVpcG1lbnRzQnlEb21haW5MaXN0KFxuICAgICAgICAgIGZpbHRlcmVkRXF1aXBzLFxuICAgICAgICAgIHRoaXMuZXF1aXBtZW50RG9tYWluRmlsdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmVxdWlwbWVudHNUYWdzLm5leHQoZmlsdGVyZWRFcXVpcHMpOyAvLyBhZGRpbmcgdGFncyBvbmx5IGZvciB0aGUgY3VycmVudCB6b25lXG4gICAgICB0aGlzLmVxdWlwbWVudHNVcGRhdGVkLm5leHQoe1xuICAgICAgICBzcGFjZTogdGhpcy5jdXJyZW50RXF1aXBtZW50cy5zcGFjZSxcbiAgICAgICAgem9uZTogZmlsdGVyZWRFcXVpcHMsXG4gICAgICB9KTsgLy8gZm9yIGxhdGVyYWwgbWVudVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVxdWlwbWVudHNVcGRhdGVkLm5leHQoe3NwYWNlOiBbXSwgem9uZTogW119KTsgLy8gZm9yIGxhdGVyYWwgbWVudVxuICAgIH1cbiAgICB0aGlzLnVwZGF0aW5nLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgdXBkYXRlRHVlVG9EZWxldGUoZGVsZXRlZEVxdWlwbWVudDogRXF1aXBtZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJ1cGRhdGUgZHVlIHRvIGRlbGV0ZVwiLCBkZWxldGVkRXF1aXBtZW50KTtcbiAgICBjb25zdCBlcXVpcCA9IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UuZmluZChcbiAgICAgIChfZXF1aXApID0+IF9lcXVpcC5pZCA9PT0gZGVsZXRlZEVxdWlwbWVudC5pZFxuICAgICk7XG4gICAgaWYgKGVxdWlwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UuaW5kZXhPZihlcXVpcCk7XG4gICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmtleXMoKSkge1xuICAgICAgY29uc3QgZXF1aXBUb0RlbGV0ZSA9IHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXBcbiAgICAgICAgLmdldCh6b25lKVxuICAgICAgICAuZmluZCgoX2VxdWlwKSA9PiBfZXF1aXAuaWQgPT09IGRlbGV0ZWRFcXVpcG1lbnQuaWQpO1xuICAgICAgaWYgKGVxdWlwVG9EZWxldGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwXG4gICAgICAgICAgLmdldCh6b25lKVxuICAgICAgICAgIC5pbmRleE9mKGVxdWlwVG9EZWxldGUpO1xuICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmdldCh6b25lKS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVxdWlwbWVudHNVcGRhdGVkLm5leHQoe1xuICAgICAgc3BhY2U6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXG4gICAgICB6b25lOiB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmdldCh0aGlzLnpvbmVJREZpbHRlciksXG4gICAgfSk7IC8vIGZvciBsYXRlcmFsIG1lbnVcbiAgfVxuXG4gIHVwZGF0ZUR1ZVRvQ3JlYXRlKGNyZWF0ZWRFcXVpcDogRXF1aXBtZW50KSB7XG4gICAgdGhpcy5jdXJyZW50RXF1aXBtZW50cy5zcGFjZS51bnNoaWZ0KGNyZWF0ZWRFcXVpcCk7XG4gICAgdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcFxuICAgICAgLmdldCh0aGlzLnpvbmVJREZpbHRlcilcbiAgICAgIC51bnNoaWZ0KGNyZWF0ZWRFcXVpcCk7XG4gICAgdGhpcy5lcXVpcG1lbnRzVXBkYXRlZC5uZXh0KHtcbiAgICAgIHNwYWNlOiB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLFxuICAgICAgem9uZTogdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcC5nZXQodGhpcy56b25lSURGaWx0ZXIpLFxuICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XG4gIH1cblxuICB1cGRhdGVEdWVUb0VxdWlwVXBkYXRlZCh1cGRhdGVkRXF1aXA6IEVxdWlwbWVudCkge1xuICAgIGNvbnN0IGVxdWlwID0gdGhpcy5jdXJyZW50RXF1aXBtZW50cy5zcGFjZS5maW5kKFxuICAgICAgKF9lcXVpcCkgPT4gX2VxdWlwLmlkID09PSB1cGRhdGVkRXF1aXAuaWRcbiAgICApO1xuICAgIGlmIChlcXVpcCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLmluZGV4T2YoZXF1aXApO1xuICAgICAgaWYgKHRoaXMuaXNBcmNoaXZlZChlcXVpcCkpIHtcbiAgICAgICAgLy8gd2UgcmVtb3ZlIGFyY2hpdmVkIGVxdWlwbWVudFxuICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLnNwbGljZShpbmRleCwgMSwgdXBkYXRlZEVxdWlwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXAua2V5cygpKSB7XG4gICAgICBjb25zdCBlcXVpcFRvVXBkID0gdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcFxuICAgICAgICAuZ2V0KHpvbmUpXG4gICAgICAgIC5maW5kKChfZXF1aXApID0+IF9lcXVpcC5pZCA9PT0gdXBkYXRlZEVxdWlwLmlkKTtcbiAgICAgIGlmIChlcXVpcFRvVXBkKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcFxuICAgICAgICAgIC5nZXQoem9uZSlcbiAgICAgICAgICAuaW5kZXhPZihlcXVpcFRvVXBkKTtcbiAgICAgICAgaWYgKHRoaXMuaXNBcmNoaXZlZChlcXVpcCkpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmdldCh6b25lKS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXBcbiAgICAgICAgICAgIC5nZXQoem9uZSlcbiAgICAgICAgICAgIC5zcGxpY2UoaW5kZXgsIDEsIHVwZGF0ZWRFcXVpcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lcXVpcG1lbnRzVXBkYXRlZC5uZXh0KHtcbiAgICAgIHNwYWNlOiB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLFxuICAgICAgem9uZTogdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcC5nZXQodGhpcy56b25lSURGaWx0ZXIpLFxuICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XG4gIH1cblxuICBpbml0U3Vic2NyaXB0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuaXNNdXNldW1Vc2VyKSB7XG4gICAgICB0aGlzLnpvbmVDaGFuZ2VTZXJ2aWNlLnpvbmVDaGFuZ2VcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCh6b25lKSA9PiB7XG4gICAgICAgICAgaWYgKCF6b25lIHx8ICF0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNwYWNlSUQgPSB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQ7XG4gICAgICAgICAgICB0aGlzLmVxdWlwbWVudHNUYWdzLm5leHQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmVxdWlwbWVudHNVcGRhdGVkLm5leHQoe3NwYWNlOiBbXSwgem9uZTogbnVsbH0pO1xuICAgICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50RXF1aXBtZW50cyA9IHtcbiAgICAgICAgICAgICAgc3BhY2U6IFtdLFxuICAgICAgICAgICAgICB6b25lc01hcDogbmV3IE1hcCgpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHpvbmUuaWQgIT09IHRoaXMuem9uZUlERmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlciA9IHpvbmUuaWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gem9uZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEID09PSB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgICAgICAgICAgLy8gc2FtZSBzcGFjZSwgIG9ubHkgem9uZSB1cGRhdGVcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIC8vICAgICBcImdvaW5nIHRvIHVwZGF0ZSBlcXVpcHMgZm9yIHpvbmUgKHNhbWUgc3BhY2UpXCIsXG4gICAgICAgICAgICAgIC8vICAgICB6b25lLFxuICAgICAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRXF1aXBzRm9yWm9uZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCA9IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRDtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIC8vICAgICBcImdvaW5nIHRvIGluaXQgZXF1aXBzIGZvciB6b25lIGZvciBuZXcgc3BhY2VcIixcbiAgICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VycmVudFNwYWNlSUQsXG4gICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgIHRoaXMuaW5pdEVxdWlwcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZGVsZXRlT2JzZXJ2YWJsZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGVxdWlwbWVudCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUR1ZVRvRGVsZXRlKGVxdWlwbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5jcmVhdGVPYnNlcnZhYmxlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZXF1aXBtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRHVlVG9DcmVhdGUoZXF1aXBtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGVcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChlcXVpcG1lbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEdWVUb0VxdWlwVXBkYXRlZChlcXVpcG1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdW5zdWJzY3JpYmUoKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
|
|
1
|
+
import { Injectable, Inject } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { openModalForVisitSwitch, removeNullKeysFromObject, } from '../../helpers.service';
|
|
4
|
+
import { TypeNote, EventStatus, EventType, PoiType, RoleStatus, } from '../../types.service';
|
|
5
|
+
import { deleteFromS3, getSignedFile, getSignedImageUrlForEquipment, uploadFileToS3, } from '../s3.service';
|
|
6
|
+
import { BaseObjectService } from './base-object.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./poi.service";
|
|
9
|
+
import * as i2 from "./navigation.service";
|
|
10
|
+
import * as i3 from "./operation.service";
|
|
11
|
+
import * as i4 from "./ticket.service";
|
|
12
|
+
import * as i5 from "../navigator.service";
|
|
13
|
+
import * as i6 from "../filter.service";
|
|
14
|
+
import * as i7 from "../user.service";
|
|
15
|
+
import * as i8 from "../viewer.service";
|
|
16
|
+
import * as i9 from "@ng-bootstrap/ng-bootstrap";
|
|
17
|
+
import * as i10 from "../zoneChange.service";
|
|
18
|
+
export class EquipmentService extends BaseObjectService {
|
|
19
|
+
constructor(apiInjected, awsKinesisAnalyticsInjected, poiService, navigationService, operationService, ticketsService, navigatorService, filterService, userService, viewerService, modalService, zoneChangeService) {
|
|
20
|
+
super(poiService, navigationService);
|
|
21
|
+
this.operationService = operationService;
|
|
22
|
+
this.ticketsService = ticketsService;
|
|
23
|
+
this.navigatorService = navigatorService;
|
|
24
|
+
this.filterService = filterService;
|
|
25
|
+
this.userService = userService;
|
|
26
|
+
this.viewerService = viewerService;
|
|
27
|
+
this.modalService = modalService;
|
|
28
|
+
this.zoneChangeService = zoneChangeService;
|
|
29
|
+
this.prefix = {
|
|
30
|
+
technical: 'equipments/note/technical/',
|
|
31
|
+
image: 'equipments/note/image/',
|
|
32
|
+
financial: 'equipments/note/financial/',
|
|
33
|
+
information: 'equipments/note/information/',
|
|
34
|
+
other: 'equipments/note/other/',
|
|
35
|
+
contractual: 'equipments/note/contractual/',
|
|
36
|
+
};
|
|
37
|
+
this.equipmentsUpdated = new Subject();
|
|
38
|
+
this.currentEquipments = {
|
|
39
|
+
space: [],
|
|
40
|
+
zonesMap: new Map(),
|
|
41
|
+
};
|
|
42
|
+
this.equipmentsTags = new Subject();
|
|
43
|
+
this.floorsPerSpace = null;
|
|
44
|
+
/** Null means we do not apply a filter, empty array ([]), means we that we hide all equipment */
|
|
45
|
+
this.equipmentDomainFilter = null;
|
|
46
|
+
this.updating = new Subject();
|
|
47
|
+
this.currentlyUpdating = false;
|
|
48
|
+
this.deleteObservable = new Subject();
|
|
49
|
+
this.createObservable = new Subject();
|
|
50
|
+
this.updateObservable = new Subject();
|
|
51
|
+
this.selectedFloor = null;
|
|
52
|
+
this.isMuseumUser = false;
|
|
53
|
+
this.destroy$ = new Subject();
|
|
54
|
+
this.API = apiInjected;
|
|
55
|
+
this.awsKinesisAnalytics = awsKinesisAnalyticsInjected;
|
|
56
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
57
|
+
this.initSubscriptions();
|
|
58
|
+
this.userService.isChanged.subscribe((isConnected) => {
|
|
59
|
+
if (isConnected) {
|
|
60
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
61
|
+
this.initSubscriptions();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.unsubscribe();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
this.zoneChangeService.floorHasChanged.subscribe((floor) => {
|
|
68
|
+
if (floor) {
|
|
69
|
+
this.selectedFloor = floor;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async readEquipment(id) {
|
|
74
|
+
return this.API.__proto__.GetEquipment(id).then(async (receivedEquip) => {
|
|
75
|
+
let equip;
|
|
76
|
+
if (receivedEquip) {
|
|
77
|
+
equip = receivedEquip;
|
|
78
|
+
equip = await this.getSignedUrlsForEquipment(receivedEquip);
|
|
79
|
+
if (equip.domain) {
|
|
80
|
+
if (equip.domain.parentID) {
|
|
81
|
+
equip.childDomain = equip.domain;
|
|
82
|
+
equip.parentDomain = equip.domain.parent;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
equip.parentDomain = equip.domain;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (equip.subequipmentsIDs) {
|
|
89
|
+
const subEquips = [];
|
|
90
|
+
await Promise.all(equip.subequipmentsIDs.map(async (subId) => {
|
|
91
|
+
const subEquip = await this.API.GetEquipment(subId);
|
|
92
|
+
subEquips.push(subEquip);
|
|
93
|
+
}));
|
|
94
|
+
equip.subEquipments = subEquips;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return equip;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async createEquipment(equip, imageFile, documentFile) {
|
|
101
|
+
removeNullKeysFromObject(equip);
|
|
102
|
+
if (!!this.awsKinesisAnalytics && !!this.awsKinesisAnalytics.record && this.awsKinesisAnalytics.record()) {
|
|
103
|
+
this.awsKinesisAnalytics.getInstance().record(
|
|
104
|
+
// @ts-ignore
|
|
105
|
+
{
|
|
106
|
+
data: {
|
|
107
|
+
eventType: 'Object Creation',
|
|
108
|
+
objectType: 'equipment',
|
|
109
|
+
poi: equip,
|
|
110
|
+
user: this.userService.cu,
|
|
111
|
+
locationId: this.currentSpaceID,
|
|
112
|
+
timestamp: new Date(),
|
|
113
|
+
zoneId: this.currentZone.id,
|
|
114
|
+
floorId: this.selectedFloor?.id,
|
|
115
|
+
},
|
|
116
|
+
streamName: 'smarterplanKinesis-analytics',
|
|
117
|
+
// partitionKey: "",
|
|
118
|
+
}, 'AWSKinesis');
|
|
119
|
+
}
|
|
120
|
+
return this.API.CreateEquipment(equip).then(async (receivedEquipment) => {
|
|
121
|
+
let equipment = receivedEquipment;
|
|
122
|
+
if (equipment) {
|
|
123
|
+
console.log('equipment created:', equipment);
|
|
124
|
+
if (documentFile) {
|
|
125
|
+
await this.uploadDoc(equipment, documentFile, TypeNote.TECHNICAL);
|
|
126
|
+
}
|
|
127
|
+
if (imageFile) {
|
|
128
|
+
await this.uploadImage(equipment, imageFile);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return equipment;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
async getSignedUrlsForEquipment(equip) {
|
|
135
|
+
const equipment = { ...equip };
|
|
136
|
+
if (equipment.notes.items.length > 0) {
|
|
137
|
+
const docs = [];
|
|
138
|
+
await Promise.all(equipment.notes.items.map(async (note) => {
|
|
139
|
+
equipment.documentationImageUrlSigned =
|
|
140
|
+
await getSignedImageUrlForEquipment(equipment);
|
|
141
|
+
if (note.attachment) {
|
|
142
|
+
const { length } = note.attachment.split('/');
|
|
143
|
+
const filename = note.attachment.split('/')[length - 1];
|
|
144
|
+
const attachment = await getSignedFile(note.attachment);
|
|
145
|
+
if (attachment) {
|
|
146
|
+
docs.push({
|
|
147
|
+
filename,
|
|
148
|
+
url: note.attachment,
|
|
149
|
+
urlSigned: attachment,
|
|
150
|
+
noteID: note.id,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
equipment.documents = docs;
|
|
156
|
+
return equipment;
|
|
157
|
+
}
|
|
158
|
+
return equipment;
|
|
159
|
+
}
|
|
160
|
+
async getEquipmentsForTicket(ticket) {
|
|
161
|
+
const operations = ticket.operations.items;
|
|
162
|
+
if (operations.length > 0) {
|
|
163
|
+
operations.sort((a, b) =>
|
|
164
|
+
// @ts-ignore
|
|
165
|
+
// eslint-disable-next-line prettier/prettier
|
|
166
|
+
new Date(b.createdAt) - new Date(a.createdAt));
|
|
167
|
+
await Promise.all(operations.map(async (operation) => {
|
|
168
|
+
operation.equipment = await this.readEquipment(operation.equipmentID);
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
// to keep the sorting by createdAt
|
|
172
|
+
return operations.map((o) => o.equipment);
|
|
173
|
+
}
|
|
174
|
+
async getEquipmentsForSpace(spaceID) {
|
|
175
|
+
// split by 100
|
|
176
|
+
const limit = 100;
|
|
177
|
+
let equipsToken = { equips: [], nextToken: null };
|
|
178
|
+
do {
|
|
179
|
+
equipsToken = await this.mergeEquipmentsForSpaceWithNextTokenWithLimit(spaceID, limit, equipsToken);
|
|
180
|
+
} while (equipsToken.nextToken);
|
|
181
|
+
return equipsToken.equips;
|
|
182
|
+
}
|
|
183
|
+
async mergeEquipmentsForSpaceWithNextTokenWithLimit(spaceID, limit, equipsToken) {
|
|
184
|
+
return this.API.__proto__
|
|
185
|
+
.EquipmentsBySpace(spaceID, null, 'DESC', null, limit, equipsToken.nextToken // nextToken
|
|
186
|
+
)
|
|
187
|
+
.then((response) => {
|
|
188
|
+
const equipsLimit = response.items;
|
|
189
|
+
const equipsObject = {
|
|
190
|
+
equips: [...equipsToken.equips, ...equipsLimit],
|
|
191
|
+
nextToken: response.nextToken,
|
|
192
|
+
};
|
|
193
|
+
return equipsObject;
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async uploadImageForAllEquipments(equipments, imageFile) {
|
|
197
|
+
if (equipments.length === 0) {
|
|
198
|
+
return [];
|
|
199
|
+
}
|
|
200
|
+
return uploadFileToS3(this.prefix.image, imageFile, 'BATCH').then(async (url) => {
|
|
201
|
+
if (url) {
|
|
202
|
+
const equips = [];
|
|
203
|
+
for (const equip of equipments) {
|
|
204
|
+
const currentMission = this.userService.currentMission(equip.spaceID);
|
|
205
|
+
await this.API.__proto__.CreateNote({
|
|
206
|
+
attachment: url,
|
|
207
|
+
type: TypeNote.IMAGE,
|
|
208
|
+
equipmentID: equip.id,
|
|
209
|
+
ownerMissionID: currentMission ? currentMission.id : null,
|
|
210
|
+
});
|
|
211
|
+
const update = await this.API.__proto__.UpdateEquipment({
|
|
212
|
+
id: equip.id,
|
|
213
|
+
photo: url,
|
|
214
|
+
});
|
|
215
|
+
equips.push(update);
|
|
216
|
+
}
|
|
217
|
+
return equips;
|
|
218
|
+
}
|
|
219
|
+
return [];
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
async uploadImage(equipment, imageFile) {
|
|
223
|
+
return uploadFileToS3(this.prefix.image, imageFile, equipment.id).then(async (url) => {
|
|
224
|
+
if (url) {
|
|
225
|
+
const currentMission = this.userService.currentMission(equipment.spaceID);
|
|
226
|
+
const note = await this.API.__proto__.CreateNote({
|
|
227
|
+
attachment: url,
|
|
228
|
+
type: TypeNote.IMAGE,
|
|
229
|
+
equipmentID: equipment.id,
|
|
230
|
+
ownerMissionID: currentMission ? currentMission.id : null,
|
|
231
|
+
});
|
|
232
|
+
await this.API.__proto__.UpdateEquipment({
|
|
233
|
+
id: equipment.id,
|
|
234
|
+
photo: url,
|
|
235
|
+
});
|
|
236
|
+
return note;
|
|
237
|
+
}
|
|
238
|
+
return null;
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async updateEquipment(equip, file = null, noteType = null) {
|
|
242
|
+
return this.API.__proto__
|
|
243
|
+
.UpdateEquipment(equip)
|
|
244
|
+
.then(async (receivedEquipment) => {
|
|
245
|
+
let equipment = receivedEquipment;
|
|
246
|
+
if (equipment) {
|
|
247
|
+
console.log('equipment updated:', equipment);
|
|
248
|
+
if (noteType) {
|
|
249
|
+
switch (noteType) {
|
|
250
|
+
case TypeNote.IMAGE:
|
|
251
|
+
await this.uploadImage(equipment, file);
|
|
252
|
+
break;
|
|
253
|
+
default:
|
|
254
|
+
await this.uploadDoc(equipment, file, noteType);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return equipment;
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
getPrefixDoc(type) {
|
|
263
|
+
let prefix;
|
|
264
|
+
switch (type) {
|
|
265
|
+
case TypeNote.INFORMATION:
|
|
266
|
+
prefix = this.prefix.information;
|
|
267
|
+
break;
|
|
268
|
+
case TypeNote.FINANCIAL:
|
|
269
|
+
prefix = this.prefix.financial;
|
|
270
|
+
break;
|
|
271
|
+
case TypeNote.CONTRACTUAL:
|
|
272
|
+
prefix = this.prefix.contractual;
|
|
273
|
+
break;
|
|
274
|
+
case TypeNote.OTHER:
|
|
275
|
+
prefix = this.prefix.other;
|
|
276
|
+
break;
|
|
277
|
+
case TypeNote.IMAGE:
|
|
278
|
+
prefix = this.prefix.image;
|
|
279
|
+
break;
|
|
280
|
+
default:
|
|
281
|
+
prefix = this.prefix.technical;
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
return prefix;
|
|
285
|
+
}
|
|
286
|
+
async uploadDocForAllEquipments(equipments, documentFile, type) {
|
|
287
|
+
if (equipments.length === 0) {
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
const prefix = this.getPrefixDoc(type);
|
|
291
|
+
const url = await uploadFileToS3(prefix, documentFile, 'BATCH');
|
|
292
|
+
if (url) {
|
|
293
|
+
const updateList = [];
|
|
294
|
+
for (const equip of equipments) {
|
|
295
|
+
const mission = this.userService.currentMission(equip.spaceID);
|
|
296
|
+
const newEquip = await this.API.__proto__.CreateNote({
|
|
297
|
+
attachment: url,
|
|
298
|
+
type,
|
|
299
|
+
equipmentID: equip.id,
|
|
300
|
+
ownerMissionID: mission ? mission.id : null,
|
|
301
|
+
});
|
|
302
|
+
updateList.push(newEquip);
|
|
303
|
+
}
|
|
304
|
+
return updateList;
|
|
305
|
+
}
|
|
306
|
+
return [];
|
|
307
|
+
}
|
|
308
|
+
async uploadDoc(equipment, documentFile, type) {
|
|
309
|
+
const prefix = this.getPrefixDoc(type);
|
|
310
|
+
const mission = this.userService.currentMission(equipment.spaceID);
|
|
311
|
+
return uploadFileToS3(prefix, documentFile, equipment.id).then(async (url) => {
|
|
312
|
+
if (url) {
|
|
313
|
+
return this.API.__proto__.CreateNote({
|
|
314
|
+
attachment: url,
|
|
315
|
+
type,
|
|
316
|
+
equipmentID: equipment.id,
|
|
317
|
+
ownerMissionID: mission ? mission.id : null,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
return null;
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
async deleteEquipment(equip) {
|
|
324
|
+
const deleted = await this.API.__proto__.DeleteEquipment({ id: equip.id });
|
|
325
|
+
console.log('Deleted equipment', deleted);
|
|
326
|
+
// delete POI
|
|
327
|
+
const [poi] = equip.pois.items;
|
|
328
|
+
if (poi) {
|
|
329
|
+
await this.poiService.deletePoi(poi.id);
|
|
330
|
+
}
|
|
331
|
+
// delete notes related
|
|
332
|
+
if (equip.notes.items.length > 0) {
|
|
333
|
+
await Promise.all(equip.notes.items.map(async (note) => {
|
|
334
|
+
// delete files from S3
|
|
335
|
+
/** Not shared with other equipment */
|
|
336
|
+
if (note.attachment &&
|
|
337
|
+
!note.attachment.split('/').pop().startsWith('BATCH_')) {
|
|
338
|
+
await deleteFromS3(note.attachment);
|
|
339
|
+
}
|
|
340
|
+
await this.API.__proto__.DeleteNote({ id: note.id });
|
|
341
|
+
}));
|
|
342
|
+
}
|
|
343
|
+
// delete operations (remove from linked tickets)
|
|
344
|
+
await this.operationService.deleteOperationsForEquipment(equip.id);
|
|
345
|
+
return deleted;
|
|
346
|
+
}
|
|
347
|
+
async updateEquipmentLocation(equip, tagData) {
|
|
348
|
+
const poiInput = {
|
|
349
|
+
coordinate: tagData.getCoordinateString(),
|
|
350
|
+
type: PoiType.EQUIPMENT,
|
|
351
|
+
elementID: equip.id,
|
|
352
|
+
metadata: tagData.getMetadataString(),
|
|
353
|
+
matterportSweepID: tagData.getSweepID(),
|
|
354
|
+
};
|
|
355
|
+
const poi = await this.poiService.createPOIForSpaceID(poiInput);
|
|
356
|
+
return poi;
|
|
357
|
+
}
|
|
358
|
+
async removeTicketFromEquipment(ticket, equip) {
|
|
359
|
+
const operationEquip = await this.operationService.getOperationsByEquipmentID(equip.id);
|
|
360
|
+
const operationToDelete = operationEquip.find((op) => op.ticketID === ticket.id);
|
|
361
|
+
return this.operationService
|
|
362
|
+
.deleteOperation(operationToDelete.id)
|
|
363
|
+
.then((res) => {
|
|
364
|
+
this.ticketsService.addEventToTicket(ticket, {
|
|
365
|
+
title: 'Equipement retiré du ticket',
|
|
366
|
+
description: `Equipement ${equip.name} a été retiré du ticket`,
|
|
367
|
+
status: EventStatus.UNLINKED_FROM_EQUIPMENT,
|
|
368
|
+
type: EventType.TICKET,
|
|
369
|
+
translationPath: 'ticketEvent.ticket.unlinkedFromEquipment',
|
|
370
|
+
metadata: JSON.stringify({ equipment: equip.name }),
|
|
371
|
+
});
|
|
372
|
+
return res;
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
async initEquips() {
|
|
376
|
+
if (!this.currentSpaceID) {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
this.updating.next(true);
|
|
380
|
+
this.currentlyUpdating = true;
|
|
381
|
+
let eqList = await this.getEquipmentsForSpace(this.currentSpaceID);
|
|
382
|
+
eqList = await this.filterService.filterEquipmentsForCurrentUserInSpace(this.currentSpaceID, eqList);
|
|
383
|
+
// console.log(eqList);
|
|
384
|
+
if (eqList.length > 0) {
|
|
385
|
+
let filteredEquips = eqList.filter((equipment) => !this.isArchived(equipment));
|
|
386
|
+
await Promise.all(filteredEquips.map(async (equip) => {
|
|
387
|
+
equip.documentationImageUrlSigned =
|
|
388
|
+
await getSignedImageUrlForEquipment(equip);
|
|
389
|
+
}));
|
|
390
|
+
if (this.equipmentDomainFilter) {
|
|
391
|
+
filteredEquips = this.filterService.filterEquipmentsByDomainList(filteredEquips, this.equipmentDomainFilter);
|
|
392
|
+
}
|
|
393
|
+
this.currentEquipments.space = filteredEquips;
|
|
394
|
+
if (this.zoneIDFilter) {
|
|
395
|
+
filteredEquips = (await this.filterService.filterObjectsForZone(filteredEquips, this.zoneIDFilter, this.currentZone));
|
|
396
|
+
}
|
|
397
|
+
this.currentEquipments.zonesMap.set(this.zoneIDFilter, filteredEquips);
|
|
398
|
+
this.equipmentsTags.next(filteredEquips); // adding tags only for the current zone
|
|
399
|
+
this.equipmentsUpdated.next({
|
|
400
|
+
space: this.currentEquipments.space,
|
|
401
|
+
zone: filteredEquips,
|
|
402
|
+
}); // for lateral menu
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
if (this.zoneIDFilter) {
|
|
406
|
+
this.currentEquipments.zonesMap.set(this.zoneIDFilter, []);
|
|
407
|
+
}
|
|
408
|
+
this.equipmentsUpdated.next({ space: [], zone: [] }); // for lateral menu
|
|
409
|
+
}
|
|
410
|
+
// console.log(this.currentEquipments);
|
|
411
|
+
this.updating.next(false);
|
|
412
|
+
this.currentlyUpdating = false;
|
|
413
|
+
}
|
|
414
|
+
async getEquipmentsForCurrentUserForSpace(spaceID, missions) {
|
|
415
|
+
let results = [];
|
|
416
|
+
const spaceMissions = missions.filter((m) => m.spaceID === spaceID);
|
|
417
|
+
if (spaceMissions.length === 0) {
|
|
418
|
+
return results;
|
|
419
|
+
}
|
|
420
|
+
const canSeeEquips = spaceMissions.some((m) => this.userService.managers.includes(m.role) ||
|
|
421
|
+
m.role === RoleStatus.SERVICE);
|
|
422
|
+
if (!canSeeEquips) {
|
|
423
|
+
return results;
|
|
424
|
+
}
|
|
425
|
+
let domains = [];
|
|
426
|
+
for (const m of spaceMissions) {
|
|
427
|
+
domains = [...domains, m.domains];
|
|
428
|
+
}
|
|
429
|
+
if (domains.length === 0) {
|
|
430
|
+
return results;
|
|
431
|
+
}
|
|
432
|
+
results = await this.getEquipmentsForSpace(spaceID);
|
|
433
|
+
// results = this.filterService.filterEquipmentsByDomainList(
|
|
434
|
+
// results,
|
|
435
|
+
// domains,
|
|
436
|
+
// );
|
|
437
|
+
return results;
|
|
438
|
+
}
|
|
439
|
+
async updateIconForAllEquipmentsInSpace(tagIcon, spaceID, domainID = null) {
|
|
440
|
+
let equips = await this.getEquipmentsForSpace(spaceID);
|
|
441
|
+
if (domainID) {
|
|
442
|
+
equips = equips.filter((equip) => equip.domainID === domainID);
|
|
443
|
+
}
|
|
444
|
+
const pois = await this.updateIconForAllObjects(equips, tagIcon);
|
|
445
|
+
return { equips, pois };
|
|
446
|
+
}
|
|
447
|
+
/** Return true if the current user has archived this equipment */
|
|
448
|
+
isArchived(equipment) {
|
|
449
|
+
return equipment.archivedForMissionID
|
|
450
|
+
? equipment.archivedForMissionID.includes(this.userService.currentMission(equipment.spaceID).id)
|
|
451
|
+
: false;
|
|
452
|
+
}
|
|
453
|
+
setArchived(equipment, archived) {
|
|
454
|
+
let archivedList = equipment.archivedForMissionID
|
|
455
|
+
? equipment.archivedForMissionID
|
|
456
|
+
: [];
|
|
457
|
+
const missionID = this.userService.currentMission(equipment.spaceID).id;
|
|
458
|
+
archivedList = archivedList.filter((m) => m !== missionID);
|
|
459
|
+
if (archived) {
|
|
460
|
+
archivedList.push(missionID);
|
|
461
|
+
}
|
|
462
|
+
return this.updateEquipment({
|
|
463
|
+
id: equipment.id,
|
|
464
|
+
archivedForMissionID: archivedList,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
async deleteFile(document_) {
|
|
468
|
+
await deleteFromS3(document_.url);
|
|
469
|
+
await this.API.DeleteNote({ id: document_.noteID });
|
|
470
|
+
}
|
|
471
|
+
async navigateToEquipmentIn3D(equipment, forceSwitchVisit = false) {
|
|
472
|
+
let url = `visit/${equipment.spaceID}`;
|
|
473
|
+
if (forceSwitchVisit) {
|
|
474
|
+
url += `/equip/${equipment.id}`;
|
|
475
|
+
}
|
|
476
|
+
const canGoToTag = await this.viewerService.action_move_to_tag(`${equipment.id}`);
|
|
477
|
+
if (canGoToTag) {
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
const result = await this.getModel3dAndSweep(equipment);
|
|
481
|
+
if (!result || !result.model3D) {
|
|
482
|
+
alert('Error while getting virtual visit model');
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
if (!forceSwitchVisit) {
|
|
486
|
+
// check if we are moving within the same 3D model
|
|
487
|
+
const currentModel = localStorage.getItem('model3D');
|
|
488
|
+
if (currentModel && currentModel === result.model3D) {
|
|
489
|
+
// we add tag to the visit
|
|
490
|
+
const poi = equipment.pois.items[0];
|
|
491
|
+
if (poi.coordinate) {
|
|
492
|
+
// we force add because we might be in an another zone
|
|
493
|
+
await this.viewerService.actionAddObjectFromPOI(equipment, poi);
|
|
494
|
+
await this.viewerService.action_move_to_tag(equipment.id);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
/** Si on ne force pas la visite, on demande si on veut etre switch */
|
|
499
|
+
openModalForVisitSwitch(this.modalService, result.model3D, equipment.spaceID, { sweepToMove: result.sweep, rotation: result.rotation });
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
/** Si on force le switch de la visit */
|
|
504
|
+
window.open(`${url}?model3D=${result.model3D}&sweep=true`, '_blank');
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
async updateEquipsForZone() {
|
|
508
|
+
this.updating.next(true);
|
|
509
|
+
let filteredEquips = [];
|
|
510
|
+
if (this.currentEquipments.space.length > 0) {
|
|
511
|
+
if (this.zoneIDFilter &&
|
|
512
|
+
this.currentEquipments.zonesMap.has(this.zoneIDFilter)) {
|
|
513
|
+
filteredEquips = this.currentEquipments.zonesMap.get(this.zoneIDFilter);
|
|
514
|
+
// console.log("i have equips for this zone", filteredEquips);
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
filteredEquips = (await this.filterService.filterObjectsForZone(this.currentEquipments.space, this.zoneIDFilter, this.currentZone));
|
|
518
|
+
this.currentEquipments.zonesMap.set(this.zoneIDFilter, [
|
|
519
|
+
...filteredEquips,
|
|
520
|
+
]);
|
|
521
|
+
}
|
|
522
|
+
if (this.equipmentDomainFilter) {
|
|
523
|
+
filteredEquips = this.filterService.filterEquipmentsByDomainList(filteredEquips, this.equipmentDomainFilter);
|
|
524
|
+
}
|
|
525
|
+
this.equipmentsTags.next(filteredEquips); // adding tags only for the current zone
|
|
526
|
+
this.equipmentsUpdated.next({
|
|
527
|
+
space: this.currentEquipments.space,
|
|
528
|
+
zone: filteredEquips,
|
|
529
|
+
}); // for lateral menu
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
this.equipmentsUpdated.next({ space: [], zone: [] }); // for lateral menu
|
|
533
|
+
}
|
|
534
|
+
this.updating.next(false);
|
|
535
|
+
}
|
|
536
|
+
updateDueToDelete(deletedEquipment) {
|
|
537
|
+
// console.log("update due to delete", deletedEquipment);
|
|
538
|
+
const equip = this.currentEquipments.space.find((_equip) => _equip.id === deletedEquipment.id);
|
|
539
|
+
if (equip) {
|
|
540
|
+
const index = this.currentEquipments.space.indexOf(equip);
|
|
541
|
+
this.currentEquipments.space.splice(index, 1);
|
|
542
|
+
}
|
|
543
|
+
for (const zone of this.currentEquipments.zonesMap.keys()) {
|
|
544
|
+
const equipToDelete = this.currentEquipments.zonesMap
|
|
545
|
+
.get(zone)
|
|
546
|
+
.find((_equip) => _equip.id === deletedEquipment.id);
|
|
547
|
+
if (equipToDelete) {
|
|
548
|
+
const index = this.currentEquipments.zonesMap
|
|
549
|
+
.get(zone)
|
|
550
|
+
.indexOf(equipToDelete);
|
|
551
|
+
this.currentEquipments.zonesMap.get(zone).splice(index, 1);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
this.equipmentsUpdated.next({
|
|
555
|
+
space: this.currentEquipments.space,
|
|
556
|
+
zone: this.currentEquipments.zonesMap.get(this.zoneIDFilter),
|
|
557
|
+
}); // for lateral menu
|
|
558
|
+
}
|
|
559
|
+
updateDueToCreate(createdEquip) {
|
|
560
|
+
this.currentEquipments.space.unshift(createdEquip);
|
|
561
|
+
this.currentEquipments.zonesMap
|
|
562
|
+
.get(this.zoneIDFilter)
|
|
563
|
+
.unshift(createdEquip);
|
|
564
|
+
this.equipmentsUpdated.next({
|
|
565
|
+
space: this.currentEquipments.space,
|
|
566
|
+
zone: this.currentEquipments.zonesMap.get(this.zoneIDFilter),
|
|
567
|
+
}); // for lateral menu
|
|
568
|
+
}
|
|
569
|
+
updateDueToEquipUpdated(updatedEquip) {
|
|
570
|
+
const equip = this.currentEquipments.space.find((_equip) => _equip.id === updatedEquip.id);
|
|
571
|
+
if (equip) {
|
|
572
|
+
const index = this.currentEquipments.space.indexOf(equip);
|
|
573
|
+
if (this.isArchived(equip)) {
|
|
574
|
+
// we remove archived equipment
|
|
575
|
+
this.currentEquipments.space.splice(index, 1);
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
this.currentEquipments.space.splice(index, 1, updatedEquip);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
for (const zone of this.currentEquipments.zonesMap.keys()) {
|
|
582
|
+
const equipToUpd = this.currentEquipments.zonesMap
|
|
583
|
+
.get(zone)
|
|
584
|
+
.find((_equip) => _equip.id === updatedEquip.id);
|
|
585
|
+
if (equipToUpd) {
|
|
586
|
+
const index = this.currentEquipments.zonesMap
|
|
587
|
+
.get(zone)
|
|
588
|
+
.indexOf(equipToUpd);
|
|
589
|
+
if (this.isArchived(equip)) {
|
|
590
|
+
this.currentEquipments.zonesMap.get(zone).splice(index, 1);
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
this.currentEquipments.zonesMap
|
|
594
|
+
.get(zone)
|
|
595
|
+
.splice(index, 1, updatedEquip);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
this.equipmentsUpdated.next({
|
|
600
|
+
space: this.currentEquipments.space,
|
|
601
|
+
zone: this.currentEquipments.zonesMap.get(this.zoneIDFilter),
|
|
602
|
+
}); // for lateral menu
|
|
603
|
+
}
|
|
604
|
+
initSubscriptions() {
|
|
605
|
+
if (!this.isMuseumUser) {
|
|
606
|
+
this.zoneChangeService.zoneChange
|
|
607
|
+
.pipe(takeUntil(this.destroy$))
|
|
608
|
+
.subscribe((zone) => {
|
|
609
|
+
if (!zone || !this.navigatorService.currentSpaceID) {
|
|
610
|
+
this.currentSpaceID = this.navigatorService.currentSpaceID;
|
|
611
|
+
this.equipmentsTags.next(null);
|
|
612
|
+
this.equipmentsUpdated.next({ space: [], zone: null });
|
|
613
|
+
this.zoneIDFilter = null;
|
|
614
|
+
this.currentEquipments = {
|
|
615
|
+
space: [],
|
|
616
|
+
zonesMap: new Map(),
|
|
617
|
+
};
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
if (zone.id !== this.zoneIDFilter) {
|
|
621
|
+
this.zoneIDFilter = zone.id;
|
|
622
|
+
this.currentZone = zone;
|
|
623
|
+
if (this.currentSpaceID === this.navigatorService.currentSpaceID) {
|
|
624
|
+
// same space, only zone update
|
|
625
|
+
// console.log(
|
|
626
|
+
// "going to update equips for zone (same space)",
|
|
627
|
+
// zone,
|
|
628
|
+
// );
|
|
629
|
+
this.updateEquipsForZone();
|
|
630
|
+
}
|
|
631
|
+
else {
|
|
632
|
+
this.currentSpaceID = this.navigatorService.currentSpaceID;
|
|
633
|
+
// console.log(
|
|
634
|
+
// "going to init equips for zone for new space",
|
|
635
|
+
// this.currentSpaceID,
|
|
636
|
+
// );
|
|
637
|
+
this.initEquips();
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
});
|
|
641
|
+
this.deleteObservable
|
|
642
|
+
.pipe(takeUntil(this.destroy$))
|
|
643
|
+
.subscribe((equipment) => {
|
|
644
|
+
if (this.currentSpaceID) {
|
|
645
|
+
this.updateDueToDelete(equipment);
|
|
646
|
+
}
|
|
647
|
+
});
|
|
648
|
+
this.createObservable
|
|
649
|
+
.pipe(takeUntil(this.destroy$))
|
|
650
|
+
.subscribe((equipment) => {
|
|
651
|
+
if (this.currentSpaceID) {
|
|
652
|
+
this.updateDueToCreate(equipment);
|
|
653
|
+
}
|
|
654
|
+
});
|
|
655
|
+
this.updateObservable
|
|
656
|
+
.pipe(takeUntil(this.destroy$))
|
|
657
|
+
.subscribe((equipment) => {
|
|
658
|
+
if (this.currentSpaceID) {
|
|
659
|
+
this.updateDueToEquipUpdated(equipment);
|
|
660
|
+
}
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
unsubscribe() {
|
|
665
|
+
this.destroy$.next(true);
|
|
666
|
+
this.destroy$.complete();
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
EquipmentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EquipmentService, deps: [{ token: 'currentAPIService' }, { token: 'currentAwsKinesisAnalyticsService' }, { token: i1.PoiService }, { token: i2.NavigationService }, { token: i3.OperationService }, { token: i4.TicketsService }, { token: i5.NavigatorService }, { token: i6.FilterService }, { token: i7.BaseUserService }, { token: i8.ViewerService }, { token: i9.NgbModal }, { token: i10.ZoneChangeService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
670
|
+
EquipmentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EquipmentService, providedIn: 'root' });
|
|
671
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: EquipmentService, decorators: [{
|
|
672
|
+
type: Injectable,
|
|
673
|
+
args: [{
|
|
674
|
+
providedIn: 'root',
|
|
675
|
+
}]
|
|
676
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
677
|
+
type: Inject,
|
|
678
|
+
args: ['currentAPIService']
|
|
679
|
+
}] }, { type: undefined, decorators: [{
|
|
680
|
+
type: Inject,
|
|
681
|
+
args: ['currentAwsKinesisAnalyticsService']
|
|
682
|
+
}] }, { type: i1.PoiService }, { type: i2.NavigationService }, { type: i3.OperationService }, { type: i4.TicketsService }, { type: i5.NavigatorService }, { type: i6.FilterService }, { type: i7.BaseUserService }, { type: i8.ViewerService }, { type: i9.NgbModal }, { type: i10.ZoneChangeService }]; } });
|
|
683
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1aXBtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21vZGVscy9lcXVpcG1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixHQUV6QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFNTCxRQUFRLEVBRVIsV0FBVyxFQUNYLFNBQVMsRUFHVCxPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFHN0IsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsNkJBQTZCLEVBQzdCLGNBQWMsR0FDZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBVXhELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxpQkFBaUI7SUF5RHJELFlBQytCLFdBQWdCLEVBRTNDLDJCQUFnQyxFQUNsQyxVQUFzQixFQUN0QixpQkFBb0MsRUFDNUIsZ0JBQWtDLEVBQ2xDLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixXQUE0QixFQUM1QixhQUE0QixFQUM1QixZQUFzQixFQUN0QixpQkFBb0M7UUFFNUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBVDdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFyRXRDLFdBQU0sR0FBRztZQUNmLFNBQVMsRUFBRSw0QkFBNEI7WUFDdkMsS0FBSyxFQUFFLHdCQUF3QjtZQUMvQixTQUFTLEVBQUUsNEJBQTRCO1lBQ3ZDLFdBQVcsRUFBRSw4QkFBOEI7WUFDM0MsS0FBSyxFQUFFLHdCQUF3QjtZQUMvQixXQUFXLEVBQUUsOEJBQThCO1NBQzVDLENBQUM7UUFFRixzQkFBaUIsR0FHWixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRW5CLHNCQUFpQixHQUdiO1lBQ0YsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7U0FDcEIsQ0FBQztRQUVGLG1CQUFjLEdBQXlCLElBQUksT0FBTyxFQUFFLENBQUM7UUFRckQsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFFOUIsaUdBQWlHO1FBQ2pHLDBCQUFxQixHQUFhLElBQUksQ0FBQztRQUV2QyxhQUFRLEdBQXFCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFM0Msc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBSTFCLHFCQUFnQixHQUF1QixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXJELHFCQUFnQixHQUF1QixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXJELHFCQUFnQixHQUF1QixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXJELGtCQUFhLEdBQVMsSUFBSSxDQUFDO1FBSzNCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRWIsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFtQi9CLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRywyQkFBMkIsQ0FBQztRQUV2RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNuRCxJQUFJLFdBQVcsRUFBRTtnQkFDZixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDekQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBQyxFQUFFO1lBQ3hELElBQUksS0FBSyxFQUFDO2dCQUNSLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzVCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFVO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUU7WUFDdEUsSUFBSSxLQUFnQixDQUFDO1lBQ3JCLElBQUksYUFBYSxFQUFFO2dCQUNqQixLQUFLLEdBQUcsYUFBYSxDQUFDO2dCQUN0QixLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDaEIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTt3QkFDekIsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO3dCQUNqQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO3FCQUMxQzt5QkFBTTt3QkFDTCxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7cUJBQ25DO2lCQUNGO2dCQUNELElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFO29CQUMxQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTt3QkFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDcEQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztvQkFDRixLQUFLLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztpQkFDakM7YUFDRjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsS0FBZ0IsRUFDaEIsU0FBZSxFQUNmLFlBQWtCO1FBRWxCLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDeEcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU07WUFDM0MsYUFBYTtZQUNiO2dCQUNFLElBQUksRUFBRTtvQkFDSixTQUFTLEVBQUUsaUJBQWlCO29CQUM1QixVQUFVLEVBQUUsV0FBVztvQkFDdkIsR0FBRyxFQUFFLEtBQUs7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDekIsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUMvQixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7b0JBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7aUJBQ2hDO2dCQUNELFVBQVUsRUFBRSw4QkFBOEI7Z0JBQzFDLG9CQUFvQjthQUNyQixFQUNELFlBQVksQ0FDYixDQUFDO1NBQ0g7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsRUFBRTtZQUN0RSxJQUFJLFNBQVMsR0FBRyxpQkFBOEIsQ0FBQztZQUMvQyxJQUFJLFNBQVMsRUFBRTtnQkFDYixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLFlBQVksRUFBRTtvQkFDaEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNuRTtnQkFDRCxJQUFJLFNBQVMsRUFBRTtvQkFDYixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2lCQUM5QzthQUNGO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEtBQWdCO1FBQzlDLE1BQU0sU0FBUyxHQUFHLEVBQUMsR0FBRyxLQUFLLEVBQUMsQ0FBQztRQUM3QixJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUN2QyxTQUFTLENBQUMsMkJBQTJCO29CQUNuQyxNQUFNLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ25CLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN4RCxNQUFNLFVBQVUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3hELElBQUksVUFBVSxFQUFFO3dCQUNkLElBQUksQ0FBQyxJQUFJLENBQUM7NEJBQ1IsUUFBUTs0QkFDUixHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVU7NEJBQ3BCLFNBQVMsRUFBRSxVQUFVOzRCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7eUJBQ0ssQ0FBQyxDQUFDO3FCQUN6QjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUNILENBQUM7WUFDRixTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUMzQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsTUFBYztRQUN6QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUMzQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDUCxhQUFhO1lBQ2IsNkNBQTZDO1lBQzdDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQ2hELENBQUM7WUFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7Z0JBQ2pDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RSxDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7UUFDRCxtQ0FBbUM7UUFDbkMsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxPQUFlO1FBQ3pDLGVBQWU7UUFDZixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxXQUFXLEdBQUcsRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUNoRCxHQUFHO1lBQ0QsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLDZDQUE2QyxDQUNwRSxPQUFPLEVBQ1AsS0FBSyxFQUNMLFdBQVcsQ0FDWixDQUFDO1NBQ0gsUUFBUSxXQUFXLENBQUMsU0FBUyxFQUFFO1FBQ2hDLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLDZDQUE2QyxDQUNqRCxPQUFlLEVBQ2YsS0FBYSxFQUNiLFdBQThEO1FBRTlELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTO2FBQ3RCLGlCQUFpQixDQUNoQixPQUFPLEVBQ1AsSUFBSSxFQUNKLE1BQU0sRUFDTixJQUFJLEVBQ0osS0FBSyxFQUNMLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWTtTQUNuQzthQUNBLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkMsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLE1BQU0sRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQztnQkFDL0MsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO2FBQzlCLENBQUM7WUFDRixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsMkJBQTJCLENBQy9CLFVBQXVCLEVBQ3ZCLFNBQWU7UUFFZixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUMvRCxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDWixJQUFJLEdBQUcsRUFBRTtnQkFDUCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxFQUFFO29CQUM5QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FDcEQsS0FBSyxDQUFDLE9BQU8sQ0FDZCxDQUFDO29CQUNGLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO3dCQUNsQyxVQUFVLEVBQUUsR0FBRzt3QkFDZixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7d0JBQ3BCLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTt3QkFDckIsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtxQkFDMUQsQ0FBQyxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO3dCQUN0RCxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7d0JBQ1osS0FBSyxFQUFFLEdBQUc7cUJBQ1gsQ0FBQyxDQUFDO29CQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3JCO2dCQUNELE9BQU8sTUFBTSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBb0IsRUFBRSxTQUFlO1FBQ3JELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNwRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDWixJQUFJLEdBQUcsRUFBRTtnQkFDUCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FDcEQsU0FBUyxDQUFDLE9BQU8sQ0FDbEIsQ0FBQztnQkFDRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztvQkFDL0MsVUFBVSxFQUFFLEdBQUc7b0JBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO29CQUNwQixXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUU7b0JBQ3pCLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7aUJBQzFELENBQUMsQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztvQkFDdkMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO29CQUNoQixLQUFLLEVBQUUsR0FBRztpQkFDWCxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsS0FBVSxFQUNWLE9BQWEsSUFBSSxFQUNqQixXQUFxQixJQUFJO1FBRXpCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTO2FBQ3RCLGVBQWUsQ0FBQyxLQUFLLENBQUM7YUFDdEIsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxFQUFFO1lBQ2hDLElBQUksU0FBUyxHQUFHLGlCQUE4QixDQUFDO1lBQy9DLElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzdDLElBQUksUUFBUSxFQUFFO29CQUNaLFFBQVEsUUFBUSxFQUFFO3dCQUNoQixLQUFLLFFBQVEsQ0FBQyxLQUFLOzRCQUNqQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDOzRCQUN4QyxNQUFNO3dCQUNSOzRCQUNFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDOzRCQUNoRCxNQUFNO3FCQUNUO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYztRQUN6QixJQUFJLE1BQU0sQ0FBQztRQUNYLFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxRQUFRLENBQUMsV0FBVztnQkFDdkIsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUNqQyxNQUFNO1lBQ1IsS0FBSyxRQUFRLENBQUMsU0FBUztnQkFDckIsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxRQUFRLENBQUMsV0FBVztnQkFDdkIsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUNqQyxNQUFNO1lBQ1IsS0FBSyxRQUFRLENBQUMsS0FBSztnQkFDakIsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMzQixNQUFNO1lBQ1IsS0FBSyxRQUFRLENBQUMsS0FBSztnQkFDakIsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMzQixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUMvQixNQUFNO1NBQ1Q7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLHlCQUF5QixDQUM3QixVQUF1QixFQUN2QixZQUFrQixFQUNsQixJQUFjO1FBRWQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzQixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLEdBQUcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLElBQUksR0FBRyxFQUFFO1lBQ1AsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxFQUFFO2dCQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO29CQUNuRCxVQUFVLEVBQUUsR0FBRztvQkFDZixJQUFJO29CQUNKLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTtvQkFDckIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDNUMsQ0FBQyxDQUFDO2dCQUNILFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDM0I7WUFDRCxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQ2IsU0FBb0IsRUFDcEIsWUFBa0IsRUFDbEIsSUFBYztRQUVkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDNUQsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ1osSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7b0JBQ25DLFVBQVUsRUFBRSxHQUFHO29CQUNmLElBQUk7b0JBQ0osV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO29CQUN6QixjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO2lCQUM1QyxDQUFDLENBQUM7YUFDSjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFnQjtRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxFQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQztRQUN6RSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLGFBQWE7UUFDYixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDL0IsSUFBSSxHQUFHLEVBQUU7WUFDUCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QztRQUNELHVCQUF1QjtRQUN2QixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBVSxFQUFFLEVBQUU7Z0JBQ3pDLHVCQUF1QjtnQkFDdkIsc0NBQXNDO2dCQUN0QyxJQUNFLElBQUksQ0FBQyxVQUFVO29CQUNmLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUN0RDtvQkFDQSxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO2dCQUNELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUNELGlEQUFpRDtRQUNqRCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkUsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FDM0IsS0FBZ0IsRUFDaEIsT0FBc0I7UUFFdEIsTUFBTSxRQUFRLEdBQUc7WUFDZixVQUFVLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFO1lBQ3pDLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUztZQUN2QixTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDbkIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUNyQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFO1NBQ2pDLENBQUM7UUFDVCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsS0FBSyxDQUFDLHlCQUF5QixDQUM3QixNQUFjLEVBQ2QsS0FBZ0I7UUFFaEIsTUFBTSxjQUFjLEdBQ2xCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRSxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQzNDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQ2xDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxnQkFBZ0I7YUFDekIsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQzthQUNyQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNaLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBZ0IsRUFBRTtnQkFDckQsS0FBSyxFQUFFLDZCQUE2QjtnQkFDcEMsV0FBVyxFQUFFLGNBQWMsS0FBSyxDQUFDLElBQUkseUJBQXlCO2dCQUM5RCxNQUFNLEVBQUUsV0FBVyxDQUFDLHVCQUF1QjtnQkFDM0MsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNO2dCQUN0QixlQUFlLEVBQUUsMENBQTBDO2dCQUMzRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFDLENBQUM7YUFDbEQsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMscUNBQXFDLENBQ3JFLElBQUksQ0FBQyxjQUFjLEVBQ25CLE1BQU0sQ0FDUCxDQUFDO1FBQ0YsdUJBQXVCO1FBQ3ZCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDaEMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FDM0MsQ0FBQztZQUVGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDakMsS0FBSyxDQUFDLDJCQUEyQjtvQkFDL0IsTUFBTSw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQzlCLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUM5RCxjQUFjLEVBQ2QsSUFBSSxDQUFDLHFCQUFxQixDQUMzQixDQUFDO2FBQ0g7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQztZQUM5QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLGNBQWMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDN0QsY0FBYyxFQUNkLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQWdCLENBQUM7YUFDbkI7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsd0NBQXdDO1lBQ2xGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSztnQkFDbkMsSUFBSSxFQUFFLGNBQWM7YUFDckIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1NBQ3hCO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDNUQ7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtTQUN4RTtRQUNELHVDQUF1QztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsbUNBQW1DLENBQ3ZDLE9BQU8sRUFDUCxRQUFtQjtRQUVuQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFakIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztRQUNwRSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FDckMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFDLENBQUMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLE9BQU8sQ0FDaEMsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFDRCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7WUFDN0IsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUNELE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCw2REFBNkQ7UUFDN0QsZUFBZTtRQUNmLGVBQWU7UUFDZixLQUFLO1FBQ0wsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxpQ0FBaUMsQ0FDckMsT0FBZSxFQUNmLE9BQWUsRUFDZixXQUFtQixJQUFJO1FBRXZCLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7U0FDaEU7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakUsT0FBTyxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLFVBQVUsQ0FBQyxTQUFvQjtRQUM3QixPQUFPLFNBQVMsQ0FBQyxvQkFBb0I7WUFDbkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQ3REO1lBQ0QsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBb0IsRUFBRSxRQUFpQjtRQUNqRCxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsb0JBQW9CO1lBQy9DLENBQUMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CO1lBQ2hDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXhFLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7UUFFM0QsSUFBSSxRQUFRLEVBQUU7WUFDWixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzlCO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzFCLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRTtZQUNoQixvQkFBb0IsRUFBRSxZQUFZO1NBQ25DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQTRCO1FBQzNDLE1BQU0sWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCLENBQzNCLFNBQW9CLEVBQ3BCLG1CQUE0QixLQUFLO1FBRWpDLElBQUksR0FBRyxHQUFHLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsR0FBRyxJQUFJLFVBQVUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ2pDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUM1RCxHQUFHLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FDbEIsQ0FBQztRQUNGLElBQUksVUFBVSxFQUFFO1lBQ2QsT0FBTztTQUNSO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDOUIsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDakQsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLGtEQUFrRDtZQUNsRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELElBQUksWUFBWSxJQUFJLFlBQVksS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNuRCwwQkFBMEI7Z0JBQzFCLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUU7b0JBQ2xCLHNEQUFzRDtvQkFDdEQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDaEUsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0Q7YUFDRjtpQkFBTTtnQkFDTCxzRUFBc0U7Z0JBQ3RFLHVCQUF1QixDQUNyQixJQUFJLENBQUMsWUFBWSxFQUNqQixNQUFNLENBQUMsT0FBTyxFQUNkLFNBQVMsQ0FBQyxPQUFPLEVBQ2pCLEVBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FDdkQsQ0FBQzthQUNIO1NBQ0Y7YUFBTTtZQUNMLHdDQUF3QztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLE1BQU0sQ0FBQyxPQUFPLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUN0RTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQyxJQUNFLElBQUksQ0FBQyxZQUFZO2dCQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ3REO2dCQUNBLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hFLDhEQUE4RDthQUMvRDtpQkFBTTtnQkFDTCxjQUFjLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQzdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQzVCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQWdCLENBQUM7Z0JBRWxCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQ3JELEdBQUcsY0FBYztpQkFDbEIsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDOUIsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQzlELGNBQWMsRUFDZCxJQUFJLENBQUMscUJBQXFCLENBQzNCLENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsd0NBQXdDO1lBQ2xGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSztnQkFDbkMsSUFBSSxFQUFFLGNBQWM7YUFDckIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1NBQ3hCO2FBQU07WUFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtTQUN4RTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxnQkFBMkI7UUFDM0MseURBQXlEO1FBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUM3QyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxFQUFFLENBQzlDLENBQUM7UUFDRixJQUFJLEtBQUssRUFBRTtZQUNULE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvQztRQUNELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUTtpQkFDbEQsR0FBRyxDQUFDLElBQUksQ0FBQztpQkFDVCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRO3FCQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDO3FCQUNULE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM1RDtTQUNGO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUs7WUFDbkMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDN0QsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ3pCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxZQUF1QjtRQUN2QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUTthQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUN0QixPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUs7WUFDbkMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDN0QsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ3pCLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxZQUF1QjtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDN0MsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssWUFBWSxDQUFDLEVBQUUsQ0FDMUMsQ0FBQztRQUNGLElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMxQiwrQkFBK0I7Z0JBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQzdEO1NBQ0Y7UUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVE7aUJBQy9DLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQ1QsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRCxJQUFJLFVBQVUsRUFBRTtnQkFDZCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUTtxQkFDMUMsR0FBRyxDQUFDLElBQUksQ0FBQztxQkFDVCxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDNUQ7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVE7eUJBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUM7eUJBQ1QsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQ25DO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLO1lBQ25DLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzdELENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtJQUN6QixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVU7aUJBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QixTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUU7b0JBQ2xELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztvQkFDM0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHO3dCQUN2QixLQUFLLEVBQUUsRUFBRTt3QkFDVCxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7cUJBQ3BCLENBQUM7b0JBQ0YsT0FBTztpQkFDUjtnQkFDRCxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDeEIsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUU7d0JBQ2hFLGdDQUFnQzt3QkFDaEMsZUFBZTt3QkFDZixzREFBc0Q7d0JBQ3RELFlBQVk7d0JBQ1osS0FBSzt3QkFFTCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztxQkFDNUI7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO3dCQUMzRCxlQUFlO3dCQUNmLHFEQUFxRDt3QkFDckQsMkJBQTJCO3dCQUMzQixLQUFLO3dCQUNMLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztxQkFDbkI7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVMLElBQUksQ0FBQyxnQkFBZ0I7aUJBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QixTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDdkIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ25DO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFTCxJQUFJLENBQUMsZ0JBQWdCO2lCQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNuQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUwsSUFBSSxDQUFDLGdCQUFnQjtpQkFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzlCLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDekM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OzZHQXAwQlUsZ0JBQWdCLGtCQTBEakIsbUJBQW1CLGFBQ25CLG1DQUFtQztpSEEzRGxDLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBMkRJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsTUFBTTsyQkFBQyxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIEluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TmdiTW9kYWx9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHtTdWJqZWN0LCB0YWtlVW50aWx9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIG9wZW5Nb2RhbEZvclZpc2l0U3dpdGNoLFxyXG4gIHJlbW92ZU51bGxLZXlzRnJvbU9iamVjdCxcclxuICB3YWl0VW50aWwsXHJcbn0gZnJvbSAnLi4vLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNYXR0ZXJ0YWdEYXRhfSBmcm9tICcuLi8uLi9tYXR0ZXJ0YWdEYXRhJztcclxuaW1wb3J0IHtcclxuICBOb3RlLFxyXG4gIFpvbmUsXHJcbiAgRXF1aXBtZW50LFxyXG4gIEVxdWlwbWVudERvY3VtZW50LFxyXG4gIFRpY2tldCxcclxuICBUeXBlTm90ZSxcclxuICBNaXNzaW9uLFxyXG4gIEV2ZW50U3RhdHVzLFxyXG4gIEV2ZW50VHlwZSxcclxuICBPcGVyYXRpb24sXHJcbiAgUE9JLFxyXG4gIFBvaVR5cGUsXHJcbiAgUm9sZVN0YXR1cyxcclxufSBmcm9tICcuLi8uLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHtGaWx0ZXJTZXJ2aWNlfSBmcm9tICcuLi9maWx0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7TmF2aWdhdG9yU2VydmljZX0gZnJvbSAnLi4vbmF2aWdhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIGRlbGV0ZUZyb21TMyxcclxuICBnZXRTaWduZWRGaWxlLFxyXG4gIGdldFNpZ25lZEltYWdlVXJsRm9yRXF1aXBtZW50LFxyXG4gIHVwbG9hZEZpbGVUb1MzLFxyXG59IGZyb20gJy4uL3MzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Jhc2VVc2VyU2VydmljZX0gZnJvbSAnLi4vdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtWaWV3ZXJTZXJ2aWNlfSBmcm9tICcuLi92aWV3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7QmFzZU9iamVjdFNlcnZpY2V9IGZyb20gJy4vYmFzZS1vYmplY3Quc2VydmljZSc7XHJcbmltcG9ydCB7TmF2aWdhdGlvblNlcnZpY2V9IGZyb20gJy4vbmF2aWdhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtPcGVyYXRpb25TZXJ2aWNlfSBmcm9tICcuL29wZXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtQb2lTZXJ2aWNlfSBmcm9tICcuL3BvaS5zZXJ2aWNlJztcclxuaW1wb3J0IHtUaWNrZXRzU2VydmljZX0gZnJvbSAnLi90aWNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7Wm9uZUNoYW5nZVNlcnZpY2V9IGZyb20gXCIuLi96b25lQ2hhbmdlLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcXVpcG1lbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU9iamVjdFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcHJlZml4ID0ge1xyXG4gICAgdGVjaG5pY2FsOiAnZXF1aXBtZW50cy9ub3RlL3RlY2huaWNhbC8nLFxyXG4gICAgaW1hZ2U6ICdlcXVpcG1lbnRzL25vdGUvaW1hZ2UvJyxcclxuICAgIGZpbmFuY2lhbDogJ2VxdWlwbWVudHMvbm90ZS9maW5hbmNpYWwvJyxcclxuICAgIGluZm9ybWF0aW9uOiAnZXF1aXBtZW50cy9ub3RlL2luZm9ybWF0aW9uLycsXHJcbiAgICBvdGhlcjogJ2VxdWlwbWVudHMvbm90ZS9vdGhlci8nLFxyXG4gICAgY29udHJhY3R1YWw6ICdlcXVpcG1lbnRzL25vdGUvY29udHJhY3R1YWwvJyxcclxuICB9O1xyXG5cclxuICBlcXVpcG1lbnRzVXBkYXRlZDogU3ViamVjdDx7XHJcbiAgICBzcGFjZTogRXF1aXBtZW50W107XHJcbiAgICB6b25lOiBFcXVpcG1lbnRbXTtcclxuICB9PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGN1cnJlbnRFcXVpcG1lbnRzOiB7XHJcbiAgICBzcGFjZTogRXF1aXBtZW50W107XHJcbiAgICB6b25lc01hcDogTWFwPHN0cmluZywgRXF1aXBtZW50W10+O1xyXG4gIH0gPSB7XHJcbiAgICBzcGFjZTogW10sXHJcbiAgICB6b25lc01hcDogbmV3IE1hcCgpLFxyXG4gIH07XHJcblxyXG4gIGVxdWlwbWVudHNUYWdzOiBTdWJqZWN0PEVxdWlwbWVudFtdPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHpvbmVJREZpbHRlcjogc3RyaW5nO1xyXG5cclxuICBjdXJyZW50Wm9uZTogWm9uZTtcclxuXHJcbiAgY3VycmVudFNwYWNlSUQ6IHN0cmluZztcclxuXHJcbiAgZmxvb3JzUGVyU3BhY2U6IFpvbmVbXSA9IG51bGw7XHJcblxyXG4gIC8qKiBOdWxsIG1lYW5zIHdlIGRvIG5vdCBhcHBseSBhIGZpbHRlciwgZW1wdHkgYXJyYXkgKFtdKSwgbWVhbnMgd2UgdGhhdCB3ZSBoaWRlIGFsbCBlcXVpcG1lbnQgKi9cclxuICBlcXVpcG1lbnREb21haW5GaWx0ZXI6IHN0cmluZ1tdID0gbnVsbDtcclxuXHJcbiAgdXBkYXRpbmc6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjdXJyZW50bHlVcGRhdGluZyA9IGZhbHNlO1xyXG5cclxuICBjdXJyZW50U3dlZXA6IHN0cmluZztcclxuXHJcbiAgZGVsZXRlT2JzZXJ2YWJsZTogU3ViamVjdDxFcXVpcG1lbnQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY3JlYXRlT2JzZXJ2YWJsZTogU3ViamVjdDxFcXVpcG1lbnQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgdXBkYXRlT2JzZXJ2YWJsZTogU3ViamVjdDxFcXVpcG1lbnQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgc2VsZWN0ZWRGbG9vcjogWm9uZSA9IG51bGw7XHJcblxyXG4gIEFQSTogYW55OyAvL0FXU1xyXG4gIGF3c0tpbmVzaXNBbmFseXRpY3M6IGFueTsgLy9BV1NcclxuXHJcbiAgaXNNdXNldW1Vc2VyID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2N1cnJlbnRBUElTZXJ2aWNlJykgYXBpSW5qZWN0ZWQ6IGFueSxcclxuICAgIEBJbmplY3QoJ2N1cnJlbnRBd3NLaW5lc2lzQW5hbHl0aWNzU2VydmljZScpXHJcbiAgICAgIGF3c0tpbmVzaXNBbmFseXRpY3NJbmplY3RlZDogYW55LFxyXG4gICAgcG9pU2VydmljZTogUG9pU2VydmljZSxcclxuICAgIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgb3BlcmF0aW9uU2VydmljZTogT3BlcmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgdGlja2V0c1NlcnZpY2U6IFRpY2tldHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB2aWV3ZXJTZXJ2aWNlOiBWaWV3ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSB6b25lQ2hhbmdlU2VydmljZTogWm9uZUNoYW5nZVNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKHBvaVNlcnZpY2UsIG5hdmlnYXRpb25TZXJ2aWNlKTtcclxuXHJcbiAgICB0aGlzLkFQSSA9IGFwaUluamVjdGVkO1xyXG4gICAgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzID0gYXdzS2luZXNpc0FuYWx5dGljc0luamVjdGVkO1xyXG5cclxuICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xyXG4gICAgdGhpcy5pbml0U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xyXG4gICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLmlzTXVzZXVtVXNlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzT25seU11c2V1bVJvbGUoKTtcclxuICAgICAgICB0aGlzLmluaXRTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnpvbmVDaGFuZ2VTZXJ2aWNlLmZsb29ySGFzQ2hhbmdlZC5zdWJzY3JpYmUoKGZsb29yKT0+e1xyXG4gICAgICBpZiAoZmxvb3Ipe1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IGZsb29yO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlYWRFcXVpcG1lbnQoaWQ6IHN0cmluZyk6IFByb21pc2U8RXF1aXBtZW50PiB7XHJcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkdldEVxdWlwbWVudChpZCkudGhlbihhc3luYyAocmVjZWl2ZWRFcXVpcCkgPT4ge1xyXG4gICAgICBsZXQgZXF1aXA6IEVxdWlwbWVudDtcclxuICAgICAgaWYgKHJlY2VpdmVkRXF1aXApIHtcclxuICAgICAgICBlcXVpcCA9IHJlY2VpdmVkRXF1aXA7XHJcbiAgICAgICAgZXF1aXAgPSBhd2FpdCB0aGlzLmdldFNpZ25lZFVybHNGb3JFcXVpcG1lbnQocmVjZWl2ZWRFcXVpcCk7XHJcbiAgICAgICAgaWYgKGVxdWlwLmRvbWFpbikge1xyXG4gICAgICAgICAgaWYgKGVxdWlwLmRvbWFpbi5wYXJlbnRJRCkge1xyXG4gICAgICAgICAgICBlcXVpcC5jaGlsZERvbWFpbiA9IGVxdWlwLmRvbWFpbjtcclxuICAgICAgICAgICAgZXF1aXAucGFyZW50RG9tYWluID0gZXF1aXAuZG9tYWluLnBhcmVudDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVxdWlwLnBhcmVudERvbWFpbiA9IGVxdWlwLmRvbWFpbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVxdWlwLnN1YmVxdWlwbWVudHNJRHMpIHtcclxuICAgICAgICAgIGNvbnN0IHN1YkVxdWlwcyA9IFtdO1xyXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIGVxdWlwLnN1YmVxdWlwbWVudHNJRHMubWFwKGFzeW5jIChzdWJJZCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN1YkVxdWlwID0gYXdhaXQgdGhpcy5BUEkuR2V0RXF1aXBtZW50KHN1YklkKTtcclxuICAgICAgICAgICAgICBzdWJFcXVpcHMucHVzaChzdWJFcXVpcCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgZXF1aXAuc3ViRXF1aXBtZW50cyA9IHN1YkVxdWlwcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGVxdWlwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVFcXVpcG1lbnQoXHJcbiAgICBlcXVpcDogRXF1aXBtZW50LFxyXG4gICAgaW1hZ2VGaWxlOiBGaWxlLFxyXG4gICAgZG9jdW1lbnRGaWxlOiBGaWxlXHJcbiAgKTogUHJvbWlzZTxFcXVpcG1lbnQgfCB2b2lkPiB7XHJcbiAgICByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3QoZXF1aXApO1xyXG4gICAgaWYgKCEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzICYmICEhdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLnJlY29yZCAmJiB0aGlzLmF3c0tpbmVzaXNBbmFseXRpY3MucmVjb3JkKCkpIHtcclxuICAgICAgdGhpcy5hd3NLaW5lc2lzQW5hbHl0aWNzLmdldEluc3RhbmNlKCkucmVjb3JkKFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ09iamVjdCBDcmVhdGlvbicsXHJcbiAgICAgICAgICAgIG9iamVjdFR5cGU6ICdlcXVpcG1lbnQnLFxyXG4gICAgICAgICAgICBwb2k6IGVxdWlwLFxyXG4gICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXJTZXJ2aWNlLmN1LFxyXG4gICAgICAgICAgICBsb2NhdGlvbklkOiB0aGlzLmN1cnJlbnRTcGFjZUlELFxyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgIHpvbmVJZDogdGhpcy5jdXJyZW50Wm9uZS5pZCxcclxuICAgICAgICAgICAgZmxvb3JJZDogdGhpcy5zZWxlY3RlZEZsb29yPy5pZCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdHJlYW1OYW1lOiAnc21hcnRlcnBsYW5LaW5lc2lzLWFuYWx5dGljcycsXHJcbiAgICAgICAgICAvLyBwYXJ0aXRpb25LZXk6IFwiXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnQVdTS2luZXNpcydcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkFQSS5DcmVhdGVFcXVpcG1lbnQoZXF1aXApLnRoZW4oYXN5bmMgKHJlY2VpdmVkRXF1aXBtZW50KSA9PiB7XHJcbiAgICAgIGxldCBlcXVpcG1lbnQgPSByZWNlaXZlZEVxdWlwbWVudCBhcyBFcXVpcG1lbnQ7XHJcbiAgICAgIGlmIChlcXVpcG1lbnQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZXF1aXBtZW50IGNyZWF0ZWQ6JywgZXF1aXBtZW50KTtcclxuICAgICAgICBpZiAoZG9jdW1lbnRGaWxlKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZERvYyhlcXVpcG1lbnQsIGRvY3VtZW50RmlsZSwgVHlwZU5vdGUuVEVDSE5JQ0FMKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGltYWdlRmlsZSkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRJbWFnZShlcXVpcG1lbnQsIGltYWdlRmlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBlcXVpcG1lbnQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFNpZ25lZFVybHNGb3JFcXVpcG1lbnQoZXF1aXA6IEVxdWlwbWVudCk6IFByb21pc2U8RXF1aXBtZW50PiB7XHJcbiAgICBjb25zdCBlcXVpcG1lbnQgPSB7Li4uZXF1aXB9O1xyXG4gICAgaWYgKGVxdWlwbWVudC5ub3Rlcy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGRvY3MgPSBbXTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgZXF1aXBtZW50Lm5vdGVzLml0ZW1zLm1hcChhc3luYyAobm90ZSkgPT4ge1xyXG4gICAgICAgICAgZXF1aXBtZW50LmRvY3VtZW50YXRpb25JbWFnZVVybFNpZ25lZCA9XHJcbiAgICAgICAgICAgIGF3YWl0IGdldFNpZ25lZEltYWdlVXJsRm9yRXF1aXBtZW50KGVxdWlwbWVudCk7XHJcbiAgICAgICAgICBpZiAobm90ZS5hdHRhY2htZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHtsZW5ndGh9ID0gbm90ZS5hdHRhY2htZW50LnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gbm90ZS5hdHRhY2htZW50LnNwbGl0KCcvJylbbGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBhd2FpdCBnZXRTaWduZWRGaWxlKG5vdGUuYXR0YWNobWVudCk7XHJcbiAgICAgICAgICAgIGlmIChhdHRhY2htZW50KSB7XHJcbiAgICAgICAgICAgICAgZG9jcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBub3RlLmF0dGFjaG1lbnQsXHJcbiAgICAgICAgICAgICAgICB1cmxTaWduZWQ6IGF0dGFjaG1lbnQsXHJcbiAgICAgICAgICAgICAgICBub3RlSUQ6IG5vdGUuaWQsXHJcbiAgICAgICAgICAgICAgfSBhcyBFcXVpcG1lbnREb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBlcXVpcG1lbnQuZG9jdW1lbnRzID0gZG9jcztcclxuICAgICAgcmV0dXJuIGVxdWlwbWVudDtcclxuICAgIH1cclxuICAgIHJldHVybiBlcXVpcG1lbnQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRFcXVpcG1lbnRzRm9yVGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxFcXVpcG1lbnRbXT4ge1xyXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRpY2tldC5vcGVyYXRpb25zLml0ZW1zO1xyXG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBvcGVyYXRpb25zLnNvcnQoXHJcbiAgICAgICAgKGEsIGIpID0+XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJldHRpZXIvcHJldHRpZXJcclxuICAgICAgICAgIG5ldyBEYXRlKGIuY3JlYXRlZEF0KSAtIG5ldyBEYXRlKGEuY3JlYXRlZEF0KVxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBvcGVyYXRpb25zLm1hcChhc3luYyAob3BlcmF0aW9uKSA9PiB7XHJcbiAgICAgICAgICBvcGVyYXRpb24uZXF1aXBtZW50ID0gYXdhaXQgdGhpcy5yZWFkRXF1aXBtZW50KG9wZXJhdGlvbi5lcXVpcG1lbnRJRCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIC8vIHRvIGtlZXAgdGhlIHNvcnRpbmcgYnkgY3JlYXRlZEF0XHJcbiAgICByZXR1cm4gb3BlcmF0aW9ucy5tYXAoKG8pID0+IG8uZXF1aXBtZW50KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldEVxdWlwbWVudHNGb3JTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPEVxdWlwbWVudFtdPiB7XHJcbiAgICAvLyBzcGxpdCBieSAxMDBcclxuICAgIGNvbnN0IGxpbWl0ID0gMTAwO1xyXG4gICAgbGV0IGVxdWlwc1Rva2VuID0ge2VxdWlwczogW10sIG5leHRUb2tlbjogbnVsbH07XHJcbiAgICBkbyB7XHJcbiAgICAgIGVxdWlwc1Rva2VuID0gYXdhaXQgdGhpcy5tZXJnZUVxdWlwbWVudHNGb3JTcGFjZVdpdGhOZXh0VG9rZW5XaXRoTGltaXQoXHJcbiAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICBsaW1pdCxcclxuICAgICAgICBlcXVpcHNUb2tlblxyXG4gICAgICApO1xyXG4gICAgfSB3aGlsZSAoZXF1aXBzVG9rZW4ubmV4dFRva2VuKTtcclxuICAgIHJldHVybiBlcXVpcHNUb2tlbi5lcXVpcHM7XHJcbiAgfVxyXG5cclxuICBhc3luYyBtZXJnZUVxdWlwbWVudHNGb3JTcGFjZVdpdGhOZXh0VG9rZW5XaXRoTGltaXQoXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBsaW1pdDogbnVtYmVyLFxyXG4gICAgZXF1aXBzVG9rZW46IHsgZXF1aXBzOiBFcXVpcG1lbnRbXTsgbmV4dFRva2VuOiBzdHJpbmcgfCBudWxsIH1cclxuICApOiBQcm9taXNlPHsgZXF1aXBzOiBFcXVpcG1lbnRbXTsgbmV4dFRva2VuOiBzdHJpbmcgfCBudWxsIH0+IHtcclxuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX19cclxuICAgICAgLkVxdWlwbWVudHNCeVNwYWNlKFxyXG4gICAgICAgIHNwYWNlSUQsXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICAnREVTQycsXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICBsaW1pdCxcclxuICAgICAgICBlcXVpcHNUb2tlbi5uZXh0VG9rZW4gLy8gbmV4dFRva2VuXHJcbiAgICAgIClcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXF1aXBzTGltaXQgPSByZXNwb25zZS5pdGVtcztcclxuICAgICAgICBjb25zdCBlcXVpcHNPYmplY3QgPSB7XHJcbiAgICAgICAgICBlcXVpcHM6IFsuLi5lcXVpcHNUb2tlbi5lcXVpcHMsIC4uLmVxdWlwc0xpbWl0XSxcclxuICAgICAgICAgIG5leHRUb2tlbjogcmVzcG9uc2UubmV4dFRva2VuLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGVxdWlwc09iamVjdDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGxvYWRJbWFnZUZvckFsbEVxdWlwbWVudHMoXHJcbiAgICBlcXVpcG1lbnRzOiBFcXVpcG1lbnRbXSxcclxuICAgIGltYWdlRmlsZTogRmlsZVxyXG4gICk6IFByb21pc2U8RXF1aXBtZW50W10+IHtcclxuICAgIGlmIChlcXVpcG1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVwbG9hZEZpbGVUb1MzKHRoaXMucHJlZml4LmltYWdlLCBpbWFnZUZpbGUsICdCQVRDSCcpLnRoZW4oXHJcbiAgICAgIGFzeW5jICh1cmwpID0+IHtcclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICBjb25zdCBlcXVpcHMgPSBbXTtcclxuICAgICAgICAgIGZvciAoY29uc3QgZXF1aXAgb2YgZXF1aXBtZW50cykge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oXHJcbiAgICAgICAgICAgICAgZXF1aXAuc3BhY2VJRFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uQ3JlYXRlTm90ZSh7XHJcbiAgICAgICAgICAgICAgYXR0YWNobWVudDogdXJsLFxyXG4gICAgICAgICAgICAgIHR5cGU6IFR5cGVOb3RlLklNQUdFLFxyXG4gICAgICAgICAgICAgIGVxdWlwbWVudElEOiBlcXVpcC5pZCxcclxuICAgICAgICAgICAgICBvd25lck1pc3Npb25JRDogY3VycmVudE1pc3Npb24gPyBjdXJyZW50TWlzc2lvbi5pZCA6IG51bGwsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uVXBkYXRlRXF1aXBtZW50KHtcclxuICAgICAgICAgICAgICBpZDogZXF1aXAuaWQsXHJcbiAgICAgICAgICAgICAgcGhvdG86IHVybCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVxdWlwcy5wdXNoKHVwZGF0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZXF1aXBzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGxvYWRJbWFnZShlcXVpcG1lbnQ6IEVxdWlwbWVudCwgaW1hZ2VGaWxlOiBGaWxlKTogUHJvbWlzZTxOb3RlPiB7XHJcbiAgICByZXR1cm4gdXBsb2FkRmlsZVRvUzModGhpcy5wcmVmaXguaW1hZ2UsIGltYWdlRmlsZSwgZXF1aXBtZW50LmlkKS50aGVuKFxyXG4gICAgICBhc3luYyAodXJsKSA9PiB7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgY29uc3QgY3VycmVudE1pc3Npb24gPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKFxyXG4gICAgICAgICAgICBlcXVpcG1lbnQuc3BhY2VJRFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IG5vdGUgPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uQ3JlYXRlTm90ZSh7XHJcbiAgICAgICAgICAgIGF0dGFjaG1lbnQ6IHVybCxcclxuICAgICAgICAgICAgdHlwZTogVHlwZU5vdGUuSU1BR0UsXHJcbiAgICAgICAgICAgIGVxdWlwbWVudElEOiBlcXVpcG1lbnQuaWQsXHJcbiAgICAgICAgICAgIG93bmVyTWlzc2lvbklEOiBjdXJyZW50TWlzc2lvbiA/IGN1cnJlbnRNaXNzaW9uLmlkIDogbnVsbCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLlVwZGF0ZUVxdWlwbWVudCh7XHJcbiAgICAgICAgICAgIGlkOiBlcXVpcG1lbnQuaWQsXHJcbiAgICAgICAgICAgIHBob3RvOiB1cmwsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiBub3RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUVxdWlwbWVudChcclxuICAgIGVxdWlwOiBhbnksXHJcbiAgICBmaWxlOiBGaWxlID0gbnVsbCxcclxuICAgIG5vdGVUeXBlOiBUeXBlTm90ZSA9IG51bGxcclxuICApOiBQcm9taXNlPEVxdWlwbWVudD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fX1xyXG4gICAgICAuVXBkYXRlRXF1aXBtZW50KGVxdWlwKVxyXG4gICAgICAudGhlbihhc3luYyAocmVjZWl2ZWRFcXVpcG1lbnQpID0+IHtcclxuICAgICAgICBsZXQgZXF1aXBtZW50ID0gcmVjZWl2ZWRFcXVpcG1lbnQgYXMgRXF1aXBtZW50O1xyXG4gICAgICAgIGlmIChlcXVpcG1lbnQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcXVpcG1lbnQgdXBkYXRlZDonLCBlcXVpcG1lbnQpO1xyXG4gICAgICAgICAgaWYgKG5vdGVUeXBlKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAobm90ZVR5cGUpIHtcclxuICAgICAgICAgICAgICBjYXNlIFR5cGVOb3RlLklNQUdFOlxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRJbWFnZShlcXVpcG1lbnQsIGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBsb2FkRG9jKGVxdWlwbWVudCwgZmlsZSwgbm90ZVR5cGUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVxdWlwbWVudDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRQcmVmaXhEb2ModHlwZTogVHlwZU5vdGUpIHtcclxuICAgIGxldCBwcmVmaXg7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBUeXBlTm90ZS5JTkZPUk1BVElPTjpcclxuICAgICAgICBwcmVmaXggPSB0aGlzLnByZWZpeC5pbmZvcm1hdGlvbjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBUeXBlTm90ZS5GSU5BTkNJQUw6XHJcbiAgICAgICAgcHJlZml4ID0gdGhpcy5wcmVmaXguZmluYW5jaWFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFR5cGVOb3RlLkNPTlRSQUNUVUFMOlxyXG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4LmNvbnRyYWN0dWFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFR5cGVOb3RlLk9USEVSOlxyXG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4Lm90aGVyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFR5cGVOb3RlLklNQUdFOlxyXG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4LmltYWdlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHByZWZpeCA9IHRoaXMucHJlZml4LnRlY2huaWNhbDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBwcmVmaXg7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGxvYWREb2NGb3JBbGxFcXVpcG1lbnRzKFxyXG4gICAgZXF1aXBtZW50czogRXF1aXBtZW50W10sXHJcbiAgICBkb2N1bWVudEZpbGU6IEZpbGUsXHJcbiAgICB0eXBlOiBUeXBlTm90ZVxyXG4gICkge1xyXG4gICAgaWYgKGVxdWlwbWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuZ2V0UHJlZml4RG9jKHR5cGUpO1xyXG4gICAgY29uc3QgdXJsID0gYXdhaXQgdXBsb2FkRmlsZVRvUzMocHJlZml4LCBkb2N1bWVudEZpbGUsICdCQVRDSCcpO1xyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICBjb25zdCB1cGRhdGVMaXN0ID0gW107XHJcbiAgICAgIGZvciAoY29uc3QgZXF1aXAgb2YgZXF1aXBtZW50cykge1xyXG4gICAgICAgIGNvbnN0IG1pc3Npb24gPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKGVxdWlwLnNwYWNlSUQpO1xyXG4gICAgICAgIGNvbnN0IG5ld0VxdWlwID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkNyZWF0ZU5vdGUoe1xyXG4gICAgICAgICAgYXR0YWNobWVudDogdXJsLFxyXG4gICAgICAgICAgdHlwZSxcclxuICAgICAgICAgIGVxdWlwbWVudElEOiBlcXVpcC5pZCxcclxuICAgICAgICAgIG93bmVyTWlzc2lvbklEOiBtaXNzaW9uID8gbWlzc2lvbi5pZCA6IG51bGwsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdXBkYXRlTGlzdC5wdXNoKG5ld0VxdWlwKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdXBkYXRlTGlzdDtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwbG9hZERvYyhcclxuICAgIGVxdWlwbWVudDogRXF1aXBtZW50LFxyXG4gICAgZG9jdW1lbnRGaWxlOiBGaWxlLFxyXG4gICAgdHlwZTogVHlwZU5vdGVcclxuICApOiBQcm9taXNlPE5vdGU+IHtcclxuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuZ2V0UHJlZml4RG9jKHR5cGUpO1xyXG4gICAgY29uc3QgbWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oZXF1aXBtZW50LnNwYWNlSUQpO1xyXG4gICAgcmV0dXJuIHVwbG9hZEZpbGVUb1MzKHByZWZpeCwgZG9jdW1lbnRGaWxlLCBlcXVpcG1lbnQuaWQpLnRoZW4oXHJcbiAgICAgIGFzeW5jICh1cmwpID0+IHtcclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkNyZWF0ZU5vdGUoe1xyXG4gICAgICAgICAgICBhdHRhY2htZW50OiB1cmwsXHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIGVxdWlwbWVudElEOiBlcXVpcG1lbnQuaWQsXHJcbiAgICAgICAgICAgIG93bmVyTWlzc2lvbklEOiBtaXNzaW9uID8gbWlzc2lvbi5pZCA6IG51bGwsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVFcXVpcG1lbnQoZXF1aXA6IEVxdWlwbWVudCk6IFByb21pc2U8RXF1aXBtZW50PiB7XHJcbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZUVxdWlwbWVudCh7aWQ6IGVxdWlwLmlkfSk7XHJcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlZCBlcXVpcG1lbnQnLCBkZWxldGVkKTtcclxuXHJcbiAgICAvLyBkZWxldGUgUE9JXHJcbiAgICBjb25zdCBbcG9pXSA9IGVxdWlwLnBvaXMuaXRlbXM7XHJcbiAgICBpZiAocG9pKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMucG9pU2VydmljZS5kZWxldGVQb2kocG9pLmlkKTtcclxuICAgIH1cclxuICAgIC8vIGRlbGV0ZSBub3RlcyByZWxhdGVkXHJcbiAgICBpZiAoZXF1aXAubm90ZXMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBlcXVpcC5ub3Rlcy5pdGVtcy5tYXAoYXN5bmMgKG5vdGU6IE5vdGUpID0+IHtcclxuICAgICAgICAgIC8vIGRlbGV0ZSBmaWxlcyBmcm9tIFMzXHJcbiAgICAgICAgICAvKiogTm90IHNoYXJlZCB3aXRoIG90aGVyIGVxdWlwbWVudCAqL1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBub3RlLmF0dGFjaG1lbnQgJiZcclxuICAgICAgICAgICAgIW5vdGUuYXR0YWNobWVudC5zcGxpdCgnLycpLnBvcCgpLnN0YXJ0c1dpdGgoJ0JBVENIXycpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgYXdhaXQgZGVsZXRlRnJvbVMzKG5vdGUuYXR0YWNobWVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlTm90ZSh7aWQ6IG5vdGUuaWR9KTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gZGVsZXRlIG9wZXJhdGlvbnMgKHJlbW92ZSBmcm9tIGxpbmtlZCB0aWNrZXRzKVxyXG4gICAgYXdhaXQgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmRlbGV0ZU9wZXJhdGlvbnNGb3JFcXVpcG1lbnQoZXF1aXAuaWQpO1xyXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVFcXVpcG1lbnRMb2NhdGlvbihcclxuICAgIGVxdWlwOiBFcXVpcG1lbnQsXHJcbiAgICB0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhXHJcbiAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgIGNvbnN0IHBvaUlucHV0ID0ge1xyXG4gICAgICBjb29yZGluYXRlOiB0YWdEYXRhLmdldENvb3JkaW5hdGVTdHJpbmcoKSxcclxuICAgICAgdHlwZTogUG9pVHlwZS5FUVVJUE1FTlQsXHJcbiAgICAgIGVsZW1lbnRJRDogZXF1aXAuaWQsXHJcbiAgICAgIG1ldGFkYXRhOiB0YWdEYXRhLmdldE1ldGFkYXRhU3RyaW5nKCksXHJcbiAgICAgIG1hdHRlcnBvcnRTd2VlcElEOiB0YWdEYXRhLmdldFN3ZWVwSUQoKSxcclxuICAgIH0gYXMgUE9JO1xyXG4gICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmNyZWF0ZVBPSUZvclNwYWNlSUQocG9pSW5wdXQpO1xyXG4gICAgcmV0dXJuIHBvaTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVRpY2tldEZyb21FcXVpcG1lbnQoXHJcbiAgICB0aWNrZXQ6IFRpY2tldCxcclxuICAgIGVxdWlwOiBFcXVpcG1lbnRcclxuICApOiBQcm9taXNlPE9wZXJhdGlvbj4ge1xyXG4gICAgY29uc3Qgb3BlcmF0aW9uRXF1aXAgPVxyXG4gICAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuZ2V0T3BlcmF0aW9uc0J5RXF1aXBtZW50SUQoZXF1aXAuaWQpO1xyXG4gICAgY29uc3Qgb3BlcmF0aW9uVG9EZWxldGUgPSBvcGVyYXRpb25FcXVpcC5maW5kKFxyXG4gICAgICAob3ApID0+IG9wLnRpY2tldElEID09PSB0aWNrZXQuaWRcclxuICAgICk7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25TZXJ2aWNlXHJcbiAgICAgIC5kZWxldGVPcGVyYXRpb24ob3BlcmF0aW9uVG9EZWxldGUuaWQpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLnRpY2tldHNTZXJ2aWNlLmFkZEV2ZW50VG9UaWNrZXQodGlja2V0IGFzIFRpY2tldCwge1xyXG4gICAgICAgICAgdGl0bGU6ICdFcXVpcGVtZW50IHJldGlyw6kgZHUgdGlja2V0JyxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgRXF1aXBlbWVudCAke2VxdWlwLm5hbWV9IGEgw6l0w6kgcmV0aXLDqSBkdSB0aWNrZXRgLFxyXG4gICAgICAgICAgc3RhdHVzOiBFdmVudFN0YXR1cy5VTkxJTktFRF9GUk9NX0VRVUlQTUVOVCxcclxuICAgICAgICAgIHR5cGU6IEV2ZW50VHlwZS5USUNLRVQsXHJcbiAgICAgICAgICB0cmFuc2xhdGlvblBhdGg6ICd0aWNrZXRFdmVudC50aWNrZXQudW5saW5rZWRGcm9tRXF1aXBtZW50JyxcclxuICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnN0cmluZ2lmeSh7ZXF1aXBtZW50OiBlcXVpcC5uYW1lfSksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0RXF1aXBzKCkge1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRpbmcubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuY3VycmVudGx5VXBkYXRpbmcgPSB0cnVlO1xyXG5cclxuICAgIGxldCBlcUxpc3QgPSBhd2FpdCB0aGlzLmdldEVxdWlwbWVudHNGb3JTcGFjZSh0aGlzLmN1cnJlbnRTcGFjZUlEKTtcclxuICAgIGVxTGlzdCA9IGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJFcXVpcG1lbnRzRm9yQ3VycmVudFVzZXJJblNwYWNlKFxyXG4gICAgICB0aGlzLmN1cnJlbnRTcGFjZUlELFxyXG4gICAgICBlcUxpc3RcclxuICAgICk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhlcUxpc3QpO1xyXG4gICAgaWYgKGVxTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBmaWx0ZXJlZEVxdWlwcyA9IGVxTGlzdC5maWx0ZXIoXHJcbiAgICAgICAgKGVxdWlwbWVudCkgPT4gIXRoaXMuaXNBcmNoaXZlZChlcXVpcG1lbnQpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBmaWx0ZXJlZEVxdWlwcy5tYXAoYXN5bmMgKGVxdWlwKSA9PiB7XHJcbiAgICAgICAgICBlcXVpcC5kb2N1bWVudGF0aW9uSW1hZ2VVcmxTaWduZWQgPVxyXG4gICAgICAgICAgICBhd2FpdCBnZXRTaWduZWRJbWFnZVVybEZvckVxdWlwbWVudChlcXVpcCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgICAgaWYgKHRoaXMuZXF1aXBtZW50RG9tYWluRmlsdGVyKSB7XHJcbiAgICAgICAgZmlsdGVyZWRFcXVpcHMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyRXF1aXBtZW50c0J5RG9tYWluTGlzdChcclxuICAgICAgICAgIGZpbHRlcmVkRXF1aXBzLFxyXG4gICAgICAgICAgdGhpcy5lcXVpcG1lbnREb21haW5GaWx0ZXJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UgPSBmaWx0ZXJlZEVxdWlwcztcclxuICAgICAgaWYgKHRoaXMuem9uZUlERmlsdGVyKSB7XHJcbiAgICAgICAgZmlsdGVyZWRFcXVpcHMgPSAoYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3Jab25lKFxyXG4gICAgICAgICAgZmlsdGVyZWRFcXVpcHMsXHJcbiAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlcixcclxuICAgICAgICAgIHRoaXMuY3VycmVudFpvbmVcclxuICAgICAgICApKSBhcyBFcXVpcG1lbnRbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLnNldCh0aGlzLnpvbmVJREZpbHRlciwgZmlsdGVyZWRFcXVpcHMpO1xyXG4gICAgICB0aGlzLmVxdWlwbWVudHNUYWdzLm5leHQoZmlsdGVyZWRFcXVpcHMpOyAvLyBhZGRpbmcgdGFncyBvbmx5IGZvciB0aGUgY3VycmVudCB6b25lXHJcbiAgICAgIHRoaXMuZXF1aXBtZW50c1VwZGF0ZWQubmV4dCh7XHJcbiAgICAgICAgc3BhY2U6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXHJcbiAgICAgICAgem9uZTogZmlsdGVyZWRFcXVpcHMsXHJcbiAgICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy56b25lSURGaWx0ZXIpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLnNldCh0aGlzLnpvbmVJREZpbHRlciwgW10pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXF1aXBtZW50c1VwZGF0ZWQubmV4dCh7c3BhY2U6IFtdLCB6b25lOiBbXX0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnRFcXVpcG1lbnRzKTtcclxuICAgIHRoaXMudXBkYXRpbmcubmV4dChmYWxzZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRseVVwZGF0aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRFcXVpcG1lbnRzRm9yQ3VycmVudFVzZXJGb3JTcGFjZShcclxuICAgIHNwYWNlSUQsXHJcbiAgICBtaXNzaW9uczogTWlzc2lvbltdXHJcbiAgKTogUHJvbWlzZTxFcXVpcG1lbnRbXT4ge1xyXG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuXHJcbiAgICBjb25zdCBzcGFjZU1pc3Npb25zID0gbWlzc2lvbnMuZmlsdGVyKChtKSA9PiBtLnNwYWNlSUQgPT09IHNwYWNlSUQpO1xyXG4gICAgaWYgKHNwYWNlTWlzc2lvbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2FuU2VlRXF1aXBzID0gc3BhY2VNaXNzaW9ucy5zb21lKFxyXG4gICAgICAobSkgPT5cclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLm1hbmFnZXJzLmluY2x1ZGVzKG0ucm9sZSkgfHxcclxuICAgICAgICBtLnJvbGUgPT09IFJvbGVTdGF0dXMuU0VSVklDRVxyXG4gICAgKTtcclxuICAgIGlmICghY2FuU2VlRXF1aXBzKSB7XHJcbiAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgfVxyXG4gICAgbGV0IGRvbWFpbnMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgbSBvZiBzcGFjZU1pc3Npb25zKSB7XHJcbiAgICAgIGRvbWFpbnMgPSBbLi4uZG9tYWlucywgbS5kb21haW5zXTtcclxuICAgIH1cclxuICAgIGlmIChkb21haW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuICAgIHJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldEVxdWlwbWVudHNGb3JTcGFjZShzcGFjZUlEKTtcclxuICAgIC8vIHJlc3VsdHMgPSB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyRXF1aXBtZW50c0J5RG9tYWluTGlzdChcclxuICAgIC8vICAgICByZXN1bHRzLFxyXG4gICAgLy8gICAgIGRvbWFpbnMsXHJcbiAgICAvLyApO1xyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVJY29uRm9yQWxsRXF1aXBtZW50c0luU3BhY2UoXHJcbiAgICB0YWdJY29uOiBzdHJpbmcsXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBkb21haW5JRDogc3RyaW5nID0gbnVsbFxyXG4gICk6IFByb21pc2U8eyBlcXVpcHM6IEVxdWlwbWVudFtdOyBwb2lzOiBQT0lbXSB9PiB7XHJcbiAgICBsZXQgZXF1aXBzID0gYXdhaXQgdGhpcy5nZXRFcXVpcG1lbnRzRm9yU3BhY2Uoc3BhY2VJRCk7XHJcbiAgICBpZiAoZG9tYWluSUQpIHtcclxuICAgICAgZXF1aXBzID0gZXF1aXBzLmZpbHRlcigoZXF1aXApID0+IGVxdWlwLmRvbWFpbklEID09PSBkb21haW5JRCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwb2lzID0gYXdhaXQgdGhpcy51cGRhdGVJY29uRm9yQWxsT2JqZWN0cyhlcXVpcHMsIHRhZ0ljb24pO1xyXG4gICAgcmV0dXJuIHtlcXVpcHMsIHBvaXN9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHVzZXIgaGFzIGFyY2hpdmVkIHRoaXMgZXF1aXBtZW50ICovXHJcbiAgaXNBcmNoaXZlZChlcXVpcG1lbnQ6IEVxdWlwbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGVxdWlwbWVudC5hcmNoaXZlZEZvck1pc3Npb25JRFxyXG4gICAgICA/IGVxdWlwbWVudC5hcmNoaXZlZEZvck1pc3Npb25JRC5pbmNsdWRlcyhcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKGVxdWlwbWVudC5zcGFjZUlEKS5pZFxyXG4gICAgICApXHJcbiAgICAgIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZXRBcmNoaXZlZChlcXVpcG1lbnQ6IEVxdWlwbWVudCwgYXJjaGl2ZWQ6IGJvb2xlYW4pIHtcclxuICAgIGxldCBhcmNoaXZlZExpc3QgPSBlcXVpcG1lbnQuYXJjaGl2ZWRGb3JNaXNzaW9uSURcclxuICAgICAgPyBlcXVpcG1lbnQuYXJjaGl2ZWRGb3JNaXNzaW9uSURcclxuICAgICAgOiBbXTtcclxuICAgIGNvbnN0IG1pc3Npb25JRCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oZXF1aXBtZW50LnNwYWNlSUQpLmlkO1xyXG5cclxuICAgIGFyY2hpdmVkTGlzdCA9IGFyY2hpdmVkTGlzdC5maWx0ZXIoKG0pID0+IG0gIT09IG1pc3Npb25JRCk7XHJcblxyXG4gICAgaWYgKGFyY2hpdmVkKSB7XHJcbiAgICAgIGFyY2hpdmVkTGlzdC5wdXNoKG1pc3Npb25JRCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlRXF1aXBtZW50KHtcclxuICAgICAgaWQ6IGVxdWlwbWVudC5pZCxcclxuICAgICAgYXJjaGl2ZWRGb3JNaXNzaW9uSUQ6IGFyY2hpdmVkTGlzdCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlRmlsZShkb2N1bWVudF86IEVxdWlwbWVudERvY3VtZW50KSB7XHJcbiAgICBhd2FpdCBkZWxldGVGcm9tUzMoZG9jdW1lbnRfLnVybCk7XHJcbiAgICBhd2FpdCB0aGlzLkFQSS5EZWxldGVOb3RlKHtpZDogZG9jdW1lbnRfLm5vdGVJRH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmF2aWdhdGVUb0VxdWlwbWVudEluM0QoXHJcbiAgICBlcXVpcG1lbnQ6IEVxdWlwbWVudCxcclxuICAgIGZvcmNlU3dpdGNoVmlzaXQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICkge1xyXG4gICAgbGV0IHVybCA9IGB2aXNpdC8ke2VxdWlwbWVudC5zcGFjZUlEfWA7XHJcbiAgICBpZiAoZm9yY2VTd2l0Y2hWaXNpdCkge1xyXG4gICAgICB1cmwgKz0gYC9lcXVpcC8ke2VxdWlwbWVudC5pZH1gO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2FuR29Ub1RhZyA9IGF3YWl0IHRoaXMudmlld2VyU2VydmljZS5hY3Rpb25fbW92ZV90b190YWcoXHJcbiAgICAgIGAke2VxdWlwbWVudC5pZH1gXHJcbiAgICApO1xyXG4gICAgaWYgKGNhbkdvVG9UYWcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRNb2RlbDNkQW5kU3dlZXAoZXF1aXBtZW50KTtcclxuXHJcbiAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0Lm1vZGVsM0QpIHtcclxuICAgICAgYWxlcnQoJ0Vycm9yIHdoaWxlIGdldHRpbmcgdmlydHVhbCB2aXNpdCBtb2RlbCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWZvcmNlU3dpdGNoVmlzaXQpIHtcclxuICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIG1vdmluZyB3aXRoaW4gdGhlIHNhbWUgM0QgbW9kZWxcclxuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vZGVsM0QnKTtcclxuICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwgPT09IHJlc3VsdC5tb2RlbDNEKSB7XHJcbiAgICAgICAgLy8gd2UgYWRkIHRhZyB0byB0aGUgdmlzaXRcclxuICAgICAgICBjb25zdCBwb2kgPSBlcXVpcG1lbnQucG9pcy5pdGVtc1swXTtcclxuICAgICAgICBpZiAocG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgICAgIC8vIHdlIGZvcmNlIGFkZCBiZWNhdXNlIHdlIG1pZ2h0IGJlIGluIGFuIGFub3RoZXIgem9uZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy52aWV3ZXJTZXJ2aWNlLmFjdGlvbkFkZE9iamVjdEZyb21QT0koZXF1aXBtZW50LCBwb2kpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy52aWV3ZXJTZXJ2aWNlLmFjdGlvbl9tb3ZlX3RvX3RhZyhlcXVpcG1lbnQuaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvKiogU2kgb24gbmUgZm9yY2UgcGFzIGxhIHZpc2l0ZSwgb24gZGVtYW5kZSBzaSBvbiB2ZXV0IGV0cmUgc3dpdGNoICovXHJcbiAgICAgICAgb3Blbk1vZGFsRm9yVmlzaXRTd2l0Y2goXHJcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZSxcclxuICAgICAgICAgIHJlc3VsdC5tb2RlbDNELFxyXG4gICAgICAgICAgZXF1aXBtZW50LnNwYWNlSUQsXHJcbiAgICAgICAgICB7c3dlZXBUb01vdmU6IHJlc3VsdC5zd2VlcCwgcm90YXRpb246IHJlc3VsdC5yb3RhdGlvbn1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvKiogU2kgb24gZm9yY2UgbGUgc3dpdGNoIGRlIGxhIHZpc2l0ICovXHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3VybH0/bW9kZWwzRD0ke3Jlc3VsdC5tb2RlbDNEfSZzd2VlcD10cnVlYCwgJ19ibGFuaycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlRXF1aXBzRm9yWm9uZSgpIHtcclxuICAgIHRoaXMudXBkYXRpbmcubmV4dCh0cnVlKTtcclxuICAgIGxldCBmaWx0ZXJlZEVxdWlwcyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgJiZcclxuICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmhhcyh0aGlzLnpvbmVJREZpbHRlcilcclxuICAgICAgKSB7XHJcbiAgICAgICAgZmlsdGVyZWRFcXVpcHMgPSB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmdldCh0aGlzLnpvbmVJREZpbHRlcik7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJpIGhhdmUgZXF1aXBzIGZvciB0aGlzIHpvbmVcIiwgZmlsdGVyZWRFcXVpcHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpbHRlcmVkRXF1aXBzID0gKGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJPYmplY3RzRm9yWm9uZShcclxuICAgICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXHJcbiAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlcixcclxuICAgICAgICAgIHRoaXMuY3VycmVudFpvbmVcclxuICAgICAgICApKSBhcyBFcXVpcG1lbnRbXTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcC5zZXQodGhpcy56b25lSURGaWx0ZXIsIFtcclxuICAgICAgICAgIC4uLmZpbHRlcmVkRXF1aXBzLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmVxdWlwbWVudERvbWFpbkZpbHRlcikge1xyXG4gICAgICAgIGZpbHRlcmVkRXF1aXBzID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlckVxdWlwbWVudHNCeURvbWFpbkxpc3QoXHJcbiAgICAgICAgICBmaWx0ZXJlZEVxdWlwcyxcclxuICAgICAgICAgIHRoaXMuZXF1aXBtZW50RG9tYWluRmlsdGVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVxdWlwbWVudHNUYWdzLm5leHQoZmlsdGVyZWRFcXVpcHMpOyAvLyBhZGRpbmcgdGFncyBvbmx5IGZvciB0aGUgY3VycmVudCB6b25lXHJcbiAgICAgIHRoaXMuZXF1aXBtZW50c1VwZGF0ZWQubmV4dCh7XHJcbiAgICAgICAgc3BhY2U6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXHJcbiAgICAgICAgem9uZTogZmlsdGVyZWRFcXVpcHMsXHJcbiAgICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVxdWlwbWVudHNVcGRhdGVkLm5leHQoe3NwYWNlOiBbXSwgem9uZTogW119KTsgLy8gZm9yIGxhdGVyYWwgbWVudVxyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGluZy5uZXh0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUR1ZVRvRGVsZXRlKGRlbGV0ZWRFcXVpcG1lbnQ6IEVxdWlwbWVudCkge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJ1cGRhdGUgZHVlIHRvIGRlbGV0ZVwiLCBkZWxldGVkRXF1aXBtZW50KTtcclxuICAgIGNvbnN0IGVxdWlwID0gdGhpcy5jdXJyZW50RXF1aXBtZW50cy5zcGFjZS5maW5kKFxyXG4gICAgICAoX2VxdWlwKSA9PiBfZXF1aXAuaWQgPT09IGRlbGV0ZWRFcXVpcG1lbnQuaWRcclxuICAgICk7XHJcbiAgICBpZiAoZXF1aXApIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLmluZGV4T2YoZXF1aXApO1xyXG4gICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcC5rZXlzKCkpIHtcclxuICAgICAgY29uc3QgZXF1aXBUb0RlbGV0ZSA9IHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXBcclxuICAgICAgICAuZ2V0KHpvbmUpXHJcbiAgICAgICAgLmZpbmQoKF9lcXVpcCkgPT4gX2VxdWlwLmlkID09PSBkZWxldGVkRXF1aXBtZW50LmlkKTtcclxuICAgICAgaWYgKGVxdWlwVG9EZWxldGUpIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXBcclxuICAgICAgICAgIC5nZXQoem9uZSlcclxuICAgICAgICAgIC5pbmRleE9mKGVxdWlwVG9EZWxldGUpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXAuZ2V0KHpvbmUpLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZXF1aXBtZW50c1VwZGF0ZWQubmV4dCh7XHJcbiAgICAgIHNwYWNlOiB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLFxyXG4gICAgICB6b25lOiB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnpvbmVzTWFwLmdldCh0aGlzLnpvbmVJREZpbHRlciksXHJcbiAgICB9KTsgLy8gZm9yIGxhdGVyYWwgbWVudVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRHVlVG9DcmVhdGUoY3JlYXRlZEVxdWlwOiBFcXVpcG1lbnQpIHtcclxuICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UudW5zaGlmdChjcmVhdGVkRXF1aXApO1xyXG4gICAgdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcFxyXG4gICAgICAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKVxyXG4gICAgICAudW5zaGlmdChjcmVhdGVkRXF1aXApO1xyXG4gICAgdGhpcy5lcXVpcG1lbnRzVXBkYXRlZC5uZXh0KHtcclxuICAgICAgc3BhY2U6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXHJcbiAgICAgIHpvbmU6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKSxcclxuICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgfVxyXG5cclxuICB1cGRhdGVEdWVUb0VxdWlwVXBkYXRlZCh1cGRhdGVkRXF1aXA6IEVxdWlwbWVudCkge1xyXG4gICAgY29uc3QgZXF1aXAgPSB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzLnNwYWNlLmZpbmQoXHJcbiAgICAgIChfZXF1aXApID0+IF9lcXVpcC5pZCA9PT0gdXBkYXRlZEVxdWlwLmlkXHJcbiAgICApO1xyXG4gICAgaWYgKGVxdWlwKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jdXJyZW50RXF1aXBtZW50cy5zcGFjZS5pbmRleE9mKGVxdWlwKTtcclxuICAgICAgaWYgKHRoaXMuaXNBcmNoaXZlZChlcXVpcCkpIHtcclxuICAgICAgICAvLyB3ZSByZW1vdmUgYXJjaGl2ZWQgZXF1aXBtZW50XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RXF1aXBtZW50cy5zcGFjZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2Uuc3BsaWNlKGluZGV4LCAxLCB1cGRhdGVkRXF1aXApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcC5rZXlzKCkpIHtcclxuICAgICAgY29uc3QgZXF1aXBUb1VwZCA9IHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXBcclxuICAgICAgICAuZ2V0KHpvbmUpXHJcbiAgICAgICAgLmZpbmQoKF9lcXVpcCkgPT4gX2VxdWlwLmlkID09PSB1cGRhdGVkRXF1aXAuaWQpO1xyXG4gICAgICBpZiAoZXF1aXBUb1VwZCkge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jdXJyZW50RXF1aXBtZW50cy56b25lc01hcFxyXG4gICAgICAgICAgLmdldCh6b25lKVxyXG4gICAgICAgICAgLmluZGV4T2YoZXF1aXBUb1VwZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBcmNoaXZlZChlcXVpcCkpIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXAuZ2V0KHpvbmUpLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXBcclxuICAgICAgICAgICAgLmdldCh6b25lKVxyXG4gICAgICAgICAgICAuc3BsaWNlKGluZGV4LCAxLCB1cGRhdGVkRXF1aXApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5lcXVpcG1lbnRzVXBkYXRlZC5uZXh0KHtcclxuICAgICAgc3BhY2U6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuc3BhY2UsXHJcbiAgICAgIHpvbmU6IHRoaXMuY3VycmVudEVxdWlwbWVudHMuem9uZXNNYXAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKSxcclxuICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgfVxyXG5cclxuICBpbml0U3Vic2NyaXB0aW9ucygpIHtcclxuICAgIGlmICghdGhpcy5pc011c2V1bVVzZXIpIHtcclxuICAgICAgdGhpcy56b25lQ2hhbmdlU2VydmljZS56b25lQ2hhbmdlXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHpvbmUpID0+IHtcclxuICAgICAgICAgIGlmICghem9uZSB8fCAhdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnRTcGFjZUlEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNwYWNlSUQgPSB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQ7XHJcbiAgICAgICAgICAgIHRoaXMuZXF1aXBtZW50c1RhZ3MubmV4dChudWxsKTtcclxuICAgICAgICAgICAgdGhpcy5lcXVpcG1lbnRzVXBkYXRlZC5uZXh0KHtzcGFjZTogW10sIHpvbmU6IG51bGx9KTtcclxuICAgICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRFcXVpcG1lbnRzID0ge1xyXG4gICAgICAgICAgICAgIHNwYWNlOiBbXSxcclxuICAgICAgICAgICAgICB6b25lc01hcDogbmV3IE1hcCgpLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoem9uZS5pZCAhPT0gdGhpcy56b25lSURGaWx0ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgPSB6b25lLmlkO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gem9uZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQgPT09IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgICAgIC8vIHNhbWUgc3BhY2UsICBvbmx5IHpvbmUgdXBkYXRlXHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgLy8gICAgIFwiZ29pbmcgdG8gdXBkYXRlIGVxdWlwcyBmb3Igem9uZSAoc2FtZSBzcGFjZSlcIixcclxuICAgICAgICAgICAgICAvLyAgICAgem9uZSxcclxuICAgICAgICAgICAgICAvLyApO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVxdWlwc0ZvclpvbmUoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTcGFjZUlEID0gdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnRTcGFjZUlEO1xyXG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgIC8vICAgICBcImdvaW5nIHRvIGluaXQgZXF1aXBzIGZvciB6b25lIGZvciBuZXcgc3BhY2VcIixcclxuICAgICAgICAgICAgICAvLyAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCxcclxuICAgICAgICAgICAgICAvLyApO1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5pdEVxdWlwcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmRlbGV0ZU9ic2VydmFibGVcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXF1aXBtZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUR1ZVRvRGVsZXRlKGVxdWlwbWVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmNyZWF0ZU9ic2VydmFibGVcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXF1aXBtZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUR1ZVRvQ3JlYXRlKGVxdWlwbWVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGVcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZXF1aXBtZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUR1ZVRvRXF1aXBVcGRhdGVkKGVxdWlwbWVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnN1YnNjcmliZSgpIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIl19
|