ngx-crystal-gallery
Version:
Responsive gallery with support for masonry layout and lightbox.
388 lines (387 loc) • 38.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, EventEmitter, HostBinding, HostListener, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';
var LightboxMobileComponent = /** @class */ (function () {
function LightboxMobileComponent(elementRef, ref) {
this.elementRef = elementRef;
this.ref = ref;
this.currImage = {
show: false,
loaded: false,
index: 0
};
this.prevImage = {
loaded: false
};
this.nextImage = {
loaded: false
};
this.close = new EventEmitter();
this.lightboxShown = false;
}
Object.defineProperty(LightboxMobileComponent.prototype, "images", {
get: /**
* @return {?}
*/
function () {
return this.data.images;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "config", {
get: /**
* @return {?}
*/
function () {
return this.data.config;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "index", {
get: /**
* @return {?}
*/
function () {
return this.currImage.index;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "currImagePath", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var image = this.images[this.index];
if (!image) {
return false;
}
if (image.path) {
image.full = image.path;
}
return image;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "prevImagePath", {
get: /**
* @return {?}
*/
function () {
if (this.prevIndex < 0 && this.config.loop) {
this.prevIndex = this.latestImageIndex;
}
/** @type {?} */
var image = this.images[this.prevIndex];
if (image && image.path) {
image.full = image.path;
}
return image;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "nextImagePath", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var image = this.images[this.nextIndex];
if (image && image.path) {
image.full = image.path;
}
return image;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "isFirst", {
get: /**
* @return {?}
*/
function () {
if (this.config.loop) {
return false;
}
else {
return this.index === 0;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "isLast", {
get: /**
* @return {?}
*/
function () {
if (this.config.loop) {
return false;
}
else {
return this.index === this.latestImageIndex;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "latestImageIndex", {
get: /**
* @return {?}
*/
function () {
return this.images.length - 1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LightboxMobileComponent.prototype, "isLandscape", {
get: /**
* @return {?}
*/
function () {
return window.innerWidth > window.innerHeight;
},
enumerable: true,
configurable: true
});
/**
* @param {?} event
* @return {?}
*/
LightboxMobileComponent.prototype.onWindowResize = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.landscapeMode = this.isLandscape;
this.ref.detectChanges();
};
/**
* @return {?}
*/
LightboxMobileComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.currImage.index = this.config.index;
this.prevIndex = this.currImage.index - 1;
this.nextIndex = this.currImage.index + 1;
this.showLightbox();
};
/**
* @return {?}
*/
LightboxMobileComponent.prototype.showLightbox = /**
* @return {?}
*/
function () {
var _this = this;
this.currImage.show = true;
setTimeout(function () {
_this.lightboxShown = true;
}, 30);
};
/**
* @return {?}
*/
LightboxMobileComponent.prototype.closeLightbox = /**
* @return {?}
*/
function () {
var _this = this;
this.lightboxShown = false;
setTimeout(function () {
_this.close.emit(true);
}, 200);
};
/**
* @param {?} event
* @return {?}
*/
LightboxMobileComponent.prototype.slide = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (event === 'next') {
if (this.isLast) {
return;
}
else {
setTimeout(function () {
_this.currImage.index++;
}, 200);
}
if (this.index === this.latestImageIndex) {
setTimeout(function () {
_this.currImage.index = 0;
}, 200);
}
setTimeout(function () {
_this.afterSlide('next');
}, 300);
}
if (event === 'prev') {
if (this.isFirst) {
return;
}
else {
setTimeout(function () {
_this.currImage.index--;
}, 200);
}
if (this.index === 0) {
setTimeout(function () {
_this.currImage.index = _this.latestImageIndex;
}, 200);
}
setTimeout(function () {
_this.afterSlide('prev');
}, 300);
}
};
/**
* @param {?} eventType
* @return {?}
*/
LightboxMobileComponent.prototype.afterSlide = /**
* @param {?} eventType
* @return {?}
*/
function (eventType) {
this.currImage.show = true;
if (this.index === this.latestImageIndex && this.config.loop) {
this.nextIndex = 0;
}
else {
this.nextIndex = this.index + 1;
}
if (this.index === 0 && this.config.loop) {
this.prevIndex = this.latestImageIndex;
}
else {
this.prevIndex = this.index - 1;
}
if (eventType === 'prev') {
if (!this.prevImage.loaded) {
this.currImage.loaded = false;
this.prevImage.loaded = false;
}
if (!this.currImage.loaded) {
this.nextImage.loaded = false;
}
}
if (eventType === 'next') {
if (!this.nextImage.loaded) {
this.currImage.loaded = false;
this.nextImage.loaded = false;
}
if (!this.currImage.loaded) {
this.prevImage.loaded = false;
}
}
this.defaultWrapperPosition();
this.ref.detectChanges();
};
/**
* @param {?} elem
* @return {?}
*/
LightboxMobileComponent.prototype.onImageLoaded = /**
* @param {?} elem
* @return {?}
*/
function (elem) {
this[elem].loaded = true;
this.ref.detectChanges();
};
/**
* @param {?} $event
* @return {?}
*/
LightboxMobileComponent.prototype.handlePinchEvents = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if ($event === 'prev') {
this.slide('prev');
}
if ($event === 'next') {
this.slide('next');
}
};
/**
* @return {?}
*/
LightboxMobileComponent.prototype.defaultWrapperPosition = /**
* @return {?}
*/
function () {
/** @type {?} */
var elem = this.wrapperEl.nativeElement;
elem.style.transition = 'all 0ms';
elem.style.transform = 'matrix(1, 0, 0, 1, 0, 0)';
elem.style.webkitTransform = 'matrix(1, 0, 0, 1, 0, 0)';
};
LightboxMobileComponent.decorators = [
{ type: Component, args: [{
selector: 'crystal-lightbox-mobile',
template: "<div class=\"cg-back\" (click)=\"closeLightbox()\"></div>\n\n<div \n\tclass=\"cg-wrapper\" \n\t[class.cg-landscape]=\"landscapeMode\"\n\tpinch [isLast]=\"isLast\" [isFirst]=\"isFirst\" (events)=\"handlePinchEvents($event)\"\n\t#wrapper>\n\t<div class=\"cg-image-wrap cg-prev-image\">\n\t\t<img \n\t\t\t*ngIf=\"prevImagePath\"\n\t\t\t[src]=\"prevImagePath.full\" \n\t\t\t[class.cg-hide]=\"!prevImage.loaded\"\n\t\t\t(load)=\"onImageLoaded('prevImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!prevImage.loaded && prevImagePath\"></div>\n\t</div>\n\n\t<div class=\"cg-image-wrap cg-curr-image\" *ngIf=\"currImage.show\">\n\t\t<img \n\t\t\t[src]=\"currImagePath?.full\" \n\t\t\t[class.cg-hide]=\"!currImage.loaded\" \n\t\t\t(load)=\"onImageLoaded('currImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!currImage.loaded\"></div>\n\t</div>\n\t\n\t<div class=\"cg-image-wrap cg-next-image\">\n\t\t<img \n\t\t\t*ngIf=\"nextImagePath\"\n\t\t\t[src]=\"nextImagePath.full\" \n\t\t\t[class.cg-hide]=\"!nextImage.loaded\" \n\t\t\t(load)=\"onImageLoaded('nextImage')\"\n\t\t/>\n\t\t<div class=\"cg-spinner\" *ngIf=\"!nextImage.loaded && nextImagePath\"></div>\n\t</div>\n</div>",
styles: ["._cg-spinner,._cg-spinner:after{border-radius:50%;width:36px;height:36px}._cg-spinner{margin:0 auto;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:.9s linear infinite load8;animation:.9s linear infinite load8}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cg-spinner,.cg-spinner:after,.cg-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite load7;animation:1.5s ease-in-out infinite load7}.cg-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.cg-spinner:after,.cg-spinner:before{content:\"\";position:absolute;top:0}.cg-spinner:before{left:-3em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.cg-spinner:after{left:3em}@-webkit-keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host(.cg-show){opacity:1}:host(.cg-hide-controls) .cg-close,:host(.cg-hide-controls) .cg-next,:host(.cg-hide-controls) .cg-prev{opacity:0}:host{opacity:0;position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .2s cubic-bezier(.645,.045,.355,1);z-index:10000;background-color:#000}:host .cg-back{background:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22UTF-8%22%3F%3E%3Csvg width%3D%2210px%22 height%3D%2216px%22 viewBox%3D%220 0 10 16%22 version%3D%221.1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E %3C!-- Generator%3A sketchtool 40.2 (33826) - http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch --%3E %3Ctitle%3E11A73872-5EBF-46F6-B7C5-142D47A33339%3C%2Ftitle%3E %3Cdesc%3ECreated with sketchtool.%3C%2Fdesc%3E %3Cdefs%3E%3C%2Fdefs%3E %3Cg id%3D%22Interface-1280-x-800%22 stroke%3D%22none%22 stroke-width%3D%221%22 fill%3D%22none%22 fill-rule%3D%22evenodd%22%3E %3Cg id%3D%22Lot_viewpage_open%22 transform%3D%22translate(-111.000000%2C -296.000000)%22 fill%3D%22%23FFFFFF%22%3E %3Cg id%3D%22arrows-16px-1_minimal-left%22 transform%3D%22translate(111.000000%2C 296.000000)%22%3E %3Cpolygon id%3D%22Shape%22 points%3D%228.1 15.7 0.4 8 8.1 0.3 9.6 1.7 3.3 8 9.6 14.3%22%3E%3C%2Fpolygon%3E %3C%2Fg%3E %3C%2Fg%3E %3C%2Fg%3E%3C%2Fsvg%3E\") center/12px no-repeat;width:40px;height:40px;opacity:.9;position:fixed;top:0;left:0;z-index:1000}:host .cg-wrapper.cg-landscape .cg-image-wrap img{height:100%}:host .cg-wrapper{transition:none;width:100%;height:100%;display:block}:host .cg-wrapper .cg-image-wrap.cg-prev-image{-webkit-transform:translate3d(calc(-100% - 8px),0,0);transform:translate3d(calc(-100% - 8px),0,0)}:host .cg-wrapper .cg-image-wrap.cg-next-image{-webkit-transform:translate3d(calc(100% + 8px),0,0);transform:translate3d(calc(100% + 8px),0,0)}:host .cg-wrapper .cg-image-wrap{width:100%;height:100%;text-align:center;position:absolute;display:flex;align-items:center;justify-content:center}:host .cg-wrapper .cg-image-wrap img{max-width:100%;max-height:100%;width:auto;height:auto;position:relative}:host .cg-wrapper .cg-image-wrap img.cg-hide{display:none}"]
},] },
];
/** @nocollapse */
LightboxMobileComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ChangeDetectorRef }
]; };
LightboxMobileComponent.propDecorators = {
data: [{ type: Input }],
wrapperEl: [{ type: ViewChild, args: ['wrapper',] }],
lightboxShown: [{ type: HostBinding, args: ['class.cg-show',] }],
onWindowResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
};
return LightboxMobileComponent;
}());
export { LightboxMobileComponent };
if (false) {
/** @type {?} */
LightboxMobileComponent.prototype._index;
/** @type {?} */
LightboxMobileComponent.prototype.prevIndex;
/** @type {?} */
LightboxMobileComponent.prototype.nextIndex;
/** @type {?} */
LightboxMobileComponent.prototype.currImage;
/** @type {?} */
LightboxMobileComponent.prototype.prevImage;
/** @type {?} */
LightboxMobileComponent.prototype.nextImage;
/** @type {?} */
LightboxMobileComponent.prototype.wrapperProp;
/** @type {?} */
LightboxMobileComponent.prototype.landscapeMode;
/** @type {?} */
LightboxMobileComponent.prototype.close;
/** @type {?} */
LightboxMobileComponent.prototype.data;
/** @type {?} */
LightboxMobileComponent.prototype.wrapperEl;
/** @type {?} */
LightboxMobileComponent.prototype.lightboxShown;
/** @type {?} */
LightboxMobileComponent.prototype.elementRef;
/** @type {?} */
LightboxMobileComponent.prototype.ref;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtbW9iaWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvIiwic291cmNlcyI6WyJsaWIvbGlnaHRib3gtbW9iaWxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFVLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7SUFzSnhJLGlDQUFvQixVQUFzQixFQUFVLEdBQXNCO1FBQXRELGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjt5QkF2RzlEO1lBQ1IsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsS0FBSztZQUNiLEtBQUssRUFBRSxDQUFDO1NBQ1g7eUJBRVc7WUFDUixNQUFNLEVBQUUsS0FBSztTQUNoQjt5QkFFVztZQUNSLE1BQU0sRUFBRSxLQUFLO1NBQ2hCO3FCQUtJLElBQUksWUFBWSxFQUFFOzZCQThFZ0MsS0FBSztLQVMzRDtJQWpGRCxzQkFBSSwyQ0FBTTs7OztRQUFWO1lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzNCOzs7T0FBQTtJQUVELHNCQUFJLDJDQUFNOzs7O1FBQVY7WUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDM0I7OztPQUFBO0lBRUQsc0JBQUksMENBQUs7Ozs7UUFBVDtZQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUMvQjs7O09BQUE7SUFFRCxzQkFBSSxrREFBYTs7OztRQUFqQjs7WUFDSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVwQyxFQUFFLENBQUMsQ0FB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QUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztLQUM1Qjs7Ozs7SUFFRCxtREFBaUI7Ozs7SUFBakIsVUFBa0IsTUFBTTtRQUNwQixFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUEsQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFBLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QjtLQUNKOzs7O0lBRUQsd0RBQXNCOzs7SUFBdEI7O1FBQ0ksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLDBCQUEwQixDQUFDO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLDBCQUEwQixDQUFDO0tBQzNEOztnQkFyUkosU0FBUyxTQUFDO29CQUNWLFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFFBQVEsRUFBRSwrcENBbUNKO29CQUNILE1BQU0sRUFBRSxDQUFDLDJ0SEFBdXRILENBQUM7aUJBQ3B1SDs7OztnQkF6Q3NGLFVBQVU7Z0JBQUUsaUJBQWlCOzs7dUJBa0UvRyxLQUFLOzRCQUVMLFNBQVMsU0FBQyxTQUFTO2dDQTBFbkIsV0FBVyxTQUFDLGVBQWU7aUNBRTNCLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7O2tDQWhKN0M7O1NBMENhLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2NyeXN0YWwtbGlnaHRib3gtbW9iaWxlJyxcblx0dGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY2ctYmFja1wiIChjbGljayk9XCJjbG9zZUxpZ2h0Ym94KClcIj48L2Rpdj5cblxuPGRpdiBcblx0Y2xhc3M9XCJjZy13cmFwcGVyXCIgXG5cdFtjbGFzcy5jZy1sYW5kc2NhcGVdPVwibGFuZHNjYXBlTW9kZVwiXG5cdHBpbmNoIFtpc0xhc3RdPVwiaXNMYXN0XCIgW2lzRmlyc3RdPVwiaXNGaXJzdFwiIChldmVudHMpPVwiaGFuZGxlUGluY2hFdmVudHMoJGV2ZW50KVwiXG5cdCN3cmFwcGVyPlxuXHQ8ZGl2IGNsYXNzPVwiY2ctaW1hZ2Utd3JhcCBjZy1wcmV2LWltYWdlXCI+XG5cdFx0PGltZyBcblx0XHRcdCpuZ0lmPVwicHJldkltYWdlUGF0aFwiXG5cdFx0XHRbc3JjXT1cInByZXZJbWFnZVBhdGguZnVsbFwiIFxuXHRcdFx0W2NsYXNzLmNnLWhpZGVdPVwiIXByZXZJbWFnZS5sb2FkZWRcIlxuXHRcdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgncHJldkltYWdlJylcIlxuXHRcdC8+XG5cdFx0PGRpdiBjbGFzcz1cImNnLXNwaW5uZXJcIiAqbmdJZj1cIiFwcmV2SW1hZ2UubG9hZGVkICYmIHByZXZJbWFnZVBhdGhcIj48L2Rpdj5cblx0PC9kaXY+XG5cblx0PGRpdiBjbGFzcz1cImNnLWltYWdlLXdyYXAgY2ctY3Vyci1pbWFnZVwiICpuZ0lmPVwiY3VyckltYWdlLnNob3dcIj5cblx0XHQ8aW1nIFxuXHRcdFx0W3NyY109XCJjdXJySW1hZ2VQYXRoPy5mdWxsXCIgXG5cdFx0XHRbY2xhc3MuY2ctaGlkZV09XCIhY3VyckltYWdlLmxvYWRlZFwiIFxuXHRcdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgnY3VyckltYWdlJylcIlxuXHRcdC8+XG5cdFx0PGRpdiBjbGFzcz1cImNnLXNwaW5uZXJcIiAqbmdJZj1cIiFjdXJySW1hZ2UubG9hZGVkXCI+PC9kaXY+XG5cdDwvZGl2PlxuXHRcblx0PGRpdiBjbGFzcz1cImNnLWltYWdlLXdyYXAgY2ctbmV4dC1pbWFnZVwiPlxuXHRcdDxpbWcgXG5cdFx0XHQqbmdJZj1cIm5leHRJbWFnZVBhdGhcIlxuXHRcdFx0W3NyY109XCJuZXh0SW1hZ2VQYXRoLmZ1bGxcIiBcblx0XHRcdFtjbGFzcy5jZy1oaWRlXT1cIiFuZXh0SW1hZ2UubG9hZGVkXCIgXG5cdFx0XHQobG9hZCk9XCJvbkltYWdlTG9hZGVkKCduZXh0SW1hZ2UnKVwiXG5cdFx0Lz5cblx0XHQ8ZGl2IGNsYXNzPVwiY2ctc3Bpbm5lclwiICpuZ0lmPVwiIW5leHRJbWFnZS5sb2FkZWQgJiYgbmV4dEltYWdlUGF0aFwiPjwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PmAsXG4gICAgc3R5bGVzOiBbYC5fY2ctc3Bpbm5lciwuX2NnLXNwaW5uZXI6YWZ0ZXJ7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6MzZweDtoZWlnaHQ6MzZweH0uX2NnLXNwaW5uZXJ7bWFyZ2luOjAgYXV0bztmb250LXNpemU6MTBweDtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWluZGVudDotOTk5OWVtO2JvcmRlci10b3A6NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1yaWdodDo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLWJvdHRvbTo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICNmZmY7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWFuaW1hdGlvbjouOXMgbGluZWFyIGluZmluaXRlIGxvYWQ4O2FuaW1hdGlvbjouOXMgbGluZWFyIGluZmluaXRlIGxvYWQ4fUAtd2Via2l0LWtleWZyYW1lcyBsb2FkOHswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBsb2FkOHswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LmNnLXNwaW5uZXIsLmNnLXNwaW5uZXI6YWZ0ZXIsLmNnLXNwaW5uZXI6YmVmb3Jle2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7LXdlYmtpdC1hbmltYXRpb246MS41cyBlYXNlLWluLW91dCBpbmZpbml0ZSBsb2FkNzthbmltYXRpb246MS41cyBlYXNlLWluLW91dCBpbmZpbml0ZSBsb2FkN30uY2ctc3Bpbm5lcntjb2xvcjojZmZmO2ZvbnQtc2l6ZToxMHB4O21hcmdpbjowIGF1dG8gMjBweDtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWluZGVudDotOTk5OWVtOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LS4xNnM7YW5pbWF0aW9uLWRlbGF5Oi0uMTZzfS5jZy1zcGlubmVyOmFmdGVyLC5jZy1zcGlubmVyOmJlZm9yZXtjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9LmNnLXNwaW5uZXI6YmVmb3Jle2xlZnQ6LTNlbTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTotLjMyczthbmltYXRpb24tZGVsYXk6LS4zMnN9LmNnLXNwaW5uZXI6YWZ0ZXJ7bGVmdDozZW19QC13ZWJraXQta2V5ZnJhbWVzIGxvYWQ3ezAlLDEwMCUsODAle2JveC1zaGFkb3c6MCAyLjVlbSAwIC0xLjNlbX00MCV7Ym94LXNoYWRvdzowIDIuNWVtIDAgMH19QGtleWZyYW1lcyBsb2FkN3swJSwxMDAlLDgwJXtib3gtc2hhZG93OjAgMTBweCAwIC0xLjNlbX00MCV7Ym94LXNoYWRvdzowIDEwcHggMCAwfX06aG9zdCguY2ctc2hvdyl7b3BhY2l0eToxfTpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctY2xvc2UsOmhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1uZXh0LDpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctcHJldntvcGFjaXR5OjB9Omhvc3R7b3BhY2l0eTowO3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2NvbG9yOiNmZmY7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgY3ViaWMtYmV6aWVyKC42NDUsLjA0NSwuMzU1LDEpO3otaW5kZXg6MTAwMDA7YmFja2dyb3VuZC1jb2xvcjojMDAwfTpob3N0IC5jZy1iYWNre2JhY2tncm91bmQ6dXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uJTNEJTIyMS4wJTIyIGVuY29kaW5nJTNEJTIyVVRGLTglMjIlM0YlM0UlM0Nzdmcgd2lkdGglM0QlMjIxMHB4JTIyIGhlaWdodCUzRCUyMjE2cHglMjIgdmlld0JveCUzRCUyMjAgMCAxMCAxNiUyMiB2ZXJzaW9uJTNEJTIyMS4xJTIyIHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyIHhtbG5zJTNBeGxpbmslM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4bGluayUyMiUzRSAgICAlM0MhLS0gR2VuZXJhdG9yJTNBIHNrZXRjaHRvb2wgNDAuMiAoMzM4MjYpIC0gaHR0cCUzQSUyRiUyRnd3dy5ib2hlbWlhbmNvZGluZy5jb20lMkZza2V0Y2ggLS0lM0UgICAgJTNDdGl0bGUlM0UxMUE3Mzg3Mi01RUJGLTQ2RjYtQjdDNS0xNDJENDdBMzMzMzklM0MlMkZ0aXRsZSUzRSAgICAlM0NkZXNjJTNFQ3JlYXRlZCB3aXRoIHNrZXRjaHRvb2wuJTNDJTJGZGVzYyUzRSAgICAlM0NkZWZzJTNFJTNDJTJGZGVmcyUzRSAgICAlM0NnIGlkJTNEJTIySW50ZXJmYWNlLTEyODAteC04MDAlMjIgc3Ryb2tlJTNEJTIybm9uZSUyMiBzdHJva2Utd2lkdGglM0QlMjIxJTIyIGZpbGwlM0QlMjJub25lJTIyIGZpbGwtcnVsZSUzRCUyMmV2ZW5vZGQlMjIlM0UgICAgICAgICUzQ2cgaWQlM0QlMjJMb3Rfdmlld3BhZ2Vfb3BlbiUyMiB0cmFuc2Zvcm0lM0QlMjJ0cmFuc2xhdGUoLTExMS4wMDAwMDAlMkMgLTI5Ni4wMDAwMDApJTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIlM0UgICAgICAgICAgICAlM0NnIGlkJTNEJTIyYXJyb3dzLTE2cHgtMV9taW5pbWFsLWxlZnQlMjIgdHJhbnNmb3JtJTNEJTIydHJhbnNsYXRlKDExMS4wMDAwMDAlMkMgMjk2LjAwMDAwMCklMjIlM0UgICAgICAgICAgICAgICAgJTNDcG9seWdvbiBpZCUzRCUyMlNoYXBlJTIyIHBvaW50cyUzRCUyMjguMSAxNS43IDAuNCA4IDguMSAwLjMgOS42IDEuNyAzLjMgOCA5LjYgMTQuMyUyMiUzRSUzQyUyRnBvbHlnb24lM0UgICAgICAgICAgICAlM0MlMkZnJTNFICAgICAgICAlM0MlMkZnJTNFICAgICUzQyUyRmclM0UlM0MlMkZzdmclM0VcIikgY2VudGVyLzEycHggbm8tcmVwZWF0O3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7b3BhY2l0eTouOTtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7ei1pbmRleDoxMDAwfTpob3N0IC5jZy13cmFwcGVyLmNnLWxhbmRzY2FwZSAuY2ctaW1hZ2Utd3JhcCBpbWd7aGVpZ2h0OjEwMCV9Omhvc3QgLmNnLXdyYXBwZXJ7dHJhbnNpdGlvbjpub25lO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTpibG9ja306aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcC5jZy1wcmV2LWltYWdley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKGNhbGMoLTEwMCUgLSA4cHgpLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKGNhbGMoLTEwMCUgLSA4cHgpLDAsMCl9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAuY2ctbmV4dC1pbWFnZXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKDEwMCUgKyA4cHgpLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKGNhbGMoMTAwJSArIDhweCksMCwwKX06aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn06aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcCBpbWd7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87cG9zaXRpb246cmVsYXRpdmV9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAgaW1nLmNnLWhpZGV7ZGlzcGxheTpub25lfWBdXG59KVxuZXhwb3J0IGNsYXNzIExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50IHsgXG5cdF9pbmRleDogYW55O1xuICAgIHByZXZJbmRleDogYW55O1xuICAgIG5leHRJbmRleDogYW55O1xuXG4gICAgY3VyckltYWdlID0ge1xuICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgaW5kZXg6IDBcbiAgICB9OyBcblxuICAgIHByZXZJbWFnZSA9IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZVxuICAgIH07IFxuXG4gICAgbmV4dEltYWdlID0ge1xuICAgICAgICBsb2FkZWQ6IGZhbHNlXG4gICAgfTsgXG5cbiAgICB3cmFwcGVyUHJvcDogYW55O1xuICAgIGxhbmRzY2FwZU1vZGU6IGFueTtcblxuXHRjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcblxuICAgIEBWaWV3Q2hpbGQoJ3dyYXBwZXInKSB3cmFwcGVyRWw6IEVsZW1lbnRSZWY7XG5cbiAgICBnZXQgaW1hZ2VzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaW1hZ2VzO1xuICAgIH1cblxuICAgIGdldCBjb25maWcoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb25maWc7XG4gICAgfVxuXG4gICAgZ2V0IGluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJJbWFnZS5pbmRleDtcbiAgICB9XG5cbiAgICBnZXQgY3VyckltYWdlUGF0aCgpe1xuICAgICAgICBsZXQgaW1hZ2UgPSB0aGlzLmltYWdlc1t0aGlzLmluZGV4XTtcblxuICAgICAgICBpZiAoIWltYWdlKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZJbWFnZVBhdGgoKXtcbiAgICAgICAgaWYgKHRoaXMucHJldkluZGV4IDwgMCAmJiB0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHRoaXMucHJldkluZGV4ID0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5wcmV2SW5kZXhdO1xuXG4gICAgICAgIGlmIChpbWFnZSAmJiBpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG5cbiAgICBnZXQgbmV4dEltYWdlUGF0aCgpe1xuICAgICAgICBsZXQgaW1hZ2UgPSB0aGlzLmltYWdlc1t0aGlzLm5leHRJbmRleF07XG5cbiAgICAgICAgaWYgKGltYWdlICYmIGltYWdlLnBhdGgpe1xuICAgICAgICAgICAgaW1hZ2UuZnVsbCA9IGltYWdlLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cblxuICAgIGdldCBpc0ZpcnN0KCl7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICBcdCAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpc0xhc3QoKXtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgfSAgICAgICAgXG4gICAgfVxuXG4gICAgZ2V0IGxhdGVzdEltYWdlSW5kZXgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGFuZHNjYXBlKCl7XG4gICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA+IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNnLXNob3cnKSBsaWdodGJveFNob3duOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgICBvbldpbmRvd1Jlc2l6ZShldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMubGFuZHNjYXBlTW9kZSA9IHRoaXMuaXNMYW5kc2NhcGU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZil7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXggPSB0aGlzLmNvbmZpZy5pbmRleDtcbiAgICAgICAgdGhpcy5wcmV2SW5kZXggPSB0aGlzLmN1cnJJbWFnZS5pbmRleC0xO1xuICAgICAgICB0aGlzLm5leHRJbmRleCA9IHRoaXMuY3VyckltYWdlLmluZGV4KzE7XG5cbiAgICAgICAgdGhpcy5zaG93TGlnaHRib3goKTtcbiAgICB9XG5cbiAgICBzaG93TGlnaHRib3goKXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2Uuc2hvdyA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmxpZ2h0Ym94U2hvd24gPSB0cnVlO1xuICAgICAgICB9LCAzMCk7XG4gICAgfVxuXG5cdGNsb3NlTGlnaHRib3goKXtcblx0XHR0aGlzLmxpZ2h0Ym94U2hvd24gPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0cnVlKTtcbiAgICAgICAgfSwgMjAwKTsgXG5cdH1cblxuICAgIHNsaWRlKGV2ZW50OiBhbnkpe1xuICAgICAgICBpZiAoZXZlbnQgPT09ICduZXh0Jyl7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGFzdCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXgrKztcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHRoaXMubGF0ZXN0SW1hZ2VJbmRleCl7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlKCduZXh0Jyk7XG4gICAgICAgICAgICB9LCAzMDApOyBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCA9PT0gJ3ByZXYnKXtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNGaXJzdCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXgtLTtcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IDApe1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5pbmRleCA9IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlKCdwcmV2Jyk7XG4gICAgICAgICAgICB9LCAzMDApOyBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFmdGVyU2xpZGUoZXZlbnRUeXBlOiBhbnkpe1xuICAgICAgICB0aGlzLmN1cnJJbWFnZS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSB0aGlzLmxhdGVzdEltYWdlSW5kZXggJiYgdGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICB0aGlzLm5leHRJbmRleCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJbmRleCA9IHRoaXMuaW5kZXgrMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAwICYmIHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgdGhpcy5wcmV2SW5kZXggPSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXZJbmRleCA9IHRoaXMuaW5kZXgtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudFR5cGUgPT09ICdwcmV2Jyl7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5wcmV2SW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJySW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudFR5cGUgPT09ICduZXh0Jyl7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5uZXh0SW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJySW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVmYXVsdFdyYXBwZXJQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgb25JbWFnZUxvYWRlZChlbGVtOiBhbnkpe1xuICAgICAgICB0aGlzW2VsZW1dLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVQaW5jaEV2ZW50cygkZXZlbnQpe1xuICAgICAgICBpZiAoJGV2ZW50ID09PSAncHJldicpe1xuICAgICAgICAgICAgdGhpcy5zbGlkZSgncHJldicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkZXZlbnQgPT09ICduZXh0Jyl7XG4gICAgICAgICAgICB0aGlzLnNsaWRlKCduZXh0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWZhdWx0V3JhcHBlclBvc2l0aW9uKCl7XG4gICAgICAgIGxldCBlbGVtID0gdGhpcy53cmFwcGVyRWwubmF0aXZlRWxlbWVudDtcbiAgICAgICAgZWxlbS5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAwbXMnO1xuICAgICAgICBlbGVtLnN0eWxlLnRyYW5zZm9ybSA9ICdtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCknO1xuICAgICAgICBlbGVtLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICdtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCknO1xuICAgIH1cbn0iXX0=