qms-angular 1.0.39 → 1.0.40

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 (71) hide show
  1. package/bundles/qms-angular.umd.js +2845 -253
  2. package/bundles/qms-angular.umd.js.map +1 -1
  3. package/esm2015/lib/model/en.js +14 -1
  4. package/esm2015/lib/model/no.js +18 -5
  5. package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.js +3 -1
  6. package/esm2015/lib/qms-ckeditor-components/common/constants/iconSvg.constants.js +8 -0
  7. package/esm2015/lib/qms-ckeditor-components/common/enums/image-mode.enum.js +9 -0
  8. package/esm2015/lib/qms-ckeditor-components/common/enums/protocol-type.enum.js +11 -3
  9. package/esm2015/lib/qms-ckeditor-components/common/enums/target-type.enum.js +8 -1
  10. package/esm2015/lib/qms-ckeditor-components/common/functions/common.function.js +3 -1
  11. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.js +1 -1
  12. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-input.model.js +1 -9
  13. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.js +524 -0
  14. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.lib.js +1948 -0
  15. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.validator.js +7 -0
  16. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-link/qms-ckeditor-link.component.js +4 -4
  17. package/esm2015/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.js +22 -0
  18. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.component.js +45 -12
  19. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.module.js +11 -1
  20. package/esm2015/qms-angular.js +3 -1
  21. package/fesm2015/qms-angular.js +2822 -252
  22. package/fesm2015/qms-angular.js.map +1 -1
  23. package/lib/model/en.d.ts +13 -0
  24. package/lib/model/no.d.ts +13 -0
  25. package/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.d.ts +2 -0
  26. package/lib/qms-ckeditor-components/common/constants/iconSvg.constants.d.ts +7 -0
  27. package/lib/qms-ckeditor-components/common/enums/image-mode.enum.d.ts +7 -0
  28. package/lib/qms-ckeditor-components/common/enums/protocol-type.enum.d.ts +9 -2
  29. package/lib/qms-ckeditor-components/common/enums/target-type.enum.d.ts +6 -0
  30. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-data.model.d.ts +1 -0
  31. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-input.model.d.ts +7 -7
  32. package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.d.ts +123 -0
  33. package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.lib.d.ts +542 -0
  34. package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.validator.d.ts +2 -0
  35. package/lib/qms-ckeditor-components/models/qms-ckeditor-imagemap.model.d.ts +20 -0
  36. package/lib/qms-ckeditor-components/qms-ckeditor.component.d.ts +5 -4
  37. package/package.json +1 -1
  38. package/qms-angular.d.ts +2 -0
  39. package/qms-angular.metadata.json +1 -1
  40. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js +2 -2
  41. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js.map +1 -1
  42. package/src/assets/qms-ckeditor-plugin/package-lock.json +12177 -9
  43. package/src/assets/qms-ckeditor-plugin/src/ckeditor.js +3 -2
  44. package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorConstant.js +4 -0
  45. package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorService.js +10 -0
  46. package/src/assets/qms-ckeditor-plugin/src/plugins/fullscreen/dist/qmsCKEditorFullscreenPlugin.dev.js +87 -0
  47. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/converters.js +378 -0
  48. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemap.js +14 -0
  49. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapediting.js +183 -0
  50. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapui.js +49 -0
  51. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/insertimagemapcommand.js +127 -0
  52. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/resizeimagemapcommand.js +82 -0
  53. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/utils.js +234 -0
  54. package/src/assets/qms-ckeditor-plugin/src/plugins/link/linkediting.js +1 -1
  55. package/src/assets/qms-ckeditor-plugin/src/plugins/link/linkimage.js +1 -1
  56. package/src/assets/qms-ckeditor-plugin/src/plugins/link/ui/linkactionsview.js +1 -1
  57. package/src/assets/qms-ckeditor-plugin/src/plugins/link/ui/linkformview.js +1 -1
  58. package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/inserttooltipcommand.js +1 -1
  59. package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/tooltipediting.js +1 -1
  60. package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/ui/actionsview.js +1 -1
  61. package/src/assets/qms-ckeditor-plugin/src/themes/icons/imagemap.svg +56 -0
  62. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/anchor.css +0 -0
  63. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/link.css +0 -0
  64. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkactions.css +0 -0
  65. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkform.css +0 -0
  66. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/linkimage.css +0 -0
  67. package/src/assets/qms-ckeditor-plugin/src/themes/{tyles → styles}/tooltip.css +0 -0
  68. package/src/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.scss +27 -0
  69. package/src/themes/_color.scss +8 -0
  70. package/src/themes/core/_colors.scss +2 -0
  71. package/src/themes/core/_tab.scss +50 -49
@@ -0,0 +1,524 @@
1
+ import { ChangeDetectorRef, Component, Inject, ViewChild, Renderer2 } from '@angular/core';
2
+ import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import { TranslateLibraryService } from '../../../services/translation-registry.service';
5
+ import { QMSCKEditorBaseComponent } from '../../qms-ckeditor-base.component';
6
+ import { QMSCKEditorImageMap } from '../../models/qms-ckeditor-imagemap.model';
7
+ import { LinkType } from '../../common/enums/link-type.enum';
8
+ import { ProtocolTypeName } from '../../common/enums/protocol-type.enum';
9
+ import { TargetTypeName } from '../../common/enums/target-type.enum';
10
+ import { ImageModeName } from '../../common/enums/image-mode.enum';
11
+ import { DomSanitizer } from '@angular/platform-browser';
12
+ import { MatIconRegistry } from '@angular/material/icon';
13
+ import { IconSvg } from '../../common/constants/iconSvg.constants';
14
+ import { QMSCKEditorImageMapLib } from './qms-ckeditor-imagemap.lib';
15
+ import { QMSCKEditorRelation } from '../../common/models/qms-ckeditor-relation.model';
16
+ import QMSCKEditorParamter from '../../common/models/qms-ckeditor-parameter.model';
17
+ import { QMSCKEditorLinkService } from '../../services/qms-ckeditor-link.service';
18
+ import { QMSCKEditorRelatedComponent } from '../qms-ckeditor-relation/qmsckeditor-related.component';
19
+ import { LinkAttachmentComponent } from '../qms-ckeditor-link/attachments/link-attachment.component';
20
+ import { LinkAnchor } from '../../common/enums/link-anchor.enum';
21
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
22
+ import { invalidURLValidator } from './qms-ckeditor-imagemap.validator';
23
+ export class QMSCKEditorImageMapComponent extends QMSCKEditorBaseComponent {
24
+ constructor(renderer, cdr, dialog, translate, linkService, dialogRef, data, iconRegistry, sanitizer) {
25
+ super();
26
+ this.renderer = renderer;
27
+ this.cdr = cdr;
28
+ this.dialog = dialog;
29
+ this.translate = translate;
30
+ this.linkService = linkService;
31
+ this.dialogRef = dialogRef;
32
+ this.data = data;
33
+ this.linkTypes = [];
34
+ this.targets = [];
35
+ this.protocols = [];
36
+ this.modes = [];
37
+ this.zoomTypes = [];
38
+ this.url = '';
39
+ this.processedUrl = '';
40
+ this.selectedMode = ImageModeName.Rectangle;
41
+ this.selectedLinkType = LinkType.url;
42
+ this.selectedTarget = TargetTypeName.new;
43
+ this.selectedProtocol = ProtocolTypeName.http;
44
+ this.selectedZoom = 1.0;
45
+ this.protocolRegex = /^(http|https|ftp|news):\/\/(?=.)/i;
46
+ this.javascriptLinkRegex = /javascript\:/i;
47
+ this.documentId = 0;
48
+ //anchorTitle = '';
49
+ this.anchorText = '';
50
+ //anchorByName = '';
51
+ this.advisoryTitle = '';
52
+ this.isUrlProcessing = false;
53
+ this.naturalImageWidth = 0;
54
+ this.naturalImageHeight = 0;
55
+ this.currentAreaId = -1;
56
+ this.showImageMapInformation = false;
57
+ this.anchorDocuments = [];
58
+ //documentAnchors: IAnchor[];
59
+ this.imageListeners = [];
60
+ this.imageMapData = data;
61
+ this.naturalImageHeight = this.imageMapData.imageHeight;
62
+ this.naturalImageWidth = this.imageMapData.imageWidth;
63
+ this.initFormControl();
64
+ this.initSvgIcons(iconRegistry, sanitizer);
65
+ }
66
+ initDefaultValues() {
67
+ this.selectedLinkType = LinkType.url;
68
+ this.selectedTarget = TargetTypeName.new;
69
+ this.selectedProtocol = ProtocolTypeName.http;
70
+ this.url = '';
71
+ this.processedUrl = '';
72
+ this.advisoryTitle = '';
73
+ this.anchorText = '';
74
+ }
75
+ initSvgIcons(iconRegistry, sanitizer) {
76
+ iconRegistry.addSvgIconLiteral('vector-pointer', sanitizer.bypassSecurityTrustHtml(IconSvg.VECTOR_POINTER));
77
+ iconRegistry.addSvgIconLiteral('vector-circle', sanitizer.bypassSecurityTrustHtml(IconSvg.VECTOR_CIRCLE));
78
+ iconRegistry.addSvgIconLiteral('vector-rectangle', sanitizer.bypassSecurityTrustHtml(IconSvg.VECTOR_RECTANGLE));
79
+ iconRegistry.addSvgIconLiteral('vector-polygon', sanitizer.bypassSecurityTrustHtml(IconSvg.VECTOR_POLYGON));
80
+ iconRegistry.addSvgIconLiteral('vector-remove', sanitizer.bypassSecurityTrustHtml(IconSvg.VECTOR_REMOVE));
81
+ }
82
+ initFormControl() {
83
+ const valiationControls = {
84
+ targetList: new FormControl(),
85
+ protocolList: new FormControl(),
86
+ anchorTextList: new FormControl(),
87
+ modeList: new FormControl(),
88
+ zoomList: new FormControl(),
89
+ linkTypeList: new FormControl()
90
+ };
91
+ if (this.imageMapData.linkJavaScriptLinksAllowed == true) {
92
+ valiationControls['url'] = new FormControl('', [Validators.required]);
93
+ }
94
+ else {
95
+ valiationControls['url'] = new FormControl('', [Validators.required, invalidURLValidator(this.javascriptLinkRegex)]);
96
+ }
97
+ this.imageMapFormGroup = new FormGroup(valiationControls);
98
+ }
99
+ initLinkType() {
100
+ if (this.linkTypes) {
101
+ this.linkTypes.push({ id: LinkType.url, name: this.LANG.QMSCKEDITOR.LINK_URL });
102
+ this.linkTypes.push({
103
+ id: LinkType.anchorText,
104
+ name: this.LANG.QMSCKEDITOR.LINK_ANCHOR_IN_TEXT
105
+ });
106
+ }
107
+ }
108
+ initTarget() {
109
+ if (this.targets) {
110
+ this.targets.push({ id: TargetTypeName.new, name: this.LANG.QMSCKEDITOR.TARTGET_NEW });
111
+ this.targets.push({ id: TargetTypeName.same, name: this.LANG.QMSCKEDITOR.TARGET_SAME });
112
+ }
113
+ }
114
+ initProtocol() {
115
+ if (this.protocols) {
116
+ this.protocols.push({ id: ProtocolTypeName.http, name: this.LANG.QMSCKEDITOR.PROTOCOL_HTTP });
117
+ this.protocols.push({ id: ProtocolTypeName.https, name: this.LANG.QMSCKEDITOR.PROTOCOL_HTTPS });
118
+ this.protocols.push({ id: ProtocolTypeName.ftp, name: this.LANG.QMSCKEDITOR.PROTOCOL_FTP });
119
+ this.protocols.push({ id: ProtocolTypeName.news, name: this.LANG.QMSCKEDITOR.PROTOCOL_NEW });
120
+ this.protocols.push({ id: ProtocolTypeName.other, name: this.LANG.QMSCKEDITOR.PROTOCOL_OTHER });
121
+ }
122
+ }
123
+ initModes() {
124
+ if (this.modes) {
125
+ this.modes.push({ id: ImageModeName.Pointer, name: this.LANG.QMSCKEDITOR.IMAGE_MODE_POINTER, icon: "vector-pointer" });
126
+ this.modes.push({ id: ImageModeName.Rectangle, name: this.LANG.QMSCKEDITOR.IMAGE_MODE_RECTANGLE, icon: "vector-rectangle" });
127
+ this.modes.push({ id: ImageModeName.Circle, name: this.LANG.QMSCKEDITOR.IMAGE_MODE_CIRCLE, icon: "vector-circle" });
128
+ this.modes.push({ id: ImageModeName.Polygon, name: this.LANG.QMSCKEDITOR.IMAGE_MODE_POLYGON, icon: "vector-polygon" });
129
+ this.modes.push({ id: ImageModeName.Remove, name: this.LANG.QMSCKEDITOR.IMAGE_MODE_REMOVE, icon: "vector-remove" });
130
+ }
131
+ }
132
+ initZoomTypes() {
133
+ if (this.zoomTypes) {
134
+ this.zoomTypes.push({ id: 0.25, name: "25%" });
135
+ this.zoomTypes.push({ id: 0.5, name: "50%" });
136
+ this.zoomTypes.push({ id: 1.0, name: "100%" });
137
+ this.zoomTypes.push({ id: 2.0, name: "200%" });
138
+ this.zoomTypes.push({ id: 3.0, name: "300%" });
139
+ }
140
+ }
141
+ initAnchor() {
142
+ this.anchors = [];
143
+ this.anchors = [{ value: 0, viewValue: '', anchorValue: LinkAnchor.Blank }];
144
+ }
145
+ ngOnInit() {
146
+ this.translate.getLanguageSubject$.pipe(takeUntil(this.ngUnsubcribe)).subscribe((res) => {
147
+ if (res) {
148
+ this.LANG = this.translate.getObjectLang(res);
149
+ }
150
+ });
151
+ this.initLinkType();
152
+ this.initTarget();
153
+ this.initProtocol();
154
+ this.initModes();
155
+ this.initZoomTypes();
156
+ }
157
+ ngOnDestroy() {
158
+ super.ngOnDestroy();
159
+ if (this.imageListeners && this.imageListeners.length > 0) {
160
+ this.imageListeners.forEach(listener => {
161
+ listener();
162
+ });
163
+ }
164
+ }
165
+ onImageLoad() {
166
+ this.naturalImageHeight = this.naturalImageHeight != 0 ? this.naturalImageHeight : this.myImageRef.nativeElement.naturalHeight;
167
+ this.naturalImageWidth = this.naturalImageWidth != 0 ? this.naturalImageWidth : this.myImageRef.nativeElement.naturalWidth;
168
+ this.setImageSize();
169
+ this.myImageMap.setMapJson({
170
+ name: this.imageMapData.name,
171
+ areas: this.imageMapData.areas
172
+ });
173
+ if (this.imageMapData.areas && this.imageMapData.areas.length > 0) {
174
+ this.myImageMap.blurArea(this.myImageMap.currentid);
175
+ this.myImageMap.currentid = 0;
176
+ this.myImageMap.selectedId = 0;
177
+ this.onSelectArea(this.myImageMap.areas[0]);
178
+ this.myImageMap.highlightArea(0);
179
+ }
180
+ }
181
+ ngAfterViewInit() {
182
+ if (this.myImageRef) {
183
+ this.imageListeners.push(this.renderer.listen(this.myImageRef.nativeElement, 'load', () => {
184
+ this.onImageLoad();
185
+ }));
186
+ }
187
+ // Avoid drag&drop of the image
188
+ this.myImageMap = new QMSCKEditorImageMapLib({
189
+ custom_callbacks: {
190
+ "onAddArea": this.onAddArea.bind(this),
191
+ 'onSelectArea': this.onSelectArea.bind(this),
192
+ 'onRemoveArea': this.onRemoveArea.bind(this),
193
+ 'onStatusMessage': this.onStatusMessage.bind(this)
194
+ },
195
+ imageElement: this.myImageRef.nativeElement,
196
+ bounding_box: false,
197
+ CL_DRAW_SHAPE: '#F00',
198
+ CL_NORM_SHAPE: '#AAA',
199
+ CL_HIGHLIGHT_SHAPE: '#F00',
200
+ strings: {
201
+ "POLYGON_DRAW": this.LANG.QMSCKEDITOR.POLYGON_DRAW,
202
+ "RECTANGLE_DRAW": this.LANG.QMSCKEDITOR.RECTANGLE_DRAW,
203
+ "SQUARE_DRAW": this.LANG.QMSCKEDITOR.SQUARE_DRAW,
204
+ 'READY': '',
205
+ 'RECTANGLE_MOVE': '',
206
+ 'RECTANGLE_RESIZE_TOP': '',
207
+ 'RECTANGLE_RESIZE_RIGHT': '',
208
+ 'RECTANGLE_RESIZE_BOTTOM': '',
209
+ 'RECTANGLE_RESIZE_LEFT': '',
210
+ 'SQUARE_MOVE': '',
211
+ 'SQUARE_RESIZE_TOP': '',
212
+ 'SQUARE_RESIZE_RIGHT': '',
213
+ 'SQUARE_RESIZE_BOTTOM': '',
214
+ 'SQUARE_RESIZE_LEFT': '',
215
+ 'POLYGON_MOVE': ''
216
+ }
217
+ });
218
+ }
219
+ parseLinkUrl(url, defaultProtocolName) {
220
+ const protocol = this.protocolRegex.exec(url);
221
+ if (protocol) {
222
+ this.processedUrl = url.substr(protocol[0].length);
223
+ this.url = this.processedUrl;
224
+ this.selectedProtocol = protocol[0].toLowerCase();
225
+ }
226
+ else if (this.javascriptLinkRegex.test(url) && !this.imageMapData.linkJavaScriptLinksAllowed) {
227
+ this.selectedProtocol = ProtocolTypeName.http;
228
+ this.processedUrl = '';
229
+ this.url = this.processedUrl;
230
+ }
231
+ else {
232
+ this.processedUrl = url;
233
+ this.url = this.processedUrl;
234
+ if (!!this.selectedProtocol) {
235
+ this.selectedProtocol = defaultProtocolName || ProtocolTypeName.http;
236
+ }
237
+ }
238
+ }
239
+ onSelectArea(area) {
240
+ this.currentAreaId = area.aid;
241
+ this.showImageMapInformation = true;
242
+ if (this.selectedMode == ImageModeName.Remove) {
243
+ this.myImageMap.removeArea(this.currentAreaId);
244
+ }
245
+ else {
246
+ if (area.ahref.match(/^#(.*)$/)) {
247
+ this.anchorText = area.ahref.slice(1);
248
+ this.selectedLinkType = LinkType.anchorText;
249
+ }
250
+ else {
251
+ this.selectedLinkType = LinkType.url;
252
+ this.parseLinkUrl(area.ahref);
253
+ }
254
+ this.selectedTarget = area.atarget;
255
+ this.advisoryTitle = area.aalt;
256
+ this.cdr.detectChanges();
257
+ }
258
+ }
259
+ onRemoveArea() {
260
+ this.currentAreaId = -1;
261
+ this.showImageMapInformation = false;
262
+ }
263
+ removeMap() {
264
+ this.currentAreaId = -1;
265
+ this.showImageMapInformation = false;
266
+ this.myImageMap.removeAllAreas();
267
+ }
268
+ onStatusMessage(text) {
269
+ if (this.myStatusRef) {
270
+ this.myStatusRef.nativeElement.innerHTML = text || '';
271
+ }
272
+ }
273
+ onUrlKeyup() {
274
+ this.isUrlProcessing = true;
275
+ if (this.url != this.processedUrl) {
276
+ this.parseLinkUrl(this.url);
277
+ this.updateAreaValues();
278
+ }
279
+ this.isUrlProcessing = false;
280
+ }
281
+ onUrlChange() {
282
+ if (!this.isUrlProcessing) {
283
+ this.onUrlKeyup();
284
+ }
285
+ }
286
+ onAnchorTextChange() {
287
+ this.updateAreaValues();
288
+ }
289
+ onProtocolChange() {
290
+ this.updateAreaValues();
291
+ }
292
+ onTargetChange() {
293
+ this.updateAreaValues();
294
+ }
295
+ onAddArea(id) {
296
+ this.currentAreaId = id;
297
+ this.showImageMapInformation = true;
298
+ this.initDefaultValues();
299
+ this.updateAreaValues();
300
+ }
301
+ updateAreaValues() {
302
+ if (this.currentAreaId > -1) {
303
+ var ahref = this.buildUrlWithProtocol();
304
+ if (this.selectedLinkType == LinkType.anchorText) {
305
+ this.myImageMap.areas[this.currentAreaId].atarget = TargetTypeName.same;
306
+ this.myImageMap.areas[this.currentAreaId].aalt = this.anchorText;
307
+ }
308
+ else {
309
+ this.myImageMap.areas[this.currentAreaId].atarget = this.selectedTarget || TargetTypeName.new;
310
+ this.myImageMap.areas[this.currentAreaId].aalt = this.advisoryTitle;
311
+ }
312
+ this.myImageMap.areas[this.currentAreaId].ahref = ahref;
313
+ }
314
+ }
315
+ buildUrlWithProtocol() {
316
+ if (this.selectedLinkType == LinkType.anchorText) {
317
+ return '#' + (this.anchorText || '');
318
+ }
319
+ if (!!this.processedUrl) {
320
+ return this.selectedProtocol + this.processedUrl;
321
+ }
322
+ return '';
323
+ }
324
+ ngAfterViewChecked() {
325
+ this.cdr.detectChanges();
326
+ }
327
+ onCloseDialog() {
328
+ this.dialogRef.close();
329
+ }
330
+ onModeChange(e) {
331
+ this.selectedMode = e.value;
332
+ if (this.selectedMode == ImageModeName.Pointer || this.selectedMode == ImageModeName.Remove) {
333
+ this.myImageMap.is_drawing = 0;
334
+ this.myImageMap.nextShape = '';
335
+ this.myImageRef.nativeElement.style.cursor = 'default';
336
+ }
337
+ else {
338
+ this.myImageMap.nextShape = this.selectedMode;
339
+ this.myImageRef.nativeElement.style.cursor = 'crosshair';
340
+ }
341
+ }
342
+ onZoomChange() {
343
+ this.setImageSize();
344
+ if (this.myImageMap) {
345
+ this.myImageMap.scaleAllAreas(this.selectedZoom);
346
+ }
347
+ }
348
+ onLinkTypeChange() {
349
+ if (this.selectedLinkType === LinkType.anchorText) {
350
+ this.getEditorAnchor();
351
+ }
352
+ this.updateAreaValues();
353
+ }
354
+ getEditorAnchor() {
355
+ this.anchorDocuments = [];
356
+ if (this.imageMapData.editorContent) {
357
+ this.anchorDocuments.push({
358
+ id: 0,
359
+ entityId: 0,
360
+ documentId: 0,
361
+ documentTypeId: 0,
362
+ richText: this.imageMapData.editorContent
363
+ });
364
+ }
365
+ this.setAnchorDocument(this.anchorDocuments);
366
+ this.editorAnchors = this.anchors;
367
+ }
368
+ setImageSize() {
369
+ if (this.myImageRef) {
370
+ const width = this.naturalImageWidth * this.selectedZoom;
371
+ const height = this.naturalImageHeight * this.selectedZoom;
372
+ this.myImageRef.nativeElement.setAttribute("width", `${width}px;`);
373
+ this.myImageRef.nativeElement.setAttribute("height", `${height}px;`);
374
+ this.myImageRef.nativeElement.style.width = `${width}px`;
375
+ this.myImageRef.nativeElement.style.height = `${height}px`;
376
+ this.myImageRef.nativeElement.style.cursor = this.selectedMode == ImageModeName.Pointer || this.selectedMode == ImageModeName.Remove ? 'default' : 'crosshair';
377
+ }
378
+ }
379
+ eHandbook(isOnlyDocument, isAnchorDocument) {
380
+ const data = new QMSCKEditorRelation();
381
+ data.isOnlyDocument = isOnlyDocument;
382
+ data.isEnableFolder = !isOnlyDocument;
383
+ const dialogTemplate = this.dialog.open(QMSCKEditorRelatedComponent, {
384
+ width: '650px',
385
+ height: '650px',
386
+ data,
387
+ disableClose: true
388
+ });
389
+ dialogTemplate
390
+ .afterClosed()
391
+ .pipe(takeUntil(this.ngUnsubcribe))
392
+ .subscribe((result) => {
393
+ if (result) {
394
+ if (isAnchorDocument) {
395
+ this.documentId = result.id;
396
+ //this.anchorTitle = `${result.title}(${result.id})`;
397
+ this.getAnchorDocument(result.id);
398
+ }
399
+ else {
400
+ this.parseLinkUrl(result.url);
401
+ this.selectedProtocol = ProtocolTypeName.other;
402
+ if (!this.advisoryTitle) {
403
+ this.advisoryTitle = result.title;
404
+ }
405
+ }
406
+ this.updateAreaValues();
407
+ }
408
+ });
409
+ }
410
+ getAnchorDocument(documentId) {
411
+ this.linkService
412
+ .getAnchorDocumentList(documentId)
413
+ .pipe(takeUntil(this.ngUnsubcribe))
414
+ .subscribe((res) => {
415
+ if (res) {
416
+ this.anchorDocuments = res;
417
+ this.setAnchorDocument(this.anchorDocuments);
418
+ //this.documentAnchors = this.anchors;
419
+ }
420
+ else {
421
+ this.anchorDocuments = [];
422
+ this.setAnchorDocument(this.anchorDocuments);
423
+ //this.documentAnchors = this.anchors;
424
+ }
425
+ });
426
+ }
427
+ setAnchorDocument(anchorDocument) {
428
+ this.initAnchor();
429
+ let id = 3;
430
+ if (anchorDocument) {
431
+ anchorDocument.forEach((e) => {
432
+ const div = document.createElement('div');
433
+ div.innerHTML = e.richText;
434
+ const domContent = div;
435
+ const aTags = domContent.getElementsByTagName('a');
436
+ if (aTags) {
437
+ // tslint:disable-next-line:prefer-for-of
438
+ for (let i = 0; i < aTags.length; i++) {
439
+ const tag = aTags[i];
440
+ if (tag.name) {
441
+ const index = this.anchors.findIndex((x) => {
442
+ return x.anchorValue === tag.name;
443
+ });
444
+ if (index < 0) {
445
+ this.anchors.push({
446
+ value: id,
447
+ viewValue: tag.name,
448
+ anchorValue: tag.name
449
+ });
450
+ id += 1;
451
+ }
452
+ }
453
+ }
454
+ }
455
+ });
456
+ }
457
+ // this.anchors.push({
458
+ // value: 1,
459
+ // viewValue: this.LANG.QMSCKEDITOR.ANCHOR_ATTACHMENT,
460
+ // anchorValue: LinkAnchor.Attachment
461
+ // });
462
+ // this.anchors.push({
463
+ // value: 2,
464
+ // viewValue: this.LANG.QMSCKEDITOR.ANCHOR_RELATED_DOCUMENT,
465
+ // anchorValue: LinkAnchor.Related
466
+ // });
467
+ }
468
+ attachment() {
469
+ const data = new QMSCKEditorParamter();
470
+ data.module = this.imageMapData.module;
471
+ data.entityId = this.imageMapData.entityId;
472
+ const dialogTemplate = this.dialog.open(LinkAttachmentComponent, {
473
+ width: '650px',
474
+ height: '650px',
475
+ data,
476
+ disableClose: true
477
+ });
478
+ dialogTemplate
479
+ .afterClosed()
480
+ .pipe(takeUntil(this.ngUnsubcribe))
481
+ .subscribe((result) => {
482
+ if (result) {
483
+ this.parseLinkUrl(result.url);
484
+ this.selectedProtocol = ProtocolTypeName.other;
485
+ if (!this.advisoryTitle) {
486
+ this.advisoryTitle = result.title;
487
+ }
488
+ this.updateAreaValues();
489
+ }
490
+ });
491
+ }
492
+ save() {
493
+ const data = this.myImageMap.getMapJson();
494
+ data.imageHeight = this.naturalImageHeight;
495
+ data.imageWidth = this.naturalImageWidth;
496
+ this.dialogRef.close(data);
497
+ }
498
+ cancel() {
499
+ this.dialogRef.close();
500
+ }
501
+ }
502
+ QMSCKEditorImageMapComponent.decorators = [
503
+ { type: Component, args: [{
504
+ selector: 'app-qmsck-imagemap',
505
+ template: "<div id=\"qmsckeditor-imagemap\" class=\"qmsckeditor qmsckeditor__imagemap__container\">\r\n <div id=\"qmsckeditor-imagemap-header\">\r\n <span id=\"qmsckeditor-imagemap-header_001\" mat-icon-button class=\"qmsckeditor button__close\"\r\n (click)=\"onCloseDialog()\">\r\n <mat-icon>close</mat-icon>\r\n </span>\r\n <div id=\"qmsckeditor-imagemap-header_002\" mat-dialog-content>\r\n <h2 id=\"qmsckeditor-imagemap_002_001\">\r\n {{ LANG.QMSCKEDITOR.IMAGE_MAP_PROPERTIES }}\r\n </h2>\r\n </div>\r\n </div>\r\n <div id=\"qmsckeditor-imagemap-content\">\r\n <div id=\"qmsckeditor-imagemap-content_001\" class=\"col-12 mt-1 pl-2 pr-2\">\r\n <mat-expansion-panel id=\"qmsckeditor-imagemap-panel\" [expanded]=\"true\" (opened)=\"(true)\" (closed)=\"(false)\">\r\n <div id=\"qmsckeditor-imagemap-panel_001\">\r\n <div id=\"qmsckeditor-imagemap-panel_001_001\" class=\"qmsckeditor__imagemap__information\">\r\n <form [formGroup]=\"imageMapFormGroup\">\r\n <div class=\"row\">\r\n <div class=\"col-9\">\r\n <mat-button-toggle-group [(ngModel)]=\"selectedMode\" formControlName=\"modeList\"\r\n (change)=\"onModeChange($event)\">\r\n <mat-button-toggle *ngFor=\"let mode of modes\" [value]=\"mode.id\"\r\n [matTooltip]=\"mode.name\">\r\n <mat-icon color=\"red\" [svgIcon]=\"mode.icon\" aria-hidden=\"true\">\r\n </mat-icon>\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n <span style=\"margin-left: 15px;\" #myStatus></span>\r\n </div>\r\n <div class=\"col-3\">\r\n <mat-form-field appearance=\"fill\" class=\"col-12 pl-3 pr-3 pb-1\">\r\n <mat-label>{{ LANG.QMSCKEDITOR.ZOOM }}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedZoom\" formControlName=\"zoomList\"\r\n (ngModelChange)=\"onZoomChange()\" disableOptionCentering>\r\n <mat-option *ngFor=\"let zoomType of zoomTypes\" [value]=\"zoomType.id\">\r\n {{ zoomType.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"row\" [ngClass]=\"{'hidden': !showImageMapInformation}\">\r\n <div class=\"col-3\">\r\n <mat-form-field appearance=\"fill\" class=\"col-12 pl-3 pr-3 pb-1\">\r\n <mat-label>{{ LANG.QMSCKEDITOR.LINK_TYPE }}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedLinkType\" formControlName=\"linkTypeList\"\r\n (ngModelChange)=\"onLinkTypeChange()\" disableOptionCentering>\r\n <mat-option *ngFor=\"let link of linkTypes\" [value]=\"link.id\">\r\n {{ link.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-3\" *ngIf=\"selectedLinkType === 0\">\r\n <mat-form-field appearance=\"fill\" class=\"col-12 pl-3 pr-3 pb-1\">\r\n <mat-label>{{ LANG.QMSCKEDITOR.TARGET }}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedTarget\" formControlName=\"targetList\"\r\n (ngModelChange)=\"onTargetChange()\" disableOptionCentering>\r\n <mat-option *ngFor=\"let target of targets\" [value]=\"target.id\">\r\n {{ target.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"row\" [ngClass]=\"{'hidden': !showImageMapInformation}\"\r\n *ngIf=\"selectedLinkType === 1\">\r\n <div class=\"col-3\">\r\n <mat-form-field appearance=\"fill\" class=\"col-12 pl-3 pr-\">\r\n <mat-label>{{ LANG.QMSCKEDITOR.ANCHOR_BY_NAME }}</mat-label>\r\n <mat-select [(ngModel)]=\"anchorText\" formControlName=\"anchorTextList\"\r\n (ngModelChange)=\"onAnchorTextChange()\">\r\n <mat-option *ngFor=\"let editorAnchor of editorAnchors\"\r\n [value]=\"editorAnchor.anchorValue\" disableOptionCentering>\r\n {{ editorAnchor.viewValue }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"row\" [ngClass]=\"{'hidden': !showImageMapInformation}\"\r\n *ngIf=\"selectedLinkType === 0\">\r\n <div class=\"col-3\">\r\n <mat-form-field appearance=\"fill\" class=\"col-12 pl-3 pr-3 pb-1\">\r\n <mat-label>{{ LANG.QMSCKEDITOR.PROTOCOL }}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedProtocol\" formControlName=\"protocolList\"\r\n (ngModelChange)=\"onProtocolChange()\" disableOptionCentering>\r\n <mat-option *ngFor=\"let protocol of protocols\" [value]=\"protocol.id\">\r\n {{ protocol.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-5\">\r\n <mat-form-field appearance=\"fill\" class=\"col-12 pl-3 pr-3 pb-1\">\r\n <mat-label>{{ LANG.QMSCKEDITOR.LINK_URL }}</mat-label>\r\n <input matInput [(ngModel)]=\"url\" name=\"url\" formControlName=\"url\"\r\n (ngModelChange)=\"onUrlChange()\" (keyup)=\"onUrlKeyup()\" />\r\n <mat-error *ngIf=\"imageMapFormGroup.get('url').hasError('required')\">{{\r\n LANG.QMSCKEDITOR.REQUIRED_URL }}\r\n </mat-error>\r\n <mat-error *ngIf=\"imageMapFormGroup.get('url').hasError('invalidURL')\">{{\r\n LANG.QMSCKEDITOR.INVALID_URL }}</mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-4\">\r\n <div class=\"row button__groups\">\r\n <div class=\"col-6\">\r\n <button class=\"save\" mat-stroked-button (click)=\"attachment()\">\r\n {{ LANG.QMSCKEDITOR.ATTACHMENT }}\r\n </button>\r\n </div>\r\n <div class=\"col-6\">\r\n <button class=\"save\" mat-stroked-button (click)=\"eHandbook(false, false)\">\r\n {{ LANG.QMSCKEDITOR.HANDBOOK }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div id=\"qmsckeditor-imagemap-panel_001_002\" class=\"qmsckeditor__imagemap__map\">\r\n <img #myImage [src]=\"imageMapData.imageUrl\">\r\n </div>\r\n <div id=\"qmsckeditor-imagemap-panel_001_003\" class=\"qmsckeditor button__groups row mr-0 ml-0 mt-4\">\r\n <div class=\"col-4 pr-0\">\r\n <button class=\"save\" mat-flat-button (click)=\"removeMap()\">\r\n {{ LANG.QMSCKEDITOR.REMOVE_MAP }}\r\n </button>\r\n </div>\r\n <div class=\"col-4 pr-0\">\r\n <button class=\"save\" mat-flat-button (click)=\"save()\">\r\n {{ LANG.QMSCKEDITOR.SAVE }}\r\n </button>\r\n </div>\r\n <div class=\"col-4 pl-0\">\r\n <button class=\"cancel\" mat-flat-button (click)=\"cancel()\">\r\n {{ LANG.QMSCKEDITOR.CANCEL }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n</div>",
506
+ styles: [".mt5{margin-top:5px!important}.mt10{margin-top:10px!important}.mt7{margin-top:7px!important}.mt15{margin-top:15px!important}.mt20{margin-top:20px!important}.mt30{margin-top:30px!important}.mt40{margin-top:40px!important}.ml2{margin-left:2px!important}.ml3{margin-left:3px!important}.ml5{margin-left:5px!important}.ml15{margin-left:15px!important}.ml10{margin-left:10px!important}.ml12{margin-left:12px!important}.ml16{margin-left:16px!important}.ml-auto{margin-left:auto!important}.ml-25{margin-left:-25px!important}.mr5{margin-right:5px!important}.mr12{margin-right:12px!important}.mr15{margin-right:15px!important}.mb5{margin-bottom:5px!important}.mb10{margin-bottom:10px!important}.mb15{margin-bottom:15px!important}.pt8{padding-top:8px!important}.pt10{padding-top:10px!important}.pt15{padding-top:15px!important}.pt16{padding-top:16px!important}.pl15{padding-left:15px!important}.pl0{padding-left:0!important}.pr0{padding-right:0!important}.pr15{padding-right:15px!important}.fs12{font-size:12px}.fs14{font-size:14px!important}.fs16{font-size:16px!important}.fs22{font-size:22px!important}.fw500{font-weight:500!important}.italic-text{font-style:italic}.display-flex{display:flex}.qmsckeditor{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:400}.qmsckeditor h2{font-size:20px;font-weight:400}.qmsckeditor .mat-dialog-content{padding:0}.qmsckeditor .mat-icon{color:#909497}.qmsckeditor__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;background:#fff;overflow-y:auto;max-height:100vh;overflow-x:hidden}.qmsckeditor__cursor{cursor:pointer}.qmsckeditor__notallowed{cursor:not-allowed}.qmsckeditor.button__close,.qmsckeditor.button__done{float:right;top:-24px;right:-24px;cursor:pointer}.qmsckeditor.button__done{margin-right:20px}.qmsckeditor.button__done .mat-icon{color:#28a745;font-weight:700}.qmsckeditor.button__groups button{min-height:40px;width:100%;border-radius:4px;border:1px solid #c5c5c5;font-family:Open Sans;font-weight:600;font-size:14px;letter-spacing:1px;line-height:16px}.qmsckeditor.button__groups .save{background:#f8f9f9}.qmsckeditor.button__groups .save:hover{background:#e5e7e9}.qmsckeditor.button__groups .save:disabled{cursor:not-allowed}.qmsckeditor.button__groups .cancel{background:#f8f9f9}.qmsckeditor.button__groups .cancel:hover{background:#e5e7e9}.qmsckeditor.button__groups .cancel:disabled{cursor:not-allowed}.qmsckeditor.button__groups .delete{background:#f8f9f9}.qmsckeditor.button__groups .delete:hover{background:#e5e7e9}.qmsckeditor.button__groups .delete:disabled{cursor:not-allowed}.qmsckeditor.confirm__button__groups button{min-height:36px;border-radius:4px;width:auto;border:1px solid #c5c5c5;font-family:Open Sans;font-weight:600;font-size:14px;letter-spacing:1px;line-height:16px;padding-left:15px;padding-right:15px}.qmsckeditor.confirm__button__groups .confirm{background:#f8f9f9}.qmsckeditor.confirm__button__groups .confirm:hover{background:#e5e7e9}.qmsckeditor.confirm__button__groups .cancel{background:#f8f9f9}.qmsckeditor.confirm__button__groups .cancel:hover{background:#e5e7e9}.qmsckeditor.template-content.height{min-height:420px;max-height:520px;overflow:auto}.qmsckeditor.template-content.title{margin-left:-9px}.qmsckeditor.link__content.height{min-height:400px;max-height:520px}.qmsckeditor.card{margin-bottom:10px;min-height:60px;box-shadow:none;border:1px solid #e5e5e5}.qmsckeditor.card .title{font-weight:700}.qmsckeditor.card .content{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.qmsckeditor.card .material-icons{font-size:20px}.qmsckeditor.tooltip-content.height{min-height:400px;max-height:470px;overflow:auto}.qmsckeditor.save__as__template.height{height:125px}.ck-content .page-break,.qmsckeditor__imagemap__container .mat-form-field{width:100%}.qmsckeditor__imagemap__container .qmsckeditor__imagemap__information{position:relative}.qmsckeditor__imagemap__container .qmsckeditor__imagemap__map{overflow:auto;width:800px;min-height:371px;position:relative;max-height:460px}.qmsckeditor__imagemap__container .mat-button-toggle-checked{border:1px solid #000!important}.qmsckeditor__imagemap__container .hidden{visibility:hidden}"]
507
+ },] }
508
+ ];
509
+ QMSCKEditorImageMapComponent.ctorParameters = () => [
510
+ { type: Renderer2 },
511
+ { type: ChangeDetectorRef },
512
+ { type: MatDialog },
513
+ { type: TranslateLibraryService },
514
+ { type: QMSCKEditorLinkService },
515
+ { type: MatDialogRef },
516
+ { type: QMSCKEditorImageMap, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] },
517
+ { type: MatIconRegistry },
518
+ { type: DomSanitizer }
519
+ ];
520
+ QMSCKEditorImageMapComponent.propDecorators = {
521
+ myImageRef: [{ type: ViewChild, args: ['myImage',] }],
522
+ myStatusRef: [{ type: ViewChild, args: ['myStatus',] }]
523
+ };
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicW1zLWNrZWRpdG9yLWltYWdlbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Ftcy1hbmd1bGFyL3NyYy9saWIvcW1zLWNrZWRpdG9yLWNvbXBvbmVudHMvY29tcG9uZW50cy9xbXMtY2tlZGl0b3ItaW1hZ2VtYXAvcW1zLWNrZWRpdG9yLWltYWdlbWFwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFz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Q0FBQyxrQkFBa0IsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7O1lBL2hCSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsczZVQUFxRDs7YUFFeEQ7OztZQTVEK0YsU0FBUztZQUE5RSxpQkFBaUI7WUFDbkMsU0FBUztZQUVULHVCQUF1QjtZQWF2QixzQkFBc0I7WUFmWCxZQUFZO1lBSXZCLG1CQUFtQix1QkE2R25CLE1BQU0sU0FBQyxlQUFlO1lBdkd0QixlQUFlO1lBRGYsWUFBWTs7O3lCQTJGaEIsU0FBUyxTQUFDLFNBQVM7MEJBR25CLFNBQVMsU0FBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZUxpYnJhcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJhbnNsYXRpb24tcmVnaXN0cnkuc2VydmljZSc7XHJcbmltcG9ydCB7IFFNU0NLRWRpdG9yQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3Ftcy1ja2VkaXRvci1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFFNU0NLRWRpdG9ySW1hZ2VNYXAgfSBmcm9tICcuLi8uLi9tb2RlbHMvcW1zLWNrZWRpdG9yLWltYWdlbWFwLm1vZGVsJztcclxuaW1wb3J0IHsgTGlua1R5cGUgfSBmcm9tICcuLi8uLi9jb21tb24vZW51bXMvbGluay10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBQcm90b2NvbFR5cGVOYW1lIH0gZnJvbSAnLi4vLi4vY29tbW9uL2VudW1zL3Byb3RvY29sLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IFRhcmdldFR5cGVOYW1lIH0gZnJvbSAnLi4vLi4vY29tbW9uL2VudW1zL3RhcmdldC10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBJbWFnZU1vZGVOYW1lIH0gZnJvbSAnLi4vLi4vY29tbW9uL2VudW1zL2ltYWdlLW1vZGUuZW51bSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBNYXRJY29uUmVnaXN0cnkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgSWNvblN2ZyB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb25zdGFudHMvaWNvblN2Zy5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBRTVNDS0VkaXRvckltYWdlTWFwTGliIH0gZnJvbSAnLi9xbXMtY2tlZGl0b3ItaW1hZ2VtYXAubGliJztcclxuaW1wb3J0IHsgUU1TQ0tFZGl0b3JSZWxhdGlvbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvcW1zLWNrZWRpdG9yLXJlbGF0aW9uLm1vZGVsJztcclxuaW1wb3J0IFFNU0NLRWRpdG9yUGFyYW10ZXIgZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9xbXMtY2tlZGl0b3ItcGFyYW1ldGVyLm1vZGVsJztcclxuaW1wb3J0IHsgUU1TQ0tFZGl0b3JMaW5rU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Ftcy1ja2VkaXRvci1saW5rLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBRTVNDS0VkaXRvclJlbGF0ZWRDb21wb25lbnQgfSBmcm9tICcuLi9xbXMtY2tlZGl0b3ItcmVsYXRpb24vcW1zY2tlZGl0b3ItcmVsYXRlZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMaW5rQXR0YWNobWVudENvbXBvbmVudCB9IGZyb20gJy4uL3Ftcy1ja2VkaXRvci1saW5rL2F0dGFjaG1lbnRzL2xpbmstYXR0YWNobWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBRTVNDS0VkaXRvckxpbmtBbmNob3JEb2N1bWVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvcW1zLWNrZWRpdG9yLWxpbmstYW5jaG9yLWRvY3VtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTGlua0FuY2hvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lbnVtcy9saW5rLWFuY2hvci5lbnVtJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgaW52YWxpZFVSTFZhbGlkYXRvciB9IGZyb20gJy4vcW1zLWNrZWRpdG9yLWltYWdlbWFwLnZhbGlkYXRvcic7XHJcblxyXG5pbnRlcmZhY2UgSUxpbmtUeXBlIHtcclxuICAgIGlkOiBudW1iZXI7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJVGFyZ2V0IHtcclxuICAgIGlkOiBUYXJnZXRUeXBlTmFtZTtcclxuICAgIG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElQcm90b2NvbCB7XHJcbiAgICBpZDogUHJvdG9jb2xUeXBlTmFtZTtcclxuICAgIG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElNb2RlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBpY29uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJWm9vbVR5cGUge1xyXG4gICAgaWQ6IG51bWJlcjtcclxuICAgIG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElBbmNob3Ige1xyXG4gICAgdmFsdWU6IG51bWJlcjtcclxuICAgIHZpZXdWYWx1ZTogc3RyaW5nO1xyXG4gICAgYW5jaG9yVmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1xbXNjay1pbWFnZW1hcCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcW1zLWNrZWRpdG9yLWltYWdlbWFwLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3Ftcy1ja2VkaXRvci1pbWFnZW1hcC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBRTVNDS0VkaXRvckltYWdlTWFwQ29tcG9uZW50IGV4dGVuZHMgUU1TQ0tFZGl0b3JCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIHtcclxuICAgIExBTkc6IGFueTtcclxuICAgIGltYWdlTWFwRm9ybUdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgICBpbWFnZU1hcERhdGE6IFFNU0NLRWRpdG9ySW1hZ2VNYXA7XHJcbiAgICBsaW5rVHlwZXM6IElMaW5rVHlwZVtdID0gW107XHJcbiAgICB0YXJnZXRzOiBJVGFyZ2V0W10gPSBbXTtcclxuICAgIHByb3RvY29sczogSVByb3RvY29sW10gPSBbXTtcclxuICAgIG1vZGVzOiBJTW9kZVtdID0gW107XHJcbiAgICB6b29tVHlwZXM6IElab29tVHlwZVtdID0gW107XHJcbiAgICB1cmwgPSAnJztcclxuICAgIHByb2Nlc3NlZFVybCA9ICcnO1xyXG4gICAgc2VsZWN0ZWRNb2RlOiBJbWFnZU1vZGVOYW1lID0gSW1hZ2VNb2RlTmFtZS5SZWN0YW5nbGU7XHJcbiAgICBzZWxlY3RlZExpbmtUeXBlOiBMaW5rVHlwZSA9IExpbmtUeXBlLnVybDtcclxuICAgIHNlbGVjdGVkVGFyZ2V0OiBUYXJnZXRUeXBlTmFtZSA9IFRhcmdldFR5cGVOYW1lLm5ldztcclxuICAgIHNlbGVjdGVkUHJvdG9jb2w6IFByb3RvY29sVHlwZU5hbWUgfCBzdHJpbmcgPSBQcm90b2NvbFR5cGVOYW1lLmh0dHA7XHJcbiAgICBzZWxlY3RlZFpvb20gPSAxLjA7XHJcblxyXG4gICAgcHJvdG9jb2xSZWdleDogUmVnRXhwID0gL14oaHR0cHxodHRwc3xmdHB8bmV3cyk6XFwvXFwvKD89LikvaTtcclxuICAgIGphdmFzY3JpcHRMaW5rUmVnZXg6IFJlZ0V4cCA9IC9qYXZhc2NyaXB0XFw6L2k7XHJcblxyXG4gICAgZG9jdW1lbnRJZCA9IDA7XHJcbiAgICAvL2FuY2hvclRpdGxlID0gJyc7XHJcbiAgICBhbmNob3JUZXh0ID0gJyc7XHJcbiAgICAvL2FuY2hvckJ5TmFtZSA9ICcnO1xyXG4gICAgYWR2aXNvcnlUaXRsZSA9ICcnO1xyXG5cclxuICAgIGlzVXJsUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgbmF0dXJhbEltYWdlV2lkdGggPSAwO1xyXG4gICAgbmF0dXJhbEltYWdlSGVpZ2h0ID0gMDtcclxuICAgIGN1cnJlbnRBcmVhSWQgPSAtMTtcclxuICAgIG15SW1hZ2VNYXA6IFFNU0NLRWRpdG9ySW1hZ2VNYXBMaWI7XHJcbiAgICBzaG93SW1hZ2VNYXBJbmZvcm1hdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGFuY2hvckRvY3VtZW50czogUU1TQ0tFZGl0b3JMaW5rQW5jaG9yRG9jdW1lbnRbXSA9IFtdO1xyXG4gICAgYW5jaG9yczogSUFuY2hvcltdO1xyXG4gICAgZWRpdG9yQW5jaG9yczogSUFuY2hvcltdO1xyXG4gICAgLy9kb2N1bWVudEFuY2hvcnM6IElBbmNob3JbXTtcclxuXHJcbiAgICBpbWFnZUxpc3RlbmVyczogYW55W10gPSBbXTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdteUltYWdlJylcclxuICAgIG15SW1hZ2VSZWY6IEVsZW1lbnRSZWY8SFRNTEltYWdlRWxlbWVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnbXlTdGF0dXMnKVxyXG4gICAgbXlTdGF0dXNSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlTGlicmFyeVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsaW5rU2VydmljZTogUU1TQ0tFZGl0b3JMaW5rU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8UU1TQ0tFZGl0b3JJbWFnZU1hcENvbXBvbmVudD4sXHJcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBRTVNDS0VkaXRvckltYWdlTWFwLFxyXG4gICAgICAgIGljb25SZWdpc3RyeTogTWF0SWNvblJlZ2lzdHJ5LFxyXG4gICAgICAgIHNhbml0aXplcjogRG9tU2FuaXRpemVyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VNYXBEYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm5hdHVyYWxJbWFnZUhlaWdodCA9IHRoaXMuaW1hZ2VNYXBEYXRhLmltYWdlSGVpZ2h0O1xyXG4gICAgICAgIHRoaXMubmF0dXJhbEltYWdlV2lkdGggPSB0aGlzLmltYWdlTWFwRGF0YS5pbWFnZVdpZHRoO1xyXG4gICAgICAgIHRoaXMuaW5pdEZvcm1Db250cm9sKCk7XHJcbiAgICAgICAgdGhpcy5pbml0U3ZnSWNvbnMoaWNvblJlZ2lzdHJ5LCBzYW5pdGl6ZXIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpbml0RGVmYXVsdFZhbHVlcygpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGlua1R5cGUgPSBMaW5rVHlwZS51cmw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldCA9IFRhcmdldFR5cGVOYW1lLm5ldztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJvdG9jb2wgPSBQcm90b2NvbFR5cGVOYW1lLmh0dHA7XHJcbiAgICAgICAgdGhpcy51cmwgPSAnJztcclxuICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9ICcnO1xyXG4gICAgICAgIHRoaXMuYWR2aXNvcnlUaXRsZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuYW5jaG9yVGV4dCA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRTdmdJY29ucyhpY29uUmVnaXN0cnk6IE1hdEljb25SZWdpc3RyeSwgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcclxuICAgICAgICBpY29uUmVnaXN0cnkuYWRkU3ZnSWNvbkxpdGVyYWwoJ3ZlY3Rvci1wb2ludGVyJywgc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKEljb25TdmcuVkVDVE9SX1BPSU5URVIpKTtcclxuICAgICAgICBpY29uUmVnaXN0cnkuYWRkU3ZnSWNvbkxpdGVyYWwoJ3ZlY3Rvci1jaXJjbGUnLCBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoSWNvblN2Zy5WRUNUT1JfQ0lSQ0xFKSk7XHJcbiAgICAgICAgaWNvblJlZ2lzdHJ5LmFkZFN2Z0ljb25MaXRlcmFsKCd2ZWN0b3ItcmVjdGFuZ2xlJywgc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKEljb25TdmcuVkVDVE9SX1JFQ1RBTkdMRSkpO1xyXG4gICAgICAgIGljb25SZWdpc3RyeS5hZGRTdmdJY29uTGl0ZXJhbCgndmVjdG9yLXBvbHlnb24nLCBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoSWNvblN2Zy5WRUNUT1JfUE9MWUdPTikpO1xyXG4gICAgICAgIGljb25SZWdpc3RyeS5hZGRTdmdJY29uTGl0ZXJhbCgndmVjdG9yLXJlbW92ZScsIHNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChJY29uU3ZnLlZFQ1RPUl9SRU1PVkUpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Rm9ybUNvbnRyb2woKSB7XHJcbiAgICAgICAgY29uc3QgdmFsaWF0aW9uQ29udHJvbHMgPSB7XHJcbiAgICAgICAgICAgIHRhcmdldExpc3Q6IG5ldyBGb3JtQ29udHJvbCgpLFxyXG4gICAgICAgICAgICBwcm90b2NvbExpc3Q6IG5ldyBGb3JtQ29udHJvbCgpLFxyXG4gICAgICAgICAgICBhbmNob3JUZXh0TGlzdDogbmV3IEZvcm1Db250cm9sKCksXHJcbiAgICAgICAgICAgIG1vZGVMaXN0OiBuZXcgRm9ybUNvbnRyb2woKSxcclxuICAgICAgICAgICAgem9vbUxpc3Q6IG5ldyBGb3JtQ29udHJvbCgpLFxyXG4gICAgICAgICAgICBsaW5rVHlwZUxpc3Q6IG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5pbWFnZU1hcERhdGEubGlua0phdmFTY3JpcHRMaW5rc0FsbG93ZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB2YWxpYXRpb25Db250cm9sc1sndXJsJ10gPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFsaWF0aW9uQ29udHJvbHNbJ3VybCddID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgaW52YWxpZFVSTFZhbGlkYXRvcih0aGlzLmphdmFzY3JpcHRMaW5rUmVnZXgpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW1hZ2VNYXBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHZhbGlhdGlvbkNvbnRyb2xzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0TGlua1R5cGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlua1R5cGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlua1R5cGVzLnB1c2goeyBpZDogTGlua1R5cGUudXJsLCBuYW1lOiB0aGlzLkxBTkcuUU1TQ0tFRElUT1IuTElOS19VUkwgfSk7XHJcbiAgICAgICAgICAgIHRoaXMubGlua1R5cGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaWQ6IExpbmtUeXBlLmFuY2hvclRleHQsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLkxBTkcuUU1TQ0tFRElUT1IuTElOS19BTkNIT1JfSU5fVEVYVFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFRhcmdldCgpIHtcclxuICAgICAgICBpZiAodGhpcy50YXJnZXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0cy5wdXNoKHsgaWQ6IFRhcmdldFR5cGVOYW1lLm5ldywgbmFtZTogdGhpcy5MQU5HLlFNU0NLRURJVE9SLlRBUlRHRVRfTkVXIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldHMucHVzaCh7IGlkOiBUYXJnZXRUeXBlTmFtZS5zYW1lLCBuYW1lOiB0aGlzLkxBTkcuUU1TQ0tFRElUT1IuVEFSR0VUX1NBTUUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRQcm90b2NvbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm90b2NvbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm90b2NvbHMucHVzaCh7IGlkOiBQcm90b2NvbFR5cGVOYW1lLmh0dHAsIG5hbWU6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5QUk9UT0NPTF9IVFRQIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnByb3RvY29scy5wdXNoKHsgaWQ6IFByb3RvY29sVHlwZU5hbWUuaHR0cHMsIG5hbWU6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5QUk9UT0NPTF9IVFRQUyB9KTtcclxuICAgICAgICAgICAgdGhpcy5wcm90b2NvbHMucHVzaCh7IGlkOiBQcm90b2NvbFR5cGVOYW1lLmZ0cCwgbmFtZTogdGhpcy5MQU5HLlFNU0NLRURJVE9SLlBST1RPQ09MX0ZUUCB9KTtcclxuICAgICAgICAgICAgdGhpcy5wcm90b2NvbHMucHVzaCh7IGlkOiBQcm90b2NvbFR5cGVOYW1lLm5ld3MsIG5hbWU6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5QUk9UT0NPTF9ORVcgfSk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2xzLnB1c2goeyBpZDogUHJvdG9jb2xUeXBlTmFtZS5vdGhlciwgbmFtZTogdGhpcy5MQU5HLlFNU0NLRURJVE9SLlBST1RPQ09MX09USEVSIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0TW9kZXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2Rlcy5wdXNoKHsgaWQ6IEltYWdlTW9kZU5hbWUuUG9pbnRlciwgbmFtZTogdGhpcy5MQU5HLlFNU0NLRURJVE9SLklNQUdFX01PREVfUE9JTlRFUiwgaWNvbjogXCJ2ZWN0b3ItcG9pbnRlclwiIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVzLnB1c2goeyBpZDogSW1hZ2VNb2RlTmFtZS5SZWN0YW5nbGUsIG5hbWU6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5JTUFHRV9NT0RFX1JFQ1RBTkdMRSwgaWNvbjogXCJ2ZWN0b3ItcmVjdGFuZ2xlXCIgfSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZXMucHVzaCh7IGlkOiBJbWFnZU1vZGVOYW1lLkNpcmNsZSwgbmFtZTogdGhpcy5MQU5HLlFNU0NLRURJVE9SLklNQUdFX01PREVfQ0lSQ0xFLCBpY29uOiBcInZlY3Rvci1jaXJjbGVcIiB9KTtcclxuICAgICAgICAgICAgdGhpcy5tb2Rlcy5wdXNoKHsgaWQ6IEltYWdlTW9kZU5hbWUuUG9seWdvbiwgbmFtZTogdGhpcy5MQU5HLlFNU0NLRURJVE9SLklNQUdFX01PREVfUE9MWUdPTiwgaWNvbjogXCJ2ZWN0b3ItcG9seWdvblwiIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVzLnB1c2goeyBpZDogSW1hZ2VNb2RlTmFtZS5SZW1vdmUsIG5hbWU6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5JTUFHRV9NT0RFX1JFTU9WRSwgaWNvbjogXCJ2ZWN0b3ItcmVtb3ZlXCIgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRab29tVHlwZXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuem9vbVR5cGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuem9vbVR5cGVzLnB1c2goeyBpZDogMC4yNSwgbmFtZTogXCIyNSVcIiB9KTtcclxuICAgICAgICAgICAgdGhpcy56b29tVHlwZXMucHVzaCh7IGlkOiAwLjUsIG5hbWU6IFwiNTAlXCIgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuem9vbVR5cGVzLnB1c2goeyBpZDogMS4wLCBuYW1lOiBcIjEwMCVcIiB9KTtcclxuICAgICAgICAgICAgdGhpcy56b29tVHlwZXMucHVzaCh7IGlkOiAyLjAsIG5hbWU6IFwiMjAwJVwiIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnpvb21UeXBlcy5wdXNoKHsgaWQ6IDMuMCwgbmFtZTogXCIzMDAlXCIgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRBbmNob3IoKSB7XHJcbiAgICAgICAgdGhpcy5hbmNob3JzID0gW107XHJcbiAgICAgICAgdGhpcy5hbmNob3JzID0gW3sgdmFsdWU6IDAsIHZpZXdWYWx1ZTogJycsIGFuY2hvclZhbHVlOiBMaW5rQW5jaG9yLkJsYW5rIH1dO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLmdldExhbmd1YWdlU3ViamVjdCQucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3ViY3JpYmUpKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkxBTkcgPSB0aGlzLnRyYW5zbGF0ZS5nZXRPYmplY3RMYW5nKHJlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmluaXRMaW5rVHlwZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFRhcmdldCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFByb3RvY29sKCk7XHJcbiAgICAgICAgdGhpcy5pbml0TW9kZXMoKTtcclxuICAgICAgICB0aGlzLmluaXRab29tVHlwZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmltYWdlTGlzdGVuZXJzICYmIHRoaXMuaW1hZ2VMaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmltYWdlTGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uSW1hZ2VMb2FkKCkge1xyXG4gICAgICAgIHRoaXMubmF0dXJhbEltYWdlSGVpZ2h0ID0gdGhpcy5uYXR1cmFsSW1hZ2VIZWlnaHQgIT0gMCA/IHRoaXMubmF0dXJhbEltYWdlSGVpZ2h0IDogdGhpcy5teUltYWdlUmVmLm5hdGl2ZUVsZW1lbnQubmF0dXJhbEhlaWdodDtcclxuICAgICAgICB0aGlzLm5hdHVyYWxJbWFnZVdpZHRoID0gdGhpcy5uYXR1cmFsSW1hZ2VXaWR0aCAhPSAwID8gdGhpcy5uYXR1cmFsSW1hZ2VXaWR0aCA6IHRoaXMubXlJbWFnZVJlZi5uYXRpdmVFbGVtZW50Lm5hdHVyYWxXaWR0aDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRJbWFnZVNpemUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5teUltYWdlTWFwLnNldE1hcEpzb24oe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmltYWdlTWFwRGF0YS5uYW1lLFxyXG4gICAgICAgICAgICBhcmVhczogdGhpcy5pbWFnZU1hcERhdGEuYXJlYXNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VNYXBEYXRhLmFyZWFzICYmIHRoaXMuaW1hZ2VNYXBEYXRhLmFyZWFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5teUltYWdlTWFwLmJsdXJBcmVhKHRoaXMubXlJbWFnZU1hcC5jdXJyZW50aWQpO1xyXG4gICAgICAgICAgICB0aGlzLm15SW1hZ2VNYXAuY3VycmVudGlkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5teUltYWdlTWFwLnNlbGVjdGVkSWQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0QXJlYSh0aGlzLm15SW1hZ2VNYXAuYXJlYXNbMF0pO1xyXG4gICAgICAgICAgICB0aGlzLm15SW1hZ2VNYXAuaGlnaGxpZ2h0QXJlYSgwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLm15SW1hZ2VSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5pbWFnZUxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMubXlJbWFnZVJlZi5uYXRpdmVFbGVtZW50LCAnbG9hZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25JbWFnZUxvYWQoKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXZvaWQgZHJhZyZkcm9wIG9mIHRoZSBpbWFnZVxyXG4gICAgICAgIHRoaXMubXlJbWFnZU1hcCA9IG5ldyBRTVNDS0VkaXRvckltYWdlTWFwTGliKHtcclxuICAgICAgICAgICAgY3VzdG9tX2NhbGxiYWNrczoge1xyXG4gICAgICAgICAgICAgICAgXCJvbkFkZEFyZWFcIjogdGhpcy5vbkFkZEFyZWEuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICAgICdvblNlbGVjdEFyZWEnOiB0aGlzLm9uU2VsZWN0QXJlYS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgJ29uUmVtb3ZlQXJlYSc6IHRoaXMub25SZW1vdmVBcmVhLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICAnb25TdGF0dXNNZXNzYWdlJzogdGhpcy5vblN0YXR1c01lc3NhZ2UuYmluZCh0aGlzKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpbWFnZUVsZW1lbnQ6IHRoaXMubXlJbWFnZVJlZi5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICBib3VuZGluZ19ib3g6IGZhbHNlLFxyXG4gICAgICAgICAgICBDTF9EUkFXX1NIQVBFOiAnI0YwMCcsXHJcbiAgICAgICAgICAgIENMX05PUk1fU0hBUEU6ICcjQUFBJyxcclxuICAgICAgICAgICAgQ0xfSElHSExJR0hUX1NIQVBFOiAnI0YwMCcsXHJcbiAgICAgICAgICAgIHN0cmluZ3M6IHtcclxuICAgICAgICAgICAgICAgIFwiUE9MWUdPTl9EUkFXXCI6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5QT0xZR09OX0RSQVcsXHJcbiAgICAgICAgICAgICAgICBcIlJFQ1RBTkdMRV9EUkFXXCI6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5SRUNUQU5HTEVfRFJBVyxcclxuICAgICAgICAgICAgICAgIFwiU1FVQVJFX0RSQVdcIjogdGhpcy5MQU5HLlFNU0NLRURJVE9SLlNRVUFSRV9EUkFXLFxyXG4gICAgICAgICAgICAgICAgJ1JFQURZJzogJycsXHJcbiAgICAgICAgICAgICAgICAnUkVDVEFOR0xFX01PVkUnOiAnJyxcclxuICAgICAgICAgICAgICAgICdSRUNUQU5HTEVfUkVTSVpFX1RPUCc6ICcnLFxyXG4gICAgICAgICAgICAgICAgJ1JFQ1RBTkdMRV9SRVNJWkVfUklHSFQnOiAnJyxcclxuICAgICAgICAgICAgICAgICdSRUNUQU5HTEVfUkVTSVpFX0JPVFRPTSc6ICcnLFxyXG4gICAgICAgICAgICAgICAgJ1JFQ1RBTkdMRV9SRVNJWkVfTEVGVCc6ICcnLFxyXG4gICAgICAgICAgICAgICAgJ1NRVUFSRV9NT1ZFJzogJycsXHJcbiAgICAgICAgICAgICAgICAnU1FVQVJFX1JFU0laRV9UT1AnOiAnJyxcclxuICAgICAgICAgICAgICAgICdTUVVBUkVfUkVTSVpFX1JJR0hUJzogJycsXHJcbiAgICAgICAgICAgICAgICAnU1FVQVJFX1JFU0laRV9CT1RUT00nOiAnJyxcclxuICAgICAgICAgICAgICAgICdTUVVBUkVfUkVTSVpFX0xFRlQnOiAnJyxcclxuICAgICAgICAgICAgICAgICdQT0xZR09OX01PVkUnOiAnJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VMaW5rVXJsKHVybDogc3RyaW5nLCBkZWZhdWx0UHJvdG9jb2xOYW1lPzogUHJvdG9jb2xUeXBlTmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5wcm90b2NvbFJlZ2V4LmV4ZWModXJsKTtcclxuICAgICAgICBpZiAocHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSB1cmwuc3Vic3RyKHByb3RvY29sWzBdLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIHRoaXMudXJsID0gdGhpcy5wcm9jZXNzZWRVcmw7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcm90b2NvbCA9IHByb3RvY29sWzBdLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmphdmFzY3JpcHRMaW5rUmVnZXgudGVzdCh1cmwpICYmICF0aGlzLmltYWdlTWFwRGF0YS5saW5rSmF2YVNjcmlwdExpbmtzQWxsb3dlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJvdG9jb2wgPSBQcm90b2NvbFR5cGVOYW1lLmh0dHA7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMudXJsID0gdGhpcy5wcm9jZXNzZWRVcmw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSB1cmw7XHJcbiAgICAgICAgICAgIHRoaXMudXJsID0gdGhpcy5wcm9jZXNzZWRVcmw7XHJcbiAgICAgICAgICAgIGlmICghIXRoaXMuc2VsZWN0ZWRQcm90b2NvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFByb3RvY29sID0gZGVmYXVsdFByb3RvY29sTmFtZSB8fCBQcm90b2NvbFR5cGVOYW1lLmh0dHA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3RBcmVhKGFyZWEpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRBcmVhSWQgPSBhcmVhLmFpZDtcclxuICAgICAgICB0aGlzLnNob3dJbWFnZU1hcEluZm9ybWF0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNb2RlID09IEltYWdlTW9kZU5hbWUuUmVtb3ZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXlJbWFnZU1hcC5yZW1vdmVBcmVhKHRoaXMuY3VycmVudEFyZWFJZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFyZWEuYWhyZWYubWF0Y2goL14jKC4qKSQvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JUZXh0ID0gYXJlYS5haHJlZi5zbGljZSgxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMaW5rVHlwZSA9IExpbmtUeXBlLmFuY2hvclRleHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGlua1R5cGUgPSBMaW5rVHlwZS51cmw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlTGlua1VybChhcmVhLmFocmVmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0ID0gYXJlYS5hdGFyZ2V0O1xyXG4gICAgICAgICAgICB0aGlzLmFkdmlzb3J5VGl0bGUgPSBhcmVhLmFhbHQ7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25SZW1vdmVBcmVhKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEFyZWFJZCA9IC0xO1xyXG4gICAgICAgIHRoaXMuc2hvd0ltYWdlTWFwSW5mb3JtYXRpb24gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVNYXAoKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QXJlYUlkID0gLTE7XHJcbiAgICAgICAgdGhpcy5zaG93SW1hZ2VNYXBJbmZvcm1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubXlJbWFnZU1hcC5yZW1vdmVBbGxBcmVhcygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU3RhdHVzTWVzc2FnZSh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5teVN0YXR1c1JlZikge1xyXG4gICAgICAgICAgICB0aGlzLm15U3RhdHVzUmVmLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGV4dCB8fCAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25VcmxLZXl1cCgpIHtcclxuICAgICAgICB0aGlzLmlzVXJsUHJvY2Vzc2luZyA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMudXJsICE9IHRoaXMucHJvY2Vzc2VkVXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyc2VMaW5rVXJsKHRoaXMudXJsKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVBcmVhVmFsdWVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzVXJsUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVXJsQ2hhbmdlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1VybFByb2Nlc3NpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5vblVybEtleXVwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQW5jaG9yVGV4dENoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFyZWFWYWx1ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBvblByb3RvY29sQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJlYVZhbHVlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVGFyZ2V0Q2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJlYVZhbHVlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWRkQXJlYShpZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QXJlYUlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5zaG93SW1hZ2VNYXBJbmZvcm1hdGlvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbml0RGVmYXVsdFZhbHVlcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJlYVZhbHVlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUFyZWFWYWx1ZXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEFyZWFJZCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHZhciBhaHJlZiA9IHRoaXMuYnVpbGRVcmxXaXRoUHJvdG9jb2woKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMaW5rVHlwZSA9PSBMaW5rVHlwZS5hbmNob3JUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm15SW1hZ2VNYXAuYXJlYXNbdGhpcy5jdXJyZW50QXJlYUlkXS5hdGFyZ2V0ID0gVGFyZ2V0VHlwZU5hbWUuc2FtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubXlJbWFnZU1hcC5hcmVhc1t0aGlzLmN1cnJlbnRBcmVhSWRdLmFhbHQgPSB0aGlzLmFuY2hvclRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm15SW1hZ2VNYXAuYXJlYXNbdGhpcy5jdXJyZW50QXJlYUlkXS5hdGFyZ2V0ID0gdGhpcy5zZWxlY3RlZFRhcmdldCB8fCBUYXJnZXRUeXBlTmFtZS5uZXc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm15SW1hZ2VNYXAuYXJlYXNbdGhpcy5jdXJyZW50QXJlYUlkXS5hYWx0ID0gdGhpcy5hZHZpc29yeVRpdGxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubXlJbWFnZU1hcC5hcmVhc1t0aGlzLmN1cnJlbnRBcmVhSWRdLmFocmVmID0gYWhyZWY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkVXJsV2l0aFByb3RvY29sKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTGlua1R5cGUgPT0gTGlua1R5cGUuYW5jaG9yVGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyMnICsgKHRoaXMuYW5jaG9yVGV4dCB8fCAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghIXRoaXMucHJvY2Vzc2VkVXJsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUHJvdG9jb2wgKyB0aGlzLnByb2Nlc3NlZFVybDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbG9zZURpYWxvZygpIHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTW9kZUNoYW5nZShlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IGUudmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNb2RlID09IEltYWdlTW9kZU5hbWUuUG9pbnRlciB8fCB0aGlzLnNlbGVjdGVkTW9kZSA9PSBJbWFnZU1vZGVOYW1lLlJlbW92ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm15SW1hZ2VNYXAuaXNfZHJhd2luZyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMubXlJbWFnZU1hcC5uZXh0U2hhcGUgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5teUltYWdlUmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5teUltYWdlTWFwLm5leHRTaGFwZSA9IHRoaXMuc2VsZWN0ZWRNb2RlO1xyXG4gICAgICAgICAgICB0aGlzLm15SW1hZ2VSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25ab29tQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMuc2V0SW1hZ2VTaXplKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubXlJbWFnZU1hcCkge1xyXG4gICAgICAgICAgICB0aGlzLm15SW1hZ2VNYXAuc2NhbGVBbGxBcmVhcyh0aGlzLnNlbGVjdGVkWm9vbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uTGlua1R5cGVDaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMaW5rVHlwZSA9PT0gTGlua1R5cGUuYW5jaG9yVGV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEVkaXRvckFuY2hvcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUFyZWFWYWx1ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFZGl0b3JBbmNob3IoKSB7XHJcbiAgICAgICAgdGhpcy5hbmNob3JEb2N1bWVudHMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5pbWFnZU1hcERhdGEuZWRpdG9yQ29udGVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmFuY2hvckRvY3VtZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGlkOiAwLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IDAsXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudElkOiAwLFxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlSWQ6IDAsXHJcbiAgICAgICAgICAgICAgICByaWNoVGV4dDogdGhpcy5pbWFnZU1hcERhdGEuZWRpdG9yQ29udGVudFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRBbmNob3JEb2N1bWVudCh0aGlzLmFuY2hvckRvY3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JBbmNob3JzID0gdGhpcy5hbmNob3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEltYWdlU2l6ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5teUltYWdlUmVmKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5uYXR1cmFsSW1hZ2VXaWR0aCAqIHRoaXMuc2VsZWN0ZWRab29tO1xyXG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLm5hdHVyYWxJbWFnZUhlaWdodCAqIHRoaXMuc2VsZWN0ZWRab29tO1xyXG4gICAgICAgICAgICB0aGlzLm15SW1hZ2VSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1weDtgKTtcclxuICAgICAgICAgICAgdGhpcy5teUltYWdlUmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1weDtgKTtcclxuICAgICAgICAgICAgdGhpcy5teUltYWdlUmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgICAgIHRoaXMubXlJbWFnZVJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgICAgICAgIHRoaXMubXlJbWFnZVJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLmN1cnNvciA9IHRoaXMuc2VsZWN0ZWRNb2RlID09IEltYWdlTW9kZU5hbWUuUG9pbnRlciB8fCB0aGlzLnNlbGVjdGVkTW9kZSA9PSBJbWFnZU1vZGVOYW1lLlJlbW92ZSA/ICdkZWZhdWx0JyA6ICdjcm9zc2hhaXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlSGFuZGJvb2soaXNPbmx5RG9jdW1lbnQ6IGJvb2xlYW4sIGlzQW5jaG9yRG9jdW1lbnQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFFNU0NLRWRpdG9yUmVsYXRpb24oKTtcclxuICAgICAgICBkYXRhLmlzT25seURvY3VtZW50ID0gaXNPbmx5RG9jdW1lbnQ7XHJcbiAgICAgICAgZGF0YS5pc0VuYWJsZUZvbGRlciA9ICFpc09ubHlEb2N1bWVudDtcclxuICAgICAgICBjb25zdCBkaWFsb2dUZW1wbGF0ZSA9IHRoaXMuZGlhbG9nLm9wZW4oUU1TQ0tFZGl0b3JSZWxhdGVkQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgIHdpZHRoOiAnNjUwcHgnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICc2NTBweCcsXHJcbiAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRpYWxvZ1RlbXBsYXRlXHJcbiAgICAgICAgICAgIC5hZnRlckNsb3NlZCgpXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJjcmliZSkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FuY2hvckRvY3VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRJZCA9IHJlc3VsdC5pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmFuY2hvclRpdGxlID0gYCR7cmVzdWx0LnRpdGxlfSgke3Jlc3VsdC5pZH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbmNob3JEb2N1bWVudChyZXN1bHQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VMaW5rVXJsKHJlc3VsdC51cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJvdG9jb2wgPSBQcm90b2NvbFR5cGVOYW1lLm90aGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWR2aXNvcnlUaXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZpc29yeVRpdGxlID0gcmVzdWx0LnRpdGxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQXJlYVZhbHVlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbmNob3JEb2N1bWVudChkb2N1bWVudElkOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5nZXRBbmNob3JEb2N1bWVudExpc3QoZG9jdW1lbnRJZClcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YmNyaWJlKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3JEb2N1bWVudHMgPSByZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBbmNob3JEb2N1bWVudCh0aGlzLmFuY2hvckRvY3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLmRvY3VtZW50QW5jaG9ycyA9IHRoaXMuYW5jaG9ycztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3JEb2N1bWVudHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFuY2hvckRvY3VtZW50KHRoaXMuYW5jaG9yRG9jdW1lbnRzKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZG9jdW1lbnRBbmNob3JzID0gdGhpcy5hbmNob3JzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRBbmNob3JEb2N1bWVudChhbmNob3JEb2N1bWVudDogUU1TQ0tFZGl0b3JMaW5rQW5jaG9yRG9jdW1lbnRbXSkge1xyXG4gICAgICAgIHRoaXMuaW5pdEFuY2hvcigpO1xyXG4gICAgICAgIGxldCBpZCA9IDM7XHJcbiAgICAgICAgaWYgKGFuY2hvckRvY3VtZW50KSB7XHJcbiAgICAgICAgICAgIGFuY2hvckRvY3VtZW50LmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IGUucmljaFRleHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkb21Db250ZW50ID0gZGl2O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYVRhZ3MgPSBkb21Db250ZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYVRhZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWZvci1vZlxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVRhZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnID0gYVRhZ3NbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmFuY2hvcnMuZmluZEluZGV4KCh4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHguYW5jaG9yVmFsdWUgPT09IHRhZy5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3JzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdWYWx1ZTogdGFnLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclZhbHVlOiB0YWcubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkICs9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLmFuY2hvcnMucHVzaCh7XHJcbiAgICAgICAgLy8gICAgIHZhbHVlOiAxLFxyXG4gICAgICAgIC8vICAgICB2aWV3VmFsdWU6IHRoaXMuTEFORy5RTVNDS0VESVRPUi5BTkNIT1JfQVRUQUNITUVOVCxcclxuICAgICAgICAvLyAgICAgYW5jaG9yVmFsdWU6IExpbmtBbmNob3IuQXR0YWNobWVudFxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICAgIC8vIHRoaXMuYW5jaG9ycy5wdXNoKHtcclxuICAgICAgICAvLyAgICAgdmFsdWU6IDIsXHJcbiAgICAgICAgLy8gICAgIHZpZXdWYWx1ZTogdGhpcy5MQU5HLlFNU0NLRURJVE9SLkFOQ0hPUl9SRUxBVEVEX0RPQ1VNRU5ULFxyXG4gICAgICAgIC8vICAgICBhbmNob3JWYWx1ZTogTGlua0FuY2hvci5SZWxhdGVkXHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGF0dGFjaG1lbnQoKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBRTVNDS0VkaXRvclBhcmFtdGVyKCk7XHJcbiAgICAgICAgZGF0YS5tb2R1bGUgPSB0aGlzLmltYWdlTWFwRGF0YS5tb2R1bGU7XHJcbiAgICAgICAgZGF0YS5lbnRpdHlJZCA9IHRoaXMuaW1hZ2VNYXBEYXRhLmVudGl0eUlkO1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ1RlbXBsYXRlID0gdGhpcy5kaWFsb2cub3BlbihMaW5rQXR0YWNobWVudENvbXBvbmVudCwge1xyXG4gICAgICAgICAgICB3aWR0aDogJzY1MHB4JyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnNjUwcHgnLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBkaWFsb2dUZW1wbGF0ZVxyXG4gICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3ViY3JpYmUpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlTGlua1VybChyZXN1bHQudXJsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJvdG9jb2wgPSBQcm90b2NvbFR5cGVOYW1lLm90aGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZHZpc29yeVRpdGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2aXNvcnlUaXRsZSA9IHJlc3VsdC50aXRsZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBcmVhVmFsdWVzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmUoKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMubXlJbWFnZU1hcC5nZXRNYXBKc29uKCk7XHJcbiAgICAgICAgZGF0YS5pbWFnZUhlaWdodCA9IHRoaXMubmF0dXJhbEltYWdlSGVpZ2h0O1xyXG4gICAgICAgIGRhdGEuaW1hZ2VXaWR0aCA9IHRoaXMubmF0dXJhbEltYWdlV2lkdGg7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsKCkge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICB9XHJcbn1cclxuIl19