@smarterplan/ngx-smarterplan-locations 0.3.4 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/carousel/carousel.component.mjs +30 -0
- package/esm2022/lib/components/chevron/chevron.component.mjs +18 -0
- package/esm2022/lib/components/detail-location/detail-location.component.mjs +183 -0
- package/{esm2020 → esm2022}/lib/components/form-location/form-location.component.mjs +254 -237
- package/esm2022/lib/components/images/images.component.mjs +120 -0
- package/esm2022/lib/components/locations/locations.component.mjs +157 -0
- package/esm2022/lib/components/locations/map/map-popup/map-popup.component.mjs +72 -0
- package/esm2022/lib/components/locations/map/map.component.mjs +92 -0
- package/esm2022/lib/components/plan-legend/plan-legend.component.mjs +49 -0
- package/esm2022/lib/components/plans/calibration/calibration.component.mjs +494 -0
- package/esm2022/lib/components/plans/edit-plan/edit-plan.component.mjs +350 -0
- package/{esm2020 → esm2022}/lib/components/plans/plans.component.mjs +243 -225
- package/esm2022/lib/components/tab-navigation/tab-navigation.component.mjs +43 -0
- package/esm2022/lib/components/visits/visits.component.mjs +294 -0
- package/esm2022/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +250 -0
- package/esm2022/lib/components/zones/add-zone/add-zone.component.mjs +333 -0
- package/esm2022/lib/components/zones/add-zone/selection/selection.component.mjs +81 -0
- package/esm2022/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +518 -0
- package/esm2022/lib/components/zones/zones.component.mjs +291 -0
- package/{esm2020 → esm2022}/lib/helper.service.mjs +133 -133
- package/esm2022/lib/ngx-smarterplan-location-routing.module.mjs +50 -0
- package/esm2022/lib/ngx-smarterplan-locations.module.mjs +124 -0
- package/esm2022/lib/ngx-smarterplan-locations.service.mjs +15 -0
- package/esm2022/lib/pipes/count-audio-sweeps.pipe.mjs +29 -0
- package/esm2022/lib/radio-button/radio-button.component.mjs +28 -0
- package/{esm2020 → esm2022}/public-api.mjs +8 -8
- package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-locations.mjs +4 -4
- package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-locations.mjs +3959 -3738
- package/fesm2022/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components/carousel/carousel.component.d.ts +12 -12
- package/lib/components/chevron/chevron.component.d.ts +9 -9
- package/lib/components/detail-location/detail-location.component.d.ts +55 -55
- package/lib/components/form-location/form-location.component.d.ts +45 -45
- package/lib/components/images/images.component.d.ts +33 -33
- package/lib/components/locations/locations.component.d.ts +51 -51
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -22
- package/lib/components/locations/map/map.component.d.ts +21 -22
- package/lib/components/plan-legend/plan-legend.component.d.ts +14 -14
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -140
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -55
- package/lib/components/plans/plans.component.d.ts +63 -63
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -13
- package/lib/components/visits/visits.component.d.ts +63 -63
- package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -63
- package/lib/components/zones/add-zone/add-zone.component.d.ts +69 -69
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -44
- package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +107 -107
- package/lib/components/zones/zones.component.d.ts +73 -73
- package/lib/helper.service.d.ts +53 -53
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -7
- package/lib/ngx-smarterplan-locations.module.d.ts +36 -36
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -6
- package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -10
- package/lib/radio-button/radio-button.component.d.ts +12 -12
- package/package.json +13 -19
- package/public-api.d.ts +4 -4
- package/esm2020/lib/components/carousel/carousel.component.mjs +0 -28
- package/esm2020/lib/components/chevron/chevron.component.mjs +0 -18
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +0 -168
- package/esm2020/lib/components/images/images.component.mjs +0 -107
- package/esm2020/lib/components/locations/locations.component.mjs +0 -145
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +0 -66
- package/esm2020/lib/components/locations/map/map.component.mjs +0 -91
- package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +0 -47
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +0 -468
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +0 -324
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +0 -41
- package/esm2020/lib/components/visits/visits.component.mjs +0 -275
- package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +0 -230
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +0 -315
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +0 -77
- package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +0 -502
- package/esm2020/lib/components/zones/zones.component.mjs +0 -268
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +0 -49
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +0 -123
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +0 -14
- package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +0 -27
- package/esm2020/lib/radio-button/radio-button.component.mjs +0 -26
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +0 -3983
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +0 -1
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +0 -1
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { Component, HostListener, ViewChild } from '@angular/core';
|
|
2
|
+
import { getDocument } from "pdfjs-dist";
|
|
3
|
+
// import { PDFDocumentProxy } from "ng2-pdf-viewer";
|
|
4
|
+
import { downloadFileAsObject } from '@smarterplan/ngx-smarterplan-core';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i4 from "@ngx-translate/core";
|
|
10
|
+
import * as i5 from "@angular/common";
|
|
11
|
+
import * as i6 from "../../tab-navigation/tab-navigation.component";
|
|
12
|
+
import * as i7 from "../../zones/add-zone/add-zone.component";
|
|
13
|
+
class EditPlanComponent {
|
|
14
|
+
planService;
|
|
15
|
+
route;
|
|
16
|
+
router;
|
|
17
|
+
modalService;
|
|
18
|
+
zoneService;
|
|
19
|
+
visitService;
|
|
20
|
+
spaceService;
|
|
21
|
+
translate;
|
|
22
|
+
ngZone;
|
|
23
|
+
dialog;
|
|
24
|
+
dialogZone;
|
|
25
|
+
loadingModal;
|
|
26
|
+
spaceID;
|
|
27
|
+
chosenPlan;
|
|
28
|
+
editedPlan;
|
|
29
|
+
loading = false;
|
|
30
|
+
svgEditor;
|
|
31
|
+
svgEditorIframe;
|
|
32
|
+
navigations;
|
|
33
|
+
zones;
|
|
34
|
+
isNewZone = false;
|
|
35
|
+
newZoneData;
|
|
36
|
+
editorUrl;
|
|
37
|
+
editedZone;
|
|
38
|
+
images360;
|
|
39
|
+
/**
|
|
40
|
+
* Options for svgEditor
|
|
41
|
+
*/
|
|
42
|
+
config = {
|
|
43
|
+
noStorageOnLoad: true,
|
|
44
|
+
forceStorage: true,
|
|
45
|
+
// imgPath: "/assets/editor/images/",
|
|
46
|
+
// extPath: "/assets/editor/extensions/",
|
|
47
|
+
// langPath: "/assets/editor/locale/",
|
|
48
|
+
// canvgPath: "/assets/editor/canvg/",
|
|
49
|
+
// jspdfPath: "/assets/editor/jspdf/",
|
|
50
|
+
// jGraduatePath: "/assets/editor/jgraduate/images/",
|
|
51
|
+
// extIconsPath: "/assets/editor/extensions/",
|
|
52
|
+
// stylesheets: [
|
|
53
|
+
// "/assets/editor/jgraduate/css/jGraduate.css",
|
|
54
|
+
// "/assets/editor/spinbtn/jQuery.SpinButton.css",
|
|
55
|
+
// "/assets/editor/jgraduate/css/jPicker.css",
|
|
56
|
+
// "/assets/editor/svg-editor.css",
|
|
57
|
+
// ],
|
|
58
|
+
dimensions: [10000, 10000],
|
|
59
|
+
showlayers: true,
|
|
60
|
+
noDefaultExtensions: true,
|
|
61
|
+
basePath: "/assets/editor/",
|
|
62
|
+
customExportImage: true,
|
|
63
|
+
extensions: [
|
|
64
|
+
"ext-connector",
|
|
65
|
+
// "ext-eyedropper",
|
|
66
|
+
// "ext-grid",
|
|
67
|
+
// "ext-markers",
|
|
68
|
+
// "ext-overview_window",
|
|
69
|
+
// "ext-spi-library",
|
|
70
|
+
// "ext-spi-icon",
|
|
71
|
+
"ext-sp-zone",
|
|
72
|
+
// "ext-arrows",
|
|
73
|
+
// "ext-sp-css",
|
|
74
|
+
// "ext-placemark",
|
|
75
|
+
],
|
|
76
|
+
};
|
|
77
|
+
currentSpace;
|
|
78
|
+
menuItems = [];
|
|
79
|
+
constructor(planService, route, router, modalService, zoneService, visitService, spaceService, translate, ngZone) {
|
|
80
|
+
this.planService = planService;
|
|
81
|
+
this.route = route;
|
|
82
|
+
this.router = router;
|
|
83
|
+
this.modalService = modalService;
|
|
84
|
+
this.zoneService = zoneService;
|
|
85
|
+
this.visitService = visitService;
|
|
86
|
+
this.spaceService = spaceService;
|
|
87
|
+
this.translate = translate;
|
|
88
|
+
this.ngZone = ngZone;
|
|
89
|
+
this.chosenPlan = this.planService.getChosenPlan();
|
|
90
|
+
}
|
|
91
|
+
async ngOnInit() {
|
|
92
|
+
this.editorUrl = "/assets/editor/main.html";
|
|
93
|
+
this.spaceID = this.route.snapshot.queryParams.spaceID;
|
|
94
|
+
this.currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
95
|
+
this.setupMenuItems();
|
|
96
|
+
if (this.spaceID && !this.planService.getChosenPlan()) {
|
|
97
|
+
this.router.navigate([
|
|
98
|
+
"/dashboard/localisation",
|
|
99
|
+
this.spaceID,
|
|
100
|
+
"plans",
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
else if (!this.spaceID && !this.planService.getChosenPlan()) {
|
|
104
|
+
this.router.navigate(["/dashboard/localisation"]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
setupMenuItems() {
|
|
108
|
+
this.menuItems = [
|
|
109
|
+
{ label: "Locations", url: "/localisation" },
|
|
110
|
+
{
|
|
111
|
+
label: this.currentSpace.name,
|
|
112
|
+
url: `/localisation/${this.spaceID}`,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
label: "Plans",
|
|
116
|
+
url: `/localisation/${this.currentSpace.id}/plans`,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
label: "Edit",
|
|
120
|
+
url: `/localisation/${this.currentSpace.id}/plan-edit?spaceID=${this.currentSpace.id}`,
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
async switchAction(event) {
|
|
125
|
+
if (event.origin === window.location.origin) {
|
|
126
|
+
switch (event.data.message) {
|
|
127
|
+
case "save":
|
|
128
|
+
this.onSave(event.data.redirect);
|
|
129
|
+
break;
|
|
130
|
+
case "close":
|
|
131
|
+
this.onCancel();
|
|
132
|
+
break;
|
|
133
|
+
case "new-zone":
|
|
134
|
+
const modalReference = this.modalService.open(this.loadingModal);
|
|
135
|
+
const svg = unescape(encodeURIComponent(this.svgEditor.svgCanvas.getSvgString()));
|
|
136
|
+
const base64 = `data:image/svg+xml;base64,${window.btoa(svg)}`;
|
|
137
|
+
const currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
138
|
+
this.images360 = await this.visitService.loadImagesForSpace(currentSpace);
|
|
139
|
+
this.editedPlan = { ...this.chosenPlan };
|
|
140
|
+
this.editedPlan.filepath = base64;
|
|
141
|
+
this.newZoneData = event.data.zoneData;
|
|
142
|
+
if (this.newZoneData.elements.length === 0) {
|
|
143
|
+
modalReference.close();
|
|
144
|
+
alert(this.translate.instant("edition.no-zone"));
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
this.zones = await this.zoneService.getZonesBySpace(this.spaceID);
|
|
148
|
+
// this.zones = sortAlphabeticallyOnName(this.zones);
|
|
149
|
+
// console.log("zones", this.zones);
|
|
150
|
+
// this.editedZone = this.zones.find(
|
|
151
|
+
// (z) => z.name === this.newZoneData.name,
|
|
152
|
+
// );
|
|
153
|
+
this.resetNavigations();
|
|
154
|
+
modalReference.close();
|
|
155
|
+
this.modalService.open(this.dialogZone);
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async resetNavigations() {
|
|
163
|
+
this.navigations = [];
|
|
164
|
+
const defaultZone = this.zones.find((zone) => !zone.parentID);
|
|
165
|
+
if (defaultZone.sweepIDs.length > 0) {
|
|
166
|
+
this.navigations = defaultZone.sweepIDs;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async onLoad(svgEditor) {
|
|
170
|
+
if (svgEditor.contentWindow.SvgEditor) {
|
|
171
|
+
this.svgEditorIframe = svgEditor;
|
|
172
|
+
this.svgEditor = new svgEditor.contentWindow.SvgEditor();
|
|
173
|
+
await this.svgEditor.init();
|
|
174
|
+
await this.svgEditor.setConfig(this.config, {
|
|
175
|
+
allowInitialUserOverride: true,
|
|
176
|
+
});
|
|
177
|
+
if (this.chosenPlan && this.chosenPlan.extension === "svg") {
|
|
178
|
+
this.loadSvg();
|
|
179
|
+
}
|
|
180
|
+
if (this.chosenPlan && this.chosenPlan.extension === "pdf") {
|
|
181
|
+
this.loadPdf();
|
|
182
|
+
}
|
|
183
|
+
if (!this.chosenPlan.calibration || !this.chosenPlan.isModified) {
|
|
184
|
+
setTimeout(() => {
|
|
185
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "disable-zone" }, "*");
|
|
186
|
+
}, 1000);
|
|
187
|
+
}
|
|
188
|
+
this.svgEditor.svgCanvas.setMode('ext-panning');
|
|
189
|
+
this.svgEditor.bottomPanel.changeZoom(50);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async onSave(redirect) {
|
|
193
|
+
const imgBlob = await new Blob([this.svgEditor.svgCanvas.getSvgString()], {
|
|
194
|
+
type: "image/svg+xml",
|
|
195
|
+
});
|
|
196
|
+
const [name] = this.chosenPlan.name.split(".");
|
|
197
|
+
const imgFile = new File([imgBlob], `${name}-edited.svg`, {
|
|
198
|
+
type: "image/svg+xml",
|
|
199
|
+
lastModified: Date.now(),
|
|
200
|
+
});
|
|
201
|
+
this.planService.setPlanFileCache(imgFile);
|
|
202
|
+
if (this.chosenPlan.isModified) {
|
|
203
|
+
this.ngZone.run(() => this.modalService.open(this.dialog));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
this.ngZone.run(() => this.router.navigate([
|
|
207
|
+
"/dashboard/localisation",
|
|
208
|
+
this.spaceID,
|
|
209
|
+
"plans",
|
|
210
|
+
]));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async updateSvg() {
|
|
214
|
+
const newUrl = await this.planService.updatePlanFile();
|
|
215
|
+
await this.planService.updatePlan({
|
|
216
|
+
id: this.chosenPlan.id,
|
|
217
|
+
annexe: newUrl,
|
|
218
|
+
});
|
|
219
|
+
this.planService.setPlanFileCache(null);
|
|
220
|
+
this.ngZone.run(() => this.router.navigate([
|
|
221
|
+
"/dashboard/localisation",
|
|
222
|
+
this.spaceID,
|
|
223
|
+
"plans",
|
|
224
|
+
]));
|
|
225
|
+
}
|
|
226
|
+
async newSvg() {
|
|
227
|
+
this.ngZone.run(() => this.router.navigate([
|
|
228
|
+
"/dashboard/localisation",
|
|
229
|
+
this.spaceID,
|
|
230
|
+
"plans",
|
|
231
|
+
]));
|
|
232
|
+
}
|
|
233
|
+
async onCancel() {
|
|
234
|
+
if (window.confirm(this.translate.instant("edition.cancel-alert"))) {
|
|
235
|
+
this.ngZone.run(() => this.router.navigate([
|
|
236
|
+
"/dashboard/localisation",
|
|
237
|
+
this.spaceID,
|
|
238
|
+
"plans",
|
|
239
|
+
]));
|
|
240
|
+
alert(this.translate.instant("edition.cancel"));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async loadSvg() {
|
|
244
|
+
const svgRequest = await downloadFileAsObject(this.chosenPlan.annexe);
|
|
245
|
+
if (svgRequest) {
|
|
246
|
+
const svgBlob = await svgRequest.Body;
|
|
247
|
+
const reader = new FileReader();
|
|
248
|
+
reader.onloadend = () => {
|
|
249
|
+
this.svgEditor.loadFromDataURI(reader.result);
|
|
250
|
+
};
|
|
251
|
+
reader.readAsDataURL(svgBlob);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async loadPdf() {
|
|
255
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "disable-zone" }, "*");
|
|
256
|
+
const canvas = document.querySelector("#canvas4pdf");
|
|
257
|
+
const context = canvas.getContext("2d");
|
|
258
|
+
const pdfjs = await import("pdfjs-dist/build/pdf");
|
|
259
|
+
const pdfjsWorker = await import("pdfjs-dist/build/pdf.worker.entry");
|
|
260
|
+
pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
|
|
261
|
+
const pdf = await getDocument(this.chosenPlan.filepath).promise;
|
|
262
|
+
const page = await pdf.getPage(1);
|
|
263
|
+
const viewPortParameters = { scale: 1.5 };
|
|
264
|
+
const viewport = page.getViewport(viewPortParameters);
|
|
265
|
+
this.svgEditor.svgCanvas.setResolution(viewport.width, viewport.height);
|
|
266
|
+
canvas.height = viewport.height;
|
|
267
|
+
canvas.width = viewport.width;
|
|
268
|
+
const renderContext = {
|
|
269
|
+
canvasContext: context,
|
|
270
|
+
viewport,
|
|
271
|
+
};
|
|
272
|
+
const renderTask = page.render(renderContext).promise;
|
|
273
|
+
renderTask.then(() => {
|
|
274
|
+
const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({
|
|
275
|
+
element: "image",
|
|
276
|
+
attr: {
|
|
277
|
+
x: 0,
|
|
278
|
+
y: 0,
|
|
279
|
+
width: viewport.width,
|
|
280
|
+
height: viewport.height,
|
|
281
|
+
id: this.svgEditor.svgCanvas.getNextId(),
|
|
282
|
+
style: "pointer-events:inherit",
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
this.svgEditor.svgCanvas.setHref(newImage, canvas.toDataURL("image/png"));
|
|
286
|
+
this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant("edition.plan-base"));
|
|
287
|
+
this.svgEditor.svgCanvas.createLayer(this.translate.instant("edition.personalization"));
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
async onLoadImg(img) {
|
|
291
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "disable-zone" }, "*");
|
|
292
|
+
const imgRequest = await downloadFileAsObject(this.chosenPlan.annexe);
|
|
293
|
+
if (imgRequest) {
|
|
294
|
+
const imgBlob = await imgRequest.Body;
|
|
295
|
+
const imgWidth = img.naturalWidth;
|
|
296
|
+
const imgHeight = img.naturalHeight;
|
|
297
|
+
// await this.svgEditor.setConfig({
|
|
298
|
+
// dimensions: [imgWidth, imgHeight],
|
|
299
|
+
// });
|
|
300
|
+
this.svgEditor.svgCanvas.setResolution(imgWidth, imgHeight);
|
|
301
|
+
const reader = new FileReader();
|
|
302
|
+
reader.onloadend = () => {
|
|
303
|
+
const newImage = this.svgEditor.svgCanvas.addSVGElementFromJson({
|
|
304
|
+
element: "image",
|
|
305
|
+
attr: {
|
|
306
|
+
x: 0,
|
|
307
|
+
y: 0,
|
|
308
|
+
width: imgWidth,
|
|
309
|
+
height: imgHeight,
|
|
310
|
+
id: this.svgEditor.svgCanvas.getNextId(),
|
|
311
|
+
style: "pointer-events:inherit",
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
this.svgEditor.svgCanvas.setHref(newImage, reader.result);
|
|
315
|
+
this.svgEditor.svgCanvas.renameCurrentLayer(this.translate.instant("edition.plan-base"));
|
|
316
|
+
this.svgEditor.svgCanvas.createLayer(this.translate.instant("edition.personalization"));
|
|
317
|
+
};
|
|
318
|
+
reader.readAsDataURL(imgBlob);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
onNewZone(event) {
|
|
322
|
+
this.isNewZone = false;
|
|
323
|
+
if (event) {
|
|
324
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "rename-layer", name: event }, "*");
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
this.svgEditorIframe.contentWindow.postMessage({ action: "cancel-layer" }, "*");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditPlanComponent, deps: [{ token: i1.PlanService }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.NgbModal }, { token: i1.ZoneService }, { token: i1.VisitService }, { token: i1.SpaceService }, { token: i4.TranslateService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
331
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EditPlanComponent, selector: "lib-edit-plan", host: { listeners: { "window:message": "switchAction($event)" } }, viewQueries: [{ propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }, { propertyName: "dialogZone", first: true, predicate: ["dialogZone"], descendants: true }, { propertyName: "loadingModal", first: true, predicate: ["preparing"], descendants: true }], ngImport: i0, template: "<div class=\"row mt-3\">\r\n <div class=\"col\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\r\n </div>\r\n </div>\r\n</div>\r\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\r\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\r\n [newZoneDataFromEditor]=\"newZoneData\"></lib-add-zone>\r\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\r\n style=\"height:100%;width:100%;min-height:550px;max-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\r\n<!-- chosenPlan && -->\r\n<!-- ./../../../../../../assets/svgeditor/index.html -->\r\n\r\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\r\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\r\n\r\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\r\n\r\n<ng-template #dialog let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'save plan edited' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #dialogZone let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'confirm.new-zone-from-plan' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\"\r\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #preparing let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>", styles: ["app-add-zone{position:absolute;top:0;left:0;background-color:#fff;width:100%;height:100%;padding:30px}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { kind: "component", type: i7.AddZoneComponent, selector: "lib-add-zone", inputs: ["zoneEdit", "spaceID", "images360", "navigationIDs", "zones", "newZoneDataFromEditor", "chosenPlan", "isMuseumVisit", "defaultZone"], outputs: ["updatedZone"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1.SafeUrlPipe, name: "safeUrl" }] });
|
|
332
|
+
}
|
|
333
|
+
export { EditPlanComponent };
|
|
334
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EditPlanComponent, decorators: [{
|
|
335
|
+
type: Component,
|
|
336
|
+
args: [{ selector: 'lib-edit-plan', template: "<div class=\"row mt-3\">\r\n <div class=\"col\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\r\n </div>\r\n </div>\r\n</div>\r\n<lib-add-zone *ngIf=\"isNewZone\" [images360]=\"images360\" [spaceID]=\"spaceID\" [navigationIDs]=\"navigations\"\r\n [zoneEdit]=\"editedZone\" [zones]=\"zones\" (updatedZone)=\"onNewZone($event)\" [chosenPlan]=\"editedPlan\"\r\n [newZoneDataFromEditor]=\"newZoneData\"></lib-add-zone>\r\n<iframe *ngIf=\"editorUrl\" #svgEditor [src]=\"editorUrl | safeUrl\" frameborder=\"0\"\r\n style=\"height:100%;width:100%;min-height:550px;max-height:750px\" (load)=\"onLoad(svgEditor)\"></iframe>\r\n<!-- chosenPlan && -->\r\n<!-- ./../../../../../../assets/svgeditor/index.html -->\r\n\r\n<img #imgPng *ngIf=\"chosenPlan && chosenPlan.extension !== 'svg' && svgEditor\" [src]=\"chosenPlan.filepath\"\r\n (load)=\"onLoadImg(imgPng)\" style=\"display: none;\">\r\n\r\n<canvas id=\"canvas4pdf\" style=\"display: none;\"></canvas>\r\n\r\n<ng-template #dialog let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'save plan edited' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"newSvg();modal.close('Close click')\">{{'Yes' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"updateSvg();modal.close('Close click')\">{{'No' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #dialogZone let-modal>\r\n\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Submit' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n {{'confirm.new-zone-from-plan' | translate}}\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-outline-dark\"\r\n (click)=\"isNewZone = true;modal.close('Close click')\">{{'Validate' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-dark\" (click)=\"modal.close('Close click')\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #preparing let-modal>\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">{{'Processing' | translate}}</h4>\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"modal.dismiss('Cross click')\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>", styles: ["app-add-zone{position:absolute;top:0;left:0;background-color:#fff;width:100%;height:100%;padding:30px}\n"] }]
|
|
337
|
+
}], ctorParameters: function () { return [{ type: i1.PlanService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.NgbModal }, { type: i1.ZoneService }, { type: i1.VisitService }, { type: i1.SpaceService }, { type: i4.TranslateService }, { type: i0.NgZone }]; }, propDecorators: { dialog: [{
|
|
338
|
+
type: ViewChild,
|
|
339
|
+
args: ["dialog"]
|
|
340
|
+
}], dialogZone: [{
|
|
341
|
+
type: ViewChild,
|
|
342
|
+
args: ["dialogZone"]
|
|
343
|
+
}], loadingModal: [{
|
|
344
|
+
type: ViewChild,
|
|
345
|
+
args: ["preparing"]
|
|
346
|
+
}], switchAction: [{
|
|
347
|
+
type: HostListener,
|
|
348
|
+
args: ["window:message", ["$event"]]
|
|
349
|
+
}] } });
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1wbGFuLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1sb2NhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5zL2VkaXQtcGxhbi9lZGl0LXBsYW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvcGxhbnMvZWRpdC1wbGFuL2VkaXQtcGxhbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBa0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSW5GLE9BQU8sRUFBRSxXQUFXLEVBQW9CLE1BQU0sWUFBWSxDQUFDO0FBQzNELHFEQUFxRDtBQUNyRCxPQUFPLEVBQStHLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7OztBQUV0TCxNQUthLGlCQUFpQjtJQStFZDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFyRlMsTUFBTSxDQUFPO0lBRVQsVUFBVSxDQUFPO0lBRWxCLFlBQVksQ0FBTTtJQUUxQyxPQUFPLENBQVM7SUFFaEIsVUFBVSxDQUFPO0lBRWpCLFVBQVUsQ0FBTztJQUVqQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBRXpCLFNBQVMsQ0FBQztJQUVWLGVBQWUsQ0FBQztJQUVoQixXQUFXLENBQVc7SUFFdEIsS0FBSyxDQUFTO0lBRWQsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUUzQixXQUFXLENBQUM7SUFFWixTQUFTLENBQUM7SUFFVixVQUFVLENBQU87SUFFakIsU0FBUyxDQUFDO0lBR1Y7O09BRUc7SUFDSyxNQUFNLEdBQVE7UUFDbEIsZUFBZSxFQUFFLElBQUk7UUFDckIsWUFBWSxFQUFFLElB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ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBOZ1pvbmUsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBnZXREb2N1bWVudCwgUERGRG9jdW1lbnRQcm94eSB9IGZyb20gXCJwZGZqcy1kaXN0XCI7XHJcbi8vIGltcG9ydCB7IFBERkRvY3VtZW50UHJveHkgfSBmcm9tIFwibmcyLXBkZi12aWV3ZXJcIjtcclxuaW1wb3J0IHsgWm9uZSwgUGxhbiwgU3BhY2UsIE1lbnVJdGVtLCBQbGFuU2VydmljZSwgWm9uZVNlcnZpY2UsIFZpc2l0U2VydmljZSwgU3BhY2VTZXJ2aWNlLCBzb3J0QWxwaGFiZXRpY2FsbHlPbk5hbWUsIGRvd25sb2FkRmlsZUFzT2JqZWN0IH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItZWRpdC1wbGFuJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9lZGl0LXBsYW4uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdC1wbGFuLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVkaXRQbGFuQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiZGlhbG9nXCIpIGRpYWxvZyE6IGFueTtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiZGlhbG9nWm9uZVwiKSBkaWFsb2dab25lITogYW55O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoXCJwcmVwYXJpbmdcIikgbG9hZGluZ01vZGFsOiBhbnk7XHJcblxyXG4gICAgc3BhY2VJRDogc3RyaW5nO1xyXG5cclxuICAgIGNob3NlblBsYW46IFBsYW47XHJcblxyXG4gICAgZWRpdGVkUGxhbjogUGxhbjtcclxuXHJcbiAgICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3ZnRWRpdG9yO1xyXG5cclxuICAgIHN2Z0VkaXRvcklmcmFtZTtcclxuXHJcbiAgICBuYXZpZ2F0aW9uczogc3RyaW5nW107XHJcblxyXG4gICAgem9uZXM6IFpvbmVbXTtcclxuXHJcbiAgICBpc05ld1pvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBuZXdab25lRGF0YTtcclxuXHJcbiAgICBlZGl0b3JVcmw7XHJcblxyXG4gICAgZWRpdGVkWm9uZTogWm9uZTtcclxuXHJcbiAgICBpbWFnZXMzNjA7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3B0aW9ucyBmb3Igc3ZnRWRpdG9yXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZmlnOiBhbnkgPSB7XHJcbiAgICAgICAgbm9TdG9yYWdlT25Mb2FkOiB0cnVlLFxyXG4gICAgICAgIGZvcmNlU3RvcmFnZTogdHJ1ZSxcclxuICAgICAgICAvLyBpbWdQYXRoOiBcIi9hc3NldHMvZWRpdG9yL2ltYWdlcy9cIixcclxuICAgICAgICAvLyBleHRQYXRoOiBcIi9hc3NldHMvZWRpdG9yL2V4dGVuc2lvbnMvXCIsXHJcbiAgICAgICAgLy8gbGFuZ1BhdGg6IFwiL2Fzc2V0cy9lZGl0b3IvbG9jYWxlL1wiLFxyXG4gICAgICAgIC8vIGNhbnZnUGF0aDogXCIvYXNzZXRzL2VkaXRvci9jYW52Zy9cIixcclxuICAgICAgICAvLyBqc3BkZlBhdGg6IFwiL2Fzc2V0cy9lZGl0b3IvanNwZGYvXCIsXHJcbiAgICAgICAgLy8gakdyYWR1YXRlUGF0aDogXCIvYXNzZXRzL2VkaXRvci9qZ3JhZHVhdGUvaW1hZ2VzL1wiLFxyXG4gICAgICAgIC8vIGV4dEljb25zUGF0aDogXCIvYXNzZXRzL2VkaXRvci9leHRlbnNpb25zL1wiLFxyXG4gICAgICAgIC8vIHN0eWxlc2hlZXRzOiBbXHJcbiAgICAgICAgLy8gICAgIFwiL2Fzc2V0cy9lZGl0b3IvamdyYWR1YXRlL2Nzcy9qR3JhZHVhdGUuY3NzXCIsXHJcbiAgICAgICAgLy8gICAgIFwiL2Fzc2V0cy9lZGl0b3Ivc3BpbmJ0bi9qUXVlcnkuU3BpbkJ1dHRvbi5jc3NcIixcclxuICAgICAgICAvLyAgICAgXCIvYXNzZXRzL2VkaXRvci9qZ3JhZHVhdGUvY3NzL2pQaWNrZXIuY3NzXCIsXHJcbiAgICAgICAgLy8gICAgIFwiL2Fzc2V0cy9lZGl0b3Ivc3ZnLWVkaXRvci5jc3NcIixcclxuICAgICAgICAvLyBdLFxyXG4gICAgICAgIGRpbWVuc2lvbnM6IFsxMDAwMCwgMTAwMDBdLFxyXG4gICAgICAgIHNob3dsYXllcnM6IHRydWUsXHJcbiAgICAgICAgbm9EZWZhdWx0RXh0ZW5zaW9uczogdHJ1ZSxcclxuICAgICAgICBiYXNlUGF0aDogXCIvYXNzZXRzL2VkaXRvci9cIixcclxuICAgICAgICBjdXN0b21FeHBvcnRJbWFnZTogdHJ1ZSxcclxuICAgICAgICBleHRlbnNpb25zOiBbXHJcbiAgICAgICAgICAgIFwiZXh0LWNvbm5lY3RvclwiLFxyXG4gICAgICAgICAgICAvLyBcImV4dC1leWVkcm9wcGVyXCIsXHJcbiAgICAgICAgICAgIC8vIFwiZXh0LWdyaWRcIixcclxuICAgICAgICAgICAgLy8gXCJleHQtbWFya2Vyc1wiLFxyXG4gICAgICAgICAgICAvLyBcImV4dC1vdmVydmlld193aW5kb3dcIixcclxuICAgICAgICAgICAgLy8gXCJleHQtc3BpLWxpYnJhcnlcIixcclxuICAgICAgICAgICAgLy8gXCJleHQtc3BpLWljb25cIixcclxuICAgICAgICAgICAgXCJleHQtc3Atem9uZVwiLFxyXG4gICAgICAgICAgICAvLyBcImV4dC1hcnJvd3NcIixcclxuICAgICAgICAgICAgLy8gXCJleHQtc3AtY3NzXCIsXHJcbiAgICAgICAgICAgIC8vIFwiZXh0LXBsYWNlbWFya1wiLFxyXG4gICAgICAgIF0sXHJcbiAgICB9O1xyXG5cclxuICAgIGN1cnJlbnRTcGFjZTogU3BhY2U7XHJcblxyXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBwbGFuU2VydmljZTogUGxhblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB2aXNpdFNlcnZpY2U6IFZpc2l0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmNob3NlblBsYW4gPSB0aGlzLnBsYW5TZXJ2aWNlLmdldENob3NlblBsYW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmVkaXRvclVybCA9IFwiL2Fzc2V0cy9lZGl0b3IvbWFpbi5odG1sXCI7XHJcbiAgICAgICAgdGhpcy5zcGFjZUlEID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5zcGFjZUlEO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZUlEKTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc3BhY2VJRCAmJiAhdGhpcy5wbGFuU2VydmljZS5nZXRDaG9zZW5QbGFuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1xyXG4gICAgICAgICAgICAgICAgXCIvZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgXCJwbGFuc1wiLFxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnNwYWNlSUQgJiYgIXRoaXMucGxhblNlcnZpY2UuZ2V0Q2hvc2VuUGxhbigpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIi9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCJdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuY3VycmVudFNwYWNlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5zcGFjZUlEfWAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIlBsYW5zXCIsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5jdXJyZW50U3BhY2UuaWR9L3BsYW5zYCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiRWRpdFwiLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBgL2xvY2FsaXNhdGlvbi8ke3RoaXMuY3VycmVudFNwYWNlLmlkfS9wbGFuLWVkaXQ/c3BhY2VJRD0ke3RoaXMuY3VycmVudFNwYWNlLmlkfWAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKFwid2luZG93Om1lc3NhZ2VcIiwgW1wiJGV2ZW50XCJdKVxyXG4gICAgYXN5bmMgc3dpdGNoQWN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmRhdGEubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2F2ZShldmVudC5kYXRhLnJlZGlyZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJjbG9zZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJuZXctem9uZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsUmVmZXJlbmNlID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdmcgPSB1bmVzY2FwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLmdldFN2Z1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCR7d2luZG93LmJ0b2EoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN2ZyxcclxuICAgICAgICAgICAgICAgICAgICApfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VJRCxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlczM2MCA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmxvYWRJbWFnZXNGb3JTcGFjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNwYWNlLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGVkUGxhbiA9IHsgLi4udGhpcy5jaG9zZW5QbGFuIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0ZWRQbGFuLmZpbGVwYXRoID0gYmFzZTY0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3Wm9uZURhdGEgPSBldmVudC5kYXRhLnpvbmVEYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5ld1pvbmVEYXRhLmVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbFJlZmVyZW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydCh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiZWRpdGlvbi5uby16b25lXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy56b25lcyA9IHNvcnRBbHBoYWJldGljYWxseU9uTmFtZSh0aGlzLnpvbmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInpvbmVzXCIsIHRoaXMuem9uZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZWRpdGVkWm9uZSA9IHRoaXMuem9uZXMuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHopID0+IHoubmFtZSA9PT0gdGhpcy5uZXdab25lRGF0YS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldE5hdmlnYXRpb25zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kYWxSZWZlcmVuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuZGlhbG9nWm9uZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVzZXROYXZpZ2F0aW9ucygpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25zID0gW107XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFpvbmUgPSB0aGlzLnpvbmVzLmZpbmQoKHpvbmUpID0+ICF6b25lLnBhcmVudElEKTtcclxuICAgICAgICBpZiAoZGVmYXVsdFpvbmUuc3dlZXBJRHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25zID0gZGVmYXVsdFpvbmUuc3dlZXBJRHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uTG9hZChzdmdFZGl0b3IpIHtcclxuICAgICAgICBpZiAoc3ZnRWRpdG9yLmNvbnRlbnRXaW5kb3cuU3ZnRWRpdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnRWRpdG9ySWZyYW1lID0gc3ZnRWRpdG9yO1xyXG4gICAgICAgICAgICB0aGlzLnN2Z0VkaXRvciA9IG5ldyBzdmdFZGl0b3IuY29udGVudFdpbmRvdy5TdmdFZGl0b3IoKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3ZnRWRpdG9yLmluaXQoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdmdFZGl0b3Iuc2V0Q29uZmlnKHRoaXMuY29uZmlnLCB7XHJcbiAgICAgICAgICAgICAgICBhbGxvd0luaXRpYWxVc2VyT3ZlcnJpZGU6IHRydWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hvc2VuUGxhbiAmJiB0aGlzLmNob3NlblBsYW4uZXh0ZW5zaW9uID09PSBcInN2Z1wiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRTdmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jaG9zZW5QbGFuICYmIHRoaXMuY2hvc2VuUGxhbi5leHRlbnNpb24gPT09IFwicGRmXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFBkZigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jaG9zZW5QbGFuLmNhbGlicmF0aW9uIHx8ICF0aGlzLmNob3NlblBsYW4uaXNNb2RpZmllZCkge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3JJZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBhY3Rpb246IFwiZGlzYWJsZS16b25lXCIgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuc2V0TW9kZSgnZXh0LXBhbm5pbmcnKTtcclxuICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3IuYm90dG9tUGFuZWwuY2hhbmdlWm9vbSg1MClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TYXZlKHJlZGlyZWN0OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgaW1nQmxvYiA9IGF3YWl0IG5ldyBCbG9iKFxyXG4gICAgICAgICAgICBbdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLmdldFN2Z1N0cmluZygpXSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9zdmcreG1sXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBbbmFtZV0gPSB0aGlzLmNob3NlblBsYW4ubmFtZS5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaW1nRmlsZTogRmlsZSA9IG5ldyBGaWxlKFtpbWdCbG9iXSwgYCR7bmFtZX0tZWRpdGVkLnN2Z2AsIHtcclxuICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9zdmcreG1sXCIsXHJcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnBsYW5TZXJ2aWNlLnNldFBsYW5GaWxlQ2FjaGUoaW1nRmlsZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hvc2VuUGxhbi5pc01vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmRpYWxvZykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1xyXG4gICAgICAgICAgICAgICAgICAgIFwiL2Rhc2hib2FyZC9sb2NhbGlzYXRpb25cIixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYWNlSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJwbGFuc1wiLFxyXG4gICAgICAgICAgICAgICAgXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVTdmcoKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VXJsID0gYXdhaXQgdGhpcy5wbGFuU2VydmljZS51cGRhdGVQbGFuRmlsZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGxhblNlcnZpY2UudXBkYXRlUGxhbih7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmNob3NlblBsYW4uaWQsXHJcbiAgICAgICAgICAgIGFubmV4ZTogbmV3VXJsLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucGxhblNlcnZpY2Uuc2V0UGxhbkZpbGVDYWNoZShudWxsKTtcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT5cclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1xyXG4gICAgICAgICAgICAgICAgXCIvZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgXCJwbGFuc1wiLFxyXG4gICAgICAgICAgICBdKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbmV3U3ZnKCkge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXHJcbiAgICAgICAgICAgICAgICBcIi9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNwYWNlSUQsXHJcbiAgICAgICAgICAgICAgICBcInBsYW5zXCIsXHJcbiAgICAgICAgICAgIF0pKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkNhbmNlbCgpIHtcclxuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0odGhpcy50cmFuc2xhdGUuaW5zdGFudChcImVkaXRpb24uY2FuY2VsLWFsZXJ0XCIpKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcclxuICAgICAgICAgICAgICAgICAgICBcIi9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgICAgIFwicGxhbnNcIixcclxuICAgICAgICAgICAgICAgIF0pKTtcclxuICAgICAgICAgICAgYWxlcnQodGhpcy50cmFuc2xhdGUuaW5zdGFudChcImVkaXRpb24uY2FuY2VsXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZFN2ZygpIHtcclxuICAgICAgICBjb25zdCBzdmdSZXF1ZXN0OiBhbnkgPSBhd2FpdCBkb3dubG9hZEZpbGVBc09iamVjdChcclxuICAgICAgICAgICAgdGhpcy5jaG9zZW5QbGFuLmFubmV4ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChzdmdSZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN2Z0Jsb2IgPSBhd2FpdCBzdmdSZXF1ZXN0LkJvZHk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0VkaXRvci5sb2FkRnJvbURhdGFVUkkocmVhZGVyLnJlc3VsdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHN2Z0Jsb2IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkUGRmKCkge1xyXG4gICAgICAgIHRoaXMuc3ZnRWRpdG9ySWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoXHJcbiAgICAgICAgICAgIHsgYWN0aW9uOiBcImRpc2FibGUtem9uZVwiIH0sXHJcbiAgICAgICAgICAgIFwiKlwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICAgXCIjY2FudmFzNHBkZlwiLFxyXG4gICAgICAgICkgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xyXG5cclxuICAgICAgICBjb25zdCBwZGZqcyA9IGF3YWl0IGltcG9ydChcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCIpO1xyXG4gICAgICAgIGNvbnN0IHBkZmpzV29ya2VyID0gYXdhaXQgaW1wb3J0KFwicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyLmVudHJ5XCIpO1xyXG5cclxuICAgICAgICBwZGZqcy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9IHBkZmpzV29ya2VyO1xyXG5cclxuICAgICAgICBjb25zdCBwZGY6IFBERkRvY3VtZW50UHJveHkgPSBhd2FpdCBnZXREb2N1bWVudChcclxuICAgICAgICAgICAgdGhpcy5jaG9zZW5QbGFuLmZpbGVwYXRoLFxyXG4gICAgICAgICkucHJvbWlzZTtcclxuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgcGRmLmdldFBhZ2UoMSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZXdQb3J0UGFyYW1ldGVycyA9IHsgc2NhbGU6IDEuNSB9O1xyXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh2aWV3UG9ydFBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuc3ZnRWRpdG9yLnN2Z0NhbnZhcy5zZXRSZXNvbHV0aW9uKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpO1xyXG5cclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0O1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHZpZXdwb3J0LndpZHRoO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGNvbnRleHQsXHJcbiAgICAgICAgICAgIHZpZXdwb3J0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcmVuZGVyVGFzayA9IHBhZ2UucmVuZGVyKHJlbmRlckNvbnRleHQpLnByb21pc2U7XHJcbiAgICAgICAgcmVuZGVyVGFzay50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3SW1hZ2UgPSB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuYWRkU1ZHRWxlbWVudEZyb21Kc29uKHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IFwiaW1hZ2VcIixcclxuICAgICAgICAgICAgICAgIGF0dHI6IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHZpZXdwb3J0LndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuZ2V0TmV4dElkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IFwicG9pbnRlci1ldmVudHM6aW5oZXJpdFwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnRWRpdG9yLnN2Z0NhbnZhcy5zZXRIcmVmKFxyXG4gICAgICAgICAgICAgICAgbmV3SW1hZ2UsXHJcbiAgICAgICAgICAgICAgICBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLnJlbmFtZUN1cnJlbnRMYXllcih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiZWRpdGlvbi5wbGFuLWJhc2VcIikpO1xyXG4gICAgICAgICAgICB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuY3JlYXRlTGF5ZXIodGhpcy50cmFuc2xhdGUuaW5zdGFudChcImVkaXRpb24ucGVyc29uYWxpemF0aW9uXCIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkxvYWRJbWcoaW1nOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnN2Z0VkaXRvcklmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKFxyXG4gICAgICAgICAgICB7IGFjdGlvbjogXCJkaXNhYmxlLXpvbmVcIiB9LFxyXG4gICAgICAgICAgICBcIipcIixcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGltZ1JlcXVlc3Q6IGFueSA9IGF3YWl0IGRvd25sb2FkRmlsZUFzT2JqZWN0KFxyXG4gICAgICAgICAgICB0aGlzLmNob3NlblBsYW4uYW5uZXhlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGltZ1JlcXVlc3QpIHtcclxuICAgICAgICAgICAgY29uc3QgaW1nQmxvYiA9IGF3YWl0IGltZ1JlcXVlc3QuQm9keTtcclxuICAgICAgICAgICAgY29uc3QgaW1nV2lkdGggPSBpbWcubmF0dXJhbFdpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBpbWdIZWlnaHQgPSBpbWcubmF0dXJhbEhlaWdodDtcclxuICAgICAgICAgICAgLy8gYXdhaXQgdGhpcy5zdmdFZGl0b3Iuc2V0Q29uZmlnKHtcclxuICAgICAgICAgICAgLy8gICAgIGRpbWVuc2lvbnM6IFtpbWdXaWR0aCwgaW1nSGVpZ2h0XSxcclxuICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnRWRpdG9yLnN2Z0NhbnZhcy5zZXRSZXNvbHV0aW9uKGltZ1dpZHRoLCBpbWdIZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ltYWdlID0gdGhpcy5zdmdFZGl0b3Iuc3ZnQ2FudmFzLmFkZFNWR0VsZW1lbnRGcm9tSnNvbihcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IFwiaW1hZ2VcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaW1nV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGltZ0hlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuZ2V0TmV4dElkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogXCJwb2ludGVyLWV2ZW50czppbmhlcml0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuc2V0SHJlZihuZXdJbWFnZSwgcmVhZGVyLnJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMucmVuYW1lQ3VycmVudExheWVyKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJlZGl0aW9uLnBsYW4tYmFzZVwiKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN2Z0VkaXRvci5zdmdDYW52YXMuY3JlYXRlTGF5ZXIodGhpcy50cmFuc2xhdGUuaW5zdGFudChcImVkaXRpb24ucGVyc29uYWxpemF0aW9uXCIpKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoaW1nQmxvYik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uTmV3Wm9uZShldmVudCkge1xyXG4gICAgICAgIHRoaXMuaXNOZXdab25lID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnRWRpdG9ySWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogXCJyZW5hbWUtbGF5ZXJcIiwgbmFtZTogZXZlbnQgfSxcclxuICAgICAgICAgICAgICAgIFwiKlwiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3ZnRWRpdG9ySWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogXCJjYW5jZWwtbGF5ZXJcIiB9LFxyXG4gICAgICAgICAgICAgICAgXCIqXCIsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibS0zXCI+XHJcbiAgICAgICAgICAgIDxsaWItdGFiLW5hdmlnYXRpb24gW21lbnVJdGVtc109J21lbnVJdGVtcyc+PC9saWItdGFiLW5hdmlnYXRpb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxsaWItYWRkLXpvbmUgKm5nSWY9XCJpc05ld1pvbmVcIiBbaW1hZ2VzMzYwXT1cImltYWdlczM2MFwiIFtzcGFjZUlEXT1cInNwYWNlSURcIiBbbmF2aWdhdGlvbklEc109XCJuYXZpZ2F0aW9uc1wiXHJcbiAgICBbem9uZUVkaXRdPVwiZWRpdGVkWm9uZVwiIFt6b25lc109XCJ6b25lc1wiICh1cGRhdGVkWm9uZSk9XCJvbk5ld1pvbmUoJGV2ZW50KVwiIFtjaG9zZW5QbGFuXT1cImVkaXRlZFBsYW5cIlxyXG4gICAgW25ld1pvbmVEYXRhRnJvbUVkaXRvcl09XCJuZXdab25lRGF0YVwiPjwvbGliLWFkZC16b25lPlxyXG48aWZyYW1lICpuZ0lmPVwiZWRpdG9yVXJsXCIgI3N2Z0VkaXRvciBbc3JjXT1cImVkaXRvclVybCB8IHNhZmVVcmxcIiBmcmFtZWJvcmRlcj1cIjBcIlxyXG4gICAgc3R5bGU9XCJoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6NTUwcHg7bWF4LWhlaWdodDo3NTBweFwiIChsb2FkKT1cIm9uTG9hZChzdmdFZGl0b3IpXCI+PC9pZnJhbWU+XHJcbjwhLS0gY2hvc2VuUGxhbiAmJiAtLT5cclxuPCEtLSAuLy4uLy4uLy4uLy4uLy4uLy4uL2Fzc2V0cy9zdmdlZGl0b3IvaW5kZXguaHRtbCAtLT5cclxuXHJcbjxpbWcgI2ltZ1BuZyAqbmdJZj1cImNob3NlblBsYW4gJiYgY2hvc2VuUGxhbi5leHRlbnNpb24gIT09ICdzdmcnICYmIHN2Z0VkaXRvclwiIFtzcmNdPVwiY2hvc2VuUGxhbi5maWxlcGF0aFwiXHJcbiAgICAobG9hZCk9XCJvbkxvYWRJbWcoaW1nUG5nKVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuXHJcbjxjYW52YXMgaWQ9XCJjYW52YXM0cGRmXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvY2FudmFzPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2cgbGV0LW1vZGFsPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPnt7J1N1Ym1pdCcgfCB0cmFuc2xhdGV9fTwvaDQ+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKCdDcm9zcyBjbGljaycpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAge3snc2F2ZSBwbGFuIGVkaXRlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFya1wiIChjbGljayk9XCJuZXdTdmcoKTttb2RhbC5jbG9zZSgnQ2xvc2UgY2xpY2snKVwiPnt7J1llcycgfFxyXG4gICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLWRhcmtcIiAoY2xpY2spPVwidXBkYXRlU3ZnKCk7bW9kYWwuY2xvc2UoJ0Nsb3NlIGNsaWNrJylcIj57eydObycgfFxyXG4gICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2dab25lIGxldC1tb2RhbD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57eydTdWJtaXQnIHwgdHJhbnNsYXRlfX08L2g0PlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygnQ3Jvc3MgY2xpY2snKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgIHt7J2NvbmZpcm0ubmV3LXpvbmUtZnJvbS1wbGFuJyB8IHRyYW5zbGF0ZX19XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1kYXJrXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImlzTmV3Wm9uZSA9IHRydWU7bW9kYWwuY2xvc2UoJ0Nsb3NlIGNsaWNrJylcIj57eydWYWxpZGF0ZScgfFxyXG4gICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLWRhcmtcIiAoY2xpY2spPVwibW9kYWwuY2xvc2UoJ0Nsb3NlIGNsaWNrJylcIj57eydDYW5jZWwnIHxcclxuICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjcHJlcGFyaW5nIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPnt7J1Byb2Nlc3NpbmcnIHwgdHJhbnNsYXRlfX08L2g0PlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygnQ3Jvc3MgY2xpY2snKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXJcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|