@theseam/ui-common 0.3.0 → 0.3.3

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 (131) hide show
  1. package/breadcrumbs/_breadcrumbs-theme.scss +3 -0
  2. package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -0
  3. package/breadcrumbs/styles/_utilities.scss +3 -0
  4. package/breadcrumbs/styles/_variables.scss +1 -0
  5. package/breadcrumbs/theseam-ui-common-breadcrumbs.metadata.json +1 -1
  6. package/bundles/theseam-ui-common-breadcrumbs.umd.js +2 -1
  7. package/bundles/theseam-ui-common-breadcrumbs.umd.js.map +1 -1
  8. package/bundles/theseam-ui-common-dynamic.umd.js +1 -0
  9. package/bundles/theseam-ui-common-dynamic.umd.js.map +1 -1
  10. package/bundles/theseam-ui-common-form-field.umd.js +1 -1
  11. package/bundles/theseam-ui-common-form-field.umd.js.map +1 -1
  12. package/bundles/theseam-ui-common-framework.umd.js +18 -15
  13. package/bundles/theseam-ui-common-framework.umd.js.map +1 -1
  14. package/bundles/theseam-ui-common-google-maps.umd.js +2202 -0
  15. package/bundles/theseam-ui-common-google-maps.umd.js.map +1 -0
  16. package/bundles/theseam-ui-common-menu.umd.js +1 -0
  17. package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
  18. package/bundles/theseam-ui-common-modal.umd.js +21 -1
  19. package/bundles/theseam-ui-common-modal.umd.js.map +1 -1
  20. package/bundles/theseam-ui-common-utils.umd.js +610 -136
  21. package/bundles/theseam-ui-common-utils.umd.js.map +1 -1
  22. package/bundles/theseam-ui-common-widget.umd.js +4 -2
  23. package/bundles/theseam-ui-common-widget.umd.js.map +1 -1
  24. package/esm2015/breadcrumbs/breadcrumbs/breadcrumbs.component.js +4 -3
  25. package/esm2015/dynamic/evaluators/jexl-evaluator/jexl-evaluator.js +2 -1
  26. package/esm2015/form-field/input.directive.js +2 -2
  27. package/esm2015/framework/base-layout/base-layout.component.js +3 -3
  28. package/esm2015/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.js +5 -5
  29. package/esm2015/framework/top-bar/top-bar-title/top-bar-title.component.js +4 -3
  30. package/esm2015/framework/top-bar/top-bar.component.js +10 -8
  31. package/esm2015/google-maps/google-maps/google-maps.component.js +261 -0
  32. package/esm2015/google-maps/google-maps-contextmenu.js +113 -0
  33. package/esm2015/google-maps/google-maps-controls.service.js +70 -0
  34. package/esm2015/google-maps/google-maps-feature-helpers.js +177 -0
  35. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.js +195 -0
  36. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.js +163 -0
  37. package/esm2015/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.js +57 -0
  38. package/esm2015/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.js +119 -0
  39. package/esm2015/google-maps/google-maps.module.js +45 -0
  40. package/esm2015/google-maps/google-maps.service.js +344 -0
  41. package/esm2015/google-maps/map-control.component.js +65 -0
  42. package/esm2015/google-maps/map-controls-service.js +4 -0
  43. package/esm2015/google-maps/map-file-drop/map-file-drop.component.js +135 -0
  44. package/esm2015/google-maps/map-value-manager.service.js +46 -0
  45. package/esm2015/google-maps/public-api.js +14 -0
  46. package/esm2015/google-maps/theseam-ui-common-google-maps.js +6 -0
  47. package/esm2015/menu/menu-toggle.directive.js +2 -1
  48. package/esm2015/modal/modal-ref.js +22 -2
  49. package/esm2015/utils/geo-json/coerce-feature-collection.js +44 -0
  50. package/esm2015/utils/geo-json/geo-json-to-area.js +11 -0
  51. package/esm2015/utils/geo-json/is-feature-collection.validator.js +21 -0
  52. package/esm2015/utils/geo-json/is-only-geometry-types.js +23 -0
  53. package/esm2015/utils/geo-json/is-only-geometry-types.validator.js +32 -0
  54. package/esm2015/utils/geo-json/merge-polygons.js +35 -0
  55. package/esm2015/utils/geo-json/no-inner-rings.validator.js +63 -0
  56. package/esm2015/utils/geo-json/no-kinks.validator.js +39 -0
  57. package/esm2015/utils/geo-json/read-geo-file.js +99 -0
  58. package/esm2015/utils/geo-json/split-multi-polygons.js +29 -0
  59. package/esm2015/utils/is-null-or-undefined.js +1 -1
  60. package/esm2015/utils/public-api.js +11 -1
  61. package/esm2015/widget/widget/widget.component.js +1 -1
  62. package/esm2015/widget/widget-content-components/widget-tile/widget-tile.component.js +4 -2
  63. package/fesm2015/theseam-ui-common-breadcrumbs.js +3 -2
  64. package/fesm2015/theseam-ui-common-breadcrumbs.js.map +1 -1
  65. package/fesm2015/theseam-ui-common-dynamic.js +1 -0
  66. package/fesm2015/theseam-ui-common-dynamic.js.map +1 -1
  67. package/fesm2015/theseam-ui-common-form-field.js +1 -1
  68. package/fesm2015/theseam-ui-common-form-field.js.map +1 -1
  69. package/fesm2015/theseam-ui-common-framework.js +15 -12
  70. package/fesm2015/theseam-ui-common-framework.js.map +1 -1
  71. package/fesm2015/theseam-ui-common-google-maps.js +1729 -0
  72. package/fesm2015/theseam-ui-common-google-maps.js.map +1 -0
  73. package/fesm2015/theseam-ui-common-menu.js +1 -0
  74. package/fesm2015/theseam-ui-common-menu.js.map +1 -1
  75. package/fesm2015/theseam-ui-common-modal.js +21 -1
  76. package/fesm2015/theseam-ui-common-modal.js.map +1 -1
  77. package/fesm2015/theseam-ui-common-utils.js +477 -94
  78. package/fesm2015/theseam-ui-common-utils.js.map +1 -1
  79. package/fesm2015/theseam-ui-common-widget.js +4 -2
  80. package/fesm2015/theseam-ui-common-widget.js.map +1 -1
  81. package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
  82. package/framework/base-layout/base-layout.component.scss +14 -0
  83. package/framework/base-layout/styles/_variables.scss +14 -0
  84. package/framework/theseam-ui-common-framework.metadata.json +1 -1
  85. package/framework/top-bar/_top-bar-theme.scss +5 -0
  86. package/framework/top-bar/styles/_utilities.scss +3 -0
  87. package/framework/top-bar/styles/_variables.scss +18 -0
  88. package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.d.ts +3 -1
  89. package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.scss +15 -0
  90. package/framework/top-bar/top-bar-title/top-bar-title.component.scss +6 -0
  91. package/framework/top-bar/top-bar.component.d.ts +3 -0
  92. package/framework/top-bar/top-bar.component.scss +39 -0
  93. package/google-maps/google-maps/google-maps.component.d.ts +89 -0
  94. package/google-maps/google-maps-contextmenu.d.ts +15 -0
  95. package/google-maps/google-maps-controls.service.d.ts +23 -0
  96. package/google-maps/google-maps-feature-helpers.d.ts +37 -0
  97. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.d.ts +104 -0
  98. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.d.ts +80 -0
  99. package/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.d.ts +21 -0
  100. package/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.d.ts +34 -0
  101. package/google-maps/google-maps.module.d.ts +2 -0
  102. package/google-maps/google-maps.service.d.ts +53 -0
  103. package/google-maps/map-control.component.d.ts +20 -0
  104. package/google-maps/map-controls-service.d.ts +13 -0
  105. package/google-maps/map-file-drop/map-file-drop.component.d.ts +34 -0
  106. package/google-maps/map-value-manager.service.d.ts +18 -0
  107. package/google-maps/package.json +11 -0
  108. package/google-maps/public-api.d.ts +13 -0
  109. package/google-maps/theseam-ui-common-google-maps.d.ts +5 -0
  110. package/google-maps/theseam-ui-common-google-maps.metadata.json +1 -0
  111. package/modal/modal-ref.d.ts +1 -0
  112. package/modal/theseam-ui-common-modal.metadata.json +1 -1
  113. package/package.json +17 -10
  114. package/utils/geo-json/coerce-feature-collection.d.ts +2 -0
  115. package/utils/geo-json/geo-json-to-area.d.ts +6 -0
  116. package/utils/geo-json/is-feature-collection.validator.d.ts +3 -0
  117. package/utils/geo-json/is-only-geometry-types.d.ts +5 -0
  118. package/utils/geo-json/is-only-geometry-types.validator.d.ts +4 -0
  119. package/utils/geo-json/merge-polygons.d.ts +9 -0
  120. package/utils/geo-json/no-inner-rings.validator.d.ts +10 -0
  121. package/utils/geo-json/no-kinks.validator.d.ts +3 -0
  122. package/utils/geo-json/read-geo-file.d.ts +7 -0
  123. package/utils/geo-json/split-multi-polygons.d.ts +8 -0
  124. package/utils/is-null-or-undefined.d.ts +1 -1
  125. package/utils/public-api.d.ts +10 -0
  126. package/utils/theseam-ui-common-utils.metadata.json +1 -1
  127. package/widget/styles/_variables.scss +3 -0
  128. package/widget/theseam-ui-common-widget.metadata.json +1 -1
  129. package/widget/widget/widget.component.scss +2 -0
  130. package/widget/widget-content-components/widget-tile/widget-tile.component.d.ts +2 -0
  131. package/widget/widget-content-components/widget-tile/widget-tile.component.scss +1 -1
@@ -0,0 +1,261 @@
1
+ import { __decorate } from "tslib";
2
+ import { FocusMonitor } from '@angular/cdk/a11y';
3
+ import { coerceNumberProperty } from '@angular/cdk/coercion';
4
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, HostBinding, Input, Output, ViewChild, } from '@angular/core';
5
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
+ import { fromEvent, Subject } from 'rxjs';
7
+ import { takeUntil, tap } from 'rxjs/operators';
8
+ import { AgmMap } from '@agm/core';
9
+ import { faCrosshairs, faFileImport } from '@fortawesome/free-solid-svg-icons';
10
+ import { InputBoolean, InputNumber, mixinDisabled } from '@theseam/ui-common/core';
11
+ import { MenuComponent } from '@theseam/ui-common/menu';
12
+ import { GoogleMapsControlsService } from '../google-maps-controls.service';
13
+ import { TheSeamGoogleMapsRecenterButtonControlComponent } from '../google-maps-recenter-button-control/google-maps-recenter-button-control.component';
14
+ import { TheSeamGoogleMapsUploadButtonControlComponent } from '../google-maps-upload-button-control/google-maps-upload-button-control.component';
15
+ import { GoogleMapsService } from '../google-maps.service';
16
+ import { MAP_CONTROLS_SERVICE } from '../map-controls-service';
17
+ import { MapValueManagerService, MapValueSource } from '../map-value-manager.service';
18
+ class TheSeamGoogleMapsComponentBase {
19
+ constructor(_elementRef) {
20
+ this._elementRef = _elementRef;
21
+ }
22
+ }
23
+ const _TheSeamGoogleMapsMixinBase = mixinDisabled(TheSeamGoogleMapsComponentBase);
24
+ /**
25
+ * A wrapper for googlemap.
26
+ */
27
+ export class TheSeamGoogleMapsComponent extends _TheSeamGoogleMapsMixinBase {
28
+ constructor(elementRef, _focusMonitor, _googleMaps, _mapValueManager) {
29
+ super(elementRef);
30
+ this._focusMonitor = _focusMonitor;
31
+ this._googleMaps = _googleMaps;
32
+ this._mapValueManager = _mapValueManager;
33
+ this._ngUnsubscribe = new Subject();
34
+ this._fileUploadControlDef = {
35
+ component: TheSeamGoogleMapsUploadButtonControlComponent,
36
+ data: { label: 'Import Geo File', icon: faFileImport },
37
+ position: 6 /* google.maps.ControlPosition.LEFT_BOTTOM */,
38
+ };
39
+ this._reCenterControlDef = {
40
+ component: TheSeamGoogleMapsRecenterButtonControlComponent,
41
+ data: { label: 'Center on Field', icon: faCrosshairs },
42
+ position: 9 /* google.maps.ControlPosition.RIGHT_BOTTOM */,
43
+ };
44
+ this._focusOrigin = null;
45
+ /**
46
+ * Set the tab index to `-1` to allow the root element of the
47
+ * component to receive `focus` event from javascript, but not get focused by
48
+ * keyboard navigation.
49
+ */
50
+ this._tabIndex = -1;
51
+ this.fileDropEnabled = true;
52
+ this.fileUploadControlEnabled = false;
53
+ this.fullscreenControlEnabled = true;
54
+ this.reCenterControlEnabled = true;
55
+ this.mapTypeControlEnabled = true;
56
+ this.streetViewControlEnabled = false;
57
+ this.allowDrawingHoleInPolygon = false;
58
+ this.zoom = 14;
59
+ this.longitude = -98.570209;
60
+ this.latitude = 37.633814;
61
+ this.mapReady = new EventEmitter();
62
+ this._focusMonitor.monitor(this._elementRef, true).pipe(tap(origin => this._focusOrigin = origin), takeUntil(this._ngUnsubscribe)).subscribe();
63
+ this._mapValueManager.valueChanged.pipe(tap(change => {
64
+ if (this.onChange) {
65
+ this.onChange(change.value);
66
+ }
67
+ if (this.onTouched) {
68
+ this.onTouched();
69
+ }
70
+ }), tap(changed => {
71
+ if (this._googleMaps.mapReady && changed.source !== MapValueSource.FeatureChange) {
72
+ this._googleMaps.setData(changed.value);
73
+ }
74
+ }), takeUntil(this._ngUnsubscribe)).subscribe();
75
+ this._googleMaps.setBaseLatLng(this.latitude, this.longitude);
76
+ }
77
+ set value(value) {
78
+ this._mapValueManager.setValue(value, MapValueSource.Input);
79
+ }
80
+ get value() {
81
+ return this._mapValueManager.value;
82
+ }
83
+ set tabIndex(value) { this._tabIndex = coerceNumberProperty(value); }
84
+ get tabIndex() { return this._tabIndex; }
85
+ set fileImportHandler(value) {
86
+ this._googleMaps.setFileInputHandler(value);
87
+ }
88
+ get _attrDisabled() { return this.disabled || null; }
89
+ get _attrTabIndex() { return this.disabled ? -1 : (this.tabIndex || 0); }
90
+ /** @ignore */
91
+ ngOnInit() {
92
+ this._googleMaps.setFeatureContextMenu(this.featureContextMenu);
93
+ fromEvent(window, 'keydown').pipe(tap((event) => {
94
+ switch (event.code) {
95
+ case 'Delete':
96
+ this._googleMaps.deleteSelection();
97
+ event.preventDefault();
98
+ event.stopPropagation();
99
+ break;
100
+ case 'Escape':
101
+ this._googleMaps.stopDrawing();
102
+ event.preventDefault();
103
+ event.stopPropagation();
104
+ break;
105
+ case 'ContextMenu':
106
+ this._googleMaps.openContextMenu();
107
+ event.preventDefault();
108
+ event.stopPropagation();
109
+ break;
110
+ }
111
+ }), takeUntil(this._ngUnsubscribe)).subscribe();
112
+ }
113
+ /** @ignore */
114
+ ngOnDestroy() {
115
+ this._focusMonitor.stopMonitoring(this._elementRef);
116
+ this._ngUnsubscribe.next();
117
+ this._ngUnsubscribe.complete();
118
+ }
119
+ /** @ignore */
120
+ ngAfterViewInit() { }
121
+ ngOnChanges(changes) {
122
+ let updateBase = false;
123
+ if (changes.hasOwnProperty('latitude')) {
124
+ this.latitude = changes['latitude'].currentValue;
125
+ updateBase = true;
126
+ }
127
+ if (changes.hasOwnProperty('longitude')) {
128
+ this.longitude = changes['longitude'].currentValue;
129
+ updateBase = true;
130
+ }
131
+ if (updateBase) {
132
+ this._googleMaps.setBaseLatLng(this.latitude, this.longitude);
133
+ }
134
+ if (changes.hasOwnProperty('allowDrawingHoleInPolygon')) {
135
+ this._googleMaps.allowDrawingHoleInPolygon(this.allowDrawingHoleInPolygon);
136
+ }
137
+ }
138
+ writeValue(value) {
139
+ this.value = value;
140
+ }
141
+ registerOnChange(fn) {
142
+ this.onChange = fn;
143
+ }
144
+ registerOnTouched(fn) {
145
+ this.onTouched = fn;
146
+ }
147
+ setDisabledState(isDisabled) {
148
+ this.disabled = isDisabled;
149
+ }
150
+ fitBounds(bounds, padding) {
151
+ this._googleMaps.fitBounds(bounds, padding);
152
+ }
153
+ getGeoJson() {
154
+ return this._googleMaps.getGeoJson();
155
+ }
156
+ hasFocus() {
157
+ return this._focusOrigin !== null && this._focusOrigin !== undefined;
158
+ }
159
+ /** Focuses the button. */
160
+ focus() {
161
+ this._getHostElement().focus();
162
+ }
163
+ _getHostElement() {
164
+ return this._elementRef.nativeElement;
165
+ }
166
+ _onMapReady(theMap) {
167
+ var _a;
168
+ this._googleMaps.setMap(theMap);
169
+ this._googleMaps.setData(this._mapValueManager.value);
170
+ // NOTE: AgmMap has a race condition problem that causes the input latitude,
171
+ // longitude, and zoom to get ignored, before googlemaps emits
172
+ // 'center_changed'. This should avoid the issue, until we stop using AgmMap
173
+ // or upgrade to a more recent version that may not have the issue anymore.
174
+ this._googleMaps.reCenterOnFeatures();
175
+ (_a = this._googleMaps.googleMap) === null || _a === void 0 ? void 0 : _a.setZoom(this.zoom);
176
+ }
177
+ _onClickDeleteFeature() {
178
+ this._googleMaps.deleteSelection();
179
+ }
180
+ }
181
+ TheSeamGoogleMapsComponent.decorators = [
182
+ { type: Component, args: [{
183
+ selector: 'seam-google-maps',
184
+ template: "<agm-map\n [latitude]=\"latitude\"\n [longitude]=\"longitude\"\n [zoom]=\"zoom\"\n [mapTypeControl]=\"true\"\n mapTypeId=\"hybrid\"\n [streetViewControl]=\"false\"\n (mapReady)=\"_onMapReady($event)\"\n [fullscreenControl]=\"$any(fullscreenControlEnabled)\">\n</agm-map>\n<seam-menu #featureContextMenu>\n <button seamMenuItem (click)=\"_onClickDeleteFeature()\">Delete</button>\n</seam-menu>\n<seam-map-file-drop *ngIf=\"fileDropEnabled\"></seam-map-file-drop>\n\n<seam-map-control *ngIf=\"fileUploadControlEnabled\" [def]=\"_fileUploadControlDef\"></seam-map-control>\n<seam-map-control *ngIf=\"reCenterControlEnabled\" [def]=\"_reCenterControlDef\"></seam-map-control>\n",
185
+ inputs: [
186
+ 'disabled'
187
+ ],
188
+ providers: [
189
+ MapValueManagerService,
190
+ GoogleMapsService,
191
+ { provide: MAP_CONTROLS_SERVICE, useClass: GoogleMapsControlsService },
192
+ {
193
+ provide: NG_VALUE_ACCESSOR,
194
+ // tslint:disable-next-line: no-use-before-declare
195
+ useExisting: forwardRef(() => TheSeamGoogleMapsComponent),
196
+ multi: true
197
+ }
198
+ ],
199
+ changeDetection: ChangeDetectionStrategy.OnPush,
200
+ exportAs: 'seamGoogleMaps',
201
+ styles: [":host{display:block;position:relative;height:400px;width:100%}:host.show-focus-border.cdk-focused{outline:0;box-shadow:0 0 0 .2rem #357ebd40}:host.show-focus-border[disabled]{opacity:.65}agm-map{height:inherit;width:inherit}\n"]
202
+ },] }
203
+ ];
204
+ TheSeamGoogleMapsComponent.ctorParameters = () => [
205
+ { type: ElementRef },
206
+ { type: FocusMonitor },
207
+ { type: GoogleMapsService },
208
+ { type: MapValueManagerService }
209
+ ];
210
+ TheSeamGoogleMapsComponent.propDecorators = {
211
+ value: [{ type: Input }],
212
+ tabIndex: [{ type: Input }],
213
+ fileDropEnabled: [{ type: Input }],
214
+ fileUploadControlEnabled: [{ type: Input }],
215
+ fullscreenControlEnabled: [{ type: Input }],
216
+ reCenterControlEnabled: [{ type: Input }],
217
+ mapTypeControlEnabled: [{ type: Input }],
218
+ streetViewControlEnabled: [{ type: Input }],
219
+ allowDrawingHoleInPolygon: [{ type: Input }],
220
+ fileImportHandler: [{ type: Input }],
221
+ _attrDisabled: [{ type: HostBinding, args: ['attr.disabled',] }],
222
+ _attrTabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],
223
+ zoom: [{ type: Input }],
224
+ longitude: [{ type: Input }],
225
+ latitude: [{ type: Input }],
226
+ mapReady: [{ type: Output }],
227
+ agmMap: [{ type: ViewChild, args: [AgmMap, { static: true },] }],
228
+ featureContextMenu: [{ type: ViewChild, args: ['featureContextMenu', { static: true, read: MenuComponent },] }],
229
+ agmMapTpl: [{ type: ViewChild, args: [AgmMap, { static: true, read: ElementRef },] }]
230
+ };
231
+ __decorate([
232
+ InputBoolean()
233
+ ], TheSeamGoogleMapsComponent.prototype, "fileDropEnabled", void 0);
234
+ __decorate([
235
+ InputBoolean()
236
+ ], TheSeamGoogleMapsComponent.prototype, "fileUploadControlEnabled", void 0);
237
+ __decorate([
238
+ InputBoolean()
239
+ ], TheSeamGoogleMapsComponent.prototype, "fullscreenControlEnabled", void 0);
240
+ __decorate([
241
+ InputBoolean()
242
+ ], TheSeamGoogleMapsComponent.prototype, "reCenterControlEnabled", void 0);
243
+ __decorate([
244
+ InputBoolean()
245
+ ], TheSeamGoogleMapsComponent.prototype, "mapTypeControlEnabled", void 0);
246
+ __decorate([
247
+ InputBoolean()
248
+ ], TheSeamGoogleMapsComponent.prototype, "streetViewControlEnabled", void 0);
249
+ __decorate([
250
+ InputBoolean()
251
+ ], TheSeamGoogleMapsComponent.prototype, "allowDrawingHoleInPolygon", void 0);
252
+ __decorate([
253
+ InputNumber()
254
+ ], TheSeamGoogleMapsComponent.prototype, "zoom", void 0);
255
+ __decorate([
256
+ InputNumber()
257
+ ], TheSeamGoogleMapsComponent.prototype, "longitude", void 0);
258
+ __decorate([
259
+ InputNumber()
260
+ ], TheSeamGoogleMapsComponent.prototype, "latitude", void 0);
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL2dvb2dsZS1tYXBzL2dvb2dsZS1tYXBzL2dvb2dsZS1tYXBzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLG1CQUFtQixDQUFBO0FBQzdELE9BQU8sRUFBZ0Isb0JBQW9CLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN2RixPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBQzlFLE9BQU8sRUFBOEIsWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUM5RyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFDM0UsT0FBTyxFQUFFLCtDQUErQyxFQUFFLE1BQU0sc0ZBQXNGLENBQUE7QUFDdEosT0FBTyxFQUFFLDZDQUE2QyxFQUFFLE1BQU0sa0ZBQWtGLENBQUE7QUFDaEosT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyxFQUFjLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDMUUsT0FBTyxFQUFZLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFBO0FBRS9GLE1BQU0sOEJBQThCO0lBQ2xDLFlBQW1CLFdBQXVCO1FBQXZCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO0lBQUcsQ0FBQztDQUMvQztBQUVELE1BQU0sMkJBQTJCLEdBRTdCLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0FBRWpEOztHQUVHO0FBc0JILE1BQU0sT0FBTywwQkFBMkIsU0FBUSwyQkFBMkI7SUFtRnpFLFlBQ0UsVUFBc0IsRUFDTCxhQUEyQixFQUMzQixXQUE4QixFQUM5QixnQkFBd0M7UUFFekQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBSkEsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0IsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUF6RTFDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtRQUU1QywwQkFBcUIsR0FBZTtZQUMzQyxTQUFTLEVBQUUsNkNBQTZDO1lBQ3hELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ3RELFFBQVEsRUFBRSxDQUFDLENBQUMsNkNBQTZDO1NBQzFELENBQUE7UUFFUSx3QkFBbUIsR0FBZTtZQUN6QyxTQUFTLEVBQUUsK0NBQStDO1lBQzFELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ3RELFFBQVEsRUFBRSxDQUFDLENBQUMsOENBQThDO1NBQzNELENBQUE7UUFFTyxpQkFBWSxHQUFnQixJQUFJLENBQUE7UUFheEM7Ozs7V0FJRztRQUNLLGNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUVHLG9CQUFlLEdBQVksSUFBSSxDQUFBO1FBRS9CLDZCQUF3QixHQUFZLEtBQUssQ0FBQTtRQUN6Qyw2QkFBd0IsR0FBWSxJQUFJLENBQUE7UUFDeEMsMkJBQXNCLEdBQVksSUFBSSxDQUFBO1FBQ3RDLDBCQUFxQixHQUFZLElBQUksQ0FBQTtRQUNyQyw2QkFBd0IsR0FBWSxLQUFLLENBQUE7UUFFekMsOEJBQXlCLEdBQVksS0FBSyxDQUFBO1FBZ0IzQyxTQUFJLEdBQVcsRUFBRSxDQUFBO1FBQ2pCLGNBQVMsR0FBVyxDQUFDLFNBQVMsQ0FBQTtRQUM5QixhQUFRLEdBQVcsU0FBUyxDQUFBO1FBRTFDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFBO1FBZTNDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNyRCxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxFQUN6QyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUMvQixDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3JDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNYLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUFFO1lBQ2xELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7YUFBRTtRQUMxQyxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLGFBQWEsRUFBRTtnQkFDaEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FDL0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUViLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFoRkQsSUFDSSxLQUFLLENBQUMsS0FBZTtRQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDN0QsQ0FBQztJQUNELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFDSSxRQUFRLENBQUMsS0FBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQzVFLElBQUksUUFBUSxLQUFhLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQSxDQUFDLENBQUM7SUFrQmhELElBQ0ksaUJBQWlCLENBQUMsS0FBZ0Q7UUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsSUFDSSxhQUFhLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQSxDQUFDLENBQUM7SUFFcEQsSUFDSSxhQUFhLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQTZDeEUsY0FBYztJQUNkLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRS9ELFNBQVMsQ0FBZ0IsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDOUMsR0FBRyxDQUFDLENBQUMsS0FBb0IsRUFBRSxFQUFFO1lBQzNCLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRTtnQkFDbEIsS0FBSyxRQUFRO29CQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFBQyxNQUFLO2dCQUN6RyxLQUFLLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUFFLE1BQUs7Z0JBQ3RHLEtBQUssYUFBYTtvQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQUUsTUFBSzthQUNoSDtRQUNILENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQy9CLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDZixDQUFDO0lBRUQsY0FBYztJQUNkLFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxjQUFjO0lBQ2QsZUFBZSxLQUFLLENBQUM7SUFFckIsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQTtRQUN0QixJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFBO1lBQ2hELFVBQVUsR0FBRyxJQUFJLENBQUE7U0FDbEI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFBO1lBQ2xELFVBQVUsR0FBRyxJQUFJLENBQUE7U0FDbEI7UUFDRCxJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1NBQzlEO1FBRUQsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLDJCQUEyQixDQUFDLEVBQUU7WUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQTtTQUMzRTtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsS0FBZTtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUNwQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUNwQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsZ0JBQWdCLENBQUUsVUFBbUI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUE7SUFDNUIsQ0FBQztJQUVNLFNBQVMsQ0FBQyxNQUFrRSxFQUFFLE9BQXNDO1FBQ3pILElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRU0sVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUE7SUFDdEUsQ0FBQztJQUVELDBCQUEwQjtJQUNuQixLQUFLO1FBQ1YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUE7SUFDdkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUF1Qjs7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELDRFQUE0RTtRQUM1RSw4REFBOEQ7UUFDOUQsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFDckMsTUFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsMENBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUE7SUFDcEMsQ0FBQzs7O1lBck9GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixzckJBQTJDO2dCQUUzQyxNQUFNLEVBQUU7b0JBQ04sVUFBVTtpQkFDWDtnQkFDRCxTQUFTLEVBQUU7b0JBQ1Qsc0JBQXNCO29CQUN0QixpQkFBaUI7b0JBQ2pCLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSx5QkFBeUIsRUFBRTtvQkFDdEU7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsa0RBQWtEO3dCQUNsRCxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDBCQUEwQixDQUFDO3dCQUN6RCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsUUFBUSxFQUFFLGdCQUFnQjs7YUFDM0I7OztZQTVEQyxVQUFVO1lBTkgsWUFBWTtZQStCWixpQkFBaUI7WUFFUCxzQkFBc0I7OztvQkFnRXRDLEtBQUs7dUJBUUwsS0FBSzs4QkFVTCxLQUFLO3VDQUVMLEtBQUs7dUNBQ0wsS0FBSztxQ0FDTCxLQUFLO29DQUNMLEtBQUs7dUNBQ0wsS0FBSzt3Q0FFTCxLQUFLO2dDQUVMLEtBQUs7NEJBS0wsV0FBVyxTQUFDLGVBQWU7NEJBRzNCLFdBQVcsU0FBQyxlQUFlO21CQU0zQixLQUFLO3dCQUNMLEtBQUs7dUJBQ0wsS0FBSzt1QkFFTCxNQUFNO3FCQUVOLFNBQVMsU0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2lDQUNsQyxTQUFTLFNBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7d0JBRXJFLFNBQVMsU0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7O0FBakM1QjtJQUFmLFlBQVksRUFBRTttRUFBZ0M7QUFFL0I7SUFBZixZQUFZLEVBQUU7NEVBQTBDO0FBQ3pDO0lBQWYsWUFBWSxFQUFFOzRFQUF5QztBQUN4QztJQUFmLFlBQVksRUFBRTswRUFBdUM7QUFDdEM7SUFBZixZQUFZLEVBQUU7eUVBQXNDO0FBQ3JDO0lBQWYsWUFBWSxFQUFFOzRFQUEwQztBQUV6QztJQUFmLFlBQVksRUFBRTs2RUFBMkM7QUFnQjNDO0lBQWQsV0FBVyxFQUFFO3dEQUFrQjtBQUNqQjtJQUFkLFdBQVcsRUFBRTs2REFBK0I7QUFDOUI7SUFBZCxXQUFXLEVBQUU7NERBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9jdXNNb25pdG9yLCBGb2N1c09yaWdpbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5J1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSwgTnVtYmVySW5wdXQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQgeyBBZ21NYXAgfSBmcm9tICdAYWdtL2NvcmUnXG5pbXBvcnQgeyBmYUNyb3NzaGFpcnMsIGZhRmlsZUltcG9ydCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucydcbmltcG9ydCB7IENhbkRpc2FibGUsIENhbkRpc2FibGVDdG9yLCBJbnB1dEJvb2xlYW4sIElucHV0TnVtYmVyLCBtaXhpbkRpc2FibGVkIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL2NvcmUnXG5pbXBvcnQgeyBNZW51Q29tcG9uZW50IH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL21lbnUnXG5cbmltcG9ydCB7IEZlYXR1cmVDb2xsZWN0aW9uIH0gZnJvbSAnZ2VvanNvbidcbmltcG9ydCB7IEdvb2dsZU1hcHNDb250cm9sc1NlcnZpY2UgfSBmcm9tICcuLi9nb29nbGUtbWFwcy1jb250cm9scy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVGhlU2VhbUdvb2dsZU1hcHNSZWNlbnRlckJ1dHRvbkNvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuLi9nb29nbGUtbWFwcy1yZWNlbnRlci1idXR0b24tY29udHJvbC9nb29nbGUtbWFwcy1yZWNlbnRlci1idXR0b24tY29udHJvbC5jb21wb25lbnQnXG5pbXBvcnQgeyBUaGVTZWFtR29vZ2xlTWFwc1VwbG9hZEJ1dHRvbkNvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuLi9nb29nbGUtbWFwcy11cGxvYWQtYnV0dG9uLWNvbnRyb2wvZ29vZ2xlLW1hcHMtdXBsb2FkLWJ1dHRvbi1jb250cm9sLmNvbXBvbmVudCdcbmltcG9ydCB7IEdvb2dsZU1hcHNTZXJ2aWNlIH0gZnJvbSAnLi4vZ29vZ2xlLW1hcHMuc2VydmljZSdcbmltcG9ydCB7IE1hcENvbnRyb2wsIE1BUF9DT05UUk9MU19TRVJWSUNFIH0gZnJvbSAnLi4vbWFwLWNvbnRyb2xzLXNlcnZpY2UnXG5pbXBvcnQgeyBNYXBWYWx1ZSwgTWFwVmFsdWVNYW5hZ2VyU2VydmljZSwgTWFwVmFsdWVTb3VyY2UgfSBmcm9tICcuLi9tYXAtdmFsdWUtbWFuYWdlci5zZXJ2aWNlJ1xuXG5jbGFzcyBUaGVTZWFtR29vZ2xlTWFwc0NvbXBvbmVudEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XG59XG5cbmNvbnN0IF9UaGVTZWFtR29vZ2xlTWFwc01peGluQmFzZTogQ2FuRGlzYWJsZUN0b3IgJlxuICB0eXBlb2YgVGhlU2VhbUdvb2dsZU1hcHNDb21wb25lbnRCYXNlID1cbiAgICBtaXhpbkRpc2FibGVkKFRoZVNlYW1Hb29nbGVNYXBzQ29tcG9uZW50QmFzZSlcblxuLyoqXG4gKiBBIHdyYXBwZXIgZm9yIGdvb2dsZW1hcC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2VhbS1nb29nbGUtbWFwcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9nb29nbGUtbWFwcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dvb2dsZS1tYXBzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGlucHV0czogW1xuICAgICdkaXNhYmxlZCdcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTWFwVmFsdWVNYW5hZ2VyU2VydmljZSxcbiAgICBHb29nbGVNYXBzU2VydmljZSxcbiAgICB7IHByb3ZpZGU6IE1BUF9DT05UUk9MU19TRVJWSUNFLCB1c2VDbGFzczogR29vZ2xlTWFwc0NvbnRyb2xzU2VydmljZSB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11c2UtYmVmb3JlLWRlY2xhcmVcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRoZVNlYW1Hb29nbGVNYXBzQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZXhwb3J0QXM6ICdzZWFtR29vZ2xlTWFwcydcbn0pXG5leHBvcnQgY2xhc3MgVGhlU2VhbUdvb2dsZU1hcHNDb21wb25lbnQgZXh0ZW5kcyBfVGhlU2VhbUdvb2dsZU1hcHNNaXhpbkJhc2VcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBDYW5EaXNhYmxlLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlZDogQm9vbGVhbklucHV0XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV96b29tOiBOdW1iZXJJbnB1dFxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbG9uZ2l0dWRlOiBOdW1iZXJJbnB1dFxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbGF0aXR1ZGU6IE51bWJlcklucHV0XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9maWxlRHJvcEVuYWJsZWQ6IEJvb2xlYW5JbnB1dFxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZmlsZVVwbG9hZENvbnRyb2xFbmFibGVkOiBCb29sZWFuSW5wdXRcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Z1bGxzY3JlZW5Db250cm9sRW5hYmxlZDogQm9vbGVhbklucHV0XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9yZUNlbnRlckNvbnRyb2xFbmFibGVkOiBCb29sZWFuSW5wdXRcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX21hcFR5cGVDb250cm9sRW5hYmxlZDogQm9vbGVhbklucHV0XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9zdHJlZXRWaWV3Q29udHJvbEVuYWJsZWQ6IEJvb2xlYW5JbnB1dFxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfYWxsb3dEcmF3aW5nSG9sZUluUG9seWdvbjogQm9vbGVhbklucHV0XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICByZWFkb25seSBfZmlsZVVwbG9hZENvbnRyb2xEZWY6IE1hcENvbnRyb2wgPSB7XG4gICAgY29tcG9uZW50OiBUaGVTZWFtR29vZ2xlTWFwc1VwbG9hZEJ1dHRvbkNvbnRyb2xDb21wb25lbnQsXG4gICAgZGF0YTogeyBsYWJlbDogJ0ltcG9ydCBHZW8gRmlsZScsIGljb246IGZhRmlsZUltcG9ydCB9LFxuICAgIHBvc2l0aW9uOiA2IC8qIGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvbi5MRUZUX0JPVFRPTSAqLyxcbiAgfVxuXG4gIHJlYWRvbmx5IF9yZUNlbnRlckNvbnRyb2xEZWY6IE1hcENvbnRyb2wgPSB7XG4gICAgY29tcG9uZW50OiBUaGVTZWFtR29vZ2xlTWFwc1JlY2VudGVyQnV0dG9uQ29udHJvbENvbXBvbmVudCxcbiAgICBkYXRhOiB7IGxhYmVsOiAnQ2VudGVyIG9uIEZpZWxkJywgaWNvbjogZmFDcm9zc2hhaXJzIH0sXG4gICAgcG9zaXRpb246IDkgLyogZ29vZ2xlLm1hcHMuQ29udHJvbFBvc2l0aW9uLlJJR0hUX0JPVFRPTSAqLyxcbiAgfVxuXG4gIHByaXZhdGUgX2ZvY3VzT3JpZ2luOiBGb2N1c09yaWdpbiA9IG51bGxcblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodmFsdWU6IE1hcFZhbHVlKSB7XG4gICAgdGhpcy5fbWFwVmFsdWVNYW5hZ2VyLnNldFZhbHVlKHZhbHVlLCBNYXBWYWx1ZVNvdXJjZS5JbnB1dClcbiAgfVxuICBnZXQgdmFsdWUoKTogTWFwVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXBWYWx1ZU1hbmFnZXIudmFsdWVcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB0YWJJbmRleCh2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX3RhYkluZGV4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpIH1cbiAgZ2V0IHRhYkluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl90YWJJbmRleCB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHRhYiBpbmRleCB0byBgLTFgIHRvIGFsbG93IHRoZSByb290IGVsZW1lbnQgb2YgdGhlXG4gICAqIGNvbXBvbmVudCB0byByZWNlaXZlIGBmb2N1c2AgZXZlbnQgZnJvbSBqYXZhc2NyaXB0LCBidXQgbm90IGdldCBmb2N1c2VkIGJ5XG4gICAqIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIF90YWJJbmRleCA9IC0xXG5cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGZpbGVEcm9wRW5hYmxlZDogYm9vbGVhbiA9IHRydWVcblxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZmlsZVVwbG9hZENvbnRyb2xFbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGZ1bGxzY3JlZW5Db250cm9sRW5hYmxlZDogYm9vbGVhbiA9IHRydWVcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHJlQ2VudGVyQ29udHJvbEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBtYXBUeXBlQ29udHJvbEVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzdHJlZXRWaWV3Q29udHJvbEVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBhbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uOiBib29sZWFuID0gZmFsc2VcblxuICBASW5wdXQoKVxuICBzZXQgZmlsZUltcG9ydEhhbmRsZXIodmFsdWU6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5zZXRGaWxlSW5wdXRIYW5kbGVyKHZhbHVlKVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRpc2FibGVkJylcbiAgZ2V0IF9hdHRyRGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLmRpc2FibGVkIHx8IG51bGwgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gIGdldCBfYXR0clRhYkluZGV4KCkgeyByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IC0xIDogKHRoaXMudGFiSW5kZXggfHwgMCkgfVxuXG4gIG9uQ2hhbmdlOiBhbnlcbiAgb25Ub3VjaGVkOiBhbnlcblxuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSB6b29tOiBudW1iZXIgPSAxNFxuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBsb25naXR1ZGU6IG51bWJlciA9IC05OC41NzAyMDlcbiAgQElucHV0KCkgQElucHV0TnVtYmVyKCkgbGF0aXR1ZGU6IG51bWJlciA9IDM3LjYzMzgxNFxuXG4gIEBPdXRwdXQoKSBtYXBSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxuXG4gIEBWaWV3Q2hpbGQoQWdtTWFwLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgYWdtTWFwITogQWdtTWFwXG4gIEBWaWV3Q2hpbGQoJ2ZlYXR1cmVDb250ZXh0TWVudScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBNZW51Q29tcG9uZW50IH0pIHB1YmxpYyBmZWF0dXJlQ29udGV4dE1lbnUhOiBNZW51Q29tcG9uZW50XG5cbiAgQFZpZXdDaGlsZChBZ21NYXAsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pIHB1YmxpYyBhZ21NYXBUcGwhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ29vZ2xlTWFwczogR29vZ2xlTWFwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFwVmFsdWVNYW5hZ2VyOiBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLFxuICApIHtcbiAgICBzdXBlcihlbGVtZW50UmVmKVxuXG4gICAgdGhpcy5fZm9jdXNNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwgdHJ1ZSkucGlwZShcbiAgICAgIHRhcChvcmlnaW4gPT4gdGhpcy5fZm9jdXNPcmlnaW4gPSBvcmlnaW4pLFxuICAgICAgdGFrZVVudGlsKHRoaXMuX25nVW5zdWJzY3JpYmUpLFxuICAgICkuc3Vic2NyaWJlKClcblxuICAgIHRoaXMuX21hcFZhbHVlTWFuYWdlci52YWx1ZUNoYW5nZWQucGlwZShcbiAgICAgIHRhcChjaGFuZ2UgPT4ge1xuICAgICAgICBpZiAodGhpcy5vbkNoYW5nZSkgeyB0aGlzLm9uQ2hhbmdlKGNoYW5nZS52YWx1ZSkgfVxuICAgICAgICBpZiAodGhpcy5vblRvdWNoZWQpIHsgdGhpcy5vblRvdWNoZWQoKSB9XG4gICAgICB9KSxcbiAgICAgIHRhcChjaGFuZ2VkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2dvb2dsZU1hcHMubWFwUmVhZHkgJiYgY2hhbmdlZC5zb3VyY2UgIT09IE1hcFZhbHVlU291cmNlLkZlYXR1cmVDaGFuZ2UpIHtcbiAgICAgICAgICB0aGlzLl9nb29nbGVNYXBzLnNldERhdGEoY2hhbmdlZC52YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YWtlVW50aWwodGhpcy5fbmdVbnN1YnNjcmliZSksXG4gICAgKS5zdWJzY3JpYmUoKVxuXG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5zZXRCYXNlTGF0TG5nKHRoaXMubGF0aXR1ZGUsIHRoaXMubG9uZ2l0dWRlKVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5zZXRGZWF0dXJlQ29udGV4dE1lbnUodGhpcy5mZWF0dXJlQ29udGV4dE1lbnUpXG5cbiAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4od2luZG93LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICB0YXAoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICAgIGNhc2UgJ0RlbGV0ZSc6IHRoaXMuX2dvb2dsZU1hcHMuZGVsZXRlU2VsZWN0aW9uKCk7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBicmVha1xuICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6IHRoaXMuX2dvb2dsZU1hcHMuc3RvcERyYXdpbmcoKTsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ICBicmVha1xuICAgICAgICAgIGNhc2UgJ0NvbnRleHRNZW51JzogdGhpcy5fZ29vZ2xlTWFwcy5vcGVuQ29udGV4dE1lbnUoKTsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ICBicmVha1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9uZ1Vuc3Vic2NyaWJlKVxuICAgICkuc3Vic2NyaWJlKClcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKVxuXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBsZXQgdXBkYXRlQmFzZSA9IGZhbHNlXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xhdGl0dWRlJykpIHtcbiAgICAgIHRoaXMubGF0aXR1ZGUgPSBjaGFuZ2VzWydsYXRpdHVkZSddLmN1cnJlbnRWYWx1ZVxuICAgICAgdXBkYXRlQmFzZSA9IHRydWVcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xvbmdpdHVkZScpKSB7XG4gICAgICB0aGlzLmxvbmdpdHVkZSA9IGNoYW5nZXNbJ2xvbmdpdHVkZSddLmN1cnJlbnRWYWx1ZVxuICAgICAgdXBkYXRlQmFzZSA9IHRydWVcbiAgICB9XG4gICAgaWYgKHVwZGF0ZUJhc2UpIHtcbiAgICAgIHRoaXMuX2dvb2dsZU1hcHMuc2V0QmFzZUxhdExuZyh0aGlzLmxhdGl0dWRlLCB0aGlzLmxvbmdpdHVkZSlcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnYWxsb3dEcmF3aW5nSG9sZUluUG9seWdvbicpKSB7XG4gICAgICB0aGlzLl9nb29nbGVNYXBzLmFsbG93RHJhd2luZ0hvbGVJblBvbHlnb24odGhpcy5hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uKVxuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IE1hcFZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm5cbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuXG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWRcbiAgfVxuXG4gIHB1YmxpYyBmaXRCb3VuZHMoYm91bmRzOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsLCBwYWRkaW5nPzogbnVtYmVyIHwgZ29vZ2xlLm1hcHMuUGFkZGluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dvb2dsZU1hcHMuZml0Qm91bmRzKGJvdW5kcywgcGFkZGluZylcbiAgfVxuXG4gIHB1YmxpYyBnZXRHZW9Kc29uKCk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2dvb2dsZU1hcHMuZ2V0R2VvSnNvbigpXG4gIH1cblxuICBwdWJsaWMgaGFzRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzT3JpZ2luICE9PSBudWxsICYmIHRoaXMuX2ZvY3VzT3JpZ2luICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBidXR0b24uICovXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRIb3N0RWxlbWVudCgpLmZvY3VzKClcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhvc3RFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgfVxuXG4gIF9vbk1hcFJlYWR5KHRoZU1hcDogZ29vZ2xlLm1hcHMuTWFwKSB7XG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5zZXRNYXAodGhlTWFwKVxuICAgIHRoaXMuX2dvb2dsZU1hcHMuc2V0RGF0YSh0aGlzLl9tYXBWYWx1ZU1hbmFnZXIudmFsdWUpXG4gICAgLy8gTk9URTogQWdtTWFwIGhhcyBhIHJhY2UgY29uZGl0aW9uIHByb2JsZW0gdGhhdCBjYXVzZXMgdGhlIGlucHV0IGxhdGl0dWRlLFxuICAgIC8vIGxvbmdpdHVkZSwgYW5kIHpvb20gdG8gZ2V0IGlnbm9yZWQsIGJlZm9yZSBnb29nbGVtYXBzIGVtaXRzXG4gICAgLy8gJ2NlbnRlcl9jaGFuZ2VkJy4gVGhpcyBzaG91bGQgYXZvaWQgdGhlIGlzc3VlLCB1bnRpbCB3ZSBzdG9wIHVzaW5nIEFnbU1hcFxuICAgIC8vIG9yIHVwZ3JhZGUgdG8gYSBtb3JlIHJlY2VudCB2ZXJzaW9uIHRoYXQgbWF5IG5vdCBoYXZlIHRoZSBpc3N1ZSBhbnltb3JlLlxuICAgIHRoaXMuX2dvb2dsZU1hcHMucmVDZW50ZXJPbkZlYXR1cmVzKClcbiAgICB0aGlzLl9nb29nbGVNYXBzLmdvb2dsZU1hcD8uc2V0Wm9vbSh0aGlzLnpvb20pXG4gIH1cblxuICBfb25DbGlja0RlbGV0ZUZlYXR1cmUoKSB7XG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5kZWxldGVTZWxlY3Rpb24oKVxuICB9XG59XG4iXX0=
@@ -0,0 +1,113 @@
1
+ import { ESCAPE } from '@angular/cdk/keycodes';
2
+ import { fromEvent, Subject } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import { isFeatureSelected } from './google-maps-feature-helpers';
5
+ // TODO: Close on map losing focus.
6
+ export class GoogleMapsContextMenu {
7
+ constructor(_map, _menu, _position, _vcr, _ngZone, _data, _feature) {
8
+ this._map = _map;
9
+ this._menu = _menu;
10
+ this._vcr = _vcr;
11
+ this._ngZone = _ngZone;
12
+ this._data = _data;
13
+ this._feature = _feature;
14
+ const tplRef = this._menu.templateRef;
15
+ if (tplRef === undefined || tplRef === null) {
16
+ throw Error(`Menu template is not defined.`);
17
+ }
18
+ const ref = this._vcr.createEmbeddedView(tplRef);
19
+ ref.detectChanges();
20
+ const listeners = [];
21
+ const ngUnsubscribe = new Subject();
22
+ // TODO: Fix the initial focus. setTimeout avoids the wrong contextmenu
23
+ // getting triggered, but the first item flashes and looks off this way.
24
+ setTimeout(() => {
25
+ this._menu.focusFirstItem('program');
26
+ });
27
+ this._menu.closed.pipe(takeUntil(ngUnsubscribe)).subscribe(v => {
28
+ this.close();
29
+ });
30
+ fromEvent(document, 'keydown').pipe(takeUntil(ngUnsubscribe)).subscribe((event) => {
31
+ if (event.keyCode === ESCAPE) {
32
+ this.close();
33
+ }
34
+ });
35
+ const __cleanup = () => this._cleanupFn();
36
+ class GoogleMapsContextMenuOverlayView extends google.maps.OverlayView {
37
+ constructor(position, content) {
38
+ super();
39
+ this.position = position;
40
+ this.position = position;
41
+ this.containerDiv = document.createElement('div');
42
+ this.containerDiv.style.cursor = 'auto';
43
+ this.containerDiv.style.height = '0',
44
+ this.containerDiv.style.position = 'absolute';
45
+ this.containerDiv.appendChild(content);
46
+ // Optionally stop clicks, etc., from bubbling up to the map.
47
+ GoogleMapsContextMenuOverlayView.preventMapHitsAndGesturesFrom(this.containerDiv);
48
+ }
49
+ /** Called when the view is added to the map. */
50
+ onAdd() {
51
+ // tslint:disable-next-line: no-non-null-assertion
52
+ this.getPanes().floatPane.appendChild(this.containerDiv);
53
+ }
54
+ /** Called when the view is removed from the map. */
55
+ onRemove() {
56
+ if (this.containerDiv.parentElement) {
57
+ this.containerDiv.parentElement.removeChild(this.containerDiv);
58
+ }
59
+ __cleanup();
60
+ }
61
+ /** Called each frame when the view needs to draw itself. */
62
+ draw() {
63
+ // tslint:disable-next-line: no-non-null-assertion
64
+ const divPosition = this.getProjection().fromLatLngToDivPixel(this.position);
65
+ // Hide the popup when it is far out of view.
66
+ const display = Math.abs(divPosition.x) < 4000 && Math.abs(divPosition.y) < 4000
67
+ ? 'block'
68
+ : 'none';
69
+ if (display === 'block') {
70
+ this.containerDiv.style.left = divPosition.x + 'px';
71
+ this.containerDiv.style.top = divPosition.y + 'px';
72
+ }
73
+ if (this.containerDiv.style.display !== display) {
74
+ this.containerDiv.style.display = display;
75
+ }
76
+ }
77
+ }
78
+ this._overlayView = new GoogleMapsContextMenuOverlayView(_position, ref.rootNodes[0]);
79
+ this._overlayView.setMap(this._map);
80
+ this._ngZone.runOutsideAngular(() => {
81
+ listeners.push(this._data.addListener('removefeature', (event) => {
82
+ if (event.feature === this._feature) {
83
+ this._ngZone.run(() => { this.close(); });
84
+ }
85
+ }));
86
+ listeners.push(this._data.addListener('setproperty', (event) => {
87
+ if (event.feature === this._feature && !isFeatureSelected(this._feature)) {
88
+ this._ngZone.run(() => { this.close(); });
89
+ }
90
+ }));
91
+ listeners.push(this._data.addListener('removeproperty', (event) => {
92
+ if (event.feature === this._feature && !isFeatureSelected(this._feature)) {
93
+ this._ngZone.run(() => { this.close(); });
94
+ }
95
+ }));
96
+ listeners.push(this._map.addListener('click', (event) => {
97
+ this._ngZone.run(() => { this.close(); });
98
+ }));
99
+ listeners.push(this._data.addListener('click', (event) => {
100
+ this._ngZone.run(() => { this.close(); });
101
+ }));
102
+ });
103
+ this._cleanupFn = () => {
104
+ ngUnsubscribe.next();
105
+ ngUnsubscribe.complete();
106
+ listeners.forEach(google.maps.event.removeListener);
107
+ };
108
+ }
109
+ close() {
110
+ this._overlayView.setMap(null);
111
+ }
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtY29udGV4dG1lbnUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvZ29vZ2xlLW1hcHMtY29udGV4dG1lbnUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRTlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUkxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUVqRSxtQ0FBbUM7QUFFbkMsTUFBTSxPQUFPLHFCQUFxQjtJQUtoQyxZQUNtQixJQUFxQixFQUNyQixLQUFvQixFQUNyQyxTQUE2QixFQUNaLElBQXNCLEVBQ3RCLE9BQWUsRUFDZixLQUF1QixFQUN2QixRQUFrQztRQU5sQyxTQUFJLEdBQUosSUFBSSxDQUFpQjtRQUNyQixVQUFLLEdBQUwsS0FBSyxDQUFlO1FBRXBCLFNBQUksR0FBSixJQUFJLENBQWtCO1FBQ3RCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUVuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQTtRQUNyQyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUMzQyxNQUFNLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO1NBQzdDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNoRCxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFbkIsTUFBTSxTQUFTLEdBQW9D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QyxVQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3JCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNwQixhQUFhLENBQUMsUUFBUSxFQUFFLENBQUE7WUFDeEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNyRCxDQUFDLENBQUE7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hDLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTQ0FQRSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2RlcydcbmltcG9ydCB7IE5nWm9uZSwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vbWVudSdcblxuaW1wb3J0IHsgaXNGZWF0dXJlU2VsZWN0ZWQgfSBmcm9tICcuL2dvb2dsZS1tYXBzLWZlYXR1cmUtaGVscGVycydcblxuLy8gVE9ETzogQ2xvc2Ugb24gbWFwIGxvc2luZyBmb2N1cy5cblxuZXhwb3J0IGNsYXNzIEdvb2dsZU1hcHNDb250ZXh0TWVudSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3ZlcmxheVZpZXc6IGdvb2dsZS5tYXBzLk92ZXJsYXlWaWV3XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsZWFudXBGbjogKCkgPT4gdm9pZFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21hcDogZ29vZ2xlLm1hcHMuTWFwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lbnU6IE1lbnVDb21wb25lbnQsXG4gICAgX3Bvc2l0aW9uOiBnb29nbGUubWFwcy5MYXRMbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6IGdvb2dsZS5tYXBzLkRhdGEsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlLFxuICApIHtcbiAgICBjb25zdCB0cGxSZWYgPSB0aGlzLl9tZW51LnRlbXBsYXRlUmVmXG4gICAgaWYgKHRwbFJlZiA9PT0gdW5kZWZpbmVkIHx8IHRwbFJlZiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgRXJyb3IoYE1lbnUgdGVtcGxhdGUgaXMgbm90IGRlZmluZWQuYClcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSB0aGlzLl92Y3IuY3JlYXRlRW1iZWRkZWRWaWV3KHRwbFJlZilcbiAgICByZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgICBjb25zdCBsaXN0ZW5lcnM6IGdvb2dsZS5tYXBzLk1hcHNFdmVudExpc3RlbmVyW10gPSBbXVxuICAgIGNvbnN0IG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgICAvLyBUT0RPOiBGaXggdGhlIGluaXRpYWwgZm9jdXMuIHNldFRpbWVvdXQgYXZvaWRzIHRoZSB3cm9uZyBjb250ZXh0bWVudVxuICAgIC8vIGdldHRpbmcgdHJpZ2dlcmVkLCBidXQgdGhlIGZpcnN0IGl0ZW0gZmxhc2hlcyBhbmQgbG9va3Mgb2ZmIHRoaXMgd2F5LlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fbWVudS5mb2N1c0ZpcnN0SXRlbSgncHJvZ3JhbScpXG4gICAgfSlcbiAgICB0aGlzLl9tZW51LmNsb3NlZC5waXBlKFxuICAgICAgdGFrZVVudGlsKG5nVW5zdWJzY3JpYmUpXG4gICAgKS5zdWJzY3JpYmUodiA9PiB7XG4gICAgICB0aGlzLmNsb3NlKClcbiAgICB9KVxuXG4gICAgZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICB0YWtlVW50aWwobmdVbnN1YnNjcmliZSlcbiAgICApLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSkge1xuICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgX19jbGVhbnVwID0gKCkgPT4gdGhpcy5fY2xlYW51cEZuKClcbiAgICBjbGFzcyBHb29nbGVNYXBzQ29udGV4dE1lbnVPdmVybGF5VmlldyBleHRlbmRzIGdvb2dsZS5tYXBzLk92ZXJsYXlWaWV3IHtcbiAgICAgIHB1YmxpYyBjb250YWluZXJEaXY6IEhUTUxEaXZFbGVtZW50XG5cbiAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcG9zaXRpb246IGdvb2dsZS5tYXBzLkxhdExuZyxcbiAgICAgICAgY29udGVudDogSFRNTEVsZW1lbnRcbiAgICAgICkge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvblxuXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuc3R5bGUuY3Vyc29yID0gJ2F1dG8nXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LnN0eWxlLmhlaWdodCA9ICcwJyxcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGNvbnRlbnQpXG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBzdG9wIGNsaWNrcywgZXRjLiwgZnJvbSBidWJibGluZyB1cCB0byB0aGUgbWFwLlxuICAgICAgICBHb29nbGVNYXBzQ29udGV4dE1lbnVPdmVybGF5Vmlldy5wcmV2ZW50TWFwSGl0c0FuZEdlc3R1cmVzRnJvbSh0aGlzLmNvbnRhaW5lckRpdilcbiAgICAgIH1cblxuICAgICAgLyoqIENhbGxlZCB3aGVuIHRoZSB2aWV3IGlzIGFkZGVkIHRvIHRoZSBtYXAuICovXG4gICAgICBvbkFkZCgpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgdGhpcy5nZXRQYW5lcygpIS5mbG9hdFBhbmUuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXJEaXYpXG4gICAgICB9XG5cbiAgICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgdmlldyBpcyByZW1vdmVkIGZyb20gdGhlIG1hcC4gKi9cbiAgICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXJEaXYucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyRGl2LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXJEaXYpXG4gICAgICAgIH1cbiAgICAgICAgX19jbGVhbnVwKClcbiAgICAgIH1cblxuICAgICAgLyoqIENhbGxlZCBlYWNoIGZyYW1lIHdoZW4gdGhlIHZpZXcgbmVlZHMgdG8gZHJhdyBpdHNlbGYuICovXG4gICAgICBkcmF3KCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBjb25zdCBkaXZQb3NpdGlvbiA9IHRoaXMuZ2V0UHJvamVjdGlvbigpLmZyb21MYXRMbmdUb0RpdlBpeGVsKHRoaXMucG9zaXRpb24pIVxuXG4gICAgICAgIC8vIEhpZGUgdGhlIHBvcHVwIHdoZW4gaXQgaXMgZmFyIG91dCBvZiB2aWV3LlxuICAgICAgICBjb25zdCBkaXNwbGF5ID1cbiAgICAgICAgICBNYXRoLmFicyhkaXZQb3NpdGlvbi54KSA8IDQwMDAgJiYgTWF0aC5hYnMoZGl2UG9zaXRpb24ueSkgPCA0MDAwXG4gICAgICAgICAgICA/ICdibG9jaydcbiAgICAgICAgICAgIDogJ25vbmUnXG5cbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdibG9jaycpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5zdHlsZS5sZWZ0ID0gZGl2UG9zaXRpb24ueCArICdweCdcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5zdHlsZS50b3AgPSBkaXZQb3NpdGlvbi55ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyRGl2LnN0eWxlLmRpc3BsYXkgIT09IGRpc3BsYXkpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5zdHlsZS5kaXNwbGF5ID0gZGlzcGxheVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fb3ZlcmxheVZpZXcgPSBuZXcgR29vZ2xlTWFwc0NvbnRleHRNZW51T3ZlcmxheVZpZXcoX3Bvc2l0aW9uLCByZWYucm9vdE5vZGVzWzBdKVxuICAgIHRoaXMuX292ZXJsYXlWaWV3LnNldE1hcCh0aGlzLl9tYXApXG5cbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLnB1c2godGhpcy5fZGF0YS5hZGRMaXN0ZW5lcigncmVtb3ZlZmVhdHVyZScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5SZW1vdmVGZWF0dXJlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmZlYXR1cmUgPT09IHRoaXMuX2ZlYXR1cmUpIHtcbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHsgdGhpcy5jbG9zZSgpIH0pXG4gICAgICAgIH1cbiAgICAgIH0pKVxuXG4gICAgICBsaXN0ZW5lcnMucHVzaCh0aGlzLl9kYXRhLmFkZExpc3RlbmVyKCdzZXRwcm9wZXJ0eScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5TZXRQcm9wZXJ0eUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5mZWF0dXJlID09PSB0aGlzLl9mZWF0dXJlICYmICFpc0ZlYXR1cmVTZWxlY3RlZCh0aGlzLl9mZWF0dXJlKSkge1xuICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4geyB0aGlzLmNsb3NlKCkgfSlcbiAgICAgICAgfVxuICAgICAgfSkpXG5cbiAgICAgIGxpc3RlbmVycy5wdXNoKHRoaXMuX2RhdGEuYWRkTGlzdGVuZXIoJ3JlbW92ZXByb3BlcnR5JywgKGV2ZW50OiBnb29nbGUubWFwcy5EYXRhLlJlbW92ZVByb3BlcnR5RXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmZlYXR1cmUgPT09IHRoaXMuX2ZlYXR1cmUgJiYgIWlzRmVhdHVyZVNlbGVjdGVkKHRoaXMuX2ZlYXR1cmUpKSB7XG4gICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7IHRoaXMuY2xvc2UoKSB9KVxuICAgICAgICB9XG4gICAgICB9KSlcblxuICAgICAgbGlzdGVuZXJzLnB1c2godGhpcy5fbWFwLmFkZExpc3RlbmVyKCdjbGljaycsIChldmVudDogZ29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudCB8IGdvb2dsZS5tYXBzLkljb25Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4geyB0aGlzLmNsb3NlKCkgfSlcbiAgICAgIH0pKVxuXG4gICAgICBsaXN0ZW5lcnMucHVzaCh0aGlzLl9kYXRhLmFkZExpc3RlbmVyKCdjbGljaycsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4geyB0aGlzLmNsb3NlKCkgfSlcbiAgICAgIH0pKVxuICAgIH0pXG5cbiAgICB0aGlzLl9jbGVhbnVwRm4gPSAoKSA9PiB7XG4gICAgICBuZ1Vuc3Vic2NyaWJlLm5leHQoKVxuICAgICAgbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpXG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChnb29nbGUubWFwcy5ldmVudC5yZW1vdmVMaXN0ZW5lcilcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fb3ZlcmxheVZpZXcuc2V0TWFwKG51bGwpXG4gIH1cblxufVxuIl19
@@ -0,0 +1,70 @@
1
+ import { ComponentFactoryResolver, Injectable, Injector } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { GoogleMapsService } from './google-maps.service';
4
+ import { MAP_CONTROL_DATA } from './map-controls-service';
5
+ export class MapControlRef {
6
+ constructor(_googleMaps, _componentFactoryResolver, _injector, _controlDef) {
7
+ var _a;
8
+ this._googleMaps = _googleMaps;
9
+ this._componentFactoryResolver = _componentFactoryResolver;
10
+ this._injector = _injector;
11
+ this._controlDef = _controlDef;
12
+ this._destroyedSubject = new Subject();
13
+ this.destroyed = this._destroyedSubject.asObservable();
14
+ const component = this._controlDef.component;
15
+ const factory = this._componentFactoryResolver.resolveComponentFactory(component);
16
+ const providers = [];
17
+ if (this._controlDef.data) {
18
+ providers.push({
19
+ provide: MAP_CONTROL_DATA,
20
+ useValue: this._controlDef.data
21
+ });
22
+ }
23
+ const injector = Injector.create({
24
+ providers,
25
+ parent: this._injector,
26
+ });
27
+ this._componentRef = factory.create(injector);
28
+ this._componentRef.changeDetectorRef.detectChanges();
29
+ const position = (_a = this._controlDef.position) !== null && _a !== void 0 ? _a : google.maps.ControlPosition.LEFT_BOTTOM;
30
+ this._googleMaps.addControl(this._componentRef.location.nativeElement, position);
31
+ this._addedAtPosition = position;
32
+ }
33
+ destroy() {
34
+ const googleMaps = this._googleMaps.googleMap;
35
+ if (googleMaps !== undefined) {
36
+ let idx = -1;
37
+ googleMaps.controls[this._addedAtPosition].forEach((elem, index) => {
38
+ if (elem === this._componentRef.location.nativeElement) {
39
+ idx = index;
40
+ }
41
+ });
42
+ if (idx === -1) {
43
+ throw Error(`Unable to destroy control. Control not found.`);
44
+ }
45
+ googleMaps.controls[this._addedAtPosition].removeAt(idx);
46
+ }
47
+ this._componentRef.destroy();
48
+ this._destroyedSubject.next();
49
+ this._destroyedSubject.complete();
50
+ }
51
+ }
52
+ export class GoogleMapsControlsService {
53
+ constructor(_googleMaps, _componentFactoryResolver, _injector) {
54
+ this._googleMaps = _googleMaps;
55
+ this._componentFactoryResolver = _componentFactoryResolver;
56
+ this._injector = _injector;
57
+ }
58
+ add(control) {
59
+ return new MapControlRef(this._googleMaps, this._componentFactoryResolver, this._injector, control);
60
+ }
61
+ }
62
+ GoogleMapsControlsService.decorators = [
63
+ { type: Injectable }
64
+ ];
65
+ GoogleMapsControlsService.ctorParameters = () => [
66
+ { type: GoogleMapsService },
67
+ { type: ComponentFactoryResolver },
68
+ { type: Injector }
69
+ ];
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtY29udHJvbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9nb29nbGUtbWFwcy9nb29nbGUtbWFwcy1jb250cm9scy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBZ0IsVUFBVSxFQUFFLFFBQVEsRUFBa0IsTUFBTSxlQUFlLENBQUE7QUFDNUcsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUUxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN6RCxPQUFPLEVBQWtDLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFekYsTUFBTSxPQUFPLGFBQWE7SUFTeEIsWUFDbUIsV0FBOEIsRUFDOUIseUJBQW1ELEVBQ25ELFNBQW1CLEVBQ25CLFdBQXVCOztRQUh2QixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEwQjtRQUNuRCxjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBWHpCLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUE7UUFhdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUE7UUFFdEQsTUFBTSxTQUFTLEdBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUE7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRWpGLE1BQU0sU0FBUyxHQUFxQixFQUFFLENBQUE7UUFDdEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtZQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxnQkFBZ0I7Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7YUFDaEMsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLFNBQVM7WUFDVCxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDdkIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFcEQsTUFBTSxRQUFRLEdBQUcsTUFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsbUNBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFBO1FBRXJGLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQ3pDLFFBQVEsQ0FDVCxDQUFBO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQTtJQUNsQyxDQUFDO0lBRU0sT0FBTztRQUNaLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFBO1FBQzdDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUM1QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUNaLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNqRSxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7b0JBQ3RELEdBQUcsR0FBRyxLQUFLLENBQUE7aUJBQ1o7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNkLE1BQU0sS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUE7YUFDN0Q7WUFDRCxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUN6RDtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFBO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNuQyxDQUFDO0NBRUY7QUFHRCxNQUFNLE9BQU8seUJBQXlCO0lBRXBDLFlBQ21CLFdBQThCLEVBQzlCLHlCQUFtRCxFQUNuRCxTQUFtQjtRQUZuQixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEwQjtRQUNuRCxjQUFTLEdBQVQsU0FBUyxDQUFVO0lBQ2xDLENBQUM7SUFFRSxHQUFHLENBQUMsT0FBbUI7UUFDNUIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3JHLENBQUM7OztZQVhGLFVBQVU7OztZQXRFRixpQkFBaUI7WUFIakIsd0JBQXdCO1lBQTRCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFN0YXRpY1Byb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuXG5pbXBvcnQgeyBHb29nbGVNYXBzU2VydmljZSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMuc2VydmljZSdcbmltcG9ydCB7IE1hcENvbnRyb2wsIE1hcENvbnRyb2xzU2VydmljZSwgTUFQX0NPTlRST0xfREFUQSB9IGZyb20gJy4vbWFwLWNvbnRyb2xzLXNlcnZpY2UnXG5cbmV4cG9ydCBjbGFzcyBNYXBDb250cm9sUmVmIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIHByaXZhdGUgX2NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT5cbiAgcHJpdmF0ZSBfYWRkZWRBdFBvc2l0aW9uOiBnb29nbGUubWFwcy5Db250cm9sUG9zaXRpb25cblxuICBwdWJsaWMgZGVzdHJveWVkOiBPYnNlcnZhYmxlPHZvaWQ+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ29vZ2xlTWFwczogR29vZ2xlTWFwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRyb2xEZWY6IE1hcENvbnRyb2xcbiAgKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0aGlzLl9kZXN0cm95ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXG5cbiAgICBjb25zdCBjb21wb25lbnQ6IGFueSA9IHRoaXMuX2NvbnRyb2xEZWYuY29tcG9uZW50XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpXG5cbiAgICBjb25zdCBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10gPSBbXVxuICAgIGlmICh0aGlzLl9jb250cm9sRGVmLmRhdGEpIHtcbiAgICAgIHByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogTUFQX0NPTlRST0xfREFUQSxcbiAgICAgICAgdXNlVmFsdWU6IHRoaXMuX2NvbnRyb2xEZWYuZGF0YVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcHJvdmlkZXJzLFxuICAgICAgcGFyZW50OiB0aGlzLl9pbmplY3RvcixcbiAgICB9KVxuXG4gICAgdGhpcy5fY29tcG9uZW50UmVmID0gZmFjdG9yeS5jcmVhdGUoaW5qZWN0b3IpXG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9jb250cm9sRGVmLnBvc2l0aW9uID8/IGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvbi5MRUZUX0JPVFRPTVxuXG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5hZGRDb250cm9sKFxuICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIHRoaXMuX2FkZGVkQXRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICBjb25zdCBnb29nbGVNYXBzID0gdGhpcy5fZ29vZ2xlTWFwcy5nb29nbGVNYXBcbiAgICBpZiAoZ29vZ2xlTWFwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgaWR4ID0gLTFcbiAgICAgIGdvb2dsZU1hcHMuY29udHJvbHNbdGhpcy5fYWRkZWRBdFBvc2l0aW9uXS5mb3JFYWNoKChlbGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoZWxlbSA9PT0gdGhpcy5fY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBpZHggPSBpbmRleFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYFVuYWJsZSB0byBkZXN0cm95IGNvbnRyb2wuIENvbnRyb2wgbm90IGZvdW5kLmApXG4gICAgICB9XG4gICAgICBnb29nbGVNYXBzLmNvbnRyb2xzW3RoaXMuX2FkZGVkQXRQb3NpdGlvbl0ucmVtb3ZlQXQoaWR4KVxuICAgIH1cbiAgICB0aGlzLl9jb21wb25lbnRSZWYuZGVzdHJveSgpXG5cbiAgICB0aGlzLl9kZXN0cm95ZWRTdWJqZWN0Lm5leHQoKVxuICAgIHRoaXMuX2Rlc3Ryb3llZFN1YmplY3QuY29tcGxldGUoKVxuICB9XG5cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdvb2dsZU1hcHNDb250cm9sc1NlcnZpY2UgaW1wbGVtZW50cyBNYXBDb250cm9sc1NlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dvb2dsZU1hcHM6IEdvb2dsZU1hcHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yOiBJbmplY3RvcixcbiAgKSB7IH1cblxuICBwdWJsaWMgYWRkKGNvbnRyb2w6IE1hcENvbnRyb2wpOiBNYXBDb250cm9sUmVmIHtcbiAgICByZXR1cm4gbmV3IE1hcENvbnRyb2xSZWYodGhpcy5fZ29vZ2xlTWFwcywgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCB0aGlzLl9pbmplY3RvciwgY29udHJvbClcbiAgfVxufVxuIl19