@creativeacer/ngx-image-display
Version:
Ngx-Image-Display : Responsive image container
149 lines • 22.5 kB
JavaScript
import { Component, Input, EventEmitter, Output, ViewChild, Renderer2 } from '@angular/core';
var hoverEffect;
(function (hoverEffect) {
hoverEffect["zoom"] = "zoom";
hoverEffect["lighten"] = "lighten";
hoverEffect["darken"] = "darken";
hoverEffect["greyscale"] = "greyscale";
hoverEffect["sepia"] = "sepia";
})(hoverEffect || (hoverEffect = {}));
export class NgximagedisplayComponent {
constructor(renderer) {
this.renderer = renderer;
/**
* Default configuration
*/
this.defaultdisplayconfig = {
imageminwidth: '250px',
containerwidth: '65%',
containerheight: '600px'
};
this.defaultImageEffect = {
hoverEffectActive: false
};
this.onImageSelected = new EventEmitter();
}
ngOnInit() {
if (!this.displayconfig) {
this.displayconfig = this.defaultdisplayconfig;
}
if (!this.imageEffect) {
this.imageEffect = this.defaultImageEffect;
}
// this.gridrows = 'repeat(auto-fit, minmax('+this.displayconfig.rowheight+', 1fr))';
this.setContainerLayout();
this.setContainer();
this.setHoverEffect();
this.setSameSize();
}
setContainer() {
if (this.displayconfig && this.displayconfig.containerwidth) {
this.containerwidth = this.displayconfig.containerwidth;
}
if (this.displayconfig && this.displayconfig.containerheight) {
this.containerheight = this.displayconfig.containerheight;
}
}
setContainerLayout() {
if (this.displayconfig && this.displayconfig.imageminwidth && this.displayconfig.columns) {
this.gridcolumns = 'repeat(' + this.displayconfig.columns + ', minmax(' + this.displayconfig.imageminwidth + ', 1fr))';
}
else if (this.displayconfig && this.displayconfig.imageminwidth) {
this.gridcolumns = 'repeat(auto-fit, minmax(' + this.displayconfig.imageminwidth + ', 1fr))';
}
else {
this.gridcolumns = 'repeat(auto-fit, minmax(300px, 1fr))';
}
}
setHoverEffect() {
if (this.imageEffect.hoverEffectActive && this.imageEffect.hoverEffect) {
switch (this.imageEffect.hoverEffect) {
case 'zoom':
this.zoomlvl = hoverEffect.zoom;
break;
case 'lighten':
this.zoomlvl = hoverEffect.lighten;
break;
case 'darken':
this.zoomlvl = hoverEffect.darken;
break;
case 'greyscale':
this.zoomlvl = hoverEffect.greyscale;
break;
case 'sepia':
this.zoomlvl = hoverEffect.sepia;
break;
default:
break;
}
}
else if (this.imageEffect.hoverEffectActive) {
this.zoomlvl = hoverEffect.zoom;
}
}
viewFullScreen(img) {
this.renderer.setStyle(this.myModal.nativeElement, 'display', 'block');
this.renderer.setProperty(this.img01.nativeElement, 'src', img.imageData.value);
this.renderer.setProperty(this.caption.nativeElement, 'innerHTML', img.imageData.subtext ? img.imageData.subtext : '');
}
closeImage() {
this.renderer.setStyle(this.myModal.nativeElement, 'display', 'none');
}
calculateStyle(i) {
return {
initialEffect: !this.hovering === i,
zoom: this.hovering === i && (this.zoomlvl === hoverEffect.zoom),
lighten: this.hovering === i && (this.zoomlvl === hoverEffect.lighten),
darken: this.hovering === i && (this.zoomlvl === hoverEffect.darken),
greyscale: this.hovering === i && (this.zoomlvl === hoverEffect.greyscale),
sepia: this.hovering === i && (this.zoomlvl === hoverEffect.sepia)
};
}
setSameSize() {
if (!this.sameSize) {
this.sameSize = {
active: false,
imgContainerHeight: '300px'
};
}
}
mouseenter(itemIndex) {
if (this.imageEffect.hoverEffectActive) {
this.hovering = itemIndex;
}
}
mouseleave() {
this.hovering = -1;
}
imageSelected(mouseEvent, img) {
const clickedImageData = {
imageData: img.imageData,
type: img.type,
mouseEvent
};
this.onImageSelected.emit(clickedImageData);
}
}
NgximagedisplayComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-image-display',
template: "<div class=\"bodymain\">\n <div class=\"imageDiv\" [ngStyle]=\"{'width': containerwidth, 'height': containerheight}\">\n <main *ngIf=\"!sameSize.active\" [ngStyle]=\"{'grid-template-columns': gridcolumns, 'grid-template-rows': gridrows}\">\n <div class=\"overlay\" *ngFor=\"let image of images; let i = index\" (mouseenter)=\"mouseenter(i)\" (mouseleave)=\"mouseleave()\" [ngClass]=\"calculateStyle(i)\">\n <img (click)='imageSelected($event, image)' class=\"imagecontainer\" [src]=\"image.imageData.value\"/>\n <div class=\"subtext\" (click)='imageSelected($event, image)' [ngClass]=\"{'full': image.imageData.subtextOverlay === 'full',\n 'half': image.imageData.subtextOverlay === 'half',\n 'bottom': image.imageData.subtextOverlay === 'bottom' || (!image.imageData.subtextOverlay && image.imageData.subtext)}\">{{image.imageData.subtext}}</div>\n <span *ngIf=\"displayconfig.fullScreenView\" class=\"fullview\" (click)=\"viewFullScreen(image)\">❐</span>\n </div>\n </main>\n <main *ngIf=\"sameSize.active\" [ngStyle]=\"{'grid-template-columns': gridcolumns, 'grid-template-rows': gridrows}\">\n <div class=\"overlay\" *ngFor=\"let image of images; let i = index\" (mouseenter)=\"mouseenter(i)\" (mouseleave)=\"mouseleave()\" [ngClass]=\"calculateStyle(i)\">\n <div class=\"img imagecontainer\" (click)='imageSelected($event, image)' [ngStyle]=\"{'background-image':' url(' + image.imageData.value + ')',\n 'min-height': sameSize.imgContainerHeight}\"></div>\n <div class=\"subtext\" (click)='imageSelected($event, image)' [ngClass]=\"{'full': image.imageData.subtextOverlay === 'full',\n 'half': image.imageData.subtextOverlay === 'half',\n 'bottom': image.imageData.subtextOverlay === 'bottom' || (!image.imageData.subtextOverlay && image.imageData.subtext)}\">{{image.imageData.subtext}}</div>\n <span *ngIf=\"displayconfig.fullScreenView\" class=\"fullview\" (click)=\"viewFullScreen(image)\">❐</span>\n </div>\n </main>\n </div>\n</div>\n\n<!-- The Modal --> \n<div #myModal class=\"modal\">\n<span #close class=\"close\" (click)=\"closeImage()\">×</span>\n<img class=\"modal-content\" #img01>\n<div #caption class=\"caption\"></div>\n</div>\n",
styles: [".bodymain{display:flex;justify-content:center;width:100%}.bodymain .imageDiv{overflow:auto}.overlay:hover .fullview{display:initial}.fullview{color:#f1f1f1;display:none;font-size:25px;font-weight:700;position:absolute;right:25px;top:15px;transition:.3s}.fullview:focus,.fullview:hover{color:#bbb;cursor:pointer;text-decoration:none}main{box-sizing:border-box;display:grid;grid-column-gap:10px;grid-row-gap:10px}main .overlay{align-self:center;display:flex;overflow:hidden;position:relative}main .overlay .imagecontainer{transition:transform .5s ease}main .overlay .img,main .overlay img{align-self:center;display:flex;width:100%}main .overlay .img{background-position:50% 50%;background-repeat:no-repeat;background-size:cover}main .overlay .subtext{align-items:center;background-color:rgba(0,0,0,.4);bottom:0;color:#fff;display:flex;justify-content:center;left:0;overflow:hidden;position:absolute;right:0;transition:.5s ease}main .overlay .subtext.full{background-size:cover;height:100%;width:100%}main .overlay .subtext.half{background-size:cover;height:45%;width:100%}main .overlay .subtext.bottom{background-size:cover;height:20%;width:100%}main .initialEffect{filter:brightness(100%);overflow:hidden;transform:scale(1);z-index:\"initial\"}main .zoom{overflow:hidden;z-index:\"999\"}main .zoom .img,main .zoom img{transform:scale(1.3);transition:transform .3s ease}main .lighten{filter:brightness(150%)}main .darken,main .lighten{transition:.2s ease-in-out;z-index:\"999\"}main .darken{filter:brightness(50%)}main .greyscale{filter:grayscale(100%)}main .greyscale,main .sepia{transition:.2s ease-in-out;z-index:\"999\"}main .sepia{filter:sepia(100%)}#myImg{border-radius:5px;cursor:pointer;transition:.3s}#myImg:hover{opacity:.7}.modal{background-color:#000;background-color:rgba(0,0,0,.9);display:none;height:100%;left:0;overflow:auto;padding-top:100px;position:fixed;top:0;width:100%;z-index:1}.caption,.modal-content{display:block;margin:auto;max-width:700px;width:80%}.caption{color:#ccc;height:150px;padding:10px 0;text-align:center}#caption,.modal-content{-webkit-animation-duration:.6s;-webkit-animation-name:zoom;animation-duration:.6s;animation-name:zoom}@-webkit-keyframes zoom{0%{-webkit-transform:scale(0)}to{-webkit-transform:scale(1)}}@keyframes zoom{0%{transform:scale(0)}to{transform:scale(1)}}.close{color:#f1f1f1;font-size:40px;font-weight:700;position:absolute;right:35px;top:15px;transition:.3s}.close:focus,.close:hover{color:#bbb;cursor:pointer;text-decoration:none}@media only screen and (max-width:700px){.modal-content{width:100%}}"]
},] }
];
NgximagedisplayComponent.ctorParameters = () => [
{ type: Renderer2 }
];
NgximagedisplayComponent.propDecorators = {
images: [{ type: Input }],
sameSize: [{ type: Input }],
displayconfig: [{ type: Input }],
imageEffect: [{ type: Input }],
onImageSelected: [{ type: Output }],
myModal: [{ type: ViewChild, args: ['myModal',] }],
myImg: [{ type: ViewChild, args: ['myImg',] }],
img01: [{ type: ViewChild, args: ['img01',] }],
caption: [{ type: ViewChild, args: ['caption',] }],
close: [{ type: ViewChild, args: ['close',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4aW1hZ2VkaXNwbGF5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9tYXJjby9Eb2N1bWVudHMvRGV2ZWxvcG1lbnQvR2l0aHViL25neC1pbWFnZS1kaXNwbGF5L3Byb2plY3RzL25neGltYWdlZGlzcGxheS9zcmMvIiwic291cmNlcyI6WyJsaWIvbmd4aW1hZ2VkaXNwbGF5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHckcsSUFBSyxXQU1KO0FBTkQsV0FBSyxXQUFXO0lBQ2QsNEJBQWEsQ0FBQTtJQUNiLGtDQUFtQixDQUFBO0lBQ25CLGdDQUFpQixDQUFBO0lBQ2pCLHNDQUF1QixDQUFBO0lBQ3ZCLDhCQUFlLENBQUE7QUFDakIsQ0FBQyxFQU5JLFdBQVcsS0FBWCxXQUFXLFFBTWY7QUFPRCxNQUFNLE9BQU8sd0JBQXdCO0lBb0NuQyxZQUFvQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBNUJ2Qzs7V0FFRztRQUNILHlCQUFvQixHQUFrQjtZQUNwQyxhQUFhLEVBQUUsT0FBTztZQUN0QixjQUFjLEVBQUUsS0FBSztZQUNyQixlQUFlLEVBQUUsT0FBTztTQUN6QixDQUFDO1FBQ0YsdUJBQWtCLEdBQWdCO1lBQ2hDLGlCQUFpQixFQUFHLEtBQUs7U0FDMUIsQ0FBQztRQVVPLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQVFkLENBQUM7SUFFNUMsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1NBQ2hEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJ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QUVELFVBQVUsQ0FBQyxTQUFTO1FBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRTtZQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztTQUMzQjtJQUNILENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQXNCLEVBQUUsR0FBYztRQUNsRCxNQUFNLGdCQUFnQixHQUFxQjtZQUN6QyxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDeEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsVUFBVTtTQUNYLENBQUE7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7OztZQXRKRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0Isd3ZFQUErQzs7YUFFaEQ7OztZQWZtRSxTQUFTOzs7cUJBdUMzRSxLQUFLO3VCQUNMLEtBQUs7NEJBQ0wsS0FBSzswQkFDTCxLQUFLOzhCQUVMLE1BQU07c0JBRU4sU0FBUyxTQUFDLFNBQVM7b0JBQ25CLFNBQVMsU0FBQyxPQUFPO29CQUNqQixTQUFTLFNBQUMsT0FBTztzQkFDakIsU0FBUyxTQUFDLFNBQVM7b0JBQ25CLFNBQVMsU0FBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEltYWdlRGF0YSwgRGlzcGxheUNvbmZpZywgU2FtZVNpemVDb25maWcsIEltYWdlRWZmZWN0LCBDbGlja2VkSW1hZ2VEYXRhfSBmcm9tICcuLi9pbnRlcmZhY2VzL25neGltYWdlZGlzcGxheS5pbnRlcmZhY2UnO1xuXG5lbnVtIGhvdmVyRWZmZWN0IHtcbiAgem9vbSA9ICd6b29tJyxcbiAgbGlnaHRlbiA9ICdsaWdodGVuJyxcbiAgZGFya2VuID0gJ2RhcmtlbicsXG4gIGdyZXlzY2FsZSA9ICdncmV5c2NhbGUnLFxuICBzZXBpYSA9ICdzZXBpYSdcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWltYWdlLWRpc3BsYXknLFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4aW1hZ2VkaXNwbGF5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4aW1hZ2VkaXNwbGF5LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd4aW1hZ2VkaXNwbGF5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29udGFpbmVyd2lkdGg6IHN0cmluZztcbiAgY29udGFpbmVyaGVpZ2h0OiBzdHJpbmc7XG4gIGdyaWRjb2x1bW5zOiBzdHJpbmc7XG4gIGdyaWRyb3dzOiBzdHJpbmc7XG4gIGhvdmVyaW5nOiBudW1iZXI7XG4gIHpvb21sdmw6IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBkZWZhdWx0ZGlzcGxheWNvbmZpZzogRGlzcGxheUNvbmZpZyA9IHtcbiAgICBpbWFnZW1pbndpZHRoOiAnMjUwcHgnLFxuICAgIGNvbnRhaW5lcndpZHRoOiAnNjUlJyxcbiAgICBjb250YWluZXJoZWlnaHQ6ICc2MDBweCdcbiAgfTtcbiAgZGVmYXVsdEltYWdlRWZmZWN0OiBJbWFnZUVmZmVjdCA9IHtcbiAgICBob3ZlckVmZmVjdEFjdGl2ZSA6IGZhbHNlXG4gIH07XG4gLyoqXG4gICogRU5EIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAqL1xuXG4gQElucHV0KCkgaW1hZ2VzOiBBcnJheTxJbWFnZURhdGE+O1xuIEBJbnB1dCgpIHNhbWVTaXplOiBTYW1lU2l6ZUNvbmZpZztcbiBASW5wdXQoKSBkaXNwbGF5Y29uZmlnOiBEaXNwbGF5Q29uZmlnO1xuIEBJbnB1dCgpIGltYWdlRWZmZWN0OiBJbWFnZUVmZmVjdDtcblxuIEBPdXRwdXQoKSBvbkltYWdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlRGF0YT4oKTtcblxuIEBWaWV3Q2hpbGQoJ215TW9kYWwnKSBteU1vZGFsO1xuIEBWaWV3Q2hpbGQoJ215SW1nJykgbXlJbWc7XG4gQFZpZXdDaGlsZCgnaW1nMDEnKSBpbWcwMTtcbiBAVmlld0NoaWxkKCdjYXB0aW9uJykgY2FwdGlvbjtcbiBAVmlld0NoaWxkKCdjbG9zZScpIGNsb3NlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmRpc3BsYXljb25maWcpIHtcbiAgICAgIHRoaXMuZGlzcGxheWNvbmZpZyA9IHRoaXMuZGVmYXVsdGRpc3BsYXljb25maWc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pbWFnZUVmZmVjdCkge1xuICAgICAgdGhpcy5pbWFnZUVmZmVjdCA9IHRoaXMuZGVmYXVsdEltYWdlRWZmZWN0O1xuICAgIH1cbiAgICAvLyB0aGlzLmdyaWRyb3dzID0gJ3JlcGVhdChhdXRvLWZpdCwgbWlubWF4KCcrdGhpcy5kaXNwbGF5Y29uZmlnLnJvd2hlaWdodCsnLCAxZnIpKSc7XG5cbiAgICB0aGlzLnNldENvbnRhaW5lckxheW91dCgpO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5zZXRIb3ZlckVmZmVjdCgpO1xuICAgIHRoaXMuc2V0U2FtZVNpemUoKTtcblxuICB9XG5cbiAgc2V0Q29udGFpbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc3BsYXljb25maWcgJiYgdGhpcy5kaXNwbGF5Y29uZmlnLmNvbnRhaW5lcndpZHRoKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lcndpZHRoID0gdGhpcy5kaXNwbGF5Y29uZmlnLmNvbnRhaW5lcndpZHRoO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXNwbGF5Y29uZmlnICYmIHRoaXMuZGlzcGxheWNvbmZpZy5jb250YWluZXJoZWlnaHQpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyaGVpZ2h0ID0gdGhpcy5kaXNwbGF5Y29uZmlnLmNvbnRhaW5lcmhlaWdodDtcbiAgICB9XG4gIH1cblxuICBzZXRDb250YWluZXJMYXlvdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzcGxheWNvbmZpZyAmJiB0aGlzLmRpc3BsYXljb25maWcuaW1hZ2VtaW53aWR0aCAmJiB0aGlzLmRpc3BsYXljb25maWcuY29sdW1ucykge1xuICAgICAgdGhpcy5ncmlkY29sdW1ucyA9ICdyZXBlYXQoJyArIHRoaXMuZGlzcGxheWNvbmZpZy5jb2x1bW5zICsgJywgbWlubWF4KCcgKyB0aGlzLmRpc3BsYXljb25maWcuaW1hZ2VtaW53aWR0aCArICcsIDFmcikpJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheWNvbmZpZyAmJiB0aGlzLmRpc3BsYXljb25maWcuaW1hZ2VtaW53aWR0aCkge1xuICAgICAgdGhpcy5ncmlkY29sdW1ucyA9ICdyZXBlYXQoYXV0by1maXQsIG1pbm1heCgnICsgdGhpcy5kaXNwbGF5Y29uZmlnLmltYWdlbWlud2lkdGggKyAnLCAxZnIpKSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JpZGNvbHVtbnMgPSAncmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMzAwcHgsIDFmcikpJztcbiAgICB9XG4gIH1cblxuICBzZXRIb3ZlckVmZmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbWFnZUVmZmVjdC5ob3ZlckVmZmVjdEFjdGl2ZSAmJiB0aGlzLmltYWdlRWZmZWN0LmhvdmVyRWZmZWN0KSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuaW1hZ2VFZmZlY3QuaG92ZXJFZmZlY3QpIHtcbiAgICAgICAgY2FzZSAnem9vbSc6XG4gICAgICAgICAgdGhpcy56b29tbHZsID0gaG92ZXJFZmZlY3Quem9vbTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGlnaHRlbic6XG4gICAgICAgICAgdGhpcy56b29tbHZsID0gaG92ZXJFZmZlY3QubGlnaHRlbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGFya2VuJzpcbiAgICAgICAgICB0aGlzLnpvb21sdmwgPSBob3ZlckVmZmVjdC5kYXJrZW47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2dyZXlzY2FsZSc6XG4gICAgICAgICAgdGhpcy56b29tbHZsID0gaG92ZXJFZmZlY3QuZ3JleXNjYWxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZXBpYSc6XG4gICAgICAgICAgdGhpcy56b29tbHZsID0gaG92ZXJFZmZlY3Quc2VwaWE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmltYWdlRWZmZWN0LmhvdmVyRWZmZWN0QWN0aXZlKSB7XG4gICAgICB0aGlzLnpvb21sdmwgPSBob3ZlckVmZmVjdC56b29tO1xuICAgIH1cbiAgfVxuXG4gIHZpZXdGdWxsU2NyZWVuKGltZzogSW1hZ2VEYXRhKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLm15TW9kYWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW1nMDEubmF0aXZlRWxlbWVudCwgJ3NyYycsIGltZy5pbWFnZURhdGEudmFsdWUpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5jYXB0aW9uLm5hdGl2ZUVsZW1lbnQsICdpbm5lckhUTUwnLCBpbWcuaW1hZ2VEYXRhLnN1YnRleHQgPyBpbWcuaW1hZ2VEYXRhLnN1YnRleHQgOiAnJyk7XG4gIH1cblxuICBjbG9zZUltYWdlKCkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5teU1vZGFsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVN0eWxlKGkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdGlhbEVmZmVjdDogIXRoaXMuaG92ZXJpbmcgPT09IGksXG4gICAgICB6b29tOiB0aGlzLmhvdmVyaW5nID09PSBpICYmICh0aGlzLnpvb21sdmwgPT09IGhvdmVyRWZmZWN0Lnpvb20pLFxuICAgICAgbGlnaHRlbjogdGhpcy5ob3ZlcmluZyA9PT0gaSAmJiAodGhpcy56b29tbHZsID09PSBob3ZlckVmZmVjdC5saWdodGVuKSxcbiAgICAgIGRhcmtlbjogdGhpcy5ob3ZlcmluZyA9PT0gaSAmJiAodGhpcy56b29tbHZsID09PSBob3ZlckVmZmVjdC5kYXJrZW4pLFxuICAgICAgZ3JleXNjYWxlOiB0aGlzLmhvdmVyaW5nID09PSBpICYmICh0aGlzLnpvb21sdmwgPT09IGhvdmVyRWZmZWN0LmdyZXlzY2FsZSksXG4gICAgICBzZXBpYTogdGhpcy5ob3ZlcmluZyA9PT0gaSAmJiAodGhpcy56b29tbHZsID09PSBob3ZlckVmZmVjdC5zZXBpYSlcbiAgICB9O1xuICB9XG5cbiAgc2V0U2FtZVNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNhbWVTaXplKSB7XG4gICAgICB0aGlzLnNhbWVTaXplID0ge1xuICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICBpbWdDb250YWluZXJIZWlnaHQ6ICczMDBweCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbW91c2VlbnRlcihpdGVtSW5kZXgpIHtcbiAgICBpZiAodGhpcy5pbWFnZUVmZmVjdC5ob3ZlckVmZmVjdEFjdGl2ZSkge1xuICAgICAgdGhpcy5ob3ZlcmluZyA9IGl0ZW1JbmRleDtcbiAgICB9XG4gIH1cbiAgbW91c2VsZWF2ZSgpIHtcbiAgICB0aGlzLmhvdmVyaW5nID0gLTE7XG4gIH1cblxuICBpbWFnZVNlbGVjdGVkKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQsIGltZzogSW1hZ2VEYXRhKSB7XG4gICAgY29uc3QgY2xpY2tlZEltYWdlRGF0YTogQ2xpY2tlZEltYWdlRGF0YSA9IHtcbiAgICAgIGltYWdlRGF0YTogaW1nLmltYWdlRGF0YSxcbiAgICAgIHR5cGU6IGltZy50eXBlLFxuICAgICAgbW91c2VFdmVudFxuICAgIH1cbiAgICB0aGlzLm9uSW1hZ2VTZWxlY3RlZC5lbWl0KGNsaWNrZWRJbWFnZURhdGEpO1xuICB9XG5cbn1cbiJdfQ==