@ngx-google-maps-tk/snazzy-info-window
Version:
Angular Google Maps (AGM) package for Snazzy Info Window support
253 lines • 29.7 kB
JavaScript
import { Component, ContentChild, ElementRef, EventEmitter, Host, Input, Optional, Output, SkipSelf, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-google-maps-tk/core";
export class AgmSnazzyInfoWindow {
constructor(_marker, _wrapper, _manager, _loader) {
this._marker = _marker;
this._wrapper = _wrapper;
this._manager = _manager;
this._loader = _loader;
/**
* Changes the open status of the snazzy info window.
*/
this.isOpen = false;
/**
* Emits when the open status changes.
*/
this.isOpenChange = new EventEmitter();
/**
* Choose where you want the info window to be displayed, relative to the marker.
*/
this.placement = 'top';
/**
* The max width in pixels of the info window.
*/
this.maxWidth = 200;
/**
* The max height in pixels of the info window.
*/
this.maxHeight = 200;
/**
* Determines if the info window will open when the marker is clicked.
* An internal listener is added to the Google Maps click event which calls the open() method.
*/
this.openOnMarkerClick = true;
/**
* Determines if the info window will close when the map is clicked. An internal listener is added to
* the Google Maps click event which calls the close() method.
* This will not activate on the Google Maps drag event when the user is panning the map.
*/
this.closeOnMapClick = true;
/**
* Determines if the info window will close when any other Snazzy Info Window is opened.
*/
this.closeWhenOthersOpen = false;
/**
* Determines if the info window will show a close button.
*/
this.showCloseButton = true;
/**
* Determines if the info window will be panned into view when opened.
*/
this.panOnOpen = true;
/**
* Emits before the info window opens.
*/
this.beforeOpen = new EventEmitter();
/**
* Emits before the info window closes.
*/
this.afterClose = new EventEmitter();
this._snazzyInfoWindowInitialized = null;
}
/**
* @internal
*/
ngOnChanges(changes) {
if (this._nativeSnazzyInfoWindow == null) {
return;
}
if ('isOpen' in changes && this.isOpen) {
this._openInfoWindow();
}
else if ('isOpen' in changes && !this.isOpen) {
this._closeInfoWindow();
}
if (('latitude' in changes || 'longitude' in changes) && this._marker == null) {
this._updatePosition();
}
}
/**
* @internal
*/
ngAfterViewInit() {
const m = this._manager != null ? this._manager.getNativeMarker(this._marker) : null;
this._snazzyInfoWindowInitialized = this._loader.load()
.then(() => import('snazzy-info-window'))
.then((module) => Promise.all([module, m, this._wrapper.getNativeMap()]))
.then((elems) => {
const options = {
map: elems[2],
content: '',
placement: this.placement,
maxWidth: this.maxWidth,
maxHeight: this.maxHeight,
backgroundColor: this.backgroundColor,
padding: this.padding,
border: this.border,
borderRadius: this.borderRadius,
fontColor: this.fontColor,
pointer: this.pointer,
shadow: this.shadow,
closeOnMapClick: this.closeOnMapClick,
openOnMarkerClick: this.openOnMarkerClick,
closeWhenOthersOpen: this.closeWhenOthersOpen,
showCloseButton: this.showCloseButton,
panOnOpen: this.panOnOpen,
wrapperClass: this.wrapperClass,
callbacks: {
beforeOpen: () => {
this._createViewContent();
this.beforeOpen.emit();
},
afterOpen: () => {
this.isOpenChange.emit(this.openStatus());
},
afterClose: () => {
this.afterClose.emit();
this.isOpenChange.emit(this.openStatus());
},
},
};
if (elems[1] != null) {
options.marker = elems[1];
}
else {
options.position = {
lat: this.latitude,
lng: this.longitude,
};
}
this._nativeSnazzyInfoWindow = new elems[0].default(options);
});
this._snazzyInfoWindowInitialized.then(() => {
if (this.isOpen) {
this._openInfoWindow();
}
});
}
_openInfoWindow() {
this._snazzyInfoWindowInitialized.then(() => {
this._createViewContent();
this._nativeSnazzyInfoWindow.open();
});
}
_closeInfoWindow() {
this._snazzyInfoWindowInitialized.then(() => {
this._nativeSnazzyInfoWindow.close();
});
}
_createViewContent() {
if (this._viewContainerRef.length === 1) {
return;
}
const evr = this._viewContainerRef.createEmbeddedView(this._templateRef);
this._nativeSnazzyInfoWindow.setContent(this._outerWrapper.nativeElement);
// we have to run this in a separate cycle.
setTimeout(() => {
evr.detectChanges();
});
}
_updatePosition() {
this._nativeSnazzyInfoWindow.setPosition({
lat: this.latitude,
lng: this.longitude,
});
}
/**
* Returns true when the Snazzy Info Window is initialized and open.
*/
openStatus() {
return this._nativeSnazzyInfoWindow && this._nativeSnazzyInfoWindow.isOpen();
}
/**
* @internal
*/
ngOnDestroy() {
if (this._nativeSnazzyInfoWindow) {
this._nativeSnazzyInfoWindow.destroy();
}
}
}
AgmSnazzyInfoWindow.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.5", ngImport: i0, type: AgmSnazzyInfoWindow, deps: [{ token: i1.AgmMarker, host: true, optional: true, skipSelf: true }, { token: i1.GoogleMapsAPIWrapper }, { token: i1.MarkerManager }, { token: i1.MapsAPILoader }], target: i0.ɵɵFactoryTarget.Component });
AgmSnazzyInfoWindow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.5", type: AgmSnazzyInfoWindow, selector: "agm-snazzy-info-window", inputs: { latitude: "latitude", longitude: "longitude", isOpen: "isOpen", placement: "placement", maxWidth: "maxWidth", maxHeight: "maxHeight", backgroundColor: "backgroundColor", padding: "padding", border: "border", borderRadius: "borderRadius", fontColor: "fontColor", fontSize: "fontSize", pointer: "pointer", shadow: "shadow", openOnMarkerClick: "openOnMarkerClick", closeOnMapClick: "closeOnMapClick", wrapperClass: "wrapperClass", closeWhenOthersOpen: "closeWhenOthersOpen", showCloseButton: "showCloseButton", panOnOpen: "panOnOpen" }, outputs: { isOpenChange: "isOpenChange", beforeOpen: "beforeOpen", afterClose: "afterClose" }, queries: [{ propertyName: "_templateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_outerWrapper", first: true, predicate: ["outerWrapper"], descendants: true, read: ElementRef }, { propertyName: "_viewContainerRef", first: true, predicate: ["viewContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: '<div #outerWrapper><div #viewContainer></div></div><ng-content></ng-content>', isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.5", ngImport: i0, type: AgmSnazzyInfoWindow, decorators: [{
type: Component,
args: [{
// tslint:disable-next-line:component-selector
selector: 'agm-snazzy-info-window',
template: '<div #outerWrapper><div #viewContainer></div></div><ng-content></ng-content>',
}]
}], ctorParameters: function () { return [{ type: i1.AgmMarker, decorators: [{
type: Optional
}, {
type: Host
}, {
type: SkipSelf
}] }, { type: i1.GoogleMapsAPIWrapper }, { type: i1.MarkerManager }, { type: i1.MapsAPILoader }]; }, propDecorators: { latitude: [{
type: Input
}], longitude: [{
type: Input
}], isOpen: [{
type: Input
}], isOpenChange: [{
type: Output
}], placement: [{
type: Input
}], maxWidth: [{
type: Input
}], maxHeight: [{
type: Input
}], backgroundColor: [{
type: Input
}], padding: [{
type: Input
}], border: [{
type: Input
}], borderRadius: [{
type: Input
}], fontColor: [{
type: Input
}], fontSize: [{
type: Input
}], pointer: [{
type: Input
}], shadow: [{
type: Input
}], openOnMarkerClick: [{
type: Input
}], closeOnMapClick: [{
type: Input
}], wrapperClass: [{
type: Input
}], closeWhenOthersOpen: [{
type: Input
}], showCloseButton: [{
type: Input
}], panOnOpen: [{
type: Input
}], beforeOpen: [{
type: Output
}], afterClose: [{
type: Output
}], _outerWrapper: [{
type: ViewChild,
args: ['outerWrapper', { read: ElementRef, static: false }]
}], _viewContainerRef: [{
type: ViewChild,
args: ['viewContainer', { read: ViewContainerRef, static: false }]
}], _templateRef: [{
type: ContentChild,
args: [TemplateRef, { static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25henp5LWluZm8td2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc25henp5LWluZm8td2luZG93L3NyYy9saWIvZGlyZWN0aXZlcy9zbmF6enktaW5mby13aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBd0IsUUFBUSxFQUFFLE1BQU0sRUFBaUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU96TixNQUFNLE9BQU8sbUJBQW1CO0lBZ0o5QixZQUMwQyxPQUFrQixFQUNsRCxRQUE4QixFQUM5QixRQUF1QixFQUN2QixPQUFzQjtRQUhVLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEQsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixZQUFPLEdBQVAsT0FBTyxDQUFlO1FBdkloQzs7V0FFRztRQUNNLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFeEI7O1dBRUc7UUFDTyxpQkFBWSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTVFOztXQUVHO1FBQ00sY0FBUyxHQUF3QyxLQUFLLENBQUM7UUFFaEU7O1dBRUc7UUFDTSxhQUFRLEdBQW9CLEdBQUcsQ0FBQztRQUV6Qzs7V0FFRztRQUNNLGNBQVMsR0FBb0IsR0FBRyxDQUFDO1FBOEMxQzs7O1dBR0c7UUFDTSxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFbEM7Ozs7V0FJRztRQUNNLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBUWhDOztXQUVHO1FBQ00sd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRXJDOztXQUVHO1FBQ00sb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFFaEM7O1dBRUc7UUFDTSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTFCOztXQUVHO1FBQ08sZUFBVSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXBFOztXQUVHO1FBQ08sZUFBVSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBa0IxRCxpQ0FBNEIsR0FBd0IsSUFBSSxDQUFDO0lBT2hFLENBQUM7SUFFSjs7T0FFRztJQUNILFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLEVBQUU7WUFDeEMsT0FBTztTQUNSO1FBQ0QsSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO2FBQU0sSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxJQUFJLFdBQVcsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtZQUM3RSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JGLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTthQUNwRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDeEMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM3RSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNkLE1BQU0sT0FBTyxHQUFRO2dCQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDYixPQUFPLEVBQUUsRUFBRTtnQkFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDckMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDekMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtnQkFDN0MsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUNyQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsU0FBUyxFQUFFO29CQUNULFVBQVUsRUFBRSxHQUFHLEVBQUU7d0JBQ2YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7d0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3pCLENBQUM7b0JBQ0QsU0FBUyxFQUFFLEdBQUcsRUFBRTt3QkFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsQ0FBQztvQkFDRCxVQUFVLEVBQUUsR0FBRyxFQUFFO3dCQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO29CQUM1QyxDQUFDO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDcEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0I7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLFFBQVEsR0FBRztvQkFDakIsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUNsQixHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVM7aUJBQ3BCLENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3hCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsZUFBZTtRQUN2QixJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QyxPQUFPO1NBQ1I7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSwyQ0FBMkM7UUFDM0MsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxlQUFlO1FBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUM7WUFDdkMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ2xCLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUztTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9FLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNoQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDeEM7SUFDSCxDQUFDOztnSEFqUlUsbUJBQW1CO29HQUFuQixtQkFBbUIsdXVCQTJJaEIsV0FBVywwSUFWUyxVQUFVLDZHQUtULGdCQUFnQixrREF4SXpDLDhFQUE4RTsyRkFFN0UsbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNULDhDQUE4QztvQkFDOUMsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFLDhFQUE4RTtpQkFDekY7OzBCQWtKSSxRQUFROzswQkFBSSxJQUFJOzswQkFBSSxRQUFRO3VJQTVJdEIsUUFBUTtzQkFBaEIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFLSSxZQUFZO3NCQUFyQixNQUFNO2dCQUtFLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQU1HLE1BQU07c0JBQWQsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTUcsTUFBTTtzQkFBZCxLQUFLO2dCQU1HLGlCQUFpQjtzQkFBekIsS0FBSztnQkFPRyxlQUFlO3NCQUF2QixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFLSSxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLFVBQVU7c0JBQW5CLE1BQU07Z0JBS3VELGFBQWE7c0JBQTFFLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUtTLGlCQUFpQjtzQkFBckYsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFLdkIsWUFBWTtzQkFBdkQsWUFBWTt1QkFBQyxXQUFXLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWdtTWFya2VyLCBHb29nbGVNYXBzQVBJV3JhcHBlciwgTWFwc0FQSUxvYWRlciwgTWFya2VyTWFuYWdlciB9IGZyb20gJ0BuZ3gtZ29vZ2xlLW1hcHMtdGsvY29yZSc7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFNraXBTZWxmLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnYWdtLXNuYXp6eS1pbmZvLXdpbmRvdycsXG4gIHRlbXBsYXRlOiAnPGRpdiAjb3V0ZXJXcmFwcGVyPjxkaXYgI3ZpZXdDb250YWluZXI+PC9kaXY+PC9kaXY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG59KVxuZXhwb3J0IGNsYXNzIEFnbVNuYXp6eUluZm9XaW5kb3cgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBUaGUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSB3aGVyZSB0aGUgaW5mbyB3aW5kb3cgaXMgYW5jaG9yZWQuXG4gICAqIFRoZSBvZmZzZXQgd2lsbCBkZWZhdWx0IHRvIDBweCB3aGVuIHVzaW5nIHRoaXMgb3B0aW9uLiBPbmx5IHJlcXVpcmVkL3VzZWQgaWYgeW91IGFyZSBub3QgdXNpbmcgYSBhZ20tbWFya2VyLlxuICAgKi9cbiAgQElucHV0KCkgbGF0aXR1ZGU6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxvbmdpdHVkZSB3aGVyZSB0aGUgaW5mbyB3aW5kb3cgaXMgYW5jaG9yZWQuXG4gICAqIFRoZSBvZmZzZXQgd2lsbCBkZWZhdWx0IHRvIDBweCB3aGVuIHVzaW5nIHRoaXMgb3B0aW9uLiBPbmx5IHJlcXVpcmVkL3VzZWQgaWYgeW91IGFyZSBub3QgdXNpbmcgYSBhZ20tbWFya2VyLlxuICAgKi9cbiAgQElucHV0KCkgbG9uZ2l0dWRlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIG9wZW4gc3RhdHVzIG9mIHRoZSBzbmF6enkgaW5mbyB3aW5kb3cuXG4gICAqL1xuICBASW5wdXQoKSBpc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgb3BlbiBzdGF0dXMgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBpc09wZW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQ2hvb3NlIHdoZXJlIHlvdSB3YW50IHRoZSBpbmZvIHdpbmRvdyB0byBiZSBkaXNwbGF5ZWQsIHJlbGF0aXZlIHRvIHRoZSBtYXJrZXIuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZW1lbnQ6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnID0gJ3RvcCc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBpbmZvIHdpbmRvdy5cbiAgICovXG4gIEBJbnB1dCgpIG1heFdpZHRoOiBudW1iZXIgfCBzdHJpbmcgPSAyMDA7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgaW5mbyB3aW5kb3cuXG4gICAqL1xuICBASW5wdXQoKSBtYXhIZWlnaHQ6IG51bWJlciB8IHN0cmluZyA9IDIwMDtcblxuICAvKipcbiAgICogVGhlIGNvbG9yIHRvIHVzZSBmb3IgdGhlIGJhY2tncm91bmQgb2YgdGhlIGluZm8gd2luZG93LlxuICAgKi9cbiAgQElucHV0KCkgYmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY3VzdG9tIHBhZGRpbmcgc2l6ZSBhcm91bmQgdGhlIGNvbnRlbnQgb2YgdGhlIGluZm8gd2luZG93LlxuICAgKi9cbiAgQElucHV0KCkgcGFkZGluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGN1c3RvbSBib3JkZXIgYXJvdW5kIHRoZSBpbmZvIHdpbmRvdy4gU2V0IHRvIGZhbHNlIHRvIGNvbXBsZXRlbHkgcmVtb3ZlIHRoZSBib3JkZXIuXG4gICAqIFRoZSB1bml0cyB1c2VkIGZvciBib3JkZXIgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHBvaW50ZXIuXG4gICAqL1xuICBASW5wdXQoKSBib3JkZXI6IHt3aWR0aDogc3RyaW5nOyBjb2xvcjogc3RyaW5nfSB8IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgY3VzdG9tIENTUyBib3JkZXIgcmFkaXVzIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIHJvdW5kZWQgY29ybmVycyBvZiB0aGUgaW5mbyB3aW5kb3cuXG4gICAqL1xuICBASW5wdXQoKSBib3JkZXJSYWRpdXM6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbnQgY29sb3IgdG8gdXNlIGZvciB0aGUgY29udGVudCBpbnNpZGUgdGhlIGJvZHkgb2YgdGhlIGluZm8gd2luZG93LlxuICAgKi9cbiAgQElucHV0KCkgZm9udENvbG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb250IHNpemUgdG8gdXNlIGZvciB0aGUgY29udGVudCBpbnNpZGUgdGhlIGJvZHkgb2YgdGhlIGluZm8gd2luZG93LlxuICAgKi9cbiAgQElucHV0KCkgZm9udFNpemU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgcG9pbnRlciBmcm9tIHRoZSBpbmZvIHdpbmRvdyB0byB0aGUgbWFya2VyLlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gY29tcGxldGVseSByZW1vdmUgdGhlIHBvaW50ZXIuXG4gICAqIFRoZSB1bml0cyB1c2VkIGZvciBwb2ludGVyIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBib3JkZXIuXG4gICAqL1xuICBASW5wdXQoKSBwb2ludGVyOiBzdHJpbmcgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgQ1NTIHByb3BlcnRpZXMgZm9yIHRoZSBzaGFkb3cgb2YgdGhlIGluZm8gd2luZG93LlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gY29tcGxldGVseSByZW1vdmUgdGhlIHNoYWRvdy5cbiAgICovXG4gIEBJbnB1dCgpIHNoYWRvdzogYm9vbGVhbiB8IHtoPzogc3RyaW5nLCB2Pzogc3RyaW5nLCBibHVyOiBzdHJpbmcsIHNwcmVhZDogc3RyaW5nLCBvcGFjaXR5OiBudW1iZXIsIGNvbG9yOiBzdHJpbmd9O1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbmZvIHdpbmRvdyB3aWxsIG9wZW4gd2hlbiB0aGUgbWFya2VyIGlzIGNsaWNrZWQuXG4gICAqIEFuIGludGVybmFsIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBHb29nbGUgTWFwcyBjbGljayBldmVudCB3aGljaCBjYWxscyB0aGUgb3BlbigpIG1ldGhvZC5cbiAgICovXG4gIEBJbnB1dCgpIG9wZW5Pbk1hcmtlckNsaWNrID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5mbyB3aW5kb3cgd2lsbCBjbG9zZSB3aGVuIHRoZSBtYXAgaXMgY2xpY2tlZC4gQW4gaW50ZXJuYWwgbGlzdGVuZXIgaXMgYWRkZWQgdG9cbiAgICogdGhlIEdvb2dsZSBNYXBzIGNsaWNrIGV2ZW50IHdoaWNoIGNhbGxzIHRoZSBjbG9zZSgpIG1ldGhvZC5cbiAgICogVGhpcyB3aWxsIG5vdCBhY3RpdmF0ZSBvbiB0aGUgR29vZ2xlIE1hcHMgZHJhZyBldmVudCB3aGVuIHRoZSB1c2VyIGlzIHBhbm5pbmcgdGhlIG1hcC5cbiAgICovXG4gIEBJbnB1dCgpIGNsb3NlT25NYXBDbGljayA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIENTUyBjbGFzcyB0byBhc3NpZ24gdG8gdGhlIHdyYXBwZXIgY29udGFpbmVyIG9mIHRoZSBpbmZvIHdpbmRvdy5cbiAgICogQ2FuIGJlIHVzZWQgZm9yIGFwcGx5aW5nIGN1c3RvbSBDU1MgdG8gdGhlIGluZm8gd2luZG93LlxuICAgKi9cbiAgQElucHV0KCkgd3JhcHBlckNsYXNzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGluZm8gd2luZG93IHdpbGwgY2xvc2Ugd2hlbiBhbnkgb3RoZXIgU25henp5IEluZm8gV2luZG93IGlzIG9wZW5lZC5cbiAgICovXG4gIEBJbnB1dCgpIGNsb3NlV2hlbk90aGVyc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5mbyB3aW5kb3cgd2lsbCBzaG93IGEgY2xvc2UgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd0Nsb3NlQnV0dG9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5mbyB3aW5kb3cgd2lsbCBiZSBwYW5uZWQgaW50byB2aWV3IHdoZW4gb3BlbmVkLlxuICAgKi9cbiAgQElucHV0KCkgcGFuT25PcGVuID0gdHJ1ZTtcblxuICAvKipcbiAgICogRW1pdHMgYmVmb3JlIHRoZSBpbmZvIHdpbmRvdyBvcGVucy5cbiAgICovXG4gIEBPdXRwdXQoKSBiZWZvcmVPcGVuOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGJlZm9yZSB0aGUgaW5mbyB3aW5kb3cgY2xvc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGFmdGVyQ2xvc2U6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBAVmlld0NoaWxkKCdvdXRlcldyYXBwZXInLCB7cmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZX0pIF9vdXRlcldyYXBwZXI6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lcicsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlfSkgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZiwge3N0YXRpYzogZmFsc2V9KSBfdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgcHJvdGVjdGVkIF9uYXRpdmVTbmF6enlJbmZvV2luZG93OiBhbnk7XG4gIHByb3RlY3RlZCBfc25henp5SW5mb1dpbmRvd0luaXRpYWxpemVkOiBQcm9taXNlPGFueT4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASG9zdCgpIEBTa2lwU2VsZigpIHByaXZhdGUgX21hcmtlcjogQWdtTWFya2VyLFxuICAgIHByaXZhdGUgX3dyYXBwZXI6IEdvb2dsZU1hcHNBUElXcmFwcGVyLFxuICAgIHByaXZhdGUgX21hbmFnZXI6IE1hcmtlck1hbmFnZXIsXG4gICAgcHJpdmF0ZSBfbG9hZGVyOiBNYXBzQVBJTG9hZGVyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLl9uYXRpdmVTbmF6enlJbmZvV2luZG93ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCdpc09wZW4nIGluIGNoYW5nZXMgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuX29wZW5JbmZvV2luZG93KCk7XG4gICAgfSBlbHNlIGlmICgnaXNPcGVuJyBpbiBjaGFuZ2VzICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5fY2xvc2VJbmZvV2luZG93KCk7XG4gICAgfVxuICAgIGlmICgoJ2xhdGl0dWRlJyBpbiBjaGFuZ2VzIHx8ICdsb25naXR1ZGUnIGluIGNoYW5nZXMpICYmIHRoaXMuX21hcmtlciA9PSBudWxsKSB7XG4gICAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBtID0gdGhpcy5fbWFuYWdlciAhPSBudWxsID8gdGhpcy5fbWFuYWdlci5nZXROYXRpdmVNYXJrZXIodGhpcy5fbWFya2VyKSA6IG51bGw7XG4gICAgdGhpcy5fc25henp5SW5mb1dpbmRvd0luaXRpYWxpemVkID0gdGhpcy5fbG9hZGVyLmxvYWQoKVxuICAgICAgLnRoZW4oKCkgPT4gaW1wb3J0KCdzbmF6enktaW5mby13aW5kb3cnKSlcbiAgICAgIC50aGVuKChtb2R1bGU6IGFueSkgPT4gUHJvbWlzZS5hbGwoW21vZHVsZSwgbSwgdGhpcy5fd3JhcHBlci5nZXROYXRpdmVNYXAoKV0pKVxuICAgICAgLnRoZW4oKGVsZW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgICBtYXA6IGVsZW1zWzJdLFxuICAgICAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgICAgIHBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQsXG4gICAgICAgICAgbWF4V2lkdGg6IHRoaXMubWF4V2lkdGgsXG4gICAgICAgICAgbWF4SGVpZ2h0OiB0aGlzLm1heEhlaWdodCxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgIHBhZGRpbmc6IHRoaXMucGFkZGluZyxcbiAgICAgICAgICBib3JkZXI6IHRoaXMuYm9yZGVyLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogdGhpcy5ib3JkZXJSYWRpdXMsXG4gICAgICAgICAgZm9udENvbG9yOiB0aGlzLmZvbnRDb2xvcixcbiAgICAgICAgICBwb2ludGVyOiB0aGlzLnBvaW50ZXIsXG4gICAgICAgICAgc2hhZG93OiB0aGlzLnNoYWRvdyxcbiAgICAgICAgICBjbG9zZU9uTWFwQ2xpY2s6IHRoaXMuY2xvc2VPbk1hcENsaWNrLFxuICAgICAgICAgIG9wZW5Pbk1hcmtlckNsaWNrOiB0aGlzLm9wZW5Pbk1hcmtlckNsaWNrLFxuICAgICAgICAgIGNsb3NlV2hlbk90aGVyc09wZW46IHRoaXMuY2xvc2VXaGVuT3RoZXJzT3BlbixcbiAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRoaXMuc2hvd0Nsb3NlQnV0dG9uLFxuICAgICAgICAgIHBhbk9uT3BlbjogdGhpcy5wYW5Pbk9wZW4sXG4gICAgICAgICAgd3JhcHBlckNsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIGJlZm9yZU9wZW46ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlVmlld0NvbnRlbnQoKTtcbiAgICAgICAgICAgICAgdGhpcy5iZWZvcmVPcGVuLmVtaXQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlck9wZW46ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLm9wZW5TdGF0dXMoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJDbG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFmdGVyQ2xvc2UuZW1pdCgpO1xuICAgICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZS5lbWl0KHRoaXMub3BlblN0YXR1cygpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGVsZW1zWzFdICE9IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zLm1hcmtlciA9IGVsZW1zWzFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMucG9zaXRpb24gPSB7XG4gICAgICAgICAgICBsYXQ6IHRoaXMubGF0aXR1ZGUsXG4gICAgICAgICAgICBsbmc6IHRoaXMubG9uZ2l0dWRlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbmF0aXZlU25henp5SW5mb1dpbmRvdyA9IG5ldyBlbGVtc1swXS5kZWZhdWx0KG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgdGhpcy5fc25henp5SW5mb1dpbmRvd0luaXRpYWxpemVkLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICB0aGlzLl9vcGVuSW5mb1dpbmRvdygpO1xuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29wZW5JbmZvV2luZG93KCkge1xuICAgIHRoaXMuX3NuYXp6eUluZm9XaW5kb3dJbml0aWFsaXplZC50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2NyZWF0ZVZpZXdDb250ZW50KCk7XG4gICAgICB0aGlzLl9uYXRpdmVTbmF6enlJbmZvV2luZG93Lm9wZW4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2xvc2VJbmZvV2luZG93KCkge1xuICAgIHRoaXMuX3NuYXp6eUluZm9XaW5kb3dJbml0aWFsaXplZC50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX25hdGl2ZVNuYXp6eUluZm9XaW5kb3cuY2xvc2UoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY3JlYXRlVmlld0NvbnRlbnQoKSB7XG4gICAgaWYgKHRoaXMuX3ZpZXdDb250YWluZXJSZWYubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ciA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKTtcbiAgICB0aGlzLl9uYXRpdmVTbmF6enlJbmZvV2luZG93LnNldENvbnRlbnQodGhpcy5fb3V0ZXJXcmFwcGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgIC8vIHdlIGhhdmUgdG8gcnVuIHRoaXMgaW4gYSBzZXBhcmF0ZSBjeWNsZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGV2ci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3VwZGF0ZVBvc2l0aW9uKCkge1xuICAgIHRoaXMuX25hdGl2ZVNuYXp6eUluZm9XaW5kb3cuc2V0UG9zaXRpb24oe1xuICAgICAgbGF0OiB0aGlzLmxhdGl0dWRlLFxuICAgICAgbG5nOiB0aGlzLmxvbmdpdHVkZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgU25henp5IEluZm8gV2luZG93IGlzIGluaXRpYWxpemVkIGFuZCBvcGVuLlxuICAgKi9cbiAgb3BlblN0YXR1cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlU25henp5SW5mb1dpbmRvdyAmJiB0aGlzLl9uYXRpdmVTbmF6enlJbmZvV2luZG93LmlzT3BlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX25hdGl2ZVNuYXp6eUluZm9XaW5kb3cpIHtcbiAgICAgIHRoaXMuX25hdGl2ZVNuYXp6eUluZm9XaW5kb3cuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxufVxuIl19