ngx-cropperjs-wrapper
Version:
This angular library is a wrapper of Javascript image cropper
380 lines (379 loc) • 37.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import Cropper from 'cropperjs';
/**
* @record
*/
export function CropperOutputOptions() { }
/** @type {?} */
CropperOutputOptions.prototype.mimeType;
/** @type {?} */
CropperOutputOptions.prototype.qualityArgument;
/**
* @record
*/
export function CropperOptions() { }
/** @type {?} */
CropperOptions.prototype.minCropWidth;
/** @type {?} */
CropperOptions.prototype.minCropHeight;
/** @type {?} */
CropperOptions.prototype.outputOptions;
var CropperComponent = /** @class */ (function () {
function CropperComponent() {
this.crop = new EventEmitter();
this.cropMove = new EventEmitter();
this.cropStart = new EventEmitter();
this.cropEnd = new EventEmitter();
this.ready = new EventEmitter();
this.zoom = new EventEmitter();
this.init = new EventEmitter();
this.fail = new EventEmitter();
this.fileChange = new EventEmitter();
this.options = /** @type {?} */ ({});
this.data = /** @type {?} */ ({});
this.propagateChange = function (value) { return value; };
}
Object.defineProperty(CropperComponent.prototype, "imageFile", {
get: /**
* @return {?}
*/
function () {
return this.originalFile;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
if (['image/gif', 'image/jpeg', 'image/png'].indexOf(value.type) === -1) {
this.fail.emit(new Error('Invalid input file type'));
return;
}
/** @type {?} */
var reader = new FileReader();
reader.onload = function () {
_this.dataUrl = reader.result;
};
this.originalFile = value;
reader.readAsDataURL(this.originalFile);
},
enumerable: true,
configurable: true
});
Object.defineProperty(CropperComponent.prototype, "imageUrl", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
this.dataUrl = value;
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
CropperComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.data = value;
if (this.data && this.cropper) {
this.cropper.setData(this.data);
}
};
/**
* @param {?} fn
* @return {?}
*/
CropperComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* @return {?}
*/
CropperComponent.prototype.registerOnTouched = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
CropperComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroyCropperIfExists();
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onImageLoad = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var img = /** @type {?} */ (event.target);
this.destroyCropperIfExists();
if ((this.options.minCropWidth && img.naturalWidth < this.options.minCropWidth)
|| (this.options.minCropHeight && img.naturalHeight < this.options.minCropHeight)) {
delete this.dataUrl;
this.fail.emit(new Error('Input image is too small'));
return;
}
this.isReady = false;
this.cropper = new Cropper(img, Object.assign({
crop: this.onCrop.bind(this),
cropmove: this.onCropMove.bind(this),
cropstart: this.onCropStart.bind(this),
cropend: this.onCropEnd.bind(this),
ready: this.onReady.bind(this),
zoom: this.onZoom.bind(this),
}, this.options));
this.init.emit(this.cropper);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCrop = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.options.viewMode !== 0) {
this.correctCropArea();
}
if (this.isReady) {
this.update();
}
this.crop.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropMove = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.options.viewMode === 0) {
this.correctCropArea();
}
this.update();
this.cropMove.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropStart = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.update();
this.cropStart.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onCropEnd = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.correctCropArea();
this.updateFile();
this.update();
this.cropEnd.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onReady = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.data) {
this.cropper.setData(this.data);
this.correctCropArea();
}
else {
this.correctCropArea();
this.update();
}
this.isReady = true;
this.ready.emit(event);
this.updateFile();
};
/**
* @param {?} event
* @return {?}
*/
CropperComponent.prototype.onZoom = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.update();
this.zoom.emit(event);
};
/**
* @return {?}
*/
CropperComponent.prototype.updateFile = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var name = 'cropped_file';
if (typeof this.dataUrl === 'string') {
/** @type {?} */
var urlParams = this.dataUrl.split('/');
name = urlParams[urlParams.length - 1];
}
/** @type {?} */
var mimeType = (this.options.outputOptions && this.options.outputOptions.mimeType) || 'image/png';
/** @type {?} */
var qualityArgument = (this.options.outputOptions && this.options.outputOptions.qualityArgument) || 0.9;
this.cropper.getCroppedCanvas().toBlob(function (blob) {
blob.lastModifiedDate = new Date();
blob.name = _this.originalFile ? _this.originalFile.name : name;
_this.fileChange.emit(blob);
}, mimeType, qualityArgument);
};
/**
* @return {?}
*/
CropperComponent.prototype.correctCropArea = /**
* @return {?}
*/
function () {
/** @type {?} */
var data = this.cropper.getData();
if (data.height < this.options.minCropHeight || data.width < this.options.minCropWidth) {
data.width = Math.max(data.width, this.options.minCropWidth || 0);
data.height = Math.max(data.height, this.options.minCropHeight || 0);
this.cropper.setData(data);
}
};
/**
* @return {?}
*/
CropperComponent.prototype.update = /**
* @return {?}
*/
function () {
this.data = this.cropper.getData();
this.propagateChange(this.data);
};
/**
* @return {?}
*/
CropperComponent.prototype.destroyCropperIfExists = /**
* @return {?}
*/
function () {
if (!this.cropper) {
return;
}
this.cropper.destroy();
delete this.cropper;
};
CropperComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-cropper',
template: "<div class=\"cropper-component\" *ngIf=\"dataUrl\">\n <img #image alt=\"image\" [src]=\"dataUrl\" (load)=\"onImageLoad($event)\"/>\n</div>\n",
styles: [".cropper-component img{max-width:100%;max-height:100%}::ng-deep{/*!\n * Cropper.js v1.4.0\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2018-06-01T15:18:09.891Z\n */}::ng-deep .cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}::ng-deep .cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}::ng-deep .cropper-canvas,::ng-deep .cropper-crop-box,::ng-deep .cropper-drag-box,::ng-deep .cropper-modal,::ng-deep .cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}::ng-deep .cropper-canvas,::ng-deep .cropper-wrap-box{overflow:hidden}::ng-deep .cropper-drag-box{background-color:#fff;opacity:0}::ng-deep .cropper-modal{background-color:#000;opacity:.5}::ng-deep .cropper-view-box{display:block;height:100%;outline:#eee solid 1px;overflow:hidden;width:100%}::ng-deep .cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}::ng-deep .cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}::ng-deep .cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}::ng-deep .cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}::ng-deep .cropper-center:after,::ng-deep .cropper-center:before{background-color:#eee;content:' ';display:block;position:absolute}::ng-deep .cropper-center:before{height:1px;left:-3px;top:0;width:7px}::ng-deep .cropper-center:after{height:7px;left:0;top:-3px;width:1px}::ng-deep .cropper-face,::ng-deep .cropper-line,::ng-deep .cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}::ng-deep .cropper-face{background-color:#fff;left:0;top:0}::ng-deep .cropper-line{background-color:#39f}::ng-deep .cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}::ng-deep .cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}::ng-deep .cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}::ng-deep .cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}::ng-deep .cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}::ng-deep .cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}::ng-deep .cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}::ng-deep .cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}::ng-deep .cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}::ng-deep .cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}::ng-deep .cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}::ng-deep .cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}::ng-deep .cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){::ng-deep .cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){::ng-deep .cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){::ng-deep .cropper-point.point-se{height:5px;opacity:.75;width:5px}}::ng-deep .cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}::ng-deep .cropper-invisible{opacity:0}::ng-deep .cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}::ng-deep .cropper-hide{display:block;height:0;position:absolute;width:0}::ng-deep .cropper-hidden{display:none!important}::ng-deep .cropper-move{cursor:move}::ng-deep .cropper-crop{cursor:crosshair}::ng-deep .cropper-disabled .cropper-drag-box,::ng-deep .cropper-disabled .cropper-face,::ng-deep .cropper-disabled .cropper-line,::ng-deep .cropper-disabled .cropper-point{cursor:not-allowed}::ng-deep .cropper-line,::ng-deep .cropper-point,::ng-deep .cropper-point.point-se::before{background-color:#eee}"],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return CropperComponent; }),
multi: true
}
],
},] },
];
CropperComponent.propDecorators = {
crop: [{ type: Output }],
cropMove: [{ type: Output }],
cropStart: [{ type: Output }],
cropEnd: [{ type: Output }],
ready: [{ type: Output }],
zoom: [{ type: Output }],
init: [{ type: Output }],
fail: [{ type: Output }],
fileChange: [{ type: Output }],
options: [{ type: Input }],
imageFile: [{ type: Input, args: ['imageFile',] }],
imageUrl: [{ type: Input, args: ['imageUrl',] }]
};
return CropperComponent;
}());
export { CropperComponent };
if (false) {
/** @type {?} */
CropperComponent.prototype.crop;
/** @type {?} */
CropperComponent.prototype.cropMove;
/** @type {?} */
CropperComponent.prototype.cropStart;
/** @type {?} */
CropperComponent.prototype.cropEnd;
/** @type {?} */
CropperComponent.prototype.ready;
/** @type {?} */
CropperComponent.prototype.zoom;
/** @type {?} */
CropperComponent.prototype.init;
/** @type {?} */
CropperComponent.prototype.fail;
/** @type {?} */
CropperComponent.prototype.fileChange;
/** @type {?} */
CropperComponent.prototype.options;
/** @type {?} */
CropperComponent.prototype.dataUrl;
/** @type {?} */
CropperComponent.prototype.cropper;
/** @type {?} */
CropperComponent.prototype.isReady;
/** @type {?} */
CropperComponent.prototype.originalFile;
/** @type {?} */
CropperComponent.prototype.data;
/** @type {?} */
CropperComponent.prototype.propagateChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtY3JvcHBlcmpzLXdyYXBwZXIvIiwic291cmNlcyI6WyJsaWIvY3JvcHBlci9jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sT0FBTyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQXVDYixJQUFJLFlBQVksRUFBZTt3QkFDM0IsSUFBSSxZQUFZLEVBQWU7eUJBQzlCLElBQUksWUFBWSxFQUFlO3VCQUNqQyxJQUFJLFlBQVksRUFBZTtxQkFDakMsSUFBSSxZQUFZLEVBQWU7b0JBQ2hDLElBQUksWUFBWSxFQUFlO29CQUMvQixJQUFJLFlBQVksRUFBVztvQkFDM0IsSUFBSSxZQUFZLEVBQVM7MEJBQ25CLElBQUksWUFBWSxFQUFRO3lDQUU1QixFQUFvQjtzQ0EyQ3hCLEVBQTRCOytCQUV6QixVQUFDLEtBQTZCLElBQUssT0FBQSxLQUFLLEVBQUwsQ0FBSzs7SUEzQzFELHNCQUFJLHVDQUFTOzs7O1FBQWI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUMxQjs7Ozs7UUFFRCxVQUFrQyxLQUFXO1lBQTdDLGlCQW9CQztZQW5CQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDcEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFOUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNYLE1BQU0sQ0FBQzthQUNSO1lBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELE1BQU0sQ0FBQzthQUNSOztZQUVELElBQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRztnQkFDZCxLQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDOUIsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3pDOzs7T0F0QkE7SUF3QkQsc0JBQXVCLHNDQUFROzs7OztRQUEvQixVQUFnQyxLQUFhO1lBQzNDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUU5QixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsTUFBTSxDQUFDO2FBQ1I7WUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN0Qjs7O09BQUE7Ozs7O0lBVUQscUNBQVU7Ozs7SUFBVixVQUFXLEtBQTZCO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBRWxCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO0tBQ0Y7Ozs7O0lBRUQsMkNBQWdCOzs7O0lBQWhCLFVBQWlCLEVBQUU7UUFDakIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7S0FDM0I7Ozs7SUFFRCw0Q0FBaUI7OztJQUFqQixlQUFzQjs7OztJQUV0QixzQ0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztLQUMvQjs7Ozs7SUFFRCxzQ0FBVzs7OztJQUFYLFVBQVksS0FBWTs7UUFDdEIsSUFBTSxHQUFHLHFCQUFHLEtBQUssQ0FBQyxNQUEwQixFQUFDO1FBRTdDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztlQUMxRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztZQUN0RCxNQUFNLENBQUM7U0FDUjtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDNUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNsQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDN0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVsQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDOUI7Ozs7O0lBRU8saUNBQU07Ozs7Y0FBQyxLQUFrQjtRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNmO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7OztJQUdoQixxQ0FBVTs7OztjQUFDLEtBQWtCO1FBQ25DLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7OztJQUdwQixzQ0FBVzs7OztjQUFDLEtBQWtCO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7SUFHckIsb0NBQVM7Ozs7Y0FBQyxLQUFrQjtRQUNsQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7SUFHbkIsa0NBQU87Ozs7Y0FBQyxLQUFrQjtRQUNoQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Ozs7O0lBR1osaUNBQU07Ozs7Y0FBQyxLQUFrQjtRQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7SUFHaEIscUNBQVU7Ozs7OztRQUNoQixJQUFJLElBQUksR0FBRyxjQUFjLENBQUM7UUFFMUIsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7O1lBQ3JDLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN4Qzs7UUFHRCxJQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQzs7UUFDcEcsSUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLENBQUM7UUFFMUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQVM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzlELEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDOzs7OztJQUd4QiwwQ0FBZTs7Ozs7UUFDckIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVwQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCOzs7OztJQUdLLGlDQUFNOzs7O1FBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7OztJQUcxQixpREFBc0I7Ozs7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsQixNQUFNLENBQUM7U0FDUjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7Z0JBek52QixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFFBQVEsRUFBRSwrSUFHWDtvQkFDQyxNQUFNLEVBQUUsQ0FBQyxzeUlBUTJoSSxDQUFDO29CQUNyaUksU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLGdCQUFnQixFQUFoQixDQUFnQixDQUFDOzRCQUMvQyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7O3VCQUdFLE1BQU07MkJBQ04sTUFBTTs0QkFDTixNQUFNOzBCQUNOLE1BQU07d0JBQ04sTUFBTTt1QkFDTixNQUFNO3VCQUNOLE1BQU07dUJBQ04sTUFBTTs2QkFDTixNQUFNOzBCQUVOLEtBQUs7NEJBTUwsS0FBSyxTQUFDLFdBQVc7MkJBc0JqQixLQUFLLFNBQUMsVUFBVTs7MkJBL0VuQjs7U0F1Q2EsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IENyb3BwZXIgZnJvbSAnY3JvcHBlcmpzJztcbmltcG9ydCB7IFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBDcm9wcGVyT3V0cHV0T3B0aW9ucyB7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHF1YWxpdHlBcmd1bWVudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyb3BwZXJPcHRpb25zIGV4dGVuZHMgQ3JvcHBlci5PcHRpb25zIHtcbiAgbWluQ3JvcFdpZHRoOiBudW1iZXI7XG4gIG1pbkNyb3BIZWlnaHQ6IG51bWJlcjtcbiAgb3V0cHV0T3B0aW9uczogQ3JvcHBlck91dHB1dE9wdGlvbnM7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jcm9wcGVyJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY3JvcHBlci1jb21wb25lbnRcIiAqbmdJZj1cImRhdGFVcmxcIj5cbiAgPGltZyAjaW1hZ2UgYWx0PVwiaW1hZ2VcIiBbc3JjXT1cImRhdGFVcmxcIiAobG9hZCk9XCJvbkltYWdlTG9hZCgkZXZlbnQpXCIvPlxuPC9kaXY+XG5gLFxuICBzdHlsZXM6IFtgLmNyb3BwZXItY29tcG9uZW50IGltZ3ttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9OjpuZy1kZWVwey8qIVxuICogQ3JvcHBlci5qcyB2MS40LjBcbiAqIGh0dHBzOi8vZmVuZ3l1YW5jaGVuLmdpdGh1Yi5pby9jcm9wcGVyanNcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50IENoZW4gRmVuZ3l1YW5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTgtMDYtMDFUMTU6MTg6MDkuODkxWlxuICovfTo6bmctZGVlcCAuY3JvcHBlci1jb250YWluZXJ7ZGlyZWN0aW9uOmx0cjtmb250LXNpemU6MDtsaW5lLWhlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlO3RvdWNoLWFjdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX06Om5nLWRlZXAgLmNyb3BwZXItY29udGFpbmVyIGltZ3tkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO2ltYWdlLW9yaWVudGF0aW9uOjBkZWc7bWF4LWhlaWdodDpub25lIWltcG9ydGFudDttYXgtd2lkdGg6bm9uZSFpbXBvcnRhbnQ7bWluLWhlaWdodDowIWltcG9ydGFudDttaW4td2lkdGg6MCFpbXBvcnRhbnQ7d2lkdGg6MTAwJX06Om5nLWRlZXAgLmNyb3BwZXItY2FudmFzLDo6bmctZGVlcCAuY3JvcHBlci1jcm9wLWJveCw6Om5nLWRlZXAgLmNyb3BwZXItZHJhZy1ib3gsOjpuZy1kZWVwIC5jcm9wcGVyLW1vZGFsLDo6bmctZGVlcCAuY3JvcHBlci13cmFwLWJveHtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MH06Om5nLWRlZXAgLmNyb3BwZXItY2FudmFzLDo6bmctZGVlcCAuY3JvcHBlci13cmFwLWJveHtvdmVyZmxvdzpoaWRkZW59OjpuZy1kZWVwIC5jcm9wcGVyLWRyYWctYm94e2JhY2tncm91bmQtY29sb3I6I2ZmZjtvcGFjaXR5OjB9OjpuZy1kZWVwIC5jcm9wcGVyLW1vZGFse2JhY2tncm91bmQtY29sb3I6IzAwMDtvcGFjaXR5Oi41fTo6bmctZGVlcCAuY3JvcHBlci12aWV3LWJveHtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO291dGxpbmU6I2VlZSBzb2xpZCAxcHg7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWRhc2hlZHtib3JkZXI6MCBkYXNoZWQgI2VlZTtkaXNwbGF5OmJsb2NrO29wYWNpdHk6LjU7cG9zaXRpb246YWJzb2x1dGV9OjpuZy1kZWVwIC5jcm9wcGVyLWRhc2hlZC5kYXNoZWQtaHtib3JkZXItYm90dG9tLXdpZHRoOjFweDtib3JkZXItdG9wLXdpZHRoOjFweDtoZWlnaHQ6MzMuMzMzMzMlO2xlZnQ6MDt0b3A6MzMuMzMzMzMlO3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWRhc2hlZC5kYXNoZWQtdntib3JkZXItbGVmdC13aWR0aDoxcHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweDtoZWlnaHQ6MTAwJTtsZWZ0OjMzLjMzMzMzJTt0b3A6MDt3aWR0aDozMy4zMzMzMyV9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcntkaXNwbGF5OmJsb2NrO2hlaWdodDowO2xlZnQ6NTAlO29wYWNpdHk6Ljc1O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7d2lkdGg6MH06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmFmdGVyLDo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXI6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2VlZTtjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlfTo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXI6YmVmb3Jle2hlaWdodDoxcHg7bGVmdDotM3B4O3RvcDowO3dpZHRoOjdweH06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmFmdGVye2hlaWdodDo3cHg7bGVmdDowO3RvcDotM3B4O3dpZHRoOjFweH06Om5nLWRlZXAgLmNyb3BwZXItZmFjZSw6Om5nLWRlZXAgLmNyb3BwZXItbGluZSw6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnR7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4xO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWZhY2V7YmFja2dyb3VuZC1jb2xvcjojZmZmO2xlZnQ6MDt0b3A6MH06Om5nLWRlZXAgLmNyb3BwZXItbGluZXtiYWNrZ3JvdW5kLWNvbG9yOiMzOWZ9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS1le2N1cnNvcjpldy1yZXNpemU7cmlnaHQ6LTNweDt0b3A6MDt3aWR0aDo1cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS1ue2N1cnNvcjpucy1yZXNpemU7aGVpZ2h0OjVweDtsZWZ0OjA7dG9wOi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS13e2N1cnNvcjpldy1yZXNpemU7bGVmdDotM3B4O3RvcDowO3dpZHRoOjVweH06Om5nLWRlZXAgLmNyb3BwZXItbGluZS5saW5lLXN7Ym90dG9tOi0zcHg7Y3Vyc29yOm5zLXJlc2l6ZTtoZWlnaHQ6NXB4O2xlZnQ6MH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnR7YmFja2dyb3VuZC1jb2xvcjojMzlmO2hlaWdodDo1cHg7b3BhY2l0eTouNzU7d2lkdGg6NXB4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1le2N1cnNvcjpldy1yZXNpemU7bWFyZ2luLXRvcDotM3B4O3JpZ2h0Oi0zcHg7dG9wOjUwJX06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtbntjdXJzb3I6bnMtcmVzaXplO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi0zcHg7dG9wOi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXd7Y3Vyc29yOmV3LXJlc2l6ZTtsZWZ0Oi0zcHg7bWFyZ2luLXRvcDotM3B4O3RvcDo1MCV9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXN7Ym90dG9tOi0zcHg7Y3Vyc29yOnMtcmVzaXplO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LW5le2N1cnNvcjpuZXN3LXJlc2l6ZTtyaWdodDotM3B4O3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1ud3tjdXJzb3I6bndzZS1yZXNpemU7bGVmdDotM3B4O3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zd3tib3R0b206LTNweDtjdXJzb3I6bmVzdy1yZXNpemU7bGVmdDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZXtib3R0b206LTNweDtjdXJzb3I6bndzZS1yZXNpemU7aGVpZ2h0OjIwcHg7b3BhY2l0eToxO3JpZ2h0Oi0zcHg7d2lkdGg6MjBweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDoxNXB4O3dpZHRoOjE1cHh9fUBtZWRpYSAobWluLXdpZHRoOjk5MnB4KXs6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7aGVpZ2h0OjEwcHg7d2lkdGg6MTBweH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXs6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7aGVpZ2h0OjVweDtvcGFjaXR5Oi43NTt3aWR0aDo1cHh9fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojMzlmO2JvdHRvbTotNTAlO2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjIwMCU7b3BhY2l0eTowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi01MCU7d2lkdGg6MjAwJX06Om5nLWRlZXAgLmNyb3BwZXItaW52aXNpYmxle29wYWNpdHk6MH06Om5nLWRlZXAgLmNyb3BwZXItYmd7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQVFNQUFBQWxQVzBpQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFBQmxCTVZFWE16TXovLy8vVGpSVjJBQUFBQ1hCSVdYTUFBQXJyQUFBSzZ3R0NpdzFhQUFBQUhIUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkdhWEpsZDI5eWEzTWdRMU0yNkx5eWpBQUFBQkZKUkVGVUNKbGorTS9BZ0JWaEYvMFBBSDYvRC9Ia0R4T0dBQUFBQUVsRlRrU3VRbUNDKX06Om5nLWRlZXAgLmNyb3BwZXItaGlkZXtkaXNwbGF5OmJsb2NrO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWhpZGRlbntkaXNwbGF5Om5vbmUhaW1wb3J0YW50fTo6bmctZGVlcCAuY3JvcHBlci1tb3Zle2N1cnNvcjptb3ZlfTo6bmctZGVlcCAuY3JvcHBlci1jcm9we2N1cnNvcjpjcm9zc2hhaXJ9OjpuZy1kZWVwIC5jcm9wcGVyLWRpc2FibGVkIC5jcm9wcGVyLWRyYWctYm94LDo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1mYWNlLDo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1saW5lLDo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1wb2ludHtjdXJzb3I6bm90LWFsbG93ZWR9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUsOjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LDo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2VlZX1gXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDcm9wcGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQE91dHB1dCgpIGNyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY3JvcE1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY3JvcFN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgem9vbSA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBpbml0ID0gbmV3IEV2ZW50RW1pdHRlcjxDcm9wcGVyPigpO1xuICBAT3V0cHV0KCkgZmFpbCA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KCk7XG4gIEBPdXRwdXQoKSBmaWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlPigpO1xuXG4gIEBJbnB1dCgpIG9wdGlvbnMgPSB7fSBhcyBDcm9wcGVyT3B0aW9ucztcblxuICBnZXQgaW1hZ2VGaWxlKCk6IEZpbGUge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsRmlsZTtcbiAgfVxuXG4gIEBJbnB1dCgnaW1hZ2VGaWxlJykgc2V0IGltYWdlRmlsZSh2YWx1ZTogRmlsZSkge1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFVcmw7XG4gICAgdGhpcy5kZXN0cm95Q3JvcHBlcklmRXhpc3RzKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFsnaW1hZ2UvZ2lmJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcG5nJ10uaW5kZXhPZih2YWx1ZS50eXBlKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZmFpbC5lbWl0KG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBmaWxlIHR5cGUnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhVXJsID0gcmVhZGVyLnJlc3VsdDtcbiAgICB9O1xuXG4gICAgdGhpcy5vcmlnaW5hbEZpbGUgPSB2YWx1ZTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh0aGlzLm9yaWdpbmFsRmlsZSk7XG4gIH1cblxuICBASW5wdXQoJ2ltYWdlVXJsJykgc2V0IGltYWdlVXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5kYXRhVXJsO1xuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVVybCA9IHZhbHVlO1xuICB9XG5cbiAgZGF0YVVybDogc3RyaW5nfFNhZmVVcmw7XG4gIHByaXZhdGUgY3JvcHBlcjogQ3JvcHBlcjtcbiAgcHJpdmF0ZSBpc1JlYWR5OiBib29sZWFuO1xuICBwcml2YXRlIG9yaWdpbmFsRmlsZTogRmlsZTtcbiAgcHJpdmF0ZSBkYXRhID0ge30gYXMgQ3JvcHBlci5TZXREYXRhT3B0aW9ucztcblxuICBwcm9wYWdhdGVDaGFuZ2UgPSAodmFsdWU6IENyb3BwZXIuU2V0RGF0YU9wdGlvbnMpID0+IHZhbHVlO1xuXG4gIHdyaXRlVmFsdWUodmFsdWU6IENyb3BwZXIuU2V0RGF0YU9wdGlvbnMpIHtcbiAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5jcm9wcGVyKSB7XG4gICAgICB0aGlzLmNyb3BwZXIuc2V0RGF0YSh0aGlzLmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuICB9XG5cbiAgb25JbWFnZUxvYWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgaW1nID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG5cbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcblxuICAgIGlmICgodGhpcy5vcHRpb25zLm1pbkNyb3BXaWR0aCAmJiBpbWcubmF0dXJhbFdpZHRoIDwgdGhpcy5vcHRpb25zLm1pbkNyb3BXaWR0aClcbiAgICAgIHx8ICh0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCAmJiBpbWcubmF0dXJhbEhlaWdodCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wSGVpZ2h0KSkge1xuICAgICAgZGVsZXRlIHRoaXMuZGF0YVVybDtcbiAgICAgIHRoaXMuZmFpbC5lbWl0KG5ldyBFcnJvcignSW5wdXQgaW1hZ2UgaXMgdG9vIHNtYWxsJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuY3JvcHBlciA9IG5ldyBDcm9wcGVyKGltZywgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjcm9wOiB0aGlzLm9uQ3JvcC5iaW5kKHRoaXMpLFxuICAgICAgY3JvcG1vdmU6IHRoaXMub25Dcm9wTW92ZS5iaW5kKHRoaXMpLFxuICAgICAgY3JvcHN0YXJ0OiB0aGlzLm9uQ3JvcFN0YXJ0LmJpbmQodGhpcyksXG4gICAgICBjcm9wZW5kOiB0aGlzLm9uQ3JvcEVuZC5iaW5kKHRoaXMpLFxuICAgICAgcmVhZHk6IHRoaXMub25SZWFkeS5iaW5kKHRoaXMpLFxuICAgICAgem9vbTogdGhpcy5vblpvb20uYmluZCh0aGlzKSxcbiAgICB9LCB0aGlzLm9wdGlvbnMpKTtcblxuICAgIHRoaXMuaW5pdC5lbWl0KHRoaXMuY3JvcHBlcik7XG4gIH1cblxuICBwcml2YXRlIG9uQ3JvcChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZpZXdNb2RlICE9PSAwKSB7XG4gICAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUmVhZHkpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jcm9wLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3BNb3ZlKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmlld01vZGUgPT09IDApIHtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BNb3ZlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3BTdGFydChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIHRoaXMuY3JvcFN0YXJ0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3BFbmQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbGUoKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIHRoaXMuY3JvcEVuZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZWFkeShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLmNyb3BwZXIuc2V0RGF0YSh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5LmVtaXQoZXZlbnQpO1xuICAgIHRoaXMudXBkYXRlRmlsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblpvb20oZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLnpvb20uZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbGUoKSB7XG4gICAgbGV0IG5hbWUgPSAnY3JvcHBlZF9maWxlJztcblxuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdXJsUGFyYW1zID0gdGhpcy5kYXRhVXJsLnNwbGl0KCcvJyk7XG4gICAgICBuYW1lID0gdXJsUGFyYW1zW3VybFBhcmFtcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cblxuICAgIGNvbnN0IG1pbWVUeXBlID0gKHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zICYmIHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zLm1pbWVUeXBlKSB8fCAnaW1hZ2UvcG5nJztcbiAgICBjb25zdCBxdWFsaXR5QXJndW1lbnQgPSAodGhpcy5vcHRpb25zLm91dHB1dE9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm91dHB1dE9wdGlvbnMucXVhbGl0eUFyZ3VtZW50KSB8fCAwLjk7XG5cbiAgICB0aGlzLmNyb3BwZXIuZ2V0Q3JvcHBlZENhbnZhcygpLnRvQmxvYigoYmxvYjogYW55KSA9PiB7XG4gICAgICBibG9iLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgYmxvYi5uYW1lID0gdGhpcy5vcmlnaW5hbEZpbGUgPyB0aGlzLm9yaWdpbmFsRmlsZS5uYW1lIDogbmFtZTtcbiAgICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KGJsb2IpO1xuICAgIH0sIG1pbWVUeXBlLCBxdWFsaXR5QXJndW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3JyZWN0Q3JvcEFyZWEoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY3JvcHBlci5nZXREYXRhKCk7XG5cbiAgICBpZiAoZGF0YS5oZWlnaHQgPCB0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCB8fCBkYXRhLndpZHRoIDwgdGhpcy5vcHRpb25zLm1pbkNyb3BXaWR0aCkge1xuICAgICAgZGF0YS53aWR0aCA9IE1hdGgubWF4KGRhdGEud2lkdGgsIHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGggfHwgMCk7XG4gICAgICBkYXRhLmhlaWdodCA9IE1hdGgubWF4KGRhdGEuaGVpZ2h0LCB0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCB8fCAwKTtcbiAgICAgIHRoaXMuY3JvcHBlci5zZXREYXRhKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKCkge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JvcHBlci5nZXREYXRhKCk7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5kYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpIHtcbiAgICBpZiAoIXRoaXMuY3JvcHBlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3JvcHBlci5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuY3JvcHBlcjtcbiAgfVxuXG59XG4iXX0=