chi-app-lib
Version:
This is a custom component (input dropdown grid textarea map captcha) published to npm.
370 lines • 31 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter } from '@angular/core';
import * as mapboxgl from 'mapbox-gl';
export class ChiMapComponent {
constructor() {
this.marker = [];
this.id = this.idGenerator();
this.maxZoom = 18;
this.minZoom = 5;
this.zoom = 5;
this.center = [51.4, 35.7];
this.southWest = { lat: 24.350969, lng: 44.0 };
this.northEast = { lat: 39.912996, lng: 63.5 };
this.mode = 'select'; // view
// view
this.zoomControl = true;
this.dragging = true;
this.zoomMarker = 17;
this.showMarker = true;
this.coordinate = new EventEmitter();
this.getMap = new EventEmitter();
// (mapboxgl as any).accessToken = 'pk.eyJ1IjoiZGFuc3dpY2siLCJhIjoieUZiWmwtVSJ9.0cPQywdbPVmvHiHJ6NwdXA';
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
const height = changes.height;
/** @type {?} */
const isDrag = changes.dragging;
/** @type {?} */
const coordinateOrigin = changes.resetCoordinate;
if ((coordinateOrigin || {})['currentValue']) {
this.resetMarker();
}
if ((isDrag || {})['currentValue'] === false || (isDrag || {})['currentValue'] === true) {
this.disabledDrag();
}
}
/**
* @return {?}
*/
ngOnInit() {
setTimeout((/**
* @param {?} _
* @return {?}
*/
_ => {
this.initMap();
}), 100);
}
/**
* @return {?}
*/
idGenerator() {
/** @type {?} */
const number = Math.random();
number.toString(36);
return number.toString(36).substr(2, 9);
}
/**
* @return {?}
*/
disabledDrag() {
if (!this.map) {
return;
}
if (!this.dragging) {
this.map.dragPan.disable();
}
else {
this.map.dragPan.enable();
}
}
/**
* @param {?} url
* @param {?} resourceType
* @return {?}
*/
encryptTileUrl(url, resourceType) {
if (resourceType === 'Tile' && url.match('hash')) {
/** @type {?} */
const arr = url.split('/');
url = url.split('hash')[0] + 'hash/' + hashThis(arr[arr.length - 3] + '/' + arr[arr.length - 2] + '/' + arr[arr.length - 1], true);
return {
url: url
};
}
if (resourceType === 'Tile' && url.match('google')) {
/** @type {?} */
const arr = (url.split('pl&'))[1].split('/');
/** @type {?} */
const a = url.split('&');
url = (a[0] + '&' + a[1] + '&x=' + arr[arr.length - 2] + '&y=' + arr[arr.length - 1] + '&z=' + arr[arr.length - 3]).replace('.jpeg', '');
return {
url: url
};
}
else {
return {
url: url
};
}
}
/**
* @return {?}
*/
initMap() {
this.map = new mapboxgl.Map({
transformRequest: this.encryptTileUrl,
container: 'chi-map' + this.id,
// container id
style: {
'version': 8,
'sources': {
'simple-tiles': {
'type': 'raster',
// point to our third-party tiles. Note that some examples
// show a 'url' property. This only applies to tilesets with
// corresponding TileJSON (such as mapbox tiles).
'tiles': [this.mapUrl],
'tileSize': 256
}
},
'layers': [{
'id': 'simple-tiles',
'type': 'raster',
'source': 'simple-tiles'
}]
},
center: this.center,
zoom: this.minZoom,
// starting zoom
minZoom: this.minZoom,
maxZoom: this.maxZoom,
maxBounds: [[this.southWest.lng, this.southWest.lat], [this.northEast.lng, this.northEast.lat]]
});
this.map.scrollZoom.setWheelZoomRate(1);
/** @type {?} */
const nav = new mapboxgl.NavigationControl({
showCompass: false,
showZoom: this.zoomControl
});
this.map.addControl(nav, 'top-left');
// disable map rotation using right click + drag
this.map.dragRotate.disable();
// disable map rotation using touch rotation gesture
this.map.touchZoomRotate.disableRotation();
this.map.dragRotate.disable();
if (this.zoomControl) {
this.map.scrollZoom.enable();
}
else {
this.map.scrollZoom.disable();
}
this.disabledDrag();
if (this.mode === 'select') {
this.map.on('dragstart', (/**
* @param {?} evt
* @return {?}
*/
(evt) => {
this.updateCoordinate();
}));
this.map.on('drag', (/**
* @param {?} evt
* @return {?}
*/
(evt) => {
this.updateCoordinate();
}));
this.map.on('dragend', (/**
* @param {?} evt
* @return {?}
*/
(evt) => {
this.updateCoordinate();
}));
this.map.on('zoomend', (/**
* @param {?} evt
* @return {?}
*/
(evt) => {
this.updateCoordinate();
}));
}
if (this.showMarker) {
this.setMarker();
}
this.getMap.emit(this.map);
}
/**
* @return {?}
*/
updateCoordinate() {
/** @type {?} */
const center = this.map.getCenter();
this.updatePositionMarker(center.lat, center.lng);
this.coordinate.emit(center);
}
/**
* @return {?}
*/
setMarker() {
/** @type {?} */
const positionMarker = this.coordinateMarker || this.map.getCenter();
/** @type {?} */
const geojson = {
'type': 'FeatureCollection',
'features': [
{
'type': 'Feature',
'properties': {
'iconSize': this.markerSize
},
'geometry': {
'type': 'Point',
'coordinates': positionMarker
}
}
]
};
// add markers to map
geojson.features.forEach((/**
* @param {?} marker
* @return {?}
*/
marker => {
// create a DOM element for the marker
/** @type {?} */
const el = document.createElement('div');
el.className = 'marker';
el.style.backgroundImage = 'url(' + this.markerUrl + ')';
el.style.width = marker.properties.iconSize[0] + 'px';
el.style.height = marker.properties.iconSize[1] + 'px';
el.draggable = false;
// add marker to map
/** @type {?} */
const markerIcon = new mapboxgl.Marker(el, { offset: this.markerAnchor })
.setLngLat(marker.geometry.coordinates)
.addTo(this.map);
this.marker.push(markerIcon);
}));
this.paneToMarker(positionMarker.lat, positionMarker.lng || positionMarker.lon);
this.coordinate.emit(positionMarker);
}
/**
* @param {?} lat
* @param {?} lng
* @return {?}
*/
paneToMarker(lat, lng) {
this.map.flyTo({
// These options control the ending camera position: centered at
// the target, at zoom level 9, and north up.
center: [lng, lat],
zoom: this.zoomMarker
});
}
/**
* @param {?} lat
* @param {?} lng
* @return {?}
*/
updatePositionMarker(lat, lng) {
for (let i = 0; i < this.marker.length; i++) {
this.marker[i]._lngLat = { lat: lat, lng: lng };
this.marker[i]._update();
}
}
/**
* @return {?}
*/
resetMarker() {
this.updatePositionMarker(this.coordinateMarker.lat, this.coordinateMarker.lng);
this.paneToMarker(this.coordinateMarker.lat, this.coordinateMarker.lng || this.coordinateMarker.lon);
}
}
ChiMapComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-chi-map',
template: "<div id=\"chi-map{{id}}\" [ngStyle]=\"{'width': width , 'height': height}\" class=\"chi-map\"></div>\n",
styles: [".chi-map{position:relative;direction:rtl;z-index:10021;transition:height .5s ease-in-out}"]
}] }
];
/** @nocollapse */
ChiMapComponent.ctorParameters = () => [];
ChiMapComponent.propDecorators = {
mapUrl: [{ type: Input }],
maxZoom: [{ type: Input }],
minZoom: [{ type: Input }],
zoom: [{ type: Input }],
center: [{ type: Input }],
southWest: [{ type: Input }],
northEast: [{ type: Input }],
mode: [{ type: Input }],
zoomControl: [{ type: Input }],
dragging: [{ type: Input }],
markerUrl: [{ type: Input }],
markerSize: [{ type: Input }],
markerAnchor: [{ type: Input }],
coordinateMarker: [{ type: Input }],
resetCoordinate: [{ type: Input }],
zoomMarker: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
showMarker: [{ type: Input }],
coordinate: [{ type: Output }],
getMap: [{ type: Output }]
};
if (false) {
/** @type {?} */
ChiMapComponent.prototype.map;
/** @type {?} */
ChiMapComponent.prototype.baseMaps;
/** @type {?} */
ChiMapComponent.prototype.mapOptions;
/** @type {?} */
ChiMapComponent.prototype.marker;
/** @type {?} */
ChiMapComponent.prototype.id;
/** @type {?} */
ChiMapComponent.prototype.mapUrl;
/** @type {?} */
ChiMapComponent.prototype.maxZoom;
/** @type {?} */
ChiMapComponent.prototype.minZoom;
/** @type {?} */
ChiMapComponent.prototype.zoom;
/** @type {?} */
ChiMapComponent.prototype.center;
/** @type {?} */
ChiMapComponent.prototype.southWest;
/** @type {?} */
ChiMapComponent.prototype.northEast;
/** @type {?} */
ChiMapComponent.prototype.mode;
/** @type {?} */
ChiMapComponent.prototype.zoomControl;
/** @type {?} */
ChiMapComponent.prototype.dragging;
/** @type {?} */
ChiMapComponent.prototype.markerUrl;
/** @type {?} */
ChiMapComponent.prototype.markerSize;
/** @type {?} */
ChiMapComponent.prototype.markerAnchor;
/** @type {?} */
ChiMapComponent.prototype.coordinateMarker;
/** @type {?} */
ChiMapComponent.prototype.resetCoordinate;
/** @type {?} */
ChiMapComponent.prototype.zoomMarker;
/** @type {?} */
ChiMapComponent.prototype.width;
/** @type {?} */
ChiMapComponent.prototype.height;
/** @type {?} */
ChiMapComponent.prototype.showMarker;
/** @type {?} */
ChiMapComponent.prototype.coordinate;
/** @type {?} */
ChiMapComponent.prototype.getMap;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpLW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jaGktYXBwLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jaGktbWFwL2NoaS1tYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUF5QyxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQVF0QyxNQUFNLE9BQU8sZUFBZTtJQThCMUI7UUF6QkEsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLE9BQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFZixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxXQUFNLEdBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFHLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDeEMsU0FBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLE9BQU87O1FBQ3hCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFNaEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUdoQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBS3pDLHdHQUF3RztJQUMxRyxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjs7Y0FDMUIsTUFBTSxHQUFpQixPQUFPLENBQUMsTUFBTTs7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NkJBQXdCOztJQUN4QixpQ0FBZ0I7O0lBQ2hCLGtDQUFzQjs7SUFDdEIsa0NBQXFCOztJQUNyQiwrQkFBa0I7O0lBQ2xCLGlDQUFvQzs7SUFDcEMsb0NBQWlEOztJQUNqRCxvQ0FBaUQ7O0lBQ2pELCtCQUF5Qjs7SUFDekIsc0NBQTRCOztJQUM1QixtQ0FBeUI7O0lBQ3pCLG9DQUFtQjs7SUFDbkIscUNBQW9COztJQUNwQix1Q0FBc0I7O0lBQ3RCLDJDQUEwQjs7SUFDMUIsMENBQXlCOztJQUN6QixxQ0FBeUI7O0lBQ3pCLGdDQUFlOztJQUNmLGlDQUFnQjs7SUFDaEIscUNBQTJCOztJQUMzQixxQ0FBK0M7O0lBQy9DLGlDQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBTaW1wbGVDaGFuZ2V9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgbWFwYm94Z2wgZnJvbSAnbWFwYm94LWdsJztcbmRlY2xhcmUgZnVuY3Rpb24gaGFzaFRoaXModGV4dCwgZW5jcnlwdCk6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNoaS1tYXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hpLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoaS1tYXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGlNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgcHVibGljIG1hcDtcbiAgcHVibGljIGJhc2VNYXBzOiBhbnk7XG4gIG1hcE9wdGlvbnM7XG4gIG1hcmtlciA9IFtdO1xuICBpZCA9IHRoaXMuaWRHZW5lcmF0b3IoKTtcbiAgQElucHV0KCkgbWFwVXJsO1xuICBASW5wdXQoKSBtYXhab29tID0gMTg7XG4gIEBJbnB1dCgpIG1pblpvb20gPSA1O1xuICBASW5wdXQoKSB6b29tID0gNTtcbiAgQElucHV0KCkgY2VudGVyOiBhbnkgPSBbNTEuNCwgMzUuN107XG4gIEBJbnB1dCgpIHNvdXRoV2VzdCA9IHtsYXQ6IDI0LjM1MDk2OSwgbG5nOiA0NC4wfTtcbiAgQElucHV0KCkgbm9ydGhFYXN0ID0ge2xhdDogMzkuOTEyOTk2LCBsbmc6IDYzLjV9O1xuICBASW5wdXQoKSBtb2RlID0gJ3NlbGVjdCc7IC8vIHZpZXdcbiAgQElucHV0KCkgem9vbUNvbnRyb2wgPSB0cnVlO1xuICBASW5wdXQoKSBkcmFnZ2luZyA9IHRydWU7XG4gIEBJbnB1dCgpIG1hcmtlclVybDtcbiAgQElucHV0KCkgbWFya2VyU2l6ZTtcbiAgQElucHV0KCkgbWFya2VyQW5jaG9yO1xuICBASW5wdXQoKSBjb29yZGluYXRlTWFya2VyO1xuICBASW5wdXQoKSByZXNldENvb3JkaW5hdGU7XG4gIEBJbnB1dCgpIHpvb21NYXJrZXIgPSAxNztcbiAgQElucHV0KCkgd2lkdGg7XG4gIEBJbnB1dCgpIGhlaWdodDtcbiAgQElucHV0KCkgc2hvd01hcmtlciA9IHRydWU7XG4gIEBPdXRwdXQoKSBjb29yZGluYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBnZXRNYXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgLy8gKG1hcGJveGdsIGFzIGFueSkuYWNjZXNzVG9rZW4gPSAncGsuZXlKMUlqb2laR0Z1YzNkcFkyc2lMQ0poSWpvaWVVWmlXbXd0VlNKOS4wY1BReXdkYlBWbXZIaUhKNk53ZFhBJztcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBoZWlnaHQ6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuaGVpZ2h0O1xuICAgIGNvbnN0IGlzRHJhZzogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5kcmFnZ2luZztcbiAgICBjb25zdCBjb29yZGluYXRlT3JpZ2luOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLnJlc2V0Q29vcmRpbmF0ZTtcbiAgICBpZiAoKGNvb3JkaW5hdGVPcmlnaW4gfHwge30pWydjdXJyZW50VmFsdWUnXSkge1xuICAgICAgdGhpcy5yZXNldE1hcmtlcigpO1xuICAgIH1cbiAgICBpZiAoKGlzRHJhZyB8fCB7fSlbJ2N1cnJlbnRWYWx1ZSddID09PSBmYWxzZSB8fCAoaXNEcmFnIHx8IHt9KVsnY3VycmVudFZhbHVlJ10gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICBzZXRUaW1lb3V0KF8gPT4ge1xuICAgICAgdGhpcy5pbml0TWFwKCk7XG4gICAgfSwgMTAwKTtcblxuICB9XG5cbiAgaWRHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgbnVtYmVyID0gTWF0aC5yYW5kb20oKTtcbiAgICBudW1iZXIudG9TdHJpbmcoMzYpO1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbiAgfVxuXG4gIGRpc2FibGVkRHJhZygpIHtcbiAgICBpZiAoIXRoaXMubWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgdGhpcy5tYXAuZHJhZ1Bhbi5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFwLmRyYWdQYW4uZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgZW5jcnlwdFRpbGVVcmwodXJsLCByZXNvdXJjZVR5cGUpIHtcblxuICAgIGlmIChyZXNvdXJjZVR5cGUgPT09ICdUaWxlJyAmJiB1cmwubWF0Y2goJ2hhc2gnKSkge1xuXG4gICAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJy8nKTtcbiAgICAgIHVybCA9IHVybC5zcGxpdCgnaGFzaCcpWzBdICsgJ2hhc2gvJyArIGhhc2hUaGlzKGFyclthcnIubGVuZ3RoIC0gM10gKyAnLycgKyBhcnJbYXJyLmxlbmd0aCAtIDJdICsgJy8nICsgYXJyW2Fyci5sZW5ndGggLSAxXSwgdHJ1ZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IHVybFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlVHlwZSA9PT0gJ1RpbGUnICYmIHVybC5tYXRjaCgnZ29vZ2xlJykpIHtcblxuICAgICAgY29uc3QgYXJyID0gKHVybC5zcGxpdCgncGwmJykpWzFdLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBhID0gdXJsLnNwbGl0KCcmJyk7XG4gICAgICB1cmwgPSAoYVswXSArICcmJyArIGFbMV0gKyAnJng9JyArIGFyclthcnIubGVuZ3RoIC0gMl0gKyAnJnk9JyArIGFyclthcnIubGVuZ3RoIC0gMV0gKyAnJno9JyArIGFyclthcnIubGVuZ3RoIC0gM10pLnJlcGxhY2UoJy5qcGVnJywgJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB1cmxcbiAgICAgIH07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB1cmxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaW5pdE1hcCgpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogdGhpcy5lbmNyeXB0VGlsZVVybCxcbiAgICAgIGNvbnRhaW5lcjogJ2NoaS1tYXAnICsgdGhpcy5pZCwgLy8gY29udGFpbmVyIGlkXG4gICAgICBzdHlsZToge1xuICAgICAgICAndmVyc2lvbic6IDgsXG4gICAgICAgICdzb3VyY2VzJzoge1xuICAgICAgICAgICdzaW1wbGUtdGlsZXMnOiB7XG4gICAgICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAgICAgLy8gcG9pbnQgdG8gb3VyIHRoaXJkLXBhcnR5IHRpbGVzLiBOb3RlIHRoYXQgc29tZSBleGFtcGxlc1xuICAgICAgICAgICAgLy8gc2hvdyBhICd1cmwnIHByb3BlcnR5LiBUaGlzIG9ubHkgYXBwbGllcyB0byB0aWxlc2V0cyB3aXRoXG4gICAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIFRpbGVKU09OIChzdWNoIGFzIG1hcGJveCB0aWxlcykuXG4gICAgICAgICAgICAndGlsZXMnOiBbdGhpcy5tYXBVcmxdLFxuICAgICAgICAgICAgJ3RpbGVTaXplJzogMjU2XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnbGF5ZXJzJzogW3tcbiAgICAgICAgICAnaWQnOiAnc2ltcGxlLXRpbGVzJyxcbiAgICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAgICdzb3VyY2UnOiAnc2ltcGxlLXRpbGVzJ1xuICAgICAgICB9XVxuICAgICAgfSxcbiAgICAgIGNlbnRlcjogdGhpcy5jZW50ZXIsXG4gICAgICB6b29tOiB0aGlzLm1pblpvb20sIC8vIHN0YXJ0aW5nIHpvb21cbiAgICAgIG1pblpvb206IHRoaXMubWluWm9vbSxcbiAgICAgIG1heFpvb206IHRoaXMubWF4Wm9vbSxcbiAgICAgIG1heEJvdW5kczogW1t0aGlzLnNvdXRoV2VzdC5sbmcsIHRoaXMuc291dGhXZXN0LmxhdF0sIFt0aGlzLm5vcnRoRWFzdC5sbmcsIHRoaXMubm9ydGhFYXN0LmxhdF1dXG4gICAgfSk7XG4gICAgdGhpcy5tYXAuc2Nyb2xsWm9vbS5zZXRXaGVlbFpvb21SYXRlKDEpO1xuXG4gICAgY29uc3QgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKHtcbiAgICAgIHNob3dDb21wYXNzOiBmYWxzZSxcbiAgICAgIHNob3dab29tOiB0aGlzLnpvb21Db250cm9sXG4gICAgfSk7XG4gICAgdGhpcy5tYXAuYWRkQ29udHJvbChuYXYsICd0b3AtbGVmdCcpO1xuICAgIC8vIGRpc2FibGUgbWFwIHJvdGF0aW9uIHVzaW5nIHJpZ2h0IGNsaWNrICsgZHJhZ1xuICAgIHRoaXMubWFwLmRyYWdSb3RhdGUuZGlzYWJsZSgpO1xuXG4gICAgLy8gZGlzYWJsZSBtYXAgcm90YXRpb24gdXNpbmcgdG91Y2ggcm90YXRpb24gZ2VzdHVyZVxuICAgIHRoaXMubWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlUm90YXRpb24oKTtcbiAgICB0aGlzLm1hcC5kcmFnUm90YXRlLmRpc2FibGUoKTtcblxuICAgIGlmICh0aGlzLnpvb21Db250cm9sKSB7XG4gICAgICB0aGlzLm1hcC5zY3JvbGxab29tLmVuYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICB9XG5cblxuICAgIHRoaXMuZGlzYWJsZWREcmFnKCk7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuXG4gICAgICB0aGlzLm1hcC5vbignZHJhZ3N0YXJ0JywgKGV2dCkgPT4ge1xuXG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRpbmF0ZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcC5vbignZHJhZycsIChldnQpID0+IHtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvb3JkaW5hdGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXAub24oJ2RyYWdlbmQnLCAoZXZ0KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRpbmF0ZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcC5vbignem9vbWVuZCcsIChldnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDb29yZGluYXRlKCk7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dNYXJrZXIpIHtcbiAgICAgIHRoaXMuc2V0TWFya2VyKCk7XG4gICAgfVxuICAgIHRoaXMuZ2V0TWFwLmVtaXQodGhpcy5tYXApO1xuXG4gIH1cblxuICB1cGRhdGVDb29yZGluYXRlKCkge1xuICAgIGNvbnN0IGNlbnRlciA9IHRoaXMubWFwLmdldENlbnRlcigpO1xuICAgIHRoaXMudXBkYXRlUG9zaXRpb25NYXJrZXIoY2VudGVyLmxhdCwgY2VudGVyLmxuZyk7XG4gICAgdGhpcy5jb29yZGluYXRlLmVtaXQoY2VudGVyKTtcbiAgfVxuXG4gIHNldE1hcmtlcigpIHtcblxuICAgIGNvbnN0IHBvc2l0aW9uTWFya2VyID0gdGhpcy5jb29yZGluYXRlTWFya2VyIHx8IHRoaXMubWFwLmdldENlbnRlcigpO1xuICAgIGNvbnN0IGdlb2pzb24gPSB7XG4gICAgICAndHlwZSc6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAnZmVhdHVyZXMnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAndHlwZSc6ICdGZWF0dXJlJyxcbiAgICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAgICdpY29uU2l6ZSc6IHRoaXMubWFya2VyU2l6ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2dlb21ldHJ5Jzoge1xuICAgICAgICAgICAgJ3R5cGUnOiAnUG9pbnQnLFxuICAgICAgICAgICAgJ2Nvb3JkaW5hdGVzJzogcG9zaXRpb25NYXJrZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgLy8gYWRkIG1hcmtlcnMgdG8gbWFwXG4gICAgZ2VvanNvbi5mZWF0dXJlcy5mb3JFYWNoKG1hcmtlciA9PiB7XG4gICAgICAvLyBjcmVhdGUgYSBET00gZWxlbWVudCBmb3IgdGhlIG1hcmtlclxuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsLmNsYXNzTmFtZSA9ICdtYXJrZXInO1xuICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3VybCgnICsgdGhpcy5tYXJrZXJVcmwgKyAnKSc7XG4gICAgICBlbC5zdHlsZS53aWR0aCA9IG1hcmtlci5wcm9wZXJ0aWVzLmljb25TaXplWzBdICsgJ3B4JztcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IG1hcmtlci5wcm9wZXJ0aWVzLmljb25TaXplWzFdICsgJ3B4JztcbiAgICAgIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuXG4gICAgICAvLyBhZGQgbWFya2VyIHRvIG1hcFxuXG5cbiAgICAgIGNvbnN0IG1hcmtlckljb24gPSBuZXcgbWFwYm94Z2wuTWFya2VyKGVsLCB7b2Zmc2V0OiB0aGlzLm1hcmtlckFuY2hvcn0pXG4gICAgICAgIC5zZXRMbmdMYXQobWFya2VyLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxuICAgICAgICAuYWRkVG8odGhpcy5tYXApO1xuICAgICAgdGhpcy5tYXJrZXIucHVzaChtYXJrZXJJY29uKTtcblxuICAgIH0pO1xuXG4gICAgdGhpcy5wYW5lVG9NYXJrZXIocG9zaXRpb25NYXJrZXIubGF0LCBwb3NpdGlvbk1hcmtlci5sbmcgfHwgcG9zaXRpb25NYXJrZXIubG9uKTtcbiAgICB0aGlzLmNvb3JkaW5hdGUuZW1pdChwb3NpdGlvbk1hcmtlcik7XG4gIH1cblxuICBwYW5lVG9NYXJrZXIobGF0LCBsbmcpIHtcbiAgICB0aGlzLm1hcC5mbHlUbyh7XG4gICAgICAvLyBUaGVzZSBvcHRpb25zIGNvbnRyb2wgdGhlIGVuZGluZyBjYW1lcmEgcG9zaXRpb246IGNlbnRlcmVkIGF0XG4gICAgICAvLyB0aGUgdGFyZ2V0LCBhdCB6b29tIGxldmVsIDksIGFuZCBub3J0aCB1cC5cbiAgICAgIGNlbnRlcjogW2xuZywgbGF0XSxcbiAgICAgIHpvb206IHRoaXMuem9vbU1hcmtlclxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlUG9zaXRpb25NYXJrZXIobGF0LCBsbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2VyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm1hcmtlcltpXS5fbG5nTGF0ID0ge2xhdDogbGF0LCBsbmc6IGxuZ307XG4gICAgICB0aGlzLm1hcmtlcltpXS5fdXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRNYXJrZXIoKSB7XG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbk1hcmtlcih0aGlzLmNvb3JkaW5hdGVNYXJrZXIubGF0LCB0aGlzLmNvb3JkaW5hdGVNYXJrZXIubG5nKTtcbiAgICB0aGlzLnBhbmVUb01hcmtlcih0aGlzLmNvb3JkaW5hdGVNYXJrZXIubGF0LCB0aGlzLmNvb3JkaW5hdGVNYXJrZXIubG5nIHx8IHRoaXMuY29vcmRpbmF0ZU1hcmtlci5sb24pO1xuICB9XG5cblxufVxuIl19