@crystalui/angular-lightbox
Version:
Angular library for viewing images in a pop-up window with touch screen support.
331 lines • 31.9 kB
JavaScript
import { __decorate } from "tslib";
import { Component, Input, HostBinding, ViewChild } from '@angular/core';
import { EventService } from './event.service';
import { Utils } from './utils';
var LightboxCommonComponent = /** @class */ (function () {
function LightboxCommonComponent(eventService) {
this.eventService = eventService;
this.currentImageIndex = 0;
this.indexCurrentSlide = 1;
this.containerStyles = {
transition: '',
transform: '',
width: '',
height: '',
opacity: ''
};
this.currImageLoadingState = 'not-loaded';
this.isMobile = Utils.mobileCheck();
}
Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImage", {
get: function () {
return this._lightboxImage;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImageElement", {
get: function () {
if (this.lightboxImage) {
return this.lightboxImage.nativeElement;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImageNaturalHeight", {
get: function () {
if (this.lightboxImageElement) {
return this.lightboxImageElement.naturalHeight;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImageNaturalWidth", {
get: function () {
if (this.lightboxImageElement) {
return this.lightboxImageElement.naturalWidth;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "index", {
get: function () {
return this.currentImageIndex;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "properties", {
get: function () {
return this.lightboxData.properties;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "images", {
get: function () {
return this.lightboxData.images || [this.lightboxData.image];
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "thumbnailImage", {
get: function () {
return this.images[this.currentImageIndex].nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "thumbnailImagePosition", {
get: function () {
return this.thumbnailImage.getBoundingClientRect();
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "virtualImageDimension", {
// Image size if it is larger than the window size
get: function () {
var height = this.lightboxImageNaturalHeight;
var width = height * this.imageAspectRatio;
var windowWidth = document.body.clientWidth;
var windowHeight = window.innerHeight;
if (this.isImageLargerWindow) {
if (height > windowHeight) {
height = windowHeight;
width = height * this.imageAspectRatio;
}
if (width > windowWidth) {
width = windowWidth;
height = width / this.imageAspectRatio;
}
}
else {
width = this.lightboxImageNaturalWidth;
height = this.lightboxImageNaturalHeight;
}
if (width === 0 || Number.parseInt(height) === 0) {
return { width: 200, height: 200 };
}
return { width: width, height: height };
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "containerInitialPosition", {
get: function () {
var scale = (this.showState === 'initial-thumbnail-image') ? 1 : this.containerScale;
var top = this.thumbnailImagePosition.top;
var left = this.thumbnailImagePosition.left;
return 'matrix(' + scale + ', 0, 0, ' + scale + ',' + left + ',' + top + ')';
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "containerFullscreenPosition", {
get: function () {
var left = (document.body.clientWidth - this.virtualImageDimension.width) / 2;
var top = (window.innerHeight - this.virtualImageDimension.height) / 2;
return 'translate3d(' + left + 'px, ' + top + 'px, 0)';
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "containerScale", {
get: function () {
return this.thumbnailImagePosition.width / this.virtualImageDimension.width;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "imageAspectRatio", {
get: function () {
return this.thumbnailImage.naturalWidth / this.thumbnailImage.naturalHeight;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "isImageLargerWindow", {
get: function () {
var imageNaturalWidth = this.lightboxImageNaturalWidth;
var imageNaturalHeight = this.lightboxImageNaturalHeight;
var windowWidth = document.body.clientWidth;
var windowHeight = window.innerHeight;
return imageNaturalWidth > windowWidth || imageNaturalHeight > windowHeight;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "isFirstImage", {
get: function () {
if (this.properties.loop) {
return false;
}
else {
return this.index === 0;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "isLastImage", {
get: function () {
if (this.properties.loop) {
return false;
}
else {
return this.index === this.latestImageIndex;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "latestImageIndex", {
get: function () {
return this.images.length - 1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "backgroundColor", {
get: function () {
var opacity = this.properties.backgroundOpacity;
var color = this.properties.backgroundColor;
if (color === 'black') {
return 'rgba(0, 0, 0, ' + opacity + ')';
}
else {
return 'rgba(255, 255, 255, ' + opacity + ')';
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "animationDuration", {
get: function () {
var animationDuration = this.properties.animationDuration;
if (typeof animationDuration === "string") {
return Number.parseInt(animationDuration);
}
else {
return animationDuration;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "animationMode", {
get: function () {
if (this.currImageLoadingState === 'error') {
return 'default';
}
return this.properties.animationMode;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "animationTimingFunction", {
get: function () {
return this.properties.animationTimingFunction;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "closeButtonText", {
get: function () {
return this.properties.closeButtonText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "counterSeparator", {
get: function () {
return this.properties.counterSeparator;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxCommonComponent.prototype, "counter", {
get: function () {
return this.currentImageIndex + 1 + this.counterSeparator + this.images.length;
},
enumerable: true,
configurable: true
});
LightboxCommonComponent.prototype.emitState = function (type, state) {
if (state === 'initial-virtual-image' ||
state === 'initial-styles') {
return;
}
if (state === 'initial-default' ||
state === 'initial-thumbnail-image') {
state = 'initial';
}
this.eventService.emitChangeEvent({
type: type + ':' + state
});
};
LightboxCommonComponent.prototype.setShowState = function (state) {
this.showState = state;
this.emitState('show-state', state);
};
LightboxCommonComponent.prototype.setClosingState = function (state) {
this.closingState = state;
this.emitState('closing-state', state);
};
LightboxCommonComponent.prototype.setAnimationDuration = function () {
this.hostStyleTransition = 'background-color ' + this.animationDuration + 'ms';
this.containerStyles.transition = 'all ' + this.animationDuration + 'ms ' + this.animationTimingFunction;
};
LightboxCommonComponent.prototype.setBackgroundColor = function () {
this.hostStyleBackgroundColor = this.backgroundColor;
};
LightboxCommonComponent.prototype.getContainerHeight = function () {
return this.thumbnailImagePosition.height / this.containerScale + 'px';
};
LightboxCommonComponent.prototype.showThumbnailImage = function () {
this.thumbnailImage.style.opacity = '';
};
LightboxCommonComponent.prototype.hideThumbnailImage = function () {
this.thumbnailImage.style.opacity = 0;
};
LightboxCommonComponent.prototype.updateThumbnailPosition = function () {
this.containerStyles.transform = this.containerInitialPosition;
};
LightboxCommonComponent.ctorParameters = function () { return [
{ type: EventService }
]; };
__decorate([
Input()
], LightboxCommonComponent.prototype, "lightboxData", void 0);
__decorate([
HostBinding('style.backgroundColor')
], LightboxCommonComponent.prototype, "hostStyleBackgroundColor", void 0);
__decorate([
HostBinding('style.transition')
], LightboxCommonComponent.prototype, "hostStyleTransition", void 0);
__decorate([
ViewChild('imageFirst', { static: true })
], LightboxCommonComponent.prototype, "_imageFirst", void 0);
__decorate([
ViewChild('imageSecond', { static: true })
], LightboxCommonComponent.prototype, "_imageSecond", void 0);
__decorate([
ViewChild('imageLast', { static: true })
], LightboxCommonComponent.prototype, "_imageLast", void 0);
__decorate([
ViewChild('lightboxImage', { static: true })
], LightboxCommonComponent.prototype, "_lightboxImage", void 0);
LightboxCommonComponent = __decorate([
Component({
selector: 'lightbox-common',
template: ''
})
], LightboxCommonComponent);
return LightboxCommonComponent;
}());
export { LightboxCommonComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtY29tbW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjcnlzdGFsdWkvYW5ndWxhci1saWdodGJveC8iLCJzb3VyY2VzIjpbImxpYi9saWdodGJveC1jb21tb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBR3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBT2hDO0lBOExJLGlDQUFtQixZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQTVMN0Msc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUd0QixvQkFBZSxHQUFRO1lBQ25CLFVBQVUsRUFBRSxFQUFFO1lBQ2QsU0FBUyxFQUFFLEVBQUU7WUFDYixLQUFLLEVBQUUsRUFBRTtZQUNULE1BQU0sRUFBRSxFQUFFO1lBQ1YsT0FBTyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBQ0YsMEJBQXFCLEdBQW9ELFlBQVksQ0FBQztRQWtMbEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQXRLRCxzQkFBSSxrREFBYTthQUFqQjtZQUNJLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHlEQUFvQjthQUF4QjtZQUNJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBQztnQkFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQzthQUMzQztRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0RBQTBCO2FBQTlCO1lBQ0ksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUM7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LFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztnRUFBeUI7SUFDdkI7UUFBM0MsU0FBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztpRUFBMEI7SUFDM0I7UUFBekMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzsrREFBd0I7SUFDbkI7UUFBN0MsU0FBUyxDQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzttRUFBNEI7SUF4QmhFLHVCQUF1QjtRQUxuQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLFFBQVEsRUFBRSxFQUFFO1NBQ2YsQ0FBQztPQUVXLHVCQUF1QixDQW9QbkM7SUFBRCw4QkFBQztDQUFBLEFBcFBELElBb1BDO1NBcFBZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEhvc3RCaW5kaW5nLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpZ2h0Ym94RGF0YSwgUHJvcGVydGllcyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTaG93U3RhdGUsIENsb3NpbmdTdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGlnaHRib3gtY29tbW9uJyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5cbmV4cG9ydCBjbGFzcyBMaWdodGJveENvbW1vbkNvbXBvbmVudCB7XG5cbiAgICBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyID0gMDtcbiAgICBpbmRleEN1cnJlbnRTbGlkZSA9IDE7XG4gICAgc2hvd1N0YXRlOiBTaG93U3RhdGU7XG4gICAgY2xvc2luZ1N0YXRlOiBDbG9zaW5nU3RhdGU7XG4gICAgY29udGFpbmVyU3R5bGVzOiBhbnkgPSB7XG4gICAgICAgIHRyYW5zaXRpb246ICcnLFxuICAgICAgICB0cmFuc2Zvcm06ICcnLFxuICAgICAgICB3aWR0aDogJycsXG4gICAgICAgIGhlaWdodDogJycsXG4gICAgICAgIG9wYWNpdHk6ICcnXG4gICAgfTtcbiAgICBjdXJySW1hZ2VMb2FkaW5nU3RhdGU6ICdub3QtbG9hZGVkJyB8ICdsb2FkaW5nJyB8ICd1cGxvYWRlZCcgfCAnZXJyb3InID0gJ25vdC1sb2FkZWQnO1xuICAgIGlzTW9iaWxlOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgbGlnaHRib3hEYXRhOiBMaWdodGJveERhdGE7XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmJhY2tncm91bmRDb2xvcicpIGhvc3RTdHlsZUJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUudHJhbnNpdGlvbicpIGhvc3RTdHlsZVRyYW5zaXRpb246IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ2ltYWdlRmlyc3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBfaW1hZ2VGaXJzdDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdpbWFnZVNlY29uZCcsIHsgc3RhdGljOiB0cnVlIH0pIF9pbWFnZVNlY29uZDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdpbWFnZUxhc3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBfaW1hZ2VMYXN0OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2xpZ2h0Ym94SW1hZ2UnLCB7IHN0YXRpYzogdHJ1ZSB9KSBfbGlnaHRib3hJbWFnZTogRWxlbWVudFJlZjtcblxuICAgIGdldCBsaWdodGJveEltYWdlKCl7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodGJveEltYWdlO1xuICAgIH1cblxuICAgIGdldCBsaWdodGJveEltYWdlRWxlbWVudCgpe1xuICAgICAgICBpZiAodGhpcy5saWdodGJveEltYWdlKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpZ2h0Ym94SW1hZ2UubmF0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBsaWdodGJveEltYWdlTmF0dXJhbEhlaWdodCgpe1xuICAgICAgICBpZiAodGhpcy5saWdodGJveEltYWdlRWxlbWVudCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saWdodGJveEltYWdlRWxlbWVudC5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGxpZ2h0Ym94SW1hZ2VOYXR1cmFsV2lkdGgoKXtcbiAgICAgICAgaWYgKHRoaXMubGlnaHRib3hJbWFnZUVsZW1lbnQpe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlnaHRib3hJbWFnZUVsZW1lbnQubmF0dXJhbFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbWFnZUluZGV4O1xuICAgIH1cblxuICAgIGdldCBwcm9wZXJ0aWVzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0Ym94RGF0YS5wcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIGdldCBpbWFnZXMoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlnaHRib3hEYXRhLmltYWdlcyB8fCBbdGhpcy5saWdodGJveERhdGEuaW1hZ2VdO1xuICAgIH1cblxuICAgIGdldCB0aHVtYm5haWxJbWFnZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbdGhpcy5jdXJyZW50SW1hZ2VJbmRleF0ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgdGh1bWJuYWlsSW1hZ2VQb3NpdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxJbWFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICAvLyBJbWFnZSBzaXplIGlmIGl0IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZVxuICAgIGdldCB2aXJ0dWFsSW1hZ2VEaW1lbnNpb24oKXtcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMubGlnaHRib3hJbWFnZU5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIHRoaXMuaW1hZ2VBc3BlY3RSYXRpbztcbiAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJbWFnZUxhcmdlcldpbmRvdyl7XG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gd2luZG93SGVpZ2h0KXtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aW5kb3dIZWlnaHQ7XG4gICAgICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB0aGlzLmltYWdlQXNwZWN0UmF0aW87XG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBpZiAod2lkdGggPiB3aW5kb3dXaWR0aCl7XG4gICAgICAgICAgICAgICAgd2lkdGggPSB3aW5kb3dXaWR0aDtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAvIHRoaXMuaW1hZ2VBc3BlY3RSYXRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5saWdodGJveEltYWdlTmF0dXJhbFdpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5saWdodGJveEltYWdlTmF0dXJhbEhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBOdW1iZXIucGFyc2VJbnQoaGVpZ2h0KSA9PT0gMCl7XG4gICAgICAgICAgICByZXR1cm4ge3dpZHRoOiAyMDAsIGhlaWdodDogMjAwfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgZ2V0IGNvbnRhaW5lckluaXRpYWxQb3NpdGlvbigpe1xuICAgICAgICBjb25zdCBzY2FsZSA9ICAodGhpcy5zaG93U3RhdGUgPT09ICdpbml0aWFsLXRodW1ibmFpbC1pbWFnZScpID8gMSA6IHRoaXMuY29udGFpbmVyU2NhbGU7IFxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnRodW1ibmFpbEltYWdlUG9zaXRpb24udG9wO1xuICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLmxlZnQ7XG4gICAgICAgIHJldHVybiAnbWF0cml4KCcrIHNjYWxlICsnLCAwLCAwLCAnKyBzY2FsZSArJywnKyBsZWZ0ICsnLCcrIHRvcCArJyknO1xuICAgIH1cblxuICAgIGdldCBjb250YWluZXJGdWxsc2NyZWVuUG9zaXRpb24oKXtcbiAgICAgICAgY29uc3QgbGVmdCA9IChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIC0gdGhpcy52aXJ0dWFsSW1hZ2VEaW1lbnNpb24ud2lkdGgpIC8gMjtcbiAgICAgICAgY29uc3QgdG9wID0gKHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMudmlydHVhbEltYWdlRGltZW5zaW9uLmhlaWdodCkgLyAyO1xuXG4gICAgICAgIHJldHVybiAndHJhbnNsYXRlM2QoJysgbGVmdCArJ3B4LCAnKyB0b3AgKydweCwgMCknO1xuICAgIH1cblxuICAgIGdldCBjb250YWluZXJTY2FsZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLndpZHRoIC8gdGhpcy52aXJ0dWFsSW1hZ2VEaW1lbnNpb24ud2lkdGg7XG4gICAgfVxuXG4gICAgZ2V0IGltYWdlQXNwZWN0UmF0aW8oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsSW1hZ2UubmF0dXJhbFdpZHRoIC8gdGhpcy50aHVtYm5haWxJbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgIH1cblxuICAgIGdldCBpc0ltYWdlTGFyZ2VyV2luZG93KCk6Ym9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGltYWdlTmF0dXJhbFdpZHRoID0gdGhpcy5saWdodGJveEltYWdlTmF0dXJhbFdpZHRoO1xuICAgICAgICBjb25zdCBpbWFnZU5hdHVyYWxIZWlnaHQgPSB0aGlzLmxpZ2h0Ym94SW1hZ2VOYXR1cmFsSGVpZ2h0O1xuICAgICAgICBjb25zdCB3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgcmV0dXJuIGltYWdlTmF0dXJhbFdpZHRoID4gd2luZG93V2lkdGggfHwgaW1hZ2VOYXR1cmFsSGVpZ2h0ID4gd2luZG93SGVpZ2h0O1xuICAgIH1cblxuICAgIGdldCBpc0ZpcnN0SW1hZ2UoKXtcbiAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5sb29wKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGlzTGFzdEltYWdlKCl7XG4gICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMubG9vcCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICB9ICAgICAgICBcbiAgICB9XG5cbiAgICBnZXQgbGF0ZXN0SW1hZ2VJbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBnZXQgYmFja2dyb3VuZENvbG9yKCl7XG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSB0aGlzLnByb3BlcnRpZXMuYmFja2dyb3VuZE9wYWNpdHk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5wcm9wZXJ0aWVzLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgaWYgKGNvbG9yID09PSAnYmxhY2snKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3JnYmEoMCwgMCwgMCwgJyArIG9wYWNpdHkgKycpJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmdiYSgyNTUsIDI1NSwgMjU1LCAnICsgb3BhY2l0eSArJyknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFuaW1hdGlvbkR1cmF0aW9uKCl7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5wcm9wZXJ0aWVzLmFuaW1hdGlvbkR1cmF0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYW5pbWF0aW9uRHVyYXRpb24gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChhbmltYXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYW5pbWF0aW9uRHVyYXRpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgYW5pbWF0aW9uTW9kZSgpe1xuICAgICAgICBpZiAodGhpcy5jdXJySW1hZ2VMb2FkaW5nU3RhdGUgPT09ICdlcnJvcicpe1xuICAgICAgICAgICAgcmV0dXJuICdkZWZhdWx0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmFuaW1hdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgZ2V0IGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb247XG4gICAgfVxuXG4gICAgZ2V0IGNsb3NlQnV0dG9uVGV4dCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmNsb3NlQnV0dG9uVGV4dDtcbiAgICB9XG5cbiAgICBnZXQgY291bnRlclNlcGFyYXRvcigpe1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmNvdW50ZXJTZXBhcmF0b3I7XG4gICAgfVxuXG4gICAgZ2V0IGNvdW50ZXIoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEltYWdlSW5kZXggKyAxICsgdGhpcy5jb3VudGVyU2VwYXJhdG9yICsgdGhpcy5pbWFnZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSl7XG4gICAgICAgIHRoaXMuaXNNb2JpbGUgPSBVdGlscy5tb2JpbGVDaGVjaygpO1xuICAgIH1cblxuICAgIGVtaXRTdGF0ZSh0eXBlLCBzdGF0ZSl7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2luaXRpYWwtdmlydHVhbC1pbWFnZScgfHwgXG4gICAgICAgICAgICBzdGF0ZSA9PT0gJ2luaXRpYWwtc3R5bGVzJyl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUgPT09ICdpbml0aWFsLWRlZmF1bHQnIHx8IFxuICAgICAgICAgICAgc3RhdGUgPT09ICdpbml0aWFsLXRodW1ibmFpbC1pbWFnZScpe1xuICAgICAgICAgICAgc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0Q2hhbmdlRXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogdHlwZSsnOicrc3RhdGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0U2hvd1N0YXRlKHN0YXRlOiBTaG93U3RhdGUpe1xuICAgICAgICB0aGlzLnNob3dTdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZSgnc2hvdy1zdGF0ZScsIHN0YXRlKVxuICAgIH1cblxuICAgIHNldENsb3NpbmdTdGF0ZShzdGF0ZTogQ2xvc2luZ1N0YXRlKXtcbiAgICAgICAgdGhpcy5jbG9zaW5nU3RhdGUgPSBzdGF0ZTsgXG4gICAgICAgIHRoaXMuZW1pdFN0YXRlKCdjbG9zaW5nLXN0YXRlJywgc3RhdGUpO1xuICAgIH1cblxuICAgIHNldEFuaW1hdGlvbkR1cmF0aW9uKCl7XG4gICAgICAgIHRoaXMuaG9zdFN0eWxlVHJhbnNpdGlvbiA9ICdiYWNrZ3JvdW5kLWNvbG9yICcrdGhpcy5hbmltYXRpb25EdXJhdGlvbisnbXMnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclN0eWxlcy50cmFuc2l0aW9uID0gJ2FsbCAnK3RoaXMuYW5pbWF0aW9uRHVyYXRpb24rJ21zICcrdGhpcy5hbmltYXRpb25UaW1pbmdGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoKXtcbiAgICAgICAgdGhpcy5ob3N0U3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgICB9XG5cbiAgICBnZXRDb250YWluZXJIZWlnaHQoKTpzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLmhlaWdodCAvIHRoaXMuY29udGFpbmVyU2NhbGUgKyAncHgnO1xuICAgIH1cblxuICAgIHNob3dUaHVtYm5haWxJbWFnZSgpIHtcbiAgICAgICAgdGhpcy50aHVtYm5haWxJbWFnZS5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgfVxuXG4gICAgaGlkZVRodW1ibmFpbEltYWdlKCl7XG4gICAgICAgIHRoaXMudGh1bWJuYWlsSW1hZ2Uuc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgfVxuXG4gICAgdXBkYXRlVGh1bWJuYWlsUG9zaXRpb24oKXtcbiAgICAgICAgdGhpcy5jb250YWluZXJTdHlsZXMudHJhbnNmb3JtID0gdGhpcy5jb250YWluZXJJbml0aWFsUG9zaXRpb247XG4gICAgfVxufSBcbiJdfQ==