@smarterplan/ngx-smarterplan-core 1.2.45 → 1.2.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 -380
  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 -311
  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 +13014 -13014
  85. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  86. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12263 -12263
  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 -75
  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 -842
  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 +2 -2
  169. package/public-api.d.ts +64 -64
  170. package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
@@ -1,206 +1,206 @@
1
- /* eslint-disable class-methods-use-this */
2
- import { Inject, Injectable } from "@angular/core";
3
- import { Subject } from "rxjs";
4
- import { dateHasExpired } from "../../helpers.service";
5
- import { ProfileStatus, RoleStatus } from "../../types.service";
6
- import { DateTime } from "luxon";
7
- import * as i0 from "@angular/core";
8
- export class MissionService {
9
- constructor(
10
- // private affectationService: AffectationService,
11
- apiInjected) {
12
- this.currentMissionsUpdated = new Subject();
13
- this.API = apiInjected;
14
- }
15
- async getMissionsFromUserID(userID) {
16
- return this.API.__proto__.MissionsByUser(userID).then((missions) => {
17
- return missions.items.filter((mis) => !mis.deletedAt);
18
- });
19
- }
20
- async getMissionsByOrderedOrganisation(orderedOrgID) {
21
- return this.API.__proto__.MissionsByOrderedOrganisation(orderedOrgID).then((response) => response.items);
22
- }
23
- async getMissionsByOrganisation(orgID) {
24
- return this.API.__proto__.MissionsByOrganisation(orgID).then((response) => response.items);
25
- }
26
- async create(mission) {
27
- const updMission = await this.API.__proto__.CreateMission(mission);
28
- console.log("Mission created", updMission);
29
- await this.checkIfCurrentUserMissionChanged(updMission);
30
- return updMission;
31
- }
32
- async update(mission) {
33
- const updMission = await this.API.__proto__.UpdateMission(mission);
34
- console.log("Mission updated", updMission);
35
- await this.checkIfCurrentUserMissionChanged(updMission);
36
- return updMission;
37
- }
38
- async assertRoleForUserInOrg(user, org, role) {
39
- return this.getMissionsFromUserID(user.id).then((missions) => {
40
- if (missions) {
41
- const misOrg = missions.filter((mis) => {
42
- return mis.organisationID === org.id && mis.role === role;
43
- });
44
- return misOrg.length > 0;
45
- }
46
- return false;
47
- });
48
- }
49
- async getMissionsByOrderedOrganisationBySpace(ordOrgID, spaceID) {
50
- return this.API.__proto__.MissionsByOrderedOrganisationBySpace(ordOrgID, {
51
- eq: spaceID,
52
- }).then((mis) => mis.items);
53
- }
54
- async softDeleteMission(missionID) {
55
- // const hardDelete = await this.canHardDeteleMission(mission.id);
56
- // if (hardDelete) {
57
- // return this.hardDeleteMission(mission.id);
58
- // }
59
- console.log("Soft Deleting mission");
60
- const missionUpd = await this.update({
61
- id: missionID,
62
- deletedAt: Date.now(),
63
- });
64
- await this.checkIfCurrentUserMissionChanged(missionUpd);
65
- return missionUpd;
66
- }
67
- async list() {
68
- const mis = await this.API.__proto__.ListMissions();
69
- return mis.items.filter((m) => !m.deletedAt);
70
- }
71
- // async canHardDeteleMission(missionID: string): Promise<boolean> {
72
- // const events = (
73
- // await this.API.ListEvents({ ownerID: { eq: missionID } })
74
- // ).items;
75
- // if (events.length > 0) {
76
- // return false;
77
- // }
78
- // const comments = (
79
- // await this.API.ListComments({ ownerID: { eq: missionID } })
80
- // ).items;
81
- // if (comments.length > 0) {
82
- // return false;
83
- // }
84
- // const affectations =
85
- // await this.affectationService.getAffectationsFromMissionID(
86
- // missionID,
87
- // );
88
- // if (affectations.length > 0) {
89
- // return false;
90
- // }
91
- // return true;
92
- // }
93
- async hardDeleteMission(missionID) {
94
- return this.API.__proto__.DeleteMission({ id: missionID });
95
- }
96
- getActivatedMissions(missions) {
97
- const activated = [];
98
- missions.map(async (mission) => {
99
- const isActivated = mission.groups && mission.groups.includes(ProfileStatus.ACTIVE);
100
- if (isActivated) {
101
- activated.push(mission);
102
- }
103
- });
104
- return activated;
105
- }
106
- async getMissionsForZone(zoneID) {
107
- return (await this.API.__proto__.MissionsByZone(zoneID)).items.filter((mis) => !mis.deletedAt);
108
- }
109
- async getMissionsForSpace(spaceID) {
110
- return this.API.__proto__.MissionsBySpace(spaceID).then((missions) => missions.items);
111
- }
112
- activateMission(mis) {
113
- if (mis &&
114
- (!mis.groups || !mis.groups.includes(ProfileStatus.ACTIVE))) {
115
- const groups = mis.groups ? mis.groups : [];
116
- groups.push(ProfileStatus.ACTIVE);
117
- this.update({ id: mis.id, groups });
118
- }
119
- }
120
- async getMissionsByTemplate(templateID) {
121
- return (await this.API.__proto__.MissionsByTemplate(templateID)).items.filter((mis) => !mis.deletedAt);
122
- }
123
- async getMission(missionID) {
124
- return this.API.__proto__.GetMission(missionID);
125
- }
126
- async getMissionsByZoneByRole(zoneID, role) {
127
- return (await this.API.__proto__.MissionsByZoneByRole(zoneID, { eq: role }, null, { deletedAt: { attributeExists: false } }, 200)).items;
128
- }
129
- async checkIfCurrentUserMissionChanged(changedMission) {
130
- if (this.currentUserID === changedMission.userID) {
131
- this.currentMissionsUpdated.next(true);
132
- }
133
- }
134
- async instantMissionsOfCurrent(currentUserID) {
135
- this.currentUserID = currentUserID;
136
- let missions = await this.getMissionsFromUserID(currentUserID);
137
- /** Filter to keep only available missions */
138
- missions = missions.filter((mission) => {
139
- const hasExpired = dateHasExpired(mission.endDateTime);
140
- /** Update this.lastExpiredMission */
141
- if (hasExpired) {
142
- const lastExpiredDate = this.lastExpiredMission
143
- ? new Date(this.lastExpiredMission.endDateTime)
144
- : null;
145
- const dateExpired = new Date(mission.endDateTime);
146
- if (!lastExpiredDate || dateExpired > lastExpiredDate) {
147
- this.lastExpiredMission = mission;
148
- }
149
- }
150
- return !hasExpired;
151
- });
152
- if (missions.some((mis) => mis.role === RoleStatus.VISITOR_MUSEUM) && missions.length > 0) {
153
- // workflow for VISITOR_MUSEUM
154
- return missions;
155
- }
156
- /** Keep only started missions */
157
- let nextMissionDate = null;
158
- missions = missions.filter((mission) => {
159
- const started = mission.startDateTime
160
- ? dateHasExpired(mission.startDateTime)
161
- : true;
162
- /** Update next mission to start */
163
- if (!started) {
164
- const missionDate = new Date(mission.startDateTime);
165
- if (!nextMissionDate || missionDate < nextMissionDate) {
166
- this.nextMissionToStart = mission;
167
- nextMissionDate = missionDate;
168
- }
169
- }
170
- return started;
171
- });
172
- return missions.length > 0 ? missions : null;
173
- }
174
- /**
175
- * Filters the missions that assisted to live of the visit (by comparing the realStartTime of VisitTemplate and connectedAt time)
176
- * @param template VisitTemplate
177
- * @param missions Mission[] missions for this visit
178
- * @returns Mission[] filtered missions
179
- */
180
- filterMissionsAssitedToLiveForTemplate(template, missions) {
181
- const visitStartTimestamp = template.realStartedAt;
182
- return missions.filter((mis) => {
183
- if (!mis.connectedToLiveAt) {
184
- return false;
185
- }
186
- if (mis.connectedToLiveAt.length === 0) {
187
- return false;
188
- }
189
- const lastConnectedAt = mis.connectedToLiveAt[mis.connectedToLiveAt.length - 1];
190
- const lastConnectedAtTimestamp = DateTime.fromISO(lastConnectedAt).toMillis();
191
- return lastConnectedAtTimestamp > visitStartTimestamp;
192
- });
193
- }
194
- }
195
- MissionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MissionService, deps: [{ token: 'currentAPIService' }], target: i0.ɵɵFactoryTarget.Injectable });
196
- MissionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MissionService, providedIn: "root" });
197
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MissionService, decorators: [{
198
- type: Injectable,
199
- args: [{
200
- providedIn: "root",
201
- }]
202
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
203
- type: Inject,
204
- args: ['currentAPIService']
205
- }] }]; } });
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tb2RlbHMvbWlzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQWtDLGFBQWEsRUFBRSxVQUFVLEVBQWlCLE1BQU0scUJBQXFCLENBQUM7QUFDL0csT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFLakMsTUFBTSxPQUFPLGNBQWM7SUFXdkI7SUFDSSxrREFBa0Q7SUFDckIsV0FBZ0I7UUFaakQsMkJBQXNCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQWM1QyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQWM7UUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDL0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdDQUFnQyxDQUNsQyxZQUFvQjtRQUVwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLDZCQUE2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QUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxzQ0FBc0MsQ0FBQyxRQUF1QixFQUFFLFFBQW1CO1FBQy9FLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNuRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFO2dCQUN4QixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELElBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3BDLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlFLE9BQU8sd0JBQXdCLEdBQUcsbUJBQW1CLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzsyR0E1UFEsY0FBYyxrQkFhWCxtQkFBbUI7K0dBYnRCLGNBQWMsY0FGWCxNQUFNOzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFjUSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRhdGVIYXNFeHBpcmVkIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMuc2VydmljZVwiO1xuaW1wb3J0IHsgTWlzc2lvbiwgT3JnYW5pc2F0aW9uLCBQcm9maWxlLCBQcm9maWxlU3RhdHVzLCBSb2xlU3RhdHVzLCBWaXNpdFRlbXBsYXRlIH0gZnJvbSBcIi4uLy4uL3R5cGVzLnNlcnZpY2VcIjtcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSBcImx1eG9uXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcbn0pXG5leHBvcnQgY2xhc3MgTWlzc2lvblNlcnZpY2Uge1xuICAgIGN1cnJlbnRNaXNzaW9uc1VwZGF0ZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgbGFzdEV4cGlyZWRNaXNzaW9uOiBNaXNzaW9uO1xuXG4gICAgbmV4dE1pc3Npb25Ub1N0YXJ0OiBNaXNzaW9uO1xuXG4gICAgY3VycmVudFVzZXJJRDogc3RyaW5nO1xuXG4gICAgQVBJOiBhbnk7IC8vQVdTXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgLy8gcHJpdmF0ZSBhZmZlY3RhdGlvblNlcnZpY2U6IEFmZmVjdGF0aW9uU2VydmljZSxcbiAgICAgICAgQEluamVjdCgnY3VycmVudEFQSVNlcnZpY2UnKSBhcGlJbmplY3RlZDogYW55XG4gICAgKSB7XG4gICAgICAgIHRoaXMuQVBJID0gYXBpSW5qZWN0ZWQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TWlzc2lvbnNGcm9tVXNlcklEKHVzZXJJRDogc3RyaW5nKTogUHJvbWlzZTxNaXNzaW9uW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5NaXNzaW9uc0J5VXNlcih1c2VySUQpLnRoZW4oKG1pc3Npb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWlzc2lvbnMuaXRlbXMuZmlsdGVyKChtaXMpID0+ICFtaXMuZGVsZXRlZEF0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TWlzc2lvbnNCeU9yZGVyZWRPcmdhbmlzYXRpb24oXG4gICAgICAgIG9yZGVyZWRPcmdJRDogc3RyaW5nLFxuICAgICk6IFByb21pc2U8TWlzc2lvbltdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uTWlzc2lvbnNCeU9yZGVyZWRPcmdhbmlzYXRpb24ob3JkZXJlZE9yZ0lEKS50aGVuKFxuICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiByZXNwb25zZS5pdGVtcyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKG9yZ0lEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb25bXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLk1pc3Npb25zQnlPcmdhbmlzYXRpb24ob3JnSUQpLnRoZW4oXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+IHJlc3BvbnNlLml0ZW1zLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZShtaXNzaW9uOiBNaXNzaW9uKTogUHJvbWlzZTxNaXNzaW9uPiB7XG4gICAgICAgIGNvbnN0IHVwZE1pc3Npb24gPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uQ3JlYXRlTWlzc2lvbihtaXNzaW9uKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJNaXNzaW9uIGNyZWF0ZWRcIiwgdXBkTWlzc2lvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZkN1cnJlbnRVc2VyTWlzc2lvbkNoYW5nZWQodXBkTWlzc2lvbik7XG4gICAgICAgIHJldHVybiB1cGRNaXNzaW9uO1xuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZShtaXNzaW9uOiBhbnkpOiBQcm9taXNlPE1pc3Npb24+IHtcbiAgICAgICAgY29uc3QgdXBkTWlzc2lvbiA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5VcGRhdGVNaXNzaW9uKG1pc3Npb24pO1xuICAgICAgICBjb25zb2xlLmxvZyhcIk1pc3Npb24gdXBkYXRlZFwiLCB1cGRNaXNzaW9uKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0lmQ3VycmVudFVzZXJNaXNzaW9uQ2hhbmdlZCh1cGRNaXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHVwZE1pc3Npb247XG4gICAgfVxuXG4gICAgYXN5bmMgYXNzZXJ0Um9sZUZvclVzZXJJbk9yZyhcbiAgICAgICAgdXNlcjogUHJvZmlsZSxcbiAgICAgICAgb3JnOiBPcmdhbmlzYXRpb24sXG4gICAgICAgIHJvbGU6IFJvbGVTdGF0dXMsXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1pc3Npb25zRnJvbVVzZXJJRCh1c2VyLmlkKS50aGVuKChtaXNzaW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKG1pc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlzT3JnID0gbWlzc2lvbnMuZmlsdGVyKChtaXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkICYmIG1pcy5yb2xlID09PSByb2xlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtaXNPcmcubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0TWlzc2lvbnNCeU9yZGVyZWRPcmdhbmlzYXRpb25CeVNwYWNlKFxuICAgICAgICBvcmRPcmdJRDogc3RyaW5nLFxuICAgICAgICBzcGFjZUlEOiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTxNaXNzaW9uW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5NaXNzaW9uc0J5T3JkZXJlZE9yZ2FuaXNhdGlvbkJ5U3BhY2Uob3JkT3JnSUQsIHtcbiAgICAgICAgICAgIGVxOiBzcGFjZUlELFxuICAgICAgICB9KS50aGVuKChtaXMpID0+IG1pcy5pdGVtcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbklEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb24+IHtcbiAgICAgICAgLy8gY29uc3QgaGFyZERlbGV0ZSA9IGF3YWl0IHRoaXMuY2FuSGFyZERldGVsZU1pc3Npb24obWlzc2lvbi5pZCk7XG4gICAgICAgIC8vIGlmIChoYXJkRGVsZXRlKSB7XG4gICAgICAgIC8vICAgICByZXR1cm4gdGhpcy5oYXJkRGVsZXRlTWlzc2lvbihtaXNzaW9uLmlkKTtcbiAgICAgICAgLy8gfVxuICAgICAgICBjb25zb2xlLmxvZyhcIlNvZnQgRGVsZXRpbmcgbWlzc2lvblwiKTtcbiAgICAgICAgY29uc3QgbWlzc2lvblVwZCA9IGF3YWl0IHRoaXMudXBkYXRlKHtcbiAgICAgICAgICAgIGlkOiBtaXNzaW9uSUQsXG4gICAgICAgICAgICBkZWxldGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZDdXJyZW50VXNlck1pc3Npb25DaGFuZ2VkKG1pc3Npb25VcGQpO1xuICAgICAgICByZXR1cm4gbWlzc2lvblVwZDtcbiAgICB9XG5cbiAgICBhc3luYyBsaXN0KCk6IFByb21pc2U8TWlzc2lvbltdPiB7XG4gICAgICAgIGNvbnN0IG1pcyA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5MaXN0TWlzc2lvbnMoKTtcbiAgICAgICAgcmV0dXJuIG1pcy5pdGVtcy5maWx0ZXIoKG0pID0+ICFtLmRlbGV0ZWRBdCk7XG4gICAgfVxuXG4gICAgLy8gYXN5bmMgY2FuSGFyZERldGVsZU1pc3Npb24obWlzc2lvbklEOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyAgICAgY29uc3QgZXZlbnRzID0gKFxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5BUEkuTGlzdEV2ZW50cyh7IG93bmVySUQ6IHsgZXE6IG1pc3Npb25JRCB9IH0pXG4gICAgLy8gICAgICkuaXRlbXM7XG4gICAgLy8gICAgIGlmIChldmVudHMubGVuZ3RoID4gMCkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IGNvbW1lbnRzID0gKFxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5BUEkuTGlzdENvbW1lbnRzKHsgb3duZXJJRDogeyBlcTogbWlzc2lvbklEIH0gfSlcbiAgICAvLyAgICAgKS5pdGVtcztcbiAgICAvLyAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBjb25zdCBhZmZlY3RhdGlvbnMgPVxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5hZmZlY3RhdGlvblNlcnZpY2UuZ2V0QWZmZWN0YXRpb25zRnJvbU1pc3Npb25JRChcbiAgICAvLyAgICAgICAgICAgICBtaXNzaW9uSUQsXG4gICAgLy8gICAgICAgICApO1xuICAgIC8vICAgICBpZiAoYWZmZWN0YXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG5cbiAgICBhc3luYyBoYXJkRGVsZXRlTWlzc2lvbihtaXNzaW9uSUQ6IHN0cmluZyk6IFByb21pc2U8TWlzc2lvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZU1pc3Npb24oeyBpZDogbWlzc2lvbklEIH0pO1xuICAgIH1cblxuICAgIGdldEFjdGl2YXRlZE1pc3Npb25zKG1pc3Npb25zOiBNaXNzaW9uW10pOiBNaXNzaW9uW10ge1xuICAgICAgICBjb25zdCBhY3RpdmF0ZWQgPSBbXTtcbiAgICAgICAgbWlzc2lvbnMubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0FjdGl2YXRlZCA9XG4gICAgICAgICAgICAgICAgbWlzc2lvbi5ncm91cHMgJiYgbWlzc2lvbi5ncm91cHMuaW5jbHVkZXMoUHJvZmlsZVN0YXR1cy5BQ1RJVkUpO1xuICAgICAgICAgICAgaWYgKGlzQWN0aXZhdGVkKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZhdGVkLnB1c2gobWlzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYWN0aXZhdGVkO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1pc3Npb25zRm9yWm9uZSh6b25lSUQ6IHN0cmluZyk6IFByb21pc2U8TWlzc2lvbltdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLk1pc3Npb25zQnlab25lKHpvbmVJRCkpLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChtaXMpID0+ICFtaXMuZGVsZXRlZEF0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1pc3Npb25zRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxNaXNzaW9uW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5NaXNzaW9uc0J5U3BhY2Uoc3BhY2VJRCkudGhlbigobWlzc2lvbnMpID0+IG1pc3Npb25zLml0ZW1zKTtcbiAgICB9XG5cbiAgICBhY3RpdmF0ZU1pc3Npb24obWlzOiBNaXNzaW9uKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG1pcyAmJlxuICAgICAgICAgICAgKCFtaXMuZ3JvdXBzIHx8ICFtaXMuZ3JvdXBzLmluY2x1ZGVzKFByb2ZpbGVTdGF0dXMuQUNUSVZFKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cHMgPSBtaXMuZ3JvdXBzID8gbWlzLmdyb3VwcyA6IFtdO1xuICAgICAgICAgICAgZ3JvdXBzLnB1c2goUHJvZmlsZVN0YXR1cy5BQ1RJVkUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoeyBpZDogbWlzLmlkLCBncm91cHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBnZXRNaXNzaW9uc0J5VGVtcGxhdGUodGVtcGxhdGVJRDogc3RyaW5nKTogUHJvbWlzZTxNaXNzaW9uW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uTWlzc2lvbnNCeVRlbXBsYXRlKHRlbXBsYXRlSUQpKS5pdGVtcy5maWx0ZXIoXG4gICAgICAgICAgICAobWlzKSA9PiAhbWlzLmRlbGV0ZWRBdCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRNaXNzaW9uKG1pc3Npb25JRDogc3RyaW5nKTogUHJvbWlzZTxNaXNzaW9uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uR2V0TWlzc2lvbihtaXNzaW9uSUQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldE1pc3Npb25zQnlab25lQnlSb2xlKFxuICAgICAgICB6b25lSUQ6IHN0cmluZyxcbiAgICAgICAgcm9sZTogUm9sZVN0YXR1cyxcbiAgICApOiBQcm9taXNlPE1pc3Npb25bXT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLk1pc3Npb25zQnlab25lQnlSb2xlKFxuICAgICAgICAgICAgICAgIHpvbmVJRCxcbiAgICAgICAgICAgICAgICB7IGVxOiByb2xlIH0sXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICB7IGRlbGV0ZWRBdDogeyBhdHRyaWJ1dGVFeGlzdHM6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgICAgICAyMDAsXG4gICAgICAgICAgICApXG4gICAgICAgICkuaXRlbXM7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tJZkN1cnJlbnRVc2VyTWlzc2lvbkNoYW5nZWQoY2hhbmdlZE1pc3Npb246IE1pc3Npb24pIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXJJRCA9PT0gY2hhbmdlZE1pc3Npb24udXNlcklEKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNaXNzaW9uc1VwZGF0ZWQubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGluc3RhbnRNaXNzaW9uc09mQ3VycmVudChcbiAgICAgICAgY3VycmVudFVzZXJJRDogc3RyaW5nLFxuICAgICk6IFByb21pc2U8TWlzc2lvbltdIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRVc2VySUQgPSBjdXJyZW50VXNlcklEO1xuICAgICAgICBsZXQgbWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldE1pc3Npb25zRnJvbVVzZXJJRChjdXJyZW50VXNlcklEKTtcblxuICAgICAgICAvKiogRmlsdGVyIHRvIGtlZXAgb25seSBhdmFpbGFibGUgbWlzc2lvbnMgKi9cbiAgICAgICAgbWlzc2lvbnMgPSBtaXNzaW9ucy5maWx0ZXIoKG1pc3Npb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGlyZWQgPSBkYXRlSGFzRXhwaXJlZChtaXNzaW9uLmVuZERhdGVUaW1lKTtcblxuICAgICAgICAgICAgLyoqIFVwZGF0ZSB0aGlzLmxhc3RFeHBpcmVkTWlzc2lvbiAqL1xuICAgICAgICAgICAgaWYgKGhhc0V4cGlyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RXhwaXJlZERhdGUgPSB0aGlzLmxhc3RFeHBpcmVkTWlzc2lvblxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKHRoaXMubGFzdEV4cGlyZWRNaXNzaW9uLmVuZERhdGVUaW1lKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUV4cGlyZWQgPSBuZXcgRGF0ZShtaXNzaW9uLmVuZERhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RFeHBpcmVkRGF0ZSB8fCBkYXRlRXhwaXJlZCA+IGxhc3RFeHBpcmVkRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFeHBpcmVkTWlzc2lvbiA9IG1pc3Npb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICFoYXNFeHBpcmVkO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobWlzc2lvbnMuc29tZSgobWlzKSA9PiBtaXMucm9sZSA9PT0gUm9sZVN0YXR1cy5WSVNJVE9SX01VU0VVTSkgJiYgbWlzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gd29ya2Zsb3cgZm9yIFZJU0lUT1JfTVVTRVVNXG4gICAgICAgICAgICByZXR1cm4gbWlzc2lvbnM7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEtlZXAgb25seSBzdGFydGVkIG1pc3Npb25zICovXG4gICAgICAgIGxldCBuZXh0TWlzc2lvbkRhdGUgPSBudWxsO1xuICAgICAgICBtaXNzaW9ucyA9IG1pc3Npb25zLmZpbHRlcigobWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZCA9IG1pc3Npb24uc3RhcnREYXRlVGltZVxuICAgICAgICAgICAgICAgID8gZGF0ZUhhc0V4cGlyZWQobWlzc2lvbi5zdGFydERhdGVUaW1lKVxuICAgICAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgICAgIC8qKiBVcGRhdGUgbmV4dCBtaXNzaW9uIHRvIHN0YXJ0ICovXG4gICAgICAgICAgICBpZiAoIXN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW9uRGF0ZSA9IG5ldyBEYXRlKG1pc3Npb24uc3RhcnREYXRlVGltZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0TWlzc2lvbkRhdGUgfHwgbWlzc2lvbkRhdGUgPCBuZXh0TWlzc2lvbkRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWlzc2lvblRvU3RhcnQgPSBtaXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBuZXh0TWlzc2lvbkRhdGUgPSBtaXNzaW9uRGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtaXNzaW9ucy5sZW5ndGggPiAwID8gbWlzc2lvbnMgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIG1pc3Npb25zIHRoYXQgYXNzaXN0ZWQgdG8gbGl2ZSBvZiB0aGUgdmlzaXQgKGJ5IGNvbXBhcmluZyB0aGUgcmVhbFN0YXJ0VGltZSBvZiBWaXNpdFRlbXBsYXRlIGFuZCBjb25uZWN0ZWRBdCB0aW1lKVxuICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSBWaXNpdFRlbXBsYXRlIFxuICAgICAqIEBwYXJhbSBtaXNzaW9ucyBNaXNzaW9uW10gbWlzc2lvbnMgZm9yIHRoaXMgdmlzaXRcbiAgICAgKiBAcmV0dXJucyBNaXNzaW9uW10gZmlsdGVyZWQgbWlzc2lvbnNcbiAgICAgKi9cbiAgICBmaWx0ZXJNaXNzaW9uc0Fzc2l0ZWRUb0xpdmVGb3JUZW1wbGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSwgbWlzc2lvbnM6IE1pc3Npb25bXSk6IE1pc3Npb25bXSB7XG4gICAgICAgIGNvbnN0IHZpc2l0U3RhcnRUaW1lc3RhbXAgPSB0ZW1wbGF0ZS5yZWFsU3RhcnRlZEF0O1xuICAgICAgICByZXR1cm4gbWlzc2lvbnMuZmlsdGVyKChtaXMpID0+IHtcbiAgICAgICAgICAgIGlmICghbWlzLmNvbm5lY3RlZFRvTGl2ZUF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1pcy5jb25uZWN0ZWRUb0xpdmVBdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsYXN0Q29ubmVjdGVkQXQgPSBtaXMuY29ubmVjdGVkVG9MaXZlQXRbbWlzLmNvbm5lY3RlZFRvTGl2ZUF0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgbGFzdENvbm5lY3RlZEF0VGltZXN0YW1wID0gRGF0ZVRpbWUuZnJvbUlTTyhsYXN0Q29ubmVjdGVkQXQpLnRvTWlsbGlzKCk7XG4gICAgICAgICAgICByZXR1cm4gbGFzdENvbm5lY3RlZEF0VGltZXN0YW1wID4gdmlzaXRTdGFydFRpbWVzdGFtcDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
1
+ /* eslint-disable class-methods-use-this */
2
+ import { Inject, Injectable } from "@angular/core";
3
+ import { Subject } from "rxjs";
4
+ import { dateHasExpired } from "../../helpers.service";
5
+ import { ProfileStatus, RoleStatus } from "../../types.service";
6
+ import { DateTime } from "luxon";
7
+ import * as i0 from "@angular/core";
8
+ export class MissionService {
9
+ constructor(
10
+ // private affectationService: AffectationService,
11
+ apiInjected) {
12
+ this.currentMissionsUpdated = new Subject();
13
+ this.API = apiInjected;
14
+ }
15
+ async getMissionsFromUserID(userID) {
16
+ return this.API.__proto__.MissionsByUser(userID).then((missions) => {
17
+ return missions.items.filter((mis) => !mis.deletedAt);
18
+ });
19
+ }
20
+ async getMissionsByOrderedOrganisation(orderedOrgID) {
21
+ return this.API.__proto__.MissionsByOrderedOrganisation(orderedOrgID).then((response) => response.items);
22
+ }
23
+ async getMissionsByOrganisation(orgID) {
24
+ return this.API.__proto__.MissionsByOrganisation(orgID).then((response) => response.items);
25
+ }
26
+ async create(mission) {
27
+ const updMission = await this.API.__proto__.CreateMission(mission);
28
+ console.log("Mission created", updMission);
29
+ await this.checkIfCurrentUserMissionChanged(updMission);
30
+ return updMission;
31
+ }
32
+ async update(mission) {
33
+ const updMission = await this.API.__proto__.UpdateMission(mission);
34
+ console.log("Mission updated", updMission);
35
+ await this.checkIfCurrentUserMissionChanged(updMission);
36
+ return updMission;
37
+ }
38
+ async assertRoleForUserInOrg(user, org, role) {
39
+ return this.getMissionsFromUserID(user.id).then((missions) => {
40
+ if (missions) {
41
+ const misOrg = missions.filter((mis) => {
42
+ return mis.organisationID === org.id && mis.role === role;
43
+ });
44
+ return misOrg.length > 0;
45
+ }
46
+ return false;
47
+ });
48
+ }
49
+ async getMissionsByOrderedOrganisationBySpace(ordOrgID, spaceID) {
50
+ return this.API.__proto__.MissionsByOrderedOrganisationBySpace(ordOrgID, {
51
+ eq: spaceID,
52
+ }).then((mis) => mis.items);
53
+ }
54
+ async softDeleteMission(missionID) {
55
+ // const hardDelete = await this.canHardDeteleMission(mission.id);
56
+ // if (hardDelete) {
57
+ // return this.hardDeleteMission(mission.id);
58
+ // }
59
+ console.log("Soft Deleting mission");
60
+ const missionUpd = await this.update({
61
+ id: missionID,
62
+ deletedAt: Date.now(),
63
+ });
64
+ await this.checkIfCurrentUserMissionChanged(missionUpd);
65
+ return missionUpd;
66
+ }
67
+ async list() {
68
+ const mis = await this.API.__proto__.ListMissions();
69
+ return mis.items.filter((m) => !m.deletedAt);
70
+ }
71
+ // async canHardDeteleMission(missionID: string): Promise<boolean> {
72
+ // const events = (
73
+ // await this.API.ListEvents({ ownerID: { eq: missionID } })
74
+ // ).items;
75
+ // if (events.length > 0) {
76
+ // return false;
77
+ // }
78
+ // const comments = (
79
+ // await this.API.ListComments({ ownerID: { eq: missionID } })
80
+ // ).items;
81
+ // if (comments.length > 0) {
82
+ // return false;
83
+ // }
84
+ // const affectations =
85
+ // await this.affectationService.getAffectationsFromMissionID(
86
+ // missionID,
87
+ // );
88
+ // if (affectations.length > 0) {
89
+ // return false;
90
+ // }
91
+ // return true;
92
+ // }
93
+ async hardDeleteMission(missionID) {
94
+ return this.API.__proto__.DeleteMission({ id: missionID });
95
+ }
96
+ getActivatedMissions(missions) {
97
+ const activated = [];
98
+ missions.map(async (mission) => {
99
+ const isActivated = mission.groups && mission.groups.includes(ProfileStatus.ACTIVE);
100
+ if (isActivated) {
101
+ activated.push(mission);
102
+ }
103
+ });
104
+ return activated;
105
+ }
106
+ async getMissionsForZone(zoneID) {
107
+ return (await this.API.__proto__.MissionsByZone(zoneID)).items.filter((mis) => !mis.deletedAt);
108
+ }
109
+ async getMissionsForSpace(spaceID) {
110
+ return this.API.__proto__.MissionsBySpace(spaceID).then((missions) => missions.items);
111
+ }
112
+ activateMission(mis) {
113
+ if (mis &&
114
+ (!mis.groups || !mis.groups.includes(ProfileStatus.ACTIVE))) {
115
+ const groups = mis.groups ? mis.groups : [];
116
+ groups.push(ProfileStatus.ACTIVE);
117
+ this.update({ id: mis.id, groups });
118
+ }
119
+ }
120
+ async getMissionsByTemplate(templateID) {
121
+ return (await this.API.__proto__.MissionsByTemplate(templateID)).items.filter((mis) => !mis.deletedAt);
122
+ }
123
+ async getMission(missionID) {
124
+ return this.API.__proto__.GetMission(missionID);
125
+ }
126
+ async getMissionsByZoneByRole(zoneID, role) {
127
+ return (await this.API.__proto__.MissionsByZoneByRole(zoneID, { eq: role }, null, { deletedAt: { attributeExists: false } }, 200)).items;
128
+ }
129
+ async checkIfCurrentUserMissionChanged(changedMission) {
130
+ if (this.currentUserID === changedMission.userID) {
131
+ this.currentMissionsUpdated.next(true);
132
+ }
133
+ }
134
+ async instantMissionsOfCurrent(currentUserID) {
135
+ this.currentUserID = currentUserID;
136
+ let missions = await this.getMissionsFromUserID(currentUserID);
137
+ /** Filter to keep only available missions */
138
+ missions = missions.filter((mission) => {
139
+ const hasExpired = dateHasExpired(mission.endDateTime);
140
+ /** Update this.lastExpiredMission */
141
+ if (hasExpired) {
142
+ const lastExpiredDate = this.lastExpiredMission
143
+ ? new Date(this.lastExpiredMission.endDateTime)
144
+ : null;
145
+ const dateExpired = new Date(mission.endDateTime);
146
+ if (!lastExpiredDate || dateExpired > lastExpiredDate) {
147
+ this.lastExpiredMission = mission;
148
+ }
149
+ }
150
+ return !hasExpired;
151
+ });
152
+ if (missions.some((mis) => mis.role === RoleStatus.VISITOR_MUSEUM) && missions.length > 0) {
153
+ // workflow for VISITOR_MUSEUM
154
+ return missions;
155
+ }
156
+ /** Keep only started missions */
157
+ let nextMissionDate = null;
158
+ missions = missions.filter((mission) => {
159
+ const started = mission.startDateTime
160
+ ? dateHasExpired(mission.startDateTime)
161
+ : true;
162
+ /** Update next mission to start */
163
+ if (!started) {
164
+ const missionDate = new Date(mission.startDateTime);
165
+ if (!nextMissionDate || missionDate < nextMissionDate) {
166
+ this.nextMissionToStart = mission;
167
+ nextMissionDate = missionDate;
168
+ }
169
+ }
170
+ return started;
171
+ });
172
+ return missions.length > 0 ? missions : null;
173
+ }
174
+ /**
175
+ * Filters the missions that assisted to live of the visit (by comparing the realStartTime of VisitTemplate and connectedAt time)
176
+ * @param template VisitTemplate
177
+ * @param missions Mission[] missions for this visit
178
+ * @returns Mission[] filtered missions
179
+ */
180
+ filterMissionsAssitedToLiveForTemplate(template, missions) {
181
+ const visitStartTimestamp = template.realStartedAt;
182
+ return missions.filter((mis) => {
183
+ if (!mis.connectedToLiveAt) {
184
+ return false;
185
+ }
186
+ if (mis.connectedToLiveAt.length === 0) {
187
+ return false;
188
+ }
189
+ const lastConnectedAt = mis.connectedToLiveAt[mis.connectedToLiveAt.length - 1];
190
+ const lastConnectedAtTimestamp = DateTime.fromISO(lastConnectedAt).toMillis();
191
+ return lastConnectedAtTimestamp > visitStartTimestamp;
192
+ });
193
+ }
194
+ }
195
+ MissionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MissionService, deps: [{ token: 'currentAPIService' }], target: i0.ɵɵFactoryTarget.Injectable });
196
+ MissionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MissionService, providedIn: "root" });
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MissionService, decorators: [{
198
+ type: Injectable,
199
+ args: [{
200
+ providedIn: "root",
201
+ }]
202
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
203
+ type: Inject,
204
+ args: ['currentAPIService']
205
+ }] }]; } });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tb2RlbHMvbWlzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQWtDLGFBQWEsRUFBRSxVQUFVLEVBQWlCLE1BQU0scUJBQXFCLENBQUM7QUFDL0csT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFLakMsTUFBTSxPQUFPLGNBQWM7SUFXdkI7SUFDSSxrREFBa0Q7SUFDckIsV0FBZ0I7UUFaakQsMkJBQXNCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQWM1QyxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQWM7UUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDL0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdDQUFnQyxDQUNsQyxZQUFvQjtRQUVwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLDZCQUE2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QUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxzQ0FBc0MsQ0FBQyxRQUF1QixFQUFFLFFBQW1CO1FBQy9FLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNuRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFO2dCQUN4QixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELElBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3BDLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlFLE9BQU8sd0JBQXdCLEdBQUcsbUJBQW1CLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzsyR0E1UFEsY0FBYyxrQkFhWCxtQkFBbUI7K0dBYnRCLGNBQWMsY0FGWCxNQUFNOzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFjUSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGRhdGVIYXNFeHBpcmVkIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNaXNzaW9uLCBPcmdhbmlzYXRpb24sIFByb2ZpbGUsIFByb2ZpbGVTdGF0dXMsIFJvbGVTdGF0dXMsIFZpc2l0VGVtcGxhdGUgfSBmcm9tIFwiLi4vLi4vdHlwZXMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNaXNzaW9uU2VydmljZSB7XHJcbiAgICBjdXJyZW50TWlzc2lvbnNVcGRhdGVkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBsYXN0RXhwaXJlZE1pc3Npb246IE1pc3Npb247XHJcblxyXG4gICAgbmV4dE1pc3Npb25Ub1N0YXJ0OiBNaXNzaW9uO1xyXG5cclxuICAgIGN1cnJlbnRVc2VySUQ6IHN0cmluZztcclxuXHJcbiAgICBBUEk6IGFueTsgLy9BV1NcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvLyBwcml2YXRlIGFmZmVjdGF0aW9uU2VydmljZTogQWZmZWN0YXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIEBJbmplY3QoJ2N1cnJlbnRBUElTZXJ2aWNlJykgYXBpSW5qZWN0ZWQ6IGFueVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRNaXNzaW9uc0Zyb21Vc2VySUQodXNlcklEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb25bXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uTWlzc2lvbnNCeVVzZXIodXNlcklEKS50aGVuKChtaXNzaW9ucykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbWlzc2lvbnMuaXRlbXMuZmlsdGVyKChtaXMpID0+ICFtaXMuZGVsZXRlZEF0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRNaXNzaW9uc0J5T3JkZXJlZE9yZ2FuaXNhdGlvbihcclxuICAgICAgICBvcmRlcmVkT3JnSUQ6IHN0cmluZyxcclxuICAgICk6IFByb21pc2U8TWlzc2lvbltdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5NaXNzaW9uc0J5T3JkZXJlZE9yZ2FuaXNhdGlvbihvcmRlcmVkT3JnSUQpLnRoZW4oXHJcbiAgICAgICAgICAgIChyZXNwb25zZSkgPT4gcmVzcG9uc2UuaXRlbXMsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKG9yZ0lEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb25bXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uTWlzc2lvbnNCeU9yZ2FuaXNhdGlvbihvcmdJRCkudGhlbihcclxuICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiByZXNwb25zZS5pdGVtcyxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNyZWF0ZShtaXNzaW9uOiBNaXNzaW9uKTogUHJvbWlzZTxNaXNzaW9uPiB7XHJcbiAgICAgICAgY29uc3QgdXBkTWlzc2lvbiA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVNaXNzaW9uKG1pc3Npb24pO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiTWlzc2lvbiBjcmVhdGVkXCIsIHVwZE1pc3Npb24pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZkN1cnJlbnRVc2VyTWlzc2lvbkNoYW5nZWQodXBkTWlzc2lvbik7XHJcbiAgICAgICAgcmV0dXJuIHVwZE1pc3Npb247XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlKG1pc3Npb246IGFueSk6IFByb21pc2U8TWlzc2lvbj4ge1xyXG4gICAgICAgIGNvbnN0IHVwZE1pc3Npb24gPSBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uVXBkYXRlTWlzc2lvbihtaXNzaW9uKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk1pc3Npb24gdXBkYXRlZFwiLCB1cGRNaXNzaW9uKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSWZDdXJyZW50VXNlck1pc3Npb25DaGFuZ2VkKHVwZE1pc3Npb24pO1xyXG4gICAgICAgIHJldHVybiB1cGRNaXNzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGFzc2VydFJvbGVGb3JVc2VySW5PcmcoXHJcbiAgICAgICAgdXNlcjogUHJvZmlsZSxcclxuICAgICAgICBvcmc6IE9yZ2FuaXNhdGlvbixcclxuICAgICAgICByb2xlOiBSb2xlU3RhdHVzLFxyXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWlzc2lvbnNGcm9tVXNlcklEKHVzZXIuaWQpLnRoZW4oKG1pc3Npb25zKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChtaXNzaW9ucykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWlzT3JnID0gbWlzc2lvbnMuZmlsdGVyKChtaXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzLm9yZ2FuaXNhdGlvbklEID09PSBvcmcuaWQgJiYgbWlzLnJvbGUgPT09IHJvbGU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtaXNPcmcubGVuZ3RoID4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0TWlzc2lvbnNCeU9yZGVyZWRPcmdhbmlzYXRpb25CeVNwYWNlKFxyXG4gICAgICAgIG9yZE9yZ0lEOiBzdHJpbmcsXHJcbiAgICAgICAgc3BhY2VJRDogc3RyaW5nLFxyXG4gICAgKTogUHJvbWlzZTxNaXNzaW9uW10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLk1pc3Npb25zQnlPcmRlcmVkT3JnYW5pc2F0aW9uQnlTcGFjZShvcmRPcmdJRCwge1xyXG4gICAgICAgICAgICBlcTogc3BhY2VJRCxcclxuICAgICAgICB9KS50aGVuKChtaXMpID0+IG1pcy5pdGVtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbklEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb24+IHtcclxuICAgICAgICAvLyBjb25zdCBoYXJkRGVsZXRlID0gYXdhaXQgdGhpcy5jYW5IYXJkRGV0ZWxlTWlzc2lvbihtaXNzaW9uLmlkKTtcclxuICAgICAgICAvLyBpZiAoaGFyZERlbGV0ZSkge1xyXG4gICAgICAgIC8vICAgICByZXR1cm4gdGhpcy5oYXJkRGVsZXRlTWlzc2lvbihtaXNzaW9uLmlkKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTb2Z0IERlbGV0aW5nIG1pc3Npb25cIik7XHJcbiAgICAgICAgY29uc3QgbWlzc2lvblVwZCA9IGF3YWl0IHRoaXMudXBkYXRlKHtcclxuICAgICAgICAgICAgaWQ6IG1pc3Npb25JRCxcclxuICAgICAgICAgICAgZGVsZXRlZEF0OiBEYXRlLm5vdygpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZkN1cnJlbnRVc2VyTWlzc2lvbkNoYW5nZWQobWlzc2lvblVwZCk7XHJcbiAgICAgICAgcmV0dXJuIG1pc3Npb25VcGQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPE1pc3Npb25bXT4ge1xyXG4gICAgICAgIGNvbnN0IG1pcyA9IGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5MaXN0TWlzc2lvbnMoKTtcclxuICAgICAgICByZXR1cm4gbWlzLml0ZW1zLmZpbHRlcigobSkgPT4gIW0uZGVsZXRlZEF0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhc3luYyBjYW5IYXJkRGV0ZWxlTWlzc2lvbihtaXNzaW9uSUQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGV2ZW50cyA9IChcclxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5BUEkuTGlzdEV2ZW50cyh7IG93bmVySUQ6IHsgZXE6IG1pc3Npb25JRCB9IH0pXHJcbiAgICAvLyAgICAgKS5pdGVtcztcclxuICAgIC8vICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBjb25zdCBjb21tZW50cyA9IChcclxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5BUEkuTGlzdENvbW1lbnRzKHsgb3duZXJJRDogeyBlcTogbWlzc2lvbklEIH0gfSlcclxuICAgIC8vICAgICApLml0ZW1zO1xyXG4gICAgLy8gICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY29uc3QgYWZmZWN0YXRpb25zID1cclxuICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5hZmZlY3RhdGlvblNlcnZpY2UuZ2V0QWZmZWN0YXRpb25zRnJvbU1pc3Npb25JRChcclxuICAgIC8vICAgICAgICAgICAgIG1pc3Npb25JRCxcclxuICAgIC8vICAgICAgICAgKTtcclxuICAgIC8vICAgICBpZiAoYWZmZWN0YXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBhc3luYyBoYXJkRGVsZXRlTWlzc2lvbihtaXNzaW9uSUQ6IHN0cmluZyk6IFByb21pc2U8TWlzc2lvbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlTWlzc2lvbih7IGlkOiBtaXNzaW9uSUQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWN0aXZhdGVkTWlzc2lvbnMobWlzc2lvbnM6IE1pc3Npb25bXSk6IE1pc3Npb25bXSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZhdGVkID0gW107XHJcbiAgICAgICAgbWlzc2lvbnMubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZhdGVkID1cclxuICAgICAgICAgICAgICAgIG1pc3Npb24uZ3JvdXBzICYmIG1pc3Npb24uZ3JvdXBzLmluY2x1ZGVzKFByb2ZpbGVTdGF0dXMuQUNUSVZFKTtcclxuICAgICAgICAgICAgaWYgKGlzQWN0aXZhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmF0ZWQucHVzaChtaXNzaW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBhY3RpdmF0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0TWlzc2lvbnNGb3Jab25lKHpvbmVJRDogc3RyaW5nKTogUHJvbWlzZTxNaXNzaW9uW10+IHtcclxuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5NaXNzaW9uc0J5Wm9uZSh6b25lSUQpKS5pdGVtcy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChtaXMpID0+ICFtaXMuZGVsZXRlZEF0LFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0TWlzc2lvbnNGb3JTcGFjZShzcGFjZUlEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb25bXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uTWlzc2lvbnNCeVNwYWNlKHNwYWNlSUQpLnRoZW4oKG1pc3Npb25zKSA9PiBtaXNzaW9ucy5pdGVtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWN0aXZhdGVNaXNzaW9uKG1pczogTWlzc2lvbikge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgbWlzICYmXHJcbiAgICAgICAgICAgICghbWlzLmdyb3VwcyB8fCAhbWlzLmdyb3Vwcy5pbmNsdWRlcyhQcm9maWxlU3RhdHVzLkFDVElWRSkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IG1pcy5ncm91cHMgPyBtaXMuZ3JvdXBzIDogW107XHJcbiAgICAgICAgICAgIGdyb3Vwcy5wdXNoKFByb2ZpbGVTdGF0dXMuQUNUSVZFKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoeyBpZDogbWlzLmlkLCBncm91cHMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldE1pc3Npb25zQnlUZW1wbGF0ZSh0ZW1wbGF0ZUlEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb25bXT4ge1xyXG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLk1pc3Npb25zQnlUZW1wbGF0ZSh0ZW1wbGF0ZUlEKSkuaXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAobWlzKSA9PiAhbWlzLmRlbGV0ZWRBdCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldE1pc3Npb24obWlzc2lvbklEOiBzdHJpbmcpOiBQcm9taXNlPE1pc3Npb24+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkdldE1pc3Npb24obWlzc2lvbklEKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRNaXNzaW9uc0J5Wm9uZUJ5Um9sZShcclxuICAgICAgICB6b25lSUQ6IHN0cmluZyxcclxuICAgICAgICByb2xlOiBSb2xlU3RhdHVzLFxyXG4gICAgKTogUHJvbWlzZTxNaXNzaW9uW10+IHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uTWlzc2lvbnNCeVpvbmVCeVJvbGUoXHJcbiAgICAgICAgICAgICAgICB6b25lSUQsXHJcbiAgICAgICAgICAgICAgICB7IGVxOiByb2xlIH0sXHJcbiAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgeyBkZWxldGVkQXQ6IHsgYXR0cmlidXRlRXhpc3RzOiBmYWxzZSB9IH0sXHJcbiAgICAgICAgICAgICAgICAyMDAsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLml0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrSWZDdXJyZW50VXNlck1pc3Npb25DaGFuZ2VkKGNoYW5nZWRNaXNzaW9uOiBNaXNzaW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXJJRCA9PT0gY2hhbmdlZE1pc3Npb24udXNlcklEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1pc3Npb25zVXBkYXRlZC5uZXh0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbnN0YW50TWlzc2lvbnNPZkN1cnJlbnQoXHJcbiAgICAgICAgY3VycmVudFVzZXJJRDogc3RyaW5nLFxyXG4gICAgKTogUHJvbWlzZTxNaXNzaW9uW10gfCBudWxsPiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlcklEID0gY3VycmVudFVzZXJJRDtcclxuICAgICAgICBsZXQgbWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldE1pc3Npb25zRnJvbVVzZXJJRChjdXJyZW50VXNlcklEKTtcclxuXHJcbiAgICAgICAgLyoqIEZpbHRlciB0byBrZWVwIG9ubHkgYXZhaWxhYmxlIG1pc3Npb25zICovXHJcbiAgICAgICAgbWlzc2lvbnMgPSBtaXNzaW9ucy5maWx0ZXIoKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzRXhwaXJlZCA9IGRhdGVIYXNFeHBpcmVkKG1pc3Npb24uZW5kRGF0ZVRpbWUpO1xyXG5cclxuICAgICAgICAgICAgLyoqIFVwZGF0ZSB0aGlzLmxhc3RFeHBpcmVkTWlzc2lvbiAqL1xyXG4gICAgICAgICAgICBpZiAoaGFzRXhwaXJlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEV4cGlyZWREYXRlID0gdGhpcy5sYXN0RXhwaXJlZE1pc3Npb25cclxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKHRoaXMubGFzdEV4cGlyZWRNaXNzaW9uLmVuZERhdGVUaW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVFeHBpcmVkID0gbmV3IERhdGUobWlzc2lvbi5lbmREYXRlVGltZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RFeHBpcmVkRGF0ZSB8fCBkYXRlRXhwaXJlZCA+IGxhc3RFeHBpcmVkRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEV4cGlyZWRNaXNzaW9uID0gbWlzc2lvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gIWhhc0V4cGlyZWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChtaXNzaW9ucy5zb21lKChtaXMpID0+IG1pcy5yb2xlID09PSBSb2xlU3RhdHVzLlZJU0lUT1JfTVVTRVVNKSAmJiBtaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIHdvcmtmbG93IGZvciBWSVNJVE9SX01VU0VVTVxyXG4gICAgICAgICAgICByZXR1cm4gbWlzc2lvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKiBLZWVwIG9ubHkgc3RhcnRlZCBtaXNzaW9ucyAqL1xyXG4gICAgICAgIGxldCBuZXh0TWlzc2lvbkRhdGUgPSBudWxsO1xyXG4gICAgICAgIG1pc3Npb25zID0gbWlzc2lvbnMuZmlsdGVyKChtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBtaXNzaW9uLnN0YXJ0RGF0ZVRpbWVcclxuICAgICAgICAgICAgICAgID8gZGF0ZUhhc0V4cGlyZWQobWlzc2lvbi5zdGFydERhdGVUaW1lKVxyXG4gICAgICAgICAgICAgICAgOiB0cnVlO1xyXG4gICAgICAgICAgICAvKiogVXBkYXRlIG5leHQgbWlzc2lvbiB0byBzdGFydCAqL1xyXG4gICAgICAgICAgICBpZiAoIXN0YXJ0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25EYXRlID0gbmV3IERhdGUobWlzc2lvbi5zdGFydERhdGVUaW1lKTtcclxuICAgICAgICAgICAgICAgIGlmICghbmV4dE1pc3Npb25EYXRlIHx8IG1pc3Npb25EYXRlIDwgbmV4dE1pc3Npb25EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWlzc2lvblRvU3RhcnQgPSBtaXNzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRNaXNzaW9uRGF0ZSA9IG1pc3Npb25EYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzdGFydGVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBtaXNzaW9ucy5sZW5ndGggPiAwID8gbWlzc2lvbnMgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsdGVycyB0aGUgbWlzc2lvbnMgdGhhdCBhc3Npc3RlZCB0byBsaXZlIG9mIHRoZSB2aXNpdCAoYnkgY29tcGFyaW5nIHRoZSByZWFsU3RhcnRUaW1lIG9mIFZpc2l0VGVtcGxhdGUgYW5kIGNvbm5lY3RlZEF0IHRpbWUpXHJcbiAgICAgKiBAcGFyYW0gdGVtcGxhdGUgVmlzaXRUZW1wbGF0ZSBcclxuICAgICAqIEBwYXJhbSBtaXNzaW9ucyBNaXNzaW9uW10gbWlzc2lvbnMgZm9yIHRoaXMgdmlzaXRcclxuICAgICAqIEByZXR1cm5zIE1pc3Npb25bXSBmaWx0ZXJlZCBtaXNzaW9uc1xyXG4gICAgICovXHJcbiAgICBmaWx0ZXJNaXNzaW9uc0Fzc2l0ZWRUb0xpdmVGb3JUZW1wbGF0ZSh0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSwgbWlzc2lvbnM6IE1pc3Npb25bXSk6IE1pc3Npb25bXSB7XHJcbiAgICAgICAgY29uc3QgdmlzaXRTdGFydFRpbWVzdGFtcCA9IHRlbXBsYXRlLnJlYWxTdGFydGVkQXQ7XHJcbiAgICAgICAgcmV0dXJuIG1pc3Npb25zLmZpbHRlcigobWlzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghbWlzLmNvbm5lY3RlZFRvTGl2ZUF0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1pcy5jb25uZWN0ZWRUb0xpdmVBdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBsYXN0Q29ubmVjdGVkQXQgPSBtaXMuY29ubmVjdGVkVG9MaXZlQXRbbWlzLmNvbm5lY3RlZFRvTGl2ZUF0Lmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0Q29ubmVjdGVkQXRUaW1lc3RhbXAgPSBEYXRlVGltZS5mcm9tSVNPKGxhc3RDb25uZWN0ZWRBdCkudG9NaWxsaXMoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGxhc3RDb25uZWN0ZWRBdFRpbWVzdGFtcCA+IHZpc2l0U3RhcnRUaW1lc3RhbXA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19