@smarterplan/ngx-smarterplan-core 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +24 -0
  2. package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -0
  3. package/esm2020/lib/components/loader/loader.component.mjs +14 -0
  4. package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +75 -0
  5. package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +115 -0
  6. package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +254 -0
  7. package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +81 -0
  8. package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +39 -0
  9. package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -0
  10. package/esm2020/lib/components/support-modal/support-modal.component.mjs +59 -0
  11. package/esm2020/lib/config.mjs +4 -0
  12. package/esm2020/lib/helpers.service.mjs +468 -0
  13. package/esm2020/lib/mattertagData.mjs +177 -0
  14. package/esm2020/lib/ngx-smarterplan-core.module.mjs +117 -0
  15. package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -0
  16. package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -0
  17. package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -0
  18. package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -0
  19. package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -0
  20. package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -0
  21. package/esm2020/lib/services/base-tab.service.mjs +24 -0
  22. package/esm2020/lib/services/baseVisibility.service.mjs +17 -0
  23. package/esm2020/lib/services/booking.service.mjs +161 -0
  24. package/esm2020/lib/services/content.service.mjs +135 -0
  25. package/esm2020/lib/services/filter.service.mjs +560 -0
  26. package/esm2020/lib/services/intervention.service.mjs +236 -0
  27. package/esm2020/lib/services/locale.service.mjs +45 -0
  28. package/esm2020/lib/services/matterport-import.service.mjs +339 -0
  29. package/esm2020/lib/services/matterport.service.mjs +876 -0
  30. package/esm2020/lib/services/models/affectation.service.mjs +60 -0
  31. package/esm2020/lib/services/models/base-object.service.mjs +70 -0
  32. package/esm2020/lib/services/models/capture.service.mjs +34 -0
  33. package/esm2020/lib/services/models/comment.service.mjs +98 -0
  34. package/esm2020/lib/services/models/domain.service.mjs +77 -0
  35. package/esm2020/lib/services/models/equipment.service.mjs +629 -0
  36. package/esm2020/lib/services/models/event.service.mjs +128 -0
  37. package/esm2020/lib/services/models/feature.service.mjs +339 -0
  38. package/esm2020/lib/services/models/hashtag.service.mjs +38 -0
  39. package/esm2020/lib/services/models/layer.service.mjs +33 -0
  40. package/esm2020/lib/services/models/measurement.service.mjs +158 -0
  41. package/esm2020/lib/services/models/mission.service.mjs +185 -0
  42. package/esm2020/lib/services/models/navigation.service.mjs +76 -0
  43. package/esm2020/lib/services/models/node.service.mjs +31 -0
  44. package/esm2020/lib/services/models/operation.service.mjs +59 -0
  45. package/esm2020/lib/services/models/organisation.service.mjs +73 -0
  46. package/esm2020/lib/services/models/plan.service.mjs +573 -0
  47. package/esm2020/lib/services/models/poi.service.mjs +48 -0
  48. package/esm2020/lib/services/models/profile.service.mjs +54 -0
  49. package/esm2020/lib/services/models/property.service.mjs +34 -0
  50. package/esm2020/lib/services/models/space.service.mjs +184 -0
  51. package/esm2020/lib/services/models/template.service.mjs +41 -0
  52. package/esm2020/lib/services/models/ticket.service.mjs +454 -0
  53. package/esm2020/lib/services/models/visit.service.mjs +130 -0
  54. package/esm2020/lib/services/models/zone.service.mjs +184 -0
  55. package/esm2020/lib/services/navigator.service.mjs +165 -0
  56. package/esm2020/lib/services/s3.service.mjs +124 -0
  57. package/esm2020/lib/services/search.service.mjs +124 -0
  58. package/esm2020/lib/services/support.service.mjs +42 -0
  59. package/esm2020/lib/services/tag.service.mjs +101 -0
  60. package/esm2020/lib/services/user.service.mjs +444 -0
  61. package/esm2020/lib/services/viewer.service.mjs +395 -0
  62. package/esm2020/lib/services/zone-drawer.service.mjs +76 -0
  63. package/esm2020/lib/types.service.mjs +266 -0
  64. package/esm2020/public-api.mjs +63 -0
  65. package/esm2020/smarterplan-ngx-smarterplan-core.mjs +5 -0
  66. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +10057 -0
  67. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
  68. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +9371 -0
  69. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
  70. package/lib/components/csv-export/csv-export.component.d.ts +18 -0
  71. package/lib/components/loader/loader.component.d.ts +8 -0
  72. package/lib/components/menu-bar/avatar/avatar.component.d.ts +18 -0
  73. package/lib/components/menu-bar/menu-bar.component.d.ts +35 -0
  74. package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +66 -0
  75. package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +24 -0
  76. package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -0
  77. package/lib/components/search-bar/search-bar.component.d.ts +16 -0
  78. package/lib/components/support-modal/support-modal.component.d.ts +24 -0
  79. package/lib/config.d.ts +17 -0
  80. package/lib/helpers.service.d.ts +79 -0
  81. package/lib/mattertagData.d.ts +65 -0
  82. package/lib/ngx-smarterplan-core.module.d.ts +28 -0
  83. package/lib/ngx-smarterplan-core.service.d.ts +6 -0
  84. package/lib/pipes/duration-to-string.pipe.d.ts +12 -0
  85. package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -0
  86. package/lib/pipes/safe-url.pipe.d.ts +10 -0
  87. package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -0
  88. package/lib/pipes/username-from-id.pipe.d.ts +11 -0
  89. package/lib/services/base-tab.service.d.ts +10 -0
  90. package/lib/services/baseVisibility.service.d.ts +8 -0
  91. package/lib/services/booking.service.d.ts +21 -0
  92. package/lib/services/content.service.d.ts +28 -0
  93. package/lib/services/filter.service.d.ts +58 -0
  94. package/lib/services/intervention.service.d.ts +25 -0
  95. package/lib/services/locale.service.d.ts +23 -0
  96. package/lib/services/matterport-import.service.d.ts +46 -0
  97. package/lib/services/matterport.service.d.ts +141 -0
  98. package/lib/services/models/affectation.service.d.ts +14 -0
  99. package/lib/services/models/base-object.service.d.ts +20 -0
  100. package/lib/services/models/capture.service.d.ts +13 -0
  101. package/lib/services/models/comment.service.d.ts +26 -0
  102. package/lib/services/models/domain.service.d.ts +19 -0
  103. package/lib/services/models/equipment.service.d.ts +88 -0
  104. package/lib/services/models/event.service.d.ts +43 -0
  105. package/lib/services/models/feature.service.d.ts +71 -0
  106. package/lib/services/models/hashtag.service.d.ts +13 -0
  107. package/lib/services/models/layer.service.d.ts +11 -0
  108. package/lib/services/models/measurement.service.d.ts +43 -0
  109. package/lib/services/models/mission.service.d.ts +32 -0
  110. package/lib/services/models/navigation.service.d.ts +22 -0
  111. package/lib/services/models/node.service.d.ts +12 -0
  112. package/lib/services/models/operation.service.d.ts +15 -0
  113. package/lib/services/models/organisation.service.d.ts +19 -0
  114. package/lib/services/models/plan.service.d.ts +117 -0
  115. package/lib/services/models/poi.service.d.ts +15 -0
  116. package/lib/services/models/profile.service.d.ts +15 -0
  117. package/lib/services/models/property.service.d.ts +13 -0
  118. package/lib/services/models/space.service.d.ts +38 -0
  119. package/lib/services/models/template.service.d.ts +15 -0
  120. package/lib/services/models/ticket.service.d.ts +86 -0
  121. package/lib/services/models/visit.service.d.ts +24 -0
  122. package/lib/services/models/zone.service.d.ts +25 -0
  123. package/lib/services/navigator.service.d.ts +55 -0
  124. package/lib/services/s3.service.d.ts +13 -0
  125. package/lib/services/search.service.d.ts +20 -0
  126. package/lib/services/support.service.d.ts +17 -0
  127. package/lib/services/tag.service.d.ts +45 -0
  128. package/lib/services/user.service.d.ts +104 -0
  129. package/lib/services/viewer.service.d.ts +113 -0
  130. package/lib/services/zone-drawer.service.d.ts +7 -0
  131. package/lib/types.service.d.ts +723 -0
  132. package/package.json +41 -0
  133. package/public-api.d.ts +56 -0
  134. package/smarterplan-ngx-smarterplan-core.d.ts +5 -0
@@ -0,0 +1,454 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ /* eslint-disable consistent-return */
3
+ import { Inject, Injectable } from "@angular/core";
4
+ import { Subject } from "rxjs";
5
+ import { openModalForVisitSwitch } from "../../helpers.service";
6
+ import { TicketType, TicketPriority, TicketStatus, EventStatus, EventType, PoiType } from "../../types.service";
7
+ import { BaseObjectService } from "./base-object.service";
8
+ import InformationIcon from "@iconify-icons/mdi/information-outline";
9
+ import AccidentIcon from "@iconify-icons/mdi/alert";
10
+ import WordOrderIcon from "@iconify-icons/mdi/account-hard-hat";
11
+ import ReportingIcon from "@iconify-icons/mdi/file-document-outline";
12
+ import MaintenanceIcon from "@iconify-icons/mdi/tools";
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "./operation.service";
15
+ import * as i2 from "./event.service";
16
+ import * as i3 from "./affectation.service";
17
+ import * as i4 from "./poi.service";
18
+ import * as i5 from "../user.service";
19
+ import * as i6 from "../navigator.service";
20
+ import * as i7 from "../filter.service";
21
+ import * as i8 from "../intervention.service";
22
+ import * as i9 from "./navigation.service";
23
+ import * as i10 from "../viewer.service";
24
+ import * as i11 from "@ng-bootstrap/ng-bootstrap";
25
+ export class TicketsService extends BaseObjectService {
26
+ constructor(apiInjected, operationService, eventService, affectationService, poiService, userService, navigatorService, filterService, interventionService, navigationService, viewerService, modalService) {
27
+ super(poiService, navigationService);
28
+ this.operationService = operationService;
29
+ this.eventService = eventService;
30
+ this.affectationService = affectationService;
31
+ this.userService = userService;
32
+ this.navigatorService = navigatorService;
33
+ this.filterService = filterService;
34
+ this.interventionService = interventionService;
35
+ this.viewerService = viewerService;
36
+ this.modalService = modalService;
37
+ this.currentTickets = {
38
+ zone: [],
39
+ space: [],
40
+ };
41
+ this.ticketTags = new Subject();
42
+ this.ticketsFiltered = [];
43
+ this.ticketsUpdated = new Subject();
44
+ this.reportingIcon = ReportingIcon;
45
+ this.maintenanceIcon = MaintenanceIcon;
46
+ this.workorderIcon = WordOrderIcon;
47
+ this.informationIcon = InformationIcon;
48
+ this.accidentIcon = AccidentIcon;
49
+ this.updateDone = new Subject();
50
+ this.updating = new Subject();
51
+ this.isMuseumUser = false;
52
+ this.API = apiInjected;
53
+ this.isMuseumUser = this.userService.hasOnlyMuseumRole();
54
+ this.initSubscriptions();
55
+ this.userService.isChanged.subscribe((isConnected) => {
56
+ if (isConnected) {
57
+ this.isMuseumUser = this.userService.hasOnlyMuseumRole();
58
+ this.initSubscriptions();
59
+ }
60
+ else {
61
+ if (this.navSubscription) {
62
+ this.navSubscription.unsubscribe();
63
+ this.filetrSubscription.unsubscribe();
64
+ }
65
+ }
66
+ });
67
+ }
68
+ async initTickets() {
69
+ let ticketsFiltered = [];
70
+ if (this.currentSpaceID) {
71
+ this.updating.next(true);
72
+ await this.getTicketsBySpace(this.currentSpaceID).then((tickets) => {
73
+ if (tickets) {
74
+ ticketsFiltered = tickets;
75
+ }
76
+ });
77
+ ticketsFiltered =
78
+ await this.filterService.filterTicketsForCurrentUserInSpace(ticketsFiltered, this.currentSpaceID);
79
+ if (this.dateFilter) {
80
+ ticketsFiltered = this.filterService.filterObjectsForDateRange(ticketsFiltered, this.dateFilter);
81
+ }
82
+ if (this.ticketTypeFilter) {
83
+ ticketsFiltered = ticketsFiltered.filter((ticket) => this.ticketTypeFilter.includes(ticket.type));
84
+ }
85
+ this.currentTickets.space = ticketsFiltered;
86
+ this.ticketTags.next(ticketsFiltered); // tags without zone filter
87
+ if (this.zoneIDFilter) {
88
+ ticketsFiltered = await this.filterService.filterObjectsForZone(ticketsFiltered, this.zoneIDFilter);
89
+ }
90
+ this.currentTickets.zone = ticketsFiltered;
91
+ this.ticketsUpdated.next(this.currentTickets);
92
+ this.updating.next(false);
93
+ }
94
+ else {
95
+ this.ticketTags.next(null);
96
+ }
97
+ }
98
+ async adaptTicket(ticket) {
99
+ if (ticket.comments.items.length > 0) {
100
+ ticket.comments.items.sort((a, b) => {
101
+ // @ts-ignore
102
+ return new Date(b.createdAt) - new Date(a.createdAt);
103
+ });
104
+ }
105
+ if (ticket.events.items.length > 0) {
106
+ // Sort events by date
107
+ ticket.events.items.sort((event1, event2) => {
108
+ // @ts-ignore
109
+ return new Date(event2.createdAt) - new Date(event1.createdAt);
110
+ });
111
+ }
112
+ ticket.prestataire =
113
+ await this.interventionService.getPrestataireForTicket(ticket);
114
+ return ticket;
115
+ }
116
+ getPriorityColor(ticket) {
117
+ switch (ticket.priority) {
118
+ case TicketPriority.MAXIMUM:
119
+ return "crimson";
120
+ case TicketPriority.HIGH:
121
+ return "red";
122
+ case TicketPriority.MEDIUM:
123
+ return "orange";
124
+ case TicketPriority.LOW:
125
+ return "green";
126
+ case TicketPriority.MINIMUM:
127
+ return "blue";
128
+ default:
129
+ return "blue";
130
+ }
131
+ }
132
+ getStatusColor(ticket) {
133
+ switch (ticket.status) {
134
+ case TicketStatus.TO_BE_PROCESSED:
135
+ return "#B0B0B1";
136
+ case TicketStatus.PLANNED:
137
+ return "#EBDF27";
138
+ case TicketStatus.IN_PROGRESS:
139
+ return "#EBDF27";
140
+ case TicketStatus.WAITING_FOR_VALIDATION:
141
+ return "#EBDF27";
142
+ case TicketStatus.VALIDATED:
143
+ return "#BCE2E5";
144
+ case TicketStatus.REJECTED:
145
+ return "#e84c35";
146
+ case TicketStatus.RESOLVED:
147
+ return "#BCE2E5";
148
+ case TicketStatus.ARCHIVED:
149
+ return "#B0B0B1";
150
+ case TicketStatus.LATE:
151
+ return "#e84c35";
152
+ case TicketStatus.BLOCKED:
153
+ return "#e84c35";
154
+ case TicketStatus.COMPLETED:
155
+ return "#388659";
156
+ case TicketStatus.DELAYED:
157
+ return "#DB7543";
158
+ case TicketStatus.CANCELLED:
159
+ return "#e84c35";
160
+ case TicketStatus.TO_REDO:
161
+ return "#DB7543";
162
+ case TicketStatus.CREATED:
163
+ return "#B0B0B1";
164
+ default:
165
+ return "#BCE2E5";
166
+ }
167
+ }
168
+ getTicketPriorityNumber(t) {
169
+ return t.priority === TicketPriority.MINIMUM
170
+ ? -1
171
+ : t.priority === TicketPriority.LOW
172
+ ? 0
173
+ : t.priority === TicketPriority.MEDIUM
174
+ ? 1
175
+ : t.priority === TicketPriority.HIGH
176
+ ? 2
177
+ : t.priority === TicketPriority.MAXIMUM
178
+ ? 3
179
+ : -1;
180
+ }
181
+ getTicketIcon(type) {
182
+ // const typeIcon : TicketType = ticket.type;
183
+ switch (type) {
184
+ case TicketType.REPORTING:
185
+ return this.reportingIcon;
186
+ case TicketType.REQUEST_FOR_INTERVENTION:
187
+ return this.maintenanceIcon;
188
+ case TicketType.REQUEST_FOR_MAINTENANCE:
189
+ return this.maintenanceIcon;
190
+ case TicketType.WORK_ORDER:
191
+ return this.workorderIcon;
192
+ case TicketType.INCIDENT:
193
+ return this.accidentIcon;
194
+ case TicketType.INFORMATION:
195
+ return this.informationIcon;
196
+ default:
197
+ return this.maintenanceIcon;
198
+ }
199
+ }
200
+ async addEventToTicket(ticket, event) {
201
+ const currentMission = this.userService.currentMission(ticket.spaceID);
202
+ event.group = event.group ? event.group : "default";
203
+ event.ticketID = event.ticketID ? event.ticketID : ticket.id;
204
+ event.status = event.status ? event.status : EventStatus.CREATED;
205
+ event.type = event.type ? event.type : EventType.TICKET;
206
+ event.ownerID = event.ownerID ? event.ownerID : currentMission.id;
207
+ try {
208
+ const receivedEvent = await this.eventService.createEvent(event);
209
+ // console.log('Event successfully created !');
210
+ return receivedEvent;
211
+ }
212
+ catch (error) {
213
+ return null;
214
+ }
215
+ }
216
+ async addTicket(ticket) {
217
+ ticket.status = TicketStatus.CREATED;
218
+ if (!ticket.ownerMissionID) {
219
+ ticket.ownerMissionID = this.userService.currentMission(ticket.spaceID).id;
220
+ }
221
+ // TODO!!! filter missions by space of ticket
222
+ try {
223
+ const receivedTicket = await this.createTicket(ticket);
224
+ // console.log('!!! Response from creating ticket :');
225
+ // console.log(receivedTicket);
226
+ this.addEventToTicket(receivedTicket, {
227
+ title: "Création du ticket",
228
+ description: `Ticket créé par -`,
229
+ translationPath: "ticketEvent.ticket.created",
230
+ });
231
+ this.updateDone.next(true);
232
+ return receivedTicket; // instead of true
233
+ }
234
+ catch (error) {
235
+ console.log("Ticket creation FAILED");
236
+ console.log(JSON.stringify(error));
237
+ }
238
+ }
239
+ async updateTicketWithEvent(ticket, event) {
240
+ const receivedTicket = await this.updateTicket(ticket);
241
+ if (receivedTicket) {
242
+ console.log("Updated ticket :");
243
+ console.log(receivedTicket);
244
+ if (event) {
245
+ await this.addEventToTicket(receivedTicket, event);
246
+ }
247
+ this.updateDone.next(true);
248
+ }
249
+ return receivedTicket;
250
+ }
251
+ async removeAssigneeFromTicket(ticket, assignee) {
252
+ try {
253
+ const affectation = await this.affectationService.softDeleteAffectationByID(assignee.id);
254
+ if (!affectation) {
255
+ console.warn(`removeAssigneeFromTicket(${ticket.id}, ${assignee.id}) failed`);
256
+ }
257
+ }
258
+ catch (error) {
259
+ console.error(error);
260
+ }
261
+ return ticket;
262
+ }
263
+ async updateTicketLocation(ticket, tagData) {
264
+ const poiInput = {
265
+ coordinate: tagData.getCoordinateString(),
266
+ type: PoiType.TICKET,
267
+ elementID: ticket.id,
268
+ metadata: tagData.getMetadataString(),
269
+ matterportSweepID: tagData.getSweepID(),
270
+ };
271
+ const poi = await this.poiService.createPOIForSpaceID(poiInput);
272
+ await this.addEventToTicket(ticket, {
273
+ title: "Changement position du ticket",
274
+ description: "Le point d'intérêt du ticket a été modifié",
275
+ status: EventStatus.POSITION_SET,
276
+ translationPath: "ticketEvent.position.set",
277
+ });
278
+ return poi;
279
+ }
280
+ async updateStatusOfTicket(ticket, status) {
281
+ const currentStatus = ticket.status;
282
+ const oldTicketStatus = ticket.status;
283
+ ticket.status = status;
284
+ if (currentStatus === status) {
285
+ return ticket;
286
+ }
287
+ console.log("Updating status");
288
+ return this.updateTicket({
289
+ id: ticket.id,
290
+ status,
291
+ });
292
+ }
293
+ async updateTypeOfTicket(ticket, type) {
294
+ const previousType = ticket.type;
295
+ ticket.type = type;
296
+ await this.updateTicketWithEvent({ id: ticket.id, type: ticket.type }, {
297
+ title: "Type changé",
298
+ description: `Changement de ${previousType} vers ${ticket.type}`,
299
+ metadata: JSON.stringify({ type: ticket.type }),
300
+ translationPath: "ticketEvent.ticket.type",
301
+ });
302
+ return ticket;
303
+ }
304
+ async getTicketsForUserForSpace(spaceID) {
305
+ const ticketsSpace = await this.getTicketsBySpace(spaceID);
306
+ return this.filterService.filterTicketsForCurrentUserInSpace(ticketsSpace, spaceID);
307
+ }
308
+ /** Basic CRUD operations */
309
+ async readTicket(id) {
310
+ return this.API.__proto__.GetTicket(id);
311
+ }
312
+ async createTicket(input) {
313
+ return this.API.__proto__.CreateTicket(input);
314
+ }
315
+ async updateTicket(input) {
316
+ return this.API.__proto__.UpdateTicket(input);
317
+ }
318
+ async deleteTicket(ticket) {
319
+ const deleted = await this.API.__proto__.DeleteTicket({ id: ticket.id });
320
+ // delete POI
321
+ const poi = await this.poiService.getPoiByElementId(ticket.id);
322
+ if (poi) {
323
+ this.poiService.deletePoi(poi.id);
324
+ }
325
+ // clean parentID
326
+ if (ticket.children.items.length > 0) {
327
+ ticket.children.items.map(async (childTicket) => {
328
+ try {
329
+ await this.API.__proto__.UpdateTicket({
330
+ id: childTicket.id,
331
+ parentID: null,
332
+ });
333
+ }
334
+ catch {
335
+ console.warn("Could not update ticket", childTicket.id);
336
+ }
337
+ await this.API.__proto__.CreateEvent({
338
+ title: "Ticket parent supprimé",
339
+ ticketID: childTicket.id,
340
+ description: `Ticket \"$ticket.title}\" a été supprimé`,
341
+ });
342
+ });
343
+ }
344
+ // delete events
345
+ await Promise.all(ticket.events.items.map(async (event_) => {
346
+ await this.API.__proto__.DeleteEvent({ id: event_.id });
347
+ }));
348
+ // delete affectationns
349
+ if (ticket.assignees.items.length > 0) {
350
+ for (const element of ticket.assignees.items) {
351
+ this.API.__proto__.DeleteAffectation({ id: element.id });
352
+ }
353
+ }
354
+ // delete comments
355
+ await Promise.all(ticket.comments.items.map(async (comment) => {
356
+ await this.API.__proto__.DeleteComment({ id: comment.id });
357
+ }));
358
+ await this.operationService.deleteOperationsForTicket(ticket.id);
359
+ return deleted;
360
+ }
361
+ /** Custom requests */
362
+ async getTicketsBySpace(spaceID) {
363
+ return this.API.__proto__.TicketsBySpace(spaceID).then((tickets) => tickets.items);
364
+ }
365
+ async updateIconForAllTicketsInSpace(tagIcon, spaceID) {
366
+ const tickets = await this.getTicketsBySpace(spaceID);
367
+ const pois = await this.updateIconForAllObjects(tickets, tagIcon);
368
+ return { tickets, pois };
369
+ }
370
+ /** Archive related */
371
+ /** Return true if the current user has archived this ticket */
372
+ isArchived(ticket) {
373
+ return ticket.archivedForMissionID
374
+ ? ticket.archivedForMissionID.includes(this.userService.currentMission(ticket.spaceID).id)
375
+ : false;
376
+ }
377
+ setArchived(ticket, archived) {
378
+ let archivedList = ticket.archivedForMissionID
379
+ ? ticket.archivedForMissionID
380
+ : [];
381
+ const missionID = this.userService.currentMission(ticket.spaceID).id;
382
+ archivedList = archivedList.filter((m) => m !== missionID);
383
+ if (archived) {
384
+ archivedList.push(missionID);
385
+ }
386
+ return this.updateTicketWithEvent({
387
+ id: ticket.id,
388
+ archivedForMissionID: archivedList,
389
+ });
390
+ }
391
+ async navigateToTicketIn3D(ticket, forceSwitchVisit = false) {
392
+ let url = `visit/${ticket.spaceID}`;
393
+ if (forceSwitchVisit) {
394
+ url += `/detail/${ticket.id}`;
395
+ }
396
+ const canGoToTag = await this.viewerService.action_move_to_tag(`${ticket.id}`);
397
+ if (canGoToTag) {
398
+ return;
399
+ }
400
+ const result = await this.getModel3dAndSweep(ticket);
401
+ if (!result || !result.model3D) {
402
+ alert("Error while getting virtual visit model");
403
+ return;
404
+ }
405
+ if (!forceSwitchVisit) {
406
+ /** Si on ne force pas la visite, on demande si on veut etre switch */
407
+ openModalForVisitSwitch(this.modalService, result.model3D, ticket.spaceID, { sweepToMove: result.sweep, rotation: result.rotation });
408
+ }
409
+ else {
410
+ /** Si on force le switch de la visit */
411
+ window.open(`${url}?model3D=${result.model3D}&sweep=true`, "_blank");
412
+ }
413
+ }
414
+ initSubscriptions() {
415
+ if (!this.isMuseumUser) {
416
+ this.navSubscription = this.navigatorService.zoneChange.subscribe((zone) => {
417
+ this.currentSpaceID = this.navigatorService.currentSpaceID;
418
+ if (!this.currentSpaceID) {
419
+ this.ticketTags.next(null);
420
+ this.ticketsUpdated.next({ space: [], zone: null });
421
+ this.ticketTypeFilter = null;
422
+ this.zoneIDFilter = null;
423
+ }
424
+ else if (zone.id !== this.zoneIDFilter) {
425
+ this.zoneIDFilter = zone.id;
426
+ // console.log("going to init tickets from zone");
427
+ this.initTickets();
428
+ }
429
+ });
430
+ this.filetrSubscription = this.filterService.subscribeToDataFilterUpdate((dateRange) => {
431
+ this.dateFilter = dateRange;
432
+ this.initTickets();
433
+ });
434
+ this.dateFilter = this.filterService.currentDateFilter;
435
+ this.updateDone.subscribe(() => {
436
+ if (this.currentSpaceID) {
437
+ this.initTickets();
438
+ }
439
+ });
440
+ }
441
+ }
442
+ }
443
+ TicketsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, deps: [{ token: 'currentAPIService' }, { token: i1.OperationService }, { token: i2.EventService }, { token: i3.AffectationService }, { token: i4.PoiService }, { token: i5.BaseUserService }, { token: i6.NavigatorService }, { token: i7.FilterService }, { token: i8.InterventionService }, { token: i9.NavigationService }, { token: i10.ViewerService }, { token: i11.NgbModal }], target: i0.ɵɵFactoryTarget.Injectable });
444
+ TicketsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, providedIn: "root" });
445
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, decorators: [{
446
+ type: Injectable,
447
+ args: [{
448
+ providedIn: "root",
449
+ }]
450
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
451
+ type: Inject,
452
+ args: ['currentAPIService']
453
+ }] }, { type: i1.OperationService }, { type: i2.EventService }, { type: i3.AffectationService }, { type: i4.PoiService }, { type: i5.BaseUserService }, { type: i6.NavigatorService }, { type: i7.FilterService }, { type: i8.InterventionService }, { type: i9.NavigationService }, { type: i10.ViewerService }, { type: i11.NgbModal }]; } });
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21vZGVscy90aWNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0Msc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhFLE9BQU8sRUFBaUIsVUFBVSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBb0IsT0FBTyxFQUFXLE1BQU0scUJBQXFCLENBQUM7QUFLMUosT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJMUQsT0FBTyxlQUFlLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxhQUFhLE1BQU0scUNBQXFDLENBQUM7QUFDaEUsT0FBTyxhQUFhLE1BQU0sMENBQTBDLENBQUM7QUFDckUsT0FBTyxlQUFlLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFTdkQsTUFBTSxPQUFPLGNBQWUsU0FBUSxpQkFBaUI7SUE2Q2pELFlBQ2lDLFdBQWdCLEVBQ3JDLGdCQUFrQyxFQUNsQyxZQUEwQixFQUMxQixrQkFBc0MsRUFDOUMsVUFBc0IsRUFDZCxXQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ2hELGlCQUFvQyxFQUM1QixhQUE0QixFQUM1QixZQUFzQjtRQUU5QixLQUFLLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFaN0Is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QVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzNCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUN0QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDOzsyR0F4aEJRLGNBQWMsa0JBOENYLG1CQUFtQjsrR0E5Q3RCLGNBQWMsY0FGWCxNQUFNOzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkErQ1EsTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXHJcbi8qIGVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IG9wZW5Nb2RhbEZvclZpc2l0U3dpdGNoIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNYXR0ZXJ0YWdEYXRhIH0gZnJvbSBcIi4uLy4uL21hdHRlcnRhZ0RhdGFcIjtcclxuaW1wb3J0IHsgRXZlbnQsIFRpY2tldCwgVGlja2V0VHlwZSwgVGlja2V0UHJpb3JpdHksIFRpY2tldFN0YXR1cywgRXZlbnRTdGF0dXMsIEV2ZW50VHlwZSwgQWZmZWN0YXRpb24sIFBPSSwgUG9pVHlwZSwgSVVwZGF0ZSB9IGZyb20gXCIuLi8uLi90eXBlcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tIFwiLi4vZmlsdGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gXCIuLi9uYXZpZ2F0b3Iuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFZpZXdlclNlcnZpY2UgfSBmcm9tIFwiLi4vdmlld2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZU9iamVjdFNlcnZpY2UgfSBmcm9tIFwiLi9iYXNlLW9iamVjdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vbmF2aWdhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9vcGVyYXRpb24uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb2lTZXJ2aWNlIH0gZnJvbSBcIi4vcG9pLnNlcnZpY2VcIjtcclxuaW1wb3J0IEluZm9ybWF0aW9uSWNvbiBmcm9tIFwiQGljb25pZnktaWNvbnMvbWRpL2luZm9ybWF0aW9uLW91dGxpbmVcIjtcclxuaW1wb3J0IEFjY2lkZW50SWNvbiBmcm9tIFwiQGljb25pZnktaWNvbnMvbWRpL2FsZXJ0XCI7XHJcbmltcG9ydCBXb3JkT3JkZXJJY29uIGZyb20gXCJAaWNvbmlmeS1pY29ucy9tZGkvYWNjb3VudC1oYXJkLWhhdFwiO1xyXG5pbXBvcnQgUmVwb3J0aW5nSWNvbiBmcm9tIFwiQGljb25pZnktaWNvbnMvbWRpL2ZpbGUtZG9jdW1lbnQtb3V0bGluZVwiO1xyXG5pbXBvcnQgTWFpbnRlbmFuY2VJY29uIGZyb20gXCJAaWNvbmlmeS1pY29ucy9tZGkvdG9vbHNcIjtcclxuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSBcIi4vZXZlbnQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBJbnRlcnZlbnRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL2ludGVydmVudGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFmZmVjdGF0aW9uU2VydmljZSB9IGZyb20gXCIuL2FmZmVjdGF0aW9uLnNlcnZpY2VcIjtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpY2tldHNTZXJ2aWNlIGV4dGVuZHMgQmFzZU9iamVjdFNlcnZpY2Uge1xyXG4gICAgY3VycmVudFRpY2tldHM6IHsgem9uZTogVGlja2V0W107IHNwYWNlOiBUaWNrZXRbXSB9ID0ge1xyXG4gICAgICAgIHpvbmU6IFtdLFxyXG4gICAgICAgIHNwYWNlOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgdGlja2V0VGFnczogU3ViamVjdDxUaWNrZXRbXT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIHRpY2tldHNGaWx0ZXJlZDogVGlja2V0W10gPSBbXTtcclxuXHJcbiAgICB0aWNrZXRzVXBkYXRlZDogU3ViamVjdDx7XHJcbiAgICAgICAgem9uZTogVGlja2V0W107XHJcbiAgICAgICAgc3BhY2U6IFRpY2tldFtdO1xyXG4gICAgfT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gICAgem9uZUlERmlsdGVyOiBzdHJpbmc7XHJcblxyXG4gICAgZGF0ZUZpbHRlcjogRGF0ZVtdO1xyXG5cclxuICAgIHRpY2tldFR5cGVGaWx0ZXI6IFRpY2tldFR5cGVbXTtcclxuXHJcbiAgICByZXBvcnRpbmdJY29uID0gUmVwb3J0aW5nSWNvbjtcclxuXHJcbiAgICBtYWludGVuYW5jZUljb24gPSBNYWludGVuYW5jZUljb247XHJcblxyXG4gICAgd29ya29yZGVySWNvbiA9IFdvcmRPcmRlckljb247XHJcblxyXG4gICAgaW5mb3JtYXRpb25JY29uID0gSW5mb3JtYXRpb25JY29uO1xyXG5cclxuICAgIGFjY2lkZW50SWNvbiA9IEFjY2lkZW50SWNvbjtcclxuXHJcbiAgICB1cGRhdGVEb25lOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgICB1cGRhdGluZzogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gICAgQVBJOiBhbnk7XHJcblxyXG4gICAgaXNNdXNldW1Vc2VyID0gZmFsc2U7XHJcblxyXG4gICAgbmF2U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgZmlsZXRyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdCgnY3VycmVudEFQSVNlcnZpY2UnKSBhcGlJbmplY3RlZDogYW55LFxyXG4gICAgICAgIHByaXZhdGUgb3BlcmF0aW9uU2VydmljZTogT3BlcmF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYWZmZWN0YXRpb25TZXJ2aWNlOiBBZmZlY3RhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcG9pU2VydmljZTogUG9pU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGludGVydmVudGlvblNlcnZpY2U6IEludGVydmVudGlvblNlcnZpY2UsXHJcbiAgICAgICAgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihwb2lTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcclxuICAgICAgICB0aGlzLmlzTXVzZXVtVXNlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzT25seU11c2V1bVJvbGUoKTtcclxuICAgICAgICB0aGlzLmluaXRTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmF2U3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGV0clN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdFRpY2tldHMoKSB7XHJcbiAgICAgICAgbGV0IHRpY2tldHNGaWx0ZXJlZCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUaWNrZXRzQnlTcGFjZSh0aGlzLmN1cnJlbnRTcGFjZUlEKS50aGVuKFxyXG4gICAgICAgICAgICAgICAgKHRpY2tldHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQgPSB0aWNrZXRzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyVGlja2V0c0ZvckN1cnJlbnRVc2VySW5TcGFjZShcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCA9IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJPYmplY3RzRm9yRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXIsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpY2tldFR5cGVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCA9IHRpY2tldHNGaWx0ZXJlZC5maWx0ZXIoKHRpY2tldCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tldFR5cGVGaWx0ZXIuaW5jbHVkZXModGlja2V0LnR5cGUpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUaWNrZXRzLnNwYWNlID0gdGlja2V0c0ZpbHRlcmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRpY2tldFRhZ3MubmV4dCh0aWNrZXRzRmlsdGVyZWQpOyAvLyB0YWdzIHdpdGhvdXQgem9uZSBmaWx0ZXJcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnpvbmVJREZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgdGlja2V0c0ZpbHRlcmVkID0gYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3Jab25lKFxyXG4gICAgICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlcixcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGlja2V0cy56b25lID0gdGlja2V0c0ZpbHRlcmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRpY2tldHNVcGRhdGVkLm5leHQodGhpcy5jdXJyZW50VGlja2V0cyk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50aWNrZXRUYWdzLm5leHQobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGFkYXB0VGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICBpZiAodGlja2V0LmNvbW1lbnRzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGlja2V0LmNvbW1lbnRzLml0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShiLmNyZWF0ZWRBdCkgLSBuZXcgRGF0ZShhLmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpY2tldC5ldmVudHMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBTb3J0IGV2ZW50cyBieSBkYXRlXHJcbiAgICAgICAgICAgIHRpY2tldC5ldmVudHMuaXRlbXMuc29ydCgoZXZlbnQxLCBldmVudDIpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShldmVudDIuY3JlYXRlZEF0KSAtIG5ldyBEYXRlKGV2ZW50MS5jcmVhdGVkQXQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGlja2V0LnByZXN0YXRhaXJlID1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnRlcnZlbnRpb25TZXJ2aWNlLmdldFByZXN0YXRhaXJlRm9yVGlja2V0KHRpY2tldCk7XHJcbiAgICAgICAgcmV0dXJuIHRpY2tldDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmlvcml0eUNvbG9yKHRpY2tldDogVGlja2V0KTogc3RyaW5nIHtcclxuICAgICAgICBzd2l0Y2ggKHRpY2tldC5wcmlvcml0eSkge1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFByaW9yaXR5Lk1BWElNVU06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjcmltc29uXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0UHJpb3JpdHkuSElHSDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInJlZFwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFByaW9yaXR5Lk1FRElVTTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9yYW5nZVwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFByaW9yaXR5LkxPVzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImdyZWVuXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0UHJpb3JpdHkuTUlOSU1VTTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImJsdWVcIjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImJsdWVcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdHVzQ29sb3IodGlja2V0OiBUaWNrZXQpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGlja2V0LnN0YXR1cykge1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5UT19CRV9QUk9DRVNTRUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjQjBCMEIxXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlBMQU5ORUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjRUJERjI3XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLklOX1BST0dSRVNTOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0VCREYyN1wiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5XQUlUSU5HX0ZPUl9WQUxJREFUSU9OOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0VCREYyN1wiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5WQUxJREFURUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjQkNFMkU1XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlJFSkVDVEVEOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI2U4NGMzNVwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5SRVNPTFZFRDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIiNCQ0UyRTVcIjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQVJDSElWRUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjQjBCMEIxXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkxBVEU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjZTg0YzM1XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkJMT0NLRUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjZTg0YzM1XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkNPTVBMRVRFRDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIiMzODg2NTlcIjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuREVMQVlFRDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIiNEQjc1NDNcIjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQ0FOQ0VMTEVEOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI2U4NGMzNVwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5UT19SRURPOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0RCNzU0M1wiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5DUkVBVEVEOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0IwQjBCMVwiO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0JDRTJFNVwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUaWNrZXRQcmlvcml0eU51bWJlcih0KTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdC5wcmlvcml0eSA9PT0gVGlja2V0UHJpb3JpdHkuTUlOSU1VTVxyXG4gICAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICAgIDogdC5wcmlvcml0eSA9PT0gVGlja2V0UHJpb3JpdHkuTE9XXHJcbiAgICAgICAgICAgID8gMFxyXG4gICAgICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1FRElVTVxyXG4gICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgOiB0LnByaW9yaXR5ID09PSBUaWNrZXRQcmlvcml0eS5ISUdIXHJcbiAgICAgICAgICAgID8gMlxyXG4gICAgICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1BWElNVU1cclxuICAgICAgICAgICAgPyAzXHJcbiAgICAgICAgICAgIDogLTE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGlja2V0SWNvbih0eXBlOiBUaWNrZXRUeXBlKTogYW55IHtcclxuICAgICAgICAvLyBjb25zdCB0eXBlSWNvbiA6IFRpY2tldFR5cGUgPSB0aWNrZXQudHlwZTtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRUeXBlLlJFUE9SVElORzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydGluZ0ljb247XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0VHlwZS5SRVFVRVNUX0ZPUl9JTlRFUlZFTlRJT046XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWludGVuYW5jZUljb247XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0VHlwZS5SRVFVRVNUX0ZPUl9NQUlOVEVOQU5DRTpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW50ZW5hbmNlSWNvbjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRUeXBlLldPUktfT1JERVI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53b3Jrb3JkZXJJY29uO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFR5cGUuSU5DSURFTlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY2NpZGVudEljb247XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0VHlwZS5JTkZPUk1BVElPTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluZm9ybWF0aW9uSWNvbjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW50ZW5hbmNlSWNvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkRXZlbnRUb1RpY2tldCh0aWNrZXQ6IFRpY2tldCwgZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxFdmVudD4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0aWNrZXQuc3BhY2VJRCk7XHJcbiAgICAgICAgZXZlbnQuZ3JvdXAgPSBldmVudC5ncm91cCA/IGV2ZW50Lmdyb3VwIDogXCJkZWZhdWx0XCI7XHJcbiAgICAgICAgZXZlbnQudGlja2V0SUQgPSBldmVudC50aWNrZXRJRCA/IGV2ZW50LnRpY2tldElEIDogdGlja2V0LmlkO1xyXG4gICAgICAgIGV2ZW50LnN0YXR1cyA9IGV2ZW50LnN0YXR1cyA/IGV2ZW50LnN0YXR1cyA6IEV2ZW50U3RhdHVzLkNSRUFURUQ7XHJcbiAgICAgICAgZXZlbnQudHlwZSA9IGV2ZW50LnR5cGUgPyBldmVudC50eXBlIDogRXZlbnRUeXBlLlRJQ0tFVDtcclxuICAgICAgICBldmVudC5vd25lcklEID0gZXZlbnQub3duZXJJRCA/IGV2ZW50Lm93bmVySUQgOiBjdXJyZW50TWlzc2lvbi5pZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZEV2ZW50ID0gYXdhaXQgdGhpcy5ldmVudFNlcnZpY2UuY3JlYXRlRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnRXZlbnQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgIScpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVjZWl2ZWRFdmVudDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkVGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQgfCB2b2lkPiB7XHJcbiAgICAgICAgdGlja2V0LnN0YXR1cyA9IFRpY2tldFN0YXR1cy5DUkVBVEVEO1xyXG4gICAgICAgIGlmICghdGlja2V0Lm93bmVyTWlzc2lvbklEKSB7XHJcbiAgICAgICAgICAgIHRpY2tldC5vd25lck1pc3Npb25JRCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oXHJcbiAgICAgICAgICAgICAgICB0aWNrZXQuc3BhY2VJRCxcclxuICAgICAgICAgICAgKS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETyEhISBmaWx0ZXIgbWlzc2lvbnMgYnkgc3BhY2Ugb2YgdGlja2V0XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcmVjZWl2ZWRUaWNrZXQgPSBhd2FpdCB0aGlzLmNyZWF0ZVRpY2tldCh0aWNrZXQpO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnISEhIFJlc3BvbnNlIGZyb20gY3JlYXRpbmcgdGlja2V0IDonKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVjZWl2ZWRUaWNrZXQpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50VG9UaWNrZXQocmVjZWl2ZWRUaWNrZXQsIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkNyw6lhdGlvbiBkdSB0aWNrZXRcIixcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVGlja2V0IGNyw6nDqSBwYXIgLWAsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvblBhdGg6IFwidGlja2V0RXZlbnQudGlja2V0LmNyZWF0ZWRcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVjZWl2ZWRUaWNrZXQ7IC8vIGluc3RlYWQgb2YgdHJ1ZVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGlja2V0IGNyZWF0aW9uIEZBSUxFRFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVGlja2V0V2l0aEV2ZW50KFxyXG4gICAgICAgIHRpY2tldDogSVVwZGF0ZSAmIFBhcnRpYWw8VGlja2V0PixcclxuICAgICAgICBldmVudD86IEV2ZW50LFxyXG4gICAgKTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICBjb25zdCByZWNlaXZlZFRpY2tldCA9IGF3YWl0IHRoaXMudXBkYXRlVGlja2V0KHRpY2tldCk7XHJcbiAgICAgICAgaWYgKHJlY2VpdmVkVGlja2V0KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXBkYXRlZCB0aWNrZXQgOlwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVjZWl2ZWRUaWNrZXQpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkRXZlbnRUb1RpY2tldChyZWNlaXZlZFRpY2tldCwgZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVjZWl2ZWRUaWNrZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVtb3ZlQXNzaWduZWVGcm9tVGlja2V0KFxyXG4gICAgICAgIHRpY2tldDogVGlja2V0LFxyXG4gICAgICAgIGFzc2lnbmVlOiBBZmZlY3RhdGlvbixcclxuICAgICk6IFByb21pc2U8VGlja2V0PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgYWZmZWN0YXRpb24gPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZmZlY3RhdGlvblNlcnZpY2Uuc29mdERlbGV0ZUFmZmVjdGF0aW9uQnlJRChcclxuICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZS5pZCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICghYWZmZWN0YXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgICAgICAgICBgcmVtb3ZlQXNzaWduZWVGcm9tVGlja2V0KCR7dGlja2V0LmlkfSwgJHthc3NpZ25lZS5pZH0pIGZhaWxlZGAsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aWNrZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVGlja2V0TG9jYXRpb24oXHJcbiAgICAgICAgdGlja2V0OiBUaWNrZXQsXHJcbiAgICAgICAgdGFnRGF0YTogTWF0dGVydGFnRGF0YVxyXG4gICAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgICAgICBjb25zdCBwb2lJbnB1dCA9IHtcclxuICAgICAgICAgICAgY29vcmRpbmF0ZTogdGFnRGF0YS5nZXRDb29yZGluYXRlU3RyaW5nKCksXHJcbiAgICAgICAgICAgIHR5cGU6IFBvaVR5cGUuVElDS0VULFxyXG4gICAgICAgICAgICBlbGVtZW50SUQ6IHRpY2tldC5pZCxcclxuICAgICAgICAgICAgbWV0YWRhdGE6IHRhZ0RhdGEuZ2V0TWV0YWRhdGFTdHJpbmcoKSxcclxuICAgICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhZ0RhdGEuZ2V0U3dlZXBJRCgpLFxyXG4gICAgICAgIH0gYXMgUE9JO1xyXG4gICAgICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5jcmVhdGVQT0lGb3JTcGFjZUlEKHBvaUlucHV0KTtcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZEV2ZW50VG9UaWNrZXQodGlja2V0LCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkNoYW5nZW1lbnQgcG9zaXRpb24gZHUgdGlja2V0XCIsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkxlIHBvaW50IGQnaW50w6lyw6p0IGR1IHRpY2tldCBhIMOpdMOpIG1vZGlmacOpXCIsXHJcbiAgICAgICAgICAgIHN0YXR1czogRXZlbnRTdGF0dXMuUE9TSVRJT05fU0VULFxyXG4gICAgICAgICAgICB0cmFuc2xhdGlvblBhdGg6IFwidGlja2V0RXZlbnQucG9zaXRpb24uc2V0XCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHBvaTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVTdGF0dXNPZlRpY2tldChcclxuICAgICAgICB0aWNrZXQ6IFRpY2tldCxcclxuICAgICAgICBzdGF0dXM6IFRpY2tldFN0YXR1cyxcclxuICAgICk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXR1cyA9IHRpY2tldC5zdGF0dXM7XHJcbiAgICAgICAgY29uc3Qgb2xkVGlja2V0U3RhdHVzID0gdGlja2V0LnN0YXR1cztcclxuICAgICAgICB0aWNrZXQuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIGlmIChjdXJyZW50U3RhdHVzID09PSBzdGF0dXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRpY2tldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJVcGRhdGluZyBzdGF0dXNcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlVGlja2V0KHtcclxuICAgICAgICAgICAgaWQ6IHRpY2tldC5pZCxcclxuICAgICAgICAgICAgc3RhdHVzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZVR5cGVPZlRpY2tldCh0aWNrZXQ6IFRpY2tldCwgdHlwZTogVGlja2V0VHlwZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNUeXBlID0gdGlja2V0LnR5cGU7XHJcbiAgICAgICAgdGlja2V0LnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVGlja2V0V2l0aEV2ZW50KFxyXG4gICAgICAgICAgICB7IGlkOiB0aWNrZXQuaWQsIHR5cGU6IHRpY2tldC50eXBlIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIlR5cGUgY2hhbmfDqVwiLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDaGFuZ2VtZW50IGRlICR7cHJldmlvdXNUeXBlfSB2ZXJzICR7dGlja2V0LnR5cGV9YCxcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6IHRpY2tldC50eXBlIH0pLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25QYXRoOiBcInRpY2tldEV2ZW50LnRpY2tldC50eXBlXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGlja2V0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFRpY2tldHNGb3JVc2VyRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxUaWNrZXRbXT4ge1xyXG4gICAgICAgIGNvbnN0IHRpY2tldHNTcGFjZSA9IGF3YWl0IHRoaXMuZ2V0VGlja2V0c0J5U3BhY2Uoc3BhY2VJRCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJUaWNrZXRzRm9yQ3VycmVudFVzZXJJblNwYWNlKFxyXG4gICAgICAgICAgICB0aWNrZXRzU3BhY2UsXHJcbiAgICAgICAgICAgIHNwYWNlSUQsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIEJhc2ljIENSVUQgb3BlcmF0aW9ucyAqL1xyXG4gICAgYXN5bmMgcmVhZFRpY2tldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5HZXRUaWNrZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNyZWF0ZVRpY2tldChpbnB1dDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkNyZWF0ZVRpY2tldChpbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVGlja2V0KGlucHV0OiBJVXBkYXRlICYgUGFydGlhbDxUaWNrZXQ+KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLlVwZGF0ZVRpY2tldChpbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlVGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZVRpY2tldCh7IGlkOiB0aWNrZXQuaWQgfSk7XHJcblxyXG4gICAgICAgIC8vIGRlbGV0ZSBQT0lcclxuICAgICAgICBjb25zdCBwb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pQnlFbGVtZW50SWQodGlja2V0LmlkKTtcclxuICAgICAgICBpZiAocG9pKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9pU2VydmljZS5kZWxldGVQb2kocG9pLmlkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNsZWFuIHBhcmVudElEXHJcbiAgICAgICAgaWYgKHRpY2tldC5jaGlsZHJlbi5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRpY2tldC5jaGlsZHJlbi5pdGVtcy5tYXAoYXN5bmMgKGNoaWxkVGlja2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5VcGRhdGVUaWNrZXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogY2hpbGRUaWNrZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElEOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHVwZGF0ZSB0aWNrZXRcIiwgY2hpbGRUaWNrZXQuaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVFdmVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiVGlja2V0IHBhcmVudCBzdXBwcmltw6lcIixcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRJRDogY2hpbGRUaWNrZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBUaWNrZXQgXFxcIiR0aWNrZXQudGl0bGV9XFxcIiBhIMOpdMOpIHN1cHByaW3DqWAsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRlbGV0ZSBldmVudHNcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgdGlja2V0LmV2ZW50cy5pdGVtcy5tYXAoYXN5bmMgKGV2ZW50XykgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZUV2ZW50KHsgaWQ6IGV2ZW50Xy5pZCB9KTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBkZWxldGUgYWZmZWN0YXRpb25uc1xyXG4gICAgICAgIGlmICh0aWNrZXQuYXNzaWduZWVzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRpY2tldC5hc3NpZ25lZXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQVBJLl9fcHJvdG9fXy5EZWxldGVBZmZlY3RhdGlvbih7IGlkOiBlbGVtZW50LmlkIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRlbGV0ZSBjb21tZW50c1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICB0aWNrZXQuY29tbWVudHMuaXRlbXMubWFwKGFzeW5jIChjb21tZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlQ29tbWVudCh7IGlkOiBjb21tZW50LmlkIH0pO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS5kZWxldGVPcGVyYXRpb25zRm9yVGlja2V0KHRpY2tldC5pZCk7XHJcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEN1c3RvbSByZXF1ZXN0cyAqL1xyXG4gICAgYXN5bmMgZ2V0VGlja2V0c0J5U3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxUaWNrZXRbXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uVGlja2V0c0J5U3BhY2Uoc3BhY2VJRCkudGhlbihcclxuICAgICAgICAgICAgKHRpY2tldHMpID0+IHRpY2tldHMuaXRlbXMsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVJY29uRm9yQWxsVGlja2V0c0luU3BhY2UoXHJcbiAgICAgICAgdGFnSWNvbjogc3RyaW5nLFxyXG4gICAgICAgIHNwYWNlSUQ6IHN0cmluZyxcclxuICAgICk6IFByb21pc2U8eyB0aWNrZXRzOiBUaWNrZXRbXTsgcG9pczogUE9JW10gfT4ge1xyXG4gICAgICAgIGNvbnN0IHRpY2tldHMgPSBhd2FpdCB0aGlzLmdldFRpY2tldHNCeVNwYWNlKHNwYWNlSUQpO1xyXG4gICAgICAgIGNvbnN0IHBvaXMgPSBhd2FpdCB0aGlzLnVwZGF0ZUljb25Gb3JBbGxPYmplY3RzKHRpY2tldHMsIHRhZ0ljb24pO1xyXG4gICAgICAgIHJldHVybiB7IHRpY2tldHMsIHBvaXMgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQXJjaGl2ZSByZWxhdGVkICovXHJcbiAgICAvKiogUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgYXJjaGl2ZWQgdGhpcyB0aWNrZXQgKi9cclxuICAgIGlzQXJjaGl2ZWQodGlja2V0OiBUaWNrZXQpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklEXHJcbiAgICAgICAgICAgID8gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklELmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKHRpY2tldC5zcGFjZUlEKS5pZCxcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QXJjaGl2ZWQodGlja2V0OiBUaWNrZXQsIGFyY2hpdmVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IGFyY2hpdmVkTGlzdCA9IHRpY2tldC5hcmNoaXZlZEZvck1pc3Npb25JRFxyXG4gICAgICAgICAgICA/IHRpY2tldC5hcmNoaXZlZEZvck1pc3Npb25JRFxyXG4gICAgICAgICAgICA6IFtdO1xyXG4gICAgICAgIGNvbnN0IG1pc3Npb25JRCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGlja2V0LnNwYWNlSUQpLmlkO1xyXG5cclxuICAgICAgICBhcmNoaXZlZExpc3QgPSBhcmNoaXZlZExpc3QuZmlsdGVyKChtKSA9PiBtICE9PSBtaXNzaW9uSUQpO1xyXG5cclxuICAgICAgICBpZiAoYXJjaGl2ZWQpIHtcclxuICAgICAgICAgICAgYXJjaGl2ZWRMaXN0LnB1c2gobWlzc2lvbklEKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVRpY2tldFdpdGhFdmVudCh7XHJcbiAgICAgICAgICAgIGlkOiB0aWNrZXQuaWQsXHJcbiAgICAgICAgICAgIGFyY2hpdmVkRm9yTWlzc2lvbklEOiBhcmNoaXZlZExpc3QsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbmF2aWdhdGVUb1RpY2tldEluM0QoXHJcbiAgICAgICAgdGlja2V0OiBUaWNrZXQsXHJcbiAgICAgICAgZm9yY2VTd2l0Y2hWaXNpdDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgbGV0IHVybCA9IGB2aXNpdC8ke3RpY2tldC5zcGFjZUlEfWA7XHJcbiAgICAgICAgaWYgKGZvcmNlU3dpdGNoVmlzaXQpIHtcclxuICAgICAgICAgICAgdXJsICs9IGAvZGV0YWlsLyR7dGlja2V0LmlkfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhbkdvVG9UYWcgPSBhd2FpdCB0aGlzLnZpZXdlclNlcnZpY2UuYWN0aW9uX21vdmVfdG9fdGFnKFxyXG4gICAgICAgICAgICBgJHt0aWNrZXQuaWR9YCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjYW5Hb1RvVGFnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRNb2RlbDNkQW5kU3dlZXAodGlja2V0KTtcclxuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0Lm1vZGVsM0QpIHtcclxuICAgICAgICAgICAgYWxlcnQoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHZpcnR1YWwgdmlzaXQgbW9kZWxcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmb3JjZVN3aXRjaFZpc2l0KSB7XHJcbiAgICAgICAgICAgIC8qKiBTaSBvbiBuZSBmb3JjZSBwYXMgbGEgdmlzaXRlLCBvbiBkZW1hbmRlIHNpIG9uIHZldXQgZXRyZSBzd2l0Y2ggKi9cclxuICAgICAgICAgICAgb3Blbk1vZGFsRm9yVmlzaXRTd2l0Y2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RlbDNELFxyXG4gICAgICAgICAgICAgICAgdGlja2V0LnNwYWNlSUQsXHJcbiAgICAgICAgICAgICAgICB7IHN3ZWVwVG9Nb3ZlOiByZXN1bHQuc3dlZXAsIHJvdGF0aW9uOiByZXN1bHQucm90YXRpb24gfSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKiogU2kgb24gZm9yY2UgbGUgc3dpdGNoIGRlIGxhIHZpc2l0ICovXHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKFxyXG4gICAgICAgICAgICAgICAgYCR7dXJsfT9tb2RlbDNEPSR7cmVzdWx0Lm1vZGVsM0R9JnN3ZWVwPXRydWVgLFxyXG4gICAgICAgICAgICAgICAgXCJfYmxhbmtcIixcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFN1YnNjcmlwdGlvbnMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTXVzZXVtVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLm5hdlN1YnNjcmlwdGlvbiA9IHRoaXMubmF2aWdhdG9yU2VydmljZS56b25lQ2hhbmdlLnN1YnNjcmliZSgoem9uZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCA9IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRDtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlja2V0VGFncy5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlja2V0c1VwZGF0ZWQubmV4dCh7IHNwYWNlOiBbXSwgem9uZTogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tldFR5cGVGaWx0ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZUlERmlsdGVyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoem9uZS5pZCAhPT0gdGhpcy56b25lSURGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlciA9IHpvbmUuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJnb2luZyB0byBpbml0IHRpY2tldHMgZnJvbSB6b25lXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFRpY2tldHMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZXRyU3Vic2NyaXB0aW9uID0gdGhpcy5maWx0ZXJTZXJ2aWNlLnN1YnNjcmliZVRvRGF0YUZpbHRlclVwZGF0ZSgoZGF0ZVJhbmdlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXIgPSBkYXRlUmFuZ2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRUaWNrZXRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXIgPSB0aGlzLmZpbHRlclNlcnZpY2UuY3VycmVudERhdGVGaWx0ZXI7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9uZS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRUaWNrZXRzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=