@smarterplan/ngx-smarterplan-core 1.2.39 → 1.2.45

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 (170) hide show
  1. package/README.md +24 -24
  2. package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -59
  3. package/esm2020/lib/components/loader/loader.component.mjs +23 -23
  4. package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +80 -80
  5. package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +99 -99
  6. package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +384 -384
  7. package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +147 -147
  8. package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +40 -40
  9. package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -63
  10. package/esm2020/lib/components/support-modal/support-modal.component.mjs +66 -66
  11. package/esm2020/lib/config.mjs +4 -4
  12. package/esm2020/lib/helpers.service.mjs +470 -470
  13. package/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +69 -69
  14. package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +51 -51
  15. package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +61 -61
  16. package/esm2020/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +158 -158
  17. package/esm2020/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +85 -85
  18. package/esm2020/lib/matterport-extensions/scene-component/SceneComponent.mjs +128 -128
  19. package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +249 -249
  20. package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +98 -98
  21. package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +64 -64
  22. package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +221 -221
  23. package/esm2020/lib/mattertagData.mjs +165 -165
  24. package/esm2020/lib/ngx-smarterplan-core.module.mjs +122 -122
  25. package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -14
  26. package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -66
  27. package/esm2020/lib/pipes/format-date-number-to-digits.pipe.mjs +30 -30
  28. package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -26
  29. package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -20
  30. package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -104
  31. package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -29
  32. package/esm2020/lib/services/amplify-cache.service.mjs +72 -72
  33. package/esm2020/lib/services/base-tab.service.mjs +24 -24
  34. package/esm2020/lib/services/baseVisibility.service.mjs +18 -18
  35. package/esm2020/lib/services/content.service.mjs +135 -135
  36. package/esm2020/lib/services/filter.service.mjs +599 -599
  37. package/esm2020/lib/services/intervention.service.mjs +236 -236
  38. package/esm2020/lib/services/locale.service.mjs +45 -45
  39. package/esm2020/lib/services/matterport-import.service.mjs +340 -340
  40. package/esm2020/lib/services/matterport.service.mjs +1587 -1587
  41. package/esm2020/lib/services/models/affectation.service.mjs +60 -60
  42. package/esm2020/lib/services/models/base-object.service.mjs +70 -70
  43. package/esm2020/lib/services/models/capture.service.mjs +34 -34
  44. package/esm2020/lib/services/models/comment.service.mjs +98 -98
  45. package/esm2020/lib/services/models/domain.service.mjs +78 -78
  46. package/esm2020/lib/services/models/equipment.service.mjs +683 -683
  47. package/esm2020/lib/services/models/event.service.mjs +128 -128
  48. package/esm2020/lib/services/models/feature.service.mjs +380 -364
  49. package/esm2020/lib/services/models/hashtag.service.mjs +38 -38
  50. package/esm2020/lib/services/models/layer.service.mjs +33 -33
  51. package/esm2020/lib/services/models/measurement.service.mjs +199 -199
  52. package/esm2020/lib/services/models/mission.service.mjs +206 -206
  53. package/esm2020/lib/services/models/navigation.service.mjs +92 -92
  54. package/esm2020/lib/services/models/node.service.mjs +31 -31
  55. package/esm2020/lib/services/models/object3D.service.mjs +364 -364
  56. package/esm2020/lib/services/models/operation.service.mjs +59 -59
  57. package/esm2020/lib/services/models/organisation.service.mjs +73 -73
  58. package/esm2020/lib/services/models/plan.service.mjs +799 -799
  59. package/esm2020/lib/services/models/poi.service.mjs +103 -103
  60. package/esm2020/lib/services/models/profile.service.mjs +58 -58
  61. package/esm2020/lib/services/models/property.service.mjs +44 -44
  62. package/esm2020/lib/services/models/space.service.mjs +204 -204
  63. package/esm2020/lib/services/models/template.service.mjs +41 -41
  64. package/esm2020/lib/services/models/ticket.service.mjs +526 -526
  65. package/esm2020/lib/services/models/visit.service.mjs +130 -130
  66. package/esm2020/lib/services/models/zone.service.mjs +225 -225
  67. package/esm2020/lib/services/navigator.service.mjs +212 -212
  68. package/esm2020/lib/services/s3.service.mjs +137 -137
  69. package/esm2020/lib/services/search.service.mjs +124 -124
  70. package/esm2020/lib/services/support.service.mjs +42 -42
  71. package/esm2020/lib/services/tag.service.mjs +111 -111
  72. package/esm2020/lib/services/user.service.mjs +501 -501
  73. package/esm2020/lib/services/validators.service.mjs +50 -50
  74. package/esm2020/lib/services/viewer.service.mjs +389 -389
  75. package/esm2020/lib/services/zone-drawer.service.mjs +76 -76
  76. package/esm2020/lib/services/zoneChange.service.mjs +30 -30
  77. package/esm2020/lib/types.service.mjs +311 -310
  78. package/esm2020/lib/validators/email.directive.mjs +7 -7
  79. package/esm2020/lib/validators/no-empty.directive.mjs +12 -12
  80. package/esm2020/lib/validators/number.directive.mjs +12 -12
  81. package/esm2020/lib/validators/text.directive.mjs +12 -12
  82. package/esm2020/public-api.mjs +72 -72
  83. package/esm2020/smarterplan-ngx-smarterplan-core.mjs +4 -4
  84. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +13009 -12992
  85. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  86. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12258 -12241
  87. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  88. package/lib/components/csv-export/csv-export.component.d.ts +18 -18
  89. package/lib/components/loader/loader.component.d.ts +10 -10
  90. package/lib/components/menu-bar/avatar/avatar.component.d.ts +21 -21
  91. package/lib/components/menu-bar/menu-bar.component.d.ts +38 -38
  92. package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +73 -73
  93. package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +35 -35
  94. package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -22
  95. package/lib/components/search-bar/search-bar.component.d.ts +16 -16
  96. package/lib/components/support-modal/support-modal.component.d.ts +26 -26
  97. package/lib/config.d.ts +22 -22
  98. package/lib/helpers.service.d.ts +79 -79
  99. package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -26
  100. package/lib/matterport-extensions/nest-thermostat/CanvasImage.d.ts +31 -31
  101. package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +37 -37
  102. package/lib/matterport-extensions/nest-thermostat/NestThermostat.d.ts +42 -42
  103. package/lib/matterport-extensions/nest-thermostat/PlaneRenderer.d.ts +46 -46
  104. package/lib/matterport-extensions/scene-component/SceneComponent.d.ts +388 -388
  105. package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +47 -47
  106. package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -26
  107. package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -26
  108. package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -43
  109. package/lib/mattertagData.d.ts +70 -70
  110. package/lib/ngx-smarterplan-core.module.d.ts +29 -29
  111. package/lib/ngx-smarterplan-core.service.d.ts +6 -6
  112. package/lib/pipes/duration-to-string.pipe.d.ts +12 -12
  113. package/lib/pipes/format-date-number-to-digits.pipe.d.ts +10 -10
  114. package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -10
  115. package/lib/pipes/safe-url.pipe.d.ts +10 -10
  116. package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -16
  117. package/lib/pipes/username-from-id.pipe.d.ts +11 -11
  118. package/lib/services/amplify-cache.service.d.ts +37 -37
  119. package/lib/services/base-tab.service.d.ts +10 -10
  120. package/lib/services/baseVisibility.service.d.ts +9 -9
  121. package/lib/services/content.service.d.ts +28 -28
  122. package/lib/services/filter.service.d.ts +60 -60
  123. package/lib/services/intervention.service.d.ts +25 -25
  124. package/lib/services/locale.service.d.ts +23 -23
  125. package/lib/services/matterport-import.service.d.ts +53 -53
  126. package/lib/services/matterport.service.d.ts +336 -336
  127. package/lib/services/models/affectation.service.d.ts +14 -14
  128. package/lib/services/models/base-object.service.d.ts +20 -20
  129. package/lib/services/models/capture.service.d.ts +13 -13
  130. package/lib/services/models/comment.service.d.ts +26 -26
  131. package/lib/services/models/domain.service.d.ts +19 -19
  132. package/lib/services/models/equipment.service.d.ts +93 -93
  133. package/lib/services/models/event.service.d.ts +43 -43
  134. package/lib/services/models/feature.service.d.ts +75 -74
  135. package/lib/services/models/hashtag.service.d.ts +13 -13
  136. package/lib/services/models/layer.service.d.ts +11 -11
  137. package/lib/services/models/measurement.service.d.ts +51 -51
  138. package/lib/services/models/mission.service.d.ts +39 -39
  139. package/lib/services/models/navigation.service.d.ts +29 -29
  140. package/lib/services/models/node.service.d.ts +12 -12
  141. package/lib/services/models/object3D.service.d.ts +57 -57
  142. package/lib/services/models/operation.service.d.ts +15 -15
  143. package/lib/services/models/organisation.service.d.ts +19 -19
  144. package/lib/services/models/plan.service.d.ts +133 -133
  145. package/lib/services/models/poi.service.d.ts +25 -25
  146. package/lib/services/models/profile.service.d.ts +16 -16
  147. package/lib/services/models/property.service.d.ts +13 -13
  148. package/lib/services/models/space.service.d.ts +46 -46
  149. package/lib/services/models/template.service.d.ts +15 -15
  150. package/lib/services/models/ticket.service.d.ts +93 -93
  151. package/lib/services/models/visit.service.d.ts +24 -24
  152. package/lib/services/models/zone.service.d.ts +50 -50
  153. package/lib/services/navigator.service.d.ts +61 -61
  154. package/lib/services/s3.service.d.ts +14 -14
  155. package/lib/services/search.service.d.ts +20 -20
  156. package/lib/services/support.service.d.ts +17 -17
  157. package/lib/services/tag.service.d.ts +29 -29
  158. package/lib/services/user.service.d.ts +118 -118
  159. package/lib/services/validators.service.d.ts +18 -18
  160. package/lib/services/viewer.service.d.ts +110 -110
  161. package/lib/services/zone-drawer.service.d.ts +7 -7
  162. package/lib/services/zoneChange.service.d.ts +17 -17
  163. package/lib/types.service.d.ts +842 -840
  164. package/lib/validators/email.directive.d.ts +2 -2
  165. package/lib/validators/no-empty.directive.d.ts +2 -2
  166. package/lib/validators/number.directive.d.ts +2 -2
  167. package/lib/validators/text.directive.d.ts +2 -2
  168. package/package.json +1 -1
  169. package/public-api.d.ts +64 -64
  170. package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
@@ -1,364 +1,364 @@
1
- /* eslint-disable class-methods-use-this */
2
- import { Inject, Injectable } from "@angular/core";
3
- import { Subject } from "rxjs";
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../user.service";
6
- import * as i2 from "../navigator.service";
7
- import * as i3 from "../zoneChange.service";
8
- import * as i4 from "../filter.service";
9
- export class Object3DService {
10
- constructor(apiInjected, userService, navigatorService, zoneChangeService, filterService) {
11
- this.userService = userService;
12
- this.navigatorService = navigatorService;
13
- this.zoneChangeService = zoneChangeService;
14
- this.filterService = filterService;
15
- this.objects3DUpdated = new Subject();
16
- this.currentObjects3D = {
17
- space: [],
18
- zone: []
19
- };
20
- // bad name!
21
- // currentObjects3D: {
22
- // space: Object3D[];
23
- // zonesMap: Map<string, Object3D[]>;
24
- // } = {
25
- // space: [],
26
- // zonesMap: new Map(),
27
- // };
28
- this.updateDone = new Subject();
29
- /** Null means we do not apply a filter, empty array ([]), means we that we hide all object3D */
30
- this.object3DDomainFilter = null;
31
- this.updating = new Subject();
32
- this.currentlyUpdating = false;
33
- this.deleteObservable = new Subject();
34
- this.createObservable = new Subject();
35
- this.updateObservable = new Subject();
36
- this.isMuseumUser = false;
37
- this.isUpdating = false;
38
- this.destroy$ = new Subject();
39
- this.API = apiInjected;
40
- // this.isMuseumUser = this.userService.hasOnlyMuseumRole(); // Not used yet!
41
- this.objects3DUpdated.subscribe((list) => {
42
- this.currentObjects3D = list;
43
- });
44
- this.zoneChangeService.zoneChange.subscribe((zone) => {
45
- this.currentSpaceID = this.navigatorService.currentSpaceID;
46
- if (!this.currentSpaceID) {
47
- this.objects3DUpdated.next({ space: [], zone: null });
48
- this.zoneIDFilter = null;
49
- }
50
- else if (zone.id !== this.zoneIDFilter && !this.userService.isMuseumUser(this.currentSpaceID)) {
51
- this.zoneIDFilter = zone.id;
52
- this.initObjects3D();
53
- }
54
- });
55
- this.updateDone.subscribe(() => {
56
- if (this.currentSpaceID) {
57
- this.initObjects3D().catch(e => console.log(e));
58
- }
59
- });
60
- }
61
- async getObjects3DBySpace(spaceID) {
62
- const list = [];
63
- if (this.API.__proto__.hasOwnProperty('Objects3DBySpace')) {
64
- const objects = await this.API.__proto__.Objects3DBySpace(spaceID);
65
- if (objects) {
66
- for (const object of objects.items) {
67
- const zoneObject = { ...object };
68
- list.push(zoneObject);
69
- }
70
- }
71
- return list;
72
- }
73
- else {
74
- throw new Error('objects3DBySpace not implemented');
75
- }
76
- }
77
- async initObjects3D() {
78
- if (!this.currentSpaceID) {
79
- return;
80
- }
81
- this.updating.next(true);
82
- this.isUpdating = true;
83
- const object3DList = await this.getObjects3DBySpace(this.currentSpaceID);
84
- if (object3DList.length > 0) {
85
- let filteredObjects3D = [...object3DList];
86
- this.currentObjects3D.zone = filteredObjects3D; // not sorted!
87
- filteredObjects3D =
88
- await this.filterService.filterObjectsForCurrentUserInSpace(filteredObjects3D, this.currentSpaceID);
89
- this.currentObjects3D.space = filteredObjects3D;
90
- if (this.zoneIDFilter) {
91
- filteredObjects3D = await this.filterService.filterObjectsForZone(filteredObjects3D, this.zoneIDFilter);
92
- }
93
- this.currentObjects3D.zone = filteredObjects3D;
94
- this.objects3DUpdated.next(this.currentObjects3D);
95
- }
96
- else {
97
- this.objects3DUpdated.next({ space: [], zone: [] }); // for lateral menu
98
- }
99
- this.updating.next(false);
100
- this.isUpdating = false;
101
- }
102
- getSelectedObject3D() {
103
- return this.selectedObject3D;
104
- }
105
- setSelectedObject3D(selected) {
106
- this.selectedObject3D = selected;
107
- }
108
- // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
109
- // initSubscriptions() {
110
- // if (!this.isMuseumUser) {
111
- // this.navigatorService.zoneChange
112
- // .pipe(takeUntil(this.destroy$))
113
- // .subscribe((zone) => {
114
- // if (!zone || !this.navigatorService.currentSpaceID) {
115
- // this.currentSpaceID = this.navigatorService.currentSpaceID;
116
- // this.objects3DUpdated.next({space: [], zone: null});
117
- // this.zoneIDFilter = null;
118
- // this.currentObjects3D = {
119
- // space: [],
120
- // zonesMap: new Map(),
121
- // };
122
- // return;
123
- // }
124
- // if (zone.id !== this.zoneIDFilter) {
125
- // this.zoneIDFilter = zone.id;
126
- // this.currentZone = zone;
127
- // if (this.currentSpaceID === this.navigatorService.currentSpaceID) {
128
- // // same space, only zone update
129
- // // console.log(
130
- // // "going to update equips for zone (same space)",
131
- // // zone,
132
- // // );
133
- //
134
- // this.updateObjects3DForZone();
135
- // } else {
136
- // this.currentSpaceID = this.navigatorService.currentSpaceID;
137
- // // console.log(
138
- // // "going to init equips for zone for new space",
139
- // // this.currentSpaceID,
140
- // // );
141
- // this.initObjects3D().catch(e => console.log(e));
142
- // }
143
- // }
144
- // });
145
- //
146
- // this.deleteObservable
147
- // .pipe(takeUntil(this.destroy$))
148
- // .subscribe((object3D) => {
149
- // if (this.currentSpaceID) {
150
- // this.updateDueToDelete(object3D);
151
- // }
152
- // });
153
- //
154
- // this.createObservable
155
- // .pipe(takeUntil(this.destroy$))
156
- // .subscribe((object3D) => {
157
- // if (this.currentSpaceID) {
158
- // this.updateDueToCreate(object3D);
159
- // }
160
- // });
161
- //
162
- // this.updateObservable
163
- // .pipe(takeUntil(this.destroy$))
164
- // .subscribe((object3D) => {
165
- // if (this.currentSpaceID) {
166
- // this.updateDueToObject3DUpdated(object3D);
167
- // }
168
- // });
169
- // }
170
- // }
171
- updateDueToDelete(deletedObject3D) {
172
- // console.log("update due to delete", deletedObject3D);
173
- const obj = this.currentObjects3D.space.find((_equip) => _equip.id === deletedObject3D.id);
174
- if (obj) {
175
- const index = this.currentObjects3D.space.indexOf(obj);
176
- this.currentObjects3D.space.splice(index, 1);
177
- }
178
- // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
179
- // for (const zone of this.currentObjects3D.zonesMap.keys()) {
180
- // const equipToDelete = this.currentObjects3D.zonesMap
181
- // .get(zone)
182
- // .find((_equip) => _equip.id === deletedObject3D.id);
183
- // if (equipToDelete) {
184
- // const index = this.currentObjects3D.zonesMap
185
- // .get(zone)
186
- // .indexOf(equipToDelete);
187
- // this.currentObjects3D.zonesMap.get(zone).splice(index, 1);
188
- // }
189
- // }
190
- this.objects3DUpdated.next({
191
- space: this.currentObjects3D.space,
192
- zone: this.currentObjects3D.zone,
193
- // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
194
- // zone: this.currentObjects3D.zonesMap.get(this.zoneIDFilter),
195
- }); // for lateral menu
196
- }
197
- updateDueToCreate(createdObj3D) {
198
- this.currentObjects3D.space.unshift(createdObj3D);
199
- this.currentObjects3D.zone.unshift(createdObj3D);
200
- // this.currentObjects3D.zonesMap
201
- // .get(this.zoneIDFilter)
202
- // .unshift(createdEquip);
203
- this.objects3DUpdated.next({
204
- space: this.currentObjects3D.space,
205
- zone: this.currentObjects3D.zone,
206
- // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
207
- // zone: this.currentObjects3D.zonesMap.get(this.zoneIDFilter),
208
- }); // for lateral menu
209
- }
210
- // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
211
- // Not implemented since not used yet!
212
- // updateDueToObject3DUpdated(updatedObject3D: Object3D) {
213
- // const obj = this.currentObjects3D.space.find(
214
- // (_equip) => _equip.id === updatedObject3D.id
215
- // );
216
- // if (obj) {
217
- // const index = this.currentObjects3D.space.indexOf(obj);
218
- // // Not used yet!
219
- // // if (this.isArchived(obj)) {
220
- // // // we remove archived equipment
221
- // // this.currentObjects3D.space.splice(index, 1);
222
- // // } else {
223
- // this.currentObjects3D.space.splice(index, 1, updatedObject3D);
224
- // // }
225
- // }
226
- // for (const zone of this.currentObjects3D.zonesMap.keys()) {
227
- // const equipToUpd = this.currentObjects3D.zonesMap
228
- // .get(zone)
229
- // .find((_equip) => _equip.id === updatedObject3D.id);
230
- // if (equipToUpd) {
231
- // const index = this.currentObjects3D.zonesMap
232
- // .get(zone)
233
- // .indexOf(equipToUpd);
234
- // // Not used yet!
235
- // // if (this.isArchived(obj)) {
236
- // // this.currentObjects3D.zonesMap.get(zone).splice(index, 1);
237
- // // } else {
238
- // this.currentObjects3D.zonesMap
239
- // .get(zone)
240
- // .splice(index, 1, updatedObject3D);
241
- // // }
242
- // }
243
- // }
244
- // this.objects3DUpdated.next({
245
- // space: this.currentObjects3D.space,
246
- // zone: this.currentObjects3D.zonesMap.get(this.zoneIDFilter),
247
- // }); // for lateral menu
248
- // }
249
- // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
250
- // Not implemented since not used yet!
251
- // async updateObjects3DForZone() {
252
- // this.updating.next(true);
253
- // let filteredObjects3D: Object3D[] = [];
254
- // if (this.currentObjects3D.space.length > 0) {
255
- // if (
256
- // this.zoneIDFilter &&
257
- // this.currentObjects3D.zonesMap.has(this.zoneIDFilter)
258
- // ) {
259
- // filteredObjects3D = this.currentObjects3D.zonesMap.get(this.zoneIDFilter);
260
- // } else {
261
- // filteredObjects3D = (await this.filterService.filterObjectsForZone(
262
- // this.currentObjects3D.space,
263
- // this.zoneIDFilter,
264
- // this.currentZone
265
- // )) as Object3D[];
266
- //
267
- // this.currentObjects3D.zonesMap.set(this.zoneIDFilter, [
268
- // ...filteredObjects3D,
269
- // ]);
270
- // }
271
- // // Not implemented yet!
272
- // // if (this.object3DDomainFilter) {
273
- // // filteredObjects3D = this.filterService.filterObjects3DByDomainList(
274
- // // filteredObjects3D,
275
- // // this.object3DDomainFilter
276
- // // );
277
- // // }
278
- // // Not used for objects now!
279
- // // this.objects3DTags.next(filteredObjects3D); // adding tags only for the current zone
280
- // this.objects3DUpdated.next({
281
- // space: this.currentObjects3D.space,
282
- // zone: filteredObjects3D,
283
- // }); // for lateral menu
284
- // } else {
285
- // this.objects3DUpdated.next({space: [], zone: []}); // for lateral menu
286
- // }
287
- // this.updating.next(false);
288
- // }
289
- /**
290
- * Not implemented yet! May be usefull for the future (filter 3D objects for a given authorized user: example libs of objects)
291
- * @param objectId
292
- */
293
- // async getObjects3DBySpaceForUser(spaceID: string): Promise<Object3D[]> {
294
- // const missionForLocation = this.userService.currentMission(spaceID);
295
- // const list = [];
296
- // if (missionForLocation && missionForLocation.objectId) {
297
- // const allowedObject3D = await this.getObject3D(missionForLocation.objectId);
298
- // allowedObject3D.virtual = this.zoneIsVirtual(allowedObject3D);
299
- // if (!allowedObject3D.parent) {
300
- // // the whole building is authorized
301
- // return this.getObjects3DBySpace(spaceID);
302
- // }
303
- // list.push(allowedObject3D);
304
- // // allow all children zones of an allowed parent
305
- // const children = (await this.API.__proto__.objects3DByObject3D(allowedObject3D.id)).items;
306
- // if (children.length > 0) {
307
- // for (const child of children) {
308
- // const childObject3D = { ...child } as Object3D;
309
- // childObject3D.virtual = this.zoneIsVirtual(child);
310
- // list.push(childObject3D);
311
- // }
312
- // }
313
- // // allow the parent Floor of the allowed zone
314
- // if (allowedObject3D.parent.layer && allowedObject3D.parent.layer.name === "FLOOR") {
315
- // list.push(allowedObject3D.parent);
316
- // }
317
- // } else {
318
- // return this.getObjects3DBySpace(spaceID);
319
- // }
320
- // return list;
321
- // }
322
- async deleteObject3D(objectId) {
323
- return this.API.__proto__.DeleteObject3D({ id: objectId });
324
- }
325
- async create(input) {
326
- return this.API.__proto__.CreateObject3D(input);
327
- }
328
- async updateObject3D(input) {
329
- return this.API.__proto__.UpdateObject3D(input);
330
- }
331
- /** Basic CRUD operations */
332
- async readObject3D(id) {
333
- return this.API.__proto__.GetObject3D(id);
334
- }
335
- async adaptObject3D(object3D) {
336
- // Not required here!
337
- return object3D;
338
- }
339
- async updateObject3DWithEvent(object3D, event) {
340
- const receivedObject3D = await this.updateObject3D(object3D);
341
- if (receivedObject3D) {
342
- console.log("Updated object3D :");
343
- console.log(receivedObject3D);
344
- // Not sent currently: ask if needed...
345
- // if (event) {
346
- // await this.addEventToObject3D(receivedObject3D, event);
347
- // }
348
- this.updateDone.next(true);
349
- }
350
- return receivedObject3D;
351
- }
352
- }
353
- Object3DService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: Object3DService, deps: [{ token: 'currentAPIService' }, { token: i1.BaseUserService }, { token: i2.NavigatorService }, { token: i3.ZoneChangeService }, { token: i4.FilterService }], target: i0.ɵɵFactoryTarget.Injectable });
354
- Object3DService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: Object3DService, providedIn: "root" });
355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: Object3DService, decorators: [{
356
- type: Injectable,
357
- args: [{
358
- providedIn: "root",
359
- }]
360
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
361
- type: Inject,
362
- args: ['currentAPIService']
363
- }] }, { type: i1.BaseUserService }, { type: i2.NavigatorService }, { type: i3.ZoneChangeService }, { type: i4.FilterService }]; } });
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0M0Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbW9kZWxzL29iamVjdDNELnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVM3QixNQUFNLE9BQU8sZUFBZTtJQXVEMUIsWUFBeUMsV0FBZ0IsRUFDckMsV0FBNEIsRUFDNUIsZ0JBQWtDLEVBQ2xDLGlCQUFvQyxFQUNwQyxhQUE0QjtRQUg1QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBeERoRCxxQkFBZ0IsR0FHWCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRW5CLHFCQUFnQixHQUlaO1lBQ0YsS0FBSyxFQUFFLEVBQUU7WUFDVCxJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7UUFFRixZQUFZO1FBQ1osc0JBQXNCO1FBQ3RCLHVCQUF1QjtRQUN2Qix1Q0FBdUM7UUFDdkMsUUFBUTtRQUNSLGVBQWU7UUFDZix5QkFBeUI7UUFDekIsS0FBSztRQUVMLGVBQVUsR0FBcUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVE3QyxnR0FBZ0c7UUFDaEcseUJBQW9CLEdBQWEsSUFBSSxDQUFDO1FBRXRDLGFBQVEsR0FBcUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUUzQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFMUIscUJBQWdCLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFcEQscUJBQWdCLEdB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QUFxQjtRQUNyQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixRQUFxQyxFQUNyQyxLQUFhO1FBRWIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlCLHVDQUF1QztZQUN2QyxlQUFlO1lBQ2YsNERBQTREO1lBQzVELElBQUk7WUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjtRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzs7NEdBclpVLGVBQWUsa0JBdUROLG1CQUFtQjtnSEF2RDVCLGVBQWUsY0FGZCxNQUFNOzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkF3RGMsTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0V2ZW50LCBJVXBkYXRlLCBPYmplY3QzRCwgWm9uZX0gZnJvbSBcIi4uLy4uL3R5cGVzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0Jhc2VVc2VyU2VydmljZX0gZnJvbSBcIi4uL3VzZXIuc2VydmljZVwiO1xyXG5pbXBvcnQge05hdmlnYXRvclNlcnZpY2V9IGZyb20gXCIuLi9uYXZpZ2F0b3Iuc2VydmljZVwiO1xyXG5pbXBvcnQge0ZpbHRlclNlcnZpY2V9IGZyb20gXCIuLi9maWx0ZXIuc2VydmljZVwiO1xyXG5pbXBvcnQge1pvbmVDaGFuZ2VTZXJ2aWNlfSBmcm9tIFwiLi4vem9uZUNoYW5nZS5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPYmplY3QzRFNlcnZpY2Uge1xyXG4gIEFQSTogYW55OyAvL0FXUyBBUElTZXJ2aWNlXHJcblxyXG4gIG9iamVjdHMzRFVwZGF0ZWQ6IFN1YmplY3Q8e1xyXG4gICAgc3BhY2U6IE9iamVjdDNEW107XHJcbiAgICB6b25lOiBPYmplY3QzRFtdO1xyXG4gIH0+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY3VycmVudE9iamVjdHMzRDoge1xyXG4gICAgc3BhY2U6IE9iamVjdDNEW107XHJcbiAgICB6b25lOiBPYmplY3QzRFtdXHJcbiAgfVxyXG4gICAgPSB7XHJcbiAgICBzcGFjZTogW10sXHJcbiAgICB6b25lOiBbXVxyXG4gIH07XHJcblxyXG4gIC8vIGJhZCBuYW1lIVxyXG4gIC8vIGN1cnJlbnRPYmplY3RzM0Q6IHtcclxuICAvLyAgIHNwYWNlOiBPYmplY3QzRFtdO1xyXG4gIC8vICAgem9uZXNNYXA6IE1hcDxzdHJpbmcsIE9iamVjdDNEW10+O1xyXG4gIC8vIH0gPSB7XHJcbiAgLy8gICBzcGFjZTogW10sXHJcbiAgLy8gICB6b25lc01hcDogbmV3IE1hcCgpLFxyXG4gIC8vIH07XHJcblxyXG4gIHVwZGF0ZURvbmU6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICB6b25lSURGaWx0ZXI6IHN0cmluZztcclxuXHJcbiAgY3VycmVudFpvbmU6IFpvbmU7XHJcblxyXG4gIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmdcclxuXHJcbiAgLyoqIE51bGwgbWVhbnMgd2UgZG8gbm90IGFwcGx5IGEgZmlsdGVyLCBlbXB0eSBhcnJheSAoW10pLCBtZWFucyB3ZSB0aGF0IHdlIGhpZGUgYWxsIG9iamVjdDNEICovXHJcbiAgb2JqZWN0M0REb21haW5GaWx0ZXI6IHN0cmluZ1tdID0gbnVsbDtcclxuXHJcbiAgdXBkYXRpbmc6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjdXJyZW50bHlVcGRhdGluZyA9IGZhbHNlO1xyXG5cclxuICBkZWxldGVPYnNlcnZhYmxlOiBTdWJqZWN0PE9iamVjdDNEPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNyZWF0ZU9ic2VydmFibGU6IFN1YmplY3Q8T2JqZWN0M0Q+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgdXBkYXRlT2JzZXJ2YWJsZTogU3ViamVjdDxPYmplY3QzRD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBpc011c2V1bVVzZXIgPSBmYWxzZTtcclxuXHJcbiAgaXNVcGRhdGluZyA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RlZE9iamVjdDNEOiBhbnk7IC8vIHNlbGVjdGVkIGZyb20gc3ByaXRlIGNhcnJvdXNlbCB2aWV3ZXIgKGxpYiBvZiBvYmplY3RzM0QpXHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2N1cnJlbnRBUElTZXJ2aWNlJykgYXBpSW5qZWN0ZWQ6IGFueSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgem9uZUNoYW5nZVNlcnZpY2U6IFpvbmVDaGFuZ2VTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSkge1xyXG4gICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcclxuICAgIC8vIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpOyAvLyBOb3QgdXNlZCB5ZXQhXHJcblxyXG4gICAgdGhpcy5vYmplY3RzM0RVcGRhdGVkLnN1YnNjcmliZSgobGlzdCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRPYmplY3RzM0QgPSBsaXN0O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy56b25lQ2hhbmdlU2VydmljZS56b25lQ2hhbmdlLnN1YnNjcmliZSgoem9uZSkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRTcGFjZUlEID0gdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnRTcGFjZUlEO1xyXG4gICAgICBpZiAoIXRoaXMuY3VycmVudFNwYWNlSUQpIHtcclxuICAgICAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7c3BhY2U6IFtdLCB6b25lOiBudWxsfSk7XHJcbiAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgPSBudWxsO1xyXG4gICAgICB9IGVsc2UgaWYgKHpvbmUuaWQgIT09IHRoaXMuem9uZUlERmlsdGVyICYmICF0aGlzLnVzZXJTZXJ2aWNlLmlzTXVzZXVtVXNlcih0aGlzLmN1cnJlbnRTcGFjZUlEKSkge1xyXG4gICAgICAgIHRoaXMuem9uZUlERmlsdGVyID0gem9uZS5pZDtcclxuICAgICAgICB0aGlzLmluaXRPYmplY3RzM0QoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVEb25lLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XHJcbiAgICAgICAgICB0aGlzLmluaXRPYmplY3RzM0QoKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGUpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRPYmplY3RzM0RCeVNwYWNlKHNwYWNlSUQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8T2JqZWN0M0Q+PiB7XHJcbiAgICBjb25zdCBsaXN0OiBPYmplY3QzRFtdID0gW107XHJcbiAgICBpZiAodGhpcy5BUEkuX19wcm90b19fLmhhc093blByb3BlcnR5KCdPYmplY3RzM0RCeVNwYWNlJykpIHtcclxuICAgICAgY29uc3Qgb2JqZWN0cyA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5PYmplY3RzM0RCeVNwYWNlKHNwYWNlSUQpO1xyXG4gICAgICBpZiAob2JqZWN0cykge1xyXG4gICAgICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMuaXRlbXMpIHtcclxuICAgICAgICAgIGNvbnN0IHpvbmVPYmplY3QgPSB7Li4ub2JqZWN0fSBhcyBPYmplY3QzRDtcclxuICAgICAgICAgIGxpc3QucHVzaCh6b25lT2JqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29iamVjdHMzREJ5U3BhY2Ugbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdE9iamVjdHMzRCgpIHtcclxuICAgIGlmICghdGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0aW5nLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmlzVXBkYXRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3Qgb2JqZWN0M0RMaXN0ID0gYXdhaXQgdGhpcy5nZXRPYmplY3RzM0RCeVNwYWNlKHRoaXMuY3VycmVudFNwYWNlSUQpO1xyXG5cclxuICAgIGlmIChvYmplY3QzRExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZmlsdGVyZWRPYmplY3RzM0QgPSBbLi4ub2JqZWN0M0RMaXN0XTtcclxuICAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmUgPSBmaWx0ZXJlZE9iamVjdHMzRDsgLy8gbm90IHNvcnRlZCFcclxuXHJcbiAgICAgIGZpbHRlcmVkT2JqZWN0czNEID1cclxuICAgICAgICBhd2FpdCB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyT2JqZWN0c0ZvckN1cnJlbnRVc2VySW5TcGFjZShcclxuICAgICAgICAgIGZpbHRlcmVkT2JqZWN0czNELFxyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRFxyXG4gICAgICAgICk7XHJcbiAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZSA9IGZpbHRlcmVkT2JqZWN0czNEO1xyXG4gICAgICBpZiAodGhpcy56b25lSURGaWx0ZXIpIHtcclxuICAgICAgICBmaWx0ZXJlZE9iamVjdHMzRCA9IGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJPYmplY3RzRm9yWm9uZShcclxuICAgICAgICAgIGZpbHRlcmVkT2JqZWN0czNELFxyXG4gICAgICAgICAgdGhpcy56b25lSURGaWx0ZXJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lID0gZmlsdGVyZWRPYmplY3RzM0Q7XHJcbiAgICAgIHRoaXMub2JqZWN0czNEVXBkYXRlZC5uZXh0KHRoaXMuY3VycmVudE9iamVjdHMzRCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7c3BhY2U6IFtdLCB6b25lOiBbXX0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0aW5nLm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5pc1VwZGF0aW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZE9iamVjdDNEKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9iamVjdDNEO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VsZWN0ZWRPYmplY3QzRChzZWxlY3RlZDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkT2JqZWN0M0QgPSBzZWxlY3RlZDtcclxuICB9XHJcblxyXG5cclxuICAvLyBUSEUgRk9MTE9XSU5HIExPR0lDIElTIEVRVUlQLiBTUEVDSUZJQ1xyXG4gIC8vIGluaXRTdWJzY3JpcHRpb25zKCkge1xyXG4gIC8vICAgaWYgKCF0aGlzLmlzTXVzZXVtVXNlcikge1xyXG4gIC8vICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2Uuem9uZUNoYW5nZVxyXG4gIC8vICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAvLyAgICAgICAuc3Vic2NyaWJlKCh6b25lKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoIXpvbmUgfHwgIXRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRCkge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmN1cnJlbnRTcGFjZUlEID0gdGhpcy5uYXZpZ2F0b3JTZXJ2aWNlLmN1cnJlbnRTcGFjZUlEO1xyXG4gIC8vICAgICAgICAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7c3BhY2U6IFtdLCB6b25lOiBudWxsfSk7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuem9uZUlERmlsdGVyID0gbnVsbDtcclxuICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNEID0ge1xyXG4gIC8vICAgICAgICAgICAgIHNwYWNlOiBbXSxcclxuICAvLyAgICAgICAgICAgICB6b25lc01hcDogbmV3IE1hcCgpLFxyXG4gIC8vICAgICAgICAgICB9O1xyXG4gIC8vICAgICAgICAgICByZXR1cm47XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBpZiAoem9uZS5pZCAhPT0gdGhpcy56b25lSURGaWx0ZXIpIHtcclxuICAvLyAgICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIgPSB6b25lLmlkO1xyXG4gIC8vICAgICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gem9uZTtcclxuICAvLyAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQgPT09IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRCkge1xyXG4gIC8vICAgICAgICAgICAgIC8vIHNhbWUgc3BhY2UsICBvbmx5IHpvbmUgdXBkYXRlXHJcbiAgLy8gICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgICAgLy8gICAgIFwiZ29pbmcgdG8gdXBkYXRlIGVxdWlwcyBmb3Igem9uZSAoc2FtZSBzcGFjZSlcIixcclxuICAvLyAgICAgICAgICAgICAvLyAgICAgem9uZSxcclxuICAvLyAgICAgICAgICAgICAvLyApO1xyXG4gIC8vXHJcbiAgLy8gICAgICAgICAgICAgdGhpcy51cGRhdGVPYmplY3RzM0RGb3Jab25lKCk7XHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCA9IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRDtcclxuICAvLyAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcclxuICAvLyAgICAgICAgICAgICAvLyAgICAgXCJnb2luZyB0byBpbml0IGVxdWlwcyBmb3Igem9uZSBmb3IgbmV3IHNwYWNlXCIsXHJcbiAgLy8gICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VycmVudFNwYWNlSUQsXHJcbiAgLy8gICAgICAgICAgICAgLy8gKTtcclxuICAvLyAgICAgICAgICAgICB0aGlzLmluaXRPYmplY3RzM0QoKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGUpKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vXHJcbiAgLy8gICAgIHRoaXMuZGVsZXRlT2JzZXJ2YWJsZVxyXG4gIC8vICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAvLyAgICAgICAuc3Vic2NyaWJlKChvYmplY3QzRCkgPT4ge1xyXG4gIC8vICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQpIHtcclxuICAvLyAgICAgICAgICAgdGhpcy51cGRhdGVEdWVUb0RlbGV0ZShvYmplY3QzRCk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy9cclxuICAvLyAgICAgdGhpcy5jcmVhdGVPYnNlcnZhYmxlXHJcbiAgLy8gICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC8vICAgICAgIC5zdWJzY3JpYmUoKG9iamVjdDNEKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gIC8vICAgICAgICAgICB0aGlzLnVwZGF0ZUR1ZVRvQ3JlYXRlKG9iamVjdDNEKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvL1xyXG4gIC8vICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGVcclxuICAvLyAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgLy8gICAgICAgLnN1YnNjcmliZSgob2JqZWN0M0QpID0+IHtcclxuICAvLyAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMudXBkYXRlRHVlVG9PYmplY3QzRFVwZGF0ZWQob2JqZWN0M0QpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgdXBkYXRlRHVlVG9EZWxldGUoZGVsZXRlZE9iamVjdDNEOiBPYmplY3QzRCkge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJ1cGRhdGUgZHVlIHRvIGRlbGV0ZVwiLCBkZWxldGVkT2JqZWN0M0QpO1xyXG4gICAgY29uc3Qgb2JqID0gdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLmZpbmQoXHJcbiAgICAgIChfZXF1aXApID0+IF9lcXVpcC5pZCA9PT0gZGVsZXRlZE9iamVjdDNELmlkXHJcbiAgICApO1xyXG4gICAgaWYgKG9iaikge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZS5pbmRleE9mKG9iaik7XHJcbiAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG4gICAgLy8gVEhFIEZPTExPV0lORyBMT0dJQyBJUyBFUVVJUC4gU1BFQ0lGSUNcclxuICAgIC8vIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAua2V5cygpKSB7XHJcbiAgICAvLyAgIGNvbnN0IGVxdWlwVG9EZWxldGUgPSB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXBcclxuICAgIC8vICAgICAuZ2V0KHpvbmUpXHJcbiAgICAvLyAgICAgLmZpbmQoKF9lcXVpcCkgPT4gX2VxdWlwLmlkID09PSBkZWxldGVkT2JqZWN0M0QuaWQpO1xyXG4gICAgLy8gICBpZiAoZXF1aXBUb0RlbGV0ZSkge1xyXG4gICAgLy8gICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwXHJcbiAgICAvLyAgICAgICAuZ2V0KHpvbmUpXHJcbiAgICAvLyAgICAgICAuaW5kZXhPZihlcXVpcFRvRGVsZXRlKTtcclxuICAgIC8vICAgICB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAuZ2V0KHpvbmUpLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIHRoaXMub2JqZWN0czNEVXBkYXRlZC5uZXh0KHtcclxuICAgICAgc3BhY2U6IHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZSxcclxuICAgICAgem9uZTogdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmUsXHJcbiAgICAgIC8vIFRIRSBGT0xMT1dJTkcgTE9HSUMgSVMgRVFVSVAuIFNQRUNJRklDXHJcbiAgICAgIC8vIHpvbmU6IHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcC5nZXQodGhpcy56b25lSURGaWx0ZXIpLFxyXG4gICAgfSk7IC8vIGZvciBsYXRlcmFsIG1lbnVcclxuICB9XHJcblxyXG4gIHVwZGF0ZUR1ZVRvQ3JlYXRlKGNyZWF0ZWRPYmozRDogT2JqZWN0M0QpIHtcclxuICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZS51bnNoaWZ0KGNyZWF0ZWRPYmozRCk7XHJcbiAgICB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZS51bnNoaWZ0KGNyZWF0ZWRPYmozRCk7XHJcblxyXG4gICAgLy8gdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwXHJcbiAgICAvLyAgIC5nZXQodGhpcy56b25lSURGaWx0ZXIpXHJcbiAgICAvLyAgIC51bnNoaWZ0KGNyZWF0ZWRFcXVpcCk7XHJcbiAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7XHJcbiAgICAgIHNwYWNlOiB0aGlzLmN1cnJlbnRPYmplY3RzM0Quc3BhY2UsXHJcbiAgICAgIHpvbmU6IHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lLFxyXG4gICAgICAvLyBUSEUgRk9MTE9XSU5HIExPR0lDIElTIEVRVUlQLiBTUEVDSUZJQ1xyXG4gICAgICAvLyB6b25lOiB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKSxcclxuICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgfVxyXG5cclxuICAvLyBUSEUgRk9MTE9XSU5HIExPR0lDIElTIEVRVUlQLiBTUEVDSUZJQ1xyXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCBzaW5jZSBub3QgdXNlZCB5ZXQhXHJcbiAgLy8gdXBkYXRlRHVlVG9PYmplY3QzRFVwZGF0ZWQodXBkYXRlZE9iamVjdDNEOiBPYmplY3QzRCkge1xyXG4gIC8vICAgY29uc3Qgb2JqID0gdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLmZpbmQoXHJcbiAgLy8gICAgIChfZXF1aXApID0+IF9lcXVpcC5pZCA9PT0gdXBkYXRlZE9iamVjdDNELmlkXHJcbiAgLy8gICApO1xyXG4gIC8vICAgaWYgKG9iaikge1xyXG4gIC8vICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZS5pbmRleE9mKG9iaik7XHJcbiAgLy8gICAgIC8vIE5vdCB1c2VkIHlldCFcclxuICAvLyAgICAgLy8gaWYgKHRoaXMuaXNBcmNoaXZlZChvYmopKSB7XHJcbiAgLy8gICAgIC8vICAgLy8gd2UgcmVtb3ZlIGFyY2hpdmVkIGVxdWlwbWVudFxyXG4gIC8vICAgICAvLyAgIHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIC8vICAgICAvLyB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLmN1cnJlbnRPYmplY3RzM0Quc3BhY2Uuc3BsaWNlKGluZGV4LCAxLCB1cGRhdGVkT2JqZWN0M0QpO1xyXG4gIC8vICAgICAvLyB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwLmtleXMoKSkge1xyXG4gIC8vICAgICBjb25zdCBlcXVpcFRvVXBkID0gdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwXHJcbiAgLy8gICAgICAgLmdldCh6b25lKVxyXG4gIC8vICAgICAgIC5maW5kKChfZXF1aXApID0+IF9lcXVpcC5pZCA9PT0gdXBkYXRlZE9iamVjdDNELmlkKTtcclxuICAvLyAgICAgaWYgKGVxdWlwVG9VcGQpIHtcclxuICAvLyAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcFxyXG4gIC8vICAgICAgICAgLmdldCh6b25lKVxyXG4gIC8vICAgICAgICAgLmluZGV4T2YoZXF1aXBUb1VwZCk7XHJcbiAgLy8gICAgICAgLy8gTm90IHVzZWQgeWV0IVxyXG4gIC8vICAgICAgIC8vIGlmICh0aGlzLmlzQXJjaGl2ZWQob2JqKSkge1xyXG4gIC8vICAgICAgIC8vICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwLmdldCh6b25lKS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIC8vICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwXHJcbiAgLy8gICAgICAgICAuZ2V0KHpvbmUpXHJcbiAgLy8gICAgICAgICAuc3BsaWNlKGluZGV4LCAxLCB1cGRhdGVkT2JqZWN0M0QpO1xyXG4gIC8vICAgICAgIC8vIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5vYmplY3RzM0RVcGRhdGVkLm5leHQoe1xyXG4gIC8vICAgICBzcGFjZTogdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLFxyXG4gIC8vICAgICB6b25lOiB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKSxcclxuICAvLyAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XHJcbiAgLy8gfVxyXG5cclxuICAvLyBUSEUgRk9MTE9XSU5HIExPR0lDIElTIEVRVUlQLiBTUEVDSUZJQ1xyXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCBzaW5jZSBub3QgdXNlZCB5ZXQhXHJcbiAgLy8gYXN5bmMgdXBkYXRlT2JqZWN0czNERm9yWm9uZSgpIHtcclxuICAvLyAgIHRoaXMudXBkYXRpbmcubmV4dCh0cnVlKTtcclxuICAvLyAgIGxldCBmaWx0ZXJlZE9iamVjdHMzRDogT2JqZWN0M0RbXSA9IFtdO1xyXG4gIC8vICAgaWYgKHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZS5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLnpvbmVJREZpbHRlciAmJlxyXG4gIC8vICAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcC5oYXModGhpcy56b25lSURGaWx0ZXIpXHJcbiAgLy8gICAgICkge1xyXG4gIC8vICAgICAgIGZpbHRlcmVkT2JqZWN0czNEID0gdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwLmdldCh0aGlzLnpvbmVJREZpbHRlcik7XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgZmlsdGVyZWRPYmplY3RzM0QgPSAoYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3Jab25lKFxyXG4gIC8vICAgICAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLFxyXG4gIC8vICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIsXHJcbiAgLy8gICAgICAgICB0aGlzLmN1cnJlbnRab25lXHJcbiAgLy8gICAgICAgKSkgYXMgT2JqZWN0M0RbXTtcclxuICAvL1xyXG4gIC8vICAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcC5zZXQodGhpcy56b25lSURGaWx0ZXIsIFtcclxuICAvLyAgICAgICAgIC4uLmZpbHRlcmVkT2JqZWN0czNELFxyXG4gIC8vICAgICAgIF0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXQhXHJcbiAgLy8gICAgIC8vIGlmICh0aGlzLm9iamVjdDNERG9tYWluRmlsdGVyKSB7XHJcbiAgLy8gICAgIC8vICAgZmlsdGVyZWRPYmplY3RzM0QgPSB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyT2JqZWN0czNEQnlEb21haW5MaXN0KFxyXG4gIC8vICAgICAvLyAgICAgZmlsdGVyZWRPYmplY3RzM0QsXHJcbiAgLy8gICAgIC8vICAgICB0aGlzLm9iamVjdDNERG9tYWluRmlsdGVyXHJcbiAgLy8gICAgIC8vICAgKTtcclxuICAvLyAgICAgLy8gfVxyXG4gIC8vICAgICAvLyBOb3QgdXNlZCBmb3Igb2JqZWN0cyBub3chXHJcbiAgLy8gICAgIC8vIHRoaXMub2JqZWN0czNEVGFncy5uZXh0KGZpbHRlcmVkT2JqZWN0czNEKTsgLy8gYWRkaW5nIHRhZ3Mgb25seSBmb3IgdGhlIGN1cnJlbnQgem9uZVxyXG4gIC8vICAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7XHJcbiAgLy8gICAgICAgc3BhY2U6IHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZSxcclxuICAvLyAgICAgICB6b25lOiBmaWx0ZXJlZE9iamVjdHMzRCxcclxuICAvLyAgICAgfSk7IC8vIGZvciBsYXRlcmFsIG1lbnVcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMub2JqZWN0czNEVXBkYXRlZC5uZXh0KHtzcGFjZTogW10sIHpvbmU6IFtdfSk7IC8vIGZvciBsYXRlcmFsIG1lbnVcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMudXBkYXRpbmcubmV4dChmYWxzZSk7XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogTm90IGltcGxlbWVudGVkIHlldCEgTWF5IGJlIHVzZWZ1bGwgZm9yIHRoZSBmdXR1cmUgKGZpbHRlciAzRCBvYmplY3RzIGZvciBhIGdpdmVuIGF1dGhvcml6ZWQgdXNlcjogZXhhbXBsZSBsaWJzIG9mIG9iamVjdHMpXHJcbiAgICogQHBhcmFtIG9iamVjdElkXHJcbiAgICovXHJcbiAgLy8gYXN5bmMgZ2V0T2JqZWN0czNEQnlTcGFjZUZvclVzZXIoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxPYmplY3QzRFtdPiB7XHJcbiAgLy8gICBjb25zdCBtaXNzaW9uRm9yTG9jYXRpb24gPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKHNwYWNlSUQpO1xyXG4gIC8vICAgY29uc3QgbGlzdCA9IFtdO1xyXG4gIC8vICAgaWYgKG1pc3Npb25Gb3JMb2NhdGlvbiAmJiBtaXNzaW9uRm9yTG9jYXRpb24ub2JqZWN0SWQpIHtcclxuICAvLyAgICAgY29uc3QgYWxsb3dlZE9iamVjdDNEID0gYXdhaXQgdGhpcy5nZXRPYmplY3QzRChtaXNzaW9uRm9yTG9jYXRpb24ub2JqZWN0SWQpO1xyXG4gIC8vICAgICBhbGxvd2VkT2JqZWN0M0QudmlydHVhbCA9IHRoaXMuem9uZUlzVmlydHVhbChhbGxvd2VkT2JqZWN0M0QpO1xyXG4gIC8vICAgICBpZiAoIWFsbG93ZWRPYmplY3QzRC5wYXJlbnQpIHtcclxuICAvLyAgICAgICAvLyB0aGUgd2hvbGUgYnVpbGRpbmcgaXMgYXV0aG9yaXplZFxyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMzREJ5U3BhY2Uoc3BhY2VJRCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgbGlzdC5wdXNoKGFsbG93ZWRPYmplY3QzRCk7XHJcbiAgLy8gICAgIC8vIGFsbG93IGFsbCBjaGlsZHJlbiB6b25lcyBvZiBhbiBhbGxvd2VkIHBhcmVudFxyXG4gIC8vICAgICBjb25zdCBjaGlsZHJlbiA9IChhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18ub2JqZWN0czNEQnlPYmplY3QzRChhbGxvd2VkT2JqZWN0M0QuaWQpKS5pdGVtcztcclxuICAvLyAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBjaGlsZE9iamVjdDNEID0geyAuLi5jaGlsZCB9IGFzIE9iamVjdDNEO1xyXG4gIC8vICAgICAgICAgY2hpbGRPYmplY3QzRC52aXJ0dWFsID0gdGhpcy56b25lSXNWaXJ0dWFsKGNoaWxkKTtcclxuICAvLyAgICAgICAgIGxpc3QucHVzaChjaGlsZE9iamVjdDNEKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgLy8gYWxsb3cgdGhlIHBhcmVudCBGbG9vciBvZiB0aGUgYWxsb3dlZCB6b25lXHJcbiAgLy8gICAgIGlmIChhbGxvd2VkT2JqZWN0M0QucGFyZW50LmxheWVyICYmIGFsbG93ZWRPYmplY3QzRC5wYXJlbnQubGF5ZXIubmFtZSA9PT0gXCJGTE9PUlwiKSB7XHJcbiAgLy8gICAgICAgbGlzdC5wdXNoKGFsbG93ZWRPYmplY3QzRC5wYXJlbnQpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzM0RCeVNwYWNlKHNwYWNlSUQpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIGxpc3Q7XHJcbiAgLy8gfVxyXG5cclxuICBhc3luYyBkZWxldGVPYmplY3QzRChvYmplY3RJZDogc3RyaW5nKTogUHJvbWlzZTxPYmplY3QzRD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5EZWxldGVPYmplY3QzRCh7aWQ6IG9iamVjdElkfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGUoaW5wdXQ6IE9iamVjdDNEKTogUHJvbWlzZTxPYmplY3QzRD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVPYmplY3QzRChpbnB1dCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVPYmplY3QzRChpbnB1dDogYW55KTogUHJvbWlzZTxPYmplY3QzRD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5VcGRhdGVPYmplY3QzRChpbnB1dCk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFzaWMgQ1JVRCBvcGVyYXRpb25zICovXHJcbiAgYXN5bmMgcmVhZE9iamVjdDNEKGlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uR2V0T2JqZWN0M0QoaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRhcHRPYmplY3QzRChvYmplY3QzRDogT2JqZWN0M0QpOiBQcm9taXNlPE9iamVjdDNEPiB7XHJcbiAgICAvLyBOb3QgcmVxdWlyZWQgaGVyZSFcclxuICAgIHJldHVybiBvYmplY3QzRDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZU9iamVjdDNEV2l0aEV2ZW50KFxyXG4gICAgb2JqZWN0M0Q6IElVcGRhdGUgJiBQYXJ0aWFsPE9iamVjdDNEPixcclxuICAgIGV2ZW50PzogRXZlbnQsXHJcbiAgKTogUHJvbWlzZTxPYmplY3QzRD4ge1xyXG4gICAgY29uc3QgcmVjZWl2ZWRPYmplY3QzRCA9IGF3YWl0IHRoaXMudXBkYXRlT2JqZWN0M0Qob2JqZWN0M0QpO1xyXG4gICAgaWYgKHJlY2VpdmVkT2JqZWN0M0QpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJVcGRhdGVkIG9iamVjdDNEIDpcIik7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlY2VpdmVkT2JqZWN0M0QpO1xyXG4gICAgICAvLyBOb3Qgc2VudCBjdXJyZW50bHk6IGFzayBpZiBuZWVkZWQuLi5cclxuICAgICAgLy8gaWYgKGV2ZW50KSB7XHJcbiAgICAgIC8vICAgYXdhaXQgdGhpcy5hZGRFdmVudFRvT2JqZWN0M0QocmVjZWl2ZWRPYmplY3QzRCwgZXZlbnQpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlY2VpdmVkT2JqZWN0M0Q7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
1
+ /* eslint-disable class-methods-use-this */
2
+ import { Inject, Injectable } from "@angular/core";
3
+ import { Subject } from "rxjs";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../user.service";
6
+ import * as i2 from "../navigator.service";
7
+ import * as i3 from "../zoneChange.service";
8
+ import * as i4 from "../filter.service";
9
+ export class Object3DService {
10
+ constructor(apiInjected, userService, navigatorService, zoneChangeService, filterService) {
11
+ this.userService = userService;
12
+ this.navigatorService = navigatorService;
13
+ this.zoneChangeService = zoneChangeService;
14
+ this.filterService = filterService;
15
+ this.objects3DUpdated = new Subject();
16
+ this.currentObjects3D = {
17
+ space: [],
18
+ zone: []
19
+ };
20
+ // bad name!
21
+ // currentObjects3D: {
22
+ // space: Object3D[];
23
+ // zonesMap: Map<string, Object3D[]>;
24
+ // } = {
25
+ // space: [],
26
+ // zonesMap: new Map(),
27
+ // };
28
+ this.updateDone = new Subject();
29
+ /** Null means we do not apply a filter, empty array ([]), means we that we hide all object3D */
30
+ this.object3DDomainFilter = null;
31
+ this.updating = new Subject();
32
+ this.currentlyUpdating = false;
33
+ this.deleteObservable = new Subject();
34
+ this.createObservable = new Subject();
35
+ this.updateObservable = new Subject();
36
+ this.isMuseumUser = false;
37
+ this.isUpdating = false;
38
+ this.destroy$ = new Subject();
39
+ this.API = apiInjected;
40
+ // this.isMuseumUser = this.userService.hasOnlyMuseumRole(); // Not used yet!
41
+ this.objects3DUpdated.subscribe((list) => {
42
+ this.currentObjects3D = list;
43
+ });
44
+ this.zoneChangeService.zoneChange.subscribe((zone) => {
45
+ this.currentSpaceID = this.navigatorService.currentSpaceID;
46
+ if (!this.currentSpaceID) {
47
+ this.objects3DUpdated.next({ space: [], zone: null });
48
+ this.zoneIDFilter = null;
49
+ }
50
+ else if (zone.id !== this.zoneIDFilter && !this.userService.isMuseumUser(this.currentSpaceID)) {
51
+ this.zoneIDFilter = zone.id;
52
+ this.initObjects3D();
53
+ }
54
+ });
55
+ this.updateDone.subscribe(() => {
56
+ if (this.currentSpaceID) {
57
+ this.initObjects3D().catch(e => console.log(e));
58
+ }
59
+ });
60
+ }
61
+ async getObjects3DBySpace(spaceID) {
62
+ const list = [];
63
+ if (this.API.__proto__.hasOwnProperty('Objects3DBySpace')) {
64
+ const objects = await this.API.__proto__.Objects3DBySpace(spaceID);
65
+ if (objects) {
66
+ for (const object of objects.items) {
67
+ const zoneObject = { ...object };
68
+ list.push(zoneObject);
69
+ }
70
+ }
71
+ return list;
72
+ }
73
+ else {
74
+ throw new Error('objects3DBySpace not implemented');
75
+ }
76
+ }
77
+ async initObjects3D() {
78
+ if (!this.currentSpaceID) {
79
+ return;
80
+ }
81
+ this.updating.next(true);
82
+ this.isUpdating = true;
83
+ const object3DList = await this.getObjects3DBySpace(this.currentSpaceID);
84
+ if (object3DList.length > 0) {
85
+ let filteredObjects3D = [...object3DList];
86
+ this.currentObjects3D.zone = filteredObjects3D; // not sorted!
87
+ filteredObjects3D =
88
+ await this.filterService.filterObjectsForCurrentUserInSpace(filteredObjects3D, this.currentSpaceID);
89
+ this.currentObjects3D.space = filteredObjects3D;
90
+ if (this.zoneIDFilter) {
91
+ filteredObjects3D = await this.filterService.filterObjectsForZone(filteredObjects3D, this.zoneIDFilter);
92
+ }
93
+ this.currentObjects3D.zone = filteredObjects3D;
94
+ this.objects3DUpdated.next(this.currentObjects3D);
95
+ }
96
+ else {
97
+ this.objects3DUpdated.next({ space: [], zone: [] }); // for lateral menu
98
+ }
99
+ this.updating.next(false);
100
+ this.isUpdating = false;
101
+ }
102
+ getSelectedObject3D() {
103
+ return this.selectedObject3D;
104
+ }
105
+ setSelectedObject3D(selected) {
106
+ this.selectedObject3D = selected;
107
+ }
108
+ // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
109
+ // initSubscriptions() {
110
+ // if (!this.isMuseumUser) {
111
+ // this.navigatorService.zoneChange
112
+ // .pipe(takeUntil(this.destroy$))
113
+ // .subscribe((zone) => {
114
+ // if (!zone || !this.navigatorService.currentSpaceID) {
115
+ // this.currentSpaceID = this.navigatorService.currentSpaceID;
116
+ // this.objects3DUpdated.next({space: [], zone: null});
117
+ // this.zoneIDFilter = null;
118
+ // this.currentObjects3D = {
119
+ // space: [],
120
+ // zonesMap: new Map(),
121
+ // };
122
+ // return;
123
+ // }
124
+ // if (zone.id !== this.zoneIDFilter) {
125
+ // this.zoneIDFilter = zone.id;
126
+ // this.currentZone = zone;
127
+ // if (this.currentSpaceID === this.navigatorService.currentSpaceID) {
128
+ // // same space, only zone update
129
+ // // console.log(
130
+ // // "going to update equips for zone (same space)",
131
+ // // zone,
132
+ // // );
133
+ //
134
+ // this.updateObjects3DForZone();
135
+ // } else {
136
+ // this.currentSpaceID = this.navigatorService.currentSpaceID;
137
+ // // console.log(
138
+ // // "going to init equips for zone for new space",
139
+ // // this.currentSpaceID,
140
+ // // );
141
+ // this.initObjects3D().catch(e => console.log(e));
142
+ // }
143
+ // }
144
+ // });
145
+ //
146
+ // this.deleteObservable
147
+ // .pipe(takeUntil(this.destroy$))
148
+ // .subscribe((object3D) => {
149
+ // if (this.currentSpaceID) {
150
+ // this.updateDueToDelete(object3D);
151
+ // }
152
+ // });
153
+ //
154
+ // this.createObservable
155
+ // .pipe(takeUntil(this.destroy$))
156
+ // .subscribe((object3D) => {
157
+ // if (this.currentSpaceID) {
158
+ // this.updateDueToCreate(object3D);
159
+ // }
160
+ // });
161
+ //
162
+ // this.updateObservable
163
+ // .pipe(takeUntil(this.destroy$))
164
+ // .subscribe((object3D) => {
165
+ // if (this.currentSpaceID) {
166
+ // this.updateDueToObject3DUpdated(object3D);
167
+ // }
168
+ // });
169
+ // }
170
+ // }
171
+ updateDueToDelete(deletedObject3D) {
172
+ // console.log("update due to delete", deletedObject3D);
173
+ const obj = this.currentObjects3D.space.find((_equip) => _equip.id === deletedObject3D.id);
174
+ if (obj) {
175
+ const index = this.currentObjects3D.space.indexOf(obj);
176
+ this.currentObjects3D.space.splice(index, 1);
177
+ }
178
+ // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
179
+ // for (const zone of this.currentObjects3D.zonesMap.keys()) {
180
+ // const equipToDelete = this.currentObjects3D.zonesMap
181
+ // .get(zone)
182
+ // .find((_equip) => _equip.id === deletedObject3D.id);
183
+ // if (equipToDelete) {
184
+ // const index = this.currentObjects3D.zonesMap
185
+ // .get(zone)
186
+ // .indexOf(equipToDelete);
187
+ // this.currentObjects3D.zonesMap.get(zone).splice(index, 1);
188
+ // }
189
+ // }
190
+ this.objects3DUpdated.next({
191
+ space: this.currentObjects3D.space,
192
+ zone: this.currentObjects3D.zone,
193
+ // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
194
+ // zone: this.currentObjects3D.zonesMap.get(this.zoneIDFilter),
195
+ }); // for lateral menu
196
+ }
197
+ updateDueToCreate(createdObj3D) {
198
+ this.currentObjects3D.space.unshift(createdObj3D);
199
+ this.currentObjects3D.zone.unshift(createdObj3D);
200
+ // this.currentObjects3D.zonesMap
201
+ // .get(this.zoneIDFilter)
202
+ // .unshift(createdEquip);
203
+ this.objects3DUpdated.next({
204
+ space: this.currentObjects3D.space,
205
+ zone: this.currentObjects3D.zone,
206
+ // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
207
+ // zone: this.currentObjects3D.zonesMap.get(this.zoneIDFilter),
208
+ }); // for lateral menu
209
+ }
210
+ // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
211
+ // Not implemented since not used yet!
212
+ // updateDueToObject3DUpdated(updatedObject3D: Object3D) {
213
+ // const obj = this.currentObjects3D.space.find(
214
+ // (_equip) => _equip.id === updatedObject3D.id
215
+ // );
216
+ // if (obj) {
217
+ // const index = this.currentObjects3D.space.indexOf(obj);
218
+ // // Not used yet!
219
+ // // if (this.isArchived(obj)) {
220
+ // // // we remove archived equipment
221
+ // // this.currentObjects3D.space.splice(index, 1);
222
+ // // } else {
223
+ // this.currentObjects3D.space.splice(index, 1, updatedObject3D);
224
+ // // }
225
+ // }
226
+ // for (const zone of this.currentObjects3D.zonesMap.keys()) {
227
+ // const equipToUpd = this.currentObjects3D.zonesMap
228
+ // .get(zone)
229
+ // .find((_equip) => _equip.id === updatedObject3D.id);
230
+ // if (equipToUpd) {
231
+ // const index = this.currentObjects3D.zonesMap
232
+ // .get(zone)
233
+ // .indexOf(equipToUpd);
234
+ // // Not used yet!
235
+ // // if (this.isArchived(obj)) {
236
+ // // this.currentObjects3D.zonesMap.get(zone).splice(index, 1);
237
+ // // } else {
238
+ // this.currentObjects3D.zonesMap
239
+ // .get(zone)
240
+ // .splice(index, 1, updatedObject3D);
241
+ // // }
242
+ // }
243
+ // }
244
+ // this.objects3DUpdated.next({
245
+ // space: this.currentObjects3D.space,
246
+ // zone: this.currentObjects3D.zonesMap.get(this.zoneIDFilter),
247
+ // }); // for lateral menu
248
+ // }
249
+ // THE FOLLOWING LOGIC IS EQUIP. SPECIFIC
250
+ // Not implemented since not used yet!
251
+ // async updateObjects3DForZone() {
252
+ // this.updating.next(true);
253
+ // let filteredObjects3D: Object3D[] = [];
254
+ // if (this.currentObjects3D.space.length > 0) {
255
+ // if (
256
+ // this.zoneIDFilter &&
257
+ // this.currentObjects3D.zonesMap.has(this.zoneIDFilter)
258
+ // ) {
259
+ // filteredObjects3D = this.currentObjects3D.zonesMap.get(this.zoneIDFilter);
260
+ // } else {
261
+ // filteredObjects3D = (await this.filterService.filterObjectsForZone(
262
+ // this.currentObjects3D.space,
263
+ // this.zoneIDFilter,
264
+ // this.currentZone
265
+ // )) as Object3D[];
266
+ //
267
+ // this.currentObjects3D.zonesMap.set(this.zoneIDFilter, [
268
+ // ...filteredObjects3D,
269
+ // ]);
270
+ // }
271
+ // // Not implemented yet!
272
+ // // if (this.object3DDomainFilter) {
273
+ // // filteredObjects3D = this.filterService.filterObjects3DByDomainList(
274
+ // // filteredObjects3D,
275
+ // // this.object3DDomainFilter
276
+ // // );
277
+ // // }
278
+ // // Not used for objects now!
279
+ // // this.objects3DTags.next(filteredObjects3D); // adding tags only for the current zone
280
+ // this.objects3DUpdated.next({
281
+ // space: this.currentObjects3D.space,
282
+ // zone: filteredObjects3D,
283
+ // }); // for lateral menu
284
+ // } else {
285
+ // this.objects3DUpdated.next({space: [], zone: []}); // for lateral menu
286
+ // }
287
+ // this.updating.next(false);
288
+ // }
289
+ /**
290
+ * Not implemented yet! May be usefull for the future (filter 3D objects for a given authorized user: example libs of objects)
291
+ * @param objectId
292
+ */
293
+ // async getObjects3DBySpaceForUser(spaceID: string): Promise<Object3D[]> {
294
+ // const missionForLocation = this.userService.currentMission(spaceID);
295
+ // const list = [];
296
+ // if (missionForLocation && missionForLocation.objectId) {
297
+ // const allowedObject3D = await this.getObject3D(missionForLocation.objectId);
298
+ // allowedObject3D.virtual = this.zoneIsVirtual(allowedObject3D);
299
+ // if (!allowedObject3D.parent) {
300
+ // // the whole building is authorized
301
+ // return this.getObjects3DBySpace(spaceID);
302
+ // }
303
+ // list.push(allowedObject3D);
304
+ // // allow all children zones of an allowed parent
305
+ // const children = (await this.API.__proto__.objects3DByObject3D(allowedObject3D.id)).items;
306
+ // if (children.length > 0) {
307
+ // for (const child of children) {
308
+ // const childObject3D = { ...child } as Object3D;
309
+ // childObject3D.virtual = this.zoneIsVirtual(child);
310
+ // list.push(childObject3D);
311
+ // }
312
+ // }
313
+ // // allow the parent Floor of the allowed zone
314
+ // if (allowedObject3D.parent.layer && allowedObject3D.parent.layer.name === "FLOOR") {
315
+ // list.push(allowedObject3D.parent);
316
+ // }
317
+ // } else {
318
+ // return this.getObjects3DBySpace(spaceID);
319
+ // }
320
+ // return list;
321
+ // }
322
+ async deleteObject3D(objectId) {
323
+ return this.API.__proto__.DeleteObject3D({ id: objectId });
324
+ }
325
+ async create(input) {
326
+ return this.API.__proto__.CreateObject3D(input);
327
+ }
328
+ async updateObject3D(input) {
329
+ return this.API.__proto__.UpdateObject3D(input);
330
+ }
331
+ /** Basic CRUD operations */
332
+ async readObject3D(id) {
333
+ return this.API.__proto__.GetObject3D(id);
334
+ }
335
+ async adaptObject3D(object3D) {
336
+ // Not required here!
337
+ return object3D;
338
+ }
339
+ async updateObject3DWithEvent(object3D, event) {
340
+ const receivedObject3D = await this.updateObject3D(object3D);
341
+ if (receivedObject3D) {
342
+ console.log("Updated object3D :");
343
+ console.log(receivedObject3D);
344
+ // Not sent currently: ask if needed...
345
+ // if (event) {
346
+ // await this.addEventToObject3D(receivedObject3D, event);
347
+ // }
348
+ this.updateDone.next(true);
349
+ }
350
+ return receivedObject3D;
351
+ }
352
+ }
353
+ Object3DService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: Object3DService, deps: [{ token: 'currentAPIService' }, { token: i1.BaseUserService }, { token: i2.NavigatorService }, { token: i3.ZoneChangeService }, { token: i4.FilterService }], target: i0.ɵɵFactoryTarget.Injectable });
354
+ Object3DService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: Object3DService, providedIn: "root" });
355
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: Object3DService, decorators: [{
356
+ type: Injectable,
357
+ args: [{
358
+ providedIn: "root",
359
+ }]
360
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
361
+ type: Inject,
362
+ args: ['currentAPIService']
363
+ }] }, { type: i1.BaseUserService }, { type: i2.NavigatorService }, { type: i3.ZoneChangeService }, { type: i4.FilterService }]; } });
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0M0Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbW9kZWxzL29iamVjdDNELnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVM3QixNQUFNLE9BQU8sZUFBZTtJQXVEMUIsWUFBeUMsV0FBZ0IsRUFDckMsV0FBNEIsRUFDNUIsZ0JBQWtDLEVBQ2xDLGlCQUFvQyxFQUNwQyxhQUE0QjtRQUg1QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBeERoRCxxQkFBZ0IsR0FHWCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRW5CLHFCQUFnQixHQUlaO1lBQ0YsS0FBSyxFQUFFLEVBQUU7WUFDVCxJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7UUFFRixZQUFZO1FBQ1osc0JBQXNCO1FBQ3RCLHVCQUF1QjtRQUN2Qix1Q0FBdUM7UUFDdkMsUUFBUTtRQUNSLGVBQWU7UUFDZix5QkFBeUI7UUFDekIsS0FBSztRQUVMLGVBQVUsR0FBcUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVE3QyxnR0FBZ0c7UUFDaEcseUJBQW9CLEdBQWEsSUFBSSxDQUFDO1FBRXRDLGFBQVEsR0FBcUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUUzQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFMUIscUJBQWdCLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFcEQscUJBQWdCLEdB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QUFxQjtRQUNyQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixRQUFxQyxFQUNyQyxLQUFhO1FBRWIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlCLHVDQUF1QztZQUN2QyxlQUFlO1lBQ2YsNERBQTREO1lBQzVELElBQUk7WUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjtRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzs7NEdBclpVLGVBQWUsa0JBdUROLG1CQUFtQjtnSEF2RDVCLGVBQWUsY0FGZCxNQUFNOzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkF3RGMsTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7RXZlbnQsIElVcGRhdGUsIE9iamVjdDNELCBab25lfSBmcm9tIFwiLi4vLi4vdHlwZXMuc2VydmljZVwiO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtCYXNlVXNlclNlcnZpY2V9IGZyb20gXCIuLi91c2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7TmF2aWdhdG9yU2VydmljZX0gZnJvbSBcIi4uL25hdmlnYXRvci5zZXJ2aWNlXCI7XG5pbXBvcnQge0ZpbHRlclNlcnZpY2V9IGZyb20gXCIuLi9maWx0ZXIuc2VydmljZVwiO1xuaW1wb3J0IHtab25lQ2hhbmdlU2VydmljZX0gZnJvbSBcIi4uL3pvbmVDaGFuZ2Uuc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBPYmplY3QzRFNlcnZpY2Uge1xuICBBUEk6IGFueTsgLy9BV1MgQVBJU2VydmljZVxuXG4gIG9iamVjdHMzRFVwZGF0ZWQ6IFN1YmplY3Q8e1xuICAgIHNwYWNlOiBPYmplY3QzRFtdO1xuICAgIHpvbmU6IE9iamVjdDNEW107XG4gIH0+ID0gbmV3IFN1YmplY3QoKTtcblxuICBjdXJyZW50T2JqZWN0czNEOiB7XG4gICAgc3BhY2U6IE9iamVjdDNEW107XG4gICAgem9uZTogT2JqZWN0M0RbXVxuICB9XG4gICAgPSB7XG4gICAgc3BhY2U6IFtdLFxuICAgIHpvbmU6IFtdXG4gIH07XG5cbiAgLy8gYmFkIG5hbWUhXG4gIC8vIGN1cnJlbnRPYmplY3RzM0Q6IHtcbiAgLy8gICBzcGFjZTogT2JqZWN0M0RbXTtcbiAgLy8gICB6b25lc01hcDogTWFwPHN0cmluZywgT2JqZWN0M0RbXT47XG4gIC8vIH0gPSB7XG4gIC8vICAgc3BhY2U6IFtdLFxuICAvLyAgIHpvbmVzTWFwOiBuZXcgTWFwKCksXG4gIC8vIH07XG5cbiAgdXBkYXRlRG9uZTogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgem9uZUlERmlsdGVyOiBzdHJpbmc7XG5cbiAgY3VycmVudFpvbmU6IFpvbmU7XG5cbiAgY3VycmVudFNwYWNlSUQ6IHN0cmluZ1xuXG4gIC8qKiBOdWxsIG1lYW5zIHdlIGRvIG5vdCBhcHBseSBhIGZpbHRlciwgZW1wdHkgYXJyYXkgKFtdKSwgbWVhbnMgd2UgdGhhdCB3ZSBoaWRlIGFsbCBvYmplY3QzRCAqL1xuICBvYmplY3QzRERvbWFpbkZpbHRlcjogc3RyaW5nW10gPSBudWxsO1xuXG4gIHVwZGF0aW5nOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcblxuICBjdXJyZW50bHlVcGRhdGluZyA9IGZhbHNlO1xuXG4gIGRlbGV0ZU9ic2VydmFibGU6IFN1YmplY3Q8T2JqZWN0M0Q+ID0gbmV3IFN1YmplY3QoKTtcblxuICBjcmVhdGVPYnNlcnZhYmxlOiBTdWJqZWN0PE9iamVjdDNEPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgdXBkYXRlT2JzZXJ2YWJsZTogU3ViamVjdDxPYmplY3QzRD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIGlzTXVzZXVtVXNlciA9IGZhbHNlO1xuXG4gIGlzVXBkYXRpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIHNlbGVjdGVkT2JqZWN0M0Q6IGFueTsgLy8gc2VsZWN0ZWQgZnJvbSBzcHJpdGUgY2Fycm91c2VsIHZpZXdlciAobGliIG9mIG9iamVjdHMzRClcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KCdjdXJyZW50QVBJU2VydmljZScpIGFwaUluamVjdGVkOiBhbnksXG4gICAgICAgICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHpvbmVDaGFuZ2VTZXJ2aWNlOiBab25lQ2hhbmdlU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcbiAgICAvLyB0aGlzLmlzTXVzZXVtVXNlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzT25seU11c2V1bVJvbGUoKTsgLy8gTm90IHVzZWQgeWV0IVxuXG4gICAgdGhpcy5vYmplY3RzM0RVcGRhdGVkLnN1YnNjcmliZSgobGlzdCkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNEID0gbGlzdDtcbiAgICB9KTtcblxuICAgIHRoaXMuem9uZUNoYW5nZVNlcnZpY2Uuem9uZUNoYW5nZS5zdWJzY3JpYmUoKHpvbmUpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFNwYWNlSUQgPSB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQ7XG4gICAgICBpZiAoIXRoaXMuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgICAgdGhpcy5vYmplY3RzM0RVcGRhdGVkLm5leHQoe3NwYWNlOiBbXSwgem9uZTogbnVsbH0pO1xuICAgICAgICB0aGlzLnpvbmVJREZpbHRlciA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHpvbmUuaWQgIT09IHRoaXMuem9uZUlERmlsdGVyICYmICF0aGlzLnVzZXJTZXJ2aWNlLmlzTXVzZXVtVXNlcih0aGlzLmN1cnJlbnRTcGFjZUlEKSkge1xuICAgICAgICB0aGlzLnpvbmVJREZpbHRlciA9IHpvbmUuaWQ7XG4gICAgICAgIHRoaXMuaW5pdE9iamVjdHMzRCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVEb25lLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xuICAgICAgICAgIHRoaXMuaW5pdE9iamVjdHMzRCgpLmNhdGNoKGUgPT4gY29uc29sZS5sb2coZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0T2JqZWN0czNEQnlTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PE9iamVjdDNEPj4ge1xuICAgIGNvbnN0IGxpc3Q6IE9iamVjdDNEW10gPSBbXTtcbiAgICBpZiAodGhpcy5BUEkuX19wcm90b19fLmhhc093blByb3BlcnR5KCdPYmplY3RzM0RCeVNwYWNlJykpIHtcbiAgICAgIGNvbnN0IG9iamVjdHMgPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uT2JqZWN0czNEQnlTcGFjZShzcGFjZUlEKTtcbiAgICAgIGlmIChvYmplY3RzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMuaXRlbXMpIHtcbiAgICAgICAgICBjb25zdCB6b25lT2JqZWN0ID0gey4uLm9iamVjdH0gYXMgT2JqZWN0M0Q7XG4gICAgICAgICAgbGlzdC5wdXNoKHpvbmVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvYmplY3RzM0RCeVNwYWNlIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICB9XG5cbiAgYXN5bmMgaW5pdE9iamVjdHMzRCgpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGluZy5uZXh0KHRydWUpO1xuICAgIHRoaXMuaXNVcGRhdGluZyA9IHRydWU7XG4gICAgY29uc3Qgb2JqZWN0M0RMaXN0ID0gYXdhaXQgdGhpcy5nZXRPYmplY3RzM0RCeVNwYWNlKHRoaXMuY3VycmVudFNwYWNlSUQpO1xuXG4gICAgaWYgKG9iamVjdDNETGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZmlsdGVyZWRPYmplY3RzM0QgPSBbLi4ub2JqZWN0M0RMaXN0XTtcbiAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lID0gZmlsdGVyZWRPYmplY3RzM0Q7IC8vIG5vdCBzb3J0ZWQhXG5cbiAgICAgIGZpbHRlcmVkT2JqZWN0czNEID1cbiAgICAgICAgYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3JDdXJyZW50VXNlckluU3BhY2UoXG4gICAgICAgICAgZmlsdGVyZWRPYmplY3RzM0QsXG4gICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRFxuICAgICAgICApO1xuICAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlID0gZmlsdGVyZWRPYmplY3RzM0Q7XG4gICAgICBpZiAodGhpcy56b25lSURGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyZWRPYmplY3RzM0QgPSBhd2FpdCB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyT2JqZWN0c0ZvclpvbmUoXG4gICAgICAgICAgZmlsdGVyZWRPYmplY3RzM0QsXG4gICAgICAgICAgdGhpcy56b25lSURGaWx0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lID0gZmlsdGVyZWRPYmplY3RzM0Q7XG4gICAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh0aGlzLmN1cnJlbnRPYmplY3RzM0QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7c3BhY2U6IFtdLCB6b25lOiBbXX0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XG4gICAgfVxuICAgIHRoaXMudXBkYXRpbmcubmV4dChmYWxzZSk7XG4gICAgdGhpcy5pc1VwZGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICBnZXRTZWxlY3RlZE9iamVjdDNEKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPYmplY3QzRDtcbiAgfVxuXG4gIHNldFNlbGVjdGVkT2JqZWN0M0Qoc2VsZWN0ZWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QzRCA9IHNlbGVjdGVkO1xuICB9XG5cblxuICAvLyBUSEUgRk9MTE9XSU5HIExPR0lDIElTIEVRVUlQLiBTUEVDSUZJQ1xuICAvLyBpbml0U3Vic2NyaXB0aW9ucygpIHtcbiAgLy8gICBpZiAoIXRoaXMuaXNNdXNldW1Vc2VyKSB7XG4gIC8vICAgICB0aGlzLm5hdmlnYXRvclNlcnZpY2Uuem9uZUNoYW5nZVxuICAvLyAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gIC8vICAgICAgIC5zdWJzY3JpYmUoKHpvbmUpID0+IHtcbiAgLy8gICAgICAgICBpZiAoIXpvbmUgfHwgIXRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRCkge1xuICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCA9IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRDtcbiAgLy8gICAgICAgICAgIHRoaXMub2JqZWN0czNEVXBkYXRlZC5uZXh0KHtzcGFjZTogW10sIHpvbmU6IG51bGx9KTtcbiAgLy8gICAgICAgICAgIHRoaXMuem9uZUlERmlsdGVyID0gbnVsbDtcbiAgLy8gICAgICAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRCA9IHtcbiAgLy8gICAgICAgICAgICAgc3BhY2U6IFtdLFxuICAvLyAgICAgICAgICAgICB6b25lc01hcDogbmV3IE1hcCgpLFxuICAvLyAgICAgICAgICAgfTtcbiAgLy8gICAgICAgICAgIHJldHVybjtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgICAgaWYgKHpvbmUuaWQgIT09IHRoaXMuem9uZUlERmlsdGVyKSB7XG4gIC8vICAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlciA9IHpvbmUuaWQ7XG4gIC8vICAgICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gem9uZTtcbiAgLy8gICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEID09PSB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQpIHtcbiAgLy8gICAgICAgICAgICAgLy8gc2FtZSBzcGFjZSwgIG9ubHkgem9uZSB1cGRhdGVcbiAgLy8gICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgICAgICAgICAgIC8vICAgICBcImdvaW5nIHRvIHVwZGF0ZSBlcXVpcHMgZm9yIHpvbmUgKHNhbWUgc3BhY2UpXCIsXG4gIC8vICAgICAgICAgICAgIC8vICAgICB6b25lLFxuICAvLyAgICAgICAgICAgICAvLyApO1xuICAvL1xuICAvLyAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9iamVjdHMzREZvclpvbmUoKTtcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgICAgIHRoaXMuY3VycmVudFNwYWNlSUQgPSB0aGlzLm5hdmlnYXRvclNlcnZpY2UuY3VycmVudFNwYWNlSUQ7XG4gIC8vICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgICAgICAgICAgICAvLyAgICAgXCJnb2luZyB0byBpbml0IGVxdWlwcyBmb3Igem9uZSBmb3IgbmV3IHNwYWNlXCIsXG4gIC8vICAgICAgICAgICAgIC8vICAgICB0aGlzLmN1cnJlbnRTcGFjZUlELFxuICAvLyAgICAgICAgICAgICAvLyApO1xuICAvLyAgICAgICAgICAgICB0aGlzLmluaXRPYmplY3RzM0QoKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH0pO1xuICAvL1xuICAvLyAgICAgdGhpcy5kZWxldGVPYnNlcnZhYmxlXG4gIC8vICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgLy8gICAgICAgLnN1YnNjcmliZSgob2JqZWN0M0QpID0+IHtcbiAgLy8gICAgICAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xuICAvLyAgICAgICAgICAgdGhpcy51cGRhdGVEdWVUb0RlbGV0ZShvYmplY3QzRCk7XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9KTtcbiAgLy9cbiAgLy8gICAgIHRoaXMuY3JlYXRlT2JzZXJ2YWJsZVxuICAvLyAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gIC8vICAgICAgIC5zdWJzY3JpYmUoKG9iamVjdDNEKSA9PiB7XG4gIC8vICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQpIHtcbiAgLy8gICAgICAgICAgIHRoaXMudXBkYXRlRHVlVG9DcmVhdGUob2JqZWN0M0QpO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSk7XG4gIC8vXG4gIC8vICAgICB0aGlzLnVwZGF0ZU9ic2VydmFibGVcbiAgLy8gICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAvLyAgICAgICAuc3Vic2NyaWJlKChvYmplY3QzRCkgPT4ge1xuICAvLyAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XG4gIC8vICAgICAgICAgICB0aGlzLnVwZGF0ZUR1ZVRvT2JqZWN0M0RVcGRhdGVkKG9iamVjdDNEKTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH0pO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIHVwZGF0ZUR1ZVRvRGVsZXRlKGRlbGV0ZWRPYmplY3QzRDogT2JqZWN0M0QpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcInVwZGF0ZSBkdWUgdG8gZGVsZXRlXCIsIGRlbGV0ZWRPYmplY3QzRCk7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLmZpbmQoXG4gICAgICAoX2VxdWlwKSA9PiBfZXF1aXAuaWQgPT09IGRlbGV0ZWRPYmplY3QzRC5pZFxuICAgICk7XG4gICAgaWYgKG9iaikge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRPYmplY3RzM0Quc3BhY2UuaW5kZXhPZihvYmopO1xuICAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIC8vIFRIRSBGT0xMT1dJTkcgTE9HSUMgSVMgRVFVSVAuIFNQRUNJRklDXG4gICAgLy8gZm9yIChjb25zdCB6b25lIG9mIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcC5rZXlzKCkpIHtcbiAgICAvLyAgIGNvbnN0IGVxdWlwVG9EZWxldGUgPSB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXBcbiAgICAvLyAgICAgLmdldCh6b25lKVxuICAgIC8vICAgICAuZmluZCgoX2VxdWlwKSA9PiBfZXF1aXAuaWQgPT09IGRlbGV0ZWRPYmplY3QzRC5pZCk7XG4gICAgLy8gICBpZiAoZXF1aXBUb0RlbGV0ZSkge1xuICAgIC8vICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcFxuICAgIC8vICAgICAgIC5nZXQoem9uZSlcbiAgICAvLyAgICAgICAuaW5kZXhPZihlcXVpcFRvRGVsZXRlKTtcbiAgICAvLyAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwLmdldCh6b25lKS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7XG4gICAgICBzcGFjZTogdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLFxuICAgICAgem9uZTogdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmUsXG4gICAgICAvLyBUSEUgRk9MTE9XSU5HIExPR0lDIElTIEVRVUlQLiBTUEVDSUZJQ1xuICAgICAgLy8gem9uZTogdGhpcy5jdXJyZW50T2JqZWN0czNELnpvbmVzTWFwLmdldCh0aGlzLnpvbmVJREZpbHRlciksXG4gICAgfSk7IC8vIGZvciBsYXRlcmFsIG1lbnVcbiAgfVxuXG4gIHVwZGF0ZUR1ZVRvQ3JlYXRlKGNyZWF0ZWRPYmozRDogT2JqZWN0M0QpIHtcbiAgICB0aGlzLmN1cnJlbnRPYmplY3RzM0Quc3BhY2UudW5zaGlmdChjcmVhdGVkT2JqM0QpO1xuICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lLnVuc2hpZnQoY3JlYXRlZE9iajNEKTtcblxuICAgIC8vIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcFxuICAgIC8vICAgLmdldCh0aGlzLnpvbmVJREZpbHRlcilcbiAgICAvLyAgIC51bnNoaWZ0KGNyZWF0ZWRFcXVpcCk7XG4gICAgdGhpcy5vYmplY3RzM0RVcGRhdGVkLm5leHQoe1xuICAgICAgc3BhY2U6IHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZSxcbiAgICAgIHpvbmU6IHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lLFxuICAgICAgLy8gVEhFIEZPTExPV0lORyBMT0dJQyBJUyBFUVVJUC4gU1BFQ0lGSUNcbiAgICAgIC8vIHpvbmU6IHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcC5nZXQodGhpcy56b25lSURGaWx0ZXIpLFxuICAgIH0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XG4gIH1cblxuICAvLyBUSEUgRk9MTE9XSU5HIExPR0lDIElTIEVRVUlQLiBTUEVDSUZJQ1xuICAvLyBOb3QgaW1wbGVtZW50ZWQgc2luY2Ugbm90IHVzZWQgeWV0IVxuICAvLyB1cGRhdGVEdWVUb09iamVjdDNEVXBkYXRlZCh1cGRhdGVkT2JqZWN0M0Q6IE9iamVjdDNEKSB7XG4gIC8vICAgY29uc3Qgb2JqID0gdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLmZpbmQoXG4gIC8vICAgICAoX2VxdWlwKSA9PiBfZXF1aXAuaWQgPT09IHVwZGF0ZWRPYmplY3QzRC5pZFxuICAvLyAgICk7XG4gIC8vICAgaWYgKG9iaikge1xuICAvLyAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRPYmplY3RzM0Quc3BhY2UuaW5kZXhPZihvYmopO1xuICAvLyAgICAgLy8gTm90IHVzZWQgeWV0IVxuICAvLyAgICAgLy8gaWYgKHRoaXMuaXNBcmNoaXZlZChvYmopKSB7XG4gIC8vICAgICAvLyAgIC8vIHdlIHJlbW92ZSBhcmNoaXZlZCBlcXVpcG1lbnRcbiAgLy8gICAgIC8vICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLnNwbGljZShpbmRleCwgMSk7XG4gIC8vICAgICAvLyB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy5jdXJyZW50T2JqZWN0czNELnNwYWNlLnNwbGljZShpbmRleCwgMSwgdXBkYXRlZE9iamVjdDNEKTtcbiAgLy8gICAgIC8vIH1cbiAgLy8gICB9XG4gIC8vICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcC5rZXlzKCkpIHtcbiAgLy8gICAgIGNvbnN0IGVxdWlwVG9VcGQgPSB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXBcbiAgLy8gICAgICAgLmdldCh6b25lKVxuICAvLyAgICAgICAuZmluZCgoX2VxdWlwKSA9PiBfZXF1aXAuaWQgPT09IHVwZGF0ZWRPYmplY3QzRC5pZCk7XG4gIC8vICAgICBpZiAoZXF1aXBUb1VwZCkge1xuICAvLyAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcFxuICAvLyAgICAgICAgIC5nZXQoem9uZSlcbiAgLy8gICAgICAgICAuaW5kZXhPZihlcXVpcFRvVXBkKTtcbiAgLy8gICAgICAgLy8gTm90IHVzZWQgeWV0IVxuICAvLyAgICAgICAvLyBpZiAodGhpcy5pc0FyY2hpdmVkKG9iaikpIHtcbiAgLy8gICAgICAgLy8gICB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAuZ2V0KHpvbmUpLnNwbGljZShpbmRleCwgMSk7XG4gIC8vICAgICAgIC8vIH0gZWxzZSB7XG4gIC8vICAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcFxuICAvLyAgICAgICAgIC5nZXQoem9uZSlcbiAgLy8gICAgICAgICAuc3BsaWNlKGluZGV4LCAxLCB1cGRhdGVkT2JqZWN0M0QpO1xuICAvLyAgICAgICAvLyB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyAgIHRoaXMub2JqZWN0czNEVXBkYXRlZC5uZXh0KHtcbiAgLy8gICAgIHNwYWNlOiB0aGlzLmN1cnJlbnRPYmplY3RzM0Quc3BhY2UsXG4gIC8vICAgICB6b25lOiB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKSxcbiAgLy8gICB9KTsgLy8gZm9yIGxhdGVyYWwgbWVudVxuICAvLyB9XG5cbiAgLy8gVEhFIEZPTExPV0lORyBMT0dJQyBJUyBFUVVJUC4gU1BFQ0lGSUNcbiAgLy8gTm90IGltcGxlbWVudGVkIHNpbmNlIG5vdCB1c2VkIHlldCFcbiAgLy8gYXN5bmMgdXBkYXRlT2JqZWN0czNERm9yWm9uZSgpIHtcbiAgLy8gICB0aGlzLnVwZGF0aW5nLm5leHQodHJ1ZSk7XG4gIC8vICAgbGV0IGZpbHRlcmVkT2JqZWN0czNEOiBPYmplY3QzRFtdID0gW107XG4gIC8vICAgaWYgKHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZS5sZW5ndGggPiAwKSB7XG4gIC8vICAgICBpZiAoXG4gIC8vICAgICAgIHRoaXMuem9uZUlERmlsdGVyICYmXG4gIC8vICAgICAgIHRoaXMuY3VycmVudE9iamVjdHMzRC56b25lc01hcC5oYXModGhpcy56b25lSURGaWx0ZXIpXG4gIC8vICAgICApIHtcbiAgLy8gICAgICAgZmlsdGVyZWRPYmplY3RzM0QgPSB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAuZ2V0KHRoaXMuem9uZUlERmlsdGVyKTtcbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIGZpbHRlcmVkT2JqZWN0czNEID0gKGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJPYmplY3RzRm9yWm9uZShcbiAgLy8gICAgICAgICB0aGlzLmN1cnJlbnRPYmplY3RzM0Quc3BhY2UsXG4gIC8vICAgICAgICAgdGhpcy56b25lSURGaWx0ZXIsXG4gIC8vICAgICAgICAgdGhpcy5jdXJyZW50Wm9uZVxuICAvLyAgICAgICApKSBhcyBPYmplY3QzRFtdO1xuICAvL1xuICAvLyAgICAgICB0aGlzLmN1cnJlbnRPYmplY3RzM0Quem9uZXNNYXAuc2V0KHRoaXMuem9uZUlERmlsdGVyLCBbXG4gIC8vICAgICAgICAgLi4uZmlsdGVyZWRPYmplY3RzM0QsXG4gIC8vICAgICAgIF0pO1xuICAvLyAgICAgfVxuICAvLyAgICAgLy8gTm90IGltcGxlbWVudGVkIHlldCFcbiAgLy8gICAgIC8vIGlmICh0aGlzLm9iamVjdDNERG9tYWluRmlsdGVyKSB7XG4gIC8vICAgICAvLyAgIGZpbHRlcmVkT2JqZWN0czNEID0gdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHMzREJ5RG9tYWluTGlzdChcbiAgLy8gICAgIC8vICAgICBmaWx0ZXJlZE9iamVjdHMzRCxcbiAgLy8gICAgIC8vICAgICB0aGlzLm9iamVjdDNERG9tYWluRmlsdGVyXG4gIC8vICAgICAvLyAgICk7XG4gIC8vICAgICAvLyB9XG4gIC8vICAgICAvLyBOb3QgdXNlZCBmb3Igb2JqZWN0cyBub3chXG4gIC8vICAgICAvLyB0aGlzLm9iamVjdHMzRFRhZ3MubmV4dChmaWx0ZXJlZE9iamVjdHMzRCk7IC8vIGFkZGluZyB0YWdzIG9ubHkgZm9yIHRoZSBjdXJyZW50IHpvbmVcbiAgLy8gICAgIHRoaXMub2JqZWN0czNEVXBkYXRlZC5uZXh0KHtcbiAgLy8gICAgICAgc3BhY2U6IHRoaXMuY3VycmVudE9iamVjdHMzRC5zcGFjZSxcbiAgLy8gICAgICAgem9uZTogZmlsdGVyZWRPYmplY3RzM0QsXG4gIC8vICAgICB9KTsgLy8gZm9yIGxhdGVyYWwgbWVudVxuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICB0aGlzLm9iamVjdHMzRFVwZGF0ZWQubmV4dCh7c3BhY2U6IFtdLCB6b25lOiBbXX0pOyAvLyBmb3IgbGF0ZXJhbCBtZW51XG4gIC8vICAgfVxuICAvLyAgIHRoaXMudXBkYXRpbmcubmV4dChmYWxzZSk7XG4gIC8vIH1cblxuXG4gIC8qKlxuICAgKiBOb3QgaW1wbGVtZW50ZWQgeWV0ISBNYXkgYmUgdXNlZnVsbCBmb3IgdGhlIGZ1dHVyZSAoZmlsdGVyIDNEIG9iamVjdHMgZm9yIGEgZ2l2ZW4gYXV0aG9yaXplZCB1c2VyOiBleGFtcGxlIGxpYnMgb2Ygb2JqZWN0cylcbiAgICogQHBhcmFtIG9iamVjdElkXG4gICAqL1xuICAvLyBhc3luYyBnZXRPYmplY3RzM0RCeVNwYWNlRm9yVXNlcihzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPE9iamVjdDNEW10+IHtcbiAgLy8gICBjb25zdCBtaXNzaW9uRm9yTG9jYXRpb24gPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKHNwYWNlSUQpO1xuICAvLyAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgLy8gICBpZiAobWlzc2lvbkZvckxvY2F0aW9uICYmIG1pc3Npb25Gb3JMb2NhdGlvbi5vYmplY3RJZCkge1xuICAvLyAgICAgY29uc3QgYWxsb3dlZE9iamVjdDNEID0gYXdhaXQgdGhpcy5nZXRPYmplY3QzRChtaXNzaW9uRm9yTG9jYXRpb24ub2JqZWN0SWQpO1xuICAvLyAgICAgYWxsb3dlZE9iamVjdDNELnZpcnR1YWwgPSB0aGlzLnpvbmVJc1ZpcnR1YWwoYWxsb3dlZE9iamVjdDNEKTtcbiAgLy8gICAgIGlmICghYWxsb3dlZE9iamVjdDNELnBhcmVudCkge1xuICAvLyAgICAgICAvLyB0aGUgd2hvbGUgYnVpbGRpbmcgaXMgYXV0aG9yaXplZFxuICAvLyAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzM0RCeVNwYWNlKHNwYWNlSUQpO1xuICAvLyAgICAgfVxuICAvLyAgICAgbGlzdC5wdXNoKGFsbG93ZWRPYmplY3QzRCk7XG4gIC8vICAgICAvLyBhbGxvdyBhbGwgY2hpbGRyZW4gem9uZXMgb2YgYW4gYWxsb3dlZCBwYXJlbnRcbiAgLy8gICAgIGNvbnN0IGNoaWxkcmVuID0gKGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5vYmplY3RzM0RCeU9iamVjdDNEKGFsbG93ZWRPYmplY3QzRC5pZCkpLml0ZW1zO1xuICAvLyAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgLy8gICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAvLyAgICAgICAgIGNvbnN0IGNoaWxkT2JqZWN0M0QgPSB7IC4uLmNoaWxkIH0gYXMgT2JqZWN0M0Q7XG4gIC8vICAgICAgICAgY2hpbGRPYmplY3QzRC52aXJ0dWFsID0gdGhpcy56b25lSXNWaXJ0dWFsKGNoaWxkKTtcbiAgLy8gICAgICAgICBsaXN0LnB1c2goY2hpbGRPYmplY3QzRCk7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cbiAgLy8gICAgIC8vIGFsbG93IHRoZSBwYXJlbnQgRmxvb3Igb2YgdGhlIGFsbG93ZWQgem9uZVxuICAvLyAgICAgaWYgKGFsbG93ZWRPYmplY3QzRC5wYXJlbnQubGF5ZXIgJiYgYWxsb3dlZE9iamVjdDNELnBhcmVudC5sYXllci5uYW1lID09PSBcIkZMT09SXCIpIHtcbiAgLy8gICAgICAgbGlzdC5wdXNoKGFsbG93ZWRPYmplY3QzRC5wYXJlbnQpO1xuICAvLyAgICAgfVxuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzM0RCeVNwYWNlKHNwYWNlSUQpO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gbGlzdDtcbiAgLy8gfVxuXG4gIGFzeW5jIGRlbGV0ZU9iamVjdDNEKG9iamVjdElkOiBzdHJpbmcpOiBQcm9taXNlPE9iamVjdDNEPiB7XG4gICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5EZWxldGVPYmplY3QzRCh7aWQ6IG9iamVjdElkfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoaW5wdXQ6IE9iamVjdDNEKTogUHJvbWlzZTxPYmplY3QzRD4ge1xuICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uQ3JlYXRlT2JqZWN0M0QoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlT2JqZWN0M0QoaW5wdXQ6IGFueSk6IFByb21pc2U8T2JqZWN0M0Q+IHtcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLlVwZGF0ZU9iamVjdDNEKGlucHV0KTtcbiAgfVxuXG4gIC8qKiBCYXNpYyBDUlVEIG9wZXJhdGlvbnMgKi9cbiAgYXN5bmMgcmVhZE9iamVjdDNEKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkdldE9iamVjdDNEKGlkKTtcbiAgfVxuXG4gIGFzeW5jIGFkYXB0T2JqZWN0M0Qob2JqZWN0M0Q6IE9iamVjdDNEKTogUHJvbWlzZTxPYmplY3QzRD4ge1xuICAgIC8vIE5vdCByZXF1aXJlZCBoZXJlIVxuICAgIHJldHVybiBvYmplY3QzRDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU9iamVjdDNEV2l0aEV2ZW50KFxuICAgIG9iamVjdDNEOiBJVXBkYXRlICYgUGFydGlhbDxPYmplY3QzRD4sXG4gICAgZXZlbnQ/OiBFdmVudCxcbiAgKTogUHJvbWlzZTxPYmplY3QzRD4ge1xuICAgIGNvbnN0IHJlY2VpdmVkT2JqZWN0M0QgPSBhd2FpdCB0aGlzLnVwZGF0ZU9iamVjdDNEKG9iamVjdDNEKTtcbiAgICBpZiAocmVjZWl2ZWRPYmplY3QzRCkge1xuICAgICAgY29uc29sZS5sb2coXCJVcGRhdGVkIG9iamVjdDNEIDpcIik7XG4gICAgICBjb25zb2xlLmxvZyhyZWNlaXZlZE9iamVjdDNEKTtcbiAgICAgIC8vIE5vdCBzZW50IGN1cnJlbnRseTogYXNrIGlmIG5lZWRlZC4uLlxuICAgICAgLy8gaWYgKGV2ZW50KSB7XG4gICAgICAvLyAgIGF3YWl0IHRoaXMuYWRkRXZlbnRUb09iamVjdDNEKHJlY2VpdmVkT2JqZWN0M0QsIGV2ZW50KTtcbiAgICAgIC8vIH1cbiAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVjZWl2ZWRPYmplY3QzRDtcbiAgfVxuXG59XG4iXX0=