UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

390 lines 40.7 kB
/** * @fileoverview added by tsickle * Generated from: lib/date-table.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __extends, __read } from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { CandyDate } from 'ng-zorro-antd/core/time'; import { valueFunctionProp } from 'ng-zorro-antd/core/util'; import { DateHelperService, NzI18nService } from 'ng-zorro-antd/i18n'; import { AbstractTable } from './abstract-table'; import { transCompatFormat } from './util'; var DateTableComponent = /** @class */ (function (_super) { __extends(DateTableComponent, _super); function DateTableComponent(i18n, dateHelper) { var _this = _super.call(this) || this; _this.i18n = i18n; _this.dateHelper = dateHelper; _this.selectedValue = []; // Range ONLY // Range ONLY _this.hoverValue = []; // Range ONLY // Range ONLY _this.dayHover = new EventEmitter(); // Emitted when hover on a day by mouse enter return _this; } /** * @param {?} changes * @return {?} */ DateTableComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { _super.prototype.ngOnChanges.call(this, changes); if (this.isDateRealChange(changes.activeDate) || this.isDateRealChange(changes.value) || this.isDateRealChange(changes.selectedValue) || this.isDateRealChange(changes.hoverValue)) { this.render(); } }; /** * @private * @param {?} change * @return {?} */ DateTableComponent.prototype.isDateRealChange = /** * @private * @param {?} change * @return {?} */ function (change) { if (change) { /** @type {?} */ var previousValue_1 = change.previousValue; /** @type {?} */ var currentValue = change.currentValue; if (Array.isArray(currentValue)) { return (!Array.isArray(previousValue_1) || currentValue.length !== previousValue_1.length || currentValue.some((/** * @param {?} value * @param {?} index * @return {?} */ function (value, index) { /** @type {?} */ var previousCandyDate = previousValue_1[index]; return previousCandyDate instanceof CandyDate ? previousCandyDate.isSameDay(value) : previousCandyDate !== value; }))); } else { return !this.isSameDate((/** @type {?} */ (previousValue_1)), currentValue); } } return false; }; /** * @private * @param {?} left * @param {?} right * @return {?} */ DateTableComponent.prototype.isSameDate = /** * @private * @param {?} left * @param {?} right * @return {?} */ function (left, right) { return (!left && !right) || (left && right && right.isSameDay(left)); }; /** * @private * @param {?} value * @return {?} */ DateTableComponent.prototype.changeValueFromInside = /** * @private * @param {?} value * @return {?} */ function (value) { // Only change date not change time this.activeDate = this.activeDate.setYear(value.getYear()).setMonth(value.getMonth()).setDate(value.getDate()); this.valueChange.emit(this.activeDate); if (!this.activeDate.isSameMonth(this.value)) { this.render(); } }; /** * @return {?} */ DateTableComponent.prototype.makeHeadRow = /** * @return {?} */ function () { /** @type {?} */ var weekDays = []; /** @type {?} */ var start = this.activeDate.calendarStart({ weekStartsOn: this.dateHelper.getFirstDayOfWeek() }); for (var colIndex = 0; colIndex < this.MAX_COL; colIndex++) { /** @type {?} */ var day = start.addDays(colIndex); weekDays.push({ value: day.nativeDate, title: this.dateHelper.format(day.nativeDate, 'E'), // eg. Tue content: this.dateHelper.format(day.nativeDate, this.getVeryShortWeekFormat()), // eg. Tu, isSelected: false, isDisabled: false, onClick: /** * @return {?} */ function () { }, onMouseEnter: /** * @return {?} */ function () { } }); } return weekDays; }; /** * @private * @return {?} */ DateTableComponent.prototype.getVeryShortWeekFormat = /** * @private * @return {?} */ function () { return this.i18n.getLocaleId().toLowerCase().indexOf('zh') === 0 ? 'EEEEE' : 'EEEEEE'; // Use extreme short for chinese }; /** * @return {?} */ DateTableComponent.prototype.makeBodyRows = /** * @return {?} */ function () { var _a; var _this = this; var _b; /** @type {?} */ var weekRows = []; /** @type {?} */ var firstDayOfMonth = this.activeDate.calendarStart({ weekStartsOn: this.dateHelper.getFirstDayOfWeek() }); for (var week = 0; week < this.MAX_ROW; week++) { /** @type {?} */ var weekStart = firstDayOfMonth.addDays(week * 7); /** @type {?} */ var row = { isActive: false, isCurrent: false, dateCells: [], year: weekStart.getYear() }; var _loop_1 = function (day) { /** @type {?} */ var date = weekStart.addDays(day); /** @type {?} */ var dateFormat = transCompatFormat(this_1.i18n.getLocaleData('DatePicker.lang.dateFormat', 'YYYY-MM-DD')); /** @type {?} */ var title = this_1.dateHelper.format(date.nativeDate, dateFormat); /** @type {?} */ var label = this_1.dateHelper.format(date.nativeDate, 'dd'); /** @type {?} */ var cell = { value: date.nativeDate, label: label, isSelected: false, isDisabled: false, isToday: false, title: title, cellRender: valueFunctionProp((/** @type {?} */ (this_1.cellRender)), date), // Customized content fullCellRender: valueFunctionProp((/** @type {?} */ (this_1.fullCellRender)), date), content: "" + date.getDate(), onClick: (/** * @return {?} */ function () { return _this.changeValueFromInside(date); }), onMouseEnter: (/** * @return {?} */ function () { return _this.dayHover.emit(date); }) }; if (this_1.showWeek && !row.weekNum) { row.weekNum = this_1.dateHelper.getISOWeek(date.nativeDate); } if (date.isToday()) { cell.isToday = true; row.isCurrent = true; } if (((Array.isArray(this_1.selectedValue) && this_1.selectedValue.length > 0) || (this_1.hoverValue && this_1.hoverValue.length > 0)) && date.isSameMonth(this_1.activeDate)) { var _a = __read(this_1.hoverValue, 2), startHover = _a[0], endHover = _a[1]; var _b = __read(this_1.selectedValue, 2), startSelected = _b[0], endSelected = _b[1]; // Selected if (startSelected && startSelected.isSameDay(date)) { cell.isSelectedStartDate = true; cell.isSelected = true; row.isActive = true; } if (endSelected && endSelected.isSameDay(date)) { cell.isSelectedEndDate = true; cell.isSelected = true; row.isActive = true; } else if (date.isAfterDay(startSelected) && date.isBeforeDay(endSelected)) { cell.isInSelectedRange = true; } if (startHover && endHover) { // Hover if (startHover.isSameDay(date)) { cell.isHoverStartDate = true; } if (endHover.isSameDay(date)) { cell.isHoverEndDate = true; } if (date.isLastDayOfMonth()) { cell.isLastDayOfMonth = true; } if (date.isFirstDayOfMonth()) { cell.isFirstDayOfMonth = true; } } if (startSelected && !endSelected) { cell.isStartSingle = true; } if (!startSelected && endSelected) { cell.isEndSingle = true; } if (date.isAfterDay(startHover) && date.isBeforeDay(endHover)) { cell.isInHoverRange = true; } } else if (date.isSameDay(this_1.value)) { cell.isSelected = true; row.isActive = true; } if ((_b = this_1.disabledDate) === null || _b === void 0 ? void 0 : _b.call(this_1, date.nativeDate)) { cell.isDisabled = true; } cell.classMap = this_1.getClassMap(cell); row.dateCells.push(cell); }; var this_1 = this; for (var day = 0; day < 7; day++) { _loop_1(day); } row.classMap = (_a = {}, _a[this.prefixCls + "-week-panel-row"] = this.showWeek, _a[this.prefixCls + "-week-panel-row-selected"] = this.showWeek && row.isActive, _a); weekRows.push(row); } return weekRows; }; /** * @param {?} cell * @return {?} */ DateTableComponent.prototype.getClassMap = /** * @param {?} cell * @return {?} */ function (cell) { var _a; /** @type {?} */ var date = new CandyDate(cell.value); return _a = {}, _a["ant-picker-cell"] = true, _a["ant-picker-cell-today"] = !!cell.isToday, _a["ant-picker-cell-in-view"] = date.isSameMonth(this.activeDate), _a["ant-picker-cell-selected"] = cell.isSelected, _a["ant-picker-cell-disabled"] = cell.isDisabled, _a["ant-picker-cell-in-range"] = !!cell.isInSelectedRange, _a["ant-picker-cell-range-start"] = !!cell.isSelectedStartDate, _a["ant-picker-cell-range-end"] = !!cell.isSelectedEndDate, _a["ant-picker-cell-range-start-single"] = !!cell.isStartSingle, _a["ant-picker-cell-range-end-single"] = !!cell.isEndSingle, _a["ant-picker-cell-range-hover"] = !!cell.isInHoverRange, _a["ant-picker-cell-range-hover-start"] = !!cell.isHoverStartDate, _a["ant-picker-cell-range-hover-end"] = !!cell.isHoverEndDate, _a["ant-picker-cell-range-hover-edge-start"] = !!cell.isFirstDayOfMonth, _a["ant-picker-cell-range-hover-edge-end"] = !!cell.isLastDayOfMonth, _a; }; /** * @param {?} _index * @param {?} item * @return {?} */ DateTableComponent.prototype.trackByBodyRow = /** * @param {?} _index * @param {?} item * @return {?} */ function (_index, item) { return item.year + "-" + item.weekNum; }; /** * @param {?} _index * @param {?} item * @return {?} */ DateTableComponent.prototype.trackByBodyColumn = /** * @param {?} _index * @param {?} item * @return {?} */ function (_index, item) { return (/** @type {?} */ (item.title)); }; DateTableComponent.decorators = [ { type: Component, args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, // tslint:disable-next-line:component-selector selector: 'date-table', exportAs: 'dateTable', template: "<table class=\"ant-picker-content\" cellspacing=\"0\" role=\"grid\">\n <thead *ngIf=\"headRow && headRow.length > 0\">\n <tr role=\"row\">\n <th *ngIf=\"showWeek\" role=\"columnheader\"></th>\n <th *ngFor=\"let cell of headRow\" role=\"columnheader\" title=\"{{ cell.title }}\">\n {{ cell.content }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of bodyRows; trackBy: trackByBodyRow\" [ngClass]=\"row.classMap!\" role=\"row\">\n <td *ngIf=\"row.weekNum\" role=\"gridcell\" class=\"{{ prefixCls }}-cell-week\">\n {{ row.weekNum }}\n </td>\n <td\n *ngFor=\"let cell of row.dateCells; trackBy: trackByBodyColumn\"\n title=\"{{ cell.title }}\"\n role=\"gridcell\"\n [ngClass]=\"cell.classMap!\"\n (click)=\"cell.isDisabled ? null : cell.onClick()\"\n (mouseenter)=\"cell.onMouseEnter()\"\n >\n <ng-container [ngSwitch]=\"prefixCls\">\n <ng-container *ngSwitchCase=\"'ant-picker'\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(cell.cellRender)\">\n <!-- *ngSwitchCase not has type assertion support, the cellRender type here is TemplateRef -->\n <ng-container\n *ngTemplateOutlet=\"$any(cell.cellRender); context: { $implicit: cell.value }\"\n ></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(cell.cellRender)\">\n <span [innerHTML]=\"cell.cellRender\"></span>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <div\n class=\"{{ prefixCls }}-cell-inner\"\n [attr.aria-selected]=\"cell.isSelected\"\n [attr.aria-disabled]=\"cell.isDisabled\"\n >\n {{ cell.content }}\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ant-picker-calendar'\">\n <div\n class=\"{{ prefixCls }}-date ant-picker-cell-inner\"\n [class.ant-picker-calendar-date-today]=\"cell.isToday\"\n >\n <ng-container *ngIf=\"cell.fullCellRender; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"$any(cell.fullCellRender); context: { $implicit: cell.value }\"\n >\n </ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <div class=\"{{ prefixCls }}-date-value\">{{ cell.content }}</div>\n <div class=\"{{ prefixCls }}-date-content\">\n <ng-container\n *ngTemplateOutlet=\"$any(cell.cellRender); context: { $implicit: cell.value }\"\n >\n </ng-container>\n </div>\n </ng-template>\n </div>\n </ng-container>\n </ng-container>\n </td>\n </tr>\n </tbody>\n</table>\n" }] } ]; /** @nocollapse */ DateTableComponent.ctorParameters = function () { return [ { type: NzI18nService }, { type: DateHelperService } ]; }; DateTableComponent.propDecorators = { locale: [{ type: Input }], selectedValue: [{ type: Input }], hoverValue: [{ type: Input }], dayHover: [{ type: Output }] }; return DateTableComponent; }(AbstractTable)); export { DateTableComponent }; if (false) { /** @type {?} */ DateTableComponent.prototype.locale; /** @type {?} */ DateTableComponent.prototype.selectedValue; /** @type {?} */ DateTableComponent.prototype.hoverValue; /** @type {?} */ DateTableComponent.prototype.dayHover; /** * @type {?} * @private */ DateTableComponent.prototype.i18n; /** * @type {?} * @private */ DateTableComponent.prototype.dateHelper; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkL2RhdGUtcGlja2VyLyIsInNvdXJjZXMiOlsibGliL2RhdGUtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTVELE9BQU8sRUFBRSxpQkFBaUIsRUFBMkIsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUUzQztJQVF3QyxzQ0FBYTtJQU9uRCw0QkFBb0IsSUFBbUIsRUFBVSxVQUE2QjtRQUE5RSxZQUNFLGlCQUFPLFNBQ1I7UUFGbUIsVUFBSSxHQUFKLElBQUksQ0FBZTtRQUFVLGdCQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUxyRSxtQkFBYSxHQUFnQixFQUFFLENBQUMsQ0FBQyxhQUFhOztRQUM5QyxnQkFBVSxHQUFnQixFQUFFLENBQUMsQ0FBQyxhQUFhOztRQUVqQyxjQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQyxDQUFDLDZDQUE2Qzs7SUFJMUcsQ0FBQzs7Ozs7SUFFRCx3Q0FBVzs7OztJQUFYLFVBQVksT0FBc0I7UUFDaEMsaUJBQU0sV0FBVyxZQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLElBQ0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDekMsSUFBSSxDQUFDLGdC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SUFBRSx3Q0FBcUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhbmR5RGF0ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90aW1lJztcbmltcG9ydCB7IHZhbHVlRnVuY3Rpb25Qcm9wIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuXG5pbXBvcnQgeyBEYXRlSGVscGVyU2VydmljZSwgTnpDYWxlbmRhckkxOG5JbnRlcmZhY2UsIE56STE4blNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2kxOG4nO1xuaW1wb3J0IHsgQWJzdHJhY3RUYWJsZSB9IGZyb20gJy4vYWJzdHJhY3QtdGFibGUnO1xuaW1wb3J0IHsgRGF0ZUJvZHlSb3csIERhdGVDZWxsLCBEYXlDZWxsIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgdHJhbnNDb21wYXRGb3JtYXQgfSBmcm9tICcuL3V0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdkYXRlLXRhYmxlJyxcbiAgZXhwb3J0QXM6ICdkYXRlVGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWJzdHJhY3QtdGFibGUuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RUYWJsZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgQElucHV0KCkgbG9jYWxlITogTnpDYWxlbmRhckkxOG5JbnRlcmZhY2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU6IENhbmR5RGF0ZVtdID0gW107IC8vIFJhbmdlIE9OTFlcbiAgQElucHV0KCkgaG92ZXJWYWx1ZTogQ2FuZHlEYXRlW10gPSBbXTsgLy8gUmFuZ2UgT05MWVxuXG4gIEBPdXRwdXQoKSByZWFkb25seSBkYXlIb3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FuZHlEYXRlPigpOyAvLyBFbWl0dGVkIHdoZW4gaG92ZXIgb24gYSBkYXkgYnkgbW91c2UgZW50ZXJcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGkxOG46IE56STE4blNlcnZpY2UsIHByaXZhdGUgZGF0ZUhlbHBlcjogRGF0ZUhlbHBlclNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNEYXRlUmVhbENoYW5nZShjaGFuZ2VzLmFjdGl2ZURhdGUpIHx8XG4gICAgICB0aGlzLmlzRGF0ZVJlYWxDaGFuZ2UoY2hhbmdlcy52YWx1ZSkgfHxcbiAgICAgIHRoaXMuaXNEYXRlUmVhbENoYW5nZShjaGFuZ2VzLnNlbGVjdGVkVmFsdWUpIHx8XG4gICAgICB0aGlzLmlzRGF0ZVJlYWxDaGFuZ2UoY2hhbmdlcy5ob3ZlclZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZVJlYWxDaGFuZ2UoY2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiBib29sZWFuIHtcbiAgICBpZiAoY2hhbmdlKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlOiBDYW5keURhdGUgfCBDYW5keURhdGVbXSA9IGNoYW5nZS5wcmV2aW91c1ZhbHVlO1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlOiBDYW5keURhdGUgfCBDYW5keURhdGVbXSA9IGNoYW5nZS5jdXJyZW50VmFsdWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkocHJldmlvdXNWYWx1ZSkgfHxcbiAgICAgICAgICBjdXJyZW50VmFsdWUubGVuZ3RoICE9PSBwcmV2aW91c1ZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgIGN1cnJlbnRWYWx1ZS5zb21lKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ2FuZHlEYXRlID0gcHJldmlvdXNWYWx1ZVtpbmRleF07XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNDYW5keURhdGUgaW5zdGFuY2VvZiBDYW5keURhdGUgPyBwcmV2aW91c0NhbmR5RGF0ZS5pc1NhbWVEYXkodmFsdWUpIDogcHJldmlvdXNDYW5keURhdGUgIT09IHZhbHVlO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNTYW1lRGF0ZShwcmV2aW91c1ZhbHVlIGFzIENhbmR5RGF0ZSwgY3VycmVudFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVEYXRlKGxlZnQ6IENhbmR5RGF0ZSwgcmlnaHQ6IENhbmR5RGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoIWxlZnQgJiYgIXJpZ2h0KSB8fCAobGVmdCAmJiByaWdodCAmJiByaWdodC5pc1NhbWVEYXkobGVmdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VWYWx1ZUZyb21JbnNpZGUodmFsdWU6IENhbmR5RGF0ZSk6IHZvaWQge1xuICAgIC8vIE9ubHkgY2hhbmdlIGRhdGUgbm90IGNoYW5nZSB0aW1lXG4gICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5hY3RpdmVEYXRlLnNldFllYXIodmFsdWUuZ2V0WWVhcigpKS5zZXRNb250aCh2YWx1ZS5nZXRNb250aCgpKS5zZXREYXRlKHZhbHVlLmdldERhdGUoKSk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG5cbiAgICBpZiAoIXRoaXMuYWN0aXZlRGF0ZS5pc1NhbWVNb250aCh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICBtYWtlSGVhZFJvdygpOiBEYXlDZWxsW10ge1xuICAgIGNvbnN0IHdlZWtEYXlzOiBEYXlDZWxsW10gPSBbXTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuYWN0aXZlRGF0ZS5jYWxlbmRhclN0YXJ0KHsgd2Vla1N0YXJ0c09uOiB0aGlzLmRhdGVIZWxwZXIuZ2V0Rmlyc3REYXlPZldlZWsoKSB9KTtcbiAgICBmb3IgKGxldCBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgdGhpcy5NQVhfQ09MOyBjb2xJbmRleCsrKSB7XG4gICAgICBjb25zdCBkYXkgPSBzdGFydC5hZGREYXlzKGNvbEluZGV4KTtcbiAgICAgIHdlZWtEYXlzLnB1c2goe1xuICAgICAgICB2YWx1ZTogZGF5Lm5hdGl2ZURhdGUsXG4gICAgICAgIHRpdGxlOiB0aGlzLmRhdGVIZWxwZXIuZm9ybWF0KGRheS5uYXRpdmVEYXRlLCAnRScpLCAvLyBlZy4gVHVlXG4gICAgICAgIGNvbnRlbnQ6IHRoaXMuZGF0ZUhlbHBlci5mb3JtYXQoZGF5Lm5hdGl2ZURhdGUsIHRoaXMuZ2V0VmVyeVNob3J0V2Vla0Zvcm1hdCgpKSwgLy8gZWcuIFR1LFxuICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgaXNEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIG9uQ2xpY2soKTogdm9pZCB7fSxcbiAgICAgICAgb25Nb3VzZUVudGVyKCk6IHZvaWQge31cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2Vla0RheXM7XG4gIH1cblxuICBwcml2YXRlIGdldFZlcnlTaG9ydFdlZWtGb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLmdldExvY2FsZUlkKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCd6aCcpID09PSAwID8gJ0VFRUVFJyA6ICdFRUVFRUUnOyAvLyBVc2UgZXh0cmVtZSBzaG9ydCBmb3IgY2hpbmVzZVxuICB9XG5cbiAgbWFrZUJvZHlSb3dzKCk6IERhdGVCb2R5Um93W10ge1xuICAgIGNvbnN0IHdlZWtSb3dzOiBEYXRlQm9keVJvd1tdID0gW107XG4gICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gdGhpcy5hY3RpdmVEYXRlLmNhbGVuZGFyU3RhcnQoeyB3ZWVrU3RhcnRzT246IHRoaXMuZGF0ZUhlbHBlci5nZXRGaXJzdERheU9mV2VlaygpIH0pO1xuXG4gICAgZm9yIChsZXQgd2VlayA9IDA7IHdlZWsgPCB0aGlzLk1BWF9ST1c7IHdlZWsrKykge1xuICAgICAgY29uc3Qgd2Vla1N0YXJ0ID0gZmlyc3REYXlPZk1vbnRoLmFkZERheXMod2VlayAqIDcpO1xuICAgICAgY29uc3Qgcm93OiBEYXRlQm9keVJvdyA9IHtcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICBpc0N1cnJlbnQ6IGZhbHNlLFxuICAgICAgICBkYXRlQ2VsbHM6IFtdLFxuICAgICAgICB5ZWFyOiB3ZWVrU3RhcnQuZ2V0WWVhcigpXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGxldCBkYXkgPSAwOyBkYXkgPCA3OyBkYXkrKykge1xuICAgICAgICBjb25zdCBkYXRlID0gd2Vla1N0YXJ0LmFkZERheXMoZGF5KTtcbiAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRyYW5zQ29tcGF0Rm9ybWF0KHRoaXMuaTE4bi5nZXRMb2NhbGVEYXRhKCdEYXRlUGlja2VyLmxhbmcuZGF0ZUZvcm1hdCcsICdZWVlZLU1NLUREJykpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuZGF0ZUhlbHBlci5mb3JtYXQoZGF0ZS5uYXRpdmVEYXRlLCBkYXRlRm9ybWF0KTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmRhdGVIZWxwZXIuZm9ybWF0KGRhdGUubmF0aXZlRGF0ZSwgJ2RkJyk7XG5cbiAgICAgICAgY29uc3QgY2VsbDogRGF5Q2VsbCA9IHtcbiAgICAgICAgICB2YWx1ZTogZGF0ZS5uYXRpdmVEYXRlLFxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICBpc1RvZGF5OiBmYWxzZSxcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgY2VsbFJlbmRlcjogdmFsdWVGdW5jdGlvblByb3AodGhpcy5jZWxsUmVuZGVyISwgZGF0ZSksIC8vIEN1c3RvbWl6ZWQgY29udGVudFxuICAgICAgICAgIGZ1bGxDZWxsUmVuZGVyOiB2YWx1ZUZ1bmN0aW9uUHJvcCh0aGlzLmZ1bGxDZWxsUmVuZGVyISwgZGF0ZSksXG4gICAgICAgICAgY29udGVudDogYCR7ZGF0ZS5nZXREYXRlKCl9YCxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLmNoYW5nZVZhbHVlRnJvbUluc2lkZShkYXRlKSxcbiAgICAgICAgICBvbk1vdXNlRW50ZXI6ICgpID0+IHRoaXMuZGF5SG92ZXIuZW1pdChkYXRlKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLnNob3dXZWVrICYmICFyb3cud2Vla051bSkge1xuICAgICAgICAgIHJvdy53ZWVrTnVtID0gdGhpcy5kYXRlSGVscGVyLmdldElTT1dlZWsoZGF0ZS5uYXRpdmVEYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRlLmlzVG9kYXkoKSkge1xuICAgICAgICAgIGNlbGwuaXNUb2RheSA9IHRydWU7XG4gICAgICAgICAgcm93LmlzQ3VycmVudCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKChBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWRWYWx1ZSkgJiYgdGhpcy5zZWxlY3RlZFZhbHVlLmxlbmd0aCA+IDApIHx8ICh0aGlzLmhvdmVyVmFsdWUgJiYgdGhpcy5ob3ZlclZhbHVlLmxlbmd0aCA+IDApKSAmJlxuICAgICAgICAgIGRhdGUuaXNTYW1lTW9udGgodGhpcy5hY3RpdmVEYXRlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBbc3RhcnRIb3ZlciwgZW5kSG92ZXJdID0gdGhpcy5ob3ZlclZhbHVlO1xuICAgICAgICAgIGNvbnN0IFtzdGFydFNlbGVjdGVkLCBlbmRTZWxlY3RlZF0gPSB0aGlzLnNlbGVjdGVkVmFsdWU7XG5cbiAgICAgICAgICAvLyBTZWxlY3RlZFxuICAgICAgICAgIGlmIChzdGFydFNlbGVjdGVkICYmIHN0YXJ0U2VsZWN0ZWQuaXNTYW1lRGF5KGRhdGUpKSB7XG4gICAgICAgICAgICBjZWxsLmlzU2VsZWN0ZWRTdGFydERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgY2VsbC5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJvdy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbmRTZWxlY3RlZCAmJiBlbmRTZWxlY3RlZC5pc1NhbWVEYXkoZGF0ZSkpIHtcbiAgICAgICAgICAgIGNlbGwuaXNTZWxlY3RlZEVuZERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgY2VsbC5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJvdy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRlLmlzQWZ0ZXJEYXkoc3RhcnRTZWxlY3RlZCkgJiYgZGF0ZS5pc0JlZm9yZURheShlbmRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgIGNlbGwuaXNJblNlbGVjdGVkUmFuZ2UgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdGFydEhvdmVyICYmIGVuZEhvdmVyKSB7XG4gICAgICAgICAgICAvLyBIb3ZlclxuICAgICAgICAgICAgaWYgKHN0YXJ0SG92ZXIuaXNTYW1lRGF5KGRhdGUpKSB7XG4gICAgICAgICAgICAgIGNlbGwuaXNIb3ZlclN0YXJ0RGF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kSG92ZXIuaXNTYW1lRGF5KGRhdGUpKSB7XG4gICAgICAgICAgICAgIGNlbGwuaXNIb3ZlckVuZERhdGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGUuaXNMYXN0RGF5T2ZNb250aCgpKSB7XG4gICAgICAgICAgICAgIGNlbGwuaXNMYXN0RGF5T2ZNb250aCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZS5pc0ZpcnN0RGF5T2ZNb250aCgpKSB7XG4gICAgICAgICAgICAgIGNlbGwuaXNGaXJzdERheU9mTW9udGggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdGFydFNlbGVjdGVkICYmICFlbmRTZWxlY3RlZCkge1xuICAgICAgICAgICAgY2VsbC5pc1N0YXJ0U2luZ2xlID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXN0YXJ0U2VsZWN0ZWQgJiYgZW5kU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGNlbGwuaXNFbmRTaW5nbGUgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRlLmlzQWZ0ZXJEYXkoc3RhcnRIb3ZlcikgJiYgZGF0ZS5pc0JlZm9yZURheShlbmRIb3ZlcikpIHtcbiAgICAgICAgICAgIGNlbGwuaXNJbkhvdmVyUmFuZ2UgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRlLmlzU2FtZURheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICAgIGNlbGwuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgcm93LmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZT8uKGRhdGUubmF0aXZlRGF0ZSkpIHtcbiAgICAgICAgICBjZWxsLmlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2VsbC5jbGFzc01hcCA9IHRoaXMuZ2V0Q2xhc3NNYXAoY2VsbCk7XG5cbiAgICAgICAgcm93LmRhdGVDZWxscy5wdXNoKGNlbGwpO1xuICAgICAgfVxuXG4gICAgICByb3cuY2xhc3NNYXAgPSB7XG4gICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30td2Vlay1wYW5lbC1yb3dgXTogdGhpcy5zaG93V2VlayxcbiAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS13ZWVrLXBhbmVsLXJvdy1zZWxlY3RlZGBdOiB0aGlzLnNob3dXZWVrICYmIHJvdy5pc0FjdGl2ZVxuICAgICAgfTtcblxuICAgICAgd2Vla1Jvd3MucHVzaChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiB3ZWVrUm93cztcbiAgfVxuXG4gIGdldENsYXNzTWFwKGNlbGw6IERheUNlbGwpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBDYW5keURhdGUoY2VsbC52YWx1ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtgYW50LXBpY2tlci1jZWxsYF06IHRydWUsXG4gICAgICBbYGFudC1waWNrZXItY2VsbC10b2RheWBdOiAhIWNlbGwuaXNUb2RheSxcbiAgICAgIFtgYW50LXBpY2tlci1jZWxsLWluLXZpZXdgXTogZGF0ZS5pc1NhbWVNb250aCh0aGlzLmFjdGl2ZURhdGUpLFxuICAgICAgW2BhbnQtcGlja2VyLWNlbGwtc2VsZWN0ZWRgXTogY2VsbC5pc1NlbGVjdGVkLFxuICAgICAgW2BhbnQtcGlja2VyLWNlbGwtZGlzYWJsZWRgXTogY2VsbC5pc0Rpc2FibGVkLFxuICAgICAgW2BhbnQtcGlja2VyLWNlbGwtaW4tcmFuZ2VgXTogISFjZWxsLmlzSW5TZWxlY3RlZFJhbmdlLFxuICAgICAgW2BhbnQtcGlja2VyLWNlbGwtcmFuZ2Utc3RhcnRgXTogISFjZWxsLmlzU2VsZWN0ZWRTdGFydERhdGUsXG4gICAgICBbYGFudC1waWNrZXItY2VsbC1yYW5nZS1lbmRgXTogISFjZWxsLmlzU2VsZWN0ZWRFbmREYXRlLFxuICAgICAgW2BhbnQtcGlja2VyLWNlbGwtcmFuZ2Utc3RhcnQtc2luZ2xlYF06ICEhY2VsbC5pc1N0YXJ0U2luZ2xlLFxuICAgICAgW2BhbnQtcGlja2VyLWNlbGwtcmFuZ2UtZW5kLXNpbmdsZWBdOiAhIWNlbGwuaXNFbmRTaW5nbGUsXG4gICAgICBbYGFudC1waWNrZXItY2VsbC1yYW5nZS1ob3ZlcmBdOiAhIWNlbGwuaXNJbkhvdmVyUmFuZ2UsXG4gICAgICBbYGFudC1waWNrZXItY2VsbC1yYW5nZS1ob3Zlci1zdGFydGBdOiAhIWNlbGwuaXNIb3ZlclN0YXJ0RGF0ZSxcbiAgICAgIFtgYW50LXBpY2tlci1jZWxsLXJhbmdlLWhvdmVyLWVuZGBdOiAhIWNlbGwuaXNIb3ZlckVuZERhdGUsXG4gICAgICBbYGFudC1waWNrZXItY2VsbC1yYW5nZS1ob3Zlci1lZGdlLXN0YXJ0YF06ICEhY2VsbC5pc0ZpcnN0RGF5T2ZNb250aCxcbiAgICAgIFtgYW50LXBpY2tlci1jZWxsLXJhbmdlLWhvdmVyLWVkZ2UtZW5kYF06ICEhY2VsbC5pc0xhc3REYXlPZk1vbnRoXG4gICAgfTtcbiAgfVxuXG4gIHRyYWNrQnlCb2R5Um93KF9pbmRleDogbnVtYmVyLCBpdGVtOiBEYXRlQm9keVJvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2l0ZW0ueWVhcn0tJHtpdGVtLndlZWtOdW19YDtcbiAgfVxuXG4gIHRyYWNrQnlCb2R5Q29sdW1uKF9pbmRleDogbnVtYmVyLCBpdGVtOiBEYXRlQ2VsbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0udGl0bGUgYXMgc3RyaW5nO1xuICB9XG59XG4iXX0=