UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

294 lines 33.7 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Input, ViewChild, TemplateRef, } from '@angular/core'; import { DataType } from '../../data-operations/data-util'; import { GridBaseAPIService } from '../api.service'; import { IgxGridSelectionService, ISelectionNode } from '../selection/selection.service'; import { ROW_COLLAPSE_KEYS, ROW_EXPAND_KEYS, SUPPORTED_KEYS } from '../../core/utils'; let IgxGridGroupByRowComponent = class IgxGridGroupByRowComponent { constructor(gridAPI, gridSelection, element, cdr) { this.gridAPI = gridAPI; this.gridSelection = gridSelection; this.element = element; this.cdr = cdr; /** * @hidden */ this.defaultCssClass = 'igx-grid__group-row'; /** * @hidden */ this.paddingIndentationCssClass = 'igx-grid__group-row--padding-level'; /** * @hidden */ this.isFocused = false; /** * @hidden */ this.tabindex = 0; } /** * Returns whether the row is focused. * ``` * let gridRowFocused = this.grid1.rowList.first.focused; * ``` */ get focused() { return this.isFocused; } /** * Returns whether the group row is expanded. * ```typescript * const groupRowExpanded = this.grid1.rowList.first.expanded; * ``` */ get expanded() { return this.grid.isExpandedGroup(this.groupRow); } /** * @hidden */ get describedBy() { const grRowExpr = this.groupRow.expression !== undefined ? this.groupRow.expression.fieldName : ''; return this.gridID + '_' + grRowExpr; } get dataRowIndex() { return this.index; } /** * Returns a reference to the underlying HTML element. * ```typescript * const groupRowElement = this.nativeElement; * ``` */ get nativeElement() { return this.element.nativeElement; } /** * Returns the style classes applied to the group rows. * ```typescript * const groupCssStyles = this.grid1.rowList.first.styleClasses; * ``` */ get styleClasses() { return `${this.defaultCssClass} ` + `${this.paddingIndentationCssClass}-` + this.groupRow.level + (this.focused ? ` ${this.defaultCssClass}--active` : ''); } /** *@hidden */ onFocus() { this.isFocused = true; } /** *@hidden */ onBlur() { this.isFocused = false; } /** * Toggles the group row. * ```typescript * this.grid1.rowList.first.toggle() * ``` */ toggle() { const isVirtualized = !this.grid.verticalScrollContainer.dc.instance.notVirtual; const groupRowIndex = this.index; this.grid.toggleGroup(this.groupRow); if (isVirtualized) { const groupRow = this.grid.nativeElement.querySelector(`[data-rowIndex="${groupRowIndex}"]`); if (groupRow) { groupRow.focus(); } } } get iconTemplate() { if (this.expanded) { return this.grid.rowExpandedIndicatorTemplate || this.defaultGroupByExpandedTemplate; } else { return this.grid.rowCollapsedIndicatorTemplate || this.defaultGroupByCollapsedTemplate; } } get selectionNode() { return { row: this.index, column: this.gridSelection.activeElement ? this.gridSelection.activeElement.column : 0 }; } /** * @hidden */ onKeydown(event) { // TODO: Refactor const key = event.key.toLowerCase(); if (!SUPPORTED_KEYS.has(key)) { return; } event.stopPropagation(); const keydownArgs = { targetType: 'groupRow', target: this, event: event, cancel: false }; this.grid.onGridKeydown.emit(keydownArgs); if (keydownArgs.cancel) { return; } event.preventDefault(); if (!this.isKeySupportedInGroupRow(key, event.shiftKey, event.altKey) || event.ctrlKey) { return; } if (this.isToggleKey(key, event.altKey)) { if ((this.expanded && ROW_COLLAPSE_KEYS.has(key)) || (!this.expanded && ROW_EXPAND_KEYS.has(key))) { this.toggle(); } return; } const selection = this.gridSelection; selection.keyboardState.shift = event.shiftKey && !(key === 'tab'); const activeNode = selection.activeElement ? Object.assign({}, selection.activeElement) : this.selectionNode; activeNode.row = this.index; switch (key) { case 'arrowdown': case 'down': this.grid.navigation.navigateDown(this.nativeElement, activeNode); break; case 'arrowup': case 'up': this.grid.navigation.navigateUp(this.nativeElement, activeNode); break; case 'tab': this.handleTabKey(event.shiftKey, activeNode); break; } } /** * Returns a reference to the `IgxGridComponent` the `IgxGridGroupByRowComponent` belongs to. * ```typescript * this.grid1.rowList.first.grid; * ``` */ get grid() { return this.gridAPI.grid; } /** * @hidden */ get dataType() { const column = this.grid.getColumnByName(this.groupRow.expression.fieldName); return (column && column.dataType) || DataType.String; } handleTabKey(shift, activeNode) { if (shift) { this.grid.navigation.performShiftTabKey(this.nativeElement, activeNode); } else { if (this.index === this.grid.dataView.length - 1 && this.grid.rootSummariesEnabled) { this.grid.navigation.onKeydownHome(0, true); } else { const orderedColumns = this.grid.navigation.gridOrderedColumns; const lastCol = orderedColumns[orderedColumns.length - 1]; activeNode.column = lastCol.columnLayoutChild ? lastCol.parent.visibleIndex : lastCol.visibleIndex; this.grid.navigation.performTab(this.nativeElement, activeNode); } } } isKeySupportedInGroupRow(key, shift = false, alt = false) { if (shift) { return ['down', 'up', 'arrowdown', 'arrowup', 'tab'].indexOf(key) !== -1; } return this.isToggleKey(key, alt) ? true : ['down', 'up', 'arrowdown', 'arrowup', 'tab'].indexOf(key) !== -1; } isToggleKey(key, altKey) { return altKey && ['left', 'right', 'up', 'down', 'arrowleft', 'arrowright', 'arrowup', 'arrowdown'].indexOf(key) !== -1; } }; IgxGridGroupByRowComponent.ctorParameters = () => [ { type: GridBaseAPIService }, { type: IgxGridSelectionService }, { type: ElementRef }, { type: ChangeDetectorRef } ]; __decorate([ ViewChild('defaultGroupByExpandedTemplate', { read: TemplateRef, static: true }), __metadata("design:type", TemplateRef) ], IgxGridGroupByRowComponent.prototype, "defaultGroupByExpandedTemplate", void 0); __decorate([ ViewChild('defaultGroupByCollapsedTemplate', { read: TemplateRef, static: true }), __metadata("design:type", TemplateRef) ], IgxGridGroupByRowComponent.prototype, "defaultGroupByCollapsedTemplate", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxGridGroupByRowComponent.prototype, "isFocused", void 0); __decorate([ Input(), __metadata("design:type", Number) ], IgxGridGroupByRowComponent.prototype, "index", void 0); __decorate([ Input(), __metadata("design:type", String) ], IgxGridGroupByRowComponent.prototype, "gridID", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxGridGroupByRowComponent.prototype, "groupRow", void 0); __decorate([ ViewChild('groupContent', { static: true }), __metadata("design:type", ElementRef) ], IgxGridGroupByRowComponent.prototype, "groupContent", void 0); __decorate([ HostBinding('attr.aria-expanded'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxGridGroupByRowComponent.prototype, "expanded", null); __decorate([ HostBinding('attr.tabindex'), __metadata("design:type", Object) ], IgxGridGroupByRowComponent.prototype, "tabindex", void 0); __decorate([ HostBinding('attr.aria-describedby'), __metadata("design:type", String), __metadata("design:paramtypes", []) ], IgxGridGroupByRowComponent.prototype, "describedBy", null); __decorate([ HostBinding('attr.data-rowIndex'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxGridGroupByRowComponent.prototype, "dataRowIndex", null); __decorate([ HostBinding('class'), __metadata("design:type", String), __metadata("design:paramtypes", []) ], IgxGridGroupByRowComponent.prototype, "styleClasses", null); __decorate([ HostListener('focus'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxGridGroupByRowComponent.prototype, "onFocus", null); __decorate([ HostListener('blur'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxGridGroupByRowComponent.prototype, "onBlur", null); __decorate([ HostListener('keydown', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxGridGroupByRowComponent.prototype, "onKeydown", null); IgxGridGroupByRowComponent = __decorate([ Component({ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-grid-groupby-row', template: "<ng-container #defaultGroupRow>\n <div (click)=\"toggle()\" class=\"igx-grid__grouping-indicator\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: { $implicit: this }\">\n </ng-container>\n </div>\n\n <div class=\"igx-grid__group-content\" #groupContent>\n <ng-container *ngTemplateOutlet=\"grid.groupRowTemplate ? grid.groupRowTemplate : defaultGroupByTemplate; context: { $implicit: groupRow }\">\n </ng-container>\n </div>\n\n <ng-template #defaultGroupByExpandedTemplate>\n <igx-icon fontSet=\"material\">expand_more</igx-icon>\n </ng-template>\n\n <ng-template #defaultGroupByCollapsedTemplate>\n <igx-icon fontSet=\"material\">chevron_right</igx-icon>\n </ng-template>\n\n\n <ng-template #defaultGroupByTemplate>\n <div class=\"igx-group-label\">\n <igx-icon fontSet=\"material\" class=\"igx-group-label__icon\">group_work</igx-icon>\n <span class=\"igx-group-label__column-name\">\n {{ groupRow.expression ? groupRow.expression.fieldName : '' }}:\n </span>\n\n <ng-container *ngIf=\"dataType === 'boolean' || dataType === 'string'; else default\" >\n <span class=\"igx-group-label__text\">{{ groupRow.value }}</span>\n </ng-container>\n <ng-template #default>\n <ng-container *ngIf=\"dataType === 'number'\">\n <span class=\"igx-group-label__text\">{{ groupRow.value | number }}</span>\n </ng-container>\n <ng-container *ngIf=\"dataType === 'date'\">\n <span class=\"igx-group-label__text\">{{ groupRow.value | date }}</span>\n </ng-container>\n </ng-template>\n\n <igx-badge [value]=\"groupRow.records ? groupRow.records.length : 0\" class='igx-group-label__count-badge'></igx-badge>\n </div>\n </ng-template>\n</ng-container>\n" }), __metadata("design:paramtypes", [GridBaseAPIService, IgxGridSelectionService, ElementRef, ChangeDetectorRef]) ], IgxGridGroupByRowComponent); export { IgxGridGroupByRowComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBieS1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9ncmlkL2dyb3VwYnktcm93LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVN0RixJQUFhLDBCQUEwQixHQUF2QyxNQUFhLDBCQUEwQjtJQUVuQyxZQUFtQixPQUE0RCxFQUNuRSxhQUFzQyxFQUN2QyxPQUFtQixFQUNuQixHQUFzQjtRQUhkLFlBQU8sR0FBUCxPQUFPLENBQXFEO1FBQ25FLGtCQUFhLEdBQWIsYUFBYSxDQUF5QjtRQUN2QyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBRWpDOztXQUVHO1FBQ08sb0JBQWUsR0FBRyxxQkFBcUIsQ0FBQztRQUVsRDs7V0FFRztRQUNPLCtCQUEwQixHQUFHLG9DQUFvQyxDQUFDO1FBYzVFOztXQUVHO1FBRU8sY0FBUyxHQUFHLEtBQUssQ0FBQztRQTJENUI7O1dBRUc7UUFFSSxhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBM0ZpQixDQUFDO0lBOEJ0Qzs7Ozs7T0FLRztJQUNILElBQUksT0FBTztRQUNQLE9B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QjtBQU1EO0lBREMsWUFBWSxDQUFDLE9BQU8sQ0FBQzs7Ozt5REFHckI7QUFNRDtJQURDLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7d0RBR3BCO0FBdUNEO0lBREMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7OzJEQTBDbkM7QUFwT1EsMEJBQTBCO0lBTnRDLFNBQVMsQ0FBQztRQUNQLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO1FBQy9DLG1CQUFtQixFQUFFLEtBQUs7UUFDMUIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyw4NkRBQTJDO0tBQzlDLENBQUM7cUNBRzhCLGtCQUFrQjtRQUNuQix1QkFBdUI7UUFDOUIsVUFBVTtRQUNkLGlCQUFpQjtHQUx4QiwwQkFBMEIsQ0FrUnRDO1NBbFJZLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJR3JvdXBCeVJlY29yZCB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9ncm91cGJ5LXJlY29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRCYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZ3JpZC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSwgSVNlbGVjdGlvbk5vZGUgfSBmcm9tICcuLi9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUk9XX0NPTExBUFNFX0tFWVMsIFJPV19FWFBBTkRfS0VZUywgU1VQUE9SVEVEX0tFWVMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEdyaWRUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1ncm91cGJ5LXJvdycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyb3VwYnktcm93LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkR3JvdXBCeVJvd0NvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZ3JpZEFQSTogR3JpZEJhc2VBUElTZXJ2aWNlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgR3JpZFR5cGU+LFxuICAgICAgICBwcml2YXRlIGdyaWRTZWxlY3Rpb246IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWZhdWx0Q3NzQ2xhc3MgPSAnaWd4LWdyaWRfX2dyb3VwLXJvdyc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhZGRpbmdJbmRlbnRhdGlvbkNzc0NsYXNzID0gJ2lneC1ncmlkX19ncm91cC1yb3ctLXBhZGRpbmctbGV2ZWwnO1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0R3JvdXBCeUV4cGFuZGVkVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEdyb3VwQnlFeHBhbmRlZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0R3JvdXBCeUNvbGxhcHNlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRHcm91cEJ5Q29sbGFwc2VkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwcm90ZWN0ZWQgaXNGb2N1c2VkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJvdyBpcyBmb2N1c2VkLlxuICAgICAqIGBgYFxuICAgICAqIGxldCBncmlkUm93Rm9jdXNlZCA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5mb2N1c2VkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0ZvY3VzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgaW5kZXggb2YgdGhlIHJvdy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkLWdyb3VwYnktcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZ3JvdXBSb3ddPVwicm93RGF0YVwiICNyb3c+PC9pZ3gtZ3JpZC1ncm91cGJ5LXJvdz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpbmRleDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgaWQgb2YgdGhlIGdyaWQgdGhlIHJvdyBiZWxvbmdzIHRvLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQtZ3JvdXBieS1yb3cgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtncm91cFJvd109XCJyb3dEYXRhXCIgI3Jvdz48L2lneC1ncmlkLWdyb3VwYnktcm93PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdyaWRJRDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc3BlY2lmaWVzIHRoZSBncm91cCByZWNvcmQgdGhlIGNvbXBvbmVudCByZW5kZXJzIGZvci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogPGlneC1ncmlkLWdyb3VwYnktcm93IFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZ3JvdXBSb3ddPVwicm93RGF0YVwiICNyb3c+PC9pZ3gtZ3JpZC1ncm91cGJ5LXJvdz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncm91cFJvdzogSUdyb3VwQnlSZWNvcmQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIG9mIHRoZSBjb250ZW50IG9mIHRoZSBncm91cC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBSb3dDb250ZW50ID0gdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0Lmdyb3VwQ29udGVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdncm91cENvbnRlbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBncm91cENvbnRlbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdyb3VwIHJvdyBpcyBleHBhbmRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBSb3dFeHBhbmRlZCA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5leHBhbmRlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1leHBhbmRlZCcpXG4gICAgZ2V0IGV4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmlzRXhwYW5kZWRHcm91cCh0aGlzLmdyb3VwUm93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JylcbiAgICBnZXQgZGVzY3JpYmVkQnkoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZ3JSb3dFeHByID0gdGhpcy5ncm91cFJvdy5leHByZXNzaW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLmdyb3VwUm93LmV4cHJlc3Npb24uZmllbGROYW1lIDogJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRJRCArICdfJyArIGdyUm93RXhwcjtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1yb3dJbmRleCcpXG4gICAgZ2V0IGRhdGFSb3dJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBIVE1MIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyb3VwUm93RWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgbmF0aXZlRWxlbWVudCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3R5bGUgY2xhc3NlcyBhcHBsaWVkIHRvIHRoZSBncm91cCByb3dzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncm91cENzc1N0eWxlcyA9IHRoaXMuZ3JpZDEucm93TGlzdC5maXJzdC5zdHlsZUNsYXNzZXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gICAgZ2V0IHN0eWxlQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5kZWZhdWx0Q3NzQ2xhc3N9IGAgKyBgJHt0aGlzLnBhZGRpbmdJbmRlbnRhdGlvbkNzc0NsYXNzfS1gICsgdGhpcy5ncm91cFJvdy5sZXZlbCArXG4gICAgICAgICAgICAodGhpcy5mb2N1c2VkID8gYCAke3RoaXMuZGVmYXVsdENzc0NsYXNzfS0tYWN0aXZlYCA6ICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gICAgcHVibGljIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGdyb3VwIHJvdy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LnRvZ2dsZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICAgICAgY29uc3QgaXNWaXJ0dWFsaXplZCA9ICF0aGlzLmdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuZGMuaW5zdGFuY2Uubm90VmlydHVhbDtcbiAgICAgICAgY29uc3QgZ3JvdXBSb3dJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHRoaXMuZ3JpZC50b2dnbGVHcm91cCh0aGlzLmdyb3VwUm93KTtcbiAgICAgICAgaWYgKGlzVmlydHVhbGl6ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwUm93ID0gdGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtcm93SW5kZXg9XCIke2dyb3VwUm93SW5kZXh9XCJdYCk7XG4gICAgICAgICAgICBpZiAoZ3JvdXBSb3cpIHtcbiAgICAgICAgICAgICAgICBncm91cFJvdy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpY29uVGVtcGxhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0R3JvdXBCeUV4cGFuZGVkVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuZGVmYXVsdEdyb3VwQnlDb2xsYXBzZWRUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgc2VsZWN0aW9uTm9kZSgpOiBJU2VsZWN0aW9uTm9kZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3c6IHRoaXMuaW5kZXgsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMuZ3JpZFNlbGVjdGlvbi5hY3RpdmVFbGVtZW50ID8gdGhpcy5ncmlkU2VsZWN0aW9uLmFjdGl2ZUVsZW1lbnQuY29sdW1uIDogMFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIFRPRE86IFJlZmFjdG9yXG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIVNVUFBPUlRFRF9LRVlTLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGtleWRvd25BcmdzID0geyB0YXJnZXRUeXBlOiAnZ3JvdXBSb3cnLCB0YXJnZXQ6IHRoaXMsIGV2ZW50OiBldmVudCwgY2FuY2VsOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLmdyaWQub25HcmlkS2V5ZG93bi5lbWl0KGtleWRvd25BcmdzKTtcbiAgICAgICAgaWYgKGtleWRvd25BcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzS2V5U3VwcG9ydGVkSW5Hcm91cFJvdyhrZXksIGV2ZW50LnNoaWZ0S2V5LCBldmVudC5hbHRLZXkpIHx8IGV2ZW50LmN0cmxLZXkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNUb2dnbGVLZXkoa2V5LCBldmVudC5hbHRLZXkpKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuZXhwYW5kZWQgJiYgUk9XX0NPTExBUFNFX0tFWVMuaGFzKGtleSkpIHx8ICghdGhpcy5leHBhbmRlZCAmJiBST1dfRVhQQU5EX0tFWVMuaGFzKGtleSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ3JpZFNlbGVjdGlvbjtcbiAgICAgICAgc2VsZWN0aW9uLmtleWJvYXJkU3RhdGUuc2hpZnQgPSBldmVudC5zaGlmdEtleSAmJiAhKGtleSA9PT0gJ3RhYicpO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZU5vZGUgPSBzZWxlY3Rpb24uYWN0aXZlRWxlbWVudCA/IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbi5hY3RpdmVFbGVtZW50KSA6IHRoaXMuc2VsZWN0aW9uTm9kZTtcbiAgICAgICAgYWN0aXZlTm9kZS5yb3cgPSB0aGlzLmluZGV4O1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLm5hdmlnYXRlRG93bih0aGlzLm5hdGl2ZUVsZW1lbnQsIGFjdGl2ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24ubmF2aWdhdGVVcCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGFjdGl2ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGFiJzpcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRhYktleShldmVudC5zaGlmdEtleSwgYWN0aXZlTm9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgdGhlIGBJZ3hHcmlkR3JvdXBCeVJvd0NvbXBvbmVudGAgYmVsb25ncyB0by5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5yb3dMaXN0LmZpcnN0LmdyaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGdyaWQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgZGF0YVR5cGUoKTogYW55IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZSh0aGlzLmdyb3VwUm93LmV4cHJlc3Npb24uZmllbGROYW1lKTtcbiAgICAgICAgcmV0dXJuIChjb2x1bW4gJiYgY29sdW1uLmRhdGFUeXBlKSB8fCBEYXRhVHlwZS5TdHJpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJLZXkoc2hpZnQ6IGJvb2xlYW4sIGFjdGl2ZU5vZGU6IElTZWxlY3Rpb25Ob2RlKSB7XG4gICAgICAgIGlmIChzaGlmdCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24ucGVyZm9ybVNoaWZ0VGFiS2V5KHRoaXMubmF0aXZlRWxlbWVudCwgYWN0aXZlTm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gdGhpcy5ncmlkLmRhdGFWaWV3Lmxlbmd0aCAtIDEgJiYgdGhpcy5ncmlkLnJvb3RTdW1tYXJpZXNFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5hdmlnYXRpb24ub25LZXlkb3duSG9tZSgwLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdyaWQubmF2aWdhdGlvbi5ncmlkT3JkZXJlZENvbHVtbnM7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdENvbCA9IG9yZGVyZWRDb2x1bW5zW29yZGVyZWRDb2x1bW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGFjdGl2ZU5vZGUuY29sdW1uID0gbGFzdENvbC5jb2x1bW5MYXlvdXRDaGlsZCA/IGxhc3RDb2wucGFyZW50LnZpc2libGVJbmRleCA6IGxhc3RDb2wudmlzaWJsZUluZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5uYXZpZ2F0aW9uLnBlcmZvcm1UYWIodGhpcy5uYXRpdmVFbGVtZW50LCBhY3RpdmVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNLZXlTdXBwb3J0ZWRJbkdyb3VwUm93KGtleSwgc2hpZnQgPSBmYWxzZSwgYWx0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gWydkb3duJywgJ3VwJywgJ2Fycm93ZG93bicsICdhcnJvd3VwJywgJ3RhYiddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUb2dnbGVLZXkoa2V5LCBhbHQpID8gdHJ1ZSA6IFsnZG93bicsICd1cCcsICdhcnJvd2Rvd24nLCAnYXJyb3d1cCcsICd0YWInXS5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUb2dnbGVLZXkoa2V5LCBhbHRLZXkpIHtcbiAgICAgICAgcmV0dXJuIGFsdEtleSAmJiBbJ2xlZnQnLCAncmlnaHQnLCAndXAnLCAnZG93bicsICdhcnJvd2xlZnQnLCAnYXJyb3dyaWdodCcsICdhcnJvd3VwJywgJ2Fycm93ZG93biddLmluZGV4T2Yoa2V5KSAhPT0gLTE7XG4gICAgfVxuXG59XG4iXX0=