UNPKG

mc-image-editor

Version:

An image editor library for magic-cut app (http://www.magic-cut.in/)

271 lines 40.7 kB
import { Component, Input, Output, ElementRef, HostListener, ViewChild, EventEmitter, ChangeDetectionStrategy, } from '@angular/core'; import * as _ from 'lodash'; import { ImageEditorService } from '../../services/image-editor.service'; export class ImageCropperComponent { constructor(editor, el) { this.editor = editor; this.el = el; this.imagePosition = { x: 0, y: 0 }; this.originalImageDimensions = { width: 0, height: 0 }; this.imageDimensions = { width: 0, height: 0 }; this.zoomConfig = { value: 1, max: 4 }; this.configChange = new EventEmitter(); } set image(value) { this.initImageCrop(value); } set zoom(value) { this.editable.ready.subscribe(() => { this.setZoom(value); }); } get zoom() { return this.zoomConfig.value; } set top(value) { this.editable.ready.subscribe(() => { this.imagePosition.y = 0; this.moveDelta = { y: 0, x: this.imagePosition.x }; this.move({ clientY: parseInt(value, 10), clientX: this.imagePosition.x, }); delete this.moveDelta; }); } get top() { return this.imagePosition.y; } set left(value) { this.editable.ready.subscribe(() => { this.imagePosition.x = 0; this.moveDelta = { x: 0, y: this.imagePosition.y }; this.move({ clientX: parseInt(value, 10), clientY: this.imagePosition.y, }); delete this.moveDelta; }); } get left() { return this.imagePosition.x; } set maxZoom(value) { this.zoomConfig.max = parseFloat(value); } get maxZoom() { return this.zoomConfig.max; } triggerMove() { window.addEventListener('mousemove', this.eventListeners.mousemove, false); window.addEventListener('mouseup', this.eventListeners.mouseup, false); return false; } initImageCrop(image) { this.editable = this.editor.edit(image); this.editable.ready.subscribe(() => { const previewDimensions = this.getComputedDimensions(this.el.nativeElement); const fittingDimensions = this.fitArea({ width: this.cropWidth, height: this.cropHeight }, { width: previewDimensions.width, height: previewDimensions.height }); const { vborder, hborder } = this.addTransparentBorder(previewDimensions, fittingDimensions); this.borders = { vborder, hborder }; const fillingDimensions = this.fillArea({ width: this.editable.image.width, height: this.editable.image.height, }, { width: fittingDimensions.width, height: fittingDimensions.height }); this.editable.canvas.width = this.cropWidth; this.editable.canvas.height = this.cropHeight; this.previewImage.nativeElement.src = this.editable.image.src; const img = this.previewImage.nativeElement; img.style.left = hborder + (fittingDimensions.width - fillingDimensions.width) / 2 + 'px'; img.style.top = vborder + (fittingDimensions.height - fillingDimensions.height) / 2 + 'px'; img.style.width = fillingDimensions.width + 'px'; img.style.height = fillingDimensions.height + 'px'; this.originalImageDimensions = fillingDimensions; this.imageDimensions.width = fillingDimensions.width; this.imageDimensions.height = fillingDimensions.height; this.cropDimensions = fittingDimensions; this.imagePosition = { x: hborder + (fittingDimensions.width - fillingDimensions.width) / 2, y: vborder + (fittingDimensions.height - fillingDimensions.height) / 2, }; }); this.eventListeners = { mousemove: this.move.bind(this), mouseup: this.stopMove.bind(this), }; } move(e) { if (!this.moveDelta) { this.moveDelta = { x: e.clientX, y: e.clientY }; } this.imagePosition.x += e.clientX - this.moveDelta.x; this.imagePosition.y += e.clientY - this.moveDelta.y; this.moveDelta.x = e.clientX; this.moveDelta.y = e.clientY; const correctedPosition = this.getCorrectedPosition(this.imagePosition); this.previewImage.nativeElement.style.left = correctedPosition.x + 'px'; this.imagePosition.x = correctedPosition.x; this.previewImage.nativeElement.style.top = correctedPosition.y + 'px'; this.imagePosition.y = correctedPosition.y; return false; } setZoom(value) { let parsedValue = parseFloat(value); if (parsedValue <= 0) { parsedValue = 1; } if (parsedValue > this.zoomConfig.max) { parsedValue = this.zoomConfig.max; } this.zoomConfig.value = parsedValue; const newDimensions = { width: this.originalImageDimensions.width * this.zoomConfig.value, height: this.originalImageDimensions.height * this.zoomConfig.value, }; const hdiff = newDimensions.width - this.imageDimensions.width; const vdiff = newDimensions.height - this.imageDimensions.height; this.imageDimensions.width = newDimensions.width; this.imageDimensions.height = newDimensions.height; const img = this.previewImage.nativeElement; img.style.width = newDimensions.width + 'px'; img.style.height = newDimensions.height + 'px'; const correctedPosition = this.getCorrectedPosition({ x: this.imagePosition.x - hdiff / 2, y: this.imagePosition.y - vdiff / 2, }); img.style.left = correctedPosition.x + 'px'; img.style.top = correctedPosition.y + 'px'; this.imagePosition.x = correctedPosition.x; this.imagePosition.y = correctedPosition.y; img.className = 'zooming'; let finishTransition; finishTransition = () => { img.className = ''; img.removeEventListener('transitionend', finishTransition); this.configChange.emit({ left: this.imagePosition.x, top: this.imagePosition.y, zoom: this.zoom, }); }; img.addEventListener('transitionend', finishTransition); } getBlob() { this.crop(); return this.editable.getBlob(); } getDataURL() { this.crop(); return this.editable.getDataURL(); } crop() { const proportions = this.imageDimensions.width / this.editable.image.width; const sx = (this.borders.hborder - this.imagePosition.x) / proportions; const sy = (this.borders.vborder - this.imagePosition.y) / proportions; const sw = this.cropDimensions.width / proportions; const sh = sw / (this.cropWidth / this.cropHeight); this.editable.apply('crop', sx, sy, sw, sh, 0, 0, this.cropWidth, this.cropHeight); } getCorrectedPosition(pos) { const corrected = { x: 0, y: 0 }; const hdiff = this.cropDimensions.width - this.imageDimensions.width; const vdiff = this.cropDimensions.height - this.imageDimensions.height; if (pos.x < this.borders.hborder) { if (pos.x < this.borders.hborder + hdiff) { corrected.x = this.borders.hborder + hdiff; } else { corrected.x = pos.x; } } else { corrected.x = this.borders.hborder; } if (pos.y < this.borders.vborder) { if (pos.y < this.borders.vborder + vdiff) { corrected.y = this.borders.vborder + vdiff; } else { corrected.y = pos.y; } } else { corrected.y = this.borders.vborder; } return corrected; } stopMove() { delete this.moveDelta; window.removeEventListener('mousemove', this.eventListeners.mousemove); window.removeEventListener('mouseup', this.eventListeners.mouseup); this.configChange.emit({ left: this.imagePosition.x, top: this.imagePosition.y, zoom: this.zoom, }); return false; } fitArea(object, area) { const ph = object.height / area.height; const pw = object.width / area.width; const scale = ph > pw ? ph : pw; return { width: object.width / scale, height: object.height / scale }; } fillArea(object, area) { const ph = object.height / area.height; const pw = object.width / area.width; const scale = ph > pw ? pw : ph; return { width: object.width / scale, height: object.height / scale }; } addTransparentBorder(previewDimensions, fittingDimensions) { const vborder = (previewDimensions.height - fittingDimensions.height) / 2; const hborder = (previewDimensions.width - fittingDimensions.width) / 2; const borderElement = _(this.el.nativeElement.childNodes).find((c) => !!c.className && c.className.indexOf('border') >= 0); const cs = window.getComputedStyle(borderElement); if (borderElement) { borderElement.style.borderBottomWidth = vborder + 'px'; borderElement.style.borderTopWidth = vborder + 'px'; borderElement.style.borderLeftWidth = hborder + 'px'; borderElement.style.borderRightWidth = hborder + 'px'; } return { vborder, hborder }; } getComputedDimensions(element) { const cs = window.getComputedStyle(element); return { width: parseInt(cs.width, 10), height: parseInt(cs.height, 10), }; } } ImageCropperComponent.decorators = [ { type: Component, args: [{ selector: 'mc-image-cropper', template: "<img #previewImage />\n<div class=\"border\"></div>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: [".border{box-sizing:border-box;height:100%;left:0;position:absolute;top:0;width:100%}:host{cursor:move;display:block;overflow:hidden;position:relative}img{position:absolute}img.zooming{transition:width .3s,height .3s,top .3s,left .3s}/deep/ .border{border:0 solid rgba(0,0,0,.3)}"] },] } ]; ImageCropperComponent.ctorParameters = () => [ { type: ImageEditorService }, { type: ElementRef } ]; ImageCropperComponent.propDecorators = { configChange: [{ type: Output }], image: [{ type: Input, args: ['src',] }], cropWidth: [{ type: Input }], cropHeight: [{ type: Input }], zoom: [{ type: Input }], top: [{ type: Input }], left: [{ type: Input }], maxZoom: [{ type: Input }], previewImage: [{ type: ViewChild, args: ['previewImage',] }], triggerMove: [{ type: HostListener, args: ['mousedown',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYy1pbWFnZS1lZGl0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW1hZ2UtY3JvcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksRUFDWix1QkFBdUIsR0FDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFTekUsTUFBTSxPQUFPLHFCQUFxQjtJQTJFaEMsWUFBb0IsTUFBMEIsRUFBVSxFQUFjO1FBQWxELFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQXhFOUQsa0JBQWEsR0FBNkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN6RCw0QkFBdUIsR0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzdELG9CQUFlLEdBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUs3RCxlQUFVLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUd4QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUE4RDZCLENBQUM7SUE3RDFFLElBQWtCLEtBQUssQ0FBQyxLQUFXO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUtELElBQWEsSUFBSSxDQUFDLEtBQVU7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQWEsR0FBRyxDQUFDLEtBQVU7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDUixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDaEIsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFhLElBQUksQ0FBQyxLQUFVO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2hCLENBQUMsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBYSxPQUFPLENBQUMsS0FBVTtRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDN0IsQ0FBQztJQUlpQyxXQUFXO1FBQzNDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFJRCxhQUFhLENBQUMsS0FBVztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDakMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQ2xELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUN0QixDQUFDO1lBQ0YsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNwQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ2xELEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQ3JFLENBQUM7WUFFRixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FDcEQsaUJBQWlCLEVBQ2pCLGlCQUFpQixDQUNsQixDQUFDO1lBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUVwQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQ3JDO2dCQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLO2dCQUNoQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTTthQUNuQyxFQUNELEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQ3JFLENBQUM7WUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUU5QyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1lBRTVDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSTtnQkFDWixPQUFPO29CQUNQLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7b0JBQ3ZELElBQUksQ0FBQztZQUNQLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDWCxPQUFPO29CQUNQLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7b0JBQ3pELElBQUksQ0FBQztZQUNQLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDakQsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUVuRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7WUFFakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUV2RCxJQUFJLENBQUMsY0FBYyxHQUFHLGlCQUFpQixDQUFDO1lBRXhDLElBQUksQ0FBQyxhQUFhLEdBQUc7Z0JBQ25CLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDcEUsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ3ZFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMvQixPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBRU0sSUFBSSxDQUFDLENBQWE7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDakQ7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRTdCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFM0MsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRTtZQUNwQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO1FBQ0QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDckMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBRXBDLE1BQU0sYUFBYSxHQUFHO1lBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztZQUNqRSxNQUFNLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUs7U0FDcEUsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDL0QsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUVqRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFFbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7UUFFNUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDN0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFL0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDbEQsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDO1lBQ25DLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQztTQUNwQyxDQUFDLENBQUM7UUFFSCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLGlCQUFpQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUUzQyxHQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUUxQixJQUFJLGdCQUErQixDQUFDO1FBQ3BDLGdCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUN0QixHQUFHLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTthQUNoQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixHQUFHLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVTLElBQUk7UUFDWixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFM0UsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUN2RSxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3ZFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztRQUNuRCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDakIsTUFBTSxFQUNOLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixDQUFDLEVBQ0QsQ0FBQyxFQUNELElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxHQUc5QjtRQUNDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDckUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFFdkUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2hDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUU7Z0JBQ3hDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNMLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNyQjtTQUNGO2FBQU07WUFDTCxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2hDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUU7Z0JBQ3hDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNMLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNyQjtTQUNGO2FBQU07WUFDTCxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ3BDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVTLFFBQVE7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRXRCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUyxPQUFPLENBQUMsTUFBaUIsRUFBRSxJQUFlO1FBQ2xELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUN4RSxDQUFDO0lBRVMsUUFBUSxDQUFDLE1BQWlCLEVBQUUsSUFBZTtRQUNuRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDeEUsQ0FBQztJQUVTLG9CQUFvQixDQUM1QixpQkFBNEIsRUFDNUIsaUJBQTRCO1FBRTVCLE1BQU0sT0FBTyxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRSxNQUFNLE9BQU8sR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FDNUQsQ0FBQyxDQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDeEUsQ0FBQztRQUVGLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUF3QixDQUFDLENBQUM7UUFFN0QsSUFBSSxhQUFhLEVBQUU7WUFDakIsYUFBYSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3ZELGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFFcEQsYUFBYSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNyRCxhQUFhLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDdkQ7UUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxPQUFvQjtRQUNsRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTztZQUNMLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUM7WUFDdkMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBZ0IsRUFBRSxFQUFFLENBQUM7U0FDMUMsQ0FBQztJQUNKLENBQUM7OztZQW5WRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsaUVBQTZDO2dCQUU3QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQVJRLGtCQUFrQjtZQVJ6QixVQUFVOzs7MkJBOEJULE1BQU07b0JBQ04sS0FBSyxTQUFDLEtBQUs7d0JBSVgsS0FBSzt5QkFDTCxLQUFLO21CQUVMLEtBQUs7a0JBU0wsS0FBSzttQkFlTCxLQUFLO3NCQWVMLEtBQUs7MkJBT0wsU0FBUyxTQUFDLGNBQWM7MEJBRXhCLFlBQVksU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEltYWdlRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ltYWdlLWVkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRhYmxlSW1hZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWRpdGFibGUtaW1hZ2Uuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21jLWltYWdlLWNyb3BwZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtY3JvcHBlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltYWdlLWNyb3BwZXIuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VDcm9wcGVyQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBib3JkZXJzOiB7IHZib3JkZXI6IG51bWJlcjsgaGJvcmRlcjogbnVtYmVyIH07XG4gIHByaXZhdGUgbW92ZURlbHRhOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIHByaXZhdGUgaW1hZ2VQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0geyB4OiAwLCB5OiAwIH07XG4gIHByaXZhdGUgb3JpZ2luYWxJbWFnZURpbWVuc2lvbnM6IERpbWVuc2lvbiA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICBwcml2YXRlIGltYWdlRGltZW5zaW9uczogRGltZW5zaW9uID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gIHByaXZhdGUgY3JvcERpbWVuc2lvbnM6IERpbWVuc2lvbjtcbiAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogeyBtb3VzZW1vdmU6IEV2ZW50TGlzdGVuZXI7IG1vdXNldXA6IEV2ZW50TGlzdGVuZXIgfTtcblxuICBlZGl0YWJsZTogRWRpdGFibGVJbWFnZVNlcnZpY2U7XG4gIHpvb21Db25maWcgPSB7IHZhbHVlOiAxLCBtYXg6IDQgfTtcbiAgaW1nOiBCbG9iO1xuXG4gIEBPdXRwdXQoKSBjb25maWdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgnc3JjJykgc2V0IGltYWdlKHZhbHVlOiBCbG9iKSB7XG4gICAgdGhpcy5pbml0SW1hZ2VDcm9wKHZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGNyb3BXaWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBjcm9wSGVpZ2h0OiBudW1iZXI7XG5cbiAgQElucHV0KCkgc2V0IHpvb20odmFsdWU6IGFueSkge1xuICAgIHRoaXMuZWRpdGFibGUucmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0Wm9vbSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHpvb20oKSB7XG4gICAgcmV0dXJuIHRoaXMuem9vbUNvbmZpZy52YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0b3AodmFsdWU6IGFueSkge1xuICAgIHRoaXMuZWRpdGFibGUucmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaW1hZ2VQb3NpdGlvbi55ID0gMDtcbiAgICAgIHRoaXMubW92ZURlbHRhID0geyB5OiAwLCB4OiB0aGlzLmltYWdlUG9zaXRpb24ueCB9O1xuICAgICAgdGhpcy5tb3ZlKHtcbiAgICAgICAgY2xpZW50WTogcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgICAgICAgY2xpZW50WDogdGhpcy5pbWFnZVBvc2l0aW9uLngsXG4gICAgICB9IGFzIE1vdXNlRXZlbnQpO1xuICAgICAgZGVsZXRlIHRoaXMubW92ZURlbHRhO1xuICAgIH0pO1xuICB9XG4gIGdldCB0b3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VQb3NpdGlvbi55O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGxlZnQodmFsdWU6IGFueSkge1xuICAgIHRoaXMuZWRpdGFibGUucmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaW1hZ2VQb3NpdGlvbi54ID0gMDtcbiAgICAgIHRoaXMubW92ZURlbHRhID0geyB4OiAwLCB5OiB0aGlzLmltYWdlUG9zaXRpb24ueSB9O1xuICAgICAgdGhpcy5tb3ZlKHtcbiAgICAgICAgY2xpZW50WDogcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgICAgICAgY2xpZW50WTogdGhpcy5pbWFnZVBvc2l0aW9uLnksXG4gICAgICB9IGFzIE1vdXNlRXZlbnQpO1xuICAgICAgZGVsZXRlIHRoaXMubW92ZURlbHRhO1xuICAgIH0pO1xuICB9XG4gIGdldCBsZWZ0KCkge1xuICAgIHJldHVybiB0aGlzLmltYWdlUG9zaXRpb24ueDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtYXhab29tKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnpvb21Db25maWcubWF4ID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIH1cbiAgZ2V0IG1heFpvb20oKSB7XG4gICAgcmV0dXJuIHRoaXMuem9vbUNvbmZpZy5tYXg7XG4gIH1cblxuICBAVmlld0NoaWxkKCdwcmV2aWV3SW1hZ2UnKSBwcmV2aWV3SW1hZ2U6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJykgcHVibGljIHRyaWdnZXJNb3ZlKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmV2ZW50TGlzdGVuZXJzLm1vdXNlbW92ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ldmVudExpc3RlbmVycy5tb3VzZXVwLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlZGl0b3I6IEltYWdlRWRpdG9yU2VydmljZSwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZikge31cblxuICBpbml0SW1hZ2VDcm9wKGltYWdlOiBCbG9iKSB7XG4gICAgdGhpcy5lZGl0YWJsZSA9IHRoaXMuZWRpdG9yLmVkaXQoaW1hZ2UpO1xuICAgIHRoaXMuZWRpdGFibGUucmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHByZXZpZXdEaW1lbnNpb25zID0gdGhpcy5nZXRDb21wdXRlZERpbWVuc2lvbnMoXG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZpdHRpbmdEaW1lbnNpb25zID0gdGhpcy5maXRBcmVhKFxuICAgICAgICB7IHdpZHRoOiB0aGlzLmNyb3BXaWR0aCwgaGVpZ2h0OiB0aGlzLmNyb3BIZWlnaHQgfSxcbiAgICAgICAgeyB3aWR0aDogcHJldmlld0RpbWVuc2lvbnMud2lkdGgsIGhlaWdodDogcHJldmlld0RpbWVuc2lvbnMuaGVpZ2h0IH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHsgdmJvcmRlciwgaGJvcmRlciB9ID0gdGhpcy5hZGRUcmFuc3BhcmVudEJvcmRlcihcbiAgICAgICAgcHJldmlld0RpbWVuc2lvbnMsXG4gICAgICAgIGZpdHRpbmdEaW1lbnNpb25zXG4gICAgICApO1xuICAgICAgdGhpcy5ib3JkZXJzID0geyB2Ym9yZGVyLCBoYm9yZGVyIH07XG5cbiAgICAgIGNvbnN0IGZpbGxpbmdEaW1lbnNpb25zID0gdGhpcy5maWxsQXJlYShcbiAgICAgICAge1xuICAgICAgICAgIHdpZHRoOiB0aGlzLmVkaXRhYmxlLmltYWdlLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogdGhpcy5lZGl0YWJsZS5pbWFnZS5oZWlnaHQsXG4gICAgICAgIH0sXG4gICAgICAgIHsgd2lkdGg6IGZpdHRpbmdEaW1lbnNpb25zLndpZHRoLCBoZWlnaHQ6IGZpdHRpbmdEaW1lbnNpb25zLmhlaWdodCB9XG4gICAgICApO1xuXG4gICAgICB0aGlzLmVkaXRhYmxlLmNhbnZhcy53aWR0aCA9IHRoaXMuY3JvcFdpZHRoO1xuICAgICAgdGhpcy5lZGl0YWJsZS5jYW52YXMuaGVpZ2h0ID0gdGhpcy5jcm9wSGVpZ2h0O1xuXG4gICAgICB0aGlzLnByZXZpZXdJbWFnZS5uYXRpdmVFbGVtZW50LnNyYyA9IHRoaXMuZWRpdGFibGUuaW1hZ2Uuc3JjO1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5wcmV2aWV3SW1hZ2UubmF0aXZlRWxlbWVudDtcblxuICAgICAgaW1nLnN0eWxlLmxlZnQgPVxuICAgICAgICBoYm9yZGVyICtcbiAgICAgICAgKGZpdHRpbmdEaW1lbnNpb25zLndpZHRoIC0gZmlsbGluZ0RpbWVuc2lvbnMud2lkdGgpIC8gMiArXG4gICAgICAgICdweCc7XG4gICAgICBpbWcuc3R5bGUudG9wID1cbiAgICAgICAgdmJvcmRlciArXG4gICAgICAgIChmaXR0aW5nRGltZW5zaW9ucy5oZWlnaHQgLSBmaWxsaW5nRGltZW5zaW9ucy5oZWlnaHQpIC8gMiArXG4gICAgICAgICdweCc7XG4gICAgICBpbWcuc3R5bGUud2lkdGggPSBmaWxsaW5nRGltZW5zaW9ucy53aWR0aCArICdweCc7XG4gICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gZmlsbGluZ0RpbWVuc2lvbnMuaGVpZ2h0ICsgJ3B4JztcblxuICAgICAgdGhpcy5vcmlnaW5hbEltYWdlRGltZW5zaW9ucyA9IGZpbGxpbmdEaW1lbnNpb25zO1xuXG4gICAgICB0aGlzLmltYWdlRGltZW5zaW9ucy53aWR0aCA9IGZpbGxpbmdEaW1lbnNpb25zLndpZHRoO1xuICAgICAgdGhpcy5pbWFnZURpbWVuc2lvbnMuaGVpZ2h0ID0gZmlsbGluZ0RpbWVuc2lvbnMuaGVpZ2h0O1xuXG4gICAgICB0aGlzLmNyb3BEaW1lbnNpb25zID0gZml0dGluZ0RpbWVuc2lvbnM7XG5cbiAgICAgIHRoaXMuaW1hZ2VQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogaGJvcmRlciArIChmaXR0aW5nRGltZW5zaW9ucy53aWR0aCAtIGZpbGxpbmdEaW1lbnNpb25zLndpZHRoKSAvIDIsXG4gICAgICAgIHk6IHZib3JkZXIgKyAoZml0dGluZ0RpbWVuc2lvbnMuaGVpZ2h0IC0gZmlsbGluZ0RpbWVuc2lvbnMuaGVpZ2h0KSAvIDIsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IHtcbiAgICAgIG1vdXNlbW92ZTogdGhpcy5tb3ZlLmJpbmQodGhpcyksXG4gICAgICBtb3VzZXVwOiB0aGlzLnN0b3BNb3ZlLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMubW92ZURlbHRhKSB7XG4gICAgICB0aGlzLm1vdmVEZWx0YSA9IHsgeDogZS5jbGllbnRYLCB5OiBlLmNsaWVudFkgfTtcbiAgICB9XG5cbiAgICB0aGlzLmltYWdlUG9zaXRpb24ueCArPSBlLmNsaWVudFggLSB0aGlzLm1vdmVEZWx0YS54O1xuICAgIHRoaXMuaW1hZ2VQb3NpdGlvbi55ICs9IGUuY2xpZW50WSAtIHRoaXMubW92ZURlbHRhLnk7XG5cbiAgICB0aGlzLm1vdmVEZWx0YS54ID0gZS5jbGllbnRYO1xuICAgIHRoaXMubW92ZURlbHRhLnkgPSBlLmNsaWVudFk7XG5cbiAgICBjb25zdCBjb3JyZWN0ZWRQb3NpdGlvbiA9IHRoaXMuZ2V0Q29ycmVjdGVkUG9zaXRpb24odGhpcy5pbWFnZVBvc2l0aW9uKTtcblxuICAgIHRoaXMucHJldmlld0ltYWdlLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGNvcnJlY3RlZFBvc2l0aW9uLnggKyAncHgnO1xuICAgIHRoaXMuaW1hZ2VQb3NpdGlvbi54ID0gY29ycmVjdGVkUG9zaXRpb24ueDtcblxuICAgIHRoaXMucHJldmlld0ltYWdlLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gY29ycmVjdGVkUG9zaXRpb24ueSArICdweCc7XG4gICAgdGhpcy5pbWFnZVBvc2l0aW9uLnkgPSBjb3JyZWN0ZWRQb3NpdGlvbi55O1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0Wm9vbSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgbGV0IHBhcnNlZFZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgaWYgKHBhcnNlZFZhbHVlIDw9IDApIHtcbiAgICAgIHBhcnNlZFZhbHVlID0gMTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZFZhbHVlID4gdGhpcy56b29tQ29uZmlnLm1heCkge1xuICAgICAgcGFyc2VkVmFsdWUgPSB0aGlzLnpvb21Db25maWcubWF4O1xuICAgIH1cblxuICAgIHRoaXMuem9vbUNvbmZpZy52YWx1ZSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgY29uc3QgbmV3RGltZW5zaW9ucyA9IHtcbiAgICAgIHdpZHRoOiB0aGlzLm9yaWdpbmFsSW1hZ2VEaW1lbnNpb25zLndpZHRoICogdGhpcy56b29tQ29uZmlnLnZhbHVlLFxuICAgICAgaGVpZ2h0OiB0aGlzLm9yaWdpbmFsSW1hZ2VEaW1lbnNpb25zLmhlaWdodCAqIHRoaXMuem9vbUNvbmZpZy52YWx1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgaGRpZmYgPSBuZXdEaW1lbnNpb25zLndpZHRoIC0gdGhpcy5pbWFnZURpbWVuc2lvbnMud2lkdGg7XG4gICAgY29uc3QgdmRpZmYgPSBuZXdEaW1lbnNpb25zLmhlaWdodCAtIHRoaXMuaW1hZ2VEaW1lbnNpb25zLmhlaWdodDtcblxuICAgIHRoaXMuaW1hZ2VEaW1lbnNpb25zLndpZHRoID0gbmV3RGltZW5zaW9ucy53aWR0aDtcbiAgICB0aGlzLmltYWdlRGltZW5zaW9ucy5oZWlnaHQgPSBuZXdEaW1lbnNpb25zLmhlaWdodDtcblxuICAgIGNvbnN0IGltZyA9IHRoaXMucHJldmlld0ltYWdlLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpbWcuc3R5bGUud2lkdGggPSBuZXdEaW1lbnNpb25zLndpZHRoICsgJ3B4JztcbiAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gbmV3RGltZW5zaW9ucy5oZWlnaHQgKyAncHgnO1xuXG4gICAgY29uc3QgY29ycmVjdGVkUG9zaXRpb24gPSB0aGlzLmdldENvcnJlY3RlZFBvc2l0aW9uKHtcbiAgICAgIHg6IHRoaXMuaW1hZ2VQb3NpdGlvbi54IC0gaGRpZmYgLyAyLFxuICAgICAgeTogdGhpcy5pbWFnZVBvc2l0aW9uLnkgLSB2ZGlmZiAvIDIsXG4gICAgfSk7XG5cbiAgICBpbWcuc3R5bGUubGVmdCA9IGNvcnJlY3RlZFBvc2l0aW9uLnggKyAncHgnO1xuICAgIGltZy5zdHlsZS50b3AgPSBjb3JyZWN0ZWRQb3NpdGlvbi55ICsgJ3B4JztcblxuICAgIHRoaXMuaW1hZ2VQb3NpdGlvbi54ID0gY29ycmVjdGVkUG9zaXRpb24ueDtcbiAgICB0aGlzLmltYWdlUG9zaXRpb24ueSA9IGNvcnJlY3RlZFBvc2l0aW9uLnk7XG5cbiAgICBpbWcuY2xhc3NOYW1lID0gJ3pvb21pbmcnO1xuXG4gICAgbGV0IGZpbmlzaFRyYW5zaXRpb246IEV2ZW50TGlzdGVuZXI7XG4gICAgZmluaXNoVHJhbnNpdGlvbiA9ICgpID0+IHtcbiAgICAgIGltZy5jbGFzc05hbWUgPSAnJztcbiAgICAgIGltZy5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmluaXNoVHJhbnNpdGlvbik7XG4gICAgICB0aGlzLmNvbmZpZ0NoYW5nZS5lbWl0KHtcbiAgICAgICAgbGVmdDogdGhpcy5pbWFnZVBvc2l0aW9uLngsXG4gICAgICAgIHRvcDogdGhpcy5pbWFnZVBvc2l0aW9uLnksXG4gICAgICAgIHpvb206IHRoaXMuem9vbSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbWcuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGZpbmlzaFRyYW5zaXRpb24pO1xuICB9XG5cbiAgZ2V0QmxvYigpIHtcbiAgICB0aGlzLmNyb3AoKTtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZS5nZXRCbG9iKCk7XG4gIH1cblxuICBnZXREYXRhVVJMKCkge1xuICAgIHRoaXMuY3JvcCgpO1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlLmdldERhdGFVUkwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcm9wKCkge1xuICAgIGNvbnN0IHByb3BvcnRpb25zID0gdGhpcy5pbWFnZURpbWVuc2lvbnMud2lkdGggLyB0aGlzLmVkaXRhYmxlLmltYWdlLndpZHRoO1xuXG4gICAgY29uc3Qgc3ggPSAodGhpcy5ib3JkZXJzLmhib3JkZXIgLSB0aGlzLmltYWdlUG9zaXRpb24ueCkgLyBwcm9wb3J0aW9ucztcbiAgICBjb25zdCBzeSA9ICh0aGlzLmJvcmRlcnMudmJvcmRlciAtIHRoaXMuaW1hZ2VQb3NpdGlvbi55KSAvIHByb3BvcnRpb25zO1xuICAgIGNvbnN0IHN3ID0gdGhpcy5jcm9wRGltZW5zaW9ucy53aWR0aCAvIHByb3BvcnRpb25zO1xuICAgIGNvbnN0IHNoID0gc3cgLyAodGhpcy5jcm9wV2lkdGggLyB0aGlzLmNyb3BIZWlnaHQpO1xuXG4gICAgdGhpcy5lZGl0YWJsZS5hcHBseShcbiAgICAgICdjcm9wJyxcbiAgICAgIHN4LFxuICAgICAgc3ksXG4gICAgICBzdyxcbiAgICAgIHNoLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICB0aGlzLmNyb3BXaWR0aCxcbiAgICAgIHRoaXMuY3JvcEhlaWdodFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdGVkUG9zaXRpb24ocG9zOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgY29ycmVjdGVkID0geyB4OiAwLCB5OiAwIH07XG4gICAgY29uc3QgaGRpZmYgPSB0aGlzLmNyb3BEaW1lbnNpb25zLndpZHRoIC0gdGhpcy5pbWFnZURpbWVuc2lvbnMud2lkdGg7XG4gICAgY29uc3QgdmRpZmYgPSB0aGlzLmNyb3BEaW1lbnNpb25zLmhlaWdodCAtIHRoaXMuaW1hZ2VEaW1lbnNpb25zLmhlaWdodDtcblxuICAgIGlmIChwb3MueCA8IHRoaXMuYm9yZGVycy5oYm9yZGVyKSB7XG4gICAgICBpZiAocG9zLnggPCB0aGlzLmJvcmRlcnMuaGJvcmRlciArIGhkaWZmKSB7XG4gICAgICAgIGNvcnJlY3RlZC54ID0gdGhpcy5ib3JkZXJzLmhib3JkZXIgKyBoZGlmZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcnJlY3RlZC54ID0gcG9zLng7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvcnJlY3RlZC54ID0gdGhpcy5ib3JkZXJzLmhib3JkZXI7XG4gICAgfVxuXG4gICAgaWYgKHBvcy55IDwgdGhpcy5ib3JkZXJzLnZib3JkZXIpIHtcbiAgICAgIGlmIChwb3MueSA8IHRoaXMuYm9yZGVycy52Ym9yZGVyICsgdmRpZmYpIHtcbiAgICAgICAgY29ycmVjdGVkLnkgPSB0aGlzLmJvcmRlcnMudmJvcmRlciArIHZkaWZmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29ycmVjdGVkLnkgPSBwb3MueTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29ycmVjdGVkLnkgPSB0aGlzLmJvcmRlcnMudmJvcmRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29ycmVjdGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0b3BNb3ZlKCkge1xuICAgIGRlbGV0ZSB0aGlzLm1vdmVEZWx0YTtcblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmV2ZW50TGlzdGVuZXJzLm1vdXNlbW92ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmV2ZW50TGlzdGVuZXJzLm1vdXNldXApO1xuXG4gICAgdGhpcy5jb25maWdDaGFuZ2UuZW1pdCh7XG4gICAgICBsZWZ0OiB0aGlzLmltYWdlUG9zaXRpb24ueCxcbiAgICAgIHRvcDogdGhpcy5pbWFnZVBvc2l0aW9uLnksXG4gICAgICB6b29tOiB0aGlzLnpvb20sXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpdEFyZWEob2JqZWN0OiBEaW1lbnNpb24sIGFyZWE6IERpbWVuc2lvbikge1xuICAgIGNvbnN0IHBoID0gb2JqZWN0LmhlaWdodCAvIGFyZWEuaGVpZ2h0O1xuICAgIGNvbnN0IHB3ID0gb2JqZWN0LndpZHRoIC8gYXJlYS53aWR0aDtcbiAgICBjb25zdCBzY2FsZSA9IHBoID4gcHcgPyBwaCA6IHB3O1xuICAgIHJldHVybiB7IHdpZHRoOiBvYmplY3Qud2lkdGggLyBzY2FsZSwgaGVpZ2h0OiBvYmplY3QuaGVpZ2h0IC8gc2NhbGUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWxsQXJlYShvYmplY3Q6IERpbWVuc2lvbiwgYXJlYTogRGltZW5zaW9uKSB7XG4gICAgY29uc3QgcGggPSBvYmplY3QuaGVpZ2h0IC8gYXJlYS5oZWlnaHQ7XG4gICAgY29uc3QgcHcgPSBvYmplY3Qud2lkdGggLyBhcmVhLndpZHRoO1xuICAgIGNvbnN0IHNjYWxlID0gcGggPiBwdyA/IHB3IDogcGg7XG4gICAgcmV0dXJuIHsgd2lkdGg6IG9iamVjdC53aWR0aCAvIHNjYWxlLCBoZWlnaHQ6IG9iamVjdC5oZWlnaHQgLyBzY2FsZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZFRyYW5zcGFyZW50Qm9yZGVyKFxuICAgIHByZXZpZXdEaW1lbnNpb25zOiBEaW1lbnNpb24sXG4gICAgZml0dGluZ0RpbWVuc2lvbnM6IERpbWVuc2lvblxuICApIHtcbiAgICBjb25zdCB2Ym9yZGVyID0gKHByZXZpZXdEaW1lbnNpb25zLmhlaWdodCAtIGZpdHRpbmdEaW1lbnNpb25zLmhlaWdodCkgLyAyO1xuICAgIGNvbnN0IGhib3JkZXIgPSAocHJldmlld0RpbWVuc2lvbnMud2lkdGggLSBmaXR0aW5nRGltZW5zaW9ucy53aWR0aCkgLyAyO1xuXG4gICAgY29uc3QgYm9yZGVyRWxlbWVudCA9IF8odGhpcy5lbC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpLmZpbmQoXG4gICAgICAoYzogSFRNTEVsZW1lbnQpID0+ICEhYy5jbGFzc05hbWUgJiYgYy5jbGFzc05hbWUuaW5kZXhPZignYm9yZGVyJykgPj0gMFxuICAgICk7XG5cbiAgICBjb25zdCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJvcmRlckVsZW1lbnQgYXMgRWxlbWVudCk7XG5cbiAgICBpZiAoYm9yZGVyRWxlbWVudCkge1xuICAgICAgYm9yZGVyRWxlbWVudC5zdHlsZS5ib3JkZXJCb3R0b21XaWR0aCA9IHZib3JkZXIgKyAncHgnO1xuICAgICAgYm9yZGVyRWxlbWVudC5zdHlsZS5ib3JkZXJUb3BXaWR0aCA9IHZib3JkZXIgKyAncHgnO1xuXG4gICAgICBib3JkZXJFbGVtZW50LnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9IGhib3JkZXIgKyAncHgnO1xuICAgICAgYm9yZGVyRWxlbWVudC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gaGJvcmRlciArICdweCc7XG4gICAgfVxuICAgIHJldHVybiB7IHZib3JkZXIsIGhib3JkZXIgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb21wdXRlZERpbWVuc2lvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogcGFyc2VJbnQoY3Mud2lkdGggYXMgc3RyaW5nLCAxMCksXG4gICAgICBoZWlnaHQ6IHBhcnNlSW50KGNzLmhlaWdodCBhcyBzdHJpbmcsIDEwKSxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIERpbWVuc2lvbiA9IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfTtcbiJdfQ==