UNPKG

ngx-cropperjs-wrapper

Version:

This angular library is a wrapper of Javascript image cropper

380 lines (379 loc) 37.3 kB
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtY3JvcHBlcmpzLXdyYXBwZXIvIiwic291cmNlcyI6WyJsaWIvY3JvcHBlci9jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sT0FBTyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQXVDYixJQUFJLFlBQVksRUFBZTt3QkFDM0IsSUFBSSxZQUFZLEVBQWU7eUJBQzlCLElBQUksWUFBWSxFQUFlO3VCQUNqQyxJQUFJLFlBQVksRUFBZTtxQkFDakMsSUFBSSxZQUFZLEVBQWU7b0JBQ2hDLElBQUksWUFBWSxFQUFlO29CQUMvQixJQUFJLFlBQVksRUFBVztvQkFDM0IsSUFBSSxZQUFZLEVBQVM7MEJBQ25CLElBQUksWUFBWSxFQUFRO3lDQUU1QixFQUFvQjtzQ0EyQ3hCLEVBQTRCOytCQUV6QixVQUFDLEtBQTZCLElBQUssT0FBQSxLQUFLLEVBQUwsQ0FBSzs7SUEzQzFELHNCQUFJLHVDQUFTOzs7O1FBQWI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUMxQjs7Ozs7UUFFRCxVQUFrQyxLQUFXO1lBQTdDLGlCQW9CQztZQW5CQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDcEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFOUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNYLE1BQU0sQ0FBQzthQUNSO1lBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDLE9B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QUFDO1NBQzVCOzs7OztJQUdLLGlDQUFNOzs7O1FBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7OztJQUcxQixpREFBc0I7Ozs7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsQixNQUFNLENBQUM7U0FDUjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7Z0JBek52QixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFFBQVEsRUFBRSwrSUFHWDtvQkFDQyxNQUFNLEVBQUUsQ0FBQyxzeUlBUTJoSSxDQUFDO29CQUNyaUksU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLGdCQUFnQixFQUFoQixDQUFnQixDQUFDOzRCQUMvQyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7O3VCQUdFLE1BQU07MkJBQ04sTUFBTTs0QkFDTixNQUFNOzBCQUNOLE1BQU07d0JBQ04sTUFBTTt1QkFDTixNQUFNO3VCQUNOLE1BQU07dUJBQ04sTUFBTTs2QkFDTixNQUFNOzBCQUVOLEtBQUs7NEJBTUwsS0FBSyxTQUFDLFdBQVc7MkJBc0JqQixLQUFLLFNBQUMsVUFBVTs7MkJBL0VuQjs7U0F1Q2EsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IENyb3BwZXIgZnJvbSAnY3JvcHBlcmpzJztcbmltcG9ydCB7IFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBDcm9wcGVyT3V0cHV0T3B0aW9ucyB7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHF1YWxpdHlBcmd1bWVudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyb3BwZXJPcHRpb25zIGV4dGVuZHMgQ3JvcHBlci5PcHRpb25zIHtcbiAgbWluQ3JvcFdpZHRoOiBudW1iZXI7XG4gIG1pbkNyb3BIZWlnaHQ6IG51bWJlcjtcbiAgb3V0cHV0T3B0aW9uczogQ3JvcHBlck91dHB1dE9wdGlvbnM7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jcm9wcGVyJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY3JvcHBlci1jb21wb25lbnRcIiAqbmdJZj1cImRhdGFVcmxcIj5cbiAgPGltZyAjaW1hZ2UgYWx0PVwiaW1hZ2VcIiBbc3JjXT1cImRhdGFVcmxcIiAobG9hZCk9XCJvbkltYWdlTG9hZCgkZXZlbnQpXCIvPlxuPC9kaXY+XG5gLFxuICBzdHlsZXM6IFtgLmNyb3BwZXItY29tcG9uZW50IGltZ3ttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9OjpuZy1kZWVwey8qIVxuICogQ3JvcHBlci5qcyB2MS40LjBcbiAqIGh0dHBzOi8vZmVuZ3l1YW5jaGVuLmdpdGh1Yi5pby9jcm9wcGVyanNcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50IENoZW4gRmVuZ3l1YW5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTgtMDYtMDFUMTU6MTg6MDkuODkxWlxuICovfTo6bmctZGVlcCAuY3JvcHBlci1jb250YWluZXJ7ZGlyZWN0aW9uOmx0cjtmb250LXNpemU6MDtsaW5lLWhlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlO3RvdWNoLWFjdGlvbjpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX06Om5nLWRlZXAgLmNyb3BwZXItY29udGFpbmVyIGltZ3tkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO2ltYWdlLW9yaWVudGF0aW9uOjBkZWc7bWF4LWhlaWdodDpub25lIWltcG9ydGFudDttYXgtd2lkdGg6bm9uZSFpbXBvcnRhbnQ7bWluLWhlaWdodDowIWltcG9ydGFudDttaW4td2lkdGg6MCFpbXBvcnRhbnQ7d2lkdGg6MTAwJX06Om5nLWRlZXAgLmNyb3BwZXItY2FudmFzLDo6bmctZGVlcCAuY3JvcHBlci1jcm9wLWJveCw6Om5nLWRlZXAgLmNyb3BwZXItZHJhZy1ib3gsOjpuZy1kZWVwIC5jcm9wcGVyLW1vZGFsLDo6bmctZGVlcCAuY3JvcHBlci13cmFwLWJveHtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MH06Om5nLWRlZXAgLmNyb3BwZXItY2FudmFzLDo6bmctZGVlcCAuY3JvcHBlci13cmFwLWJveHtvdmVyZmxvdzpoaWRkZW59OjpuZy1kZWVwIC5jcm9wcGVyLWRyYWctYm94e2JhY2tncm91bmQtY29sb3I6I2ZmZjtvcGFjaXR5OjB9OjpuZy1kZWVwIC5jcm9wcGVyLW1vZGFse2JhY2tncm91bmQtY29sb3I6IzAwMDtvcGFjaXR5Oi41fTo6bmctZGVlcCAuY3JvcHBlci12aWV3LWJveHtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO291dGxpbmU6I2VlZSBzb2xpZCAxcHg7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWRhc2hlZHtib3JkZXI6MCBkYXNoZWQgI2VlZTtkaXNwbGF5OmJsb2NrO29wYWNpdHk6LjU7cG9zaXRpb246YWJzb2x1dGV9OjpuZy1kZWVwIC5jcm9wcGVyLWRhc2hlZC5kYXNoZWQtaHtib3JkZXItYm90dG9tLXdpZHRoOjFweDtib3JkZXItdG9wLXdpZHRoOjFweDtoZWlnaHQ6MzMuMzMzMzMlO2xlZnQ6MDt0b3A6MzMuMzMzMzMlO3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWRhc2hlZC5kYXNoZWQtdntib3JkZXItbGVmdC13aWR0aDoxcHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweDtoZWlnaHQ6MTAwJTtsZWZ0OjMzLjMzMzMzJTt0b3A6MDt3aWR0aDozMy4zMzMzMyV9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcntkaXNwbGF5OmJsb2NrO2hlaWdodDowO2xlZnQ6NTAlO29wYWNpdHk6Ljc1O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7d2lkdGg6MH06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmFmdGVyLDo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXI6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2VlZTtjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlfTo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXI6YmVmb3Jle2hlaWdodDoxcHg7bGVmdDotM3B4O3RvcDowO3dpZHRoOjdweH06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmFmdGVye2hlaWdodDo3cHg7bGVmdDowO3RvcDotM3B4O3dpZHRoOjFweH06Om5nLWRlZXAgLmNyb3BwZXItZmFjZSw6Om5nLWRlZXAgLmNyb3BwZXItbGluZSw6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnR7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtvcGFjaXR5Oi4xO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWZhY2V7YmFja2dyb3VuZC1jb2xvcjojZmZmO2xlZnQ6MDt0b3A6MH06Om5nLWRlZXAgLmNyb3BwZXItbGluZXtiYWNrZ3JvdW5kLWNvbG9yOiMzOWZ9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS1le2N1cnNvcjpldy1yZXNpemU7cmlnaHQ6LTNweDt0b3A6MDt3aWR0aDo1cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS1ue2N1cnNvcjpucy1yZXNpemU7aGVpZ2h0OjVweDtsZWZ0OjA7dG9wOi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS13e2N1cnNvcjpldy1yZXNpemU7bGVmdDotM3B4O3RvcDowO3dpZHRoOjVweH06Om5nLWRlZXAgLmNyb3BwZXItbGluZS5saW5lLXN7Ym90dG9tOi0zcHg7Y3Vyc29yOm5zLXJlc2l6ZTtoZWlnaHQ6NXB4O2xlZnQ6MH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnR7YmFja2dyb3VuZC1jb2xvcjojMzlmO2hlaWdodDo1cHg7b3BhY2l0eTouNzU7d2lkdGg6NXB4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1le2N1cnNvcjpldy1yZXNpemU7bWFyZ2luLXRvcDotM3B4O3JpZ2h0Oi0zcHg7dG9wOjUwJX06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtbntjdXJzb3I6bnMtcmVzaXplO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi0zcHg7dG9wOi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXd7Y3Vyc29yOmV3LXJlc2l6ZTtsZWZ0Oi0zcHg7bWFyZ2luLXRvcDotM3B4O3RvcDo1MCV9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXN7Ym90dG9tOi0zcHg7Y3Vyc29yOnMtcmVzaXplO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi0zcHh9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LW5le2N1cnNvcjpuZXN3LXJlc2l6ZTtyaWdodDotM3B4O3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1ud3tjdXJzb3I6bndzZS1yZXNpemU7bGVmdDotM3B4O3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zd3tib3R0b206LTNweDtjdXJzb3I6bmVzdy1yZXNpemU7bGVmdDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZXtib3R0b206LTNweDtjdXJzb3I6bndzZS1yZXNpemU7aGVpZ2h0OjIwcHg7b3BhY2l0eToxO3JpZ2h0Oi0zcHg7d2lkdGg6MjBweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDoxNXB4O3dpZHRoOjE1cHh9fUBtZWRpYSAobWluLXdpZHRoOjk5MnB4KXs6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7aGVpZ2h0OjEwcHg7d2lkdGg6MTBweH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXs6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7aGVpZ2h0OjVweDtvcGFjaXR5Oi43NTt3aWR0aDo1cHh9fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojMzlmO2JvdHRvbTotNTAlO2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjIwMCU7b3BhY2l0eTowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi01MCU7d2lkdGg6MjAwJX06Om5nLWRlZXAgLmNyb3BwZXItaW52aXNpYmxle29wYWNpdHk6MH06Om5nLWRlZXAgLmNyb3BwZXItYmd7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQVFNQUFBQWxQVzBpQUFBQUEzTkNTVlFJQ0FqYjRVL2dBQUFBQmxCTVZFWE16TXovLy8vVGpSVjJBQUFBQ1hCSVdYTUFBQXJyQUFBSzZ3R0NpdzFhQUFBQUhIUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkdhWEpsZDI5eWEzTWdRMU0yNkx5eWpBQUFBQkZKUkVGVUNKbGorTS9BZ0JWaEYvMFBBSDYvRC9Ia0R4T0dBQUFBQUVsRlRrU3VRbUNDKX06Om5nLWRlZXAgLmNyb3BwZXItaGlkZXtkaXNwbGF5OmJsb2NrO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWhpZGRlbntkaXNwbGF5Om5vbmUhaW1wb3J0YW50fTo6bmctZGVlcCAuY3JvcHBlci1tb3Zle2N1cnNvcjptb3ZlfTo6bmctZGVlcCAuY3JvcHBlci1jcm9we2N1cnNvcjpjcm9zc2hhaXJ9OjpuZy1kZWVwIC5jcm9wcGVyLWRpc2FibGVkIC5jcm9wcGVyLWRyYWctYm94LDo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1mYWNlLDo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1saW5lLDo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1wb2ludHtjdXJzb3I6bm90LWFsbG93ZWR9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUsOjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LDo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2VlZX1gXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDcm9wcGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQE91dHB1dCgpIGNyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY3JvcE1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY3JvcFN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgem9vbSA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBpbml0ID0gbmV3IEV2ZW50RW1pdHRlcjxDcm9wcGVyPigpO1xuICBAT3V0cHV0KCkgZmFpbCA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KCk7XG4gIEBPdXRwdXQoKSBmaWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlPigpO1xuXG4gIEBJbnB1dCgpIG9wdGlvbnMgPSB7fSBhcyBDcm9wcGVyT3B0aW9ucztcblxuICBnZXQgaW1hZ2VGaWxlKCk6IEZpbGUge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsRmlsZTtcbiAgfVxuXG4gIEBJbnB1dCgnaW1hZ2VGaWxlJykgc2V0IGltYWdlRmlsZSh2YWx1ZTogRmlsZSkge1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFVcmw7XG4gICAgdGhpcy5kZXN0cm95Q3JvcHBlcklmRXhpc3RzKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFsnaW1hZ2UvZ2lmJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcG5nJ10uaW5kZXhPZih2YWx1ZS50eXBlKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZmFpbC5lbWl0KG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBmaWxlIHR5cGUnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhVXJsID0gcmVhZGVyLnJlc3VsdDtcbiAgICB9O1xuXG4gICAgdGhpcy5vcmlnaW5hbEZpbGUgPSB2YWx1ZTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh0aGlzLm9yaWdpbmFsRmlsZSk7XG4gIH1cblxuICBASW5wdXQoJ2ltYWdlVXJsJykgc2V0IGltYWdlVXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5kYXRhVXJsO1xuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVVybCA9IHZhbHVlO1xuICB9XG5cbiAgZGF0YVVybDogc3RyaW5nfFNhZmVVcmw7XG4gIHByaXZhdGUgY3JvcHBlcjogQ3JvcHBlcjtcbiAgcHJpdmF0ZSBpc1JlYWR5OiBib29sZWFuO1xuICBwcml2YXRlIG9yaWdpbmFsRmlsZTogRmlsZTtcbiAgcHJpdmF0ZSBkYXRhID0ge30gYXMgQ3JvcHBlci5TZXREYXRhT3B0aW9ucztcblxuICBwcm9wYWdhdGVDaGFuZ2UgPSAodmFsdWU6IENyb3BwZXIuU2V0RGF0YU9wdGlvbnMpID0+IHZhbHVlO1xuXG4gIHdyaXRlVmFsdWUodmFsdWU6IENyb3BwZXIuU2V0RGF0YU9wdGlvbnMpIHtcbiAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5jcm9wcGVyKSB7XG4gICAgICB0aGlzLmNyb3BwZXIuc2V0RGF0YSh0aGlzLmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuICB9XG5cbiAgb25JbWFnZUxvYWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgaW1nID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG5cbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcblxuICAgIGlmICgodGhpcy5vcHRpb25zLm1pbkNyb3BXaWR0aCAmJiBpbWcubmF0dXJhbFdpZHRoIDwgdGhpcy5vcHRpb25zLm1pbkNyb3BXaWR0aClcbiAgICAgIHx8ICh0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCAmJiBpbWcubmF0dXJhbEhlaWdodCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wSGVpZ2h0KSkge1xuICAgICAgZGVsZXRlIHRoaXMuZGF0YVVybDtcbiAgICAgIHRoaXMuZmFpbC5lbWl0KG5ldyBFcnJvcignSW5wdXQgaW1hZ2UgaXMgdG9vIHNtYWxsJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuY3JvcHBlciA9IG5ldyBDcm9wcGVyKGltZywgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjcm9wOiB0aGlzLm9uQ3JvcC5iaW5kKHRoaXMpLFxuICAgICAgY3JvcG1vdmU6IHRoaXMub25Dcm9wTW92ZS5iaW5kKHRoaXMpLFxuICAgICAgY3JvcHN0YXJ0OiB0aGlzLm9uQ3JvcFN0YXJ0LmJpbmQodGhpcyksXG4gICAgICBjcm9wZW5kOiB0aGlzLm9uQ3JvcEVuZC5iaW5kKHRoaXMpLFxuICAgICAgcmVhZHk6IHRoaXMub25SZWFkeS5iaW5kKHRoaXMpLFxuICAgICAgem9vbTogdGhpcy5vblpvb20uYmluZCh0aGlzKSxcbiAgICB9LCB0aGlzLm9wdGlvbnMpKTtcblxuICAgIHRoaXMuaW5pdC5lbWl0KHRoaXMuY3JvcHBlcik7XG4gIH1cblxuICBwcml2YXRlIG9uQ3JvcChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZpZXdNb2RlICE9PSAwKSB7XG4gICAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUmVhZHkpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jcm9wLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3BNb3ZlKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmlld01vZGUgPT09IDApIHtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BNb3ZlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3BTdGFydChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIHRoaXMuY3JvcFN0YXJ0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3BFbmQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbGUoKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIHRoaXMuY3JvcEVuZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZWFkeShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLmNyb3BwZXIuc2V0RGF0YSh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5LmVtaXQoZXZlbnQpO1xuICAgIHRoaXMudXBkYXRlRmlsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblpvb20oZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLnpvb20uZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbGUoKSB7XG4gICAgbGV0IG5hbWUgPSAnY3JvcHBlZF9maWxlJztcblxuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdXJsUGFyYW1zID0gdGhpcy5kYXRhVXJsLnNwbGl0KCcvJyk7XG4gICAgICBuYW1lID0gdXJsUGFyYW1zW3VybFBhcmFtcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cblxuICAgIGNvbnN0IG1pbWVUeXBlID0gKHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zICYmIHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zLm1pbWVUeXBlKSB8fCAnaW1hZ2UvcG5nJztcbiAgICBjb25zdCBxdWFsaXR5QXJndW1lbnQgPSAodGhpcy5vcHRpb25zLm91dHB1dE9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm91dHB1dE9wdGlvbnMucXVhbGl0eUFyZ3VtZW50KSB8fCAwLjk7XG5cbiAgICB0aGlzLmNyb3BwZXIuZ2V0Q3JvcHBlZENhbnZhcygpLnRvQmxvYigoYmxvYjogYW55KSA9PiB7XG4gICAgICBibG9iLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgYmxvYi5uYW1lID0gdGhpcy5vcmlnaW5hbEZpbGUgPyB0aGlzLm9yaWdpbmFsRmlsZS5uYW1lIDogbmFtZTtcbiAgICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KGJsb2IpO1xuICAgIH0sIG1pbWVUeXBlLCBxdWFsaXR5QXJndW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3JyZWN0Q3JvcEFyZWEoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY3JvcHBlci5nZXREYXRhKCk7XG5cbiAgICBpZiAoZGF0YS5oZWlnaHQgPCB0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCB8fCBkYXRhLndpZHRoIDwgdGhpcy5vcHRpb25zLm1pbkNyb3BXaWR0aCkge1xuICAgICAgZGF0YS53aWR0aCA9IE1hdGgubWF4KGRhdGEud2lkdGgsIHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGggfHwgMCk7XG4gICAgICBkYXRhLmhlaWdodCA9IE1hdGgubWF4KGRhdGEuaGVpZ2h0LCB0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCB8fCAwKTtcbiAgICAgIHRoaXMuY3JvcHBlci5zZXREYXRhKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKCkge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JvcHBlci5nZXREYXRhKCk7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5kYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpIHtcbiAgICBpZiAoIXRoaXMuY3JvcHBlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3JvcHBlci5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuY3JvcHBlcjtcbiAgfVxuXG59XG4iXX0=