@smarterplan/ngx-smarterplan-locations 0.2.44 → 0.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 (152) hide show
  1. package/esm2020/lib/components/carousel/carousel.component.mjs +28 -0
  2. package/esm2020/lib/components/chevron/chevron.component.mjs +18 -0
  3. package/esm2020/lib/components/detail-location/detail-location.component.mjs +168 -0
  4. package/esm2020/lib/components/form-location/form-location.component.mjs +237 -0
  5. package/esm2020/lib/components/images/images.component.mjs +107 -0
  6. package/esm2020/lib/components/locations/locations.component.mjs +145 -0
  7. package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +66 -0
  8. package/esm2020/lib/components/locations/map/map.component.mjs +91 -0
  9. package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +47 -0
  10. package/esm2020/lib/components/plans/calibration/calibration.component.mjs +468 -0
  11. package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +324 -0
  12. package/esm2020/lib/components/plans/plans.component.mjs +225 -0
  13. package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +41 -0
  14. package/esm2020/lib/components/visits/visits.component.mjs +283 -0
  15. package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +230 -0
  16. package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +315 -0
  17. package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +77 -0
  18. package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +502 -0
  19. package/esm2020/lib/components/zones/zones.component.mjs +268 -0
  20. package/esm2020/lib/helper.service.mjs +134 -0
  21. package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -0
  22. package/esm2020/lib/ngx-smarterplan-locations.module.mjs +125 -0
  23. package/esm2020/lib/ngx-smarterplan-locations.service.mjs +14 -0
  24. package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +27 -0
  25. package/esm2020/lib/radio-button/radio-button.component.mjs +26 -0
  26. package/esm2020/public-api.mjs +9 -0
  27. package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +5 -0
  28. package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3991 -0
  29. package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
  30. package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +3828 -0
  31. package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
  32. package/lib/components/carousel/carousel.component.d.ts +12 -0
  33. package/lib/components/chevron/chevron.component.d.ts +9 -0
  34. package/lib/components/detail-location/detail-location.component.d.ts +55 -0
  35. package/lib/components/form-location/form-location.component.d.ts +45 -0
  36. package/lib/components/images/images.component.d.ts +33 -0
  37. package/lib/components/locations/locations.component.d.ts +51 -0
  38. package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -0
  39. package/lib/components/locations/map/map.component.d.ts +22 -0
  40. package/lib/components/plan-legend/plan-legend.component.d.ts +14 -0
  41. package/lib/components/plans/calibration/calibration.component.d.ts +140 -0
  42. package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -0
  43. package/lib/components/plans/plans.component.d.ts +63 -0
  44. package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -0
  45. package/lib/components/visits/visits.component.d.ts +62 -0
  46. package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -0
  47. package/lib/components/zones/add-zone/add-zone.component.d.ts +69 -0
  48. package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -0
  49. package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +107 -0
  50. package/lib/components/zones/zones.component.d.ts +73 -0
  51. package/lib/helper.service.d.ts +53 -0
  52. package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -0
  53. package/lib/ngx-smarterplan-locations.module.d.ts +36 -0
  54. package/lib/ngx-smarterplan-locations.service.d.ts +6 -0
  55. package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -0
  56. package/lib/radio-button/radio-button.component.d.ts +12 -0
  57. package/package.json +22 -5
  58. package/{src/public-api.ts → public-api.d.ts} +4 -11
  59. package/smarterplan-ngx-smarterplan-locations.d.ts +5 -0
  60. package/.browserslistrc +0 -16
  61. package/karma.conf.js +0 -44
  62. package/ng-package.json +0 -7
  63. package/src/lib/components/carousel/carousel.component.html +0 -13
  64. package/src/lib/components/carousel/carousel.component.scss +0 -0
  65. package/src/lib/components/carousel/carousel.component.spec.ts +0 -25
  66. package/src/lib/components/carousel/carousel.component.ts +0 -31
  67. package/src/lib/components/chevron/chevron.component.html +0 -5
  68. package/src/lib/components/chevron/chevron.component.scss +0 -16
  69. package/src/lib/components/chevron/chevron.component.spec.ts +0 -25
  70. package/src/lib/components/chevron/chevron.component.ts +0 -17
  71. package/src/lib/components/detail-location/detail-location.component.html +0 -108
  72. package/src/lib/components/detail-location/detail-location.component.scss +0 -0
  73. package/src/lib/components/detail-location/detail-location.component.spec.ts +0 -25
  74. package/src/lib/components/detail-location/detail-location.component.ts +0 -215
  75. package/src/lib/components/form-location/form-location.component.html +0 -160
  76. package/src/lib/components/form-location/form-location.component.scss +0 -62
  77. package/src/lib/components/form-location/form-location.component.spec.ts +0 -25
  78. package/src/lib/components/form-location/form-location.component.ts +0 -274
  79. package/src/lib/components/images/images.component.html +0 -27
  80. package/src/lib/components/images/images.component.scss +0 -0
  81. package/src/lib/components/images/images.component.spec.ts +0 -25
  82. package/src/lib/components/images/images.component.ts +0 -133
  83. package/src/lib/components/locations/locations.component.html +0 -63
  84. package/src/lib/components/locations/locations.component.scss +0 -121
  85. package/src/lib/components/locations/locations.component.spec.ts +0 -25
  86. package/src/lib/components/locations/locations.component.ts +0 -186
  87. package/src/lib/components/locations/map/map-popup/map-popup.component.html +0 -11
  88. package/src/lib/components/locations/map/map-popup/map-popup.component.scss +0 -51
  89. package/src/lib/components/locations/map/map-popup/map-popup.component.spec.ts +0 -25
  90. package/src/lib/components/locations/map/map-popup/map-popup.component.ts +0 -79
  91. package/src/lib/components/locations/map/map.component.html +0 -2
  92. package/src/lib/components/locations/map/map.component.scss +0 -0
  93. package/src/lib/components/locations/map/map.component.spec.ts +0 -25
  94. package/src/lib/components/locations/map/map.component.ts +0 -111
  95. package/src/lib/components/plan-legend/plan-legend.component.html +0 -9
  96. package/src/lib/components/plan-legend/plan-legend.component.scss +0 -38
  97. package/src/lib/components/plan-legend/plan-legend.component.spec.ts +0 -25
  98. package/src/lib/components/plan-legend/plan-legend.component.ts +0 -50
  99. package/src/lib/components/plans/calibration/calibration.component.html +0 -98
  100. package/src/lib/components/plans/calibration/calibration.component.scss +0 -136
  101. package/src/lib/components/plans/calibration/calibration.component.spec.ts +0 -25
  102. package/src/lib/components/plans/calibration/calibration.component.ts +0 -603
  103. package/src/lib/components/plans/edit-plan/edit-plan.component.html +0 -77
  104. package/src/lib/components/plans/edit-plan/edit-plan.component.scss +0 -9
  105. package/src/lib/components/plans/edit-plan/edit-plan.component.spec.ts +0 -25
  106. package/src/lib/components/plans/edit-plan/edit-plan.component.ts +0 -421
  107. package/src/lib/components/plans/plans.component.html +0 -102
  108. package/src/lib/components/plans/plans.component.scss +0 -24
  109. package/src/lib/components/plans/plans.component.spec.ts +0 -25
  110. package/src/lib/components/plans/plans.component.ts +0 -305
  111. package/src/lib/components/tab-navigation/tab-navigation.component.html +0 -7
  112. package/src/lib/components/tab-navigation/tab-navigation.component.scss +0 -27
  113. package/src/lib/components/tab-navigation/tab-navigation.component.spec.ts +0 -25
  114. package/src/lib/components/tab-navigation/tab-navigation.component.ts +0 -35
  115. package/src/lib/components/visits/visits.component.html +0 -134
  116. package/src/lib/components/visits/visits.component.scss +0 -24
  117. package/src/lib/components/visits/visits.component.spec.ts +0 -25
  118. package/src/lib/components/visits/visits.component.ts +0 -357
  119. package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.html +0 -73
  120. package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.scss +0 -14
  121. package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.spec.ts +0 -25
  122. package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.ts +0 -269
  123. package/src/lib/components/zones/add-zone/add-zone.component.html +0 -153
  124. package/src/lib/components/zones/add-zone/add-zone.component.scss +0 -44
  125. package/src/lib/components/zones/add-zone/add-zone.component.spec.ts +0 -25
  126. package/src/lib/components/zones/add-zone/add-zone.component.ts +0 -377
  127. package/src/lib/components/zones/add-zone/selection/selection.component.html +0 -3
  128. package/src/lib/components/zones/add-zone/selection/selection.component.scss +0 -16
  129. package/src/lib/components/zones/add-zone/selection/selection.component.spec.ts +0 -25
  130. package/src/lib/components/zones/add-zone/selection/selection.component.ts +0 -95
  131. package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.html +0 -73
  132. package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.scss +0 -23
  133. package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.spec.ts +0 -25
  134. package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.ts +0 -595
  135. package/src/lib/components/zones/zones.component.html +0 -181
  136. package/src/lib/components/zones/zones.component.scss +0 -36
  137. package/src/lib/components/zones/zones.component.spec.ts +0 -25
  138. package/src/lib/components/zones/zones.component.ts +0 -339
  139. package/src/lib/helper.service.ts +0 -161
  140. package/src/lib/ngx-smarterplan-location-routing.module.ts +0 -41
  141. package/src/lib/ngx-smarterplan-locations.module.ts +0 -74
  142. package/src/lib/ngx-smarterplan-locations.service.spec.ts +0 -16
  143. package/src/lib/ngx-smarterplan-locations.service.ts +0 -9
  144. package/src/lib/pipes/count-audio-sweeps.pipe.ts +0 -21
  145. package/src/lib/radio-button/radio-button.component.html +0 -9
  146. package/src/lib/radio-button/radio-button.component.scss +0 -152
  147. package/src/lib/radio-button/radio-button.component.spec.ts +0 -25
  148. package/src/lib/radio-button/radio-button.component.ts +0 -26
  149. package/src/test.ts +0 -27
  150. package/tsconfig.lib.json +0 -15
  151. package/tsconfig.lib.prod.json +0 -10
  152. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,230 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { CommentType } from '@smarterplan/ngx-smarterplan-core';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "@smarterplan/ngx-smarterplan-core";
7
+ import * as i3 from "@ngx-translate/core";
8
+ import * as i4 from "@ng-bootstrap/ng-bootstrap";
9
+ import * as i5 from "../add-zone/sweep-plan-selection/sweep-plan-selection.component";
10
+ import * as i6 from "@angular/common";
11
+ export class AddAudioZoneComponent {
12
+ constructor(fb, zoneService, layerService, userService, navigationService, commentService, translate) {
13
+ this.fb = fb;
14
+ this.zoneService = zoneService;
15
+ this.layerService = layerService;
16
+ this.userService = userService;
17
+ this.navigationService = navigationService;
18
+ this.commentService = commentService;
19
+ this.translate = translate;
20
+ this.updatedZone = new EventEmitter();
21
+ this.isSubmitted = false;
22
+ this.fromPlan = false;
23
+ this.chosenScansOnPlan = [];
24
+ this.isAddingAudio = false;
25
+ this.scansModified = false;
26
+ this.occupiedSweeps = [];
27
+ this.unavailableSweeps = [];
28
+ this.working = false;
29
+ this.audioUploaded = false;
30
+ }
31
+ ngOnInit() {
32
+ if (this.currentAudioZone) {
33
+ // we are editing zone
34
+ this.chosenAudio = this.currentAudioZone.audio;
35
+ this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;
36
+ this.parentZone = this.currentAudioZone.parent;
37
+ }
38
+ this.setup();
39
+ }
40
+ async setup() {
41
+ const mission = this.userService.currentMission(this.spaceID);
42
+ this.currentOrgId = mission.organisationID;
43
+ let layers = await this.layerService.getLayerForOrganisation(this.currentOrgId);
44
+ this.audioLayer = layers.find((layer) => layer.name === "AUDIO");
45
+ if (!this.audioLayer) {
46
+ // first time creating Audio Zone
47
+ this.audioLayer = await this.layerService.createLayerForOrganisation("AUDIO", this.currentOrgId);
48
+ }
49
+ if (!this.parentZone) {
50
+ this.parentZone = this.defaultZone;
51
+ }
52
+ this.audioZones = this.zones.filter((zone) => zone.audioID && zone.parentID === this.parentZone.id);
53
+ this.occupiedSweeps = this.audioZones.flatMap((zone) => zone.sweepIDs);
54
+ // unavailable sweeps: sweeps that do not belong to parent zone
55
+ this.unavailableSweeps = this.defaultZone.sweepIDs.filter((sweep) => !this.parentZone.sweepIDs.includes(sweep));
56
+ await this.getAudios();
57
+ this.commentForm = this.fb.group({
58
+ title: [null, Validators.required],
59
+ spaceID: this.spaceID,
60
+ type: CommentType.AUDIO,
61
+ ownerID: mission.id,
62
+ });
63
+ }
64
+ async onSubmit() {
65
+ this.isSubmitted = true;
66
+ this.working = true;
67
+ if (this.currentAudioZone) {
68
+ await this.zoneService.updateZone({
69
+ id: this.currentAudioZone.id,
70
+ sweepIDs: this.chosenScansOnPlan,
71
+ });
72
+ await this.removeTakenSweepsFromOtherZones();
73
+ this.updatedZone.emit(this.currentAudioZone.id);
74
+ this.working = false;
75
+ }
76
+ else {
77
+ const zoneInput = {
78
+ name: `${this.parentZone.name} - ${this.chosenAudio.title}`,
79
+ surface: 0,
80
+ spaceID: this.spaceID,
81
+ layerID: this.audioLayer.id,
82
+ parentID: this.parentZone.id,
83
+ isMuseumVisitZone: false,
84
+ isMultipleFloorZone: this.parentZone.isMultipleFloorZone,
85
+ audioID: this.chosenAudio.id,
86
+ };
87
+ try {
88
+ await this.setSweepsAndNodeForZoneInput(zoneInput);
89
+ await this.zoneService
90
+ .create(zoneInput)
91
+ .then(async (zoneCreated) => {
92
+ this.currentAudioZone = zoneCreated;
93
+ await this.removeTakenSweepsFromOtherZones();
94
+ this.updatedZone.emit(zoneCreated.id);
95
+ });
96
+ this.working = false;
97
+ }
98
+ catch (error) {
99
+ console.error(error);
100
+ this.working = false;
101
+ }
102
+ }
103
+ }
104
+ async setSweepsAndNodeForZoneInput(zoneInput) {
105
+ if (this.chosenScansOnPlan.length > 0) {
106
+ zoneInput.sweepIDs = this.chosenScansOnPlan;
107
+ }
108
+ if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {
109
+ const navForSweep = await this.navigationService.getNavigationsForMatterportIDForSpace(zoneInput.sweepIDs[0], this.spaceID);
110
+ zoneInput.nodeIDs = [navForSweep[0].nodeID];
111
+ }
112
+ }
113
+ onCancel() {
114
+ if (this.scansModified) {
115
+ const message = this.translate.instant("confirm.cancelEditZone");
116
+ if (!window.confirm(message)) {
117
+ return;
118
+ }
119
+ }
120
+ this.commentForm = null;
121
+ this.chosenScansOnPlan = [];
122
+ this.updatedZone.emit(false);
123
+ }
124
+ togglePlan() {
125
+ this.fromPlan = true;
126
+ }
127
+ onSelectedSweepsFromPlan(result) {
128
+ if (result && result.sweeps) {
129
+ this.chosenScansOnPlan = result.sweeps;
130
+ this.scansModified = true;
131
+ }
132
+ this.fromPlan = false;
133
+ }
134
+ handleFileInput(event) {
135
+ const target = event.target;
136
+ this.fileToUpload = target.files[0];
137
+ }
138
+ async onUploadAudio() {
139
+ this.working = true;
140
+ const commentInput = this.commentForm.value;
141
+ try {
142
+ const newAudio = await this.commentService.createCommentWithFile(commentInput, this.fileToUpload);
143
+ this.audiosForSpace.push(newAudio);
144
+ this.isAddingAudio = false;
145
+ this.working = false;
146
+ this.audioUploaded = true;
147
+ }
148
+ catch (e) {
149
+ this.working = false;
150
+ this.audioUploaded = false;
151
+ console.log(e);
152
+ }
153
+ }
154
+ async getAudios() {
155
+ const attachments = await this.commentService.getCommentsBySpaceID(this.spaceID);
156
+ if (attachments) {
157
+ this.audiosForSpace = attachments.filter((attachment) => attachment.type === CommentType.AUDIO);
158
+ }
159
+ }
160
+ onCancelAudioUpload() {
161
+ this.commentForm = null;
162
+ this.isAddingAudio = false;
163
+ this.fileToUpload = null;
164
+ }
165
+ onChooseAudio(audio) {
166
+ this.chosenAudio = audio;
167
+ this.currentAudioZone = this.audioZones.find((zone) => zone.audioID === this.chosenAudio.id);
168
+ if (this.currentAudioZone) {
169
+ this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;
170
+ }
171
+ else {
172
+ this.chosenScansOnPlan = [];
173
+ }
174
+ }
175
+ /**
176
+ * Removes newly selected sweeps for current zone (they are in chosenScansOnPlan) from other audio zones.
177
+ * Rule: one sweep = one audio.
178
+ */
179
+ async removeTakenSweepsFromOtherZones() {
180
+ await Promise.all(this.audioZones.map(async (zone) => {
181
+ if (zone.id !== this.currentAudioZone.id) {
182
+ const newSweeps = zone.sweepIDs.filter((sweepID) => !this.chosenScansOnPlan.includes(sweepID));
183
+ if (newSweeps.length !== zone.sweepIDs.length) {
184
+ await this.zoneService.updateZone({ id: zone.id, sweepIDs: newSweeps });
185
+ }
186
+ }
187
+ }));
188
+ }
189
+ /**
190
+ * Delete audio as Comment, all its audio Zones and file from S3 (using lambda function)
191
+ */
192
+ async onDeleteAudio() {
193
+ const message = this.translate.instant("confirm.deleteAudio");
194
+ if (window.confirm(message)) {
195
+ await this.commentService.deleteComment(this.chosenAudio.id);
196
+ const index = this.audiosForSpace.indexOf(this.chosenAudio);
197
+ this.audiosForSpace.splice(index, 1);
198
+ // delete all zones with this comment audio
199
+ const audioZonesToDelete = this.zones.filter((z) => z.audioID === this.chosenAudio.id);
200
+ await Promise.all(audioZonesToDelete.map(async (zone) => {
201
+ await this.zoneService.deleteZone(zone.id);
202
+ const indexZone = this.audioZones.indexOf(this.currentAudioZone);
203
+ if (indexZone !== -1) {
204
+ this.audioZones.slice(indexZone, 1);
205
+ }
206
+ }));
207
+ this.currentAudioZone = null;
208
+ this.chosenAudio = null;
209
+ }
210
+ }
211
+ }
212
+ AddAudioZoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddAudioZoneComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ZoneService }, { token: i2.LayerService }, { token: i2.BaseUserService }, { token: i2.NavigationService }, { token: i2.CommentService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
213
+ AddAudioZoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AddAudioZoneComponent, selector: "lib-add-audio-zone", inputs: { spaceID: "spaceID", defaultZone: "defaultZone", zones: "zones", parentZone: "parentZone", currentAudioZone: "currentAudioZone" }, outputs: { updatedZone: "updatedZone" }, ngImport: i0, template: "<div class=\"main-container\">\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\n </div>\n </div>\n <div>\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\n {{'Choose File' | translate}}</label>\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n \n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\n {{ 'add-audio.success' | translate }} !\n </ngb-alert>\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\n \n <div class=\"instruction-row\" >\n <p>1.</p>\n <div ngbDropdown class=\"d-inline-block\">\n <div>\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenAudio ?\n chosenAudio.title : ('choose-audio' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\n </button>\n </div>\n </div>\n </div>\n <p>{{'or' | translate}}</p>\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\n </div>\n <div class=\"instruction-row\">\n <p>2.</p>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\n {{'Choose scan points on plan' | translate}}</button>\n\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\n {{'Delete audio' | translate}}</button>\n \n </div>\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\n </div>\n\n <div class=\"mt-3\">\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>\n", styles: [".instruction-row{display:flex;align-items:center;margin-top:1rem}.instruction-row button{margin-bottom:0}.instruction-row p{margin-bottom:0;margin-left:5px;margin-right:5px}\n"], components: [{ type: i2.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { type: i4.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i5.SweepPlanSelectionComponent, selector: "lib-sweep-plan-selection", inputs: ["spaceID", "chosenScansOnPlan", "newZoneData", "occupiedSweeps", "unavailableSweeps", "editingAudioZone", "inputZone", "multipleFloors"], outputs: ["sweepsSelected"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i4.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }], pipes: { "translate": i3.TranslatePipe } });
214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddAudioZoneComponent, decorators: [{
215
+ type: Component,
216
+ args: [{ selector: 'lib-add-audio-zone', template: "<div class=\"main-container\">\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\n </div>\n </div>\n <div>\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\n {{'Choose File' | translate}}</label>\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n \n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\n {{ 'add-audio.success' | translate }} !\n </ngb-alert>\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\n \n <div class=\"instruction-row\" >\n <p>1.</p>\n <div ngbDropdown class=\"d-inline-block\">\n <div>\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenAudio ?\n chosenAudio.title : ('choose-audio' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\n </button>\n </div>\n </div>\n </div>\n <p>{{'or' | translate}}</p>\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\n </div>\n <div class=\"instruction-row\">\n <p>2.</p>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\n {{'Choose scan points on plan' | translate}}</button>\n\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\n {{'Delete audio' | translate}}</button>\n \n </div>\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\n </div>\n\n <div class=\"mt-3\">\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>\n", styles: [".instruction-row{display:flex;align-items:center;margin-top:1rem}.instruction-row button{margin-bottom:0}.instruction-row p{margin-bottom:0;margin-left:5px;margin-right:5px}\n"] }]
217
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ZoneService }, { type: i2.LayerService }, { type: i2.BaseUserService }, { type: i2.NavigationService }, { type: i2.CommentService }, { type: i3.TranslateService }]; }, propDecorators: { spaceID: [{
218
+ type: Input
219
+ }], updatedZone: [{
220
+ type: Output
221
+ }], defaultZone: [{
222
+ type: Input
223
+ }], zones: [{
224
+ type: Input
225
+ }], parentZone: [{
226
+ type: Input
227
+ }], currentAudioZone: [{
228
+ type: Input
229
+ }] } });
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWF1ZGlvLXpvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLWF1ZGlvLXpvbmUvYWRkLWF1ZGlvLXpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLWF1ZGlvLXpvbmUvYWRkLWF1ZGlvLXpvbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBOEUsV0FBVyxFQUFrRCxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7OztBQVE1TCxNQUFNLE9BQU8scUJBQXFCO0lBOEM5QixZQUNZLEVBQWUsRUFDZixXQUF3QixFQUN4QixZQUEwQixFQUMxQixXQUE0QixFQUM1QixpQkFBb0MsRUFDcEMsY0FBOEIsRUFDOUIsU0FBMkI7UUFOM0IsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWpEN0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBUWhELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLGFB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O1lBQzNDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDcEQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN2QztZQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0wsQ0FBQzs7a0hBL1BRLHFCQUFxQjtzR0FBckIscUJBQXFCLCtPQ1hsQyxvb0lBeUVBOzJGRDlEYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0ksb0JBQW9CO2lSQU1yQixPQUFPO3NCQUFmLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRSxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQXdCRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UsIExheWVyU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBOYXZpZ2F0aW9uU2VydmljZSwgTGF5ZXIsIFpvbmUsIENvbW1lbnRUeXBlLCBDb21tZW50U2VydmljZSwgQ29tbWVudCwgZmlsdGVyVW5pcXVlQXJyYXlCeUlEIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1hZGQtYXVkaW8tem9uZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkZC1hdWRpby16b25lLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hZGQtYXVkaW8tem9uZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBZGRBdWRpb1pvbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgc3BhY2VJRDogc3RyaW5nO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZWRab25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBASW5wdXQoKSBkZWZhdWx0Wm9uZTogWm9uZTtcblxuICAgIEBJbnB1dCgpIHpvbmVzOiBab25lW107XG5cbiAgICBASW5wdXQoKSBwYXJlbnRab25lOiBab25lO1xuXG4gICAgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcblxuICAgIGZyb21QbGFuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjaG9zZW5TY2Fuc09uUGxhbjogc3RyaW5nW10gPSBbXTtcblxuICAgIGN1cnJlbnRPcmdJZDogc3RyaW5nO1xuXG4gICAgYXVkaW9MYXllcjogTGF5ZXI7XG5cbiAgICBjb21tZW50Rm9ybTogRm9ybUdyb3VwO1xuXG4gICAgZmlsZVRvVXBsb2FkOiBGaWxlO1xuXG4gICAgYXVkaW9zRm9yU3BhY2U6IENvbW1lbnRbXTtcblxuICAgIGlzQWRkaW5nQXVkaW8gPSBmYWxzZTtcblxuICAgIGNob3NlbkF1ZGlvOiBDb21tZW50O1xuXG4gICAgYXVkaW9ab25lczogWm9uZVtdO1xuXG4gICAgQElucHV0KCkgY3VycmVudEF1ZGlvWm9uZTogWm9uZTtcblxuICAgIHNjYW5zTW9kaWZpZWQgPSBmYWxzZTtcblxuICAgIG9jY3VwaWVkU3dlZXBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdW5hdmFpbGFibGVTd2VlcHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB3b3JraW5nID0gZmFsc2U7XG5cbiAgICBhdWRpb1VwbG9hZGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbW1lbnRTZXJ2aWNlOiBDb21tZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50QXVkaW9ab25lKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgZWRpdGluZyB6b25lXG4gICAgICAgICAgICB0aGlzLmNob3NlbkF1ZGlvID0gdGhpcy5jdXJyZW50QXVkaW9ab25lLmF1ZGlvO1xuICAgICAgICAgICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IHRoaXMuY3VycmVudEF1ZGlvWm9uZS5zd2VlcElEcztcbiAgICAgICAgICAgIHRoaXMucGFyZW50Wm9uZSA9IHRoaXMuY3VycmVudEF1ZGlvWm9uZS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cCgpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldHVwKCkge1xuICAgICAgICBjb25zdCBtaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0aGlzLnNwYWNlSUQpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPcmdJZCA9IG1pc3Npb24ub3JnYW5pc2F0aW9uSUQ7XG4gICAgICAgIGxldCBsYXllcnMgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5nZXRMYXllckZvck9yZ2FuaXNhdGlvbihcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZ0lkLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmF1ZGlvTGF5ZXIgPSBsYXllcnMuZmluZCgobGF5ZXIpID0+IGxheWVyLm5hbWUgPT09IFwiQVVESU9cIik7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb0xheWVyKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB0aW1lIGNyZWF0aW5nIEF1ZGlvIFpvbmUgXG4gICAgICAgICAgICB0aGlzLmF1ZGlvTGF5ZXIgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllckZvck9yZ2FuaXNhdGlvbihcIkFVRElPXCIsIHRoaXMuY3VycmVudE9yZ0lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyZW50Wm9uZSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRab25lID0gdGhpcy5kZWZhdWx0Wm9uZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1ZGlvWm9uZXMgPSB0aGlzLnpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZS5hdWRpb0lEICYmIHpvbmUucGFyZW50SUQgPT09IHRoaXMucGFyZW50Wm9uZS5pZCk7XG4gICAgICAgIHRoaXMub2NjdXBpZWRTd2VlcHMgPSB0aGlzLmF1ZGlvWm9uZXMuZmxhdE1hcCgoem9uZSkgPT4gem9uZS5zd2VlcElEcyk7XG4gICAgICAgIC8vIHVuYXZhaWxhYmxlIHN3ZWVwczogc3dlZXBzIHRoYXQgZG8gbm90IGJlbG9uZyB0byBwYXJlbnQgem9uZVxuICAgICAgICB0aGlzLnVuYXZhaWxhYmxlU3dlZXBzID0gdGhpcy5kZWZhdWx0Wm9uZS5zd2VlcElEcy5maWx0ZXIoKHN3ZWVwKSA9PiAhdGhpcy5wYXJlbnRab25lLnN3ZWVwSURzLmluY2x1ZGVzKHN3ZWVwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0QXVkaW9zKCk7XG4gICAgICAgIHRoaXMuY29tbWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIHRpdGxlOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICB0eXBlOiBDb21tZW50VHlwZS5BVURJTyxcbiAgICAgICAgICAgIG93bmVySUQ6IG1pc3Npb24uaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEF1ZGlvWm9uZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy56b25lU2VydmljZS51cGRhdGVab25lKHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5jdXJyZW50QXVkaW9ab25lLmlkLFxuICAgICAgICAgICAgICAgIHN3ZWVwSURzOiB0aGlzLmNob3NlblNjYW5zT25QbGFuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZVRha2VuU3dlZXBzRnJvbU90aGVyWm9uZXMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZFpvbmUuZW1pdCh0aGlzLmN1cnJlbnRBdWRpb1pvbmUuaWQpO1xuICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB6b25lSW5wdXQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7dGhpcy5wYXJlbnRab25lLm5hbWV9IC0gJHt0aGlzLmNob3NlbkF1ZGlvLnRpdGxlfWAsXG4gICAgICAgICAgICAgICAgc3VyZmFjZTogMCxcbiAgICAgICAgICAgICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICAgICAgbGF5ZXJJRDogdGhpcy5hdWRpb0xheWVyLmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudElEOiB0aGlzLnBhcmVudFpvbmUuaWQsXG4gICAgICAgICAgICAgICAgaXNNdXNldW1WaXNpdFpvbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzTXVsdGlwbGVGbG9vclpvbmU6IHRoaXMucGFyZW50Wm9uZS5pc011bHRpcGxlRmxvb3Jab25lLFxuICAgICAgICAgICAgICAgIGF1ZGlvSUQ6IHRoaXMuY2hvc2VuQXVkaW8uaWQsXG4gICAgICAgICAgICB9IGFzIFpvbmU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0U3dlZXBzQW5kTm9kZUZvclpvbmVJbnB1dCh6b25lSW5wdXQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuem9uZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh6b25lSW5wdXQpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICh6b25lQ3JlYXRlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QXVkaW9ab25lID0gem9uZUNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZVRha2VuU3dlZXBzRnJvbU90aGVyWm9uZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlZFpvbmUuZW1pdCh6b25lQ3JlYXRlZC5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNldFN3ZWVwc0FuZE5vZGVGb3Jab25lSW5wdXQoem9uZUlucHV0OiBab25lKSB7XG4gICAgICAgIGlmICh0aGlzLmNob3NlblNjYW5zT25QbGFuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHpvbmVJbnB1dC5zd2VlcElEcyA9IHRoaXMuY2hvc2VuU2NhbnNPblBsYW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHpvbmVJbnB1dC5zd2VlcElEcyAmJiB6b25lSW5wdXQuc3dlZXBJRHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmF2Rm9yU3dlZXAgPVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TmF2aWdhdGlvbnNGb3JNYXR0ZXJwb3J0SURGb3JTcGFjZShcbiAgICAgICAgICAgICAgICAgICAgem9uZUlucHV0LnN3ZWVwSURzWzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHpvbmVJbnB1dC5ub2RlSURzID0gW25hdkZvclN3ZWVwWzBdLm5vZGVJRF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NhbnNNb2RpZmllZCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmNhbmNlbEVkaXRab25lXCIpO1xuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1lbnRGb3JtID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IFtdO1xuICAgICAgICB0aGlzLnVwZGF0ZWRab25lLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHRvZ2dsZVBsYW4oKSB7XG4gICAgICAgIHRoaXMuZnJvbVBsYW4gPSB0cnVlO1xuICAgIH1cblxuICAgIG9uU2VsZWN0ZWRTd2VlcHNGcm9tUGxhbihyZXN1bHQ6IHsgXCJzd2VlcHNcIjogc3RyaW5nW107IFwic3RhcnRTd2VlcElEXCI6IHN0cmluZzsgfSkge1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5zd2VlcHMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSByZXN1bHQuc3dlZXBzO1xuICAgICAgICAgICAgdGhpcy5zY2Fuc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZyb21QbGFuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFuZGxlRmlsZUlucHV0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgdGhpcy5maWxlVG9VcGxvYWQgPSAodGFyZ2V0LmZpbGVzIGFzIEZpbGVMaXN0KVswXTtcbiAgICB9XG5cbiAgICBhc3luYyBvblVwbG9hZEF1ZGlvKCkge1xuICAgICAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBjb21tZW50SW5wdXQgPSB0aGlzLmNvbW1lbnRGb3JtLnZhbHVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3QXVkaW8gPSBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmNyZWF0ZUNvbW1lbnRXaXRoRmlsZShcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVG9VcGxvYWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hdWRpb3NGb3JTcGFjZS5wdXNoKG5ld0F1ZGlvKTtcbiAgICAgICAgICAgIHRoaXMuaXNBZGRpbmdBdWRpbyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9VcGxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGFzeW5jIGdldEF1ZGlvcygpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmdldENvbW1lbnRzQnlTcGFjZUlEKHRoaXMuc3BhY2VJRCk7XG4gICAgICAgIGlmIChhdHRhY2htZW50cykge1xuICAgICAgICAgICAgdGhpcy5hdWRpb3NGb3JTcGFjZSA9IGF0dGFjaG1lbnRzLmZpbHRlcigoYXR0YWNobWVudCkgPT4gYXR0YWNobWVudC50eXBlID09PSBDb21tZW50VHlwZS5BVURJTyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNhbmNlbEF1ZGlvVXBsb2FkKCkge1xuICAgICAgICB0aGlzLmNvbW1lbnRGb3JtID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0FkZGluZ0F1ZGlvID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsZVRvVXBsb2FkID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbkNob29zZUF1ZGlvKGF1ZGlvOiBDb21tZW50KSB7XG4gICAgICAgIHRoaXMuY2hvc2VuQXVkaW8gPSBhdWRpbztcbiAgICAgICAgdGhpcy5jdXJyZW50QXVkaW9ab25lID0gdGhpcy5hdWRpb1pvbmVzLmZpbmQoKHpvbmUpID0+IHpvbmUuYXVkaW9JRCA9PT0gdGhpcy5jaG9zZW5BdWRpby5pZCk7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRBdWRpb1pvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSB0aGlzLmN1cnJlbnRBdWRpb1pvbmUuc3dlZXBJRHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG5ld2x5IHNlbGVjdGVkIHN3ZWVwcyBmb3IgY3VycmVudCB6b25lICh0aGV5IGFyZSBpbiBjaG9zZW5TY2Fuc09uUGxhbikgZnJvbSBvdGhlciBhdWRpbyB6b25lcy4gXG4gICAgICogUnVsZTogb25lIHN3ZWVwID0gb25lIGF1ZGlvLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZVRha2VuU3dlZXBzRnJvbU90aGVyWm9uZXMoKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuYXVkaW9ab25lcy5tYXAoYXN5bmMgKHpvbmUpID0+IHtcbiAgICAgICAgICAgIGlmICh6b25lLmlkICE9PSB0aGlzLmN1cnJlbnRBdWRpb1pvbmUuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTd2VlcHMgPSB6b25lLnN3ZWVwSURzLmZpbHRlcigoc3dlZXBJRCkgPT4gIXRoaXMuY2hvc2VuU2NhbnNPblBsYW4uaW5jbHVkZXMoc3dlZXBJRCkpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdTd2VlcHMubGVuZ3RoICE9PSB6b25lLnN3ZWVwSURzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLnVwZGF0ZVpvbmUoeyBpZDogem9uZS5pZCwgc3dlZXBJRHM6IG5ld1N3ZWVwcyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYXVkaW8gYXMgQ29tbWVudCwgYWxsIGl0cyBhdWRpbyBab25lcyBhbmQgZmlsZSBmcm9tIFMzICh1c2luZyBsYW1iZGEgZnVuY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgb25EZWxldGVBdWRpbygpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmRlbGV0ZUF1ZGlvXCIpO1xuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWVudFNlcnZpY2UuZGVsZXRlQ29tbWVudCh0aGlzLmNob3NlbkF1ZGlvLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5hdWRpb3NGb3JTcGFjZS5pbmRleE9mKHRoaXMuY2hvc2VuQXVkaW8pO1xuICAgICAgICAgICAgdGhpcy5hdWRpb3NGb3JTcGFjZS5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgICAgICAvLyBkZWxldGUgYWxsIHpvbmVzIHdpdGggdGhpcyBjb21tZW50IGF1ZGlvXG4gICAgICAgICAgICBjb25zdCBhdWRpb1pvbmVzVG9EZWxldGUgPSB0aGlzLnpvbmVzLmZpbHRlcigoeikgPT4gei5hdWRpb0lEID09PSB0aGlzLmNob3NlbkF1ZGlvLmlkKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGF1ZGlvWm9uZXNUb0RlbGV0ZS5tYXAoYXN5bmMgKHpvbmUpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmRlbGV0ZVpvbmUoem9uZS5pZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhab25lID0gdGhpcy5hdWRpb1pvbmVzLmluZGV4T2YodGhpcy5jdXJyZW50QXVkaW9ab25lKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhab25lICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvWm9uZXMuc2xpY2UoaW5kZXhab25lLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBdWRpb1pvbmUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jaG9zZW5BdWRpbyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWluLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNiBjb2wtbWQtNiBjb2wtc20tN1wiICpuZ0lmPVwiaXNBZGRpbmdBdWRpb1wiPlxuICAgICAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25VcGxvYWRBdWRpbygpXCIgW2Zvcm1Hcm91cF09XCJjb21tZW50Rm9ybVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpbGVcIiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZmlsZVwiIChjaGFuZ2UpPVwiaGFuZGxlRmlsZUlucHV0KCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snQ2hvb3NlIEZpbGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpbGVUb1VwbG9hZFwiPnt7IGZpbGVUb1VwbG9hZC5uYW1lfX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJ3b3JraW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIFtkaXNhYmxlZF09XCJmcm9tUGxhbiB8fCB3b3JraW5nXCI+e3snVXBsb2FkJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbEF1ZGlvVXBsb2FkKClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICAgIDxuZ2ItYWxlcnQgdHlwZT1cInN1Y2Nlc3NcIiBbZGlzbWlzc2libGVdPVwidHJ1ZVwiICpuZ0lmPVwiIXdvcmtpbmcgJiYgYXVkaW9VcGxvYWRlZFwiIChjbG9zZWQpPVwiYXVkaW9VcGxvYWRlZD1mYWxzZVwiPlxuICAgICAgICB7eyAnYWRkLWF1ZGlvLnN1Y2Nlc3MnIHwgdHJhbnNsYXRlIH19ICFcbiAgICA8L25nYi1hbGVydD5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIiAqbmdJZj1cIiFpc0FkZGluZ0F1ZGlvICYmIGF1ZGlvc0ZvclNwYWNlXCI+XG4gICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi1yb3dcIiA+XG4gICAgICAgICAgICA8cD4xLjwvcD5cbiAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIiBpZD1cImRyb3Bkb3duQmFzaWMxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZT57e2Nob3NlbkF1ZGlvID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuQXVkaW8udGl0bGUgOiAoJ2Nob29zZS1hdWRpbycgfCB0cmFuc2xhdGUpIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAqbmdGb3I9XCJsZXQgYXVkaW8gb2YgYXVkaW9zRm9yU3BhY2VcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2hvb3NlQXVkaW8oYXVkaW8pXCI+e3sgYXVkaW8udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8cD57eydvcicgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImlzQWRkaW5nQXVkaW89dHJ1ZVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCI+IHt7J2FkZC1hdWRpby5hZGQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi1yb3dcIj5cbiAgICAgICAgICAgIDxwPjIuPC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJ0b2dnbGVQbGFuKClcIiBbZGlzYWJsZWRdPVwiIWNob3NlbkF1ZGlvXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0Nob29zZSBzY2FuIHBvaW50cyBvbiBwbGFuJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25EZWxldGVBdWRpbygpXCIgW2Rpc2FibGVkXT1cIiFjaG9zZW5BdWRpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snRGVsZXRlIGF1ZGlvJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi1yb3dcIiAqbmdJZj1cImNob3NlbkF1ZGlvXCI+XG4gICAgICAgICAgICA8cD57eyBjaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggfX0ge3snc2NhbnMtY2hvc2VuLWF1ZGlvJyB8IHRyYW5zbGF0ZX19PC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIFtkaXNhYmxlZF09XCJmcm9tUGxhbiB8fCAhdGhpcy5jaG9zZW5BdWRpb1wiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+e3snU2F2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJlZGl0LXBsYW5cIiAqbmdJZj1cImZyb21QbGFuXCI+XG4gICAgICAgIDxsaWItc3dlZXAtcGxhbi1zZWxlY3Rpb24gc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbaW5wdXRab25lXT1cImN1cnJlbnRBdWRpb1pvbmVcIiBbc3BhY2VJRF09XCJzcGFjZUlEXCIgXG4gICAgICAgIFtvY2N1cGllZFN3ZWVwc109XCJvY2N1cGllZFN3ZWVwc1wiIFt1bmF2YWlsYWJsZVN3ZWVwc109XCJ1bmF2YWlsYWJsZVN3ZWVwc1wiIFtlZGl0aW5nQXVkaW9ab25lXT1cInRydWVcIlxuICAgICAgICAoc3dlZXBzU2VsZWN0ZWQpPVwib25TZWxlY3RlZFN3ZWVwc0Zyb21QbGFuKCRldmVudClcIj48L2xpYi1zd2VlcC1wbGFuLXNlbGVjdGlvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19