@metadev/lux 0.27.0 → 0.29.0

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 (83) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -488
  4. package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +259 -259
  5. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +78 -78
  6. package/esm2022/lib/checkbox/checkbox.component.mjs +156 -156
  7. package/esm2022/lib/datasource.mjs +1 -1
  8. package/esm2022/lib/datetime/datetime.component.mjs +312 -312
  9. package/esm2022/lib/filter/filter.component.mjs +158 -158
  10. package/esm2022/lib/geolocation/geolocation.component.mjs +423 -423
  11. package/esm2022/lib/geolocation/geolocation.service.mjs +123 -123
  12. package/esm2022/lib/geolocation/openlayer-loader.service.mjs +62 -62
  13. package/esm2022/lib/helperFns.mjs +118 -118
  14. package/esm2022/lib/input/input.component.mjs +469 -469
  15. package/esm2022/lib/input/regexp.service.mjs +195 -195
  16. package/esm2022/lib/lang.mjs +9 -9
  17. package/esm2022/lib/lux.module.mjs +118 -118
  18. package/esm2022/lib/map/geopoint.mjs +1 -1
  19. package/esm2022/lib/map/map.component.mjs +275 -275
  20. package/esm2022/lib/modal/modal-backdrop.mjs +24 -24
  21. package/esm2022/lib/modal/modal-config.mjs +11 -11
  22. package/esm2022/lib/modal/modal-dismiss-reasons.mjs +5 -5
  23. package/esm2022/lib/modal/modal-ref.mjs +101 -101
  24. package/esm2022/lib/modal/modal-stack.mjs +182 -182
  25. package/esm2022/lib/modal/modal-window.mjs +118 -118
  26. package/esm2022/lib/modal/modal.service.mjs +27 -27
  27. package/esm2022/lib/modal/util.mjs +82 -82
  28. package/esm2022/lib/pagination/pagination.component.mjs +144 -144
  29. package/esm2022/lib/pagination/pagination.mjs +1 -1
  30. package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -129
  31. package/esm2022/lib/select/select.component.mjs +148 -148
  32. package/esm2022/lib/tooltip/placement.mjs +7 -7
  33. package/esm2022/lib/tooltip/tooltip-context.mjs +1 -1
  34. package/esm2022/lib/tooltip/tooltip.component.mjs +21 -21
  35. package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -69
  36. package/esm2022/lib/tooltip/tooltip.service.mjs +137 -137
  37. package/esm2022/lib/tooltip/tooltop-content.mjs +8 -8
  38. package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -79
  39. package/esm2022/lib/window/window.service.mjs +46 -46
  40. package/esm2022/metadev-lux.mjs +4 -4
  41. package/esm2022/public-api.mjs +20 -20
  42. package/fesm2022/metadev-lux.mjs +4372 -4372
  43. package/fesm2022/metadev-lux.mjs.map +1 -1
  44. package/index.d.ts +5 -5
  45. package/lib/autocomplete/autocomplete.component.d.ts +81 -81
  46. package/lib/autocomplete-list/autocomplete-list.component.d.ts +65 -65
  47. package/lib/breadcrumb/breadcrumb.component.d.ts +22 -22
  48. package/lib/checkbox/checkbox.component.d.ts +47 -47
  49. package/lib/datasource.d.ts +13 -13
  50. package/lib/datetime/datetime.component.d.ts +69 -69
  51. package/lib/filter/filter.component.d.ts +51 -51
  52. package/lib/geolocation/geolocation.component.d.ts +123 -123
  53. package/lib/geolocation/geolocation.service.d.ts +32 -32
  54. package/lib/geolocation/openlayer-loader.service.d.ts +7 -7
  55. package/lib/helperFns.d.ts +15 -15
  56. package/lib/input/input.component.d.ts +108 -108
  57. package/lib/input/regexp.service.d.ts +15 -15
  58. package/lib/lang.d.ts +2 -2
  59. package/lib/lux.module.d.ts +27 -27
  60. package/lib/map/geopoint.d.ts +7 -7
  61. package/lib/map/map.component.d.ts +39 -39
  62. package/lib/modal/modal-backdrop.d.ts +8 -8
  63. package/lib/modal/modal-config.d.ts +14 -14
  64. package/lib/modal/modal-dismiss-reasons.d.ts +4 -4
  65. package/lib/modal/modal-ref.d.ts +41 -41
  66. package/lib/modal/modal-stack.d.ts +31 -31
  67. package/lib/modal/modal-window.d.ts +28 -28
  68. package/lib/modal/modal.service.d.ts +19 -19
  69. package/lib/modal/util.d.ts +40 -40
  70. package/lib/pagination/pagination.component.d.ts +52 -52
  71. package/lib/pagination/pagination.d.ts +10 -10
  72. package/lib/radiogroup/radiogroup.component.d.ts +37 -37
  73. package/lib/select/select.component.d.ts +38 -38
  74. package/lib/tooltip/placement.d.ts +7 -7
  75. package/lib/tooltip/tooltip-context.d.ts +3 -3
  76. package/lib/tooltip/tooltip.component.d.ts +11 -11
  77. package/lib/tooltip/tooltip.directive.d.ts +27 -27
  78. package/lib/tooltip/tooltip.service.d.ts +20 -20
  79. package/lib/tooltip/tooltop-content.d.ts +6 -6
  80. package/lib/voice-recognition/voice-recognition.directive.d.ts +16 -16
  81. package/lib/window/window.service.d.ts +11 -11
  82. package/package.json +3 -4
  83. package/public-api.d.ts +18 -18
@@ -1,275 +1,275 @@
1
- /* eslint-disable no-self-assign */
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { OpenLayerLoaderService } from '../geolocation/openlayer-loader.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../geolocation/openlayer-loader.service";
7
- export class MapComponent {
8
- static idCounter = 0;
9
- loaded$ = new BehaviorSubject(false);
10
- _map;
11
- mapId;
12
- _zoom;
13
- set zoom(zoom) {
14
- if (!isNaN(zoom)) {
15
- this._zoom = zoom;
16
- if (this._map) {
17
- this._map.getView().setZoom(zoom);
18
- }
19
- }
20
- }
21
- get zoom() {
22
- return this._zoom;
23
- }
24
- _center;
25
- set center(center) {
26
- if (center && center.coordinates && center.coordinates.length === 2) {
27
- this._center = center;
28
- if (this._map) {
29
- this._map.getView().setCenter(ol.proj.fromLonLat(center.coordinates));
30
- }
31
- }
32
- }
33
- get center() {
34
- return this._center;
35
- }
36
- _readonly;
37
- set readonly(readonly) {
38
- if (!readonly) {
39
- if (this._map) {
40
- this._map.on('click', (args) => {
41
- // args.coordinate is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
42
- const coordinates = ol.proj.toLonLat(args.coordinate);
43
- // alternatively: const lonLat = ol.proj.transform(args.coordinate,'EPSG:3857','EPSG:4326');
44
- this.addMarkerAtCoordinates(coordinates);
45
- });
46
- this._map.on('pointermove', (event) => {
47
- const pixel = this._map.getEventPixel(event.originalEvent);
48
- const hit = this._map.hasFeatureAtPixel(pixel);
49
- this._map.getViewport().style.cursor = hit ? 'move' : 'grab';
50
- });
51
- }
52
- }
53
- else {
54
- if (this._map) {
55
- this._map.on('click', (args) => { });
56
- this._map.on('pointermove', (event) => { });
57
- this._map.getViewport().style.cursor = 'grab';
58
- }
59
- }
60
- this._readonly = readonly;
61
- // reset marker coordinates so marker interactions can be created or recreated accordingly
62
- // to the changes to readonly
63
- this.markerCoordinates = this.markerCoordinates;
64
- }
65
- get readonly() {
66
- return this._readonly;
67
- }
68
- _marker;
69
- _markerInteraction;
70
- _markerCoordinates;
71
- set markerCoordinates(markerCoordinates) {
72
- if (markerCoordinates && markerCoordinates.length === 2) {
73
- this._markerCoordinates = markerCoordinates;
74
- if (this._map) {
75
- this.addMarkerAtCoordinates(markerCoordinates);
76
- }
77
- }
78
- else {
79
- this._markerCoordinates = undefined;
80
- if (this._map) {
81
- this.removeMarker();
82
- }
83
- }
84
- }
85
- get markerCoordinates() {
86
- return this._markerCoordinates;
87
- }
88
- set markerPoint(markerPoint) {
89
- if (!markerPoint ||
90
- !(markerPoint.coordinates && markerPoint.coordinates.length === 2)) {
91
- this.markerCoordinates = undefined;
92
- }
93
- else {
94
- this.markerCoordinates = [
95
- +markerPoint.coordinates[0],
96
- +markerPoint.coordinates[1]
97
- ];
98
- }
99
- this.valueChange.emit(markerPoint);
100
- }
101
- get markerPoint() {
102
- return {
103
- type: 'Point',
104
- coordinates: this.markerCoordinates
105
- };
106
- }
107
- valueChange = new EventEmitter();
108
- _markerSource;
109
- _markerStyle;
110
- constructor(olLoader) {
111
- olLoader.load().subscribe((_) => {
112
- // Initialize
113
- this._markerSource = new ol.source.Vector();
114
- this._markerStyle = new ol.style.Style({
115
- image: new ol.style.Icon({
116
- anchor: [0.5, 1],
117
- scale: 0.25,
118
- src: '/assets/img/marker.png'
119
- })
120
- });
121
- this.loaded$.next(true);
122
- });
123
- }
124
- ngOnInit() {
125
- this.mapId = this.mapId ? this.mapId : 'map' + MapComponent.idCounter++;
126
- }
127
- ngAfterViewInit() {
128
- this.loaded$.subscribe((loaded) => {
129
- if (loaded) {
130
- this.initMap();
131
- }
132
- });
133
- }
134
- initMap() {
135
- this._map = new ol.Map({
136
- target: this.mapId,
137
- controls: ol.control.defaults({ attribution: false }),
138
- layers: [
139
- new ol.layer.Tile({
140
- source: new ol.source.OSM()
141
- }),
142
- new ol.layer.Vector({
143
- source: this._markerSource,
144
- style: this._markerStyle
145
- })
146
- ],
147
- view: new ol.View({
148
- center: ol.proj.fromLonLat(this.center !== undefined ? this.center.coordinates : [0, 0]),
149
- zoom: this.zoom
150
- })
151
- });
152
- if (this.center === undefined || this.center === null) {
153
- // if the center is not set, we set its default value
154
- if ('geolocation' in navigator) {
155
- navigator.geolocation.getCurrentPosition((position) => {
156
- this.center = {
157
- type: 'Point',
158
- coordinates: [position.coords.longitude, position.coords.latitude]
159
- };
160
- }, (error) => {
161
- this.center = {
162
- type: 'Point',
163
- coordinates: [0, 0]
164
- };
165
- });
166
- }
167
- else {
168
- this.center = {
169
- type: 'Point',
170
- coordinates: [0, 0]
171
- };
172
- }
173
- }
174
- else {
175
- // the center needs the map to be properly set, so if it was set before the map was initialized,
176
- // we set the center again to perform necessary adjustements
177
- this.center = this.center;
178
- }
179
- if (this.zoom === undefined || this.zoom === null) {
180
- // if the zoom is not set, we set its default value
181
- this.zoom = 18;
182
- }
183
- else {
184
- // the zoom needs the map to be properly set, so if it was set before the map was initialized,
185
- // we set the zoom again to perform necessary adjustements
186
- this.zoom = this.zoom;
187
- }
188
- if (this.readonly === undefined || this.readonly === null) {
189
- // if readonly is not set, we set its default value
190
- this.readonly = false;
191
- }
192
- else {
193
- // readonly needs the map to be properly set, so if it was set before the map was initialized,
194
- // we set readonly again to perform necessary adjustements
195
- this.readonly = this.readonly;
196
- }
197
- if (this.markerCoordinates !== undefined &&
198
- this.markerCoordinates !== null) {
199
- // the marker coordinates need the map to be properly set, so if they were set before the map was initialized,
200
- // we set the marker coordinates again to perform necessary adjustements
201
- this.markerCoordinates = this.markerCoordinates;
202
- }
203
- }
204
- addMarkerAtCoordinates(coordinates) {
205
- if (coordinates && coordinates.length === 2) {
206
- if (this._marker !== undefined) {
207
- this.removeMarker();
208
- }
209
- this._marker = new ol.Feature({
210
- geometry: new ol.geom.Point(
211
- // [lon, lat] is in EPSG:4326 (degrees), we transform it into EPSG:3857 (meters)
212
- ol.proj.transform(coordinates, 'EPSG:4326', 'EPSG:3857'))
213
- });
214
- this._markerSource.addFeature(this._marker);
215
- this._markerCoordinates = this.getMarkerCoordinates();
216
- if (!this.readonly) {
217
- const dragInteraction = new ol.interaction.Modify({
218
- features: new ol.Collection([this._marker]),
219
- style: this._markerStyle,
220
- pixelTolerance: 50,
221
- hitDetection: true
222
- });
223
- this._markerInteraction = dragInteraction;
224
- this._map.addInteraction(dragInteraction);
225
- }
226
- this._marker.on('change', () => {
227
- this._markerCoordinates = this.getMarkerCoordinates();
228
- }, this._marker);
229
- }
230
- }
231
- removeMarker() {
232
- if (this._marker !== undefined) {
233
- this._markerSource.removeFeature(this._marker);
234
- this._marker = undefined;
235
- }
236
- if (this._markerInteraction !== undefined) {
237
- this._map.getInteractions().pop();
238
- this._markerInteraction = undefined;
239
- }
240
- }
241
- getMarkerCoordinates() {
242
- if (this._marker === undefined || this._marker == null) {
243
- return this._marker;
244
- }
245
- const coordinates = this._marker.getGeometry().getCoordinates();
246
- // coordinates is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
247
- return ol.proj.transform(coordinates, 'EPSG:3857', 'EPSG:4326');
248
- }
249
- onResize() {
250
- if (this._map) {
251
- this._map.updateSize();
252
- }
253
- }
254
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: MapComponent, deps: [{ token: i1.OpenLayerLoaderService }], target: i0.ɵɵFactoryTarget.Component });
255
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: MapComponent, selector: "lux-map", inputs: { mapId: "mapId", zoom: "zoom", center: "center", readonly: "readonly", markerCoordinates: "markerCoordinates", markerPoint: "markerPoint" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] });
256
- }
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: MapComponent, decorators: [{
258
- type: Component,
259
- args: [{ selector: 'lux-map', template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] }]
260
- }], ctorParameters: function () { return [{ type: i1.OpenLayerLoaderService }]; }, propDecorators: { mapId: [{
261
- type: Input
262
- }], zoom: [{
263
- type: Input
264
- }], center: [{
265
- type: Input
266
- }], readonly: [{
267
- type: Input
268
- }], markerCoordinates: [{
269
- type: Input
270
- }], markerPoint: [{
271
- type: Input
272
- }], valueChange: [{
273
- type: Output
274
- }] } });
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL21hcC9tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvbWFwL21hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFFbkMsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7QUFZakYsTUFBTSxPQUFPLFlBQVk7SUFDdkIsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFYixPQUFPLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9ELElBQUksQ0FBTTtJQUVULEtBQUssQ0FBQztJQUVmLEtBQUssQ0FBUztJQUNkLElBQ0ksSUFBSSxDQUFDLElBQVk7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkM7U0FDRjtJQUNILENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU8sQ0FBVztJQUNsQixJQUNJLE1BQU0sQ0FBQyxNQUFnQjtRQUN6QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxX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SSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3JCO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRSxpRkFBaUY7UUFDakYsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7dUdBdlJVLFlBQVk7MkZBQVosWUFBWSw4T0N2QnpCLHFFQUNBOzsyRkRzQmEsWUFBWTtrQkFMeEIsU0FBUzsrQkFDRSxTQUFTOzZHQVdWLEtBQUs7c0JBQWIsS0FBSztnQkFJRixJQUFJO3NCQURQLEtBQUs7Z0JBZUYsTUFBTTtzQkFEVCxLQUFLO2dCQWVGLFFBQVE7c0JBRFgsS0FBSztnQkFvQ00saUJBQWlCO3NCQUQ1QixLQUFLO2dCQWtCRixXQUFXO3NCQURkLEtBQUs7Z0JBcUJJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1zZWxmLWFzc2lnbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPcGVuTGF5ZXJMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ2VvbG9jYXRpb24vb3BlbmxheWVyLWxvYWRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgR2VvUG9pbnQgfSBmcm9tICcuL2dlb3BvaW50JztcblxuLy8gQGR5bmFtaWNcbmRlY2xhcmUgY29uc3Qgb2w6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHV4LW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcblxuICBwcml2YXRlIGxvYWRlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHByaXZhdGUgX21hcDogYW55O1xuXG4gIEBJbnB1dCgpIG1hcElkO1xuXG4gIF96b29tOiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIHNldCB6b29tKHpvb206IG51bWJlcikge1xuICAgIGlmICghaXNOYU4oem9vbSkpIHtcbiAgICAgIHRoaXMuX3pvb20gPSB6b29tO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLl9tYXAuZ2V0VmlldygpLnNldFpvb20oem9vbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCB6b29tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3pvb207XG4gIH1cblxuICBfY2VudGVyOiBHZW9Qb2ludDtcbiAgQElucHV0KClcbiAgc2V0IGNlbnRlcihjZW50ZXI6IEdlb1BvaW50KSB7XG4gICAgaWYgKGNlbnRlciAmJiBjZW50ZXIuY29vcmRpbmF0ZXMgJiYgY2VudGVyLmNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fY2VudGVyID0gY2VudGVyO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLl9tYXAuZ2V0VmlldygpLnNldENlbnRlcihvbC5wcm9qLmZyb21Mb25MYXQoY2VudGVyLmNvb3JkaW5hdGVzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBjZW50ZXIoKTogR2VvUG9pbnQge1xuICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XG4gIH1cblxuICBfcmVhZG9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNldCByZWFkb25seShyZWFkb25seTogYm9vbGVhbikge1xuICAgIGlmICghcmVhZG9ubHkpIHtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBhcmdzLmNvb3JkaW5hdGUgaXMgaW4gRVBTRzozODU3IChtZXRlcnMpLCB3ZSB0cmFuc2Zvcm0gaXQgaW50byBFUFNHOjQzMjYgKGRlZ3JlZXMpXG4gICAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBvbC5wcm9qLnRvTG9uTGF0KGFyZ3MuY29vcmRpbmF0ZSk7XG4gICAgICAgICAgLy8gYWx0ZXJuYXRpdmVseTogY29uc3QgbG9uTGF0ID0gb2wucHJvai50cmFuc2Zvcm0oYXJncy5jb29yZGluYXRlLCdFUFNHOjM4NTcnLCdFUFNHOjQzMjYnKTtcbiAgICAgICAgICB0aGlzLmFkZE1hcmtlckF0Q29vcmRpbmF0ZXMoY29vcmRpbmF0ZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdwb2ludGVybW92ZScsIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGl4ZWwgPSB0aGlzLl9tYXAuZ2V0RXZlbnRQaXhlbChldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgICBjb25zdCBoaXQgPSB0aGlzLl9tYXAuaGFzRmVhdHVyZUF0UGl4ZWwocGl4ZWwpO1xuICAgICAgICAgIHRoaXMuX21hcC5nZXRWaWV3cG9ydCgpLnN0eWxlLmN1cnNvciA9IGhpdCA/ICdtb3ZlJyA6ICdncmFiJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIChhcmdzOiBhbnkpID0+IHt9KTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdwb2ludGVybW92ZScsIChldmVudDogYW55KSA9PiB7fSk7XG4gICAgICAgIHRoaXMuX21hcC5nZXRWaWV3cG9ydCgpLnN0eWxlLmN1cnNvciA9ICdncmFiJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcmVhZG9ubHkgPSByZWFkb25seTtcbiAgICAvLyByZXNldCBtYXJrZXIgY29vcmRpbmF0ZXMgc28gbWFya2VyIGludGVyYWN0aW9ucyBjYW4gYmUgY3JlYXRlZCBvciByZWNyZWF0ZWQgYWNjb3JkaW5nbHlcbiAgICAvLyB0byB0aGUgY2hhbmdlcyB0byByZWFkb25seVxuICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLm1hcmtlckNvb3JkaW5hdGVzO1xuICB9XG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBwcml2YXRlIF9tYXJrZXI6IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VySW50ZXJhY3Rpb246IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VyQ29vcmRpbmF0ZXM6IG51bWJlcltdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHNldCBtYXJrZXJDb29yZGluYXRlcyhtYXJrZXJDb29yZGluYXRlczogbnVtYmVyW10pIHtcbiAgICBpZiAobWFya2VyQ29vcmRpbmF0ZXMgJiYgbWFya2VyQ29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IG1hcmtlckNvb3JkaW5hdGVzO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLmFkZE1hcmtlckF0Q29vcmRpbmF0ZXMobWFya2VyQ29vcmRpbmF0ZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgbWFya2VyQ29vcmRpbmF0ZXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLl9tYXJrZXJDb29yZGluYXRlcztcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWFya2VyUG9pbnQobWFya2VyUG9pbnQ6IEdlb1BvaW50KSB7XG4gICAgaWYgKFxuICAgICAgIW1hcmtlclBvaW50IHx8XG4gICAgICAhKG1hcmtlclBvaW50LmNvb3JkaW5hdGVzICYmIG1hcmtlclBvaW50LmNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMilcbiAgICApIHtcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSBbXG4gICAgICAgICttYXJrZXJQb2ludC5jb29yZGluYXRlc1swXSxcbiAgICAgICAgK21hcmtlclBvaW50LmNvb3JkaW5hdGVzWzFdXG4gICAgICBdO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobWFya2VyUG9pbnQpO1xuICB9XG4gIGdldCBtYXJrZXJQb2ludCgpOiBHZW9Qb2ludCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICBjb29yZGluYXRlczogdGhpcy5tYXJrZXJDb29yZGluYXRlc1xuICAgIH07XG4gIH1cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9Qb2ludD4oKTtcblxuICBwcml2YXRlIF9tYXJrZXJTb3VyY2U6IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VyU3R5bGU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihvbExvYWRlcjogT3BlbkxheWVyTG9hZGVyU2VydmljZSkge1xuICAgIG9sTG9hZGVyLmxvYWQoKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemVcbiAgICAgIHRoaXMuX21hcmtlclNvdXJjZSA9IG5ldyBvbC5zb3VyY2UuVmVjdG9yKCk7XG4gICAgICB0aGlzLl9tYXJrZXJTdHlsZSA9IG5ldyBvbC5zdHlsZS5TdHlsZSh7XG4gICAgICAgIGltYWdlOiBuZXcgb2wuc3R5bGUuSWNvbih7XG4gICAgICAgICAgYW5jaG9yOiBbMC41LCAxXSxcbiAgICAgICAgICBzY2FsZTogMC4yNSxcbiAgICAgICAgICBzcmM6ICcvYXNzZXRzL2ltZy9tYXJrZXIucG5nJ1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvYWRlZCQubmV4dCh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWFwSWQgPSB0aGlzLm1hcElkID8gdGhpcy5tYXBJZCA6ICdtYXAnICsgTWFwQ29tcG9uZW50LmlkQ291bnRlcisrO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGVkJC5zdWJzY3JpYmUoKGxvYWRlZCkgPT4ge1xuICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICB0aGlzLmluaXRNYXAoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGluaXRNYXAoKTogdm9pZCB7XG4gICAgdGhpcy5fbWFwID0gbmV3IG9sLk1hcCh7XG4gICAgICB0YXJnZXQ6IHRoaXMubWFwSWQsXG4gICAgICBjb250cm9sczogb2wuY29udHJvbC5kZWZhdWx0cyh7IGF0dHJpYnV0aW9uOiBmYWxzZSB9KSxcbiAgICAgIGxheWVyczogW1xuICAgICAgICBuZXcgb2wubGF5ZXIuVGlsZSh7XG4gICAgICAgICAgc291cmNlOiBuZXcgb2wuc291cmNlLk9TTSgpXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgb2wubGF5ZXIuVmVjdG9yKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuX21hcmtlclNvdXJjZSxcbiAgICAgICAgICBzdHlsZTogdGhpcy5fbWFya2VyU3R5bGVcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICB2aWV3OiBuZXcgb2wuVmlldyh7XG4gICAgICAgIGNlbnRlcjogb2wucHJvai5mcm9tTG9uTGF0KFxuICAgICAgICAgIHRoaXMuY2VudGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLmNlbnRlci5jb29yZGluYXRlcyA6IFswLCAwXVxuICAgICAgICApLFxuICAgICAgICB6b29tOiB0aGlzLnpvb21cbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jZW50ZXIgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmNlbnRlciA9PT0gbnVsbCkge1xuICAgICAgLy8gaWYgdGhlIGNlbnRlciBpcyBub3Qgc2V0LCB3ZSBzZXQgaXRzIGRlZmF1bHQgdmFsdWVcbiAgICAgIGlmICgnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvcikge1xuICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAgIChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbMCwgMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgICBjb29yZGluYXRlczogWzAsIDBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBjZW50ZXIgbmVlZHMgdGhlIG1hcCB0byBiZSBwcm9wZXJseSBzZXQsIHNvIGlmIGl0IHdhcyBzZXQgYmVmb3JlIHRoZSBtYXAgd2FzIGluaXRpYWxpemVkLFxuICAgICAgLy8gd2Ugc2V0IHRoZSBjZW50ZXIgYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnpvb20gPT09IHVuZGVmaW5lZCB8fCB0aGlzLnpvb20gPT09IG51bGwpIHtcbiAgICAgIC8vIGlmIHRoZSB6b29tIGlzIG5vdCBzZXQsIHdlIHNldCBpdHMgZGVmYXVsdCB2YWx1ZVxuICAgICAgdGhpcy56b29tID0gMTg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSB6b29tIG5lZWRzIHRoZSBtYXAgdG8gYmUgcHJvcGVybHkgc2V0LCBzbyBpZiBpdCB3YXMgc2V0IGJlZm9yZSB0aGUgbWFwIHdhcyBpbml0aWFsaXplZCxcbiAgICAgIC8vIHdlIHNldCB0aGUgem9vbSBhZ2FpbiB0byBwZXJmb3JtIG5lY2Vzc2FyeSBhZGp1c3RlbWVudHNcbiAgICAgIHRoaXMuem9vbSA9IHRoaXMuem9vbTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFkb25seSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMucmVhZG9ubHkgPT09IG51bGwpIHtcbiAgICAgIC8vIGlmIHJlYWRvbmx5IGlzIG5vdCBzZXQsIHdlIHNldCBpdHMgZGVmYXVsdCB2YWx1ZVxuICAgICAgdGhpcy5yZWFkb25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZWFkb25seSBuZWVkcyB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHNldCwgc28gaWYgaXQgd2FzIHNldCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQsXG4gICAgICAvLyB3ZSBzZXQgcmVhZG9ubHkgYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgIT09IG51bGxcbiAgICApIHtcbiAgICAgIC8vIHRoZSBtYXJrZXIgY29vcmRpbmF0ZXMgbmVlZCB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHNldCwgc28gaWYgdGhleSB3ZXJlIHNldCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQsXG4gICAgICAvLyB3ZSBzZXQgdGhlIG1hcmtlciBjb29yZGluYXRlcyBhZ2FpbiB0byBwZXJmb3JtIG5lY2Vzc2FyeSBhZGp1c3RlbWVudHNcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLm1hcmtlckNvb3JkaW5hdGVzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkTWFya2VyQXRDb29yZGluYXRlcyhjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBpZiAoY29vcmRpbmF0ZXMgJiYgY29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBpZiAodGhpcy5fbWFya2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21hcmtlciA9IG5ldyBvbC5GZWF0dXJlKHtcbiAgICAgICAgZ2VvbWV0cnk6IG5ldyBvbC5nZW9tLlBvaW50KFxuICAgICAgICAgIC8vIFtsb24sIGxhdF0gaXMgaW4gRVBTRzo0MzI2IChkZWdyZWVzKSwgd2UgdHJhbnNmb3JtIGl0IGludG8gRVBTRzozODU3IChtZXRlcnMpXG4gICAgICAgICAgb2wucHJvai50cmFuc2Zvcm0oY29vcmRpbmF0ZXMsICdFUFNHOjQzMjYnLCAnRVBTRzozODU3JylcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9tYXJrZXJTb3VyY2UuYWRkRmVhdHVyZSh0aGlzLl9tYXJrZXIpO1xuICAgICAgdGhpcy5fbWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLmdldE1hcmtlckNvb3JkaW5hdGVzKCk7XG5cbiAgICAgIGlmICghdGhpcy5yZWFkb25seSkge1xuICAgICAgICBjb25zdCBkcmFnSW50ZXJhY3Rpb24gPSBuZXcgb2wuaW50ZXJhY3Rpb24uTW9kaWZ5KHtcbiAgICAgICAgICBmZWF0dXJlczogbmV3IG9sLkNvbGxlY3Rpb24oW3RoaXMuX21hcmtlcl0pLFxuICAgICAgICAgIHN0eWxlOiB0aGlzLl9tYXJrZXJTdHlsZSxcbiAgICAgICAgICBwaXhlbFRvbGVyYW5jZTogNTAsXG4gICAgICAgICAgaGl0RGV0ZWN0aW9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9tYXJrZXJJbnRlcmFjdGlvbiA9IGRyYWdJbnRlcmFjdGlvbjtcbiAgICAgICAgdGhpcy5fbWFwLmFkZEludGVyYWN0aW9uKGRyYWdJbnRlcmFjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21hcmtlci5vbihcbiAgICAgICAgJ2NoYW5nZScsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IHRoaXMuZ2V0TWFya2VyQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5fbWFya2VyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWFya2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tYXJrZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbWFya2VyU291cmNlLnJlbW92ZUZlYXR1cmUodGhpcy5fbWFya2VyKTtcbiAgICAgIHRoaXMuX21hcmtlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21hcmtlckludGVyYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX21hcC5nZXRJbnRlcmFjdGlvbnMoKS5wb3AoKTtcbiAgICAgIHRoaXMuX21hcmtlckludGVyYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFya2VyQ29vcmRpbmF0ZXMoKTogbnVtYmVyW10gfCBudWxsIHtcbiAgICBpZiAodGhpcy5fbWFya2VyID09PSB1bmRlZmluZWQgfHwgdGhpcy5fbWFya2VyID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXJrZXI7XG4gICAgfVxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdGhpcy5fbWFya2VyLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAvLyBjb29yZGluYXRlcyBpcyBpbiBFUFNHOjM4NTcgKG1ldGVycyksIHdlIHRyYW5zZm9ybSBpdCBpbnRvIEVQU0c6NDMyNiAoZGVncmVlcylcbiAgICByZXR1cm4gb2wucHJvai50cmFuc2Zvcm0oY29vcmRpbmF0ZXMsICdFUFNHOjM4NTcnLCAnRVBTRzo0MzI2Jyk7XG4gIH1cblxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICB0aGlzLl9tYXAudXBkYXRlU2l6ZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBbaWRdPVwibWFwSWRcIiBjbGFzcz1cIm1hcFwiIChyZXNpemVkKT1cIm9uUmVzaXplKClcIj48L2Rpdj5cbiJdfQ==
1
+ /* eslint-disable no-self-assign */
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { OpenLayerLoaderService } from '../geolocation/openlayer-loader.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../geolocation/openlayer-loader.service";
7
+ export class MapComponent {
8
+ static idCounter = 0;
9
+ loaded$ = new BehaviorSubject(false);
10
+ _map;
11
+ mapId;
12
+ _zoom;
13
+ set zoom(zoom) {
14
+ if (!isNaN(zoom)) {
15
+ this._zoom = zoom;
16
+ if (this._map) {
17
+ this._map.getView().setZoom(zoom);
18
+ }
19
+ }
20
+ }
21
+ get zoom() {
22
+ return this._zoom;
23
+ }
24
+ _center;
25
+ set center(center) {
26
+ if (center && center.coordinates && center.coordinates.length === 2) {
27
+ this._center = center;
28
+ if (this._map) {
29
+ this._map.getView().setCenter(ol.proj.fromLonLat(center.coordinates));
30
+ }
31
+ }
32
+ }
33
+ get center() {
34
+ return this._center;
35
+ }
36
+ _readonly;
37
+ set readonly(readonly) {
38
+ if (!readonly) {
39
+ if (this._map) {
40
+ this._map.on('click', (args) => {
41
+ // args.coordinate is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
42
+ const coordinates = ol.proj.toLonLat(args.coordinate);
43
+ // alternatively: const lonLat = ol.proj.transform(args.coordinate,'EPSG:3857','EPSG:4326');
44
+ this.addMarkerAtCoordinates(coordinates);
45
+ });
46
+ this._map.on('pointermove', (event) => {
47
+ const pixel = this._map.getEventPixel(event.originalEvent);
48
+ const hit = this._map.hasFeatureAtPixel(pixel);
49
+ this._map.getViewport().style.cursor = hit ? 'move' : 'grab';
50
+ });
51
+ }
52
+ }
53
+ else {
54
+ if (this._map) {
55
+ this._map.on('click', (args) => { });
56
+ this._map.on('pointermove', (event) => { });
57
+ this._map.getViewport().style.cursor = 'grab';
58
+ }
59
+ }
60
+ this._readonly = readonly;
61
+ // reset marker coordinates so marker interactions can be created or recreated accordingly
62
+ // to the changes to readonly
63
+ this.markerCoordinates = this.markerCoordinates;
64
+ }
65
+ get readonly() {
66
+ return this._readonly;
67
+ }
68
+ _marker;
69
+ _markerInteraction;
70
+ _markerCoordinates;
71
+ set markerCoordinates(markerCoordinates) {
72
+ if (markerCoordinates && markerCoordinates.length === 2) {
73
+ this._markerCoordinates = markerCoordinates;
74
+ if (this._map) {
75
+ this.addMarkerAtCoordinates(markerCoordinates);
76
+ }
77
+ }
78
+ else {
79
+ this._markerCoordinates = undefined;
80
+ if (this._map) {
81
+ this.removeMarker();
82
+ }
83
+ }
84
+ }
85
+ get markerCoordinates() {
86
+ return this._markerCoordinates;
87
+ }
88
+ set markerPoint(markerPoint) {
89
+ if (!markerPoint ||
90
+ !(markerPoint.coordinates && markerPoint.coordinates.length === 2)) {
91
+ this.markerCoordinates = undefined;
92
+ }
93
+ else {
94
+ this.markerCoordinates = [
95
+ +markerPoint.coordinates[0],
96
+ +markerPoint.coordinates[1]
97
+ ];
98
+ }
99
+ this.valueChange.emit(markerPoint);
100
+ }
101
+ get markerPoint() {
102
+ return {
103
+ type: 'Point',
104
+ coordinates: this.markerCoordinates
105
+ };
106
+ }
107
+ valueChange = new EventEmitter();
108
+ _markerSource;
109
+ _markerStyle;
110
+ constructor(olLoader) {
111
+ olLoader.load().subscribe((_) => {
112
+ // Initialize
113
+ this._markerSource = new ol.source.Vector();
114
+ this._markerStyle = new ol.style.Style({
115
+ image: new ol.style.Icon({
116
+ anchor: [0.5, 1],
117
+ scale: 0.25,
118
+ src: '/assets/img/marker.png'
119
+ })
120
+ });
121
+ this.loaded$.next(true);
122
+ });
123
+ }
124
+ ngOnInit() {
125
+ this.mapId = this.mapId ? this.mapId : 'map' + MapComponent.idCounter++;
126
+ }
127
+ ngAfterViewInit() {
128
+ this.loaded$.subscribe((loaded) => {
129
+ if (loaded) {
130
+ this.initMap();
131
+ }
132
+ });
133
+ }
134
+ initMap() {
135
+ this._map = new ol.Map({
136
+ target: this.mapId,
137
+ controls: ol.control.defaults({ attribution: false }),
138
+ layers: [
139
+ new ol.layer.Tile({
140
+ source: new ol.source.OSM()
141
+ }),
142
+ new ol.layer.Vector({
143
+ source: this._markerSource,
144
+ style: this._markerStyle
145
+ })
146
+ ],
147
+ view: new ol.View({
148
+ center: ol.proj.fromLonLat(this.center !== undefined ? this.center.coordinates : [0, 0]),
149
+ zoom: this.zoom
150
+ })
151
+ });
152
+ if (this.center === undefined || this.center === null) {
153
+ // if the center is not set, we set its default value
154
+ if ('geolocation' in navigator) {
155
+ navigator.geolocation.getCurrentPosition((position) => {
156
+ this.center = {
157
+ type: 'Point',
158
+ coordinates: [position.coords.longitude, position.coords.latitude]
159
+ };
160
+ }, (error) => {
161
+ this.center = {
162
+ type: 'Point',
163
+ coordinates: [0, 0]
164
+ };
165
+ });
166
+ }
167
+ else {
168
+ this.center = {
169
+ type: 'Point',
170
+ coordinates: [0, 0]
171
+ };
172
+ }
173
+ }
174
+ else {
175
+ // the center needs the map to be properly set, so if it was set before the map was initialized,
176
+ // we set the center again to perform necessary adjustements
177
+ this.center = this.center;
178
+ }
179
+ if (this.zoom === undefined || this.zoom === null) {
180
+ // if the zoom is not set, we set its default value
181
+ this.zoom = 18;
182
+ }
183
+ else {
184
+ // the zoom needs the map to be properly set, so if it was set before the map was initialized,
185
+ // we set the zoom again to perform necessary adjustements
186
+ this.zoom = this.zoom;
187
+ }
188
+ if (this.readonly === undefined || this.readonly === null) {
189
+ // if readonly is not set, we set its default value
190
+ this.readonly = false;
191
+ }
192
+ else {
193
+ // readonly needs the map to be properly set, so if it was set before the map was initialized,
194
+ // we set readonly again to perform necessary adjustements
195
+ this.readonly = this.readonly;
196
+ }
197
+ if (this.markerCoordinates !== undefined &&
198
+ this.markerCoordinates !== null) {
199
+ // the marker coordinates need the map to be properly set, so if they were set before the map was initialized,
200
+ // we set the marker coordinates again to perform necessary adjustements
201
+ this.markerCoordinates = this.markerCoordinates;
202
+ }
203
+ }
204
+ addMarkerAtCoordinates(coordinates) {
205
+ if (coordinates && coordinates.length === 2) {
206
+ if (this._marker !== undefined) {
207
+ this.removeMarker();
208
+ }
209
+ this._marker = new ol.Feature({
210
+ geometry: new ol.geom.Point(
211
+ // [lon, lat] is in EPSG:4326 (degrees), we transform it into EPSG:3857 (meters)
212
+ ol.proj.transform(coordinates, 'EPSG:4326', 'EPSG:3857'))
213
+ });
214
+ this._markerSource.addFeature(this._marker);
215
+ this._markerCoordinates = this.getMarkerCoordinates();
216
+ if (!this.readonly) {
217
+ const dragInteraction = new ol.interaction.Modify({
218
+ features: new ol.Collection([this._marker]),
219
+ style: this._markerStyle,
220
+ pixelTolerance: 50,
221
+ hitDetection: true
222
+ });
223
+ this._markerInteraction = dragInteraction;
224
+ this._map.addInteraction(dragInteraction);
225
+ }
226
+ this._marker.on('change', () => {
227
+ this._markerCoordinates = this.getMarkerCoordinates();
228
+ }, this._marker);
229
+ }
230
+ }
231
+ removeMarker() {
232
+ if (this._marker !== undefined) {
233
+ this._markerSource.removeFeature(this._marker);
234
+ this._marker = undefined;
235
+ }
236
+ if (this._markerInteraction !== undefined) {
237
+ this._map.getInteractions().pop();
238
+ this._markerInteraction = undefined;
239
+ }
240
+ }
241
+ getMarkerCoordinates() {
242
+ if (this._marker === undefined || this._marker == null) {
243
+ return this._marker;
244
+ }
245
+ const coordinates = this._marker.getGeometry().getCoordinates();
246
+ // coordinates is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
247
+ return ol.proj.transform(coordinates, 'EPSG:3857', 'EPSG:4326');
248
+ }
249
+ onResize() {
250
+ if (this._map) {
251
+ this._map.updateSize();
252
+ }
253
+ }
254
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: MapComponent, deps: [{ token: i1.OpenLayerLoaderService }], target: i0.ɵɵFactoryTarget.Component });
255
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: MapComponent, selector: "lux-map", inputs: { mapId: "mapId", zoom: "zoom", center: "center", readonly: "readonly", markerCoordinates: "markerCoordinates", markerPoint: "markerPoint" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] });
256
+ }
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: MapComponent, decorators: [{
258
+ type: Component,
259
+ args: [{ selector: 'lux-map', template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] }]
260
+ }], ctorParameters: () => [{ type: i1.OpenLayerLoaderService }], propDecorators: { mapId: [{
261
+ type: Input
262
+ }], zoom: [{
263
+ type: Input
264
+ }], center: [{
265
+ type: Input
266
+ }], readonly: [{
267
+ type: Input
268
+ }], markerCoordinates: [{
269
+ type: Input
270
+ }], markerPoint: [{
271
+ type: Input
272
+ }], valueChange: [{
273
+ type: Output
274
+ }] } });
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL21hcC9tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvbWFwL21hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFFbkMsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7QUFZakYsTUFBTSxPQUFPLFlBQVk7SUFDdkIsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFYixPQUFPLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9ELElBQUksQ0FBTTtJQUVULEtBQUssQ0FBQztJQUVmLEtBQUssQ0FBUztJQUNkLElBQ0ksSUFBSSxDQUFDLElBQVk7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxDQUFXO0lBQ2xCLElBQ0ksTUFBTSxDQUFDLE1BQWdCO1FBQ3pCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxX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QUFLO2dCQWVGLE1BQU07c0JBRFQsS0FBSztnQkFlRixRQUFRO3NCQURYLEtBQUs7Z0JBb0NNLGlCQUFpQjtzQkFENUIsS0FBSztnQkFrQkYsV0FBVztzQkFEZCxLQUFLO2dCQXFCSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1hc3NpZ24gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT3BlbkxheWVyTG9hZGVyU2VydmljZSB9IGZyb20gJy4uL2dlb2xvY2F0aW9uL29wZW5sYXllci1sb2FkZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IEdlb1BvaW50IH0gZnJvbSAnLi9nZW9wb2ludCc7XG5cbi8vIEBkeW5hbWljXG5kZWNsYXJlIGNvbnN0IG9sOiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x1eC1tYXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWFwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWFwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgc3RhdGljIGlkQ291bnRlciA9IDA7XG5cbiAgcHJpdmF0ZSBsb2FkZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBwcml2YXRlIF9tYXA6IGFueTtcblxuICBASW5wdXQoKSBtYXBJZDtcblxuICBfem9vbTogbnVtYmVyO1xuICBASW5wdXQoKVxuICBzZXQgem9vbSh6b29tOiBudW1iZXIpIHtcbiAgICBpZiAoIWlzTmFOKHpvb20pKSB7XG4gICAgICB0aGlzLl96b29tID0gem9vbTtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLmdldFZpZXcoKS5zZXRab29tKHpvb20pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl96b29tO1xuICB9XG5cbiAgX2NlbnRlcjogR2VvUG9pbnQ7XG4gIEBJbnB1dCgpXG4gIHNldCBjZW50ZXIoY2VudGVyOiBHZW9Qb2ludCkge1xuICAgIGlmIChjZW50ZXIgJiYgY2VudGVyLmNvb3JkaW5hdGVzICYmIGNlbnRlci5jb29yZGluYXRlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHRoaXMuX2NlbnRlciA9IGNlbnRlcjtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLmdldFZpZXcoKS5zZXRDZW50ZXIob2wucHJvai5mcm9tTG9uTGF0KGNlbnRlci5jb29yZGluYXRlcykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgY2VudGVyKCk6IEdlb1BvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fY2VudGVyO1xuICB9XG5cbiAgX3JlYWRvbmx5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBzZXQgcmVhZG9ubHkocmVhZG9ubHk6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXJlYWRvbmx5KSB7XG4gICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCAoYXJnczogYW55KSA9PiB7XG4gICAgICAgICAgLy8gYXJncy5jb29yZGluYXRlIGlzIGluIEVQU0c6Mzg1NyAobWV0ZXJzKSwgd2UgdHJhbnNmb3JtIGl0IGludG8gRVBTRzo0MzI2IChkZWdyZWVzKVxuICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gb2wucHJvai50b0xvbkxhdChhcmdzLmNvb3JkaW5hdGUpO1xuICAgICAgICAgIC8vIGFsdGVybmF0aXZlbHk6IGNvbnN0IGxvbkxhdCA9IG9sLnByb2oudHJhbnNmb3JtKGFyZ3MuY29vcmRpbmF0ZSwnRVBTRzozODU3JywnRVBTRzo0MzI2Jyk7XG4gICAgICAgICAgdGhpcy5hZGRNYXJrZXJBdENvb3JkaW5hdGVzKGNvb3JkaW5hdGVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX21hcC5vbigncG9pbnRlcm1vdmUnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBpeGVsID0gdGhpcy5fbWFwLmdldEV2ZW50UGl4ZWwoZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICAgICAgY29uc3QgaGl0ID0gdGhpcy5fbWFwLmhhc0ZlYXR1cmVBdFBpeGVsKHBpeGVsKTtcbiAgICAgICAgICB0aGlzLl9tYXAuZ2V0Vmlld3BvcnQoKS5zdHlsZS5jdXJzb3IgPSBoaXQgPyAnbW92ZScgOiAnZ3JhYic7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCAoYXJnczogYW55KSA9PiB7fSk7XG4gICAgICAgIHRoaXMuX21hcC5vbigncG9pbnRlcm1vdmUnLCAoZXZlbnQ6IGFueSkgPT4ge30pO1xuICAgICAgICB0aGlzLl9tYXAuZ2V0Vmlld3BvcnQoKS5zdHlsZS5jdXJzb3IgPSAnZ3JhYic7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3JlYWRvbmx5ID0gcmVhZG9ubHk7XG4gICAgLy8gcmVzZXQgbWFya2VyIGNvb3JkaW5hdGVzIHNvIG1hcmtlciBpbnRlcmFjdGlvbnMgY2FuIGJlIGNyZWF0ZWQgb3IgcmVjcmVhdGVkIGFjY29yZGluZ2x5XG4gICAgLy8gdG8gdGhlIGNoYW5nZXMgdG8gcmVhZG9ubHlcbiAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzID0gdGhpcy5tYXJrZXJDb29yZGluYXRlcztcbiAgfVxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFya2VyOiBhbnk7XG4gIHByaXZhdGUgX21hcmtlckludGVyYWN0aW9uOiBhbnk7XG4gIHByaXZhdGUgX21hcmtlckNvb3JkaW5hdGVzOiBudW1iZXJbXTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzZXQgbWFya2VyQ29vcmRpbmF0ZXMobWFya2VyQ29vcmRpbmF0ZXM6IG51bWJlcltdKSB7XG4gICAgaWYgKG1hcmtlckNvb3JkaW5hdGVzICYmIG1hcmtlckNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fbWFya2VyQ29vcmRpbmF0ZXMgPSBtYXJrZXJDb29yZGluYXRlcztcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5hZGRNYXJrZXJBdENvb3JkaW5hdGVzKG1hcmtlckNvb3JkaW5hdGVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWFya2VyQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTWFya2VyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0IG1hcmtlckNvb3JkaW5hdGVzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fbWFya2VyQ29vcmRpbmF0ZXM7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1hcmtlclBvaW50KG1hcmtlclBvaW50OiBHZW9Qb2ludCkge1xuICAgIGlmIChcbiAgICAgICFtYXJrZXJQb2ludCB8fFxuICAgICAgIShtYXJrZXJQb2ludC5jb29yZGluYXRlcyAmJiBtYXJrZXJQb2ludC5jb29yZGluYXRlcy5sZW5ndGggPT09IDIpXG4gICAgKSB7XG4gICAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzID0gW1xuICAgICAgICArbWFya2VyUG9pbnQuY29vcmRpbmF0ZXNbMF0sXG4gICAgICAgICttYXJrZXJQb2ludC5jb29yZGluYXRlc1sxXVxuICAgICAgXTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG1hcmtlclBvaW50KTtcbiAgfVxuICBnZXQgbWFya2VyUG9pbnQoKTogR2VvUG9pbnQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgY29vcmRpbmF0ZXM6IHRoaXMubWFya2VyQ29vcmRpbmF0ZXNcbiAgICB9O1xuICB9XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R2VvUG9pbnQ+KCk7XG5cbiAgcHJpdmF0ZSBfbWFya2VyU291cmNlOiBhbnk7XG4gIHByaXZhdGUgX21hcmtlclN0eWxlOiBhbnk7XG5cbiAgY29uc3RydWN0b3Iob2xMb2FkZXI6IE9wZW5MYXllckxvYWRlclNlcnZpY2UpIHtcbiAgICBvbExvYWRlci5sb2FkKCkuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplXG4gICAgICB0aGlzLl9tYXJrZXJTb3VyY2UgPSBuZXcgb2wuc291cmNlLlZlY3RvcigpO1xuICAgICAgdGhpcy5fbWFya2VyU3R5bGUgPSBuZXcgb2wuc3R5bGUuU3R5bGUoe1xuICAgICAgICBpbWFnZTogbmV3IG9sLnN0eWxlLkljb24oe1xuICAgICAgICAgIGFuY2hvcjogWzAuNSwgMV0sXG4gICAgICAgICAgc2NhbGU6IDAuMjUsXG4gICAgICAgICAgc3JjOiAnL2Fzc2V0cy9pbWcvbWFya2VyLnBuZydcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2FkZWQkLm5leHQodHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hcElkID0gdGhpcy5tYXBJZCA/IHRoaXMubWFwSWQgOiAnbWFwJyArIE1hcENvbXBvbmVudC5pZENvdW50ZXIrKztcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRlZCQuc3Vic2NyaWJlKChsb2FkZWQpID0+IHtcbiAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgdGhpcy5pbml0TWFwKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBpbml0TWFwKCk6IHZvaWQge1xuICAgIHRoaXMuX21hcCA9IG5ldyBvbC5NYXAoe1xuICAgICAgdGFyZ2V0OiB0aGlzLm1hcElkLFxuICAgICAgY29udHJvbHM6IG9sLmNvbnRyb2wuZGVmYXVsdHMoeyBhdHRyaWJ1dGlvbjogZmFsc2UgfSksXG4gICAgICBsYXllcnM6IFtcbiAgICAgICAgbmV3IG9sLmxheWVyLlRpbGUoe1xuICAgICAgICAgIHNvdXJjZTogbmV3IG9sLnNvdXJjZS5PU00oKVxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IG9sLmxheWVyLlZlY3Rvcih7XG4gICAgICAgICAgc291cmNlOiB0aGlzLl9tYXJrZXJTb3VyY2UsXG4gICAgICAgICAgc3R5bGU6IHRoaXMuX21hcmtlclN0eWxlXG4gICAgICAgIH0pXG4gICAgICBdLFxuICAgICAgdmlldzogbmV3IG9sLlZpZXcoe1xuICAgICAgICBjZW50ZXI6IG9sLnByb2ouZnJvbUxvbkxhdChcbiAgICAgICAgICB0aGlzLmNlbnRlciAhPT0gdW5kZWZpbmVkID8gdGhpcy5jZW50ZXIuY29vcmRpbmF0ZXMgOiBbMCwgMF1cbiAgICAgICAgKSxcbiAgICAgICAgem9vbTogdGhpcy56b29tXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY2VudGVyID09PSB1bmRlZmluZWQgfHwgdGhpcy5jZW50ZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIGlmIHRoZSBjZW50ZXIgaXMgbm90IHNldCwgd2Ugc2V0IGl0cyBkZWZhdWx0IHZhbHVlXG4gICAgICBpZiAoJ2dlb2xvY2F0aW9uJyBpbiBuYXZpZ2F0b3IpIHtcbiAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgICAocG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgICBjb29yZGluYXRlczogW3Bvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgICBjb29yZGluYXRlczogWzAsIDBdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2VudGVyID0ge1xuICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IFswLCAwXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGUgY2VudGVyIG5lZWRzIHRoZSBtYXAgdG8gYmUgcHJvcGVybHkgc2V0LCBzbyBpZiBpdCB3YXMgc2V0IGJlZm9yZSB0aGUgbWFwIHdhcyBpbml0aWFsaXplZCxcbiAgICAgIC8vIHdlIHNldCB0aGUgY2VudGVyIGFnYWluIHRvIHBlcmZvcm0gbmVjZXNzYXJ5IGFkanVzdGVtZW50c1xuICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLmNlbnRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy56b29tID09PSB1bmRlZmluZWQgfHwgdGhpcy56b29tID09PSBudWxsKSB7XG4gICAgICAvLyBpZiB0aGUgem9vbSBpcyBub3Qgc2V0LCB3ZSBzZXQgaXRzIGRlZmF1bHQgdmFsdWVcbiAgICAgIHRoaXMuem9vbSA9IDE4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGUgem9vbSBuZWVkcyB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHNldCwgc28gaWYgaXQgd2FzIHNldCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQsXG4gICAgICAvLyB3ZSBzZXQgdGhlIHpvb20gYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLnpvb20gPSB0aGlzLnpvb207XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZG9ubHkgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlYWRvbmx5ID09PSBudWxsKSB7XG4gICAgICAvLyBpZiByZWFkb25seSBpcyBub3Qgc2V0LCB3ZSBzZXQgaXRzIGRlZmF1bHQgdmFsdWVcbiAgICAgIHRoaXMucmVhZG9ubHkgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVhZG9ubHkgbmVlZHMgdGhlIG1hcCB0byBiZSBwcm9wZXJseSBzZXQsIHNvIGlmIGl0IHdhcyBzZXQgYmVmb3JlIHRoZSBtYXAgd2FzIGluaXRpYWxpemVkLFxuICAgICAgLy8gd2Ugc2V0IHJlYWRvbmx5IGFnYWluIHRvIHBlcmZvcm0gbmVjZXNzYXJ5IGFkanVzdGVtZW50c1xuICAgICAgdGhpcy5yZWFkb25seSA9IHRoaXMucmVhZG9ubHk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5tYXJrZXJDb29yZGluYXRlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzICE9PSBudWxsXG4gICAgKSB7XG4gICAgICAvLyB0aGUgbWFya2VyIGNvb3JkaW5hdGVzIG5lZWQgdGhlIG1hcCB0byBiZSBwcm9wZXJseSBzZXQsIHNvIGlmIHRoZXkgd2VyZSBzZXQgYmVmb3JlIHRoZSBtYXAgd2FzIGluaXRpYWxpemVkLFxuICAgICAgLy8gd2Ugc2V0IHRoZSBtYXJrZXIgY29vcmRpbmF0ZXMgYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzID0gdGhpcy5tYXJrZXJDb29yZGluYXRlcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZE1hcmtlckF0Q29vcmRpbmF0ZXMoY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgaWYgKGNvb3JkaW5hdGVzICYmIGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgaWYgKHRoaXMuX21hcmtlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTWFya2VyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9tYXJrZXIgPSBuZXcgb2wuRmVhdHVyZSh7XG4gICAgICAgIGdlb21ldHJ5OiBuZXcgb2wuZ2VvbS5Qb2ludChcbiAgICAgICAgICAvLyBbbG9uLCBsYXRdIGlzIGluIEVQU0c6NDMyNiAoZGVncmVlcyksIHdlIHRyYW5zZm9ybSBpdCBpbnRvIEVQU0c6Mzg1NyAobWV0ZXJzKVxuICAgICAgICAgIG9sLnByb2oudHJhbnNmb3JtKGNvb3JkaW5hdGVzLCAnRVBTRzo0MzI2JywgJ0VQU0c6Mzg1NycpXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbWFya2VyU291cmNlLmFkZEZlYXR1cmUodGhpcy5fbWFya2VyKTtcbiAgICAgIHRoaXMuX21hcmtlckNvb3JkaW5hdGVzID0gdGhpcy5nZXRNYXJrZXJDb29yZGluYXRlcygpO1xuXG4gICAgICBpZiAoIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgY29uc3QgZHJhZ0ludGVyYWN0aW9uID0gbmV3IG9sLmludGVyYWN0aW9uLk1vZGlmeSh7XG4gICAgICAgICAgZmVhdHVyZXM6IG5ldyBvbC5Db2xsZWN0aW9uKFt0aGlzLl9tYXJrZXJdKSxcbiAgICAgICAgICBzdHlsZTogdGhpcy5fbWFya2VyU3R5bGUsXG4gICAgICAgICAgcGl4ZWxUb2xlcmFuY2U6IDUwLFxuICAgICAgICAgIGhpdERldGVjdGlvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbWFya2VySW50ZXJhY3Rpb24gPSBkcmFnSW50ZXJhY3Rpb247XG4gICAgICAgIHRoaXMuX21hcC5hZGRJbnRlcmFjdGlvbihkcmFnSW50ZXJhY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9tYXJrZXIub24oXG4gICAgICAgICdjaGFuZ2UnLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLmdldE1hcmtlckNvb3JkaW5hdGVzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuX21hcmtlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1hcmtlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFya2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX21hcmtlclNvdXJjZS5yZW1vdmVGZWF0dXJlKHRoaXMuX21hcmtlcik7XG4gICAgICB0aGlzLl9tYXJrZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tYXJrZXJJbnRlcmFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9tYXAuZ2V0SW50ZXJhY3Rpb25zKCkucG9wKCk7XG4gICAgICB0aGlzLl9tYXJrZXJJbnRlcmFjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1hcmtlckNvb3JkaW5hdGVzKCk6IG51bWJlcltdIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX21hcmtlciA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX21hcmtlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFya2VyO1xuICAgIH1cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IHRoaXMuX21hcmtlci5nZXRHZW9tZXRyeSgpLmdldENvb3JkaW5hdGVzKCk7XG4gICAgLy8gY29vcmRpbmF0ZXMgaXMgaW4gRVBTRzozODU3IChtZXRlcnMpLCB3ZSB0cmFuc2Zvcm0gaXQgaW50byBFUFNHOjQzMjYgKGRlZ3JlZXMpXG4gICAgcmV0dXJuIG9sLnByb2oudHJhbnNmb3JtKGNvb3JkaW5hdGVzLCAnRVBTRzozODU3JywgJ0VQU0c6NDMyNicpO1xuICB9XG5cbiAgb25SZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgdGhpcy5fbWFwLnVwZGF0ZVNpemUoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgW2lkXT1cIm1hcElkXCIgY2xhc3M9XCJtYXBcIiAocmVzaXplZCk9XCJvblJlc2l6ZSgpXCI+PC9kaXY+XG4iXX0=