UNPKG

ngx-beautiful-charts

Version:
243 lines 20.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ElementRef } from '@angular/core'; import { colorSchemes } from '../../constants/color-schemes'; import { GanttChartService } from './gantt-chart.service'; import { GlobalParametersService } from '../../global/global-parameters.service'; var GanttChartComponent = /** @class */ (function () { // setColors() { // let cnt = 0; // for (const team of this.ganttChartService.data) { // if (!team.color) team.color = colorSchemes[this.ganttChartService.colorScheme][cnt % 10]; // cnt++; // } // } function GanttChartComponent(ganttChartService, globalParametersService, currentElement) { this.ganttChartService = ganttChartService; this.globalParametersService = globalParametersService; this.currentElement = currentElement; this.colorScheme = 'colorful'; this.customColorScheme = []; this.xPadding = 60; this.yPadding = this.xPadding / 2; } /** * @return {?} */ GanttChartComponent.prototype.setDimensions = /** * @return {?} */ function () { if (this.width) this.height = this.width - this.xPadding; else { /** @type {?} */ var host = this.currentElement.nativeElement; if (host.parentNode != null) { /** @type {?} */ var dims = host.parentNode.getBoundingClientRect(); this.width = dims.width; this.height = this.width - this.xPadding; } } // console.log('---set dimensions---'); // console.log('width: ' + this.width); // console.log('height: ' + this.height); // console.log('--------------------'); }; /** * @return {?} */ GanttChartComponent.prototype.setColors = /** * @return {?} */ function () { var e_1, _a; /** @type {?} */ var cnt = 0; try { for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) { var team = _c.value; if (!team.color) { if (this.customColorScheme.length > 0) { team.color = this.customColorScheme[cnt % this.customColorScheme.length]; } else { team.color = colorSchemes[this.colorScheme][cnt % 10]; } cnt++; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; /** * @return {?} */ GanttChartComponent.prototype.definePhaseTimelines = /** * @return {?} */ function () { var e_2, _a, e_3, _b, e_4, _c, e_5, _d; this.phaseTimelines = {}; try { for (var _e = tslib_1.__values(this.ganttChartService.ganttPhases), _f = _e.next(); !_f.done; _f = _e.next()) { var phase = _f.value; this.phaseTimelines[phase] = []; } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_f && !_f.done && (_a = _e.return)) _a.call(_e); } finally { if (e_2) throw e_2.error; } } try { for (var _g = tslib_1.__values(this.ganttChartService.data), _h = _g.next(); !_h.done; _h = _g.next()) { var team = _h.value; try { for (var _j = tslib_1.__values(Object.keys(team.timelines)), _k = _j.next(); !_k.done; _k = _j.next()) { var phase = _k.value; try { for (var _l = tslib_1.__values(team.timelines[phase]), _m = _l.next(); !_m.done; _m = _l.next()) { var timeline = _m.value; this.phaseTimelines[phase].push({ from: timeline.from, to: timeline.to, color: team.color, info: timeline.info, toolTip: (timeline.info ? 'block' : 'none') }); } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (_m && !_m.done && (_d = _l.return)) _d.call(_l); } finally { if (e_5) throw e_5.error; } } } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (_k && !_k.done && (_c = _j.return)) _c.call(_j); } finally { if (e_4) throw e_4.error; } } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_h && !_h.done && (_b = _g.return)) _b.call(_g); } finally { if (e_3) throw e_3.error; } } // console.log('phase timelines: '); // console.log(this.phaseTimelines); }; /** * @return {?} */ GanttChartComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.componentID = this.globalParametersService.addNewComponent(); this.setDimensions(); this.setColors(); this.ganttChartService.setValues({ componentID: this.componentID, width: this.width, xPadding: this.xPadding, yPadding: this.yPadding, data: this.data }); this.height = this.ganttChartService.height; this.definePhaseTimelines(); }; /** * @return {?} */ GanttChartComponent.prototype.ngOnChanges = /** * @return {?} */ function () { this.setDimensions(); this.setColors(); this.ganttChartService.setValues({ componentID: this.componentID, width: this.width, xPadding: this.xPadding, yPadding: this.yPadding, data: this.data }); this.height = this.ganttChartService.height; this.definePhaseTimelines(); }; GanttChartComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-gantt-chart', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n <g ngx-gc-chart-base />\n <g *ngFor=\"let phase of ganttChartService.ganttPhases; index as i\">\n <g id=\"component\" *ngFor=\"let ganttEntry of phaseTimelines[phase]; index as j\">\n <rect class=\"gantt-entry\"\n [attr.x]=\"xPadding + 150 + ganttChartService.transformGanttDate(ganttEntry.from)\" \n [attr.y]=\"i * 60 + yPadding + 20\" \n [attr.width]=\"ganttChartService.transformGanttDate(ganttEntry.to) - ganttChartService.transformGanttDate(ganttEntry.from)\" \n [attr.height]=\"20\" \n rx=\"6\" ry=\"6\"\n [attr.fill]=\"ganttEntry.color\" />\n\n <!-- [attr.x]=\"x + 150 + ganttChartService.transformGanttDate(ganttEntry.from)\" \n [attr.y]=\"i * 60 + y + 20\" -->\n <g class=\"tooltip\" [ngStyle]=\"{\n 'transform': 'translate(' + (xPadding + 150 + ganttChartService.transformGanttDate(ganttEntry.to) - ((ganttChartService.transformGanttDate(ganttEntry.to) - ganttChartService.transformGanttDate(ganttEntry.from)) / 2)) + 'px, ' + (i * 60 + yPadding - 5) + 'px)',\n 'display': ganttEntry.toolTip}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"200\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ ganttEntry.info }}</text>\n </g>\n </g>\n </g>\n</svg>", providers: [GanttChartService], styles: [".gantt-entry{opacity:.8}.gantt-entry:hover{opacity:1}#component .tooltip{visibility:hidden}#component:hover .tooltip{visibility:visible;position:absolute}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif}.tooltip rect{fill:#222;stroke:#111}"] }] } ]; /** @nocollapse */ GanttChartComponent.ctorParameters = function () { return [ { type: GanttChartService }, { type: GlobalParametersService }, { type: ElementRef } ]; }; GanttChartComponent.propDecorators = { data: [{ type: Input }], width: [{ type: Input }], colorScheme: [{ type: Input }], customColorScheme: [{ type: Input }] }; return GanttChartComponent; }()); export { GanttChartComponent }; if (false) { /** @type {?} */ GanttChartComponent.prototype.data; /** @type {?} */ GanttChartComponent.prototype.width; /** @type {?} */ GanttChartComponent.prototype.colorScheme; /** @type {?} */ GanttChartComponent.prototype.customColorScheme; /** @type {?} */ GanttChartComponent.prototype.componentID; /** @type {?} */ GanttChartComponent.prototype.xPadding; /** @type {?} */ GanttChartComponent.prototype.yPadding; /** @type {?} */ GanttChartComponent.prototype.height; /** @type {?} */ GanttChartComponent.prototype.phaseTimelines; /** @type {?} */ GanttChartComponent.prototype.ganttChartService; /** * @type {?} * @private */ GanttChartComponent.prototype.globalParametersService; /** * @type {?} * @private */ GanttChartComponent.prototype.currentElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJlYXV0aWZ1bC1jaGFydHMvIiwic291cmNlcyI6WyJsaWIvZ2FudHQtY2hhcnQvZ2FudHQtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFakY7SUFzRUUsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixzREFBc0Q7SUFDdEQsZ0dBQWdHO0lBQ2hHLGFBQWE7SUFDYixNQUFNO0lBQ04sSUFBSTtJQUVKLDZCQUFtQixpQkFBb0MsRUFDbkMsdUJBQWdELEVBQ2hELGNBQTBCO1FBRjNCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDbkMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBWTtRQXRFckMsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFpRXFCLENBQUM7Ozs7SUE3RG5ELDJDQUFhOzs7SUFBYjtRQUNFLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNwRDs7Z0JBQ0csSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtZQUM5QyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFOztvQkFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDMUM7U0FDRjtRQUNELHVDQUF1QztRQUN2Qyx1Q0FBdUM7UUFDdkMseUNBQXlDO1FBQ3pDLHVDQUF1QztJQUN6QyxDQUFDOzs7O0lBRUQsdUNBQVM7OztJQUFUOzs7WUFDTSxHQUFHLEdBQUcsQ0FBQzs7WUFDWCxLQUFtQixJQUFBLEtBQUEsaUJBQUEsSUFBSSxDQUFDLElBQUksQ0FBQSxnQkFBQSw0QkFBRTtnQkFBekIsSUFBTSxJQUFJLFdBQUE7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ2YsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDMUU7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztxQkFDdkQ7b0JBQ0QsR0FBRyxFQUFFLENBQUM7aUJBQ1A7YUFDRjs7Ozs7Ozs7O0lBQ0gsQ0FBQzs7OztJQUVELGtEQUFvQjs7O0lBQXBCOztRQUNFLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDOztZQUN6QixLQUFvQixJQUFBLEtBQUEsaUJBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQSxnQkFBQSw0QkFBRTtnQkFBbkQsSUFBTSxLQUFLLFdBQUE7Z0JBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDakM7Ozs7Ozs7Ozs7WUFFRCxLQUFtQixJQUFBLEtBQUEsaUJBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQSxnQkFBQSw0QkFBRTtnQkFBM0MsSUFBTSxJQUFJLFdBQUE7O29CQUNiLEtBQW9CLElBQUEsS0FBQSxpQkFBQSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQSxnQkFBQSw0QkFBRTt3QkFBNUMsSUFBTSxLQUFLLFdBQUE7OzRCQUNkLEtBQXVCLElBQUEsS0FBQSxpQkFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dDQUF6QyxJQUFNLFFBQVEsV0FBQTtnQ0FDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7b0NBQ2xELEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtvQ0FDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7b0NBQ2pCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtvQ0FDbkIsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUM7NkJBQ2pEOzs7Ozs7Ozs7cUJBQ0Y7Ozs7Ozs7OzthQUNGOzs7Ozs7Ozs7UUFDRCxvQ0FBb0M7UUFDcEMsb0NBQW9DO0lBQ3RDLENBQUM7Ozs7SUFjRCxzQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDL0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQzs7OztJQUVELHlDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztZQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUM1QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDOztnQkE3R0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLHM0Q0FBMkM7b0JBRTNDLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDOztpQkFDL0I7Ozs7Z0JBUlEsaUJBQWlCO2dCQUNqQix1QkFBdUI7Z0JBSGMsVUFBVTs7O3VCQWFyRCxLQUFLO3dCQUNMLEtBQUs7OEJBQ0wsS0FBSztvQ0FDTCxLQUFLOztJQW9HUiwwQkFBQztDQUFBLEFBL0dELElBK0dDO1NBekdZLG1CQUFtQjs7O0lBRTlCLG1DQUFjOztJQUNkLG9DQUF1Qjs7SUFDdkIsMENBQWtDOztJQUNsQyxnREFBMEM7O0lBRTFDLDBDQUFZOztJQUNaLHVDQUFjOztJQUNkLHVDQUE2Qjs7SUFDN0IscUNBQWU7O0lBQ2YsNkNBQWU7O0lBNkRILGdEQUEyQzs7Ozs7SUFDM0Msc0RBQXdEOzs7OztJQUN4RCw2Q0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25DaGFuZ2VzLCBJbnB1dCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29sb3JTY2hlbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbG9yLXNjaGVtZXMnO1xuaW1wb3J0IHsgR2FudHRDaGFydFNlcnZpY2UgfSBmcm9tICcuL2dhbnR0LWNoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9nbG9iYWwvZ2xvYmFsLXBhcmFtZXRlcnMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1nYW50dC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYW50dC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhbnR0LWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0dhbnR0Q2hhcnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBHYW50dENoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIGRhdGE7XG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9yU2NoZW1lID0gJ2NvbG9yZnVsJztcbiAgQElucHV0KCkgY3VzdG9tQ29sb3JTY2hlbWU6IHN0cmluZ1tdID0gW107XG5cbiAgY29tcG9uZW50SUQ7XG4gIHhQYWRkaW5nID0gNjA7XG4gIHlQYWRkaW5nID0gdGhpcy54UGFkZGluZyAvIDI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBwaGFzZVRpbWVsaW5lcztcblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoKSB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggLSB0aGlzLnhQYWRkaW5nO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY3VycmVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChob3N0LnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkaW1zID0gaG9zdC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLndpZHRoID0gZGltcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoIC0gdGhpcy54UGFkZGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJy0tLXNldCBkaW1lbnNpb25zLS0tJyk7XG4gICAgLy8gY29uc29sZS5sb2coJ3dpZHRoOiAnICsgdGhpcy53aWR0aCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2hlaWdodDogJyArIHRoaXMuaGVpZ2h0KTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgfVxuXG4gIHNldENvbG9ycygpIHtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGNvbnN0IHRlYW0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoIXRlYW0uY29sb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRlYW0uY29sb3IgPSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lW2NudCAlIHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZWFtLmNvbG9yID0gY29sb3JTY2hlbWVzW3RoaXMuY29sb3JTY2hlbWVdW2NudCAlIDEwXTtcbiAgICAgICAgfVxuICAgICAgICBjbnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWZpbmVQaGFzZVRpbWVsaW5lcygpIHtcbiAgICB0aGlzLnBoYXNlVGltZWxpbmVzID0ge307XG4gICAgZm9yIChjb25zdCBwaGFzZSBvZiB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0UGhhc2VzKSB7XG4gICAgICB0aGlzLnBoYXNlVGltZWxpbmVzW3BoYXNlXSA9IFtdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGVhbSBvZiB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgcGhhc2Ugb2YgT2JqZWN0LmtleXModGVhbS50aW1lbGluZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGltZWxpbmUgb2YgdGVhbS50aW1lbGluZXNbcGhhc2VdKSB7XG4gICAgICAgICAgdGhpcy5waGFzZVRpbWVsaW5lc1twaGFzZV0ucHVzaCh7ZnJvbTogdGltZWxpbmUuZnJvbSxcbiAgICAgICAgICAgIHRvOiB0aW1lbGluZS50byxcbiAgICAgICAgICAgIGNvbG9yOiB0ZWFtLmNvbG9yLFxuICAgICAgICAgICAgaW5mbzogdGltZWxpbmUuaW5mbyxcbiAgICAgICAgICAgIHRvb2xUaXA6ICh0aW1lbGluZS5pbmZvID8gJ2Jsb2NrJyA6ICdub25lJyl9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygncGhhc2UgdGltZWxpbmVzOiAnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnBoYXNlVGltZWxpbmVzKTtcbiAgfVxuXG4gIC8vIHNldENvbG9ycygpIHtcbiAgLy8gICBsZXQgY250ID0gMDtcbiAgLy8gICBmb3IgKGNvbnN0IHRlYW0gb2YgdGhpcy5nYW50dENoYXJ0U2VydmljZS5kYXRhKSB7XG4gIC8vICAgICBpZiAoIXRlYW0uY29sb3IpIHRlYW0uY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5nYW50dENoYXJ0U2VydmljZS5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAvLyAgICAgY250Kys7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGdhbnR0Q2hhcnRTZXJ2aWNlOiBHYW50dENoYXJ0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBnbG9iYWxQYXJhbWV0ZXJzU2VydmljZTogR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY3VycmVudEVsZW1lbnQ6IEVsZW1lbnRSZWYpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5nYW50dENoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuaGVpZ2h0O1xuICAgIHRoaXMuZGVmaW5lUGhhc2VUaW1lbGluZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5nYW50dENoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuaGVpZ2h0O1xuICAgIHRoaXMuZGVmaW5lUGhhc2VUaW1lbGluZXMoKTtcbiAgfVxuXG59XG4iXX0=