dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
442 lines • 53.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, HostBinding, Inject, ViewChild } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
import { DomSanitizer } from '@angular/platform-browser';
import { CurrentService } from 'dbweb-core';
import { PortraitMaskComponent } from './portrait-mask/portrait-mask.component';
import { portraitDefault } from '../../const';
/**
* @record
*/
export function PortraitEditComponentData() { }
if (false) {
/** @type {?} */
PortraitEditComponentData.prototype.img;
/** @type {?} */
PortraitEditComponentData.prototype.default;
}
/**
* @record
*/
export function PortraitEditComponentResultData() { }
if (false) {
/** @type {?} */
PortraitEditComponentResultData.prototype.ok;
/** @type {?} */
PortraitEditComponentResultData.prototype.data;
}
/** @type {?} */
const ImageMaxWidth = 224;
/** @type {?} */
const ImageMaxHeight = 224;
/** @type {?} */
const PortraitSize = 224;
// 112;
export class PortraitEditComponent {
// 是否是缺省的图片,缺省图片不需要保存
/**
* @param {?} dialogRef
* @param {?} data
* @param {?} _sanitizer
* @param {?} curr
*/
constructor(dialogRef, data, _sanitizer, curr) {
this.dialogRef = dialogRef;
this.data = data;
this._sanitizer = _sanitizer;
this.curr = curr;
this.hostClass = true;
this.translateX = 0;
this.translateY = 0;
this.rotateScope = 0;
this.modified = false;
this.afterInit = false;
this.default = false; // 是否是缺省的图片,缺省图片不需要保存
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.srcImage.nativeElement.onload = (/**
* @return {?}
*/
() => {
this.realImageWidth = this.srcImage.nativeElement.width;
this.realImageHeight = this.srcImage.nativeElement.height;
/** @type {?} */
let w = this.srcImage.nativeElement.width;
/** @type {?} */
let h = this.srcImage.nativeElement.height;
this.minZoomFactor = this.zoomFactor = 1;
if (w < h && h > ImageMaxHeight) {
this.minZoomFactor = this.zoomFactor = ImageMaxHeight / h;
w = w * this.zoomFactor;
h = ImageMaxHeight;
}
else if (w > h && w > ImageMaxHeight) {
this.minZoomFactor = this.zoomFactor = ImageMaxWidth / w;
h = h * this.zoomFactor;
w = ImageMaxWidth;
}
this.portraitImage.nativeElement.width = w;
this.portraitImage.nativeElement.height = h;
this.translateX = Math.round((ImageMaxWidth - w) / 2);
this.translateY = Math.round((ImageMaxHeight - h) / 2);
this.rebuildImage();
});
this.srcImage.nativeElement.src = this.data.img.src;
this.default = this.data.default;
this.afterInit = true;
}
/**
* @return {?}
*/
ngOnInit() { }
/**
* @return {?}
*/
rebuildImage() {
/** @type {?} */
const c = document.createElement('canvas');
if (this.rotateScope === 0 || this.rotateScope === 0.5) {
c.width = this.srcImage.nativeElement.width;
c.height = this.srcImage.nativeElement.height;
}
else {
c.width = this.srcImage.nativeElement.height;
c.height = this.srcImage.nativeElement.width;
}
/** @type {?} */
const ctx = c.getContext('2d');
ctx.clearRect(0, 0, c.width, c.height);
// move to the center of the canvas
ctx.translate(c.width / 2, c.height / 2);
// rotate the canvas to the specified degrees
ctx.rotate(this.rotateScope * 2 * Math.PI);
// draw the image
// since the context is rotated, the image will be rotated also
ctx.drawImage(this.srcImage.nativeElement, -this.srcImage.nativeElement.width / 2, -this.srcImage.nativeElement.height / 2);
this.portraitImage.nativeElement.src = c.toDataURL();
setTimeout((/**
* @return {?}
*/
() => {
this.drawPreview();
}), 150);
}
/**
* @return {?}
*/
pimgLoad() {
/** @type {?} */
const offset = this.correctionOffset((this.portraitImage.nativeElement.width - this.realImageWidth * this.zoomFactor) / 2, (this.portraitImage.nativeElement.height - this.realImageHeight * this.zoomFactor) / 2, this.portraitImage.nativeElement.getBoundingClientRect());
this.translateX += offset.x;
this.translateY += offset.y;
}
/**
* @param {?} event
* @return {?}
*/
startDragImage(event) {
this.dragStartPoint = { x: event.x, y: event.y };
this.dragStartTransformPosition = { x: this.translateX, y: this.translateY };
this.dragStartImageRound = this.portraitImage.nativeElement.getBoundingClientRect();
}
// 给定一个偏移,返回校正的结果
/**
* @param {?} dx
* @param {?} dy
* @param {?} imageRect
* @return {?}
*/
correctionOffset(dx, dy, imageRect) {
/** @type {?} */
const containerRect = this.dragContainer.nativeElement.getBoundingClientRect();
/** @type {?} */
let lx;
/** @type {?} */
let hx;
/** @type {?} */
let ly;
/** @type {?} */
let hy;
// 如果图片宽度小于容器,则是左边框左移不能过容器左边框
if (containerRect.width > imageRect.width) {
lx = containerRect.left - imageRect.left;
hx = containerRect.right - imageRect.right;
}
else {
// 否则是右边框左移不能离开容器右边框
lx = containerRect.right - imageRect.right;
hx = containerRect.left - imageRect.left;
}
if (containerRect.height > imageRect.height) {
ly = containerRect.top - imageRect.top;
hy = containerRect.bottom - imageRect.bottom;
}
else {
ly = containerRect.bottom - imageRect.bottom;
hy = containerRect.top - imageRect.top;
}
return { x: Math.max(lx, Math.min(hx, dx)), y: Math.max(ly, Math.min(hy, dy)) };
}
/**
* @param {?} event
* @return {?}
*/
draggingImage(event) {
/** @type {?} */
const offset = this.correctionOffset(event.x - this.dragStartPoint.x, event.y - this.dragStartPoint.y, this.dragStartImageRound);
this.translateX = this.dragStartTransformPosition.x + offset.x;
this.translateY = this.dragStartTransformPosition.y + offset.y;
this.drawPreview();
this.modified = true;
this.default = false;
}
/**
* @param {?} event
* @return {?}
*/
zoomIn(event) {
// 放大10%
this.zoomFactor = Math.min(1, this.zoomFactor * 1.1);
if (this.rotateScope === 0 || this.rotateScope === 0.5) {
this.portraitImage.nativeElement.width = this.realImageWidth * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageHeight * this.zoomFactor;
}
else {
this.portraitImage.nativeElement.width = this.realImageHeight * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageWidth * this.zoomFactor;
}
/** @type {?} */
const offset = this.correctionOffset(-(this.realImageWidth * this.zoomFactor - this.portraitImage.nativeElement.width) / 2, -(this.realImageHeight * this.zoomFactor - this.portraitImage.nativeElement.height) / 2, this.portraitImage.nativeElement.getBoundingClientRect());
this.translateX += offset.x;
this.translateY += offset.y;
this.modified = true;
this.default = false;
this.drawPreview();
}
/**
* @param {?} event
* @return {?}
*/
zoomOut(event) {
// 缩小10%
this.zoomFactor = Math.max(this.minZoomFactor, this.zoomFactor * 0.9);
if (this.rotateScope === 0 || this.rotateScope === 0.5) {
this.portraitImage.nativeElement.width = this.realImageWidth * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageHeight * this.zoomFactor;
}
else {
this.portraitImage.nativeElement.width = this.realImageHeight * this.zoomFactor;
this.portraitImage.nativeElement.height = this.realImageWidth * this.zoomFactor;
}
/** @type {?} */
const offset = this.correctionOffset((this.portraitImage.nativeElement.width - this.realImageWidth * this.zoomFactor) / 2, (this.portraitImage.nativeElement.height - this.realImageHeight * this.zoomFactor) / 2, this.portraitImage.nativeElement.getBoundingClientRect());
this.translateX += offset.x;
this.translateY += offset.y;
this.modified = true;
this.default = false;
this.drawPreview();
}
/**
* @return {?}
*/
drawPreview() {
/** @type {?} */
const imageRect = this.portraitImage.nativeElement.getBoundingClientRect();
// 交集
/** @type {?} */
const r = {
left: Math.max(imageRect.left, this.maskRect.left),
top: Math.max(imageRect.top, this.maskRect.top),
right: Math.min(imageRect.right, this.maskRect.right),
bottom: Math.min(imageRect.bottom, this.maskRect.bottom)
};
// 相对图片左上角的偏移
r.left = r.left - imageRect.left;
r.top = r.top - imageRect.top;
r.right = r.right - imageRect.left;
r.bottom = r.bottom - imageRect.top;
/** @type {?} */
const drawX = this.maskRect.left < imageRect.left ? (imageRect.left - this.maskRect.left) / this.zoomFactor : 0;
/** @type {?} */
const drawY = this.maskRect.top < imageRect.top ? (imageRect.top - this.maskRect.top) / this.zoomFactor : 0;
/** @type {?} */
const realWidth = ((r.right - r.left) / this.maskRect.width) * PortraitSize;
/** @type {?} */
const realHeight = ((r.bottom - r.top) / this.maskRect.height) * PortraitSize;
// 再缩放到实际图片中
r.left /= this.zoomFactor;
r.top /= this.zoomFactor;
r.right /= this.zoomFactor;
r.bottom /= this.zoomFactor;
/** @type {?} */
const ctx = this.preview.nativeElement.getContext('2d');
if (realWidth < PortraitSize || realHeight < PortraitSize) {
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, this.preview.nativeElement.width, this.preview.nativeElement.height);
}
ctx.save();
/** @type {?} */
const sc = PortraitSize / (this.maskRect.width / this.zoomFactor);
ctx.scale(sc, sc);
ctx.drawImage(this.portraitImage.nativeElement, r.left, r.top, r.right - r.left, r.bottom - r.top, drawX, drawY, r.right - r.left, r.bottom - r.top);
ctx.restore();
}
/**
* @param {?} rect
* @return {?}
*/
maskChange(rect) {
this.maskRect = rect;
// 因为最开始就会触发一次,需要初始化过后才翻转状态
if (this.afterInit) {
this.default = false;
this.modified = true;
}
this.drawPreview();
}
/**
* @param {?} event
* @return {?}
*/
rotate(event) {
if (this.rotateScope === 0) {
this.rotateScope = 0.75;
}
else {
this.rotateScope -= 0.25;
}
/** @type {?} */
const tmp = this.portraitImage.nativeElement.width;
this.portraitImage.nativeElement.width = this.portraitImage.nativeElement.height;
this.portraitImage.nativeElement.height = tmp;
this.modified = true;
this.default = false;
this.rebuildImage();
}
/**
* @return {?}
*/
get imageStyle() {
return this._sanitizer.bypassSecurityTrustStyle('translate(' + this.translateX + 'px, ' + this.translateY + 'px)');
}
/**
* @param {?} event
* @return {?}
*/
fileChange(event) {
/** @type {?} */
const reader = new FileReader();
/** @type {?} */
const self = this;
reader.onload = (/**
* @param {?} oFREvent
* @return {?}
*/
function (oFREvent) {
self.srcImage.nativeElement.src = (/** @type {?} */ (oFREvent.target.result));
});
this.modified = true;
this.default = false;
reader.readAsDataURL(event[0]);
}
/**
* @return {?}
*/
ok() {
this.dialogRef.close((/** @type {?} */ ({
ok: true,
data: this.default ? null : this.preview.nativeElement.toDataURL('image/jpeg')
})));
}
/**
* @return {?}
*/
restoreDefault() {
this.modified = true;
this.mask.reset();
this.srcImage.nativeElement.src = portraitDefault;
this.default = true;
}
}
PortraitEditComponent.decorators = [
{ type: Component, args: [{
selector: 'common-portrait-edit',
template: "<div class=\"main\">\r\n\t<div class=\"left\">\r\n\t\t<div class=\"picture-select\" #dragContainer>\r\n\t\t\t<img #srcImage class=\"hide\" crossOrigin=\"Anonymous\" />\r\n\t\t\t<img #portraitImage class=\"image\" [style.transform]=\"imageStyle\" (load)=\"pimgLoad()\" />\r\n\t\t\t<common-portrait-mask #mask\r\n\t\t\t\tclass=\"mask\"\r\n\t\t\t\t(startDrag)=\"startDragImage($event)\"\r\n\t\t\t\t(maskChange)=\"maskChange($event)\"\r\n\t\t\t\t(dragging)=\"draggingImage($event)\"\r\n\t\t\t></common-portrait-mask>\r\n\t\t</div>\r\n\t\t<div class=\"small-button\">\r\n\t\t\t<button mat-icon-button (click)=\"rotate($event)\">\r\n\t\t\t\t<mat-icon svgIcon=\"rotate_90_degrees_ccw\"></mat-icon>\r\n\t\t\t</button>\r\n\t\t\t<span>\r\n\t\t\t\t<button mat-icon-button (click)=\"zoomIn($event)\" [disabled]=\"zoomFactor >= 1\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"add_circle\"></mat-icon>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button mat-icon-button (click)=\"zoomOut($event)\" [disabled]=\"zoomFactor <= minZoomFactor\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"remove_circle\"></mat-icon>\r\n\t\t\t\t</button>\r\n\t\t\t</span>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"right\">\r\n\t\t<div>\r\n\t\t\t<div class=\"\u9884\u89C8\u6807\u9898\">\u9884\u89C8</div>\r\n\t\t\t<div class=\"\u9884\u89C8\u56FE\u7247\">\r\n\t\t\t\t<canvas class=\"preview\" width=\"224\" height=\"224\" #preview></canvas>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF\" (click)=\"restoreDefault()\">\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF</div>\r\n\t\t</div>\r\n\t\t<div class=\"button-bottom\">\r\n\t\t\t<div class=\"upload-file\">\r\n\t\t\t\t<input type=\"file\" id=\"file\" name=\"file\" (change)=\"fileChange($event.target.files)\" />\r\n\t\t\t\t<span>\u9009\u62E9\u56FE\u7247</span>\r\n\t\t\t</div>\r\n\t\t\t<button\r\n\t\t\t\tclass=\"\u786E\u8BA4\u56FE\u7247\"\r\n\t\t\t\tmat-raised-button\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t(click)=\"ok()\"\r\n\t\t\t\t[disabled]=\"!modified\"\t\t\t\t\r\n\t\t\t>\r\n\t\t\t\t\u786E\u5B9A\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\t<mat-icon (click)=\"dialogRef.close()\" class=\"\u5173\u95ED\" svgIcon=\"close\"></mat-icon>\r\n</div>\r\n",
styles: ["@charset \"UTF-8\";.main{display:flex;height:100%;position:relative}.main .left{display:flex;flex-direction:column}.main .left .picture-select{width:224px;height:224px;background:url(/front/assets/userinfo/bg_picselect.png) 0 0/100% 100% no-repeat;overflow:hidden;position:relative}.main .left .picture-select .mask{width:100%;height:100%;position:absolute;left:0;top:0}.main .left .small-button{margin-top:8px;display:flex;justify-content:space-between}.main .right{flex-grow:1;height:247px;display:flex;flex-direction:column;justify-content:space-between}.main .right .\u9884\u89C8\u6807\u9898{margin-left:56px;font-size:12px}.main .right .\u9884\u89C8\u56FE\u7247{text-align:center;margin:8px 0 16px}.main .right .preview{width:112px;height:112px;border-radius:56px}.main .right .\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF{font-size:12px;margin-top:16px;text-align:center;cursor:pointer}.main .right .button-bottom{margin-left:24px;height:32px}.main .right .button-bottom .upload-file{display:inline-block;width:80px;height:32px;position:relative;margin-right:8px;font-size:16px;text-align:center;line-height:32px;border-radius:4px;overflow:hidden;vertical-align:bottom}.main .right .button-bottom .upload-file #file{opacity:0;height:100%;position:absolute;left:0;top:0}.main .right .button-bottom .\u786E\u8BA4\u56FE\u7247{width:80px;height:32px;font-size:16px;line-height:32px}.hide{display:none}.\u5173\u95ED{position:absolute;right:-16px;top:-16px;cursor:pointer}"]
}] }
];
/** @nocollapse */
PortraitEditComponent.ctorParameters = () => [
{ type: MatDialogRef },
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] },
{ type: DomSanitizer },
{ type: CurrentService }
];
PortraitEditComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.portrait-edit',] }],
portraitImage: [{ type: ViewChild, args: ['portraitImage', { static: true },] }],
srcImage: [{ type: ViewChild, args: ['srcImage', { static: true },] }],
dragContainer: [{ type: ViewChild, args: ['dragContainer', { static: true },] }],
preview: [{ type: ViewChild, args: ['preview', { static: true },] }],
mask: [{ type: ViewChild, args: ['mask', { static: true },] }]
};
if (false) {
/** @type {?} */
PortraitEditComponent.prototype.hostClass;
/** @type {?} */
PortraitEditComponent.prototype.portraitImage;
/** @type {?} */
PortraitEditComponent.prototype.srcImage;
/** @type {?} */
PortraitEditComponent.prototype.dragContainer;
/** @type {?} */
PortraitEditComponent.prototype.preview;
/** @type {?} */
PortraitEditComponent.prototype.mask;
/** @type {?} */
PortraitEditComponent.prototype.dragStartPoint;
/** @type {?} */
PortraitEditComponent.prototype.dragStartTransformPosition;
/** @type {?} */
PortraitEditComponent.prototype.dragStartImageRound;
/** @type {?} */
PortraitEditComponent.prototype.realImageWidth;
/** @type {?} */
PortraitEditComponent.prototype.realImageHeight;
/** @type {?} */
PortraitEditComponent.prototype.zoomFactor;
/** @type {?} */
PortraitEditComponent.prototype.minZoomFactor;
/** @type {?} */
PortraitEditComponent.prototype.maskRect;
/** @type {?} */
PortraitEditComponent.prototype.translateX;
/** @type {?} */
PortraitEditComponent.prototype.translateY;
/** @type {?} */
PortraitEditComponent.prototype.rotateScope;
/** @type {?} */
PortraitEditComponent.prototype.modified;
/** @type {?} */
PortraitEditComponent.prototype.afterInit;
/** @type {?} */
PortraitEditComponent.prototype.default;
/** @type {?} */
PortraitEditComponent.prototype.dialogRef;
/** @type {?} */
PortraitEditComponent.prototype.data;
/**
* @type {?}
* @private
*/
PortraitEditComponent.prototype._sanitizer;
/** @type {?} */
PortraitEditComponent.prototype.curr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHJhaXQtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlcmluZm8vcG9ydHJhaXQtZWRpdC9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7OztBQUU5QywrQ0FHQzs7O0lBRkEsd0NBQXNCOztJQUN0Qiw0Q0FBaUI7Ozs7O0FBRWxCLHFEQUdDOzs7SUFGQSw2Q0FBWTs7SUFDWiwrQ0FBYTs7O01BRVIsYUFBYSxHQUFHLEdBQUc7O01BQ25CLGNBQWMsR0FBRyxHQUFHOztNQUNwQixZQUFZLEdBQUcsR0FBRzs7QUFNeEIsTUFBTSxPQUFPLHFCQUFxQjs7Ozs7Ozs7SUFxQmpDLFlBQ1EsU0FBOEMsRUFDckIsSUFBK0IsRUFDdkQsVUFBd0IsRUFDekIsSUFBb0I7UUFIcEIsY0FBUyxHQUFULFNBQVMsQ0FBcUM7UUFDckIsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDdkQsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN6QixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQXhCUSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBY3JELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFlBQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxxQkFBcUI7SUFNbkMsQ0FBQzs7OztJQUNKLGVBQWU7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNOzs7UUFBRyxHQUFHLEVBQUU7WUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDeEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7O2dCQUN0RCxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSzs7Z0JBQ3JDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNO1lBQzFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3hCLENBQUMsR0FBRyxjQUFjLENBQUM7YUFDbkI7aUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3hCLENBQUMsR0FBRyxhQUFhLENBQUM7YUFDbEI7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV2RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFBLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQzs7OztJQUNELFFBQVEsS0FBSSxDQUFDOzs7O0lBQ2IsWUFBWTs7Y0FDTCxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEdBQUcsRUFBRTtZQUN2RCxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUM1QyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUM5QzthQUFNO1lBQ04sQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDN0MsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7U0FDN0M7O2NBRUssR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxtQ0FBbUM7UUFDbkMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpDLDZDQUE2QztRQUM3QyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUzQyxpQkFBaUI7UUFDakIsK0RBQStEO1FBQy9ELEdBQUcsQ0FBQyxTQUFTLENBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQzNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsRUFDdEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUN2QyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVyRCxVQUFVOzs7UUFBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxHQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsQ0FBQzs7OztJQUNELFFBQVE7O2NBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUNwRixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQ3RGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQ3hEO1FBQ0QsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDOzs7OztJQUVELGNBQWMsQ0FBQyxLQUFpQjtRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTdFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3JGLENBQUM7Ozs7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxTQUFxQjs7Y0FDdkQsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFOztZQUMxRSxFQUFVOztZQUFFLEVBQVU7O1lBQUUsRUFBVTs7WUFBRSxFQUFVO1FBQ2xELDZCQUE2QjtRQUM3QixJQUFJLGFBQWEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRTtZQUMxQyxFQUFFLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3pDLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7U0FDM0M7YUFBTTtZQUNOLG9CQUFvQjtZQUNwQixFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQzNDLEVBQUUsR0FBRyxhQUFhLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7U0FDekM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUM1QyxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ3ZDLEVBQUUsR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7U0FDN0M7YUFBTTtZQUNOLEVBQUUsR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDN0MsRUFBRSxHQUFHLGFBQWEsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUN2QztRQUNELE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2pGLENBQUM7Ozs7O0lBQ0QsYUFBYSxDQUFDLEtBQVk7O2NBQ25CLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ25DLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQy9CLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FDeEI7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQzs7Ozs7SUFDRCxNQUFNLENBQUMsS0FBaUI7UUFDdkIsUUFBUTtRQUNSLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssR0FBRyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDL0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUNqRjthQUFNO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNoRixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ2hGOztjQUNLLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUNyRixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FDeEQ7UUFDRCxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQixDQUFDOzs7OztJQUNELE9BQU8sQ0FBQyxLQUFpQjtRQUN4QixRQUFRO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUV0RSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssR0FBRyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDL0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUNqRjthQUFNO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNoRixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ2hGOztjQUVLLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ25DLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFDcEYsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUN0RixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUN4RDtRQUNELElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Ozs7SUFFRCxXQUFXOztjQUNKLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRTs7O2NBRXBFLENBQUMsR0FBRztZQUNULElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbEQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUMvQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3JELE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDeEQ7UUFDRCxhQUFhO1FBQ2IsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDakMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDOUIsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDbkMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7O2NBQzlCLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDOztjQUN6RyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Y0FFckcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLFlBQVk7O2NBQ3JFLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZO1FBQzdFLFlBQVk7UUFDWixDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMzQixDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7O2NBQ3RCLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBRXZELElBQUksU0FBUyxHQUFHLFlBQVksSUFBSSxVQUFVLEdBQUcsWUFBWSxFQUFFO1lBQzFELEdBQUcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEY7UUFDRCxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O2NBQ0wsRUFBRSxHQUFHLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDakUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEIsR0FBRyxDQUFDLFNBQVMsQ0FDWixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFDaEMsQ0FBQyxDQUFDLElBQUksRUFDTixDQUFDLENBQUMsR0FBRyxFQUNMLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFDaEIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUNoQixLQUFLLEVBQ0wsS0FBSyxFQUNMLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFDaEIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUNoQixDQUFDO1FBQ0YsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2YsQ0FBQzs7Ozs7SUFDRCxVQUFVLENBQUMsSUFBZ0I7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsMkJBQTJCO1FBQzNCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUVyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNyQjtRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQixDQUFDOzs7OztJQUNELE1BQU0sQ0FBQyxLQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO2FBQU07WUFDTixJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztTQUN6Qjs7Y0FDSyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSztRQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFFRCxJQUFJLFVBQVU7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQzlDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FDakUsQ0FBQztJQUNILENBQUM7Ozs7O0lBQ0QsVUFBVSxDQUFDLEtBQWU7O2NBQ25CLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRTs7Y0FDekIsSUFBSSxHQUFHLElBQUk7UUFDakIsTUFBTSxDQUFDLE1BQU07Ozs7UUFBRyxVQUFTLFFBQWE7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLG1CQUFBLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFVLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFDRCxFQUFFO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsbUJBQUE7WUFDcEIsRUFBRSxFQUFFLElBQUk7WUFDUixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1NBQzlFLEVBQW1DLENBQUMsQ0FBQztJQUN2QyxDQUFDOzs7O0lBQ0QsY0FBYztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDOzs7WUEvUkQsU0FBUyxTQUFDO2dCQUNWLFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLGtvRUFBNkM7O2FBRTdDOzs7O1lBckJRLFlBQVk7NENBNkNsQixNQUFNLFNBQUMsZUFBZTtZQTVDaEIsWUFBWTtZQUNaLGNBQWM7Ozt3QkFxQnJCLFdBQVcsU0FBQyxxQkFBcUI7NEJBQ2pDLFNBQVMsU0FBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3VCQUMzQyxTQUFTLFNBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs0QkFDdEMsU0FBUyxTQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7c0JBQzNDLFNBQVMsU0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO21CQUNyQyxTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7OztJQUxuQywwQ0FBcUQ7O0lBQ3JELDhDQUEwRjs7SUFDMUYseUNBQWdGOztJQUNoRiw4Q0FBcUY7O0lBQ3JGLHdDQUErRTs7SUFDL0UscUNBQWlFOztJQUNqRSwrQ0FBc0I7O0lBQ3RCLDJEQUFrQzs7SUFDbEMsb0RBQWdDOztJQUNoQywrQ0FBdUI7O0lBQ3ZCLGdEQUF3Qjs7SUFDeEIsMkNBQW1COztJQUNuQiw4Q0FBc0I7O0lBQ3RCLHlDQUFxQjs7SUFDckIsMkNBQWU7O0lBQ2YsMkNBQWU7O0lBQ2YsNENBQWdCOztJQUNoQix5Q0FBaUI7O0lBQ2pCLDBDQUFrQjs7SUFDbEIsd0NBQWdCOztJQUVmLDBDQUFxRDs7SUFDckQscUNBQStEOzs7OztJQUMvRCwyQ0FBZ0M7O0lBQ2hDLHFDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcC90eXBpbmdzL2RyYWctcmVmJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQ3VycmVudFNlcnZpY2UgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgUG9ydHJhaXRNYXNrQ29tcG9uZW50IH0gZnJvbSAnLi9wb3J0cmFpdC1tYXNrL3BvcnRyYWl0LW1hc2suY29tcG9uZW50JztcclxuaW1wb3J0IHsgcG9ydHJhaXREZWZhdWx0IH0gZnJvbSAnLi4vLi4vY29uc3QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQb3J0cmFpdEVkaXRDb21wb25lbnREYXRhIHtcclxuXHRpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XHJcblx0ZGVmYXVsdDogYm9vbGVhbjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRyYWl0RWRpdENvbXBvbmVudFJlc3VsdERhdGEge1xyXG5cdG9rOiBib29sZWFuO1xyXG5cdGRhdGE6IHN0cmluZztcclxufVxyXG5jb25zdCBJbWFnZU1heFdpZHRoID0gMjI0O1xyXG5jb25zdCBJbWFnZU1heEhlaWdodCA9IDIyNDtcclxuY29uc3QgUG9ydHJhaXRTaXplID0gMjI0OyAvLyAxMTI7XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLXBvcnRyYWl0LWVkaXQnLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBvcnRyYWl0RWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5wb3J0cmFpdC1lZGl0JykgaG9zdENsYXNzID0gdHJ1ZTtcclxuXHRAVmlld0NoaWxkKCdwb3J0cmFpdEltYWdlJywgeyBzdGF0aWM6IHRydWUgfSkgcG9ydHJhaXRJbWFnZTogRWxlbWVudFJlZjxIVE1MSW1hZ2VFbGVtZW50PjtcclxuXHRAVmlld0NoaWxkKCdzcmNJbWFnZScsIHsgc3RhdGljOiB0cnVlIH0pIHNyY0ltYWdlOiBFbGVtZW50UmVmPEhUTUxJbWFnZUVsZW1lbnQ+O1xyXG5cdEBWaWV3Q2hpbGQoJ2RyYWdDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBkcmFnQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHRAVmlld0NoaWxkKCdwcmV2aWV3JywgeyBzdGF0aWM6IHRydWUgfSkgcHJldmlldzogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XHJcblx0QFZpZXdDaGlsZCgnbWFzaycsIHsgc3RhdGljOiB0cnVlIH0pIG1hc2s6IFBvcnRyYWl0TWFza0NvbXBvbmVudDtcclxuXHRkcmFnU3RhcnRQb2ludDogUG9pbnQ7XHJcblx0ZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb246IFBvaW50O1xyXG5cdGRyYWdTdGFydEltYWdlUm91bmQ6IENsaWVudFJlY3Q7XHJcblx0cmVhbEltYWdlV2lkdGg6IG51bWJlcjtcclxuXHRyZWFsSW1hZ2VIZWlnaHQ6IG51bWJlcjtcclxuXHR6b29tRmFjdG9yOiBudW1iZXI7XHJcblx0bWluWm9vbUZhY3RvcjogbnVtYmVyO1xyXG5cdG1hc2tSZWN0OiBDbGllbnRSZWN0O1xyXG5cdHRyYW5zbGF0ZVggPSAwO1xyXG5cdHRyYW5zbGF0ZVkgPSAwO1xyXG5cdHJvdGF0ZVNjb3BlID0gMDtcclxuXHRtb2RpZmllZCA9IGZhbHNlO1xyXG5cdGFmdGVySW5pdCA9IGZhbHNlO1xyXG5cdGRlZmF1bHQgPSBmYWxzZTsgLy8g5piv5ZCm5piv57y655yB55qE5Zu+54mH77yM57y655yB5Zu+54mH5LiN6ZyA6KaB5L+d5a2YXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8UG9ydHJhaXRFZGl0Q29tcG9uZW50PixcclxuXHRcdEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogUG9ydHJhaXRFZGl0Q29tcG9uZW50RGF0YSxcclxuXHRcdHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG5cdFx0cHVibGljIGN1cnI6IEN1cnJlbnRTZXJ2aWNlXHJcblx0KSB7fVxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdHRoaXMuc3JjSW1hZ2UubmF0aXZlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVhbEltYWdlV2lkdGggPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHRcdHRoaXMucmVhbEltYWdlSGVpZ2h0ID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0bGV0IHcgPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHRcdGxldCBoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0dGhpcy5taW5ab29tRmFjdG9yID0gdGhpcy56b29tRmFjdG9yID0gMTtcclxuXHRcdFx0aWYgKHcgPCBoICYmIGggPiBJbWFnZU1heEhlaWdodCkge1xyXG5cdFx0XHRcdHRoaXMubWluWm9vbUZhY3RvciA9IHRoaXMuem9vbUZhY3RvciA9IEltYWdlTWF4SGVpZ2h0IC8gaDtcclxuXHRcdFx0XHR3ID0gdyAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdFx0XHRoID0gSW1hZ2VNYXhIZWlnaHQ7XHJcblx0XHRcdH0gZWxzZSBpZiAodyA+IGggJiYgdyA+IEltYWdlTWF4SGVpZ2h0KSB7XHJcblx0XHRcdFx0dGhpcy5taW5ab29tRmFjdG9yID0gdGhpcy56b29tRmFjdG9yID0gSW1hZ2VNYXhXaWR0aCAvIHc7XHJcblx0XHRcdFx0aCA9IGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdFx0dyA9IEltYWdlTWF4V2lkdGg7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB3O1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgPSBoO1xyXG5cdFx0XHR0aGlzLnRyYW5zbGF0ZVggPSBNYXRoLnJvdW5kKChJbWFnZU1heFdpZHRoIC0gdykgLyAyKTtcclxuXHRcdFx0dGhpcy50cmFuc2xhdGVZID0gTWF0aC5yb3VuZCgoSW1hZ2VNYXhIZWlnaHQgLSBoKSAvIDIpO1xyXG5cclxuXHRcdFx0dGhpcy5yZWJ1aWxkSW1hZ2UoKTtcclxuXHRcdH07XHJcblx0XHR0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQuc3JjID0gdGhpcy5kYXRhLmltZy5zcmM7XHJcblx0XHR0aGlzLmRlZmF1bHQgPSB0aGlzLmRhdGEuZGVmYXVsdDtcclxuXHRcdHRoaXMuYWZ0ZXJJbml0ID0gdHJ1ZTtcclxuXHR9XHJcblx0bmdPbkluaXQoKSB7fVxyXG5cdHJlYnVpbGRJbWFnZSgpIHtcclxuXHRcdGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuXHRcdGlmICh0aGlzLnJvdGF0ZVNjb3BlID09PSAwIHx8IHRoaXMucm90YXRlU2NvcGUgPT09IDAuNSkge1xyXG5cdFx0XHRjLndpZHRoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LndpZHRoO1xyXG5cdFx0XHRjLmhlaWdodCA9IHRoaXMuc3JjSW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQ7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjLndpZHRoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0Yy5oZWlnaHQgPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cdFx0Y3R4LmNsZWFyUmVjdCgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XHJcblx0XHQvLyBtb3ZlIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGNhbnZhc1xyXG5cdFx0Y3R4LnRyYW5zbGF0ZShjLndpZHRoIC8gMiwgYy5oZWlnaHQgLyAyKTtcclxuXHJcblx0XHQvLyByb3RhdGUgdGhlIGNhbnZhcyB0byB0aGUgc3BlY2lmaWVkIGRlZ3JlZXNcclxuXHRcdGN0eC5yb3RhdGUodGhpcy5yb3RhdGVTY29wZSAqIDIgKiBNYXRoLlBJKTtcclxuXHJcblx0XHQvLyBkcmF3IHRoZSBpbWFnZVxyXG5cdFx0Ly8gc2luY2UgdGhlIGNvbnRleHQgaXMgcm90YXRlZCwgdGhlIGltYWdlIHdpbGwgYmUgcm90YXRlZCBhbHNvXHJcblx0XHRjdHguZHJhd0ltYWdlKFxyXG5cdFx0XHR0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQsXHJcblx0XHRcdC10aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggLyAyLFxyXG5cdFx0XHQtdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCAvIDJcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuc3JjID0gYy50b0RhdGFVUkwoKTtcclxuXHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdFx0fSwgMTUwKTtcclxuXHR9XHJcblx0cGltZ0xvYWQoKSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLmNvcnJlY3Rpb25PZmZzZXQoXHJcblx0XHRcdCh0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC53aWR0aCAtIHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3IpIC8gMixcclxuXHRcdFx0KHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCAtIHRoaXMucmVhbEltYWdlSGVpZ2h0ICogdGhpcy56b29tRmFjdG9yKSAvIDIsXHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcblx0XHQpO1xyXG5cdFx0dGhpcy50cmFuc2xhdGVYICs9IG9mZnNldC54O1xyXG5cdFx0dGhpcy50cmFuc2xhdGVZICs9IG9mZnNldC55O1xyXG5cdH1cclxuXHJcblx0c3RhcnREcmFnSW1hZ2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdHRoaXMuZHJhZ1N0YXJ0UG9pbnQgPSB7IHg6IGV2ZW50LngsIHk6IGV2ZW50LnkgfTtcclxuXHRcdHRoaXMuZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb24gPSB7IHg6IHRoaXMudHJhbnNsYXRlWCwgeTogdGhpcy50cmFuc2xhdGVZIH07XHJcblxyXG5cdFx0dGhpcy5kcmFnU3RhcnRJbWFnZVJvdW5kID0gdGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0fVxyXG5cdC8vIOe7meWumuS4gOS4quWBj+enu++8jOi/lOWbnuagoeato+eahOe7k+aenFxyXG5cdGNvcnJlY3Rpb25PZmZzZXQoZHg6IG51bWJlciwgZHk6IG51bWJlciwgaW1hZ2VSZWN0OiBDbGllbnRSZWN0KTogUG9pbnQge1xyXG5cdFx0Y29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZHJhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0bGV0IGx4OiBudW1iZXIsIGh4OiBudW1iZXIsIGx5OiBudW1iZXIsIGh5OiBudW1iZXI7XHJcblx0XHQvLyDlpoLmnpzlm77niYflrr3luqblsI/kuo7lrrnlmajvvIzliJnmmK/lt6bovrnmoYblt6bnp7vkuI3og73ov4flrrnlmajlt6bovrnmoYZcclxuXHRcdGlmIChjb250YWluZXJSZWN0LndpZHRoID4gaW1hZ2VSZWN0LndpZHRoKSB7XHJcblx0XHRcdGx4ID0gY29udGFpbmVyUmVjdC5sZWZ0IC0gaW1hZ2VSZWN0LmxlZnQ7XHJcblx0XHRcdGh4ID0gY29udGFpbmVyUmVjdC5yaWdodCAtIGltYWdlUmVjdC5yaWdodDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIOWQpuWImeaYr+WPs+i+ueahhuW3puenu+S4jeiDveemu+W8gOWuueWZqOWPs+i+ueahhlxyXG5cdFx0XHRseCA9IGNvbnRhaW5lclJlY3QucmlnaHQgLSBpbWFnZVJlY3QucmlnaHQ7XHJcblx0XHRcdGh4ID0gY29udGFpbmVyUmVjdC5sZWZ0IC0gaW1hZ2VSZWN0LmxlZnQ7XHJcblx0XHR9XHJcblx0XHRpZiAoY29udGFpbmVyUmVjdC5oZWlnaHQgPiBpbWFnZVJlY3QuaGVpZ2h0KSB7XHJcblx0XHRcdGx5ID0gY29udGFpbmVyUmVjdC50b3AgLSBpbWFnZVJlY3QudG9wO1xyXG5cdFx0XHRoeSA9IGNvbnRhaW5lclJlY3QuYm90dG9tIC0gaW1hZ2VSZWN0LmJvdHRvbTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGx5ID0gY29udGFpbmVyUmVjdC5ib3R0b20gLSBpbWFnZVJlY3QuYm90dG9tO1xyXG5cdFx0XHRoeSA9IGNvbnRhaW5lclJlY3QudG9wIC0gaW1hZ2VSZWN0LnRvcDtcclxuXHRcdH1cclxuXHRcdHJldHVybiB7IHg6IE1hdGgubWF4KGx4LCBNYXRoLm1pbihoeCwgZHgpKSwgeTogTWF0aC5tYXgobHksIE1hdGgubWluKGh5LCBkeSkpIH07XHJcblx0fVxyXG5cdGRyYWdnaW5nSW1hZ2UoZXZlbnQ6IFBvaW50KSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLmNvcnJlY3Rpb25PZmZzZXQoXHJcblx0XHRcdGV2ZW50LnggLSB0aGlzLmRyYWdTdGFydFBvaW50LngsXHJcblx0XHRcdGV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydFBvaW50LnksXHJcblx0XHRcdHRoaXMuZHJhZ1N0YXJ0SW1hZ2VSb3VuZFxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCA9IHRoaXMuZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb24ueCArIG9mZnNldC54O1xyXG5cdFx0dGhpcy50cmFuc2xhdGVZID0gdGhpcy5kcmFnU3RhcnRUcmFuc2Zvcm1Qb3NpdGlvbi55ICsgb2Zmc2V0Lnk7XHJcblx0XHR0aGlzLmRyYXdQcmV2aWV3KCk7XHJcblx0XHR0aGlzLm1vZGlmaWVkID0gdHJ1ZTtcclxuXHRcdHRoaXMuZGVmYXVsdCA9IGZhbHNlO1xyXG5cdH1cclxuXHR6b29tSW4oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdC8vIOaUvuWkpzEwJVxyXG5cdFx0dGhpcy56b29tRmFjdG9yID0gTWF0aC5taW4oMSwgdGhpcy56b29tRmFjdG9yICogMS4xKTtcclxuXHRcdGlmICh0aGlzLnJvdGF0ZVNjb3BlID09PSAwIHx8IHRoaXMucm90YXRlU2NvcGUgPT09IDAuNSkge1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC53aWR0aCA9IHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCA9IHRoaXMucmVhbEltYWdlSGVpZ2h0ICogdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuaGVpZ2h0ID0gdGhpcy5yZWFsSW1hZ2VXaWR0aCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IG9mZnNldCA9IHRoaXMuY29ycmVjdGlvbk9mZnNldChcclxuXHRcdFx0LSh0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yIC0gdGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGgpIC8gMixcclxuXHRcdFx0LSh0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvciAtIHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCkgLyAyLFxyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCArPSBvZmZzZXQueDtcclxuXHRcdHRoaXMudHJhbnNsYXRlWSArPSBvZmZzZXQueTtcclxuXHRcdHRoaXMubW9kaWZpZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5kZWZhdWx0ID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdH1cclxuXHR6b29tT3V0KGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHQvLyDnvKnlsI8xMCVcclxuXHRcdHRoaXMuem9vbUZhY3RvciA9IE1hdGgubWF4KHRoaXMubWluWm9vbUZhY3RvciwgdGhpcy56b29tRmFjdG9yICogMC45KTtcclxuXHJcblx0XHRpZiAodGhpcy5yb3RhdGVTY29wZSA9PT0gMCB8fCB0aGlzLnJvdGF0ZVNjb3BlID09PSAwLjUpIHtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgPSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LndpZHRoID0gdGhpcy5yZWFsSW1hZ2VIZWlnaHQgKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCA9IHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gdGhpcy5jb3JyZWN0aW9uT2Zmc2V0KFxyXG5cdFx0XHQodGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggLSB0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yKSAvIDIsXHJcblx0XHRcdCh0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgLSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcikgLyAyLFxyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCArPSBvZmZzZXQueDtcclxuXHRcdHRoaXMudHJhbnNsYXRlWSArPSBvZmZzZXQueTtcclxuXHRcdHRoaXMubW9kaWZpZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5kZWZhdWx0ID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdH1cclxuXHJcblx0ZHJhd1ByZXZpZXcoKSB7XHJcblx0XHRjb25zdCBpbWFnZVJlY3QgPSB0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdC8vIOS6pOmbhlxyXG5cdFx0Y29uc3QgciA9IHtcclxuXHRcdFx0bGVmdDogTWF0aC5tYXgoaW1hZ2VSZWN0LmxlZnQsIHRoaXMubWFza1JlY3QubGVmdCksXHJcblx0XHRcdHRvcDogTWF0aC5tYXgoaW1hZ2VSZWN0LnRvcCwgdGhpcy5tYXNrUmVjdC50b3ApLFxyXG5cdFx0XHRyaWdodDogTWF0aC5taW4oaW1hZ2VSZWN0LnJpZ2h0LCB0aGlzLm1hc2tSZWN0LnJpZ2h0KSxcclxuXHRcdFx0Ym90dG9tOiBNYXRoLm1pbihpbWFnZVJlY3QuYm90dG9tLCB0aGlzLm1hc2tSZWN0LmJvdHRvbSlcclxuXHRcdH07XHJcblx0XHQvLyDnm7jlr7nlm77niYflt6bkuIrop5LnmoTlgY/np7tcclxuXHRcdHIubGVmdCA9IHIubGVmdCAtIGltYWdlUmVjdC5sZWZ0O1xyXG5cdFx0ci50b3AgPSByLnRvcCAtIGltYWdlUmVjdC50b3A7XHJcblx0XHRyLnJpZ2h0ID0gci5yaWdodCAtIGltYWdlUmVjdC5sZWZ0O1xyXG5cdFx0ci5ib3R0b20gPSByLmJvdHRvbSAtIGltYWdlUmVjdC50b3A7XHJcblx0XHRjb25zdCBkcmF3WCA9IHRoaXMubWFza1JlY3QubGVmdCA8IGltYWdlUmVjdC5sZWZ0ID8gKGltYWdlUmVjdC5sZWZ0IC0gdGhpcy5tYXNrUmVjdC5sZWZ0KSAvIHRoaXMuem9vbUZhY3RvciA6IDA7XHJcblx0XHRjb25zdCBkcmF3WSA9IHRoaXMubWFza1JlY3QudG9wIDwgaW1hZ2VSZWN0LnRvcCA/IChpbWFnZVJlY3QudG9wIC0gdGhpcy5tYXNrUmVjdC50b3ApIC8gdGhpcy56b29tRmFjdG9yIDogMDtcclxuXHJcblx0XHRjb25zdCByZWFsV2lkdGggPSAoKHIucmlnaHQgLSByLmxlZnQpIC8gdGhpcy5tYXNrUmVjdC53aWR0aCkgKiBQb3J0cmFpdFNpemU7XHJcblx0XHRjb25zdCByZWFsSGVpZ2h0ID0gKChyLmJvdHRvbSAtIHIudG9wKSAvIHRoaXMubWFza1JlY3QuaGVpZ2h0KSAqIFBvcnRyYWl0U2l6ZTtcclxuXHRcdC8vIOWGjee8qeaUvuWIsOWunumZheWbvueJh+S4rVxyXG5cdFx0ci5sZWZ0IC89IHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdHIudG9wIC89IHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdHIucmlnaHQgLz0gdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0ci5ib3R0b20gLz0gdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0Y29uc3QgY3R4ID0gdGhpcy5wcmV2aWV3Lm5hdGl2ZUVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcblx0XHRpZiAocmVhbFdpZHRoIDwgUG9ydHJhaXRTaXplIHx8IHJlYWxIZWlnaHQgPCBQb3J0cmFpdFNpemUpIHtcclxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9ICd3aGl0ZSc7XHJcblx0XHRcdGN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLnByZXZpZXcubmF0aXZlRWxlbWVudC53aWR0aCwgd