UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

187 lines 28.7 kB
import { Component, Input, ViewChild } from '@angular/core'; import { MapComponent, MapService, defaultMapConfig, getC8yMarker } from '@c8y/ngx-components/map'; import { FormGroup } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import { toggleFullscreen } from '../fullscreen.util'; import { isNumber } from 'lodash-es'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@c8y/ngx-components/map"; import * as i3 from "@c8y/ngx-components"; // Düsseldorf export const defaultMapLocation = { lat: defaultMapConfig.center[0], lng: defaultMapConfig.center[1] }; export class AssetLocationComponent { constructor(activatedRouter, mapService) { this.activatedRouter = activatedRouter; this.mapService = mapService; this.config = { center: defaultMapConfig.center, zoomLevel: 13, color: 'green', icon: 'c8y-icon-location' }; this.isMarkerDraggable = false; this.isMapClickable = false; this.showMap = true; } async ngOnInit() { const leaflet = await this.mapService.getLeaflet(); if (leaflet) { const { contextData } = !this.activatedRouter.parent || this.activatedRouter.snapshot.data.context ? this.activatedRouter.snapshot.data : this.activatedRouter.parent.snapshot.data; this.assets = contextData ? contextData : this.locationMO; if (this.assets.c8y_Position.lat && this.assets.c8y_Position.lng) this.config.center = [this.assets.c8y_Position.lat, this.assets.c8y_Position.lng]; this.setView(this.assets.c8y_Position.lat, this.assets.c8y_Position.lng); } } ngOnChanges(changes) { if (changes.isEdit?.currentValue) { this.showMap = true; this.isMarkerDraggable = true; this.isMapClickable = true; queueMicrotask(() => this.mapView?.map.invalidateSize()); this.mapView?.map.on('click', event => { this.onClickOfMap(event); this.updateMarker(event.latlng.lat, event.latlng.lng); }); this.formSubscription = this.form?.valueChanges.subscribe(value => { this.updateMarker(value.c8y_Position.lat, value.c8y_Position.lng); this.setView(value.c8y_Position.lat, value.c8y_Position.lng); }); return; } if (!changes.isEdit?.currentValue) { const isAnyValueMissing = this.checkIfAnyValueIsMissing(this.locationMO?.c8y_Position.lat, this.locationMO?.c8y_Position.lng); if (isAnyValueMissing) { this.showMap = false; return; } this.isMarkerDraggable = false; this.isMapClickable = false; this.updateMarker(this.locationMO?.c8y_Position.lat, this.locationMO?.c8y_Position.lng); this.setView(this.locationMO?.c8y_Position.lat, this.locationMO?.c8y_Position.lng); } } ngOnDestroy() { this.formSubscription?.unsubscribe(); if (this.mapView?.markers && this.dragListener) { this.mapView?.markers.forEach(marker => { marker.off('drag', this.dragListener); }); } } /** * This command is used to prefill the latitude and longitude values in the form when the marker is dragged. */ onMarkerDrag(event) { if (this.form) { const properties = this.form.get('c8y_Position'); properties?.get('lat').patchValue(event.target._latlng.lat); properties?.get('lng').patchValue(event.target._latlng.lng); } } /** * This method is used to update the marker with the specified values and if any one of the values is not availble, sets * showWarning to true. * @param latitude - The latitude of the marker * @param longitude - The longitude of the marker */ updateMarker(latitude, longitude) { const isAnyValueMissing = this.checkIfAnyValueIsMissing(latitude, longitude); if (!isAnyValueMissing) { [latitude, longitude] = this.setLatLngValues(latitude, longitude); const asset = { c8y_Position: { latitude, longitude } }; if (this.mapView) { const icon = this.mapView.getAssetIcon(this.assets); const leafletMarker = this.mapView.leaflet.marker([latitude, longitude], { icon: icon, draggable: this.isMarkerDraggable }); if (this.isMarkerDraggable) { this.dragListener = event => { this.onMarkerDrag(event); }; leafletMarker.on('dragend', this.dragListener); } this.mapView.clearMarkers(); const marker = getC8yMarker(leafletMarker, asset); this.mapView.addMarkerToMap(marker); this.setView(latitude, longitude); } return; } this.mapView.clearMarkers(); } /** * This command is used to prefill the latitude and longitude values in the form on click of map. */ onClickOfMap(event) { if (this.form) { const properties = this.form.get('c8y_Position'); properties?.get('lat').patchValue(event.latlng.lat); properties?.get('lng').patchValue(event.latlng.lng); this.form.markAsDirty(); } } /** * Used to enable full screen of the map. */ enableFullscreen() { toggleFullscreen(this.mapView.mapElement.nativeElement); } /** * Checks if any one of the values i.e., latitude/longitude is undefined or null. * @param latitude Latitude value of the position * @param longitude Longitude value of the position * @returns returns true if any one of the values are both the values are missing else it returns false. */ checkIfAnyValueIsMissing(latitude, longitude) { return this.isNullOrUndefined(latitude) || this.isNullOrUndefined(longitude); } /** * Sets the view of the map based on the position of marker. * @param latitude - Latitude of the marker * @param longitude Longitude of the marker */ setView(latitude, longitude) { if (isNumber(latitude) && isNumber(longitude) && this.mapView) { [latitude, longitude] = this.setLatLngValues(latitude, longitude); this.config.center = [latitude, longitude]; this.mapView.center(); } } setLatLngValues(latitude, longitude) { latitude = this.isNullOrUndefined(latitude) ? defaultMapLocation.lat : latitude; longitude = this.isNullOrUndefined(longitude) ? defaultMapLocation.lng : longitude; return [latitude, longitude]; } isNullOrUndefined(value) { return value === null || value === undefined; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetLocationComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.MapService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AssetLocationComponent, selector: "c8y-asset-location", inputs: { isEdit: "isEdit", locationMO: "locationMO", form: "form" }, viewQueries: [{ propertyName: "mapView", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [hidden]=\"!showMap\">\n <div class=\"row\">\n <button\n class=\"btn btn-link pull-right\"\n style=\"margin-right: 12px\"\n title=\"Full screen\"\n type=\"button\"\n data-cy=\"asset-location-full-screen\"\n (click)=\"enableFullscreen()\"\n >\n <i c8yIcon=\"expand\"></i>\n </button>\n </div>\n <div style=\"width: 100%; height: 400px\">\n <c8y-map\n #map\n [assets]=\"assets\"\n [config]=\"config\"\n ></c8y-map>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: i2.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetLocationComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-asset-location', template: "<div [hidden]=\"!showMap\">\n <div class=\"row\">\n <button\n class=\"btn btn-link pull-right\"\n style=\"margin-right: 12px\"\n title=\"Full screen\"\n type=\"button\"\n data-cy=\"asset-location-full-screen\"\n (click)=\"enableFullscreen()\"\n >\n <i c8yIcon=\"expand\"></i>\n </button>\n </div>\n <div style=\"width: 100%; height: 400px\">\n <c8y-map\n #map\n [assets]=\"assets\"\n [config]=\"config\"\n ></c8y-map>\n </div>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.MapService }], propDecorators: { mapView: [{ type: ViewChild, args: [MapComponent] }], isEdit: [{ type: Input }], locationMO: [{ type: Input }], form: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtbG9jYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3ViLWFzc2V0cy9sb2NhdGlvbi9hc3NldC1sb2NhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zdWItYXNzZXRzL2xvY2F0aW9uL2Fzc2V0LWxvY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUtMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsWUFBWSxFQUVaLFVBQVUsRUFFVixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNiLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFhLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7OztBQUVyQyxhQUFhO0FBQ2IsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0IsR0FBRyxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Q0FDdkIsQ0FBQztBQU1YLE1BQU0sT0FBTyxzQkFBc0I7SUFtQmpDLFlBQ1UsZUFBK0IsRUFDL0IsVUFBc0I7UUFEdEIsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLGVBQVUsR0FBVixVQUFVLENBQVk7UUFmaEMsV0FBTSxHQUFjO1lBQ2xCLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO1lBQy9CLFNBQVMsRUFBRSxFQUFFO1lBQ2IsS0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQUUs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QkFBQyxZQUFZO2dCQUVkLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQge1xuICBNYXBDb21wb25lbnQsXG4gIE1hcENvbmZpZyxcbiAgTWFwU2VydmljZSxcbiAgUG9zaXRpb25NYW5hZ2VkT2JqZWN0LFxuICBkZWZhdWx0TWFwQ29uZmlnLFxuICBnZXRDOHlNYXJrZXJcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9tYXAnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdG9nZ2xlRnVsbHNjcmVlbiB9IGZyb20gJy4uL2Z1bGxzY3JlZW4udXRpbCc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbi8vIETDvHNzZWxkb3JmXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcExvY2F0aW9uID0ge1xuICBsYXQ6IGRlZmF1bHRNYXBDb25maWcuY2VudGVyWzBdLFxuICBsbmc6IGRlZmF1bHRNYXBDb25maWcuY2VudGVyWzFdXG59IGFzIGNvbnN0O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXNzZXQtbG9jYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYXNzZXQtbG9jYXRpb24uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFzc2V0TG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChNYXBDb21wb25lbnQpXG4gIG1hcFZpZXc6IE1hcENvbXBvbmVudDtcbiAgQElucHV0KCkgaXNFZGl0OiBib29sZWFuO1xuICBASW5wdXQoKSBsb2NhdGlvbk1POiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgZm9ybTogRm9ybUdyb3VwO1xuICBjb25maWc6IE1hcENvbmZpZyA9IHtcbiAgICBjZW50ZXI6IGRlZmF1bHRNYXBDb25maWcuY2VudGVyLFxuICAgIHpvb21MZXZlbDogMTMsXG4gICAgY29sb3I6ICdncmVlbicsXG4gICAgaWNvbjogJ2M4eS1pY29uLWxvY2F0aW9uJ1xuICB9O1xuICBhc3NldHM6IFBvc2l0aW9uTWFuYWdlZE9iamVjdDtcbiAgaXNNYXJrZXJEcmFnZ2FibGUgPSBmYWxzZTtcbiAgaXNNYXBDbGlja2FibGUgPSBmYWxzZTtcbiAgZHJhZ0xpc3RlbmVyOiBMLkxlYWZsZXRFdmVudEhhbmRsZXJGbjtcbiAgZm9ybVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBzaG93TWFwID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlcjogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBtYXBTZXJ2aWNlOiBNYXBTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBsZWFmbGV0ID0gYXdhaXQgdGhpcy5tYXBTZXJ2aWNlLmdldExlYWZsZXQoKTtcbiAgICBpZiAobGVhZmxldCkge1xuICAgICAgY29uc3QgeyBjb250ZXh0RGF0YSB9ID1cbiAgICAgICAgIXRoaXMuYWN0aXZhdGVkUm91dGVyLnBhcmVudCB8fCB0aGlzLmFjdGl2YXRlZFJvdXRlci5zbmFwc2hvdC5kYXRhLmNvbnRleHRcbiAgICAgICAgICA/IHRoaXMuYWN0aXZhdGVkUm91dGVyLnNuYXBzaG90LmRhdGFcbiAgICAgICAgICA6IHRoaXMuYWN0aXZhdGVkUm91dGVyLnBhcmVudC5zbmFwc2hvdC5kYXRhO1xuICAgICAgdGhpcy5hc3NldHMgPSBjb250ZXh0RGF0YSA/IGNvbnRleHREYXRhIDogdGhpcy5sb2NhdGlvbk1PO1xuICAgICAgaWYgKHRoaXMuYXNzZXRzLmM4eV9Qb3NpdGlvbi5sYXQgJiYgdGhpcy5hc3NldHMuYzh5X1Bvc2l0aW9uLmxuZylcbiAgICAgICAgdGhpcy5jb25maWcuY2VudGVyID0gW3RoaXMuYXNzZXRzLmM4eV9Qb3NpdGlvbi5sYXQsIHRoaXMuYXNzZXRzLmM4eV9Qb3NpdGlvbi5sbmddO1xuICAgICAgdGhpcy5zZXRWaWV3KHRoaXMuYXNzZXRzLmM4eV9Qb3NpdGlvbi5sYXQsIHRoaXMuYXNzZXRzLmM4eV9Qb3NpdGlvbi5sbmcpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5pc0VkaXQ/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5zaG93TWFwID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNNYXJrZXJEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5pc01hcENsaWNrYWJsZSA9IHRydWU7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLm1hcFZpZXc/Lm1hcC5pbnZhbGlkYXRlU2l6ZSgpKTtcbiAgICAgIHRoaXMubWFwVmlldz8ubWFwLm9uKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5vbkNsaWNrT2ZNYXAoZXZlbnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1hcmtlcihldmVudC5sYXRsbmcubGF0LCBldmVudC5sYXRsbmcubG5nKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9uID0gdGhpcy5mb3JtPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXJrZXIodmFsdWUuYzh5X1Bvc2l0aW9uLmxhdCwgdmFsdWUuYzh5X1Bvc2l0aW9uLmxuZyk7XG4gICAgICAgIHRoaXMuc2V0Vmlldyh2YWx1ZS5jOHlfUG9zaXRpb24ubGF0LCB2YWx1ZS5jOHlfUG9zaXRpb24ubG5nKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZXMuaXNFZGl0Py5jdXJyZW50VmFsdWUpIHtcbiAgICAgIGNvbnN0IGlzQW55VmFsdWVNaXNzaW5nID0gdGhpcy5jaGVja0lmQW55VmFsdWVJc01pc3NpbmcoXG4gICAgICAgIHRoaXMubG9jYXRpb25NTz8uYzh5X1Bvc2l0aW9uLmxhdCxcbiAgICAgICAgdGhpcy5sb2NhdGlvbk1PPy5jOHlfUG9zaXRpb24ubG5nXG4gICAgICApO1xuICAgICAgaWYgKGlzQW55VmFsdWVNaXNzaW5nKSB7XG4gICAgICAgIHRoaXMuc2hvd01hcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmlzTWFya2VyRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmlzTWFwQ2xpY2thYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLnVwZGF0ZU1hcmtlcih0aGlzLmxvY2F0aW9uTU8/LmM4eV9Qb3NpdGlvbi5sYXQsIHRoaXMubG9jYXRpb25NTz8uYzh5X1Bvc2l0aW9uLmxuZyk7XG4gICAgICB0aGlzLnNldFZpZXcodGhpcy5sb2NhdGlvbk1PPy5jOHlfUG9zaXRpb24ubGF0LCB0aGlzLmxvY2F0aW9uTU8/LmM4eV9Qb3NpdGlvbi5sbmcpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5tYXBWaWV3Py5tYXJrZXJzICYmIHRoaXMuZHJhZ0xpc3RlbmVyKSB7XG4gICAgICB0aGlzLm1hcFZpZXc/Lm1hcmtlcnMuZm9yRWFjaChtYXJrZXIgPT4ge1xuICAgICAgICBtYXJrZXIub2ZmKCdkcmFnJywgdGhpcy5kcmFnTGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHByZWZpbGwgdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzIGluIHRoZSBmb3JtIHdoZW4gdGhlIG1hcmtlciBpcyBkcmFnZ2VkLlxuICAgKi9cbiAgb25NYXJrZXJEcmFnKGV2ZW50OiBMLkxlYWZsZXRFdmVudCkge1xuICAgIGlmICh0aGlzLmZvcm0pIHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmZvcm0uZ2V0KCdjOHlfUG9zaXRpb24nKSBhcyBGb3JtQXJyYXk7XG4gICAgICBwcm9wZXJ0aWVzPy5nZXQoJ2xhdCcpLnBhdGNoVmFsdWUoZXZlbnQudGFyZ2V0Ll9sYXRsbmcubGF0KTtcbiAgICAgIHByb3BlcnRpZXM/LmdldCgnbG5nJykucGF0Y2hWYWx1ZShldmVudC50YXJnZXQuX2xhdGxuZy5sbmcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgbWFya2VyIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMgYW5kIGlmIGFueSBvbmUgb2YgdGhlIHZhbHVlcyBpcyBub3QgYXZhaWxibGUsIHNldHNcbiAgICogc2hvd1dhcm5pbmcgdG8gdHJ1ZS5cbiAgICogQHBhcmFtIGxhdGl0dWRlIC0gVGhlIGxhdGl0dWRlIG9mIHRoZSBtYXJrZXJcbiAgICogQHBhcmFtIGxvbmdpdHVkZSAtIFRoZSBsb25naXR1ZGUgb2YgdGhlIG1hcmtlclxuICAgKi9cbiAgdXBkYXRlTWFya2VyKGxhdGl0dWRlOiBudW1iZXIsIGxvbmdpdHVkZTogbnVtYmVyKSB7XG4gICAgY29uc3QgaXNBbnlWYWx1ZU1pc3NpbmcgPSB0aGlzLmNoZWNrSWZBbnlWYWx1ZUlzTWlzc2luZyhsYXRpdHVkZSwgbG9uZ2l0dWRlKTtcbiAgICBpZiAoIWlzQW55VmFsdWVNaXNzaW5nKSB7XG4gICAgICBbbGF0aXR1ZGUsIGxvbmdpdHVkZV0gPSB0aGlzLnNldExhdExuZ1ZhbHVlcyhsYXRpdHVkZSwgbG9uZ2l0dWRlKTtcbiAgICAgIGNvbnN0IGFzc2V0OiBhbnkgPSB7XG4gICAgICAgIGM4eV9Qb3NpdGlvbjoge1xuICAgICAgICAgIGxhdGl0dWRlLFxuICAgICAgICAgIGxvbmdpdHVkZVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tYXBWaWV3KSB7XG4gICAgICAgIGNvbnN0IGljb24gPSB0aGlzLm1hcFZpZXcuZ2V0QXNzZXRJY29uKHRoaXMuYXNzZXRzKTtcbiAgICAgICAgY29uc3QgbGVhZmxldE1hcmtlciA9IHRoaXMubWFwVmlldy5sZWFmbGV0Lm1hcmtlcihbbGF0aXR1ZGUsIGxvbmdpdHVkZV0sIHtcbiAgICAgICAgICBpY29uOiBpY29uLFxuICAgICAgICAgIGRyYWdnYWJsZTogdGhpcy5pc01hcmtlckRyYWdnYWJsZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuaXNNYXJrZXJEcmFnZ2FibGUpIHtcbiAgICAgICAgICB0aGlzLmRyYWdMaXN0ZW5lciA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMub25NYXJrZXJEcmFnKGV2ZW50KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxlYWZsZXRNYXJrZXIub24oJ2RyYWdlbmQnLCB0aGlzLmRyYWdMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXBWaWV3LmNsZWFyTWFya2VycygpO1xuICAgICAgICBjb25zdCBtYXJrZXIgPSBnZXRDOHlNYXJrZXIobGVhZmxldE1hcmtlciwgYXNzZXQpO1xuICAgICAgICB0aGlzLm1hcFZpZXcuYWRkTWFya2VyVG9NYXAobWFya2VyKTtcbiAgICAgICAgdGhpcy5zZXRWaWV3KGxhdGl0dWRlLCBsb25naXR1ZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1hcFZpZXcuY2xlYXJNYXJrZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcHJlZmlsbCB0aGUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSB2YWx1ZXMgaW4gdGhlIGZvcm0gb24gY2xpY2sgb2YgbWFwLlxuICAgKi9cbiAgb25DbGlja09mTWFwKGV2ZW50OiBMLkxlYWZsZXRNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZm9ybSkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuZm9ybS5nZXQoJ2M4eV9Qb3NpdGlvbicpIGFzIEZvcm1BcnJheTtcbiAgICAgIHByb3BlcnRpZXM/LmdldCgnbGF0JykucGF0Y2hWYWx1ZShldmVudC5sYXRsbmcubGF0KTtcbiAgICAgIHByb3BlcnRpZXM/LmdldCgnbG5nJykucGF0Y2hWYWx1ZShldmVudC5sYXRsbmcubG5nKTtcbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGVuYWJsZSBmdWxsIHNjcmVlbiBvZiB0aGUgbWFwLlxuICAgKi9cbiAgZW5hYmxlRnVsbHNjcmVlbigpIHtcbiAgICB0b2dnbGVGdWxsc2NyZWVuKHRoaXMubWFwVmlldy5tYXBFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbnkgb25lIG9mIHRoZSB2YWx1ZXMgaS5lLiwgbGF0aXR1ZGUvbG9uZ2l0dWRlIGlzIHVuZGVmaW5lZCBvciBudWxsLlxuICAgKiBAcGFyYW0gbGF0aXR1ZGUgTGF0aXR1ZGUgdmFsdWUgb2YgdGhlIHBvc2l0aW9uXG4gICAqIEBwYXJhbSBsb25naXR1ZGUgTG9uZ2l0dWRlIHZhbHVlIG9mIHRoZSBwb3NpdGlvblxuICAgKiBAcmV0dXJucyByZXR1cm5zIHRydWUgaWYgYW55IG9uZSBvZiB0aGUgdmFsdWVzIGFyZSBib3RoIHRoZSB2YWx1ZXMgYXJlIG1pc3NpbmcgZWxzZSBpdCByZXR1cm5zIGZhbHNlLlxuICAgKi9cbiAgY2hlY2tJZkFueVZhbHVlSXNNaXNzaW5nKGxhdGl0dWRlOiBudW1iZXIsIGxvbmdpdHVkZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNOdWxsT3JVbmRlZmluZWQobGF0aXR1ZGUpIHx8IHRoaXMuaXNOdWxsT3JVbmRlZmluZWQobG9uZ2l0dWRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2aWV3IG9mIHRoZSBtYXAgYmFzZWQgb24gdGhlIHBvc2l0aW9uIG9mIG1hcmtlci5cbiAgICogQHBhcmFtIGxhdGl0dWRlIC0gTGF0aXR1ZGUgb2YgdGhlIG1hcmtlclxuICAgKiBAcGFyYW0gbG9uZ2l0dWRlIExvbmdpdHVkZSBvZiB0aGUgbWFya2VyXG4gICAqL1xuICBzZXRWaWV3KGxhdGl0dWRlOiBudW1iZXIsIGxvbmdpdHVkZTogbnVtYmVyKSB7XG4gICAgaWYgKGlzTnVtYmVyKGxhdGl0dWRlKSAmJiBpc051bWJlcihsb25naXR1ZGUpICYmIHRoaXMubWFwVmlldykge1xuICAgICAgW2xhdGl0dWRlLCBsb25naXR1ZGVdID0gdGhpcy5zZXRMYXRMbmdWYWx1ZXMobGF0aXR1ZGUsIGxvbmdpdHVkZSk7XG4gICAgICB0aGlzLmNvbmZpZy5jZW50ZXIgPSBbbGF0aXR1ZGUsIGxvbmdpdHVkZV07XG4gICAgICB0aGlzLm1hcFZpZXcuY2VudGVyKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0TGF0TG5nVmFsdWVzKGxhdGl0dWRlOiBudW1iZXIsIGxvbmdpdHVkZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgbGF0aXR1ZGUgPSB0aGlzLmlzTnVsbE9yVW5kZWZpbmVkKGxhdGl0dWRlKSA/IGRlZmF1bHRNYXBMb2NhdGlvbi5sYXQgOiBsYXRpdHVkZTtcbiAgICBsb25naXR1ZGUgPSB0aGlzLmlzTnVsbE9yVW5kZWZpbmVkKGxvbmdpdHVkZSkgPyBkZWZhdWx0TWFwTG9jYXRpb24ubG5nIDogbG9uZ2l0dWRlO1xuICAgIHJldHVybiBbbGF0aXR1ZGUsIGxvbmdpdHVkZV07XG4gIH1cblxuICBwcml2YXRlIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIjxkaXYgW2hpZGRlbl09XCIhc2hvd01hcFwiPlxuICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgcHVsbC1yaWdodFwiXG4gICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTJweFwiXG4gICAgICB0aXRsZT1cIkZ1bGwgc2NyZWVuXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgZGF0YS1jeT1cImFzc2V0LWxvY2F0aW9uLWZ1bGwtc2NyZWVuXCJcbiAgICAgIChjbGljayk9XCJlbmFibGVGdWxsc2NyZWVuKClcIlxuICAgID5cbiAgICA8aSBjOHlJY29uPVwiZXhwYW5kXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDQwMHB4XCI+XG4gICAgPGM4eS1tYXBcbiAgICAgICNtYXBcbiAgICAgIFthc3NldHNdPVwiYXNzZXRzXCJcbiAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICA+PC9jOHktbWFwPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19