ngx-beautiful-charts
Version:
A library to create charts in Angular
221 lines • 22.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component } from '@angular/core';
import { GanttChartService } from '../gantt-chart.service';
var GcChartBaseComponent = /** @class */ (function () {
// ganttChartData = [
// {
// name: 'Market Team',
// color: '#EAC435',
// timelines: {
// 'Market Research': [
// {from: new Date('June 9, 2019'), to: new Date('July 20, 2019')},
// {from: new Date('October 9, 2019'), to: new Date('November 20, 2019')}
// ],
// 'User Documentation': [
// {from: new Date('August 10, 2019'), to: new Date('September 15, 2019')}
// ]
// }
// },
// {
// name: 'Development Team',
// color: '#345995',
// timelines: {
// 'Software Development': [
// {from: new Date('July 9, 2019'), to: new Date('October 20, 2019')}
// ],
// 'Testing': [
// {from: new Date('October 25, 2019'), to: new Date('November 15, 2019')}
// ],
// 'User Documentation': [
// {from: new Date('August 1, 2019'), to: new Date('August 15, 2019')}
// ]
// }
// }
// ];
function GcChartBaseComponent(ganttChartService) {
this.ganttChartService = ganttChartService;
this.monthNames = [
'January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'
];
}
/**
* @param {?} date
* @param {?} days
* @return {?}
*/
GcChartBaseComponent.prototype.addDays = /**
* @param {?} date
* @param {?} days
* @return {?}
*/
function (date, days) {
/** @type {?} */
var newdate = new Date(date);
newdate.setDate((new Date(date)).getDate() + days);
/** @type {?} */
var day = newdate.getDate();
/** @type {?} */
var monthIndex = newdate.getMonth();
/** @type {?} */
var year = newdate.getFullYear();
return this.monthNames[monthIndex] + ' ' + day + ', ' + year;
};
/**
* @param {?} date
* @return {?}
*/
GcChartBaseComponent.prototype.shortenDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
date = date.replace('January', 'Jan');
date = date.replace('February', 'Feb');
date = date.replace('March', 'Mar');
date = date.replace('April', 'Apr');
date = date.replace('May', 'May');
date = date.replace('June', 'Jun');
date = date.replace('July', 'Jul');
date = date.replace('August', 'Aug');
date = date.replace('September', 'Sep');
date = date.replace('October', 'Oct');
date = date.replace('November', 'Nov');
date = date.replace('December', 'Dec');
return date;
};
/**
* @return {?}
*/
GcChartBaseComponent.prototype.computeGrid = /**
* @return {?}
*/
function () {
var e_1, _a;
// compute the min date and max date
// const oneDay = 24 * 60 * 60 * 1000;
// const dateRange = Math.round(Math.abs(
// (this.ganttChartService.ganttMaxDate.getTime()
// - this.ganttChartService.ganttMinDate.getTime()
// ) / (oneDay)));
/** @type {?} */
var flag = 0;
/** @type {?} */
var qts = 1;
// 3m --> 1 week --> 12
// 6m --> 2 weeks --> 12
// 9m --> 3 weeks --> 12
while (flag === 0) {
if (this.ganttChartService.ganttDateRange <= 90 * qts) {
this.gridPrecisionX = 7 * qts;
flag = 1;
}
else
qts = qts + 1;
}
// console.log(this.gridPrecisionX);
this.gridWidthX = this.ganttChartService.transformX(this.gridPrecisionX);
this.gridWidthY = this.ganttChartService.rectHeight / this.ganttChartService.ganttPhases.length;
this.gridPath = 'M ' + this.gridWidthX + ' 0 L 0 0 0 ' + this.gridWidthY;
this.xAxis = [];
this.yAxis = [];
/** @type {?} */
var date = this.ganttChartService.ganttMinDate;
// let xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150;
/** @type {?} */
var yTrans = this.ganttChartService.rectHeight + this.ganttChartService.yPadding + 10;
// let transform = 'translate(' + xPos + 'px, ' + yTrans + 'px)';
// this.xAxis.push({xPos: xPos, value: date, transform: transform});
// console.log(date);
// console.log('max date: ' + this.ganttChartService.ganttMaxDate);
// console.log('date: ' + date);
while (new Date(date) <= new Date(this.ganttChartService.ganttMaxDate)) {
// console.log('date: ' + date);
// console.log(date);
/** @type {?} */
var xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150;
/** @type {?} */
var transform = 'translate(' + xPos + 'px, ' + yTrans + 'px)';
this.xAxis.push({ xPos: xPos, value: this.shortenDate(date), transform: transform });
date = this.addDays(date, this.gridPrecisionX);
}
// console.log(this.xAxis);
/** @type {?} */
var cnt = 0;
try {
for (var _b = tslib_1.__values(this.ganttChartService.ganttPhases), _c = _b.next(); !_c.done; _c = _b.next()) {
var phase = _c.value;
/** @type {?} */
var yPos = this.gridWidthY * cnt + this.gridWidthY * 0.5 + this.ganttChartService.yPadding;
this.yAxis.push({ yPos: yPos, value: phase });
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 {?}
*/
GcChartBaseComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.computeGrid();
this.gridID = 'grid' + this.ganttChartService.componentID;
};
/**
* @return {?}
*/
GcChartBaseComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.computeGrid();
};
GcChartBaseComponent.decorators = [
{ type: Component, args: [{
selector: 'g[ngx-gc-chart-base]',
template: "<svg:pattern [attr.id]=\"gridID\" \n[attr.x]=\"ganttChartService.xPadding + 150\" [attr.y]=\"ganttChartService.yPadding\" \n[attr.width]=\"gridWidthX\" [attr.height]=\"gridWidthY\" \npatternUnits=\"userSpaceOnUse\">\n <svg:path [attr.d]=\"gridPath\" fill=\"none\" stroke=\"#444444\" stroke-width=\"0.5\" />\n</svg:pattern>\n\n<svg:rect [attr.x]=\"ganttChartService.xPadding + 150\" \n[attr.y]=\"ganttChartService.yPadding\" \n[attr.width]=\"ganttChartService.rectWidth\" \n[attr.height]=\"ganttChartService.rectHeight\" \nstroke=\"#444444\" [attr.fill]=\"'url(#' + gridID + ')'\" stroke-width=\"1\"/>\n\n<svg:g *ngFor=\"let x of xAxis\" [ngStyle]=\"{'transform': x.transform}\">\n<svg:text class=\"x-axis-text small\" text-anchor=\"end\" dominant-baseline=\"middle\"> {{ x.value }} </svg:text>\n</svg:g>\n\n<svg:text\n*ngFor=\"let y of yAxis\" class=\"y-axis-text small\" text-anchor=\"end\"\n[attr.y]=\"y.yPos\" [attr.x]=\"150+ganttChartService.xPadding-30\">{{ y.value }}</svg:text>\n\n\n<!-- Legion -->\n<svg:rect [attr.x]=\"ganttChartService.xPadding + 150\" \n[attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight\" \n[attr.width]=\"ganttChartService.legionWidth\" \n[attr.height]=\"ganttChartService.legionHeight\" \nfill=\"#f1f1f1\" />\n\n\n<svg:g *ngFor=\"let legionLine of ganttChartService.legion; index as i\">\n <svg:g *ngFor=\"let legionEntry of legionLine; index as j\">\n <svg:rect *ngIf=\"ganttChartService.legionWidth\" \n [attr.x]=\"ganttChartService.xPadding + 150 + ganttChartService.legionWidth / 3 * 0.1 + ganttChartService.legionWidth / 3 * j\" \n [attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight + 20 + 40*i + 10\" \n [attr.width]=\"ganttChartService.legionWidth / 3 * 0.2\" \n [attr.height]=\"20\" \n rx=\"6\" ry=\"6\"\n [attr.fill]=\"legionEntry.color\" />\n\n <!-- <svg:path class=\"legion-line\" [attr.d]=\"computeLegionPath(i)\" fill=\"none\" [attr.stroke]=\"x.color\" /> -->\n <svg:text class=\"axis-text\" dominant-baseline=\"middle\"\n [attr.x]=\"ganttChartService.xPadding + 150 + ganttChartService.legionWidth / 3 * j + ganttChartService.legionWidth / 3 * 0.4\" \n [attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight + 20 + 40*i + 20\" class=\"small\"> {{ legionEntry.name }} </svg:text>\n </svg:g>\n</svg:g>\n",
styles: [".x-axis-text{-webkit-transform:rotate(320deg);transform:rotate(320deg)}"]
}] }
];
/** @nocollapse */
GcChartBaseComponent.ctorParameters = function () { return [
{ type: GanttChartService }
]; };
return GcChartBaseComponent;
}());
export { GcChartBaseComponent };
if (false) {
/** @type {?} */
GcChartBaseComponent.prototype.gridWidthX;
/** @type {?} */
GcChartBaseComponent.prototype.gridWidthY;
/** @type {?} */
GcChartBaseComponent.prototype.gridPrecisionX;
/** @type {?} */
GcChartBaseComponent.prototype.gridID;
/** @type {?} */
GcChartBaseComponent.prototype.gridPath;
/** @type {?} */
GcChartBaseComponent.prototype.xAxis;
/** @type {?} */
GcChartBaseComponent.prototype.yAxis;
/** @type {?} */
GcChartBaseComponent.prototype.monthNames;
/** @type {?} */
GcChartBaseComponent.prototype.ganttChartService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MtY2hhcnQtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9nYW50dC1jaGFydC9nYy1jaGFydC1iYXNlL2djLWNoYXJ0LWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0Q7SUFvQ0UscUJBQXFCO0lBQ3JCLE1BQU07SUFDTiwyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ3hCLG1CQUFtQjtJQUNuQiw2QkFBNkI7SUFDN0IsMkVBQTJFO0lBQzNFLGlGQUFpRjtJQUNqRixXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLGtGQUFrRjtJQUNsRixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04sZ0NBQWdDO0lBQ2hDLHdCQUF3QjtJQUN4QixtQkFBbUI7SUFDbkIsa0NBQWtDO0lBQ2xDLDZFQUE2RTtJQUM3RSxXQUFXO0lBQ1gscUJBQXFCO0lBQ3JCLGtGQUFrRjtJQUNsRixXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLDhFQUE4RTtJQUM5RSxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixLQUFLO0lBRUwsOEJBQW1CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBakR2RCxlQUFVLEdBQUc7WUFDWCxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU87WUFDOUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTTtZQUM5QixRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVM7WUFDaEMsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztJQTRDeUQsQ0FBQzs7Ozs7O0lBekM1RCxzQ0FBTzs7Ozs7SUFBUCxVQUFRLElBQUksRUFBRSxJQUFZOztZ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QzVGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxNQUFBLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3ZDLEdBQUcsRUFBRSxDQUFDO2FBQ1A7Ozs7Ozs7OztJQUNILENBQUM7Ozs7SUFFRCx1Q0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztJQUM1RCxDQUFDOzs7O0lBRUQsMENBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7O2dCQXBKRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsODFFQUE2Qzs7aUJBRTlDOzs7O2dCQU5RLGlCQUFpQjs7SUF1SjFCLDJCQUFDO0NBQUEsQUFySkQsSUFxSkM7U0FoSlksb0JBQW9COzs7SUFFL0IsMENBQW1COztJQUNuQiwwQ0FBbUI7O0lBRW5CLDhDQUF1Qjs7SUFFdkIsc0NBQWU7O0lBQ2Ysd0NBQWlCOztJQUVqQixxQ0FBVzs7SUFDWCxxQ0FBVzs7SUFFWCwwQ0FLRTs7SUE0Q1UsaURBQTJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdhbnR0Q2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vZ2FudHQtY2hhcnQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dbbmd4LWdjLWNoYXJ0LWJhc2VdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2djLWNoYXJ0LWJhc2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYy1jaGFydC1iYXNlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2NDaGFydEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgZ3JpZFdpZHRoWDogbnVtYmVyO1xuICBncmlkV2lkdGhZOiBudW1iZXI7XG5cbiAgZ3JpZFByZWNpc2lvblg6IG51bWJlcjtcblxuICBncmlkSUQ6IHN0cmluZztcbiAgZ3JpZFBhdGg6IHN0cmluZztcblxuICB4QXhpczogYW55O1xuICB5QXhpczogYW55O1xuXG4gIG1vbnRoTmFtZXMgPSBbXG4gICAgJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLFxuICAgICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JyxcbiAgICAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJyxcbiAgICAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gIF07XG5cblxuICBhZGREYXlzKGRhdGUsIGRheXM6IG51bWJlcikge1xuICAgIGNvbnN0IG5ld2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBuZXdkYXRlLnNldERhdGUoKG5ldyBEYXRlKGRhdGUpKS5nZXREYXRlKCkgKyBkYXlzKTtcbiAgICBjb25zdCBkYXkgPSBuZXdkYXRlLmdldERhdGUoKTtcbiAgICBjb25zdCBtb250aEluZGV4ID0gbmV3ZGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IHllYXIgPSBuZXdkYXRlLmdldEZ1bGxZZWFyKCk7XG5cblxuICAgIHJldHVybiB0aGlzLm1vbnRoTmFtZXNbbW9udGhJbmRleF0gKyAnICcgKyBkYXkgKyAnLCAnICsgeWVhcjtcbiAgfVxuICAvLyBnYW50dENoYXJ0RGF0YSA9IFtcbiAgLy8gICB7XG4gIC8vICAgICBuYW1lOiAnTWFya2V0IFRlYW0nLFxuICAvLyAgICAgY29sb3I6ICcjRUFDNDM1JyxcbiAgLy8gICAgIHRpbWVsaW5lczoge1xuICAvLyAgICAgICAnTWFya2V0IFJlc2VhcmNoJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnSnVuZSA5LCAyMDE5JyksIHRvOiBuZXcgRGF0ZSgnSnVseSAyMCwgMjAxOScpfSxcbiAgLy8gICAgICAgICB7ZnJvbTogbmV3IERhdGUoJ09jdG9iZXIgOSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ05vdmVtYmVyIDIwLCAyMDE5Jyl9XG4gIC8vICAgICAgIF0sXG4gIC8vICAgICAgICdVc2VyIERvY3VtZW50YXRpb24nOiBbXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdBdWd1c3QgMTAsIDIwMTknKSwgdG86IG5ldyBEYXRlKCdTZXB0ZW1iZXIgMTUsIDIwMTknKX1cbiAgLy8gICAgICAgXVxuICAvLyAgICAgfVxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgbmFtZTogJ0RldmVsb3BtZW50IFRlYW0nLFxuICAvLyAgICAgY29sb3I6ICcjMzQ1OTk1JyxcbiAgLy8gICAgIHRpbWVsaW5lczoge1xuICAvLyAgICAgICAnU29mdHdhcmUgRGV2ZWxvcG1lbnQnOiBbXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdKdWx5IDksIDIwMTknKSwgdG86IG5ldyBEYXRlKCdPY3RvYmVyIDIwLCAyMDE5Jyl9XG4gIC8vICAgICAgIF0sXG4gIC8vICAgICAgICdUZXN0aW5nJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnT2N0b2JlciAyNSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ05vdmVtYmVyIDE1LCAyMDE5Jyl9XG4gIC8vICAgICAgIF0sXG4gIC8vICAgICAgICdVc2VyIERvY3VtZW50YXRpb24nOiBbXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdBdWd1c3QgMSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ0F1Z3VzdCAxNSwgMjAxOScpfVxuICAvLyAgICAgICBdXG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyBdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBnYW50dENoYXJ0U2VydmljZTogR2FudHRDaGFydFNlcnZpY2UpIHsgfVxuXG4gIHNob3J0ZW5EYXRlKGRhdGUpIHtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdKYW51YXJ5JywgJ0phbicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0ZlYnJ1YXJ5JywgJ0ZlYicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ01hcmNoJywgJ01hcicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0FwcmlsJywgJ0FwcicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ01heScsICdNYXknKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdKdW5lJywgJ0p1bicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0p1bHknLCAnSnVsJyk7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnQXVndXN0JywgJ0F1ZycpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ1NlcHRlbWJlcicsICdTZXAnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdPY3RvYmVyJywgJ09jdCcpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ05vdmVtYmVyJywgJ05vdicpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0RlY2VtYmVyJywgJ0RlYycpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgY29tcHV0ZUdyaWQoKSB7XG4gICAgLy8gY29tcHV0ZSB0aGUgbWluIGRhdGUgYW5kIG1heCBkYXRlXG4gICAgLy8gY29uc3Qgb25lRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAvLyBjb25zdCBkYXRlUmFuZ2UgPSBNYXRoLnJvdW5kKE1hdGguYWJzKFxuICAgIC8vICAgICAodGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1heERhdGUuZ2V0VGltZSgpXG4gICAgLy8gICAgICAtIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNaW5EYXRlLmdldFRpbWUoKVxuICAgIC8vICAgICAgKSAvIChvbmVEYXkpKSk7XG4gICAgbGV0IGZsYWcgPSAwO1xuICAgIGxldCBxdHMgPSAxO1xuXG4gICAgLy8gM20gLS0+IDEgd2VlayAgLS0+IDEyXG4gICAgLy8gNm0gLS0+IDIgd2Vla3MgLS0+IDEyXG4gICAgLy8gOW0gLS0+IDMgd2Vla3MgLS0+IDEyXG5cbiAgICB3aGlsZSAoZmxhZyA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHREYXRlUmFuZ2UgPD0gOTAgKiBxdHMpIHtcbiAgICAgICAgdGhpcy5ncmlkUHJlY2lzaW9uWCA9IDcgKiBxdHM7XG4gICAgICAgIGZsYWcgPSAxO1xuICAgICAgfSBlbHNlIHF0cyA9IHF0cyArIDE7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5ncmlkUHJlY2lzaW9uWCk7XG5cbiAgICB0aGlzLmdyaWRXaWR0aFggPSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnRyYW5zZm9ybVgodGhpcy5ncmlkUHJlY2lzaW9uWCk7XG4gICAgdGhpcy5ncmlkV2lkdGhZID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS5yZWN0SGVpZ2h0IC8gdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dFBoYXNlcy5sZW5ndGg7XG4gICAgdGhpcy5ncmlkUGF0aCA9ICdNICcgKyB0aGlzLmdyaWRXaWR0aFggKyAnIDAgTCAwIDAgMCAnICsgdGhpcy5ncmlkV2lkdGhZO1xuXG4gICAgdGhpcy54QXhpcyA9IFtdO1xuICAgIHRoaXMueUF4aXMgPSBbXTtcblxuICAgIGxldCBkYXRlID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1pbkRhdGU7XG4gICAgLy8gbGV0IHhQb3MgPSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnRyYW5zZm9ybUdhbnR0RGF0ZShkYXRlKSArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UueFBhZGRpbmcgKyAxNTA7XG4gICAgY29uc3QgeVRyYW5zID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS5yZWN0SGVpZ2h0ICsgdGhpcy5nYW50dENoYXJ0U2VydmljZS55UGFkZGluZyArIDEwO1xuICAgIC8vIGxldCB0cmFuc2Zvcm0gPSAndHJhbnNsYXRlKCcgKyB4UG9zICsgJ3B4LCAnICsgeVRyYW5zICsgJ3B4KSc7XG4gICAgLy8gdGhpcy54QXhpcy5wdXNoKHt4UG9zOiB4UG9zLCB2YWx1ZTogZGF0ZSwgdHJhbnNmb3JtOiB0cmFuc2Zvcm19KTtcbiAgICAvLyBjb25zb2xlLmxvZyhkYXRlKTtcbiAgICAvLyBjb25zb2xlLmxvZygnbWF4IGRhdGU6ICcgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0TWF4RGF0ZSk7XG4gICAgLy8gY29uc29sZS5sb2coJ2RhdGU6ICcgKyBkYXRlKTtcbiAgICB3aGlsZSAobmV3IERhdGUoZGF0ZSkgPD0gbmV3IERhdGUodGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1heERhdGUpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnZGF0ZTogJyArIGRhdGUpO1xuICAgICAgLy8gY29uc29sZS5sb2coZGF0ZSk7XG4gICAgICBjb25zdCB4UG9zID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS50cmFuc2Zvcm1HYW50dERhdGUoZGF0ZSkgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnhQYWRkaW5nICsgMTUwO1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgeFBvcyArICdweCwgJyArIHlUcmFucyArICdweCknO1xuICAgICAgdGhpcy54QXhpcy5wdXNoKHt4UG9zLCB2YWx1ZTogdGhpcy5zaG9ydGVuRGF0ZShkYXRlKSwgdHJhbnNmb3JtfSk7XG4gICAgICBkYXRlID0gdGhpcy5hZGREYXlzKGRhdGUsIHRoaXMuZ3JpZFByZWNpc2lvblgpO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMueEF4aXMpO1xuICAgIGxldCBjbnQgPSAwO1xuICAgIGZvciAoY29uc3QgcGhhc2Ugb2YgdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dFBoYXNlcykge1xuICAgICAgY29uc3QgeVBvcyA9IHRoaXMuZ3JpZFdpZHRoWSAqIGNudCArIHRoaXMuZ3JpZFdpZHRoWSAqIDAuNSArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UueVBhZGRpbmc7XG4gICAgICB0aGlzLnlBeGlzLnB1c2goe3lQb3MsIHZhbHVlOiBwaGFzZSB9KTtcbiAgICAgIGNudCsrO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcHV0ZUdyaWQoKTtcbiAgICB0aGlzLmdyaWRJRCA9ICdncmlkJyArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuY29tcG9uZW50SUQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLmNvbXB1dGVHcmlkKCk7XG4gIH1cbn1cbiJdfQ==