ca-components 1.0.76 → 1.0.78

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 (57) hide show
  1. package/esm2022/lib/components/ca-chart/ca-chart.component.mjs +200 -120
  2. package/esm2022/lib/components/ca-chart/enums/chart-annotation.enum.mjs +11 -0
  3. package/esm2022/lib/components/ca-chart/enums/chart-plugin-ids.enum.mjs +2 -1
  4. package/esm2022/lib/components/ca-chart/enums/index.mjs +2 -1
  5. package/esm2022/lib/components/ca-chart/models/chart-config.model.mjs +1 -1
  6. package/esm2022/lib/components/ca-chart/models/chart-legend-config.model.mjs +2 -0
  7. package/esm2022/lib/components/ca-chart/models/chart-legend-property.model.mjs +2 -0
  8. package/esm2022/lib/components/ca-chart/models/index.mjs +3 -1
  9. package/esm2022/lib/components/ca-chart/utils/helpers/chart.helper.mjs +2 -2
  10. package/esm2022/lib/components/ca-chart-manager/ca-chart-manager.component.mjs +4 -4
  11. package/esm2022/lib/components/ca-dropdown-menu/ca-dropdown-menu.component.mjs +3 -3
  12. package/esm2022/lib/components/ca-input/ca-input.component.mjs +1 -1
  13. package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +21 -22
  14. package/esm2022/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.mjs +6 -0
  15. package/esm2022/lib/components/ca-map/ca-map.component.mjs +137 -210
  16. package/esm2022/lib/components/ca-map/enums/google-map.enum.mjs +2 -1
  17. package/esm2022/lib/components/ca-map/enums/map-marker-string.enum.mjs +2 -1
  18. package/esm2022/lib/components/ca-map/models/map.model.mjs +1 -1
  19. package/esm2022/lib/components/ca-map/utils/constants/index.mjs +2 -1
  20. package/esm2022/lib/components/ca-map/utils/constants/map-marker-icons.constants.mjs +119 -0
  21. package/esm2022/lib/components/ca-map/utils/constants/map-options.constants.mjs +1 -2
  22. package/esm2022/lib/components/ca-map/utils/helpers/map-marker-icon.helper.mjs +50 -12
  23. package/esm2022/lib/components/ca-map/utils/services/index.mjs +2 -0
  24. package/esm2022/lib/components/ca-map/utils/services/map-marker-icon.service.mjs +137 -0
  25. package/esm2022/lib/components/ca-map-dropdown/ca-map-dropdown.component.mjs +25 -11
  26. package/esm2022/lib/components/ca-progress-bar/ca-progress-bar.component.mjs +15 -15
  27. package/esm2022/lib/constants/map.constant.mjs +131 -131
  28. package/esm2022/lib/pipes/index.mjs +19 -0
  29. package/esm2022/lib/pipes/unit-position.pipe.mjs +24 -0
  30. package/esm2022/public-api.mjs +2 -1
  31. package/fesm2022/ca-components.mjs +993 -653
  32. package/fesm2022/ca-components.mjs.map +1 -1
  33. package/lib/components/ca-chart/ca-chart.component.d.ts +9 -4
  34. package/lib/components/ca-chart/enums/chart-annotation.enum.d.ts +10 -0
  35. package/lib/components/ca-chart/enums/chart-plugin-ids.enum.d.ts +2 -1
  36. package/lib/components/ca-chart/enums/index.d.ts +1 -0
  37. package/lib/components/ca-chart/models/chart-config.model.d.ts +1 -0
  38. package/lib/components/ca-chart/models/chart-legend-config.model.d.ts +6 -0
  39. package/lib/components/ca-chart/models/chart-legend-property.model.d.ts +7 -0
  40. package/lib/components/ca-chart/models/index.d.ts +2 -0
  41. package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
  42. package/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.d.ts +4 -0
  43. package/lib/components/ca-map/ca-map.component.d.ts +22 -25
  44. package/lib/components/ca-map/enums/google-map.enum.d.ts +2 -1
  45. package/lib/components/ca-map/enums/map-marker-string.enum.d.ts +2 -1
  46. package/lib/components/ca-map/models/map.model.d.ts +8 -3
  47. package/lib/components/ca-map/utils/constants/index.d.ts +1 -0
  48. package/lib/components/ca-map/utils/constants/map-marker-icons.constants.d.ts +6 -0
  49. package/lib/components/ca-map/utils/helpers/map-marker-icon.helper.d.ts +2 -0
  50. package/lib/components/ca-map/utils/services/index.d.ts +1 -0
  51. package/lib/components/ca-map/utils/services/map-marker-icon.service.d.ts +23 -0
  52. package/lib/components/ca-map-dropdown/ca-map-dropdown.component.d.ts +5 -3
  53. package/lib/components/ca-progress-bar/ca-progress-bar.component.d.ts +3 -1
  54. package/lib/pipes/index.d.ts +18 -0
  55. package/lib/pipes/unit-position.pipe.d.ts +7 -0
  56. package/package.json +1 -1
  57. package/public-api.d.ts +1 -0
@@ -1,36 +1,45 @@
1
1
  import { CommonModule } from '@angular/common';
2
2
  import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
3
- import { GoogleMap, GoogleMapsModule, MapInfoWindow, } from '@angular/google-maps';
3
+ import { Subject, takeUntil } from 'rxjs';
4
+ // Modules
4
5
  import { AngularSvgIconModule } from 'angular-svg-icon';
5
6
  import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
7
+ import { GoogleMap, GoogleMapsModule } from '@angular/google-maps';
6
8
  // Components
7
9
  import { CaMapDropdownComponent } from '../ca-map-dropdown/ca-map-dropdown.component';
8
10
  import { CaAppTooltipV2Component } from '../ca-app-tooltip-v2/ca-app-tooltip-v2.component';
9
11
  // Enums
10
12
  import { GoogleMapEnum } from '../ca-map/enums/google-map.enum';
13
+ import { MapMarkerStringEnum } from './enums';
11
14
  // Helpers
12
15
  import { MapHelper } from '../ca-map/utils/helpers/map.helper';
13
16
  // Constants
14
17
  import { MapInfoWindowOptionsConstants, MapOptionsConstants, } from './utils/constants';
15
18
  import { MapConstants } from '../../constants/map.constant';
16
19
  import * as i0 from "@angular/core";
17
- import * as i1 from "@angular/google-maps";
18
- import * as i2 from "@angular/common";
19
- import * as i3 from "angular-svg-icon";
20
- import * as i4 from "@ng-bootstrap/ng-bootstrap";
20
+ import * as i1 from "./utils/services";
21
+ import * as i2 from "@angular/google-maps";
22
+ import * as i3 from "@angular/common";
23
+ import * as i4 from "angular-svg-icon";
24
+ import * as i5 from "@ng-bootstrap/ng-bootstrap";
21
25
  export class CaMapComponent {
22
- constructor(cd) {
26
+ constructor(cd, el, renderer,
27
+ // Services
28
+ markerIconService) {
23
29
  this.cd = cd;
30
+ this.el = el;
31
+ this.renderer = renderer;
32
+ this.markerIconService = markerIconService;
24
33
  this.resetSelectedMarkerItem = new EventEmitter();
25
34
  this.clusterMarkerClick = new EventEmitter();
26
35
  this.clusterListScrollEvent = new EventEmitter();
27
36
  this.getInfoWindowData = new EventEmitter();
28
37
  this.boundsChanged = new EventEmitter();
29
38
  this.openInMapEvent = new EventEmitter();
39
+ this.destroy$ = new Subject();
40
+ this.currentlyOpenWindow = false;
30
41
  this.directionService = new google.maps.DirectionsService();
31
42
  this.directionsRenderers = [];
32
- this.initialIcons = [];
33
- this.initialMarkerIcons = [];
34
43
  this.infoWindowOptions = MapInfoWindowOptionsConstants.mapInfoWindowOptions;
35
44
  this.mapOptions = MapOptionsConstants.defaultMapOptions;
36
45
  this.mapZoom = MapOptionsConstants.defaultMapZoom;
@@ -43,34 +52,25 @@ export class CaMapComponent {
43
52
  this.openedInfoWindowData = null;
44
53
  this.areaFilterData = MapOptionsConstants.areaFilterData;
45
54
  this.isAreaFilterActive = false;
46
- this.hoveredMarkerId = null;
55
+ this.mapStyles = MapConstants.GOOGLE_MAP_STYLES;
56
+ this.clusterMarkerIds = [];
57
+ this.routingMarkerIds = [];
58
+ this.isMarkerDropdownOpen = false;
59
+ this.isClusterDropdownOpen = false;
60
+ this.openDropdownTimeout = 0;
61
+ this.mapStyleId = 'd681904a390a8402';
47
62
  }
48
63
  set data(values) {
49
64
  this.handleMapData(values);
50
65
  }
51
66
  ngOnInit() {
52
- this.storeInitialIconForMarker();
53
- this.storeInitialIconForRoutingMarker();
54
67
  // Reset all icons to their initial state on page load
55
68
  this.resetMarkersIcons();
56
- this.resetRoutingMarkers();
69
+ this.getServiceData();
57
70
  }
58
- storeInitialIconForMarker() {
59
- this.initialMarkerIcons = [];
60
- this.mapData.markers?.forEach((marker, index) => {
61
- this.initialMarkerIcons[index] = {
62
- url: marker.icon.url,
63
- labelOrigin: marker.icon.labelOrigin,
64
- zIndex: marker.options?.zIndex ?? 1,
65
- };
66
- });
67
- }
68
- storeInitialIconForRoutingMarker() {
69
- this.mapData.routingMarkers?.forEach((marker, index) => {
70
- this.initialIcons[index] = {
71
- url: marker.icon.url,
72
- labelOrigin: marker.icon.labelOrigin,
73
- };
71
+ ngAfterViewInit() {
72
+ this.maps.googleMap?.addListener('click', () => {
73
+ this.closeInfoWindow();
74
74
  });
75
75
  }
76
76
  onClusterMarkerClick(markerItem) {
@@ -111,20 +111,24 @@ export class CaMapComponent {
111
111
  travelMode: google.maps.TravelMode.BICYCLING,
112
112
  };
113
113
  this.directionService.route(request, (result, status) => {
114
- if (status === google.maps.DirectionsStatus.OK && result?.routes[0]) {
114
+ if (status === google.maps.DirectionsStatus.OK &&
115
+ result?.routes[0]) {
115
116
  const directionsRenderer = new google.maps.DirectionsRenderer({
116
117
  suppressInfoWindows: true,
117
118
  suppressMarkers: true,
118
119
  preserveViewport: true,
119
120
  polylineOptions: {
120
- strokeColor: route.strokeColor || GoogleMapEnum.STROKE_COLOR,
121
+ strokeColor: route.strokeColor ||
122
+ GoogleMapEnum.STROKE_COLOR,
121
123
  strokeOpacity: !route.isDashed
122
- ? route.strokeOpacity || GoogleMapEnum.STROKE_OPACITY
124
+ ? route.strokeOpacity ||
125
+ GoogleMapEnum.STROKE_OPACITY
123
126
  : 0,
124
- strokeWeight: route.strokeWeight || GoogleMapEnum.STROKE_WEIGHT,
127
+ strokeWeight: route.strokeWeight ||
128
+ GoogleMapEnum.STROKE_WEIGHT,
125
129
  icons: route.isDashed
126
- ? route.dashedLineStyle ??
127
- MapOptionsConstants.routingDashedLineIcon
130
+ ? (route.dashedLineStyle ??
131
+ MapOptionsConstants.routingDashedLineIcon)
128
132
  : null,
129
133
  },
130
134
  });
@@ -139,112 +143,31 @@ export class CaMapComponent {
139
143
  return;
140
144
  }
141
145
  }
142
- onRoutingMarkerClick(i, event, markeritem) {
143
- // if (markeritem?.infoWindowContent) {
144
- // if (
145
- // this.currentlyOpenWindowIndexRouting === i &&
146
- // this.currentlyOpenWindowRouting
147
- // ) {
148
- // const infoWindow = this.infoWindowsViewRouting.toArray()[i];
149
- // // Close the currently open info window and reset the index
150
- // this.mapData.routingMarkers!.map((item: IMapMarkers, index: number) => {
151
- // if (index === i) {
152
- // item.icon = {
153
- // url: this.initialIcons[index]!.url,
154
- // labelOrigin: this.initialIcons[index]!.labelOrigin,
155
- // };
156
- // }
157
- // });
158
- // infoWindow.close();
159
- // this.currentlyOpenWindowIndexRouting = null;
160
- // } else {
161
- // const markerIndex = this.markerRouting.toArray()[i];
162
- // const infoWindow = this.infoWindowsViewRouting.toArray()[i];
163
- // if (this.currentlyOpenWindowRouting) {
164
- // this.currentlyOpenWindowRouting.close();
165
- // }
166
- // if (infoWindow) {
167
- // // Restore the previous icon for the previously focused routing marker
168
- // if (
169
- // this.focusedIconRouting !== undefined &&
170
- // this.focusedIconRouting !== i
171
- // ) {
172
- // const previousFocusedItem =
173
- // this.mapData.routingMarkers![this.focusedIconRouting];
174
- // if (previousFocusedItem) {
175
- // previousFocusedItem.icon = {
176
- // url: this.initialIcons[this.focusedIconRouting].url,
177
- // labelOrigin:
178
- // this.initialIcons[this.focusedIconRouting].labelOrigin,
179
- // };
180
- // }
181
- // }
182
- // // Update the current marker
183
- // this.mapData.routingMarkers!.map(
184
- // (item: IMapMarkers, index: number) => {
185
- // if (index === i) {
186
- // this.previousIconUrlRouting = item.icon ? item.icon.url : '';
187
- // this.focusedIconRouting = i;
188
- // this.showLabel = false;
189
- // item.icon = {
190
- // url:
191
- // this.mapData.isUnitViewStops || this.mapData.isDriverMiles
192
- // ? item.icon!.url
193
- // : MapSvgRoutes.markerSvgRoute,
194
- // };
195
- // } else {
196
- // this.showLabel = true;
197
- // }
198
- // }
199
- // );
200
- // infoWindow.open(markerIndex);
201
- // this.currentlyOpenWindowRouting = infoWindow;
202
- // this.currentlyOpenWindowIndexRouting = i;
203
- // }
204
- // }
205
- // this.markerClick.emit(markeritem);
206
- // } else {
207
- // return;
208
- // }
209
- }
210
- ngAfterViewInit() {
211
- this.maps.googleMap?.addListener('click', () => {
212
- this.closeInfoWindow();
213
- this.mapData.routingMarkers?.map((item, i) => {
214
- if (i === this.focusedIconRouting) {
215
- item.icon = {
216
- url: this.initialIcons[i].url,
217
- };
218
- this.cd.detectChanges();
219
- }
220
- });
221
- });
222
- }
223
146
  resetMarkersIcons() {
224
147
  this.mapData.markers?.map((marker, index) => {
148
+ const markerIcon = this.el.nativeElement.querySelector('#marker-' + marker.id);
149
+ this.renderer.removeClass(markerIcon, MapMarkerStringEnum.SELECTED);
150
+ this.isMarkerDropdownOpen = false;
225
151
  return {
226
152
  ...marker,
227
- icon: {
228
- ...marker.icon,
229
- scaledSize: marker.isLargeMarker
230
- ? MapOptionsConstants.largeMarkerSize
231
- : MapOptionsConstants.defaultMarkerSize,
232
- },
233
153
  options: { zIndex: index + 1 },
234
154
  };
235
155
  });
236
- this.cd.detectChanges();
237
- }
238
- resetRoutingMarkers() {
239
- this.mapData.routingMarkers?.forEach((marker, index) => {
240
- marker.icon = {
241
- url: marker.icon.url,
242
- labelOrigin: marker.icon.labelOrigin,
243
- };
156
+ this.mapData.clusterMarkers?.map((clusterMarker, index) => {
157
+ const clusterId = this.getClusterId(clusterMarker);
158
+ const markerIcon = this.el.nativeElement.querySelector('#cluster-' + clusterId);
159
+ this.renderer.removeClass(markerIcon, MapMarkerStringEnum.SELECTED);
160
+ this.isClusterDropdownOpen = false;
244
161
  });
162
+ this.cd.detectChanges();
245
163
  }
246
164
  onMapReady(mapInstance) {
247
165
  this.map = mapInstance;
166
+ if (this.mapData?.darkMode) {
167
+ const styledMapType = new google.maps.StyledMapType(MapConstants.GOOGLE_MAP_DARK_STYLES);
168
+ this.map.mapTypes.set(GoogleMapEnum.DARK_MAP, styledMapType);
169
+ this.map.setMapTypeId(GoogleMapEnum.DARK_MAP);
170
+ }
248
171
  if (this.mapData.stateBoundariesUrl) {
249
172
  const stateBoundariesUrl = this.mapData.stateBoundariesUrl.url;
250
173
  this.maps.googleMap?.data.loadGeoJson(stateBoundariesUrl);
@@ -302,63 +225,54 @@ export class CaMapComponent {
302
225
  onClusterBackButtonClick() {
303
226
  this.resetSelectedMarkerItem.emit(true);
304
227
  }
305
- getNewData(data) {
306
- const newMarkers = data?.markers?.map((marker) => {
307
- const isSelectedMarker = this.checkInfoWindowPosition(marker, this.openedInfoWindowData);
308
- if (isSelectedMarker) {
309
- const newMarkerData = {
310
- ...marker,
311
- icon: {
312
- ...marker.icon,
313
- scaledSize: MapOptionsConstants.largeMarkerSize,
314
- },
315
- options: { zIndex: 999 },
316
- };
317
- return newMarkerData;
318
- }
319
- return marker;
320
- });
321
- return {
322
- ...data,
323
- markers: newMarkers,
324
- };
325
- }
326
228
  openMarkerInfoWindow(markerItem) {
327
229
  const isInfoWindowOpened = this.checkInfoWindowPosition(markerItem, this.openedInfoWindowData);
328
- const isClusterItemChanged = this.checkClusterDataChanges(markerItem, this.openedInfoWindowData);
329
- if (this.infoWindowsView && (!isInfoWindowOpened || isClusterItemChanged)) {
330
- this.mapData.markers.map((item, index) => {
331
- const isSelectedMarker = this.checkInfoWindowPosition(item, markerItem);
332
- if (isSelectedMarker) {
333
- item.icon = {
334
- ...item.icon,
335
- scaledSize: MapOptionsConstants.largeMarkerSize,
336
- };
337
- item.options = { zIndex: 999 };
338
- }
339
- else {
340
- item.icon = {
341
- ...item.icon,
342
- scaledSize: item.isLargeMarker
343
- ? MapOptionsConstants.largeMarkerSize
344
- : MapOptionsConstants.defaultMarkerSize,
345
- };
346
- item.options = { zIndex: index + 1 };
347
- }
348
- });
349
- this.currentlyOpenWindow = this.infoWindowsView;
350
- this.openedInfoWindowData = markerItem;
351
- if (!isInfoWindowOpened) {
352
- this.map.panTo(markerItem.position);
230
+ const combinedMarkers = [
231
+ ...this.mapData.markers,
232
+ ...this.mapData.clusterMarkers,
233
+ ];
234
+ combinedMarkers.forEach((item, index) => {
235
+ const isSelectedMarker = this.checkInfoWindowPosition(item, markerItem);
236
+ const isClusterMarker = item?.data?.count > 1;
237
+ const clusterId = isClusterMarker ? this.getClusterId(item) : null;
238
+ const markerIconId = isClusterMarker
239
+ ? '#cluster-' + clusterId
240
+ : '#marker-' + item.id;
241
+ const dropdownElement = isClusterMarker
242
+ ? this.clusterDropdown.nativeElement
243
+ : this.markerDropdown.nativeElement;
244
+ if (isSelectedMarker) {
245
+ item.options = { zIndex: 999 };
246
+ if (isClusterMarker)
247
+ this.isMarkerDropdownOpen = false;
248
+ else
249
+ this.isClusterDropdownOpen = false;
250
+ clearTimeout(this.openDropdownTimeout);
251
+ this.openDropdownTimeout = setTimeout(() => {
252
+ const markerIcon = this.el.nativeElement.querySelector(markerIconId);
253
+ if (!(markerIcon?.previousSibling === dropdownElement))
254
+ this.renderer.insertBefore(markerIcon?.parentNode, dropdownElement, markerIcon);
255
+ if (markerIcon &&
256
+ !markerIcon.classList.contains(MapMarkerStringEnum.SELECTED))
257
+ this.renderer.addClass(markerIcon, MapMarkerStringEnum.SELECTED);
258
+ this.isMarkerDropdownOpen = !isClusterMarker;
259
+ this.isClusterDropdownOpen = isClusterMarker;
260
+ this.cd.detectChanges();
261
+ }, 50);
262
+ }
263
+ else {
264
+ const markerIcon = this.el.nativeElement.querySelector(markerIconId);
265
+ if (markerIcon?.classList.contains(MapMarkerStringEnum.SELECTED))
266
+ this.renderer.removeClass(markerIcon, MapMarkerStringEnum.SELECTED);
353
267
  setTimeout(() => {
354
- this.infoWindowOptions = {
355
- ...this.infoWindowOptions,
356
- position: markerItem.position,
357
- };
358
- this.infoWindowsView.open();
359
- }, 0);
268
+ item.options = { zIndex: index + 1 };
269
+ }, 50);
360
270
  }
361
- }
271
+ });
272
+ this.currentlyOpenWindow = true;
273
+ this.openedInfoWindowData = markerItem;
274
+ if (!isInfoWindowOpened)
275
+ this.map.panTo(markerItem.position);
362
276
  }
363
277
  checkInfoWindowPosition(markerItem, markerItem2) {
364
278
  return (markerItem.position.lat === markerItem2?.position?.lat &&
@@ -366,13 +280,15 @@ export class CaMapComponent {
366
280
  }
367
281
  closeInfoWindow() {
368
282
  this.resetMarkersIcons();
369
- this.openedInfoWindowData = null;
370
- this.currentlyOpenWindow = null;
371
- this.infoWindowsView.close();
283
+ setTimeout(() => (this.openedInfoWindowData = null), 250);
284
+ clearTimeout(this.openDropdownTimeout);
285
+ this.isMarkerDropdownOpen = false;
286
+ this.isClusterDropdownOpen = false;
287
+ this.currentlyOpenWindow = false;
372
288
  this.resetSelectedMarkerItem.emit();
373
289
  }
374
290
  handleMapData(newData) {
375
- this.mapData = this.getNewData(newData);
291
+ this.mapData = { ...newData };
376
292
  if (this.mapData.selectedMarkerData)
377
293
  this.openMarkerInfoWindow(this.mapData.selectedMarkerData);
378
294
  else if (this.currentlyOpenWindow)
@@ -387,26 +303,20 @@ export class CaMapComponent {
387
303
  this.calculateAndDisplayRoute();
388
304
  this.cd.detectChanges();
389
305
  }
306
+ getClusterId(clusterData) {
307
+ const clusterId = this.clusterMarkerIds.find((item) => clusterData.position.lat === item.position.lat &&
308
+ clusterData.position.lng === item.position.lng)?.id;
309
+ return clusterId || null;
310
+ }
311
+ getRoutingId(markerData) {
312
+ const routingId = this.routingMarkerIds.find((item) => markerData.position.lat === item.position.lat &&
313
+ markerData.position.lng === item.position.lng)?.id;
314
+ return routingId || null;
315
+ }
390
316
  onClusterListScrollToEnd() {
391
317
  if (this.openedInfoWindowData)
392
318
  this.clusterListScrollEvent.emit(this.openedInfoWindowData);
393
319
  }
394
- checkClusterDataChanges(newData, previousData) {
395
- return newData.infoWindowContent?.clusterData
396
- ? newData.infoWindowContent?.selectedClusterItemData?.data?.id !==
397
- previousData?.infoWindowContent?.selectedClusterItemData?.data?.id ||
398
- newData.infoWindowContent?.clusterData?.length !==
399
- previousData?.infoWindowContent?.clusterData?.length
400
- : false;
401
- }
402
- onMarkerMouseover(markerItem) {
403
- if (markerItem?.label?.isShowOnHover)
404
- this.hoveredMarkerId = markerItem?.data?.id;
405
- }
406
- onMarkerMouseout(markerItem) {
407
- if (markerItem?.label?.isShowOnHover)
408
- this.hoveredMarkerId = null;
409
- }
410
320
  onZoomChange(isMinusClick) {
411
321
  const currentZoomLevel = this.map?.getZoom();
412
322
  if (currentZoomLevel) {
@@ -419,6 +329,18 @@ export class CaMapComponent {
419
329
  onOpenInMap() {
420
330
  this.openInMapEvent.emit();
421
331
  }
332
+ getServiceData() {
333
+ this.markerIconService.clusterMarkerIds$
334
+ .pipe(takeUntil(this.destroy$))
335
+ .subscribe((clusterIds) => {
336
+ this.clusterMarkerIds = clusterIds;
337
+ });
338
+ this.markerIconService.routingMarkerIds$
339
+ .pipe(takeUntil(this.destroy$))
340
+ .subscribe((routingIds) => {
341
+ this.routingMarkerIds = routingIds;
342
+ });
343
+ }
422
344
  trackById(index, marker) {
423
345
  return marker.data.id;
424
346
  }
@@ -430,11 +352,13 @@ export class CaMapComponent {
430
352
  }
431
353
  ngOnDestroy() {
432
354
  this.directionsRenderers.forEach((renderer) => renderer.setMap(null));
355
+ this.destroy$.next();
356
+ this.destroy$.complete();
433
357
  }
434
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaMapComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
435
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CaMapComponent, isStandalone: true, selector: "app-ca-map", inputs: { data: "data" }, outputs: { resetSelectedMarkerItem: "resetSelectedMarkerItem", clusterMarkerClick: "clusterMarkerClick", clusterListScrollEvent: "clusterListScrollEvent", getInfoWindowData: "getInfoWindowData", boundsChanged: "boundsChanged", openInMapEvent: "openInMapEvent" }, viewQueries: [{ propertyName: "maps", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "infoWindowsView", first: true, predicate: MapInfoWindow, descendants: true }], ngImport: i0, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n <map-marker\n #marker=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.markers;\n let i = index;\n trackBy: trackById\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"\n (openedInfoWindowData?.position?.lat === markeritem?.position?.lat &&\n openedInfoWindowData?.position?.lng === markeritem?.position?.lng) ||\n (markeritem.label?.isShowOnHover &&\n hoveredMarkerId !== markeritem.data.id)\n ? ''\n : markeritem.label!\n \"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onMarkerClick(markeritem)\"\n (mapMouseover)=\"onMarkerMouseover(markeritem)\"\n (mapMouseout)=\"onMarkerMouseout(markeritem)\"\n >\n </map-marker>\n\n <map-info-window\n #infoWindowsView=\"mapInfoWindow\"\n [options]=\"infoWindowOptions\"\n >\n <ng-container *ngIf=\"openedInfoWindowData !== null\">\n <app-ca-map-dropdown\n [infoWindowContent]=\"openedInfoWindowData.infoWindowContent\"\n [markerData]=\"openedInfoWindowData.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </ng-container>\n </map-info-window>\n\n <map-marker\n #markerCluster=\"mapMarker\"\n *ngFor=\"\n let marker of mapData.clusterMarkers;\n let i = index;\n trackBy: trackByPosition\n \"\n [position]=\"marker.position\"\n [icon]=\"marker.icon\"\n (mapClick)=\"onClusterMarkerClick(marker)\"\n >\n </map-marker>\n\n <ng-container *ngIf=\"isAreaFilterActive\">\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n </ng-container>\n\n <map-marker\n #markerRouting=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.routingMarkers;\n let i = index;\n trackBy: identity\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"focusedIconRouting !== i ? markeritem.label! : ''\"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onRoutingMarkerClick(i, $event, markeritem)\"\n >\n <map-info-window #infoWindowsViewRouting=\"mapInfoWindow\">\n <app-ca-map-dropdown></app-ca-map-dropdown>\n </map-info-window>\n </map-marker>\n\n <ng-container *ngIf=\"mapData.isOpenInMapShown\">\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"mapData.isZoomShown\">\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom\n }\"\n >\n <div class=\"map-zoom-buttons d-flex align-items-center\" [class.flex-column]=\"mapData.isVerticalZoom\">\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n </ng-container>\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true]{width:100px;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true]{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}\n"], dependencies: [{ kind: "ngmodule", type:
358
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaMapComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.MapMarkerIconService }], target: i0.ɵɵFactoryTarget.Component }); }
359
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CaMapComponent, isStandalone: true, selector: "app-ca-map", inputs: { data: "data" }, outputs: { resetSelectedMarkerItem: "resetSelectedMarkerItem", clusterMarkerClick: "clusterMarkerClick", clusterListScrollEvent: "clusterListScrollEvent", getInfoWindowData: "getInfoWindowData", boundsChanged: "boundsChanged", openInMapEvent: "openInMapEvent" }, viewQueries: [{ propertyName: "maps", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "markerDropdown", first: true, predicate: ["markerDropdown"], descendants: true }, { propertyName: "clusterDropdown", first: true, predicate: ["clusterDropdown"], descendants: true }], ngImport: i0, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n [mapId]=\"mapStyleId\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track trackByPosition($index, clusterMarker)\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (isAreaFilterActive) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (\n routingMarker of mapData.routingMarkers;\n let i = $index;\n track trackByPosition($index, routingMarker)\n ) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true],.marker-label{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px;pointer-events:none}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}\n"], dependencies: [{ kind: "ngmodule", type:
436
360
  // Modules
437
- GoogleMapsModule }, { kind: "component", type: i1.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i1.MapCircle, selector: "map-circle", inputs: ["options", "center", "radius"], outputs: ["centerChanged", "circleClick", "circleDblclick", "circleDrag", "circleDragend", "circleDragstart", "circleMousedown", "circleMousemove", "circleMouseout", "circleMouseover", "circleMouseup", "radiusChanged", "circleRightclick", "circleInitialized"], exportAs: ["mapCircle"] }, { kind: "directive", type: i1.MapInfoWindow, selector: "map-info-window", inputs: ["options", "position"], outputs: ["closeclick", "contentChanged", "domready", "positionChanged", "zindexChanged", "infoWindowInitialized"], exportAs: ["mapInfoWindow"] }, { kind: "directive", type: i1.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i3.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type:
361
+ GoogleMapsModule }, { kind: "component", type: i2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i2.MapCircle, selector: "map-circle", inputs: ["options", "center", "radius"], outputs: ["centerChanged", "circleClick", "circleDblclick", "circleDrag", "circleDragend", "circleDragstart", "circleMousedown", "circleMousemove", "circleMouseout", "circleMouseover", "circleMouseup", "radiusChanged", "circleRightclick", "circleInitialized"], exportAs: ["mapCircle"] }, { kind: "directive", type: i2.MapAdvancedMarker, selector: "map-advanced-marker", inputs: ["title", "position", "content", "gmpDraggable", "options", "zIndex"], outputs: ["mapClick", "mapDrag", "mapDragend", "mapDragstart", "markerInitialized"], exportAs: ["mapAdvancedMarker"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i4.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type:
438
362
  // Components
439
363
  CaMapDropdownComponent, selector: "app-ca-map-dropdown", inputs: ["infoWindowContent", "markerData"], outputs: ["onClusterItemClick", "onClusterListScrollToEnd", "onBackButtonClick", "bodyActions"] }, { kind: "component", type: CaAppTooltipV2Component, selector: "mainCaTooltip, [mainCaTooltip]", inputs: ["mainCaTooltip", "position", "openTooltipDelay", "tooltipBackground", "tooltipColor", "tooltipTextAlign", "tooltipMarginTop", "disableTooltip"] }], encapsulation: i0.ViewEncapsulation.None }); }
440
364
  }
@@ -449,8 +373,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
449
373
  // Components
450
374
  CaMapDropdownComponent,
451
375
  CaAppTooltipV2Component,
452
- ], encapsulation: ViewEncapsulation.None, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n <map-marker\n #marker=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.markers;\n let i = index;\n trackBy: trackById\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"\n (openedInfoWindowData?.position?.lat === markeritem?.position?.lat &&\n openedInfoWindowData?.position?.lng === markeritem?.position?.lng) ||\n (markeritem.label?.isShowOnHover &&\n hoveredMarkerId !== markeritem.data.id)\n ? ''\n : markeritem.label!\n \"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onMarkerClick(markeritem)\"\n (mapMouseover)=\"onMarkerMouseover(markeritem)\"\n (mapMouseout)=\"onMarkerMouseout(markeritem)\"\n >\n </map-marker>\n\n <map-info-window\n #infoWindowsView=\"mapInfoWindow\"\n [options]=\"infoWindowOptions\"\n >\n <ng-container *ngIf=\"openedInfoWindowData !== null\">\n <app-ca-map-dropdown\n [infoWindowContent]=\"openedInfoWindowData.infoWindowContent\"\n [markerData]=\"openedInfoWindowData.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </ng-container>\n </map-info-window>\n\n <map-marker\n #markerCluster=\"mapMarker\"\n *ngFor=\"\n let marker of mapData.clusterMarkers;\n let i = index;\n trackBy: trackByPosition\n \"\n [position]=\"marker.position\"\n [icon]=\"marker.icon\"\n (mapClick)=\"onClusterMarkerClick(marker)\"\n >\n </map-marker>\n\n <ng-container *ngIf=\"isAreaFilterActive\">\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n </ng-container>\n\n <map-marker\n #markerRouting=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.routingMarkers;\n let i = index;\n trackBy: identity\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"focusedIconRouting !== i ? markeritem.label! : ''\"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onRoutingMarkerClick(i, $event, markeritem)\"\n >\n <map-info-window #infoWindowsViewRouting=\"mapInfoWindow\">\n <app-ca-map-dropdown></app-ca-map-dropdown>\n </map-info-window>\n </map-marker>\n\n <ng-container *ngIf=\"mapData.isOpenInMapShown\">\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"mapData.isZoomShown\">\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom\n }\"\n >\n <div class=\"map-zoom-buttons d-flex align-items-center\" [class.flex-column]=\"mapData.isVerticalZoom\">\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n </ng-container>\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true]{width:100px;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true]{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}\n"] }]
453
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { data: [{
376
+ ], encapsulation: ViewEncapsulation.None, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n [mapId]=\"mapStyleId\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track trackByPosition($index, clusterMarker)\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (isAreaFilterActive) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (\n routingMarker of mapData.routingMarkers;\n let i = $index;\n track trackByPosition($index, routingMarker)\n ) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true],.marker-label{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px;pointer-events:none}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}\n"] }]
377
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.MapMarkerIconService }], propDecorators: { data: [{
454
378
  type: Input
455
379
  }], resetSelectedMarkerItem: [{
456
380
  type: Output
@@ -467,8 +391,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
467
391
  }], maps: [{
468
392
  type: ViewChild,
469
393
  args: [GoogleMap, { static: false }]
470
- }], infoWindowsView: [{
394
+ }], markerDropdown: [{
395
+ type: ViewChild,
396
+ args: ['markerDropdown']
397
+ }], clusterDropdown: [{
471
398
  type: ViewChild,
472
- args: [MapInfoWindow]
399
+ args: ['clusterDropdown']
473
400
  }] } });
474
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLW1hcC9jYS1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtbWFwL2NhLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FHZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTlELGFBQWE7QUFDYixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUUzRixRQUFRO0FBQ1IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBYWhFLFVBQVU7QUFDVixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFLL0QsWUFBWTtBQUNaLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsbUJBQW1CLEdBQ3BCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7QUFvQjVELE1BQU0s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TTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDa0MsSUFBSTtzQkFBNUMsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNiLGVBQWU7c0JBQXhDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgR29vZ2xlTWFwLFxuICBHb29nbGVNYXBzTW9kdWxlLFxuICBNYXBJbmZvV2luZG93LFxuICBNYXBNYXJrZXIsXG4gIE1hcENpcmNsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvZ29vZ2xlLW1hcHMnO1xuaW1wb3J0IHsgQW5ndWxhclN2Z0ljb25Nb2R1bGUgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCB7IE5nYlRvb2x0aXBNb2R1bGUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbi8vIENvbXBvbmVudHNcbmltcG9ydCB7IENhTWFwRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi9jYS1tYXAtZHJvcGRvd24vY2EtbWFwLWRyb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCB9IGZyb20gJy4uL2NhLWFwcC10b29sdGlwLXYyL2NhLWFwcC10b29sdGlwLXYyLmNvbXBvbmVudCc7XG5cbi8vIEVudW1zXG5pbXBvcnQgeyBHb29nbGVNYXBFbnVtIH0gZnJvbSAnLi4vY2EtbWFwL2VudW1zL2dvb2dsZS1tYXAuZW51bSc7XG5cbi8vIE1vZGVsc1xuaW1wb3J0IHtcbiAgSU1hcE1hcmtlcnMsXG4gIElNYXBSb3V0ZVBhdGgsXG4gIElDYU1hcFByb3BzLFxuICBJTWFwT3B0aW9ucyxcbiAgSVJvdXRlUGF0aCxcbiAgSU1hcEJvdW5kc1pvb20sXG4gIElNYXBTZWxlY3RlZE1hcmtlckRhdGEsXG59IGZyb20gJy4uL2NhLW1hcC9tb2RlbHMvbWFwLm1vZGVsJztcblxuLy8gSGVscGVyc1xuaW1wb3J0IHsgTWFwSGVscGVyIH0gZnJvbSAnLi4vY2EtbWFwL3V0aWxzL2hlbHBlcnMvbWFwLmhlbHBlcic7XG5cbi8vIFN2Zy1yb3V0ZXNcbmltcG9ydCB7IE1hcFN2Z1JvdXRlcyB9IGZyb20gJy4vdXRpbHMvc3ZnLXJvdXRlcyc7XG5cbi8vIENvbnN0YW50c1xuaW1wb3J0IHtcbiAgTWFwSW5mb1dpbmRvd09wdGlvbnNDb25zdGFudHMsXG4gIE1hcE9wdGlvbnNDb25zdGFudHMsXG59IGZyb20gJy4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE1hcENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9tYXAuY29uc3RhbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY2EtbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhLW1hcC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgLy8gTW9kdWxlc1xuICAgIEdvb2dsZU1hcHNNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFuZ3VsYXJTdmdJY29uTW9kdWxlLFxuICAgIE5nYlRvb2x0aXBNb2R1bGUsXG5cbiAgICAvLyBDb21wb25lbnRzXG4gICAgQ2FNYXBEcm9wZG93bkNvbXBvbmVudCxcbiAgICBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCxcbiAgXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQ2FNYXBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuICBASW5wdXQoKSBzZXQgZGF0YSh2YWx1ZXM6IElDYU1hcFByb3BzKSB7XG4gICAgdGhpcy5oYW5kbGVNYXBEYXRhKHZhbHVlcyk7XG4gIH1cbiAgQE91dHB1dCgpIHJlc2V0U2VsZWN0ZWRNYXJrZXJJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgY2x1c3Rlck1hcmtlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJTWFwTWFya2Vycz4oKTtcbiAgQE91dHB1dCgpIGNsdXN0ZXJMaXN0U2Nyb2xsRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBNYXJrZXJzPigpO1xuICBAT3V0cHV0KCkgZ2V0SW5mb1dpbmRvd0RhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGJvdW5kc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBCb3VuZHNab29tPigpO1xuICBAT3V0cHV0KCkgb3BlbkluTWFwRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBWaWV3Q2hpbGQoR29vZ2xlTWFwLCB7IHN0YXRpYzogZmFsc2UgfSkgbWFwcyE6IEdvb2dsZU1hcDtcbiAgQFZpZXdDaGlsZChNYXBJbmZvV2luZG93KSBpbmZvV2luZG93c1ZpZXchOiBNYXBJbmZvV2luZG93O1xuICBwdWJsaWMgY3VycmVudGx5T3BlbldpbmRvdyE6IE1hcEluZm9XaW5kb3cgfCBudWxsO1xuICBwdWJsaWMgY3VycmVudGx5T3BlbldpbmRvd1JvdXRpbmchOiBNYXBJbmZvV2luZG93IHwgbnVsbDtcbiAgcHVibGljIHByZXZpb3VzSWNvblVybCE6IHN0cmluZztcbiAgcHVibGljIHByZXZpb3VzSWNvblVybFJvdXRpbmchOiBzdHJpbmc7XG4gIHB1YmxpYyBmb2N1c2VkSWNvblJvdXRpbmchOiBudW1iZXI7XG4gIHByaXZhdGUgZGlyZWN0aW9uU2VydmljZSA9IG5ldyBnb29nbGUubWFwcy5EaXJlY3Rpb25zU2VydmljZSgpO1xuICBwdWJsaWMgZGlyZWN0aW9uc1JlbmRlcmVyczogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlbmRlcmVyW10gPSBbXTtcbiAgcHVibGljIGluaXRpYWxJY29uczoge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGxhYmVsT3JpZ2luPzogZ29vZ2xlLm1hcHMuUG9pbnQ7XG4gIH1bXSA9IFtdO1xuICBwdWJsaWMgaW5pdGlhbE1hcmtlckljb25zOiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbGFiZWxPcmlnaW4/OiBnb29nbGUubWFwcy5Qb2ludDtcbiAgICB6SW5kZXg/OiBudW1iZXI7XG4gIH1bXSA9IFtdO1xuICBwdWJsaWMgaW5mb1dpbmRvd09wdGlvbnM6IGdvb2dsZS5tYXBzLkluZm9XaW5kb3dPcHRpb25zID1cbiAgICBNYXBJbmZvV2luZG93T3B0aW9uc0NvbnN0YW50cy5tYXBJbmZvV2luZG93T3B0aW9ucztcbiAgcHVibGljIG1hcE9wdGlvbnM6IElNYXBPcHRpb25zID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwT3B0aW9ucztcbiAgcHVibGljIG1hcFpvb206IG51bWJlciA9IE1hcE9wdGlvbnNDb25zdGFudHMuZGVmYXVsdE1hcFpvb207XG4gIHB1YmxpYyBtYXBDZW50ZXI6IElSb3V0ZVBhdGggPSBNYXBPcHRpb25zQ29uc3RhbnRzLmRlZmF1bHRNYXBDZW50ZXI7XG4gIHB1YmxpYyBtYXA6IGdvb2dsZS5tYXBzLk1hcCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgaXNNYXBDZW50ZXJTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNsdXN0ZXJNYXJrZXJzRGF0YTogSU1hcE1hcmtlcnNbXSA9IFtdO1xuICBwdWJsaWMgbWFya2Vyc0RhdGE6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgcHVibGljIG1hcERhdGE6IElDYU1hcFByb3BzID0ge307XG4gIHB1YmxpYyBvcGVuZWRJbmZvV2luZG93RGF0YTogSU1hcE1hcmtlcnMgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGFyZWFGaWx0ZXJEYXRhID0gTWFwT3B0aW9uc0NvbnN0YW50cy5hcmVhRmlsdGVyRGF0YTtcbiAgcHVibGljIGlzQXJlYUZpbHRlckFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaG92ZXJlZE1hcmtlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN0b3JlSW5pdGlhbEljb25Gb3JNYXJrZXIoKTtcbiAgICB0aGlzLnN0b3JlSW5pdGlhbEljb25Gb3JSb3V0aW5nTWFya2VyKCk7XG4gICAgLy8gUmVzZXQgYWxsIGljb25zIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUgb24gcGFnZSBsb2FkXG4gICAgdGhpcy5yZXNldE1hcmtlcnNJY29ucygpO1xuICAgIHRoaXMucmVzZXRSb3V0aW5nTWFya2VycygpO1xuICB9XG5cbiAgcHVibGljIHN0b3JlSW5pdGlhbEljb25Gb3JNYXJrZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsTWFya2VySWNvbnMgPSBbXTtcblxuICAgIHRoaXMubWFwRGF0YSEubWFya2Vycz8uZm9yRWFjaCgobWFya2VyOiBJTWFwTWFya2VycywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5pbml0aWFsTWFya2VySWNvbnNbaW5kZXhdID0ge1xuICAgICAgICB1cmw6IG1hcmtlci5pY29uIS51cmwsXG4gICAgICAgIGxhYmVsT3JpZ2luOiBtYXJrZXIuaWNvbiEubGFiZWxPcmlnaW4sXG4gICAgICAgIHpJbmRleDogbWFya2VyLm9wdGlvbnM/LnpJbmRleCA/PyAxLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9yZUluaXRpYWxJY29uRm9yUm91dGluZ01hcmtlcigpOiB2b2lkIHtcbiAgICB0aGlzLm1hcERhdGEucm91dGluZ01hcmtlcnM/LmZvckVhY2goXG4gICAgICAobWFya2VyOiBJTWFwTWFya2VycywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICB0aGlzLmluaXRpYWxJY29uc1tpbmRleF0gPSB7XG4gICAgICAgICAgdXJsOiBtYXJrZXIuaWNvbiEudXJsLFxuICAgICAgICAgIGxhYmVsT3JpZ2luOiBtYXJrZXIuaWNvbiEubGFiZWxPcmlnaW4sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsdXN0ZXJNYXJrZXJDbGljayhtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgIGNvbnN0IGlzSW5mb1dpbmRvd09wZW5lZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICBtYXJrZXJJdGVtLFxuICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICk7XG5cbiAgICBpZiAoIWlzSW5mb1dpbmRvd09wZW5lZCkgdGhpcy5jbHVzdGVyTWFya2VyQ2xpY2suZW1pdChtYXJrZXJJdGVtKTtcbiAgICBlbHNlIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya2VySW5mb1dpbmRvdyhtYXJrZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKG1hcmtlcklkKSB0aGlzLmdldEluZm9XaW5kb3dEYXRhLmVtaXQobWFya2VySWQpO1xuICB9XG5cbiAgcHVibGljIG9uTWFya2VyQ2xpY2sobWFya2VySXRlbTogSU1hcE1hcmtlcnMpOiB2b2lkIHtcbiAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgbWFya2VySXRlbSxcbiAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICApO1xuXG4gICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHRoaXMuZ2V0TWFya2VySW5mb1dpbmRvdyhtYXJrZXJJdGVtLmRhdGEuaWQpO1xuICAgIGVsc2UgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXJlY3Rpb25zT25NYXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwcz8uZ29vZ2xlTWFwKSB7XG4gICAgICB0aGlzLmRpcmVjdGlvbnNSZW5kZXJlcnMuZm9yRWFjaCgocmVuZGVyZXIpID0+XG4gICAgICAgIHJlbmRlcmVyLnNldE1hcCh0aGlzLm1hcHM/Lmdvb2dsZU1hcCEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVBbmREaXNwbGF5Um91dGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwRGF0YS5yb3V0ZVBhdGhzKSB7XG4gICAgICAvLyBDbGVhciBwcmV2aW91cyBkaXJlY3Rpb25zIHJlbmRlcmVyc1xuICAgICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyZXJzLmZvckVhY2goKHJlbmRlcmVyKSA9PiByZW5kZXJlci5zZXRNYXAobnVsbCkpO1xuICAgICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyZXJzID0gW107XG5cbiAgICAgIHRoaXMubWFwRGF0YS5yb3V0ZVBhdGhzIS5mb3JFYWNoKChyb3V0ZTogSU1hcFJvdXRlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVxdWVzdCA9IHtcbiAgICAgICAgICBvcmlnaW46IHJvdXRlLnBhdGhbMF0sXG4gICAgICAgICAgZGVzdGluYXRpb246IHJvdXRlLnBhdGhbcm91dGUucGF0aC5sZW5ndGggLSAxXSxcbiAgICAgICAgICB3YXlwb2ludHM6IHJvdXRlLnBhdGhcbiAgICAgICAgICAgIC5zbGljZSgxLCByb3V0ZS5wYXRoLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAubWFwKChwb3NpdGlvbikgPT4gKHsgbG9jYXRpb246IHBvc2l0aW9uIH0pKSxcbiAgICAgICAgICB0cmF2ZWxNb2RlOiBnb29nbGUubWFwcy5UcmF2ZWxNb2RlLkJJQ1lDTElORyxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpcmVjdGlvblNlcnZpY2Uucm91dGUocmVxdWVzdCwgKHJlc3VsdCwgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1N0YXR1cy5PSyAmJiByZXN1bHQ/LnJvdXRlc1swXSkge1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uc1JlbmRlcmVyID0gbmV3IGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZW5kZXJlcih7XG4gICAgICAgICAgICAgIHN1cHByZXNzSW5mb1dpbmRvd3M6IHRydWUsXG4gICAgICAgICAgICAgIHN1cHByZXNzTWFya2VyczogdHJ1ZSxcbiAgICAgICAgICAgICAgcHJlc2VydmVWaWV3cG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgcG9seWxpbmVPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHJvdXRlLnN0cm9rZUNvbG9yIHx8IEdvb2dsZU1hcEVudW0uU1RST0tFX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZU9wYWNpdHk6ICFyb3V0ZS5pc0Rhc2hlZFxuICAgICAgICAgICAgICAgICAgPyByb3V0ZS5zdHJva2VPcGFjaXR5IHx8IEdvb2dsZU1hcEVudW0uU1RST0tFX09QQUNJVFlcbiAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICBzdHJva2VXZWlnaHQ6IHJvdXRlLnN0cm9rZVdlaWdodCB8fCBHb29nbGVNYXBFbnVtLlNUUk9LRV9XRUlHSFQsXG4gICAgICAgICAgICAgICAgaWNvbnM6IHJvdXRlLmlzRGFzaGVkXG4gICAgICAgICAgICAgICAgICA/IHJvdXRlLmRhc2hlZExpbmVTdHlsZSA/P1xuICAgICAgICAgICAgICAgICAgICBNYXBPcHRpb25zQ29uc3RhbnRzLnJvdXRpbmdEYXNoZWRMaW5lSWNvblxuICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaXJlY3Rpb25zUmVuZGVyZXIuc2V0RGlyZWN0aW9ucyhyZXN1bHQpO1xuICAgICAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyZXJzLnB1c2goZGlyZWN0aW9uc1JlbmRlcmVyKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uc09uTWFwKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUm91dGluZ01hcmtlckNsaWNrKFxuICAgIGk6IG51bWJlcixcbiAgICBldmVudDogZ29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudCxcbiAgICBtYXJrZXJpdGVtOiBJTWFwTWFya2Vyc1xuICApOiB2b2lkIHtcbiAgICAvLyBpZiAobWFya2VyaXRlbT8uaW5mb1dpbmRvd0NvbnRlbnQpIHtcbiAgICAvLyAgIGlmIChcbiAgICAvLyAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93SW5kZXhSb3V0aW5nID09PSBpICYmXG4gICAgLy8gICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvd1JvdXRpbmdcbiAgICAvLyAgICkge1xuICAgIC8vICAgICBjb25zdCBpbmZvV2luZG93ID0gdGhpcy5pbmZvV2luZG93c1ZpZXdSb3V0aW5nLnRvQXJyYXkoKVtpXTtcbiAgICAvLyAgICAgLy8gQ2xvc2UgdGhlIGN1cnJlbnRseSBvcGVuIGluZm8gd2luZG93IGFuZCByZXNldCB0aGUgaW5kZXhcbiAgICAvLyAgICAgdGhpcy5tYXBEYXRhLnJvdXRpbmdNYXJrZXJzIS5tYXAoKGl0ZW06IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgLy8gICAgICAgaWYgKGluZGV4ID09PSBpKSB7XG4gICAgLy8gICAgICAgICBpdGVtLmljb24gPSB7XG4gICAgLy8gICAgICAgICAgIHVybDogdGhpcy5pbml0aWFsSWNvbnNbaW5kZXhdIS51cmwsXG4gICAgLy8gICAgICAgICAgIGxhYmVsT3JpZ2luOiB0aGlzLmluaXRpYWxJY29uc1tpbmRleF0hLmxhYmVsT3JpZ2luLFxuICAgIC8vICAgICAgICAgfTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICBpbmZvV2luZG93LmNsb3NlKCk7XG4gICAgLy8gICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvd0luZGV4Um91dGluZyA9IG51bGw7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBjb25zdCBtYXJrZXJJbmRleCA9IHRoaXMubWFya2VyUm91dGluZy50b0FycmF5KClbaV07XG4gICAgLy8gICAgIGNvbnN0IGluZm9XaW5kb3cgPSB0aGlzLmluZm9XaW5kb3dzVmlld1JvdXRpbmcudG9BcnJheSgpW2ldO1xuICAgIC8vICAgICBpZiAodGhpcy5jdXJyZW50bHlPcGVuV2luZG93Um91dGluZykge1xuICAgIC8vICAgICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvd1JvdXRpbmcuY2xvc2UoKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZiAoaW5mb1dpbmRvdykge1xuICAgIC8vICAgICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIGljb24gZm9yIHRoZSBwcmV2aW91c2x5IGZvY3VzZWQgcm91dGluZyBtYXJrZXJcbiAgICAvLyAgICAgICBpZiAoXG4gICAgLy8gICAgICAgICB0aGlzLmZvY3VzZWRJY29uUm91dGluZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgLy8gICAgICAgICB0aGlzLmZvY3VzZWRJY29uUm91dGluZyAhPT0gaVxuICAgIC8vICAgICAgICkge1xuICAgIC8vICAgICAgICAgY29uc3QgcHJldmlvdXNGb2N1c2VkSXRlbSA9XG4gICAgLy8gICAgICAgICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2VycyFbdGhpcy5mb2N1c2VkSWNvblJvdXRpbmddO1xuICAgIC8vICAgICAgICAgaWYgKHByZXZpb3VzRm9jdXNlZEl0ZW0pIHtcbiAgICAvLyAgICAgICAgICAgcHJldmlvdXNGb2N1c2VkSXRlbS5pY29uID0ge1xuICAgIC8vICAgICAgICAgICAgIHVybDogdGhpcy5pbml0aWFsSWNvbnNbdGhpcy5mb2N1c2VkSWNvblJvdXRpbmddLnVybCxcbiAgICAvLyAgICAgICAgICAgICBsYWJlbE9yaWdpbjpcbiAgICAvLyAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbEljb25zW3RoaXMuZm9jdXNlZEljb25Sb3V0aW5nXS5sYWJlbE9yaWdpbixcbiAgICAvLyAgICAgICAgICAgfTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IG1hcmtlclxuICAgIC8vICAgICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2VycyEubWFwKFxuICAgIC8vICAgICAgICAgKGl0ZW06IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgLy8gICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xuICAgIC8vICAgICAgICAgICAgIHRoaXMucHJldmlvdXNJY29uVXJsUm91dGluZyA9IGl0ZW0uaWNvbiA/IGl0ZW0uaWNvbi51cmwgOiAnJztcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmZvY3VzZWRJY29uUm91dGluZyA9IGk7XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93TGFiZWwgPSBmYWxzZTtcbiAgICAvLyAgICAgICAgICAgICBpdGVtLmljb24gPSB7XG4gICAgLy8gICAgICAgICAgICAgICB1cmw6XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMubWFwRGF0YS5pc1VuaXRWaWV3U3RvcHMgfHwgdGhpcy5tYXBEYXRhLmlzRHJpdmVyTWlsZXNcbiAgICAvLyAgICAgICAgICAgICAgICAgICA/IGl0ZW0uaWNvbiEudXJsXG4gICAgLy8gICAgICAgICAgICAgICAgICAgOiBNYXBTdmdSb3V0ZXMubWFya2VyU3ZnUm91dGUsXG4gICAgLy8gICAgICAgICAgICAgfTtcbiAgICAvLyAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3dMYWJlbCA9IHRydWU7XG4gICAgLy8gICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICApO1xuICAgIC8vICAgICAgIGluZm9XaW5kb3cub3BlbihtYXJrZXJJbmRleCk7XG4gICAgLy8gICAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93Um91dGluZyA9IGluZm9XaW5kb3c7XG4gICAgLy8gICAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93SW5kZXhSb3V0aW5nID0gaTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vICAgdGhpcy5tYXJrZXJDbGljay5lbWl0KG1hcmtlcml0ZW0pO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMubWFwcy5nb29nbGVNYXA/LmFkZExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG5cbiAgICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2Vycz8ubWFwKChpdGVtOiBJTWFwTWFya2VycywgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChpID09PSB0aGlzLmZvY3VzZWRJY29uUm91dGluZykge1xuICAgICAgICAgIGl0ZW0uaWNvbiA9IHtcbiAgICAgICAgICAgIHVybDogdGhpcy5pbml0aWFsSWNvbnNbaV0udXJsLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0TWFya2Vyc0ljb25zKCk6IHZvaWQge1xuICAgIHRoaXMubWFwRGF0YS5tYXJrZXJzPy5tYXAoKG1hcmtlcjogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm1hcmtlcixcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIC4uLm1hcmtlci5pY29uLFxuICAgICAgICAgIHNjYWxlZFNpemU6IG1hcmtlci5pc0xhcmdlTWFya2VyXG4gICAgICAgICAgICA/IE1hcE9wdGlvbnNDb25zdGFudHMubGFyZ2VNYXJrZXJTaXplXG4gICAgICAgICAgICA6IE1hcE9wdGlvbnNDb25zdGFudHMuZGVmYXVsdE1hcmtlclNpemUsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnM6IHsgekluZGV4OiBpbmRleCArIDEgfSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFJvdXRpbmdNYXJrZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2Vycz8uZm9yRWFjaChcbiAgICAgIChtYXJrZXI6IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIG1hcmtlci5pY29uID0ge1xuICAgICAgICAgIHVybDogbWFya2VyLmljb24hLnVybCxcbiAgICAgICAgICBsYWJlbE9yaWdpbjogbWFya2VyLmljb24hLmxhYmVsT3JpZ2luLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25NYXBSZWFkeShtYXBJbnN0YW5jZTogZ29vZ2xlLm1hcHMuTWFwKToge1xuICAgIGZpbGxDb2xvcj86IHN0cmluZztcbiAgICBzdHJva2VDb2xvcj86IHN0cmluZztcbiAgICBzdHJva2VXZWlnaHQ/OiBudW1iZXI7XG4gICAgZmlsbE9wYWNpdHk/OiBudW1iZXI7XG4gIH0gfCB2b2lkIHtcbiAgICB0aGlzLm1hcCA9IG1hcEluc3RhbmNlO1xuXG4gICAgaWYgKHRoaXMubWFwRGF0YS5zdGF0ZUJvdW5kYXJpZXNVcmwpIHtcbiAgICAgIGNvbnN0IHN0YXRlQm91bmRhcmllc1VybCA9IHRoaXMubWFwRGF0YS5zdGF0ZUJvdW5kYXJpZXNVcmwudXJsO1xuICAgICAgdGhpcy5tYXBzLmdvb2dsZU1hcD8uZGF0YS5sb2FkR2VvSnNvbihzdGF0ZUJvdW5kYXJpZXNVcmwpO1xuXG4gICAgICB0aGlzLm1hcHMuZ29vZ2xlTWFwPy5kYXRhLnNldFN0eWxlKChmZWF0dXJlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlRGVuc2l0eSA9IGZlYXR1cmUuZ2V0UHJvcGVydHkoJ2RlbnNpdHknKTtcbiAgICAgICAgY29uc3QgeyBmaWxsQ29sb3IsIGZpbGxPcGFjaXR5IH0gPSBNYXBIZWxwZXIuZ2V0RmlsbENvbG9yRm9yU3RhdGUoXG4gICAgICAgICAgc3RhdGVEZW5zaXR5IGFzIG51bWJlcixcbiAgICAgICAgICB0aGlzLm1hcERhdGEudmlldyB8fCAnJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpbGxDb2xvcjogZmlsbENvbG9yLFxuICAgICAgICAgIHN0cm9rZUNvbG9yOiAnI0VFRUVFRScsXG4gICAgICAgICAgc3Ryb2tlV2VpZ2h0OiAwLjYsXG4gICAgICAgICAgZmlsbE9wYWNpdHk6IGZpbGxPcGFjaXR5LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZW5kQm91bmRzQ2hhbmdlZEV2ZW50KCk7XG4gICAgdGhpcy5zZXRNYXBTdHlsZXMoKTtcbiAgICB0aGlzLmdldE1hcElkbGVFdmVudChtYXBJbnN0YW5jZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0TWFwU3R5bGVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcERhdGE/LmRhcmtNb2RlKVxuICAgICAgdGhpcy5tYXBPcHRpb25zID0ge1xuICAgICAgICAuLi50aGlzLm1hcE9wdGlvbnMsXG4gICAgICAgIHN0eWxlczogTWFwQ29uc3RhbnRzLkdPT0dMRV9NQVBfREFSS19TVFlMRVMsXG4gICAgICB9O1xuXG4gICAgY29uc3QgYWxsTWFya2Vyc0NvbWJpbmVkID0gW1xuICAgICAgLi4uKHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2VycyA/PyBbXSksXG4gICAgICAuLi4odGhpcy5tYXBEYXRhLmNsdXN0ZXJNYXJrZXJzID8/IFtdKSxcbiAgICAgIC4uLih0aGlzLm1hcERhdGEubWFya2VycyA/PyBbXSksXG4gICAgXTtcblxuICAgIGlmIChhbGxNYXJrZXJzQ29tYmluZWQ/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWFwQ2VudGVyQW5kQm91bmRzID1cbiAgICAgICAgTWFwSGVscGVyLmdldE1hcENlbnRlckFuZFpvb20oYWxsTWFya2Vyc0NvbWJpbmVkKTtcblxuICAgICAgdGhpcy5tYXAhLnBhblRvKG1hcENlbnRlckFuZEJvdW5kcy5tYXBDZW50ZXIpO1xuICAgICAgaWYgKG1hcENlbnRlckFuZEJvdW5kcy5ib3VuZHMpXG4gICAgICAgIHRoaXMubWFwPy5maXRCb3VuZHMobWFwQ2VudGVyQW5kQm91bmRzLmJvdW5kcyk7XG4gICAgICBpZiAobWFwQ2VudGVyQW5kQm91bmRzLm1hcFpvb20pXG4gICAgICAgIHRoaXMubWFwPy5zZXRab29tKG1hcENlbnRlckFuZEJvdW5kcy5tYXBab29tKTtcblxuICAgICAgdGhpcy5pc01hcENlbnRlclNldCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1hcElkbGVFdmVudChtYXA6IGdvb2dsZS5tYXBzLk1hcCk6IHZvaWQge1xuICAgIG1hcC5hZGRMaXN0ZW5lcignaWRsZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmRCb3VuZHNDaGFuZ2VkRXZlbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICBjb25zdCBtYXBCb3VuZHMgPSB0aGlzLm1hcC5nZXRCb3VuZHMoKTtcbiAgICAgIGNvbnN0IG1hcFpvb20gPSB0aGlzLm1hcC5nZXRab29tKCk7XG5cbiAgICAgIGlmIChtYXBCb3VuZHMgJiYgbWFwWm9vbSkge1xuICAgICAgICBjb25zdCBib3VuZHNPYmplY3QgPSB7IGJvdW5kczogbWFwQm91bmRzLCB6b29tOiBtYXBab29tIH07XG4gICAgICAgIHRoaXMuYm91bmRzQ2hhbmdlZC5lbWl0KGJvdW5kc09iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0U2VsZWN0ZWRNYXJrZXJJdGVtLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE5ld0RhdGEoZGF0YTogSUNhTWFwUHJvcHMpOiBJQ2FNYXBQcm9wcyB7XG4gICAgY29uc3QgbmV3TWFya2VycyA9IGRhdGE/Lm1hcmtlcnM/Lm1hcCgobWFya2VyOiBJTWFwTWFya2VycykgPT4ge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZE1hcmtlciA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgIG1hcmtlcixcbiAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICAgKTtcblxuICAgICAgaWYgKGlzU2VsZWN0ZWRNYXJrZXIpIHtcbiAgICAgICAgY29uc3QgbmV3TWFya2VyRGF0YSA9IHtcbiAgICAgICAgICAuLi5tYXJrZXIsXG4gICAgICAgICAgaWNvbjoge1xuICAgICAgICAgICAgLi4ubWFya2VyLmljb24sXG4gICAgICAgICAgICBzY2FsZWRTaXplOiBNYXBPcHRpb25zQ29uc3RhbnRzLmxhcmdlTWFya2VyU2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnM6IHsgekluZGV4OiA5OTkgfSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV3TWFya2VyRGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgbWFya2VyczogbmV3TWFya2VycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIG9wZW5NYXJrZXJJbmZvV2luZG93KG1hcmtlckl0ZW06IElNYXBTZWxlY3RlZE1hcmtlckRhdGEpOiB2b2lkIHtcbiAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgbWFya2VySXRlbSxcbiAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICApO1xuXG4gICAgY29uc3QgaXNDbHVzdGVySXRlbUNoYW5nZWQgPSB0aGlzLmNoZWNrQ2x1c3RlckRhdGFDaGFuZ2VzKFxuICAgICAgbWFya2VySXRlbSxcbiAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvd3NWaWV3ICYmICghaXNJbmZvV2luZG93T3BlbmVkIHx8IGlzQ2x1c3Rlckl0ZW1DaGFuZ2VkKSkge1xuICAgICAgdGhpcy5tYXBEYXRhLm1hcmtlcnMhLm1hcCgoaXRlbTogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZE1hcmtlciA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oaXRlbSwgbWFya2VySXRlbSk7XG4gICAgICAgIGlmIChpc1NlbGVjdGVkTWFya2VyKSB7XG4gICAgICAgICAgaXRlbS5pY29uID0ge1xuICAgICAgICAgICAgLi4uaXRlbS5pY29uLFxuICAgICAgICAgICAgc2NhbGVkU2l6ZTogTWFwT3B0aW9uc0NvbnN0YW50cy5sYXJnZU1hcmtlclNpemUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVtLm9wdGlvbnMgPSB7IHpJbmRleDogOTk5IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbS5pY29uID0ge1xuICAgICAgICAgICAgLi4uaXRlbS5pY29uLFxuICAgICAgICAgICAgc2NhbGVkU2l6ZTogaXRlbS5pc0xhcmdlTWFya2VyXG4gICAgICAgICAgICAgID8gTWFwT3B0aW9uc0NvbnN0YW50cy5sYXJnZU1hcmtlclNpemVcbiAgICAgICAgICAgICAgOiBNYXBPcHRpb25zQ29uc3RhbnRzLmRlZmF1bHRNYXJrZXJTaXplLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaXRlbS5vcHRpb25zID0geyB6SW5kZXg6IGluZGV4ICsgMSB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93ID0gdGhpcy5pbmZvV2luZG93c1ZpZXc7XG4gICAgICB0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhID0gbWFya2VySXRlbTtcblxuICAgICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHtcbiAgICAgICAgdGhpcy5tYXAhLnBhblRvKG1hcmtlckl0ZW0ucG9zaXRpb24pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5mb1dpbmRvd09wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmluZm9XaW5kb3dPcHRpb25zLFxuICAgICAgICAgICAgcG9zaXRpb246IG1hcmtlckl0ZW0ucG9zaXRpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmluZm9XaW5kb3dzVmlldy5vcGVuKCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICBtYXJrZXJJdGVtOiBJTWFwTWFya2VycyxcbiAgICBtYXJrZXJJdGVtMj86IElNYXBNYXJrZXJzIHwgbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgbWFya2VySXRlbS5wb3NpdGlvbi5sYXQgPT09IG1hcmtlckl0ZW0yPy5wb3NpdGlvbj8ubGF0ICYmXG4gICAgICBtYXJrZXJJdGVtLnBvc2l0aW9uLmxuZyA9PT0gbWFya2VySXRlbTI/LnBvc2l0aW9uPy5sbmdcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsb3NlSW5mb1dpbmRvdygpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0TWFya2Vyc0ljb25zKCk7XG5cbiAgICB0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cgPSBudWxsO1xuICAgIHRoaXMuaW5mb1dpbmRvd3NWaWV3LmNsb3NlKCk7XG4gICAgdGhpcy5yZXNldFNlbGVjdGVkTWFya2VySXRlbS5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTWFwRGF0YShuZXdEYXRhOiBJQ2FNYXBQcm9wcyk6IHZvaWQge1xuICAgIHRoaXMubWFwRGF0YSA9IHRoaXMuZ2V0TmV3RGF0YShuZXdEYXRhKTtcblxuICAgIGlmICh0aGlzLm1hcERhdGEuc2VsZWN0ZWRNYXJrZXJEYXRhKVxuICAgICAgdGhpcy5vcGVuTWFya2VySW5mb1dpbmRvdyh0aGlzLm1hcERhdGEuc2VsZWN0ZWRNYXJrZXJEYXRhKTtcbiAgICBlbHNlIGlmICh0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cpIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG5cbiAgICBpZiAobmV3RGF0YSAmJiAhdGhpcy5pc01hcENlbnRlclNldCAmJiB0aGlzLm1hcCkge1xuICAgICAgaWYgKFxuICAgICAgICBuZXdEYXRhLm1hcmtlcnM/Lmxlbmd0aCB8fFxuICAgICAgICBuZXdEYXRhLmNsdXN0ZXJNYXJrZXJzPy5sZW5ndGggfHxcbiAgICAgICAgbmV3RGF0YS5yb3V0aW5nTWFya2Vycz8ubGVuZ3RoXG4gICAgICApXG4gICAgICAgIHRoaXMuc2V0TWFwU3R5bGVzKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIERpc3BsYXkgcm91dGVzIGZvciByb3V0aW5nTWFya2Vyc1xuICAgIHRoaXMuY2FsY3VsYXRlQW5kRGlzcGxheVJvdXRlKCk7XG5cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEpXG4gICAgICB0aGlzLmNsdXN0ZXJMaXN0U2Nyb2xsRXZlbnQuZW1pdCh0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0NsdXN0ZXJEYXRhQ2hhbmdlcyhcbiAgICBuZXdEYXRhOiBJTWFwTWFya2VycyxcbiAgICBwcmV2aW91c0RhdGE/OiBJTWFwTWFya2VycyB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5ld0RhdGEuaW5mb1dpbmRvd0NvbnRlbnQ/LmNsdXN0ZXJEYXRhXG4gICAgICA/IG5ld0RhdGEuaW5mb1dpbmRvd0NvbnRlbnQ/LnNlbGVjdGVkQ2x1c3Rlckl0ZW1EYXRhPy5kYXRhPy5pZCAhPT1cbiAgICAgICAgICBwcmV2aW91c0RhdGE/LmluZm9XaW5kb3dDb250ZW50Py5zZWxlY3RlZENsdXN0ZXJJdGVtRGF0YT8uZGF0YT8uaWQgfHxcbiAgICAgICAgICBuZXdEYXRhLmluZm9XaW5kb3dDb250ZW50Py5jbHVzdGVyRGF0YT8ubGVuZ3RoICE9PVxuICAgICAgICAgICAgcHJldmlvdXNEYXRhPy5pbmZvV2luZG93Q29udGVudD8uY2x1c3RlckRhdGE/Lmxlbmd0aFxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1hcmtlck1vdXNlb3ZlcihtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgIGlmIChtYXJrZXJJdGVtPy5sYWJlbD8uaXNTaG93T25Ib3ZlcilcbiAgICAgIHRoaXMuaG92ZXJlZE1hcmtlcklkID0gbWFya2VySXRlbT8uZGF0YT8uaWQ7XG4gIH1cblxuICBwdWJsaWMgb25NYXJrZXJNb3VzZW91dChtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgIGlmIChtYXJrZXJJdGVtPy5sYWJlbD8uaXNTaG93T25Ib3ZlcikgdGhpcy5ob3ZlcmVkTWFya2VySWQgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uWm9vbUNoYW5nZShpc01pbnVzQ2xpY2s/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFpvb21MZXZlbCA9IHRoaXMubWFwPy5nZXRab29tKCk7XG5cbiAgICBpZiAoY3VycmVudFpvb21MZXZlbCkge1xuICAgICAgY29uc3QgbmV4dFpvb21MZXZlbCA9IGlzTWludXNDbGlja1xuICAgICAgICA/IGN1cnJlbnRab29tTGV2ZWwgLSAxXG4gICAgICAgIDogY3VycmVudFpvb21MZXZlbCArIDE7XG4gICAgICB0aGlzLm1hcD8uc2V0Wm9vbShuZXh0Wm9vbUxldmVsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25PcGVuSW5NYXAoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuSW5NYXBFdmVudC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIG1hcmtlcjogSU1hcE1hcmtlcnMpOiBudW1iZXIge1xuICAgIHJldHVybiBtYXJrZXIuZGF0YS5pZDtcbiAgfVxuXG4gIHB1YmxpYyB0cmFja0J5UG9zaXRpb24oaW5kZXg6IG51bWJlciwgbWFya2VyOiBJTWFwTWFya2Vycyk6IG51bWJlciB7XG4gICAgcmV0dXJuIG1hcmtlci5wb3NpdGlvbi5sYXQgKyBtYXJrZXIucG9zaXRpb24ubG5nO1xuICB9XG5cbiAgcHVibGljIGlkZW50aXR5KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT4gcmVuZGVyZXIuc2V0TWFwKG51bGwpKTtcbiAgfVxufVxuIiwiPGdvb2dsZS1tYXBcbiAgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiXG4gIFtjbGFzcy5kYXJrLW1vZGUtbWFwXT1cIm1hcERhdGEuZGFya01vZGVcIlxuICBoZWlnaHQ9XCIxMDAlXCJcbiAgd2lkdGg9XCIxMDAlXCJcbiAgW3pvb21dPVwibWFwWm9vbVwiXG4gIFtjZW50ZXJdPVwibWFwQ2VudGVyXCJcbiAgW29wdGlvbnNdPVwibWFwT3B0aW9uc1wiXG4gIChtYXBJbml0aWFsaXplZCk9XCJvbk1hcFJlYWR5KCRldmVudClcIlxuPlxuICA8bWFwLW1hcmtlclxuICAgICNtYXJrZXI9XCJtYXBNYXJrZXJcIlxuICAgICpuZ0Zvcj1cIlxuICAgICAgbGV0IG1hcmtlcml0ZW0gb2YgbWFwRGF0YS5tYXJrZXJzO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHRyYWNrQnk6IHRyYWNrQnlJZFxuICAgIFwiXG4gICAgW3Bvc2l0aW9uXT1cIm1hcmtlcml0ZW0ucG9zaXRpb25cIlxuICAgIFtpY29uXT1cIm1hcmtlcml0ZW0uaWNvbiFcIlxuICAgIFtsYWJlbF09XCJcbiAgICAgIChvcGVuZWRJbmZvV2luZG93RGF0YT8ucG9zaXRpb24/LmxhdCA9PT0gbWFya2VyaXRlbT8ucG9zaXRpb24/LmxhdCAmJlxuICAgICAgICBvcGVuZWRJbmZvV2luZG93RGF0YT8ucG9zaXRpb24/LmxuZyA9PT0gbWFya2VyaXRlbT8ucG9zaXRpb24/LmxuZykgfHxcbiAgICAgIChtYXJrZXJpdGVtLmxhYmVsPy5pc1Nob3dPbkhvdmVyICYmXG4gICAgICAgIGhvdmVyZWRNYXJrZXJJZCAhPT0gbWFya2VyaXRlbS5kYXRhLmlkKVxuICAgICAgICA/ICcnXG4gICAgICAgIDogbWFya2VyaXRlbS5sYWJlbCFcbiAgICBcIlxuICAgIFtvcHRpb25zXT1cIm1hcmtlcml0ZW0ub3B0aW9ucyFcIlxuICAgIChtYXBDbGljayk9XCJvbk1hcmtlckNsaWNrKG1hcmtlcml0ZW0pXCJcbiAgICAobWFwTW91c2VvdmVyKT1cIm9uTWFya2VyTW91c2VvdmVyKG1hcmtlcml0ZW0pXCJcbiAgICAobWFwTW91c2VvdXQpPVwib25NYXJrZXJNb3VzZW91dChtYXJrZXJpdGVtKVwiXG4gID5cbiAgPC9tYXAtbWFya2VyPlxuXG4gIDxtYXAtaW5mby13aW5kb3dcbiAgICAjaW5mb1dpbmRvd3NWaWV3PVwibWFwSW5mb1dpbmRvd1wiXG4gICAgW29wdGlvbnNdPVwiaW5mb1dpbmRvd09wdGlvbnNcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZW5lZEluZm9XaW5kb3dEYXRhICE9PSBudWxsXCI+XG4gICAgICA8YXBwLWNhLW1hcC1kcm9wZG93blxuICAgICAgICBbaW5mb1dpbmRvd0NvbnRlbnRdPVwib3BlbmVkSW5mb1dpbmRvd0RhdGEuaW5mb1dpbmRvd0NvbnRlbnRcIlxuICAgICAgICBbbWFya2VyRGF0YV09XCJvcGVuZWRJbmZvV2luZG93RGF0YS5kYXRhXCJcbiAgICAgICAgKG9uQ2x1c3Rlckl0ZW1DbGljayk9XCJnZXRNYXJrZXJJbmZvV2luZG93KCRldmVudClcIlxuICAgICAgICAob25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKT1cIm9uQ2x1c3Rlckxpc3RTY3JvbGxUb0VuZCgpXCJcbiAgICAgICAgKG9uQmFja0J1dHRvbkNsaWNrKT1cIm9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpXCJcbiAgICAgID48L2FwcC1jYS1tYXAtZHJvcGRvd24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWFwLWluZm8td2luZG93PlxuXG4gIDxtYXAtbWFya2VyXG4gICAgI21hcmtlckNsdXN0ZXI9XCJtYXBNYXJrZXJcIlxuICAgICpuZ0Zvcj1cIlxuICAgICAgbGV0IG1hcmtlciBvZiBtYXBEYXRhLmNsdXN0ZXJNYXJrZXJzO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHRyYWNrQnk6IHRyYWNrQnlQb3NpdGlvblxuICAgIFwiXG4gICAgW3Bvc2l0aW9uXT1cIm1hcmtlci5wb3NpdGlvblwiXG4gICAgW2ljb25dPVwibWFya2VyLmljb25cIlxuICAgIChtYXBDbGljayk9XCJvbkNsdXN0ZXJNYXJrZXJDbGljayhtYXJrZXIpXCJcbiAgPlxuICA8L21hcC1tYXJrZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQXJlYUZpbHRlckFjdGl2ZVwiPlxuICAgIDxtYXAtY2lyY2xlXG4gICAgICBbb3B0aW9uc109XCJhcmVhRmlsdGVyRGF0YS5vcHRpb25zXCJcbiAgICAgIFtjZW50ZXJdPVwiYXJlYUZpbHRlckRhdGEuY2VudGVyXCJcbiAgICAgIFtyYWRpdXNdPVwiYXJlYUZpbHRlckRhdGEucmFkaXVzXCJcbiAgICA+PC9tYXAtY2lyY2xlPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bWFwLW1hcmtlclxuICAgICNtYXJrZXJSb3V0aW5nPVwibWFwTWFya2VyXCJcbiAgICAqbmdGb3I9XCJcbiAgICAgIGxldCBtYXJrZXJpdGVtIG9mIG1hcERhdGEucm91dGluZ01hcmtlcnM7XG4gICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgdHJhY2tCeTogaWRlbnRpdHlcbiAgICBcIlxuICAgIFtwb3NpdGlvbl09XCJtYXJrZXJpdGVtLnBvc2l0aW9uXCJcbiAgICBbaWNvbl09XCJtYXJrZXJpdGVtLmljb24hXCJcbiAgICBbbGFiZWxdPVwiZm9jdXNlZEljb25Sb3V0aW5nICE9PSBpID8gbWFya2VyaXRlbS5sYWJlbCEgOiAnJ1wiXG4gICAgW29wdGlvbnNdPVwibWFya2VyaXRlbS5vcHRpb25zIVwiXG4gICAgKG1hcENsaWNrKT1cIm9uUm91dGluZ01hcmtlckNsaWNrKGksICRldmVudCwgbWFya2VyaXRlbSlcIlxuICA+XG4gICAgPG1hcC1pbmZvLXdpbmRvdyAjaW5mb1dpbmRvd3NWaWV3Um91dGluZz1cIm1hcEluZm9XaW5kb3dcIj5cbiAgICAgIDxhcHAtY2EtbWFwLWRyb3Bkb3duPjwvYXBwLWNhLW1hcC1kcm9wZG93bj5cbiAgICA8L21hcC1pbmZvLXdpbmRvdz5cbiAgPC9tYXAtbWFya2VyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXBEYXRhLmlzT3BlbkluTWFwU2hvd25cIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIm9wZW4taW4tbWFwLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxuICAgICAgbmdiVG9vbHRpcFxuICAgICAgbWFpbkNhVG9vbHRpcD1cIk9wZW4gaW4gTWFwXCJcbiAgICAgIHRvb2x0aXBCYWNrZ3JvdW5kPVwiIzQyNDI0MlwiXG4gICAgICBwb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwib25PcGVuSW5NYXAoKVwiXG4gICAgPlxuICAgICAgPHN2Zy1pY29uXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgc3JjPVwiYXNzZXRzL2NhLWNvbXBvbmVudHMvc3ZnL2NvbW1vbi9pY19sb2NhdGlvbl9tYXAuc3ZnXCJcbiAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTgsICdoZWlnaHQucHgnOiAxOCB9XCJcbiAgICAgID48L3N2Zy1pY29uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwRGF0YS5pc1pvb21TaG93blwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibWFwLXpvb20tY29udGFpbmVyIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1lbmQgZ2FwLTFcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnZmxleC1jb2x1bW4nOiAhbWFwRGF0YS5pc1ZlcnRpY2FsWm9vbSxcbiAgICAgICAgJ3ZlcnRpY2FsLXpvb20tYnV0dG9ucyc6IG1hcERhdGEuaXNWZXJ0aWNhbFpvb21cbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXAtem9vbS1idXR0b25zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBbY2xhc3MuZmxleC1jb2x1bW5dPVwibWFwRGF0YS5pc1ZlcnRpY2FsWm9vbVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZsZXgtMVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uWm9vbUNoYW5nZSh0cnVlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9wb3B1cC9NaW51cy5zdmdcIlxuICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTQsICdoZWlnaHQucHgnOiAxNCB9XCJcbiAgICAgICAgICA+PC9zdmctaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZmxleC0xXCJcbiAgICAgICAgICAoY2xpY2spPVwib25ab29tQ2hhbmdlKGZhbHNlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9jb21tb24vaWNfcGx1cy5zdmdcIlxuICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTQsICdoZWlnaHQucHgnOiAxNCB9XCJcbiAgICAgICAgICA+PC9zdmctaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXAtem9vbS1yYW5nZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS10ZXh0IGNhLWZvbnQtbWVkaXVtXCI+NTAgbWk8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJhbmdlLWxpbmVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZ29vZ2xlLW1hcD5cbiJdfQ==
401
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLW1hcC9jYS1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtbWFwL2NhLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLFVBQVU7QUFDVixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkUsYUFBYTtBQUNiLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRTNGLFFBQVE7QUFDUixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBYTlDLFVBQVU7QUFDVixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFL0QsWUFBWTtBQUNaLE9BQU8sRUFDSCw2QkFBNkIsRUFD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TTtnQkFDa0MsSUFBSTtzQkFBNUMsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNWLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNHLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG4vLyBNb2R1bGVzXG5pbXBvcnQgeyBBbmd1bGFyU3ZnSWNvbk1vZHVsZSB9IGZyb20gJ2FuZ3VsYXItc3ZnLWljb24nO1xuaW1wb3J0IHsgTmdiVG9vbHRpcE1vZHVsZSB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEdvb2dsZU1hcCwgR29vZ2xlTWFwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2dvb2dsZS1tYXBzJztcblxuLy8gQ29tcG9uZW50c1xuaW1wb3J0IHsgQ2FNYXBEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2NhLW1hcC1kcm9wZG93bi9jYS1tYXAtZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IENhQXBwVG9vbHRpcFYyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2EtYXBwLXRvb2x0aXAtdjIvY2EtYXBwLXRvb2x0aXAtdjIuY29tcG9uZW50JztcblxuLy8gRW51bXNcbmltcG9ydCB7IEdvb2dsZU1hcEVudW0gfSBmcm9tICcuLi9jYS1tYXAvZW51bXMvZ29vZ2xlLW1hcC5lbnVtJztcbmltcG9ydCB7IE1hcE1hcmtlclN0cmluZ0VudW0gfSBmcm9tICcuL2VudW1zJztcblxuLy8gTW9kZWxzXG5pbXBvcnQge1xuICAgIElNYXBNYXJrZXJzLFxuICAgIElNYXBSb3V0ZVBhdGgsXG4gICAgSUNhTWFwUHJvcHMsXG4gICAgSU1hcE9wdGlvbnMsXG4gICAgSVJvdXRlUGF0aCxcbiAgICBJTWFwQm91bmRzWm9vbSxcbiAgICBJTWFwU2VsZWN0ZWRNYXJrZXJEYXRhLFxufSBmcm9tICcuLi9jYS1tYXAvbW9kZWxzL21hcC5tb2RlbCc7XG5cbi8vIEhlbHBlcnNcbmltcG9ydCB7IE1hcEhlbHBlciB9IGZyb20gJy4uL2NhLW1hcC91dGlscy9oZWxwZXJzL21hcC5oZWxwZXInO1xuXG4vLyBDb25zdGFudHNcbmltcG9ydCB7XG4gICAgTWFwSW5mb1dpbmRvd09wdGlvbnNDb25zdGFudHMsXG4gICAgTWFwT3B0aW9uc0NvbnN0YW50cyxcbn0gZnJvbSAnLi91dGlscy9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWFwQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL21hcC5jb25zdGFudCc7XG5cbi8vIFNlcnZpY2VzXG5pbXBvcnQgeyBNYXBNYXJrZXJJY29uU2VydmljZSB9IGZyb20gJy4vdXRpbHMvc2VydmljZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1jYS1tYXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYS1tYXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhLW1hcC5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICAvLyBNb2R1bGVzXG4gICAgICAgIEdvb2dsZU1hcHNNb2R1bGUsXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgQW5ndWxhclN2Z0ljb25Nb2R1bGUsXG4gICAgICAgIE5nYlRvb2x0aXBNb2R1bGUsXG5cbiAgICAgICAgLy8gQ29tcG9uZW50c1xuICAgICAgICBDYU1hcERyb3Bkb3duQ29tcG9uZW50LFxuICAgICAgICBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCxcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIENhTWFwQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuXG4gICAgICAgIC8vIFNlcnZpY2VzXG4gICAgICAgIHByaXZhdGUgbWFya2VySWNvblNlcnZpY2U6IE1hcE1hcmtlckljb25TZXJ2aWNlXG4gICAgKSB7fVxuICAgIEBJbnB1dCgpIHNldCBkYXRhKHZhbHVlczogSUNhTWFwUHJvcHMpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNYXBEYXRhKHZhbHVlcyk7XG4gICAgfVxuICAgIEBPdXRwdXQoKSByZXNldFNlbGVjdGVkTWFya2VySXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICBAT3V0cHV0KCkgY2x1c3Rlck1hcmtlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJTWFwTWFya2Vycz4oKTtcbiAgICBAT3V0cHV0KCkgY2x1c3Rlckxpc3RTY3JvbGxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8SU1hcE1hcmtlcnM+KCk7XG4gICAgQE91dHB1dCgpIGdldEluZm9XaW5kb3dEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgQE91dHB1dCgpIGJvdW5kc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBCb3VuZHNab29tPigpO1xuICAgIEBPdXRwdXQoKSBvcGVuSW5NYXBFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAVmlld0NoaWxkKEdvb2dsZU1hcCwgeyBzdGF0aWM6IGZhbHNlIH0pIG1hcHMhOiBHb29nbGVNYXA7XG4gICAgQFZpZXdDaGlsZCgnbWFya2VyRHJvcGRvd24nKSBtYXJrZXJEcm9wZG93biE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY2x1c3RlckRyb3Bkb3duJykgY2x1c3RlckRyb3Bkb3duITogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwdWJsaWMgY3VycmVudGx5T3BlbldpbmRvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBwcmV2aW91c0ljb25VcmwhOiBzdHJpbmc7XG4gICAgcHVibGljIHByZXZpb3VzSWNvblVybFJvdXRpbmchOiBzdHJpbmc7XG4gICAgcHVibGljIGZvY3VzZWRJY29uUm91dGluZyE6IG51bWJlcjtcbiAgICBwcml2YXRlIGRpcmVjdGlvblNlcnZpY2UgPSBuZXcgZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1NlcnZpY2UoKTtcbiAgICBwdWJsaWMgZGlyZWN0aW9uc1JlbmRlcmVyczogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlbmRlcmVyW10gPSBbXTtcbiAgICBwdWJsaWMgaW5mb1dpbmRvd09wdGlvbnM6IGdvb2dsZS5tYXBzLkluZm9XaW5kb3dPcHRpb25zID1cbiAgICAgICAgTWFwSW5mb1dpbmRvd09wdGlvbnNDb25zdGFudHMubWFwSW5mb1dpbmRvd09wdGlvbnM7XG4gICAgcHVibGljIG1hcE9wdGlvbnM6IElNYXBPcHRpb25zID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwT3B0aW9ucztcbiAgICBwdWJsaWMgbWFwWm9vbTogbnVtYmVyID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwWm9vbTtcbiAgICBwdWJsaWMgbWFwQ2VudGVyOiBJUm91dGVQYXRoID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwQ2VudGVyO1xuICAgIHB1YmxpYyBtYXA6IGdvb2dsZS5tYXBzLk1hcCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBpc01hcENlbnRlclNldDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjbHVzdGVyTWFya2Vyc0RhdGE6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgICBwdWJsaWMgbWFya2Vyc0RhdGE6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgICBwdWJsaWMgbWFwRGF0YTogSUNhTWFwUHJvcHMgPSB7fTtcbiAgICBwdWJsaWMgb3BlbmVkSW5mb1dpbmRvd0RhdGE6IElNYXBNYXJrZXJzIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGFyZWFGaWx0ZXJEYXRhID0gTWFwT3B0aW9uc0NvbnN0YW50cy5hcmVhRmlsdGVyRGF0YTtcbiAgICBwdWJsaWMgaXNBcmVhRmlsdGVyQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIG1hcFN0eWxlczogZ29vZ2xlLm1hcHMuTWFwVHlwZVN0eWxlW10gPVxuICAgICAgICBNYXBDb25zdGFudHMuR09PR0xFX01BUF9TVFlMRVM7XG4gICAgcHVibGljIGNsdXN0ZXJNYXJrZXJJZHM6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgICBwdWJsaWMgcm91dGluZ01hcmtlcklkczogSU1hcE1hcmtlcnNbXSA9IFtdO1xuICAgIHB1YmxpYyBpc01hcmtlckRyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc0NsdXN0ZXJEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgb3BlbkRyb3Bkb3duVGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBtYXBTdHlsZUlkOiBzdHJpbmcgPSAnZDY4MTkwNGEzOTBhODQwMic7XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gUmVzZXQgYWxsIGljb25zIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUgb24gcGFnZSBsb2FkXG4gICAgICAgIHRoaXMucmVzZXRNYXJrZXJzSWNvbnMoKTtcblxuICAgICAgICB0aGlzLmdldFNlcnZpY2VEYXRhKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm1hcHMuZ29vZ2xlTWFwPy5hZGRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlSW5mb1dpbmRvdygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbHVzdGVyTWFya2VyQ2xpY2sobWFya2VySXRlbTogSU1hcE1hcmtlcnMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNJbmZvV2luZG93T3BlbmVkID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgIG1hcmtlckl0ZW0sXG4gICAgICAgICAgICB0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHRoaXMuY2x1c3Rlck1hcmtlckNsaWNrLmVtaXQobWFya2VySXRlbSk7XG4gICAgICAgIGVsc2UgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFya2VySW5mb1dpbmRvdyhtYXJrZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChtYXJrZXJJZCkgdGhpcy5nZXRJbmZvV2luZG93RGF0YS5lbWl0KG1hcmtlcklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25NYXJrZXJDbGljayhtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICAgICAgbWFya2VySXRlbSxcbiAgICAgICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWlzSW5mb1dpbmRvd09wZW5lZCkgdGhpcy5nZXRNYXJrZXJJbmZvV2luZG93KG1hcmtlckl0ZW0uZGF0YS5pZCk7XG4gICAgICAgIGVsc2UgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlyZWN0aW9uc09uTWFwKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tYXBzPy5nb29nbGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRNYXAodGhpcy5tYXBzPy5nb29nbGVNYXAhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVBbmREaXNwbGF5Um91dGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1hcERhdGEucm91dGVQYXRocykge1xuICAgICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgZGlyZWN0aW9ucyByZW5kZXJlcnNcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRNYXAobnVsbClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbnNSZW5kZXJlcnMgPSBbXTtcblxuICAgICAgICAgICAgdGhpcy5tYXBEYXRhLnJvdXRlUGF0aHMhLmZvckVhY2goKHJvdXRlOiBJTWFwUm91dGVQYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdDogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbjogcm91dGUucGF0aFswXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IHJvdXRlLnBhdGhbcm91dGUucGF0aC5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgd2F5cG9pbnRzOiByb3V0ZS5wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMSwgcm91dGUucGF0aC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocG9zaXRpb24pID0+ICh7IGxvY2F0aW9uOiBwb3NpdGlvbiB9KSksXG4gICAgICAgICAgICAgICAgICAgIHRyYXZlbE1vZGU6IGdvb2dsZS5tYXBzLlRyYXZlbE1vZGUuQklDWUNMSU5HLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvblNlcnZpY2Uucm91dGUocmVxdWVzdCwgKHJlc3VsdCwgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1N0YXR1cy5PSyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Py5yb3V0ZXNbMF1cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb25zUmVuZGVyZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVuZGVyZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc0luZm9XaW5kb3dzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc01hcmtlcnM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlVmlld3BvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlsaW5lT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuc3Ryb2tlQ29sb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGVNYXBFbnVtLlNUUk9LRV9DT0xPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZU9wYWNpdHk6ICFyb3V0ZS5pc0Rhc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcm91dGUuc3Ryb2tlT3BhY2l0eSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlTWFwRW51bS5TVFJPS0VfT1BBQ0lUWVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdlaWdodDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zdHJva2VXZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGVNYXBFbnVtLlNUUk9LRV9XRUlHSFQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uczogcm91dGUuaXNEYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChyb3V0ZS5kYXNoZWRMaW5lU3R5bGUgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcE9wdGlvbnNDb25zdGFudHMucm91dGluZ0Rhc2hlZExpbmVJY29uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbnNSZW5kZXJlci5zZXREaXJlY3Rpb25zKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbnNSZW5kZXJlcnMucHVzaChkaXJlY3Rpb25zUmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXJlY3Rpb25zT25NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRNYXJrZXJzSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwRGF0YS5tYXJrZXJzPy5tYXAoKG1hcmtlcjogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnI21hcmtlci0nICsgbWFya2VyLmlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhtYXJrZXJJY29uLCBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEKTtcbiAgICAgICAgICAgIHRoaXMuaXNNYXJrZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5tYXJrZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogeyB6SW5kZXg6IGluZGV4ICsgMSB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXBEYXRhLmNsdXN0ZXJNYXJrZXJzPy5tYXAoXG4gICAgICAgICAgICAoY2x1c3Rlck1hcmtlcjogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbHVzdGVySWQgPSB0aGlzLmdldENsdXN0ZXJJZChjbHVzdGVyTWFya2VyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgICcjY2x1c3Rlci0nICsgY2x1c3RlcklkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1hcFJlYWR5KG1hcEluc3RhbmNlOiBnb29nbGUubWFwcy5NYXApOiB7XG4gICAgICAgIGZpbGxDb2xvcj86IHN0cmluZztcbiAgICAgICAgc3Ryb2tlQ29sb3I/OiBzdHJpbmc7XG4gICAgICAgIHN0cm9rZVdlaWdodD86IG51bWJlcjtcbiAgICAgICAgZmlsbE9wYWNpdHk/OiBudW1iZXI7XG4gICAgfSB8IHZvaWQge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcEluc3RhbmNlO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcERhdGE/LmRhcmtNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZWRNYXBUeXBlID0gbmV3IGdvb2dsZS5tYXBzLlN0eWxlZE1hcFR5cGUoXG4gICAgICAgICAgICAgICAgTWFwQ29uc3RhbnRzLkdPT0dMRV9NQVBfREFSS19TVFlMRVNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm1hcCEubWFwVHlwZXMuc2V0KEdvb2dsZU1hcEVudW0uREFSS19NQVAsIHN0eWxlZE1hcFR5cGUpO1xuICAgICAgICAgICAgdGhpcy5tYXAhLnNldE1hcFR5cGVJZChHb29nbGVNYXBFbnVtLkRBUktfTUFQKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hcERhdGEuc3RhdGVCb3VuZGFyaWVzVXJsKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZUJvdW5kYXJpZXNVcmwgPSB0aGlzLm1hcERhdGEuc3RhdGVCb3VuZGFyaWVzVXJsLnVybDtcbiAgICAgICAgICAgIHRoaXMubWFwcy5nb29nbGVNYXA/LmRhdGEubG9hZEdlb0pzb24oc3RhdGVCb3VuZGFyaWVzVXJsKTtcblxuICAgICAgICAgICAgdGhpcy5tYXBzLmdvb2dsZU1hcD8uZGF0YS5zZXRTdHlsZSgoZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlRGVuc2l0eSA9IGZlYXR1cmUuZ2V0UHJvcGVydHkoJ2RlbnNpdHknKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpbGxDb2xvciwgZmlsbE9wYWNpdHkgfSA9XG4gICAgICAgICAgICAgICAgICAgIE1hcEhlbHBlci5nZXRGaWxsQ29sb3JGb3JTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlRGVuc2l0eSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcERhdGEudmlldyB8fCAnJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogZmlsbENvbG9yLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogJyNFRUVFRUUnLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXZWlnaHQ6IDAuNixcbiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IGZpbGxPcGFjaXR5LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpO1xuICAgICAgICB0aGlzLnNldE1hcFN0eWxlcygpO1xuICAgICAgICB0aGlzLmdldE1hcElkbGVFdmVudChtYXBJbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldE1hcFN0eWxlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YT8uZGFya01vZGUpXG4gICAgICAgICAgICB0aGlzLm1hcE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5tYXBPcHRpb25zLFxuICAgICAgICAgICAgICAgIHN0eWxlczogTWFwQ29uc3RhbnRzLkdPT0dMRV9NQVBfREFSS19TVFlMRVMsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFsbE1hcmtlcnNDb21iaW5lZCA9IFtcbiAgICAgICAgICAgIC4uLih0aGlzLm1hcERhdGEucm91dGluZ01hcmtlcnMgPz8gW10pLFxuICAgICAgICAgICAgLi4uKHRoaXMubWFwRGF0YS5jbHVzdGVyTWFya2VycyA/PyBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5tYXBEYXRhLm1hcmtlcnMgPz8gW10pLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChhbGxNYXJrZXJzQ29tYmluZWQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWFwQ2VudGVyQW5kQm91bmRzID1cbiAgICAgICAgICAgICAgICBNYXBIZWxwZXIuZ2V0TWFwQ2VudGVyQW5kWm9vbShhbGxNYXJrZXJzQ29tYmluZWQpO1xuXG4gICAgICAgICAgICB0aGlzLm1hcCEucGFuVG8obWFwQ2VudGVyQW5kQm91bmRzLm1hcENlbnRlcik7XG4gICAgICAgICAgICBpZiAobWFwQ2VudGVyQW5kQm91bmRzLmJvdW5kcylcbiAgICAgICAgICAgICAgICB0aGlzLm1hcD8uZml0Qm91bmRzKG1hcENlbnRlckFuZEJvdW5kcy5ib3VuZHMpO1xuICAgICAgICAgICAgaWYgKG1hcENlbnRlckFuZEJvdW5kcy5tYXBab29tKVxuICAgICAgICAgICAgICAgIHRoaXMubWFwPy5zZXRab29tKG1hcENlbnRlckFuZEJvdW5kcy5tYXBab29tKTtcblxuICAgICAgICAgICAgdGhpcy5pc01hcENlbnRlclNldCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFwSWRsZUV2ZW50KG1hcDogZ29vZ2xlLm1hcHMuTWFwKTogdm9pZCB7XG4gICAgICAgIG1hcC5hZGRMaXN0ZW5lcignaWRsZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICBjb25zdCBtYXBCb3VuZHMgPSB0aGlzLm1hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcFpvb20gPSB0aGlzLm1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXBCb3VuZHMgJiYgbWFwWm9vbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kc09iamVjdCA9IHsgYm91bmRzOiBtYXBCb3VuZHMsIHpvb206IG1hcFpvb20gfTtcbiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kc0NoYW5nZWQuZW1pdChib3VuZHNPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkTWFya2VySXRlbS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuTWFya2VySW5mb1dpbmRvdyhtYXJrZXJJdGVtOiBJTWFwU2VsZWN0ZWRNYXJrZXJEYXRhKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzSW5mb1dpbmRvd09wZW5lZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgICAgICBtYXJrZXJJdGVtLFxuICAgICAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkTWFya2VycyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMubWFwRGF0YS5tYXJrZXJzISxcbiAgICAgICAgICAgIC4uLnRoaXMubWFwRGF0YS5jbHVzdGVyTWFya2VycyEsXG4gICAgICAgIF07XG5cbiAgICAgICAgY29tYmluZWRNYXJrZXJzLmZvckVhY2goKGl0ZW06IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkTWFya2VyID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIG1hcmtlckl0ZW1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQ2x1c3Rlck1hcmtlciA9IGl0ZW0/LmRhdGE/LmNvdW50ID4gMTtcblxuICAgICAgICAgICAgY29uc3QgY2x1c3RlcklkID0gaXNDbHVzdGVyTWFya2VyID8gdGhpcy5nZXRDbHVzdGVySWQoaXRlbSkgOiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uSWQgPSBpc0NsdXN0ZXJNYXJrZXJcbiAgICAgICAgICAgICAgICA/ICcjY2x1c3Rlci0nICsgY2x1c3RlcklkXG4gICAgICAgICAgICAgICAgOiAnI21hcmtlci0nICsgaXRlbS5pZDtcblxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gaXNDbHVzdGVyTWFya2VyXG4gICAgICAgICAgICAgICAgPyB0aGlzLmNsdXN0ZXJEcm9wZG93bi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgOiB0aGlzLm1hcmtlckRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zID0geyB6SW5kZXg6IDk5OSB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2x1c3Rlck1hcmtlcikgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5pc0NsdXN0ZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9wZW5Ecm9wZG93blRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRHJvcGRvd25UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IobWFya2VySWNvbklkKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIShtYXJrZXJJY29uPy5wcmV2aW91c1NpYmxpbmcgPT09IGRyb3Bkb3duRWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uPy5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFtYXJrZXJJY29uLmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNYXJrZXJEcm9wZG93bk9wZW4gPSAhaXNDbHVzdGVyTWFya2VyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGlzQ2x1c3Rlck1hcmtlcjtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihtYXJrZXJJY29uSWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uPy5jbGFzc0xpc3QuY29udGFpbnMoTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucyA9IHsgekluZGV4OiBpbmRleCArIDEgfTtcbiAgICAgICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvdyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEgPSBtYXJrZXJJdGVtO1xuXG4gICAgICAgIGlmICghaXNJbmZvV2luZG93T3BlbmVkKSB0aGlzLm1hcCEucGFuVG8obWFya2VySXRlbS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICBtYXJrZXJJdGVtOiBJTWFwTWFya2VycyxcbiAgICAgICAgbWFya2VySXRlbTI/OiBJTWFwTWFya2VycyB8IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG1hcmtlckl0ZW0ucG9zaXRpb24ubGF0ID09PSBtYXJrZXJJdGVtMj8ucG9zaXRpb24/LmxhdCAmJlxuICAgICAgICAgICAgbWFya2VySXRlbS5wb3NpdGlvbi5sbmcgPT09IG1hcmtlckl0ZW0yPy5wb3NpdGlvbj8ubG5nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlSW5mb1dpbmRvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldE1hcmtlcnNJY29ucygpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEgPSBudWxsKSwgMjUwKTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5vcGVuRHJvcGRvd25UaW1lb3V0KTtcbiAgICAgICAgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkTWFya2VySXRlbS5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZU1hcERhdGEobmV3RGF0YTogSUNhTWFwUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXBEYXRhID0geyAuLi5uZXdEYXRhIH07XG5cbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YS5zZWxlY3RlZE1hcmtlckRhdGEpXG4gICAgICAgICAgICB0aGlzLm9wZW5NYXJrZXJJbmZvV2luZG93KHRoaXMubWFwRGF0YS5zZWxlY3RlZE1hcmtlckRhdGEpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cpIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG5cbiAgICAgICAgaWYgKG5ld0RhdGEgJiYgIXRoaXMuaXNNYXBDZW50ZXJTZXQgJiYgdGhpcy5tYXApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBuZXdEYXRhLm1hcmtlcnM/Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIG5ld0RhdGEuY2x1c3Rlck1hcmtlcnM/Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIG5ld0RhdGEucm91dGluZ01hcmtlcnM/Lmxlbmd0aFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TWFwU3R5bGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNwbGF5IHJvdXRlcyBmb3Igcm91dGluZ01hcmtlcnNcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBbmREaXNwbGF5Um91dGUoKTtcblxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2x1c3RlcklkKGNsdXN0ZXJEYXRhOiBJTWFwTWFya2Vycyk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBjbHVzdGVySWQgPSB0aGlzLmNsdXN0ZXJNYXJrZXJJZHMuZmluZChcbiAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIGNsdXN0ZXJEYXRhLnBvc2l0aW9uLmxhdCA9PT0gaXRlbS5wb3NpdGlvbi5sYXQgJiZcbiAgICAgICAgICAgICAgICBjbHVzdGVyRGF0YS5wb3NpdGlvbi5sbmcgPT09IGl0ZW0ucG9zaXRpb24ubG5nXG4gICAgICAgICk/LmlkO1xuXG4gICAgICAgIHJldHVybiBjbHVzdGVySWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Um91dGluZ0lkKG1hcmtlckRhdGE6IElNYXBNYXJrZXJzKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJvdXRpbmdJZCA9IHRoaXMucm91dGluZ01hcmtlcklkcy5maW5kKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgbWFya2VyRGF0YS5wb3NpdGlvbi5sYXQgPT09IGl0ZW0ucG9zaXRpb24ubGF0ICYmXG4gICAgICAgICAgICAgICAgbWFya2VyRGF0YS5wb3NpdGlvbi5sbmcgPT09IGl0ZW0ucG9zaXRpb24ubG5nXG4gICAgICAgICk/LmlkO1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nSWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YSlcbiAgICAgICAgICAgIHRoaXMuY2x1c3Rlckxpc3RTY3JvbGxFdmVudC5lbWl0KHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblpvb21DaGFuZ2UoaXNNaW51c0NsaWNrPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50Wm9vbUxldmVsID0gdGhpcy5tYXA/LmdldFpvb20oKTtcblxuICAgICAgICBpZiAoY3VycmVudFpvb21MZXZlbCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFpvb21MZXZlbCA9IGlzTWludXNDbGlja1xuICAgICAgICAgICAgICAgID8gY3VycmVudFpvb21MZXZlbCAtIDFcbiAgICAgICAgICAgICAgICA6IGN1cnJlbnRab29tTGV2ZWwgKyAxO1xuICAgICAgICAgICAgdGhpcy5tYXA/LnNldFpvb20obmV4dFpvb21MZXZlbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25PcGVuSW5NYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlbkluTWFwRXZlbnQuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZXJ2aWNlRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZXJJY29uU2VydmljZS5jbHVzdGVyTWFya2VySWRzJFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2x1c3RlcklkcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2x1c3Rlck1hcmtlcklkcyA9IGNsdXN0ZXJJZHM7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1hcmtlckljb25TZXJ2aWNlLnJvdXRpbmdNYXJrZXJJZHMkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyb3V0aW5nSWRzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nTWFya2VySWRzID0gcm91dGluZ0lkcztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgbWFya2VyOiBJTWFwTWFya2Vycyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBtYXJrZXIuZGF0YS5pZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhY2tCeVBvc2l0aW9uKGluZGV4OiBudW1iZXIsIG1hcmtlcjogSU1hcE1hcmtlcnMpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gbWFya2VyLnBvc2l0aW9uLmxhdCArIG1hcmtlci5wb3NpdGlvbi5sbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGlkZW50aXR5KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT4gcmVuZGVyZXIuc2V0TWFwKG51bGwpKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8Z29vZ2xlLW1hcFxuICAgIGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIlxuICAgIFtjbGFzcy5kYXJrLW1vZGUtbWFwXT1cIm1hcERhdGEuZGFya01vZGVcIlxuICAgIGhlaWdodD1cIjEwMCVcIlxuICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgW3pvb21dPVwibWFwWm9vbVwiXG4gICAgW2NlbnRlcl09XCJtYXBDZW50ZXJcIlxuICAgIFtvcHRpb25zXT1cIm1hcE9wdGlvbnNcIlxuICAgIChtYXBJbml0aWFsaXplZCk9XCJvbk1hcFJlYWR5KCRldmVudClcIlxuICAgIFttYXBJZF09XCJtYXBTdHlsZUlkXCJcbj5cbiAgICBAZm9yIChtYXJrZXIgb2YgbWFwRGF0YS5tYXJrZXJzOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgbWFya2VyLmRhdGEuaWQpIHtcbiAgICAgICAgPG1hcC1hZHZhbmNlZC1tYXJrZXJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJtYXJrZXIucG9zaXRpb25cIlxuICAgICAgICAgICAgW2NvbnRlbnRdPVwibWFya2VyLmNvbnRlbnRcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJcbiAgICAgICAgICAgICAgICBvcGVuZWRJbmZvV2luZG93RGF0YT8uZGF0YT8uaWQgPT09IG1hcmtlci5kYXRhLmlkID8gOTk5IDogaVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChtYXBDbGljayk9XCJvbk1hcmtlckNsaWNrKG1hcmtlcilcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWFwLWFkdmFuY2VkLW1hcmtlcj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgICNtYXJrZXJEcm9wZG93blxuICAgICAgICBjbGFzcz1cIm1hcmtlci1kcm9wZG93biBkcm9wZG93bi1oaWRkZW5cIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdkcm9wZG93bi1oaWRkZW4nOiAhaXNNYXJrZXJEcm9wZG93bk9wZW4gfVwiXG4gICAgPlxuICAgICAgICA8YXBwLWNhLW1hcC1kcm9wZG93blxuICAgICAgICAgICAgW2luZm9XaW5kb3dDb250ZW50XT1cIlxuICAgICAgICAgICAgICAgICFpc0NsdXN0ZXJEcm9wZG93bk9wZW5cbiAgICAgICAgICAgICAgICAgICAgPyBvcGVuZWRJbmZvV2luZG93RGF0YT8uaW5mb1dpbmRvd0NvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW21hcmtlckRhdGFdPVwib3BlbmVkSW5mb1dpbmRvd0RhdGE/LmRhdGFcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckl0ZW1DbGljayk9XCJnZXRNYXJrZXJJbmZvV2luZG93KCRldmVudClcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckxpc3RTY3JvbGxUb0VuZCk9XCJvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQoKVwiXG4gICAgICAgICAgICAob25CYWNrQnV0dG9uQ2xpY2spPVwib25DbHVzdGVyQmFja0J1dHRvbkNsaWNrKClcIlxuICAgICAgICA+PC9hcHAtY2EtbWFwLWRyb3Bkb3duPlxuICAgIDwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICAgIGNsdXN0ZXJNYXJrZXIgb2YgbWFwRGF0YS5jbHVzdGVyTWFya2VycztcbiAgICAgICAgbGV0IGkgPSAkaW5kZXg7XG4gICAgICAgIHRyYWNrIHRyYWNrQnlQb3NpdGlvbigkaW5kZXgsIGNsdXN0ZXJNYXJrZXIpXG4gICAgKSB7XG4gICAgICAgIDxtYXAtYWR2YW5jZWQtbWFya2VyXG4gICAgICAgICAgICBbcG9zaXRpb25dPVwiY2x1c3Rlck1hcmtlci5wb3NpdGlvblwiXG4gICAgICAgICAgICBbY29udGVudF09XCJjbHVzdGVyTWFya2VyLmNvbnRlbnRcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJcbiAgICAgICAgICAgICAgICBjaGVja0luZm9XaW5kb3dQb3NpdGlvbihjbHVzdGVyTWFya2VyLCBvcGVuZWRJbmZvV2luZG93RGF0YSlcbiAgICAgICAgICAgICAgICAgICAgPyA5OTlcbiAgICAgICAgICAgICAgICAgICAgOiBpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG1hcENsaWNrKT1cIm9uQ2x1c3Rlck1hcmtlckNsaWNrKGNsdXN0ZXJNYXJrZXIpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hcC1hZHZhbmNlZC1tYXJrZXI+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICAjY2x1c3RlckRyb3Bkb3duXG4gICAgICAgIGNsYXNzPVwibWFya2VyLWRyb3Bkb3duIGNsdXN0ZXItZHJvcGRvd24gZHJvcGRvd24taGlkZGVuXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnZHJvcGRvd24taGlkZGVuJzogIWlzQ2x1c3RlckRyb3Bkb3duT3BlbiB9XCJcbiAgICA+XG4gICAgICAgIDxhcHAtY2EtbWFwLWRyb3Bkb3duXG4gICAgICAgICAgICBbaW5mb1dpbmRvd0NvbnRlbnRdPVwiXG4gICAgICAgICAgICAgICAgIWlzTWFya2VyRHJvcGRvd25PcGVuXG4gICAgICAgICAgICAgICAgICAgID8gb3BlbmVkSW5mb1dpbmRvd0RhdGE/LmluZm9XaW5kb3dDb250ZW50XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFttYXJrZXJEYXRhXT1cIm9wZW5lZEluZm9XaW5kb3dEYXRhPy5kYXRhXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJJdGVtQ2xpY2spPVwiZ2V0TWFya2VySW5mb1dpbmRvdygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQpPVwib25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKClcIlxuICAgICAgICAgICAgKG9uQmFja0J1dHRvbkNsaWNrKT1cIm9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpXCJcbiAgICAgICAgPjwvYXBwLWNhLW1hcC1kcm9wZG93bj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoaXNBcmVhRmlsdGVyQWN0aXZlKSB7XG4gICAgICAgIDxtYXAtY2lyY2xlXG4gICAgICAgICAgICBbb3B0aW9uc109XCJhcmVhRmlsdGVyRGF0YS5vcHRpb25zXCJcbiAgICAgICAgICAgIFtjZW50ZXJdPVwiYXJlYUZpbHRlckRhdGEuY2VudGVyXCJcbiAgICAgICAgICAgIFtyYWRpdXNdPVwiYXJlYUZpbHRlckRhdGEucmFkaXVzXCJcbiAgICAgICAgPjwvbWFwLWNpcmNsZT5cbiAgICB9XG5cbiAgICBAZm9yIChcbiAgICAgICAgcm91dGluZ01hcmtlciBvZiBtYXBEYXRhLnJvdXRpbmdNYXJrZXJzO1xuICAgICAgICBsZXQgaSA9ICRpbmRleDtcbiAgICAgICAgdHJhY2sgdHJhY2tCeVBvc2l0aW9uKCRpbmRleCwgcm91dGluZ01hcmtlcilcbiAgICApIHtcbiAgICAgICAgPG1hcC1hZHZhbmNlZC1tYXJrZXJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJyb3V0aW5nTWFya2VyLnBvc2l0aW9uXCJcbiAgICAgICAgICAgIFtjb250ZW50XT1cInJvdXRpbmdNYXJrZXIuY29udGVudFwiXG4gICAgICAgID5cbiAgICAgICAgPC9tYXAtYWR2YW5jZWQtbWFya2VyPlxuICAgIH1cblxuICAgIEBpZiAobWFwRGF0YS5pc09wZW5Jbk1hcFNob3duKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwib3Blbi1pbi1tYXAtY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiXG4gICAgICAgICAgICBuZ2JUb29sdGlwXG4gICAgICAgICAgICBtYWluQ2FUb29sdGlwPVwiT3BlbiBpbiBNYXBcIlxuICAgICAgICAgICAgdG9vbHRpcEJhY2tncm91bmQ9XCIjNDI0MjQyXCJcbiAgICAgICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk9wZW5Jbk1hcCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHN2Zy1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXhcIlxuICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9jb21tb24vaWNfbG9jYXRpb25fbWFwLnN2Z1wiXG4gICAgICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTgsICdoZWlnaHQucHgnOiAxOCB9XCJcbiAgICAgICAgICAgID48L3N2Zy1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKG1hcERhdGEuaXNab29tU2hvd24pIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtYXAtem9vbS1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWVuZCBnYXAtMVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ2ZsZXgtY29sdW1uJzogIW1hcERhdGEuaXNWZXJ0aWNhbFpvb20sXG4gICAgICAgICAgICAgICAgJ3ZlcnRpY2FsLXpvb20tYnV0dG9ucyc6IG1hcERhdGEuaXNWZXJ0aWNhbFpvb20sXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWFwLXpvb20tYnV0dG9ucyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmxleC1jb2x1bW5dPVwibWFwRGF0YS5pc1ZlcnRpY2FsWm9vbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZmxleC0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uWm9vbUNoYW5nZSh0cnVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9wb3B1cC9NaW51cy5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTQsICdoZWlnaHQucHgnOiAxNCB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc3ZnLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZmxleC0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uWm9vbUNoYW5nZShmYWxzZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHN2Zy1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvY2EtY29tcG9uZW50cy9zdmcvY29tbW9uL2ljX3BsdXMuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdmdTdHlsZV09XCJ7ICd3aWR0aC5weCc6IDE0LCAnaGVpZ2h0LnB4JzogMTQgfVwiXG4gICAgICAgICAgICAgICAgICAgID48L3N2Zy1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFwLXpvb20tcmFuZ2UgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhbmdlLXRleHQgY2EtZm9udC1tZWRpdW1cIj41MCBtaTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9nb29nbGUtbWFwPlxuIl19