@scicom-esolutions/ng-image-viewer
Version:
[](https://www.npmjs.com/package/@haseeamarathunga/ng-image-viewer) [](https://www.npmjs.com/pac
414 lines • 34.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/ng-image-viewer.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, EventEmitter, HostListener, Inject, Input, Optional, Output } from '@angular/core';
import { CustomImageEvent } from './model/custom-image-event-model';
/** @type {?} */
var DEFAULT_CONFIG = {
btnClass: 'default',
zoomFactor: 0.1,
containerBackgroundColor: '#ccc',
wheelZoom: true,
allowFullscreen: true,
allowKeyboardNavigation: true,
btnShow: {
zoomIn: true,
zoomOut: true,
rotateClockwise: true,
rotateCounterClockwise: true,
},
btnIcons: {
zoomIn: 'fa fa-plus',
zoomOut: 'fa fa-minus',
rotateClockwise: 'fa fa-repeat',
rotateCounterClockwise: 'fa fa-undo',
fullscreen: 'fa fa-refresh',
}
};
var NgImageViewerComponent = /** @class */ (function () {
function NgImageViewerComponent(moduleConfig) {
this.moduleConfig = moduleConfig;
this.index = 0;
this.indexChange = new EventEmitter();
this.configChange = new EventEmitter();
this.customImageEvent = new EventEmitter();
this.style = { transform: '', msTransform: '', oTransform: '', webkitTransform: '', cursor: 'pointer' };
this.fullscreen = false;
this.loading = true;
this.scale = 1;
this.rotation = 0;
this.translateX = 0;
this.translateY = 0;
this.hovered = false;
}
/**
* @return {?}
*/
NgImageViewerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var merged = this.mergeConfig(DEFAULT_CONFIG, this.moduleConfig);
this.config = this.mergeConfig(merged, this.config);
this.triggerConfigBinding();
};
/**
* @param {?} event
* @return {?}
*/
NgImageViewerComponent.prototype.nextImage = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.canNavigate(event) && this.index < this.src.length - 1) {
this.loading = true;
this.index++;
this.triggerIndexBinding();
this.reset();
}
};
/**
* @param {?} event
* @return {?}
*/
NgImageViewerComponent.prototype.prevImage = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.canNavigate(event) && this.index > 0) {
this.loading = true;
this.index--;
this.triggerIndexBinding();
this.reset();
}
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.zoomIn = /**
* @return {?}
*/
function () {
this.scale *= (1 + this.config.zoomFactor);
this.updateStyle();
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.zoomOut = /**
* @return {?}
*/
function () {
if (this.scale > this.config.zoomFactor) {
this.scale /= (1 + this.config.zoomFactor);
}
this.updateStyle();
};
/**
* @param {?} evt
* @return {?}
*/
NgImageViewerComponent.prototype.scrollZoom = /**
* @param {?} evt
* @return {?}
*/
function (evt) {
if (this.config.wheelZoom) {
evt.deltaY > 0 ? this.zoomOut() : this.zoomIn();
return false;
}
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.rotateClockwise = /**
* @return {?}
*/
function () {
this.rotation += 90;
this.updateStyle();
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.rotateCounterClockwise = /**
* @return {?}
*/
function () {
this.rotation -= 90;
this.updateStyle();
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.onLoad = /**
* @return {?}
*/
function () {
this.loading = false;
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.onLoadStart = /**
* @return {?}
*/
function () {
this.loading = true;
};
/**
* @param {?} evt
* @return {?}
*/
NgImageViewerComponent.prototype.onDragOver = /**
* @param {?} evt
* @return {?}
*/
function (evt) {
this.translateX += (evt.clientX - this.prevX);
this.translateY += (evt.clientY - this.prevY);
this.prevX = evt.clientX;
this.prevY = evt.clientY;
this.updateStyle();
};
/**
* @param {?} evt
* @return {?}
*/
NgImageViewerComponent.prototype.onDragStart = /**
* @param {?} evt
* @return {?}
*/
function (evt) {
this.prevX = evt.clientX;
this.prevY = evt.clientY;
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.toggleFullscreen = /**
* @return {?}
*/
function () {
// this.fullscreen = !this.fullscreen;
// if (!this.fullscreen) {
// this.reset();
// }
this.translateX = 0;
this.translateY = 0;
this.scale = 1;
this.rotation = 0;
this.translateX = 0;
this.translateY = 0;
this.zoomIn();
this.zoomOut();
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.triggerIndexBinding = /**
* @return {?}
*/
function () {
this.indexChange.emit(this.index);
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.triggerConfigBinding = /**
* @return {?}
*/
function () {
this.configChange.next(this.config);
};
/**
* @param {?} name
* @param {?} imageIndex
* @return {?}
*/
NgImageViewerComponent.prototype.fireCustomEvent = /**
* @param {?} name
* @param {?} imageIndex
* @return {?}
*/
function (name, imageIndex) {
this.customImageEvent.emit(new CustomImageEvent(name, imageIndex));
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.scale = 1;
this.rotation = 0;
this.translateX = 0;
this.translateY = 0;
this.updateStyle();
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.onMouseOver = /**
* @return {?}
*/
function () {
this.hovered = true;
};
/**
* @return {?}
*/
NgImageViewerComponent.prototype.onMouseLeave = /**
* @return {?}
*/
function () {
this.hovered = false;
};
/**
* @private
* @param {?} event
* @return {?}
*/
NgImageViewerComponent.prototype.canNavigate = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
return event == null || (this.config.allowKeyboardNavigation && this.hovered);
};
/**
* @private
* @return {?}
*/
NgImageViewerComponent.prototype.updateStyle = /**
* @private
* @return {?}
*/
function () {
this.style.transform = "translate(" + this.translateX + "px, " + this.translateY + "px) rotate(" + this.rotation + "deg) scale(" + this.scale + ")";
this.style.msTransform = this.style.transform;
this.style.webkitTransform = this.style.transform;
this.style.oTransform = this.style.transform;
};
/**
* @private
* @param {?} defaultValues
* @param {?} overrideValues
* @return {?}
*/
NgImageViewerComponent.prototype.mergeConfig = /**
* @private
* @param {?} defaultValues
* @param {?} overrideValues
* @return {?}
*/
function (defaultValues, overrideValues) {
/** @type {?} */
var result = tslib_1.__assign({}, defaultValues);
if (overrideValues) {
result = tslib_1.__assign({}, defaultValues, overrideValues);
if (overrideValues.btnIcons) {
result.btnIcons = tslib_1.__assign({}, defaultValues.btnIcons, overrideValues.btnIcons);
}
}
return result;
};
NgImageViewerComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'ng-image-viewer',
template: "\n <div class=\"img-container\" [style.backgroundColor]=\"config.containerBackgroundColor\"\n (wheel)=\"scrollZoom($event)\" (dragover)=\"onDragOver($event)\">\n <div [ngStyle]=\"{width: width+'px',height: height+'px'}\">\n <img [src]=\"src[index]\" [ngStyle]=\"style\" alt=\"Image not found...\" (dragstart)=\"onDragStart($event)\"\n (load)=\"onLoad()\" (loadstart)=\"onLoadStart()\" />\n <!-- Div below will be used to hide the 'ghost' image when dragging -->\n </div>\n <div></div>\n <div class=\"spinner-container\" *ngIf=\"loading\">\n <div class=\"spinner\"></div>\n </div>\n\n <button type=\"button\" [class]=\"config.btnClass\" *ngIf=\"config.btnShow.rotateCounterClockwise\"\n (click)=\"rotateCounterClockwise()\">\n <span [class]=\"config.btnIcons.rotateCounterClockwise\"></span>\n </button>\n <button type=\"button\" [class]=\"config.btnClass\" *ngIf=\"config.btnShow.rotateClockwise\" (click)=\"rotateClockwise()\">\n <span [class]=\"config.btnIcons.rotateClockwise\"></span>\n </button>\n\n <button type=\"button\" [class]=\"config.btnClass\" *ngIf=\"config.btnShow.zoomOut\" (click)=\"zoomOut()\">\n <span [class]=\"config.btnIcons.zoomOut\"></span>\n </button>\n <button type=\"button\" [class]=\"config.btnClass\" *ngIf=\"config.btnShow.zoomIn\" (click)=\"zoomIn()\">\n <span [class]=\"config.btnIcons.zoomIn\"></span>\n </button>\n\n <!-- <button type=\"button\" [class]=\"config.btnClass\" *ngFor=\"let cBtn of config.customBtns\"-->\n <!-- (click)=\"fireCustomEvent(cBtn.name, index)\">-->\n <!-- <span [class]=\"cBtn.icon\"></span>-->\n <!-- </button>-->\n\n <button type=\"button\" [class]=\"config.btnClass\" (click)=\"toggleFullscreen()\"\n *ngIf=\"config.allowFullscreen\">\n <span [class]=\"config.btnIcons.fullscreen\"></span>\n </button>\n\n <!-- <div class=\"nav-button-container\" *ngIf=\"src.length > 1\">-->\n <!-- <button type=\"button\" [class]=\"config.btnClass\" (click)=\"prevImage($event)\" [disabled]=\"index === 0\">-->\n <!-- <span [class]=\"config.btnIcons.prev\"></span>-->\n <!-- </button>-->\n <!-- <button type=\"button\" [class]=\"config.btnClass\" (click)=\"nextImage($event)\" [disabled]=\"index === src.length - 1\">-->\n <!-- <span [class]=\"config.btnIcons.next\"></span>-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n ",
styles: [".img-container{height:100%;width:100%;overflow:hidden;position:relative}.img-container img{z-index:2;margin:0 auto;display:block;max-width:100%;max-height:100%;width:100%}.img-container button{z-index:99;position:absolute;right:15px}.img-container button:not(:disabled){cursor:pointer}.img-container>button:nth-of-type(1):not(#ngx-fs-btn){bottom:15px}.img-container>button:nth-of-type(2):not(#ngx-fs-btn){bottom:65px}.img-container>button:nth-of-type(3):not(#ngx-fs-btn){bottom:115px}.img-container>button:nth-of-type(4):not(#ngx-fs-btn){bottom:165px}.img-container>button:nth-of-type(5):not(#ngx-fs-btn){bottom:215px}.img-container>button:nth-of-type(6):not(#ngx-fs-btn){bottom:265px}.img-container>button:nth-of-type(7):not(#ngx-fs-btn){bottom:315px}#ngx-fs-btn{top:15px}button.default{height:40px;width:40px;border:1px solid #555;border-radius:50%;background-color:#fff;opacity:.7;transition:opacity .2s}button.default:hover{opacity:1}button.default:disabled{opacity:.25}.nav-button-container>button{position:relative;right:0;margin:0 10px}.nav-button-container{text-align:center;position:absolute;z-index:98;bottom:10px;left:0;right:0}.spinner-container{position:absolute;left:0;right:0;top:0;bottom:0;width:60px;height:60px;margin:auto;padding:10px;background-color:rgba(0,0,0,.4);border-radius:25%}.spinner{border-width:7px;border-style:solid;border-color:#ccc #ccc #222;border-radius:50%;height:100%;width:100%;box-sizing:border-box;-webkit-animation:2s linear infinite rotation;animation:2s linear infinite rotation}@keyframes rotation{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(359deg)}}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(359deg)}}"]
}] }
];
/** @nocollapse */
NgImageViewerComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: ['config',] }] }
]; };
NgImageViewerComponent.propDecorators = {
src: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
index: [{ type: Input }],
config: [{ type: Input }],
indexChange: [{ type: Output }],
configChange: [{ type: Output }],
customImageEvent: [{ type: Output }],
nextImage: [{ type: HostListener, args: ['window:keyup.ArrowRight', ['$event'],] }],
prevImage: [{ type: HostListener, args: ['window:keyup.ArrowLeft', ['$event'],] }],
onMouseOver: [{ type: HostListener, args: ['mouseover',] }],
onMouseLeave: [{ type: HostListener, args: ['mouseleave',] }]
};
return NgImageViewerComponent;
}());
export { NgImageViewerComponent };
if (false) {
/** @type {?} */
NgImageViewerComponent.prototype.src;
/** @type {?} */
NgImageViewerComponent.prototype.width;
/** @type {?} */
NgImageViewerComponent.prototype.height;
/** @type {?} */
NgImageViewerComponent.prototype.index;
/** @type {?} */
NgImageViewerComponent.prototype.config;
/** @type {?} */
NgImageViewerComponent.prototype.indexChange;
/** @type {?} */
NgImageViewerComponent.prototype.configChange;
/** @type {?} */
NgImageViewerComponent.prototype.customImageEvent;
/** @type {?} */
NgImageViewerComponent.prototype.style;
/** @type {?} */
NgImageViewerComponent.prototype.fullscreen;
/** @type {?} */
NgImageViewerComponent.prototype.loading;
/**
* @type {?}
* @private
*/
NgImageViewerComponent.prototype.scale;
/**
* @type {?}
* @private
*/
NgImageViewerComponent.prototype.rotation;
/**
* @type {?}
* @private
*/
NgImageViewerComponent.prototype.translateX;
/**
* @type {?}
* @private
*/
NgImageViewerComponent.prototype.translateY;
/**
* @type {?}
* @private
*/
NgImageViewerComponent.prototype.prevX;
/**
* @type {?}
* @private
*/
NgImageViewerComponent.prototype.prevY;
/**
* @type {?}
* @private
*/
NgImageViewerComponent.prototype.hovered;
/** @type {?} */
NgImageViewerComponent.prototype.moduleConfig;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaW1hZ2Utdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzY2ljb20tZXNvbHV0aW9ucy9uZy1pbWFnZS12aWV3ZXIvIiwic291cmNlcyI6WyJsaWIvbmctaW1hZ2Utdmlld2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTdHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDOztJQUU1RCxjQUFjLEdBQXNCO0lBQ3hDLFFBQVEsRUFBRSxTQUFTO0lBQ25CLFVBQVUsRUFBRSxHQUFHO0lBQ2Ysd0JBQXdCLEVBQUUsTUFBTTtJQUNoQyxTQUFTLEVBQUUsSUFBSTtJQUNmLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLHVCQUF1QixFQUFFLElBQUk7SUFDN0IsT0FBTyxFQUFFO1FBQ1AsTUFBTSxFQUFFLElBQUk7UUFDWixPQUFPLEVBQUUsSUFBSTtRQUNiLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLHNCQUFzQixFQUFFLElBQUk7S0FDN0I7SUFDRCxRQUFRLEVBQUU7UUFDUixNQUFNLEVBQUUsWUFBWTtRQUNwQixPQUFPLEVBQUUsYUFBYTtRQUN0QixlQUFlLEVBQUUsY0FBYztRQUMvQixzQkFBc0IsRUFBRSxZQUFZO1FBQ3BDLFVBQVUsRUFBRSxlQUFlO0tBQzVCO0NBQ0Y7QUFFRDtJQTBGRSxnQ0FBaUQsWUFBK0I7UUFBL0IsaUJBQVksR0FBWixZQUFZLENBQW1CO1FBekJoRixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBTVYsZ0JBQVcsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUd2RCxpQkFBWSxHQUFvQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR25FLHFCQUFnQixHQUFtQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRS9ELFVBQUssR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ25HLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNkLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFHZixZQUFPLEdBQUcsS0FBSyxDQUFDO0lBRTRELENBQUM7Ozs7SUFFckYseUNBQVE7OztJQUFSOztZQUNRLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBR0QsMENBQVM7Ozs7SUFEVCxVQUNVLEtBQUs7UUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Q7SUFDSCxDQUFDOzs7OztJQUdELDBDQUFTOzs7O0lBRFQsVUFDVSxLQUFLO1FBQ2IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNkO0lBQ0gsQ0FBQzs7OztJQUVELHVDQUFNOzs7SUFBTjtRQUNFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7OztJQUVELHdDQUFPOzs7SUFBUDtRQUNFLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUN2QyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFFRCwyQ0FBVTs7OztJQUFWLFVBQVcsR0FBRztRQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDekIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDOzs7O0lBRUQsZ0RBQWU7OztJQUFmO1FBQ0UsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFFRCx1REFBc0I7OztJQUF0QjtRQUNFLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7O0lBRUQsdUNBQU07OztJQUFOO1FBQ0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQzs7OztJQUVELDRDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRUQsMkNBQVU7Ozs7SUFBVixVQUFXLEdBQUc7UUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBRUQsNENBQVc7Ozs7SUFBWCxVQUFZLEdBQUc7UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQzNCLENBQUM7Ozs7SUFFRCxpREFBZ0I7OztJQUFoQjtRQUNFLHNDQUFzQztRQUN0QywwQkFBMEI7UUFDMUIsa0JBQWtCO1FBQ2xCLElBQUk7UUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDOzs7O0lBRUQsb0RBQW1COzs7SUFBbkI7UUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELHFEQUFvQjs7O0lBQXBCO1FBQ0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7OztJQUVELGdEQUFlOzs7OztJQUFmLFVBQWdCLElBQUksRUFBRSxVQUFVO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDOzs7O0lBRUQsc0NBQUs7OztJQUFMO1FBQ0UsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7OztJQUdELDRDQUFXOzs7SUFEWDtRQUVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7Ozs7SUFHRCw2Q0FBWTs7O0lBRFo7UUFFRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDOzs7Ozs7SUFFTyw0Q0FBVzs7Ozs7SUFBbkIsVUFBb0IsS0FBVTtRQUM1QixPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDOzs7OztJQUVPLDRDQUFXOzs7O0lBQW5CO1FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsZUFBYSxJQUFJLENBQUMsVUFBVSxZQUFPLElBQUksQ0FBQyxVQUFVLG1CQUFjLElBQUksQ0FBQyxRQUFRLG1CQUFjLElBQUksQ0FBQyxLQUFLLE1BQUcsQ0FBQztRQUNoSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUMvQyxDQUFDOzs7Ozs7O0lBRU8sNENBQVc7Ozs7OztJQUFuQixVQUFvQixhQUFnQyxFQUFFLGNBQWlDOztZQUNqRixNQUFNLHdCQUEyQixhQUFhLENBQUU7UUFDcEQsSUFBSSxjQUFjLEVBQUU7WUFDbEIsTUFBTSx3QkFBUSxhQUFhLEVBQUssY0FBYyxDQUFFLENBQUM7WUFFakQsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFO2dCQUMzQixNQUFNLENBQUMsUUFBUSx3QkFBUSxhQUFhLENBQUMsUUFBUSxFQUFLLGNBQWMsQ0FBQyxRQUFRLENBQUUsQ0FBQzthQUM3RTtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7Z0JBMU9GLFNBQVMsU0FBQzs7b0JBRVQsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFLHN0RkErQ1Q7O2lCQUVGOzs7O2dEQXNDYyxRQUFRLFlBQUksTUFBTSxTQUFDLFFBQVE7OztzQkFuQ3ZDLEtBQUs7d0JBR0wsS0FBSzt5QkFHTCxLQUFLO3dCQUdMLEtBQUs7eUJBR0wsS0FBSzs4QkFHTCxNQUFNOytCQUdOLE1BQU07bUNBR04sTUFBTTs0QkFzQk4sWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOzRCQVVsRCxZQUFZLFNBQUMsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7OEJBK0ZqRCxZQUFZLFNBQUMsV0FBVzsrQkFLeEIsWUFBWSxTQUFDLFlBQVk7O0lBMkI1Qiw2QkFBQztDQUFBLEFBM09ELElBMk9DO1NBdExZLHNCQUFzQjs7O0lBRWpDLHFDQUNjOztJQUVkLHVDQUNjOztJQUVkLHdDQUNlOztJQUVmLHVDQUNVOztJQUVWLHdDQUMwQjs7SUFFMUIsNkNBQ3VEOztJQUV2RCw4Q0FDbUU7O0lBRW5FLGtEQUNzRTs7SUFFdEUsdUNBQTBHOztJQUMxRyw0Q0FBMEI7O0lBQzFCLHlDQUFzQjs7Ozs7SUFDdEIsdUNBQWtCOzs7OztJQUNsQiwwQ0FBcUI7Ozs7O0lBQ3JCLDRDQUF1Qjs7Ozs7SUFDdkIsNENBQXVCOzs7OztJQUN2Qix1Q0FBc0I7Ozs7O0lBQ3RCLHVDQUFzQjs7Ozs7SUFDdEIseUNBQXdCOztJQUVaLDhDQUFvRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SW1hZ2VWaWV3ZXJDb25maWd9IGZyb20gJy4vbW9kZWwvaW1hZ2Utdmlld2VyLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQge0N1c3RvbUltYWdlRXZlbnR9IGZyb20gJy4vbW9kZWwvY3VzdG9tLWltYWdlLWV2ZW50LW1vZGVsJztcblxuY29uc3QgREVGQVVMVF9DT05GSUc6IEltYWdlVmlld2VyQ29uZmlnID0ge1xuICBidG5DbGFzczogJ2RlZmF1bHQnLFxuICB6b29tRmFjdG9yOiAwLjEsXG4gIGNvbnRhaW5lckJhY2tncm91bmRDb2xvcjogJyNjY2MnLFxuICB3aGVlbFpvb206IHRydWUsXG4gIGFsbG93RnVsbHNjcmVlbjogdHJ1ZSxcbiAgYWxsb3dLZXlib2FyZE5hdmlnYXRpb246IHRydWUsXG4gIGJ0blNob3c6IHtcbiAgICB6b29tSW46IHRydWUsXG4gICAgem9vbU91dDogdHJ1ZSxcbiAgICByb3RhdGVDbG9ja3dpc2U6IHRydWUsXG4gICAgcm90YXRlQ291bnRlckNsb2Nrd2lzZTogdHJ1ZSxcbiAgfSxcbiAgYnRuSWNvbnM6IHtcbiAgICB6b29tSW46ICdmYSBmYS1wbHVzJyxcbiAgICB6b29tT3V0OiAnZmEgZmEtbWludXMnLFxuICAgIHJvdGF0ZUNsb2Nrd2lzZTogJ2ZhIGZhLXJlcGVhdCcsXG4gICAgcm90YXRlQ291bnRlckNsb2Nrd2lzZTogJ2ZhIGZhLXVuZG8nLFxuICAgIGZ1bGxzY3JlZW46ICdmYSBmYS1yZWZyZXNoJyxcbiAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICduZy1pbWFnZS12aWV3ZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgPGRpdiBjbGFzcz1cImltZy1jb250YWluZXJcIiBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNvbmZpZy5jb250YWluZXJCYWNrZ3JvdW5kQ29sb3JcIlxuICAgICAgICAgICAod2hlZWwpPVwic2Nyb2xsWm9vbSgkZXZlbnQpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwie3dpZHRoOiB3aWR0aCsncHgnLGhlaWdodDogaGVpZ2h0KydweCd9XCI+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJzcmNbaW5kZXhdXCIgIFtuZ1N0eWxlXT1cInN0eWxlXCIgYWx0PVwiSW1hZ2Ugbm90IGZvdW5kLi4uXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAobG9hZCk9XCJvbkxvYWQoKVwiIChsb2Fkc3RhcnQpPVwib25Mb2FkU3RhcnQoKVwiIC8+XG4gICAgICAgICAgICAgIDwhLS0gRGl2IGJlbG93IHdpbGwgYmUgdXNlZCB0byBoaWRlIHRoZSAnZ2hvc3QnIGltYWdlIHdoZW4gZHJhZ2dpbmcgLS0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1jb250YWluZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzc109XCJjb25maWcuYnRuQ2xhc3NcIiAqbmdJZj1cImNvbmZpZy5idG5TaG93LnJvdGF0ZUNvdW50ZXJDbG9ja3dpc2VcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJvdGF0ZUNvdW50ZXJDbG9ja3dpc2UoKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY29uZmlnLmJ0bkljb25zLnJvdGF0ZUNvdW50ZXJDbG9ja3dpc2VcIj48L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzXT1cImNvbmZpZy5idG5DbGFzc1wiICpuZ0lmPVwiY29uZmlnLmJ0blNob3cucm90YXRlQ2xvY2t3aXNlXCIgKGNsaWNrKT1cInJvdGF0ZUNsb2Nrd2lzZSgpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjb25maWcuYnRuSWNvbnMucm90YXRlQ2xvY2t3aXNlXCI+PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzXT1cImNvbmZpZy5idG5DbGFzc1wiICpuZ0lmPVwiY29uZmlnLmJ0blNob3cuem9vbU91dFwiIChjbGljayk9XCJ6b29tT3V0KClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNvbmZpZy5idG5JY29ucy56b29tT3V0XCI+PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzc109XCJjb25maWcuYnRuQ2xhc3NcIiAqbmdJZj1cImNvbmZpZy5idG5TaG93Lnpvb21JblwiIChjbGljayk9XCJ6b29tSW4oKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY29uZmlnLmJ0bkljb25zLnpvb21JblwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzXT1cImNvbmZpZy5idG5DbGFzc1wiICpuZ0Zvcj1cImxldCBjQnRuIG9mIGNvbmZpZy5jdXN0b21CdG5zXCItLT5cbiAgICAgICAgICA8IS0tICAgICAgICAoY2xpY2spPVwiZmlyZUN1c3RvbUV2ZW50KGNCdG4ubmFtZSwgaW5kZXgpXCI+LS0+XG4gICAgICAgICAgPCEtLSAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNCdG4uaWNvblwiPjwvc3Bhbj4tLT5cbiAgICAgICAgICA8IS0tICAgIDwvYnV0dG9uPi0tPlxuXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzXT1cImNvbmZpZy5idG5DbGFzc1wiIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuKClcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWcuYWxsb3dGdWxsc2NyZWVuXCI+XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjb25maWcuYnRuSWNvbnMuZnVsbHNjcmVlblwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b24tY29udGFpbmVyXCIgKm5nSWY9XCJzcmMubGVuZ3RoID4gMVwiPi0tPlxuICAgICAgICAgIDwhLS0gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzc109XCJjb25maWcuYnRuQ2xhc3NcIiAoY2xpY2spPVwicHJldkltYWdlKCRldmVudClcIiBbZGlzYWJsZWRdPVwiaW5kZXggPT09IDBcIj4tLT5cbiAgICAgICAgICA8IS0tICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNvbmZpZy5idG5JY29ucy5wcmV2XCI+PC9zcGFuPi0tPlxuICAgICAgICAgIDwhLS0gICAgICAgIDwvYnV0dG9uPi0tPlxuICAgICAgICAgIDwhLS0gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzc109XCJjb25maWcuYnRuQ2xhc3NcIiAoY2xpY2spPVwibmV4dEltYWdlKCRldmVudClcIiBbZGlzYWJsZWRdPVwiaW5kZXggPT09IHNyYy5sZW5ndGggLSAxXCI+LS0+XG4gICAgICAgICAgPCEtLSAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjb25maWcuYnRuSWNvbnMubmV4dFwiPjwvc3Bhbj4tLT5cbiAgICAgICAgICA8IS0tICAgICAgICA8L2J1dHRvbj4tLT5cbiAgICAgICAgICA8IS0tICAgIDwvZGl2Pi0tPlxuICAgICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL25nLWltYWdlLXZpZXdlci5jb21wb25lbnQuc2NzcycgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0ltYWdlVmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKVxuICBzcmM6IHN0cmluZ1tdO1xuXG4gIEBJbnB1dCgpXG4gIHdpZHRoOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgaGVpZ2h0OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgaW5kZXggPSAwO1xuXG4gIEBJbnB1dCgpXG4gIGNvbmZpZzogSW1hZ2VWaWV3ZXJDb25maWc7XG5cbiAgQE91dHB1dCgpXG4gIGluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgY29uZmlnQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SW1hZ2VWaWV3ZXJDb25maWc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBjdXN0b21JbWFnZUV2ZW50OiBFdmVudEVtaXR0ZXI8Q3VzdG9tSW1hZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIHN0eWxlID0geyB0cmFuc2Zvcm06ICcnLCBtc1RyYW5zZm9ybTogJycsIG9UcmFuc2Zvcm06ICcnLCB3ZWJraXRUcmFuc2Zvcm06ICcnLCBjdXJzb3I6ICdwb2ludGVyJyB9O1xuICBwdWJsaWMgZnVsbHNjcmVlbiA9IGZhbHNlO1xuICBwdWJsaWMgbG9hZGluZyA9IHRydWU7XG4gIHByaXZhdGUgc2NhbGUgPSAxO1xuICBwcml2YXRlIHJvdGF0aW9uID0gMDtcbiAgcHJpdmF0ZSB0cmFuc2xhdGVYID0gMDtcbiAgcHJpdmF0ZSB0cmFuc2xhdGVZID0gMDtcbiAgcHJpdmF0ZSBwcmV2WDogbnVtYmVyO1xuICBwcml2YXRlIHByZXZZOiBudW1iZXI7XG4gIHByaXZhdGUgaG92ZXJlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoJ2NvbmZpZycpIHB1YmxpYyBtb2R1bGVDb25maWc6IEltYWdlVmlld2VyQ29uZmlnKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnKERFRkFVTFRfQ09ORklHLCB0aGlzLm1vZHVsZUNvbmZpZyk7XG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKG1lcmdlZCwgdGhpcy5jb25maWcpO1xuICAgIHRoaXMudHJpZ2dlckNvbmZpZ0JpbmRpbmcoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cC5BcnJvd1JpZ2h0JywgWyckZXZlbnQnXSlcbiAgbmV4dEltYWdlKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuY2FuTmF2aWdhdGUoZXZlbnQpICYmIHRoaXMuaW5kZXggPCB0aGlzLnNyYy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgdGhpcy50cmlnZ2VySW5kZXhCaW5kaW5nKCk7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLkFycm93TGVmdCcsIFsnJGV2ZW50J10pXG4gIHByZXZJbWFnZShldmVudCkge1xuICAgIGlmICh0aGlzLmNhbk5hdmlnYXRlKGV2ZW50KSAmJiB0aGlzLmluZGV4ID4gMCkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5kZXgtLTtcbiAgICAgIHRoaXMudHJpZ2dlckluZGV4QmluZGluZygpO1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHpvb21JbigpIHtcbiAgICB0aGlzLnNjYWxlICo9ICgxICsgdGhpcy5jb25maWcuem9vbUZhY3Rvcik7XG4gICAgdGhpcy51cGRhdGVTdHlsZSgpO1xuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICBpZiAodGhpcy5zY2FsZSA+IHRoaXMuY29uZmlnLnpvb21GYWN0b3IpIHtcbiAgICAgIHRoaXMuc2NhbGUgLz0gKDEgKyB0aGlzLmNvbmZpZy56b29tRmFjdG9yKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdHlsZSgpO1xuICB9XG5cbiAgc2Nyb2xsWm9vbShldnQpIHtcbiAgICBpZiAodGhpcy5jb25maWcud2hlZWxab29tKSB7XG4gICAgICBldnQuZGVsdGFZID4gMCA/IHRoaXMuem9vbU91dCgpIDogdGhpcy56b29tSW4oKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByb3RhdGVDbG9ja3dpc2UoKSB7XG4gICAgdGhpcy5yb3RhdGlvbiArPSA5MDtcbiAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XG4gIH1cblxuICByb3RhdGVDb3VudGVyQ2xvY2t3aXNlKCkge1xuICAgIHRoaXMucm90YXRpb24gLT0gOTA7XG4gICAgdGhpcy51cGRhdGVTdHlsZSgpO1xuICB9XG5cbiAgb25Mb2FkKCkge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgb25Mb2FkU3RhcnQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIG9uRHJhZ092ZXIoZXZ0KSB7XG4gICAgdGhpcy50cmFuc2xhdGVYICs9IChldnQuY2xpZW50WCAtIHRoaXMucHJldlgpO1xuICAgIHRoaXMudHJhbnNsYXRlWSArPSAoZXZ0LmNsaWVudFkgLSB0aGlzLnByZXZZKTtcbiAgICB0aGlzLnByZXZYID0gZXZ0LmNsaWVudFg7XG4gICAgdGhpcy5wcmV2WSA9IGV2dC5jbGllbnRZO1xuICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcbiAgfVxuXG4gIG9uRHJhZ1N0YXJ0KGV2dCkge1xuICAgIHRoaXMucHJldlggPSBldnQuY2xpZW50WDtcbiAgICB0aGlzLnByZXZZID0gZXZ0LmNsaWVudFk7XG4gIH1cblxuICB0b2dnbGVGdWxsc2NyZWVuKCkge1xuICAgIC8vIHRoaXMuZnVsbHNjcmVlbiA9ICF0aGlzLmZ1bGxzY3JlZW47XG4gICAgLy8gaWYgKCF0aGlzLmZ1bGxzY3JlZW4pIHtcbiAgICAvLyAgIHRoaXMucmVzZXQoKTtcbiAgICAvLyB9XG4gICAgdGhpcy50cmFuc2xhdGVYID0gMDtcbiAgICB0aGlzLnRyYW5zbGF0ZVkgPSAwO1xuICAgIHRoaXMuc2NhbGUgPSAxO1xuICAgIHRoaXMucm90YXRpb24gPSAwO1xuICAgIHRoaXMudHJhbnNsYXRlWCA9IDA7XG4gICAgdGhpcy50cmFuc2xhdGVZID0gMDtcbiAgICB0aGlzLnpvb21JbigpO1xuICAgIHRoaXMuem9vbU91dCgpO1xuICB9XG5cbiAgdHJpZ2dlckluZGV4QmluZGluZygpIHtcbiAgICB0aGlzLmluZGV4Q2hhbmdlLmVtaXQodGhpcy5pbmRleCk7XG4gIH1cblxuICB0cmlnZ2VyQ29uZmlnQmluZGluZygpIHtcbiAgICB0aGlzLmNvbmZpZ0NoYW5nZS5uZXh0KHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGZpcmVDdXN0b21FdmVudChuYW1lLCBpbWFnZUluZGV4KSB7XG4gICAgdGhpcy5jdXN0b21JbWFnZUV2ZW50LmVtaXQobmV3IEN1c3RvbUltYWdlRXZlbnQobmFtZSwgaW1hZ2VJbmRleCkpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgdGhpcy5yb3RhdGlvbiA9IDA7XG4gICAgdGhpcy50cmFuc2xhdGVYID0gMDtcbiAgICB0aGlzLnRyYW5zbGF0ZVkgPSAwO1xuICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlb3ZlcicpXG4gIG9uTW91c2VPdmVyKCkge1xuICAgIHRoaXMuaG92ZXJlZCA9IHRydWU7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuaG92ZXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5OYXZpZ2F0ZShldmVudDogYW55KSB7XG4gICAgcmV0dXJuIGV2ZW50ID09IG51bGwgfHwgKHRoaXMuY29uZmlnLmFsbG93S2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaG92ZXJlZCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlKCkge1xuICAgIHRoaXMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3RoaXMudHJhbnNsYXRlWH1weCwgJHt0aGlzLnRyYW5zbGF0ZVl9cHgpIHJvdGF0ZSgke3RoaXMucm90YXRpb259ZGVnKSBzY2FsZSgke3RoaXMuc2NhbGV9KWA7XG4gICAgdGhpcy5zdHlsZS5tc1RyYW5zZm9ybSA9IHRoaXMuc3R5bGUudHJhbnNmb3JtO1xuICAgIHRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gdGhpcy5zdHlsZS50cmFuc2Zvcm07XG4gICAgdGhpcy5zdHlsZS5vVHJhbnNmb3JtID0gdGhpcy5zdHlsZS50cmFuc2Zvcm07XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnKGRlZmF1bHRWYWx1ZXM6IEltYWdlVmlld2VyQ29uZmlnLCBvdmVycmlkZVZhbHVlczogSW1hZ2VWaWV3ZXJDb25maWcpOiBJbWFnZVZpZXdlckNvbmZpZyB7XG4gICAgbGV0IHJlc3VsdDogSW1hZ2VWaWV3ZXJDb25maWcgPSB7IC4uLmRlZmF1bHRWYWx1ZXMgfTtcbiAgICBpZiAob3ZlcnJpZGVWYWx1ZXMpIHtcbiAgICAgIHJlc3VsdCA9IHsgLi4uZGVmYXVsdFZhbHVlcywgLi4ub3ZlcnJpZGVWYWx1ZXMgfTtcblxuICAgICAgaWYgKG92ZXJyaWRlVmFsdWVzLmJ0bkljb25zKSB7XG4gICAgICAgIHJlc3VsdC5idG5JY29ucyA9IHsgLi4uZGVmYXVsdFZhbHVlcy5idG5JY29ucywgLi4ub3ZlcnJpZGVWYWx1ZXMuYnRuSWNvbnMgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19