UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

403 lines 41.9 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Input, Output, ViewChild, ChangeDetectorRef, ElementRef, Renderer2, Inject, HostBinding, EventEmitter } from '@angular/core'; import { timer } from 'rxjs'; import { GridStateService } from './grid-state.service'; var ScrollerComponent = /** @class */ (function () { function ScrollerComponent(state, elementRef, changeDetector, renderer) { this.state = state; this.elementRef = elementRef; this.changeDetector = changeDetector; this.renderer = renderer; this.maxHeight = null; this.autoscrollx = new EventEmitter(); this.scroll = new EventEmitter(); this.scrollX = 0; this.scrollY = 0; this.scrollTimer = null; this.scrollSubscription = null; this.autoScrollInProgress = false; this.scrollSpeedX = 0; this.scrollSpeedY = 0; this._scrollRect = null; } Object.defineProperty(ScrollerComponent.prototype, "maxHeightU", { get: function () { if (this.maxHeight === null) { return 'unset'; } return this.maxHeight; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "autoWidth", { get: function () { return this.state.settings.columnAutoWidth; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "touchFix", { get: function () { return (this.state.iOS || this.state.android) && this.state.settings.enableTouchScroll; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "scrollerH", { get: function () { if (this.touchFix) { return this.datah; } return this.data; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "scrollerV", { get: function () { if (this.touchFix) { return this.dataArea; } return this.data; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "clientRect", { get: function () { return this.elementRef.nativeElement.getBoundingClientRect(); }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "centerRect", { get: function () { if (this.touchFix) { return this.datah.nativeElement.getBoundingClientRect(); } return this.data.nativeElement.getBoundingClientRect(); }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "headerRect", { get: function () { return this.header.nativeElement.getBoundingClientRect(); }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "headerRectLeft", { get: function () { return null; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "headerRectRight", { get: function () { return null; }, enumerable: true, configurable: true }); ScrollerComponent.prototype.dataScroll = function (e) { this.doScroll(e); this.scroll.emit(e); }; ScrollerComponent.prototype.dataScrollH = function (e) { this.doScroll(e, true); this.scroll.emit(e); }; Object.defineProperty(ScrollerComponent.prototype, "isAutoScroll", { get: function () { return this.autoScrollInProgress; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "scrollTop", { get: function () { if (this.touchFix) { return this.dataArea.nativeElement.scrollTop; } return this.data.nativeElement.scrollTop; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "scrollLeft", { get: function () { if (this.touchFix) { return this.datah.nativeElement.scrollLeft; } return this.data.nativeElement.scrollLeft; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "scrollWidth", { get: function () { if (this.touchFix) { return this.datah.nativeElement.scrollWidth; } return this.data.nativeElement.scrollWidth; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "scrollHeight", { get: function () { return this.data.nativeElement.scrollHeight; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "viewPortHeight", { get: function () { if (this.touchFix) { return this.dataArea.nativeElement.clientHeight; } return this.data.nativeElement.clientHeight; }, enumerable: true, configurable: true }); Object.defineProperty(ScrollerComponent.prototype, "viewPortWidth", { get: function () { if (this.touchFix) { return this.dataArea.nativeElement.clientWidth; } else { return this.data.nativeElement.clientWidth; } }, enumerable: true, configurable: true }); ScrollerComponent.prototype.prepareAutoScroll = function () { this._scrollRect = this.centerRect; }; ScrollerComponent.prototype.startAutoScroll = function () { var _this = this; if (this.autoScrollInProgress) { return; } if (!this.scrollTimer) { this.scrollTimer = timer(this.state.st.autoScrollInterval, this.state.st.autoScrollInterval); this.scrollSubscription = this.scrollTimer.subscribe(function (t) { return _this.scrollIfNeeded(); }); } this.autoScrollInProgress = true; }; ScrollerComponent.prototype.stopAutoScroll = function () { this._scrollRect = null; this.scrollSpeedY = 0; this.scrollSpeedX = 0; if (this.scrollSubscription) { this.scrollSubscription.unsubscribe(); this.scrollTimer = null; } this.autoScrollInProgress = false; }; // Прокрутка при необходимости ScrollerComponent.prototype.scrollIfNeeded = function () { var sl = this.scrollLeft; var st = this.scrollTop; var sw = this.scrollWidth; var sh = this.scrollHeight; var needSl = sl; var needSt = st; var r0 = this.elementRef.nativeElement.getBoundingClientRect(); if (this.scrollSpeedY < 0) { // листаем влево if (st >= -this.scrollSpeedY) { needSt = st + this.scrollSpeedY; } else { needSt = 0; } } if (this.scrollSpeedY > 0) { // листаем вправо var maxScrollTop = sh - this.scrollerV.nativeElement.clientHeight; if (sl <= (maxScrollTop - this.scrollSpeedY)) { needSt = st + this.scrollSpeedY; } else { needSt = maxScrollTop; } } if (st !== needSt) { this.scrollerV.nativeElement.scrollTop = needSt; return; // По двум направлениям не будем это делать } if (this.scrollSpeedX < 0) { // листаем влево if (sl >= -this.scrollSpeedX) { needSl = sl + this.scrollSpeedX; } else { needSl = 0; } } if (this.scrollSpeedX > 0) { // листаем вправо var maxScrollLeft = sw - this.scrollerH.nativeElement.clientWidth; if (sl <= (maxScrollLeft - this.scrollSpeedX)) { needSl = sl + this.scrollSpeedX; } else { needSl = maxScrollLeft; } } if (sl !== needSl) { this.scrollerH.nativeElement.scrollLeft = needSl; this.autoscrollx.emit(needSl - sl); } }; ScrollerComponent.prototype.scrollTo = function (x, y) { if (y === void 0) { y = -1; } if (y >= 0) { this.scrollerV.nativeElement.scrollTop = y; } if (x >= 0) { this.scrollerH.nativeElement.scrollLeft = x; } }; // После сжатия контента возможны отрицательные значения ScrollLeft. Здесь мы // проверим и исправим это... ScrollerComponent.prototype.fixScroll = function () { if (this.scrollerH.nativeElement.scrollLeft < 0) { this.scrollerH.nativeElement.scrollLeft = 0; } }; ScrollerComponent.prototype.checkAutoScrollX = function (xx, checkParts) { if (checkParts === void 0) { checkParts = false; } var r0 = this._scrollRect; if (!r0) { return null; } if (xx <= r0.left) { // листаем влево this.scrollSpeedX = -this.state.st.autoScrollStep; } else { if (xx >= r0.right) { // вправо this.scrollSpeedX = this.state.st.autoScrollStep; } else { this.scrollSpeedX = 0; } } if (this.scrollSpeedX !== 0) { this.startAutoScroll(); } return r0; }; ScrollerComponent.prototype.checkAutoScrollY = function (yy) { var r0 = this._scrollRect; if (!r0) { return null; } if (yy < r0.top) { // листаем вверх this.scrollSpeedY = -this.state.st.autoScrollStep; } else { if (yy > r0.bottom) { // вниз this.scrollSpeedY = this.state.st.autoScrollStep; } else { this.scrollSpeedY = 0; } } if (this.scrollSpeedY !== 0) { this.startAutoScroll(); } }; ScrollerComponent.prototype.scrollParts = function () { }; ScrollerComponent.prototype.doScroll = function (e, h) { if (h === void 0) { h = false; } var l = e.target; if ((!this.touchFix || h) && this.scrollX !== l.scrollLeft) { this.scrollX = l.scrollLeft; if (this.state.settings.showHeader) { this.header.nativeElement.scrollLeft = this.scrollX; } if (this.state.settings.showFooter) { this.footer.nativeElement.scrollLeft = this.scrollX; } } if (this.scrollY !== l.scrollTop) { this.scrollParts(); } }; ScrollerComponent.prototype.focus = function () { this.elementRef.nativeElement.focus(); }; tslib_1.__decorate([ ViewChild('header', { static: false }), tslib_1.__metadata("design:type", Object) ], ScrollerComponent.prototype, "header", void 0); tslib_1.__decorate([ ViewChild('dataArea', { static: true }), tslib_1.__metadata("design:type", Object) ], ScrollerComponent.prototype, "dataArea", void 0); tslib_1.__decorate([ ViewChild('data', { static: true }), tslib_1.__metadata("design:type", Object) ], ScrollerComponent.prototype, "data", void 0); tslib_1.__decorate([ ViewChild('datah', { static: true }), tslib_1.__metadata("design:type", Object) ], ScrollerComponent.prototype, "datah", void 0); tslib_1.__decorate([ ViewChild('footer', { static: false }), tslib_1.__metadata("design:type", Object) ], ScrollerComponent.prototype, "footer", void 0); tslib_1.__decorate([ Input('maxHeight'), tslib_1.__metadata("design:type", String) ], ScrollerComponent.prototype, "maxHeight", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], ScrollerComponent.prototype, "autoscrollx", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], ScrollerComponent.prototype, "scroll", void 0); tslib_1.__decorate([ HostBinding('class.true-v-scroll'), tslib_1.__metadata("design:type", Object), tslib_1.__metadata("design:paramtypes", []) ], ScrollerComponent.prototype, "autoWidth", null); tslib_1.__decorate([ HostBinding('class.true-fix-touch'), tslib_1.__metadata("design:type", Object), tslib_1.__metadata("design:paramtypes", []) ], ScrollerComponent.prototype, "touchFix", null); ScrollerComponent = tslib_1.__decorate([ Component({ selector: 'true-scroller', template: "<div class=\"true-scroller-header-area\" *ngIf=\"state.settings.showHeader\">\r\n <div #header class=\"true-scroller-header\" [ngClass]=\"state.settings.appearance.headerAreaClass\">\r\n <ng-content select=\"[true-header]\"></ng-content>\r\n </div>\r\n</div>\r\n\r\n<div #dataArea class=\"true-scroller-data-area-scroller\" (scroll)=\"dataScroll($event)\">\r\n <div class=\"true-scroller-data-area\" [style.max-height]=\"maxHeightU\">\r\n <div #data class=\"true-scroller-data\" [ngClass]=\"state.sta.scrollboxClass\" (scroll)=\"dataScroll($event)\">\r\n <div #datah class=\"true-scroller-data-h\" (scroll)=\"dataScrollH($event)\">\r\n <ng-content select=\"[true-data]\"></ng-content>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"true-scroller-footer-area\" *ngIf=\"state.settings.showFooter\">\r\n <div #footer class=\"true-scroller-footer\"\r\n [ngClass]=\"state.settings.appearance.footerAreaClass\" >\r\n <ng-content select=\"[true-footer]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: [":host{overflow-y:hidden;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:justify;justify-content:space-between;height:100%}:host:focus{outline:0}.true-scroller-footer-area,.true-scroller-header-area{overflow-x:hidden;flex-shrink:0;-webkit-box-flex:0;flex-grow:0;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;height:auto}.true-scroller-hidden{height:0!important}.true-scroller-header{overflow-x:hidden;-webkit-box-flex:1;flex-grow:1;box-sizing:border-box}.true-scroller-data-area-scroller{-webkit-box-flex:1;flex:1 1 auto;overflow-y:hidden;-ms-grid-row-align:stretch;align-self:stretch;height:100%}.true-scroller-data-area{height:100%;overflow-x:hidden;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:stretch;align-items:stretch}.true-scroller-data{-webkit-box-flex:1;flex:1 1 auto;overflow-y:auto;overflow-x:auto;box-sizing:border-box;max-width:100%}.true-scroller-data-h{overflow-x:visible;-webkit-overflow-scrolling:touch}:host.true-v-scroll .true-scroller-data{overflow-x:hidden!important;overflow-y:scroll!important;-webkit-overflow-scrolling:touch}:host.true-v-scroll .true-scroller-data .true-scroller-data-h{overflow-x:hidden!important}.true-scroller-footer{overflow-x:hidden;-webkit-box-flex:1;flex-grow:1}:host.true-fix-touch:not(.true-v-scroll) .true-scroller-data-area-scroller{height:1px;overflow-y:auto;-webkit-overflow-scrolling:touch}:host.true-fix-touch .true-scroller-data-area{height:auto;min-height:100%;display:-webkit-box;align-content:stretch;-webkit-overflow-scrolling:touch}:host.true-fix-touch .true-scroller-data{overflow-x:hidden!important;overflow-y:hidden!important;display:-webkit-box;display:flex;-webkit-box-align:stretch;align-items:stretch;-webkit-box-pack:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}:host.true-fix-touch:not(.true-v-scroll) .true-scroller-data-h{overflow-x:auto;-webkit-overflow-scrolling:touch}:host.true-fix-touch.true-v-scroll .true-scroller-data-area-scroller{overflow-y:scroll!important;-webkit-overflow-scrolling:touch}"] }), tslib_1.__param(0, Inject('gridState')), tslib_1.__metadata("design:paramtypes", [GridStateService, ElementRef, ChangeDetectorRef, Renderer2]) ], ScrollerComponent); return ScrollerComponent; }()); export { ScrollerComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvc2Nyb2xsZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztFQUlFO0FBQ0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFDdEQsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUMxQyxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQU94RDtJQXlVRSwyQkFDOEIsS0FBdUIsRUFDekMsVUFBc0IsRUFDdEIsY0FBaUMsRUFDakMsUUFBbUI7UUFIRCxVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUN6QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBM1R4QixjQUFTLEdBQVcsSUFBSSxDQUFDO1FBVWhDLGdCQUFXLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFHL0QsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBWTFDLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsZ0JBQVcsR0FBUSxJQUFJLENBQUM7UUFDeEIsdUJBQWtCLEdBQVEsSUFBSSxDQUFDO1FBRS9CLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUU3QixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVmLGdCQUFXLEdBQVEsSUFBSSxDQUFDO0lBd1JDLENBQUM7SUF6VHBDLHNCQUFXLHlDQUFVO2FBQXJCO1lBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtnQkFDM0IsT0FBTyxPQUFPLENBQUM7YUFDaEI7WUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQzs7O09BQUE7SUFTRCxzQkFBSSx3Q0FBUzthQUFiO1lBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDN0MsQ0FBQzs7O09BQUE7SUFHRCxzQkFBSSx1Q0FBUTthQUFaO1lBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7UUFDekYsQ0FBQzs7O09BQUE7SUFjRCxzQkFBVyx3Q0FBUzthQUFwQjtZQUNFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ25CO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLENBQUM7OztPQUFBO0lBRUQsc0JBQVcsd0NBQVM7YUFBcEI7WUFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN0QjtZQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDOzs7T0FBQTtJQUVELHNCQUFXLHlDQUFVO2FBQXJCO1lBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9ELENBQUM7OztPQUFBO0lBRUQsc0JBQVcseUNBQVU7YUFBckI7WUFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQzthQUN6RDtZQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN6RCxDQUFDOzs7T0FBQTtJQUVELHNCQUFXLHlDQUFVO2FBQXJCO1lBQ0UsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNELENBQUM7OztPQUFBO0lBRUQsc0JBQVcsNkNBQWM7YUFBekI7WUFDRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7OztPQUFBO0lBRUQsc0JBQVcsOENBQWU7YUFBMUI7WUFDRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7OztPQUFBO0lBRUQsc0NBQVUsR0FBVixVQUFXLENBQU07UUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCx1Q0FBVyxHQUFYLFVBQVksQ0FBTTtRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsc0JBQUksMkNBQVk7YUFBaEI7WUFDRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUNuQyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHdDQUFTO2FBQWI7WUFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO2FBQzlDO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7UUFDM0MsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSx5Q0FBVTthQUFkO1lBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQzthQUM1QztZQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQzVDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksMENBQVc7YUFBZjtZQUNFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7YUFDN0M7WUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDJDQUFZO2FBQWhCO1lBQ0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFDOUMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSw2Q0FBYzthQUFsQjtZQUNFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7YUFDakQ7WUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUM5QyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDRDQUFhO2FBQWpCO1lBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzthQUNoRDtpQkFBTTtnQkFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzthQUM1QztRQUNILENBQUM7OztPQUFBO0lBRU0sNkNBQWlCLEdBQXhCO1FBQ0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFTSwyQ0FBZSxHQUF0QjtRQUFBLGlCQVlDO1FBVkMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBQyxDQUFNLElBQUssT0FBQSxLQUFJLENBQUMsY0FBYyxFQUFFLEVBQXJCLENBQXFCLENBQUMsQ0FBQztTQUN6RjtRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQUVNLDBDQUFjLEdBQXJCO1FBQ0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRUQsOEJBQThCO0lBQ3ZCLDBDQUFjLEdBQXJCO1FBRUUsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMzQixJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLElBQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUU3QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFakUsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRTtZQUN6QixnQkFBZ0I7WUFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUM1QixNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUNaO1NBQ0Y7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLGlCQUFpQjtZQUNqQixJQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQ3BFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDNUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxZQUFZLENBQUM7YUFDdkI7U0FDRjtRQUVELElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ2hELE9BQU8sQ0FBQywyQ0FBMkM7U0FDcEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLGdCQUFnQjtZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzVCLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUNqQztpQkFBTTtnQkFDTCxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ1o7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUU7WUFDekIsaUJBQWlCO1lBQ2pCLElBQU0sYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDcEUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUM3QyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsTUFBTSxHQUFHLGFBQWEsQ0FBQzthQUN4QjtTQUNGO1FBRUQsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQztJQUVNLG9DQUFRLEdBQWYsVUFBZ0IsQ0FBUyxFQUFFLENBQWM7UUFBZCxrQkFBQSxFQUFBLEtBQWEsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsNkJBQTZCO0lBQ3RCLHFDQUFTLEdBQWhCO1FBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBRU0sNENBQWdCLEdBQXZCLFVBQXdCLEVBQVUsRUFBRSxVQUEyQjtRQUEzQiwyQkFBQSxFQUFBLGtCQUEyQjtRQUU3RCxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRTVCLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRTtZQUNqQixnQkFBZ0I7WUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRTtnQkFDbEIsU0FBUztnQkFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUNsRDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQzthQUN2QjtTQUNGO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSw0Q0FBZ0IsR0FBdkIsVUFBd0IsRUFBVTtRQUNoQyxJQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUNmLGdCQUFnQjtZQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDO1NBQ25EO2FBQU07WUFDTCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUNsQixPQUFPO2dCQUNQLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2xEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZCO1NBQ0Y7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFTSx1Q0FBVyxHQUFsQixjQUF1QixDQUFDO0lBRXhCLG9DQUFRLEdBQVIsVUFBUyxDQUFNLEVBQUUsQ0FBa0I7UUFBbEIsa0JBQUEsRUFBQSxTQUFrQjtRQUNqQyxJQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRW5CLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFO1lBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDckQ7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDckQ7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFTSxpQ0FBSyxHQUFaO1FBQ0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQXBVRDtRQURDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLENBQUM7O3FEQUNsQjtJQUduQjtRQURDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUM7O3VEQUNqQjtJQUdyQjtRQURDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUM7O21EQUNqQjtJQUdqQjtRQURDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUM7O29EQUNqQjtJQUdsQjtRQURDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLENBQUM7O3FEQUNsQjtJQUduQjtRQURDLEtBQUssQ0FBQyxXQUFXLENBQUM7O3dEQUNhO0lBVWhDO1FBREMsTUFBTSxFQUFFOzBDQUNJLFlBQVk7MERBQXNDO0lBRy9EO1FBREMsTUFBTSxFQUFFOzBDQUNELFlBQVk7cURBQWdDO0lBR3BEO1FBREMsV0FBVyxDQUFDLHFCQUFxQixDQUFDOzs7c0RBR2xDO0lBR0Q7UUFEQyxXQUFXLENBQUMsc0JBQXNCLENBQUM7OztxREFHbkM7SUF6Q1UsaUJBQWlCO1FBTDdCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxlQUFlO1lBQ3pCLCtoQ0FBd0M7O1NBRXpDLENBQUM7UUEyVUcsbUJBQUEsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2lEQUFlLGdCQUFnQjtZQUM3QixVQUFVO1lBQ04saUJBQWlCO1lBQ3ZCLFNBQVM7T0E3VXBCLGlCQUFpQixDQThVN0I7SUFBRCx3QkFBQztDQUFBLEFBOVVELElBOFVDO1NBOVVZLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBBbGVrc2V5IE1lbG5pa292LCBUcnVlIERpcmVjdGl2ZSBDb21wYW55LlxyXG4gKiBAbGluayBodHRwczovL3RydWVkaXJlY3RpdmUuY29tL1xyXG4gKiBAbGljZW5zZSBNSVRcclxuKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIEluamVjdCwgSG9zdEJpbmRpbmcsXHJcbiAgICAgICAgIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgR3JpZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZ3JpZC1zdGF0ZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1zY3JvbGxlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdHlsZXMvc2Nyb2xsZXIuYmVoYXZpb3Iuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxlckNvbXBvbmVudCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2hlYWRlcicsIHtzdGF0aWM6IGZhbHNlfSlcclxuICBwdWJsaWMgaGVhZGVyOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2RhdGFBcmVhJywge3N0YXRpYzogdHJ1ZX0pXHJcbiAgcHVibGljIGRhdGFBcmVhOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2RhdGEnLCB7c3RhdGljOiB0cnVlfSlcclxuICBwdWJsaWMgZGF0YTogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXRhaCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHB1YmxpYyBkYXRhaDogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdmb290ZXInLCB7c3RhdGljOiBmYWxzZX0pXHJcbiAgcHVibGljIGZvb3RlcjogYW55O1xyXG5cclxuICBASW5wdXQoJ21heEhlaWdodCcpXHJcbiAgcHVibGljIG1heEhlaWdodDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgcHVibGljIGdldCBtYXhIZWlnaHRVKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5tYXhIZWlnaHQgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuICd1bnNldCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5tYXhIZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KClcclxuICBhdXRvc2Nyb2xseDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2Nyb2xsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRydWUtdi1zY3JvbGwnKVxyXG4gIGdldCBhdXRvV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zZXR0aW5ncy5jb2x1bW5BdXRvV2lkdGg7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRydWUtZml4LXRvdWNoJylcclxuICBnZXQgdG91Y2hGaXgoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuc3RhdGUuaU9TIHx8IHRoaXMuc3RhdGUuYW5kcm9pZCkgJiYgdGhpcy5zdGF0ZS5zZXR0aW5ncy5lbmFibGVUb3VjaFNjcm9sbDtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzY3JvbGxYID0gMDtcclxuICBwcm90ZWN0ZWQgc2Nyb2xsWSA9IDA7XHJcbiAgcHJpdmF0ZSBzY3JvbGxUaW1lcjogYW55ID0gbnVsbDtcclxuICBwcml2YXRlIHNjcm9sbFN1YnNjcmlwdGlvbjogYW55ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBhdXRvU2Nyb2xsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgIHNjcm9sbFNwZWVkWCA9IDA7XHJcbiAgcHVibGljICBzY3JvbGxTcGVlZFkgPSAwO1xyXG5cclxuICBwcm90ZWN0ZWQgX3Njcm9sbFJlY3Q6IGFueSA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnZXQgc2Nyb2xsZXJIKCkge1xyXG4gICAgaWYgKHRoaXMudG91Y2hGaXgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YWg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzY3JvbGxlclYoKSB7XHJcbiAgICBpZiAodGhpcy50b3VjaEZpeCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhQXJlYTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNsaWVudFJlY3QoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2VudGVyUmVjdCgpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMudG91Y2hGaXgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YWgubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRhdGEubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGVhZGVyUmVjdCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhlYWRlclJlY3RMZWZ0KCk6IGFueSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGVhZGVyUmVjdFJpZ2h0KCk6IGFueSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGRhdGFTY3JvbGwoZTogYW55KSB7XHJcbiAgICB0aGlzLmRvU2Nyb2xsKGUpO1xyXG4gICAgdGhpcy5zY3JvbGwuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIGRhdGFTY3JvbGxIKGU6IGFueSkge1xyXG4gICAgdGhpcy5kb1Njcm9sbChlLCB0cnVlKTtcclxuICAgIHRoaXMuc2Nyb2xsLmVtaXQoZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBdXRvU2Nyb2xsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0b1Njcm9sbEluUHJvZ3Jlc3M7XHJcbiAgfVxyXG5cclxuICBnZXQgc2Nyb2xsVG9wKCkge1xyXG4gICAgaWYgKHRoaXMudG91Y2hGaXgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YUFyZWEubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjcm9sbExlZnQoKSB7XHJcbiAgICBpZiAodGhpcy50b3VjaEZpeCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhaC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcclxuICB9XHJcblxyXG4gIGdldCBzY3JvbGxXaWR0aCgpIHtcclxuICAgIGlmICh0aGlzLnRvdWNoRml4KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGFoLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XHJcbiAgfVxyXG5cclxuICBnZXQgc2Nyb2xsSGVpZ2h0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcclxuICB9XHJcblxyXG4gIGdldCB2aWV3UG9ydEhlaWdodCgpIHtcclxuICAgIGlmICh0aGlzLnRvdWNoRml4KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGFBcmVhLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICB9XHJcblxyXG4gIGdldCB2aWV3UG9ydFdpZHRoKCkge1xyXG4gICAgaWYgKHRoaXMudG91Y2hGaXgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YUFyZWEubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGEubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmVwYXJlQXV0b1Njcm9sbCgpIHtcclxuICAgIHRoaXMuX3Njcm9sbFJlY3QgPSB0aGlzLmNlbnRlclJlY3Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRBdXRvU2Nyb2xsKCkge1xyXG5cclxuICAgIGlmICh0aGlzLmF1dG9TY3JvbGxJblByb2dyZXNzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc2Nyb2xsVGltZXIpIHtcclxuICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IHRpbWVyKHRoaXMuc3RhdGUuc3QuYXV0b1Njcm9sbEludGVydmFsLCB0aGlzLnN0YXRlLnN0LmF1dG9TY3JvbGxJbnRlcnZhbCk7XHJcbiAgICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy5zY3JvbGxUaW1lci5zdWJzY3JpYmUoKHQ6IGFueSkgPT4gdGhpcy5zY3JvbGxJZk5lZWRlZCgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmF1dG9TY3JvbGxJblByb2dyZXNzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdG9wQXV0b1Njcm9sbCgpIHtcclxuICAgIHRoaXMuX3Njcm9sbFJlY3QgPSBudWxsO1xyXG4gICAgdGhpcy5zY3JvbGxTcGVlZFkgPSAwO1xyXG4gICAgdGhpcy5zY3JvbGxTcGVlZFggPSAwO1xyXG4gICAgaWYgKHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXV0b1Njcm9sbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vINCf0YDQvtC60YDRg9GC0LrQsCDQv9GA0Lgg0L3QtdC+0LHRhdC+0LTQuNC80L7RgdGC0LhcclxuICBwdWJsaWMgc2Nyb2xsSWZOZWVkZWQoKSB7XHJcblxyXG4gICAgY29uc3Qgc2wgPSB0aGlzLnNjcm9sbExlZnQ7XHJcbiAgICBjb25zdCBzdCA9IHRoaXMuc2Nyb2xsVG9wO1xyXG4gICAgY29uc3Qgc3cgPSB0aGlzLnNjcm9sbFdpZHRoO1xyXG4gICAgY29uc3Qgc2ggPSB0aGlzLnNjcm9sbEhlaWdodDtcclxuXHJcbiAgICBsZXQgbmVlZFNsID0gc2w7XHJcbiAgICBsZXQgbmVlZFN0ID0gc3Q7XHJcblxyXG4gICAgY29uc3QgcjAgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zY3JvbGxTcGVlZFkgPCAwKSB7XHJcbiAgICAgIC8vINC70LjRgdGC0LDQtdC8INCy0LvQtdCy0L5cclxuICAgICAgaWYgKHN0ID49IC10aGlzLnNjcm9sbFNwZWVkWSkge1xyXG4gICAgICAgIG5lZWRTdCA9IHN0ICsgdGhpcy5zY3JvbGxTcGVlZFk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmVlZFN0ID0gMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNjcm9sbFNwZWVkWSA+IDApIHtcclxuICAgICAgLy8g0LvQuNGB0YLQsNC10Lwg0LLQv9GA0LDQstC+XHJcbiAgICAgIGNvbnN0IG1heFNjcm9sbFRvcCA9IHNoIC0gdGhpcy5zY3JvbGxlclYubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmIChzbCA8PSAobWF4U2Nyb2xsVG9wIC0gdGhpcy5zY3JvbGxTcGVlZFkpKSB7XHJcbiAgICAgICAgbmVlZFN0ID0gc3QgKyB0aGlzLnNjcm9sbFNwZWVkWTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZWVkU3QgPSBtYXhTY3JvbGxUb3A7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3QgIT09IG5lZWRTdCkge1xyXG4gICAgICB0aGlzLnNjcm9sbGVyVi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IG5lZWRTdDtcclxuICAgICAgcmV0dXJuOyAvLyDQn9C+INC00LLRg9C8INC90LDQv9GA0LDQstC70LXQvdC40Y/QvCDQvdC1INCx0YPQtNC10Lwg0Y3RgtC+INC00LXQu9Cw0YLRjFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNjcm9sbFNwZWVkWCA8IDApIHtcclxuICAgICAgLy8g0LvQuNGB0YLQsNC10Lwg0LLQu9C10LLQvlxyXG4gICAgICBpZiAoc2wgPj0gLXRoaXMuc2Nyb2xsU3BlZWRYKSB7XHJcbiAgICAgICAgbmVlZFNsID0gc2wgKyB0aGlzLnNjcm9sbFNwZWVkWDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZWVkU2wgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2Nyb2xsU3BlZWRYID4gMCkge1xyXG4gICAgICAvLyDQu9C40YHRgtCw0LXQvCDQstC/0YDQsNCy0L5cclxuICAgICAgY29uc3QgbWF4U2Nyb2xsTGVmdCA9IHN3IC0gdGhpcy5zY3JvbGxlckgubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgaWYgKHNsIDw9IChtYXhTY3JvbGxMZWZ0IC0gdGhpcy5zY3JvbGxTcGVlZFgpKSB7XHJcbiAgICAgICAgbmVlZFNsID0gc2wgKyB0aGlzLnNjcm9sbFNwZWVkWDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZWVkU2wgPSBtYXhTY3JvbGxMZWZ0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNsICE9PSBuZWVkU2wpIHtcclxuICAgICAgdGhpcy5zY3JvbGxlckgubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gbmVlZFNsO1xyXG4gICAgICB0aGlzLmF1dG9zY3JvbGx4LmVtaXQobmVlZFNsIC0gc2wpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvKHg6IG51bWJlciwgeTogbnVtYmVyID0gLTEpIHtcclxuICAgIGlmICh5ID49IDApIHtcclxuICAgICAgdGhpcy5zY3JvbGxlclYubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB5O1xyXG4gICAgfVxyXG4gICAgaWYgKHggPj0gMCkge1xyXG4gICAgICB0aGlzLnNjcm9sbGVySC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g0J/QvtGB0LvQtSDRgdC20LDRgtC40Y8g0LrQvtC90YLQtdC90YLQsCDQstC+0LfQvNC+0LbQvdGLINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C1INC30L3QsNGH0LXQvdC40Y8gU2Nyb2xsTGVmdC4g0JfQtNC10YHRjCDQvNGLXHJcbiAgLy8g0L/RgNC+0LLQtdGA0LjQvCDQuCDQuNGB0L/RgNCw0LLQuNC8INGN0YLQvi4uLlxyXG4gIHB1YmxpYyBmaXhTY3JvbGwoKSB7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxlckgubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0IDwgMCkge1xyXG4gICAgICB0aGlzLnNjcm9sbGVySC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrQXV0b1Njcm9sbFgoeHg6IG51bWJlciwgY2hlY2tQYXJ0czogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuXHJcbiAgICBjb25zdCByMCA9IHRoaXMuX3Njcm9sbFJlY3Q7XHJcblxyXG4gICAgaWYgKCFyMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoeHggPD0gcjAubGVmdCkge1xyXG4gICAgICAvLyDQu9C40YHRgtCw0LXQvCDQstC70LXQstC+XHJcbiAgICAgIHRoaXMuc2Nyb2xsU3BlZWRYID0gLXRoaXMuc3RhdGUuc3QuYXV0b1Njcm9sbFN0ZXA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoeHggPj0gcjAucmlnaHQpIHtcclxuICAgICAgICAvLyDQstC/0YDQsNCy0L5cclxuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkWCA9IHRoaXMuc3RhdGUuc3QuYXV0b1Njcm9sbFN0ZXA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxTcGVlZFggPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2Nyb2xsU3BlZWRYICE9PSAwKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBdXRvU2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHIwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrQXV0b1Njcm9sbFkoeXk6IG51bWJlcik6IGFueSB7XHJcbiAgICBjb25zdCByMCA9IHRoaXMuX3Njcm9sbFJlY3Q7XHJcbiAgICBpZiAoIXIwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh5eSA8IHIwLnRvcCkge1xyXG4gICAgICAvLyDQu9C40YHRgtCw0LXQvCDQstCy0LXRgNGFXHJcbiAgICAgIHRoaXMuc2Nyb2xsU3BlZWRZID0gLXRoaXMuc3RhdGUuc3QuYXV0b1Njcm9sbFN0ZXA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoeXkgPiByMC5ib3R0b20pIHtcclxuICAgICAgICAvLyDQstC90LjQt1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWRZID0gdGhpcy5zdGF0ZS5zdC5hdXRvU2Nyb2xsU3RlcDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkWSA9IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zY3JvbGxTcGVlZFkgIT09IDApIHtcclxuICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxQYXJ0cygpIHsgfVxyXG5cclxuICBkb1Njcm9sbChlOiBhbnksIGg6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgY29uc3QgbCA9IGUudGFyZ2V0O1xyXG5cclxuICAgIGlmICgoIXRoaXMudG91Y2hGaXggfHwgaCkgJiYgdGhpcy5zY3JvbGxYICE9PSBsLnNjcm9sbExlZnQpIHtcclxuICAgICAgdGhpcy5zY3JvbGxYID0gbC5zY3JvbGxMZWZ0O1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncy5zaG93SGVhZGVyKSB7ICAgICAgICBcclxuICAgICAgICB0aGlzLmhlYWRlci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbFg7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc3RhdGUuc2V0dGluZ3Muc2hvd0Zvb3Rlcikge1xyXG4gICAgICAgIHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsWDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNjcm9sbFkgIT09IGwuc2Nyb2xsVG9wKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsUGFydHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1cygpIHtcclxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2dyaWRTdGF0ZScpIHB1YmxpYyBzdGF0ZTogR3JpZFN0YXRlU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxufSJdfQ==