UNPKG

igniteui-angular

Version:

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

904 lines • 98.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectorRef, Component, ViewChild, HostBinding, ChangeDetectionStrategy, TemplateRef, Directive, ElementRef } from '@angular/core'; import { HorizontalAlignment, VerticalAlignment, ConnectedPositioningStrategy, AbsoluteScrollStrategy } from '../../../services/index'; import { IgxStringFilteringOperand, IgxNumberFilteringOperand, IgxBooleanFilteringOperand, IgxDateFilteringOperand, InFilteringOperation, InDateFilteringOperation } from '../../../data-operations/filtering-condition'; import { FilteringExpressionsTree } from '../../../data-operations/filtering-expressions-tree'; import { FilteringLogic } from '../../../data-operations/filtering-expression.interface'; import { cloneArray } from '../../../core/utils'; import { DataType, DataUtil } from '../../../data-operations/data-util'; import { IgxExcelStyleSearchComponent } from './excel-style-search.component'; import { IgxExcelStyleCustomDialogComponent } from './excel-style-custom-dialog.component'; import { Subscription, Subject } from 'rxjs'; import { IgxExcelStyleSortingComponent } from './excel-style-sorting.component'; import { takeUntil } from 'rxjs/operators'; import { IgxDropDownComponent } from '../../../drop-down'; /** * @hidden */ export class FilterListItem { constructor() { this.isSpecial = false; } } if (false) { /** @type {?} */ FilterListItem.prototype.value; /** @type {?} */ FilterListItem.prototype.label; /** @type {?} */ FilterListItem.prototype.isSelected; /** @type {?} */ FilterListItem.prototype.indeterminate; /** @type {?} */ FilterListItem.prototype.isSpecial; } export class IgxExcelStyleSortingTemplateDirective { /** * @param {?} template */ constructor(template) { this.template = template; } } IgxExcelStyleSortingTemplateDirective.decorators = [ { type: Directive, args: [{ selector: '[igxExcelStyleSortingTemplate]' },] } ]; /** @nocollapse */ IgxExcelStyleSortingTemplateDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ IgxExcelStyleSortingTemplateDirective.prototype.template; } export class IgxExcelStyleMovingTemplateDirective { /** * @param {?} template */ constructor(template) { this.template = template; } } IgxExcelStyleMovingTemplateDirective.decorators = [ { type: Directive, args: [{ selector: '[igxExcelStyleMovingTemplate]' },] } ]; /** @nocollapse */ IgxExcelStyleMovingTemplateDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ IgxExcelStyleMovingTemplateDirective.prototype.template; } export class IgxExcelStyleHidingTemplateDirective { /** * @param {?} template */ constructor(template) { this.template = template; } } IgxExcelStyleHidingTemplateDirective.decorators = [ { type: Directive, args: [{ selector: '[igxExcelStyleHidingTemplate]' },] } ]; /** @nocollapse */ IgxExcelStyleHidingTemplateDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ IgxExcelStyleHidingTemplateDirective.prototype.template; } export class IgxExcelStylePinningTemplateDirective { /** * @param {?} template */ constructor(template) { this.template = template; } } IgxExcelStylePinningTemplateDirective.decorators = [ { type: Directive, args: [{ selector: '[igxExcelStylePinningTemplate]' },] } ]; /** @nocollapse */ IgxExcelStylePinningTemplateDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ IgxExcelStylePinningTemplateDirective.prototype.template; } /** * @hidden */ export class IgxGridExcelStyleFilteringComponent { /** * @param {?} cdr */ constructor(cdr) { this.cdr = cdr; this.shouldOpenSubMenu = true; this.expressionsList = new Array(); this.destroy$ = new Subject(); this.containsNullOrEmpty = false; this.selectAllSelected = true; this.selectAllIndeterminate = false; this.filterValues = new Set(); this.columnMoving = new Subscription(); this.listData = new Array(); this.uniqueValues = []; this._subMenuPositionSettings = { verticalStartPoint: VerticalAlignment.Top }; this._subMenuOverlaySettings = { closeOnOutsideClick: true, modal: false, positionStrategy: new ConnectedPositioningStrategy(this._subMenuPositionSettings), scrollStrategy: new AbsoluteScrollStrategy() }; this.className = 'igx-excel-filter'; } /** * @return {?} */ get grid() { return this.filteringService.grid; } /** * @return {?} */ get conditions() { return this.column.filters.conditionList(); } /** * @return {?} */ get subMenuText() { switch (this.column.dataType) { case DataType.Boolean: return this.grid.resourceStrings.igx_grid_excel_boolean_filter; case DataType.Number: return this.grid.resourceStrings.igx_grid_excel_number_filter; case DataType.Date: return this.grid.resourceStrings.igx_grid_excel_date_filter; default: return this.grid.resourceStrings.igx_grid_excel_text_filter; } } /** * @return {?} */ ngOnDestroy() { this.destroy$.next(true); this.destroy$.complete(); } /** * @return {?} */ ngAfterViewInit() { this.expressionsList = new Array(); this.filteringService.generateExpressionsList(this.column.filteringExpressionsTree, this.grid.filteringLogic, this.expressionsList); if (this.expressionsList && this.expressionsList.length && this.expressionsList[0].expression.condition.name !== 'in') { this.customDialog.expressionsList = this.expressionsList; } this.populateColumnData(); if (this.excelStyleSorting) { /** @type {?} */ const se = this.grid.sortingExpressions.find(expr => expr.fieldName === this.column.field); if (se) { this.excelStyleSorting.selectButton(se.dir); } } requestAnimationFrame(() => { this.excelStyleSearch.searchInput.nativeElement.focus(); }); } /** * @return {?} */ clearFilterClass() { if (this.column.filteringExpressionsTree) { return 'igx-excel-filter__actions-clear'; } return 'igx-excel-filter__actions-clear--disabled'; } /** * @param {?} column * @param {?} filteringService * @param {?} overlayService * @param {?} overlayComponentId * @return {?} */ initialize(column, filteringService, overlayService, overlayComponentId) { this.column = column; this.filteringService = filteringService; this.overlayService = overlayService; this.overlayComponentId = overlayComponentId; this._subMenuOverlaySettings.outlet = this.grid.outlet; this.columnMoving = this.grid.onColumnMoving.pipe(takeUntil(this.destroy$)).subscribe(() => { this.closeDropdown(); }); } /** * Returns the filtering operation condition for a given value. * @param {?} value * @return {?} */ getCondition(value) { return this.column.filters.condition(value); } /** * Returns the translated condition name for a given value. * @param {?} value * @return {?} */ translateCondition(value) { return this.grid.resourceStrings[`igx_grid_filter_${this.getCondition(value).name}`] || value; } /** * @return {?} */ onPin() { this.column.pinned = !this.column.pinned; this.closeDropdown(); } /** * @return {?} */ onHide() { this.column.hidden = true; this.grid.onColumnVisibilityChanged.emit({ column: this.column, newValue: true }); this.closeDropdown(); } /** * @param {?} eventArgs * @return {?} */ onTextFilterClick(eventArgs) { if (this.shouldOpenSubMenu) { this._subMenuOverlaySettings.positionStrategy.settings.target = eventArgs.currentTarget; /** @type {?} */ const gridRect = this.grid.nativeElement.getBoundingClientRect(); /** @type {?} */ const dropdownRect = this.mainDropdown.nativeElement.getBoundingClientRect(); /** @type {?} */ let x = dropdownRect.left + dropdownRect.width; /** @type {?} */ let x1 = gridRect.left + gridRect.width; x += window.pageXOffset; x1 += window.pageXOffset; if (Math.abs(x - x1) < 200) { this._subMenuOverlaySettings.positionStrategy.settings.horizontalDirection = HorizontalAlignment.Left; this._subMenuOverlaySettings.positionStrategy.settings.horizontalStartPoint = HorizontalAlignment.Left; } else { this._subMenuOverlaySettings.positionStrategy.settings.horizontalDirection = HorizontalAlignment.Right; this._subMenuOverlaySettings.positionStrategy.settings.horizontalStartPoint = HorizontalAlignment.Right; } this.subMenu.open(this._subMenuOverlaySettings); this.shouldOpenSubMenu = false; } } /** * @param {?} eventArgs * @return {?} */ onTextFilterKeyDown(eventArgs) { if (eventArgs.key === "Enter" /* ENTER */) { this.onTextFilterClick(eventArgs); } } /** * @return {?} */ onSubMenuClosed() { requestAnimationFrame(() => { this.shouldOpenSubMenu = true; }); } /** * @param {?} eventArgs * @return {?} */ onSubMenuSelection(eventArgs) { this.customDialog.selectedOperator = eventArgs.newSelection.value; eventArgs.cancel = true; this.mainDropdown.nativeElement.style.display = 'none'; this.subMenu.close(); this.customDialog.open(); } /** * @private * @return {?} */ areExpressionsSelectable() { if (this.expressionsList.length === 1 && (this.expressionsList[0].expression.condition.name === 'equals' || this.expressionsList[0].expression.condition.name === 'true' || this.expressionsList[0].expression.condition.name === 'false' || this.expressionsList[0].expression.condition.name === 'empty' || this.expressionsList[0].expression.condition.name === 'in')) { return true; } /** @type {?} */ const selectableExpressionsCount = this.expressionsList.filter(exp => (exp.beforeOperator === 1 || exp.afterOperator === 1) && (exp.expression.condition.name === 'equals' || exp.expression.condition.name === 'true' || exp.expression.condition.name === 'false' || exp.expression.condition.name === 'empty' || exp.expression.condition.name === 'in')).length; return selectableExpressionsCount === this.expressionsList.length; } /** * @private * @return {?} */ areExpressionsValuesInTheList() { if (this.column.dataType === DataType.Boolean) { return true; } if (this.filterValues.size === 1) { /** @type {?} */ const firstValue = this.filterValues.values().next().value; if (!firstValue && firstValue !== 0) { return true; } } for (let index = 0; index < this.uniqueValues.length; index++) { if (this.filterValues.has(this.uniqueValues[index])) { return true; } } return false; } /** * @return {?} */ populateColumnData() { /** @type {?} */ let data = this.column.gridAPI.get_all_data(this.grid.id); /** @type {?} */ const gridExpressionsTree = this.grid.filteringExpressionsTree; /** @type {?} */ const expressionsTree = new FilteringExpressionsTree(gridExpressionsTree.operator, gridExpressionsTree.fieldName); for (const operand of gridExpressionsTree.filteringOperands) { if (operand instanceof FilteringExpressionsTree) { /** @type {?} */ const columnExprTree = (/** @type {?} */ (operand)); if (columnExprTree.fieldName === this.column.field) { break; } } expressionsTree.filteringOperands.push(operand); } if (expressionsTree.filteringOperands.length) { /** @type {?} */ const state = { expressionsTree: expressionsTree }; data = DataUtil.filter(cloneArray(data), state); } if (this.column.dataType === DataType.Date) { this.uniqueValues = Array.from(new Set(data.map(record => record[this.column.field] ? record[this.column.field].toDateString() : record[this.column.field]))); this.filterValues = new Set(this.expressionsList.reduce((arr, e) => { if (e.expression.condition.name === 'in') { return [...arr, ...Array.from(((/** @type {?} */ (e.expression.searchVal))).values()).map(v => new Date(v).toDateString())]; } return [...arr, ...[e.expression.searchVal ? e.expression.searchVal.toDateString() : e.expression.searchVal]]; }, [])); } else { this.uniqueValues = Array.from(new Set(data.map(record => record[this.column.field]))); this.filterValues = new Set(this.expressionsList.reduce((arr, e) => { if (e.expression.condition.name === 'in') { return [...arr, ...Array.from(((/** @type {?} */ (e.expression.searchVal))).values())]; } return [...arr, ...[e.expression.searchVal]]; }, [])); } this.listData = new Array(); /** @type {?} */ const shouldUpdateSelection = this.areExpressionsSelectable() && this.areExpressionsValuesInTheList(); if (this.column.dataType === DataType.Boolean) { this.addBooleanItems(); } else { this.addItems(shouldUpdateSelection); } this.listData.sort((a, b) => this.sortData(a, b)); if (this.column.dataType === DataType.Date) { this.uniqueValues = this.uniqueValues.map(value => new Date(value)); } if (this.containsNullOrEmpty) { this.addBlanksItem(shouldUpdateSelection); } this.addSelectAllItem(); this.cdr.detectChanges(); } /** * @private * @return {?} */ addBooleanItems() { this.selectAllSelected = true; this.selectAllIndeterminate = false; this.uniqueValues.forEach(element => { /** @type {?} */ const filterListItem = new FilterListItem(); if (element !== undefined && element !== null && element !== '') { if (this.column.filteringExpressionsTree) { if (element === true && this.expressionsList.find(exp => exp.expression.condition.name === 'true')) { filterListItem.isSelected = true; this.selectAllIndeterminate = true; } else if (element === false && this.expressionsList.find(exp => exp.expression.condition.name === 'false')) { filterListItem.isSelected = true; this.selectAllIndeterminate = true; } else { filterListItem.isSelected = false; } } else { filterListItem.isSelected = true; } filterListItem.value = element; filterListItem.label = element; filterListItem.indeterminate = false; this.listData.push(filterListItem); } else { this.containsNullOrEmpty = true; } }); } /** * @private * @param {?} shouldUpdateSelection * @return {?} */ addItems(shouldUpdateSelection) { this.selectAllSelected = true; this.selectAllIndeterminate = false; this.uniqueValues.forEach(element => { if (element !== undefined && element !== null && element !== '') { /** @type {?} */ const filterListItem = new FilterListItem(); if (this.column.filteringExpressionsTree) { if (shouldUpdateSelection) { if (this.filterValues.has(element)) { filterListItem.isSelected = true; } else { filterListItem.isSelected = false; } this.selectAllIndeterminate = true; } else { filterListItem.isSelected = false; this.selectAllSelected = false; } } else { filterListItem.isSelected = true; } if (this.column.dataType === DataType.Date) { filterListItem.value = new Date(element); filterListItem.label = new Date(element); } else { filterListItem.value = element; filterListItem.label = element; } filterListItem.indeterminate = false; this.listData.push(filterListItem); } else { this.containsNullOrEmpty = true; } }); } /** * @private * @return {?} */ addSelectAllItem() { /** @type {?} */ const selectAll = new FilterListItem(); selectAll.isSelected = this.selectAllSelected; selectAll.value = this.grid.resourceStrings.igx_grid_excel_select_all; selectAll.label = this.grid.resourceStrings.igx_grid_excel_select_all; selectAll.indeterminate = this.selectAllIndeterminate; selectAll.isSpecial = true; this.listData.unshift(selectAll); } /** * @private * @param {?} shouldUpdateSelection * @return {?} */ addBlanksItem(shouldUpdateSelection) { /** @type {?} */ const blanks = new FilterListItem(); if (this.column.filteringExpressionsTree) { if (shouldUpdateSelection) { if (this.filterValues.has(null)) { blanks.isSelected = true; } else { blanks.isSelected = false; } } } else { blanks.isSelected = true; } blanks.value = null; blanks.label = this.grid.resourceStrings.igx_grid_excel_blanks; blanks.indeterminate = false; blanks.isSpecial = true; this.listData.unshift(blanks); } /** * @private * @param {?} a * @param {?} b * @return {?} */ sortData(a, b) { /** @type {?} */ let valueA = a.value; /** @type {?} */ let valueB = b.value; if (typeof (a) === DataType.String) { valueA = a.value.toUpperCase(); valueB = b.value.toUpperCase(); } if (valueA < valueB) { return -1; } else if (valueA > valueB) { return 1; } else { return 0; } } // TODO: sort members by access modifier /** * @return {?} */ get sortingTemplate() { if (this.grid.excelStyleSortingTemplateDirective) { return this.grid.excelStyleSortingTemplateDirective.template; } else { return this.defaultExcelStyleSortingTemplate; } } /** * @return {?} */ get movingTemplate() { if (this.grid.excelStyleMovingTemplateDirective) { return this.grid.excelStyleMovingTemplateDirective.template; } else { return this.defaultExcelStyleMovingTemplate; } } /** * @return {?} */ get pinningTemplate() { if (this.grid.excelStylePinningTemplateDirective) { return this.grid.excelStylePinningTemplateDirective.template; } else { return this.defaultExcelStylePinningTemplate; } } /** * @return {?} */ get hidingTemplate() { if (this.grid.excelStyleHidingTemplateDirective) { return this.grid.excelStyleHidingTemplateDirective.template; } else { return this.defaultExcelStyleHidingTemplate; } } /** * @return {?} */ get applyButtonDisabled() { return this.listData[0] && !this.listData[0].isSelected && !this.listData[0].indeterminate; } /** * @return {?} */ applyFilter() { /** @type {?} */ const filterTree = new FilteringExpressionsTree(FilteringLogic.Or, this.column.field); /** @type {?} */ const selectedItems = this.listData.slice(1, this.listData.length).filter(el => el.isSelected === true); /** @type {?} */ const unselectedItem = this.listData.slice(1, this.listData.length).find(el => el.isSelected === false); if (unselectedItem) { if (selectedItems.length <= IgxGridExcelStyleFilteringComponent.filterOptimizationThreshold) { selectedItems.forEach(element => { /** @type {?} */ let condition = null; if (element.value !== null && element.value !== undefined) { if (this.column.dataType === DataType.Boolean) { condition = this.createCondition(element.value.toString()); } else { condition = this.createCondition('equals'); } } else { condition = this.createCondition('empty'); } filterTree.filteringOperands.push({ condition: condition, fieldName: this.column.field, ignoreCase: this.column.filteringIgnoreCase, searchVal: element.value }); }); } else { /** @type {?} */ const blanksItemIndex = selectedItems.findIndex(e => e.value === null || e.value === undefined); /** @type {?} */ let blanksItem; if (blanksItemIndex >= 0) { blanksItem = selectedItems[blanksItemIndex]; selectedItems.splice(blanksItemIndex, 1); } if (this.column.dataType === DataType.Date) { filterTree.filteringOperands.push({ condition: new InDateFilteringOperation(), fieldName: this.column.field, ignoreCase: this.column.filteringIgnoreCase, searchVal: new Set(selectedItems.map(d => new Date(d.value.getFullYear(), d.value.getMonth(), d.value.getDate()).toISOString())) }); } else { filterTree.filteringOperands.push({ condition: new InFilteringOperation(), fieldName: this.column.field, ignoreCase: this.column.filteringIgnoreCase, searchVal: new Set(selectedItems.map(e => e.value)) }); } if (blanksItem) { filterTree.filteringOperands.push({ condition: this.createCondition('empty'), fieldName: this.column.field, ignoreCase: this.column.filteringIgnoreCase, searchVal: blanksItem.value }); } } this.expressionsList = new Array(); this.filteringService.filterInternal(this.column.field, filterTree); } else { this.filteringService.clearFilter(this.column.field); } this.closeDropdown(); } /** * @return {?} */ closeDropdown() { if (this.overlayComponentId) { this.overlayService.hide(this.overlayComponentId); this.overlayComponentId = null; } } /** * @param {?} eventArgs * @return {?} */ onKeyDown(eventArgs) { if (eventArgs.key === "Escape" /* ESCAPE */ || eventArgs.key === "Esc" /* ESCAPE_IE */) { this.closeDropdown(); } eventArgs.stopPropagation(); } /** * @return {?} */ clearFilter() { this.filteringService.clearFilter(this.column.field); this.populateColumnData(); } /** * @param {?} eventArgs * @return {?} */ onClearFilterKeyDown(eventArgs) { if (eventArgs.key === "Enter" /* ENTER */) { this.clearFilter(); } } /** * @return {?} */ showCustomFilterItem() { /** @type {?} */ const exprTree = this.column.filteringExpressionsTree; return exprTree && exprTree.filteringOperands && exprTree.filteringOperands.length && !(((/** @type {?} */ (exprTree.filteringOperands[0]))).condition && ((/** @type {?} */ (exprTree.filteringOperands[0]))).condition.name === 'in'); } /** * @private * @param {?} conditionName * @return {?} */ createCondition(conditionName) { switch (this.column.dataType) { case DataType.Boolean: return IgxBooleanFilteringOperand.instance().condition(conditionName); case DataType.Number: return IgxNumberFilteringOperand.instance().condition(conditionName); case DataType.Date: return IgxDateFilteringOperand.instance().condition(conditionName); default: return IgxStringFilteringOperand.instance().condition(conditionName); } } } IgxGridExcelStyleFilteringComponent.filterOptimizationThreshold = 2; IgxGridExcelStyleFilteringComponent.decorators = [ { type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-grid-excel-style-filtering', template: "<article #dropdown\n class=\"igx-excel-filter__menu\"\n [id]=\"overlayComponentId\"\n (keydown)=\"onKeyDown($event)\">\n\n <header class=\"igx-excel-filter__menu-header\">\n <h4 class=\"igx-typography__h6\">{{ column.header || column.field }}</h4>\n </header>\n\n <ng-template #defaultExcelStyleSortingTemplate>\n <igx-excel-style-sorting\n #excelStyleSorting\n class=\"igx-excel-filter__sort\"\n [column]=\"column\"\n [grid]=\"grid\">\n </igx-excel-style-sorting>\n </ng-template>\n\n <div *ngIf=\"column.sortable\">\n <ng-container *ngTemplateOutlet=\"sortingTemplate\"></ng-container>\n </div>\n\n <section class=\"igx-excel-filter__actions\">\n\n <ng-template #defaultExcelStyleMovingTemplate>\n <igx-excel-style-column-moving\n class=\"igx-excel-filter__move\"\n [column]=\"column\"\n [grid]=\"grid\">\n </igx-excel-style-column-moving>\n </ng-template>\n\n <div *ngIf=\"column.movable\">\n <ng-container *ngTemplateOutlet=\"movingTemplate\"></ng-container>\n </div>\n\n <ng-template #defaultExcelStylePinningTemplate>\n <div class=\"igx-excel-filter__actions-pin\"\n (click)=\"onPin()\"\n tabindex=\"0\"\n *ngIf=\"!column.pinned\">\n <span>{{ grid.resourceStrings.igx_grid_excel_pin }}</span>\n <igx-icon fontSet=\"filtering-icons\" name=\"pin\"></igx-icon>\n </div>\n\n <div class=\"igx-excel-filter__actions-unpin\"\n (click)=\"onPin()\"\n tabindex=\"0\"\n *ngIf=\"column.pinned\">\n <span>{{ grid.resourceStrings.igx_grid_excel_unpin }}</span>\n <igx-icon fontSet=\"filtering-icons\" name=\"unpin\"></igx-icon>\n </div>\n </ng-template>\n\n <div *ngIf=\"!column.disablePinning\">\n <ng-container *ngTemplateOutlet=\"pinningTemplate\"></ng-container>\n </div>\n\n <ng-template #defaultExcelStyleHidingTemplate>\n <div class=\"igx-excel-filter__actions-hide\"\n tabindex=\"0\"\n (click)=\"onHide()\">\n <span>{{ grid.resourceStrings.igx_grid_excel_hide }}</span>\n <igx-icon>visibility_off</igx-icon>\n </div>\n </ng-template>\n\n <div *ngIf=\"!column.disableHiding\">\n <ng-container *ngTemplateOutlet=\"hidingTemplate\"></ng-container>\n </div>\n\n <div\n tabindex=\"0\"\n [ngClass]=\"clearFilterClass()\"\n (keydown)=\"onClearFilterKeyDown($event)\"\n (click)=\"clearFilter()\">\n <span>{{ grid.resourceStrings.igx_grid_excel_custom_dialog_clear }}</span>\n <igx-icon>clear</igx-icon>\n </div>\n\n <div\n tabindex=\"0\"\n class=\"igx-excel-filter__actions-filter\"\n (keydown)=\"onTextFilterKeyDown($event)\"\n (click)=\"onTextFilterClick($event)\"\n [igxDropDownItemNavigation]=\"subMenu\" >\n <span>{{ subMenuText }}</span>\n <igx-icon>keyboard_arrow_right</igx-icon>\n </div>\n </section>\n\n <igx-excel-style-search\n class=\"igx-excel-filter__menu-main\"\n #excelStyleSearch\n [column]=\"column\"\n [data]=\"listData\">\n </igx-excel-style-search>\n\n <footer class=\"igx-excel-filter__menu-footer\">\n <button igxButton (click)=\"closeDropdown()\">{{ grid.resourceStrings.igx_grid_excel_cancel }}</button>\n <button igxButton=\"raised\" [disabled]=\"applyButtonDisabled\" (click)=\"applyFilter()\">{{ grid.resourceStrings.igx_grid_excel_apply }}</button>\n </footer>\n</article>\n\n<igx-drop-down [maxHeight]=\"'397px'\" #subMenu (onSelection)=\"onSubMenuSelection($event)\" (onClosed)=\"onSubMenuClosed()\">\n <div>\n <igx-drop-down-item\n *ngFor=\"let condition of conditions\"\n [value]=\"condition\">\n <igx-icon fontSet=\"filtering-icons\" [name]=\"getCondition(condition).iconName\"></igx-icon>\n <span style=\"margin-left: 16px\">{{ translateCondition(condition) }}</span>\n </igx-drop-down-item>\n <igx-drop-down-item *ngIf=\"showCustomFilterItem()\">\n <igx-icon>filter_list</igx-icon>\n <span style=\"margin-left: 16px\">{{ grid.resourceStrings.igx_grid_excel_custom_filter }}</span>\n </igx-drop-down-item>\n </div>\n</igx-drop-down>\n\n<igx-excel-style-custom-dialog\n #customDialog\n [column]=\"column\"\n [filteringService]=\"filteringService\"\n [overlayComponentId]=\"overlayComponentId\"\n [overlayService]=\"overlayService\">\n</igx-excel-style-custom-dialog>\n" }] } ]; /** @nocollapse */ IgxGridExcelStyleFilteringComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; IgxGridExcelStyleFilteringComponent.propDecorators = { className: [{ type: HostBinding, args: ['class.igx-excel-filter',] }], mainDropdown: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }], subMenu: [{ type: ViewChild, args: ['subMenu', { read: IgxDropDownComponent },] }], customDialog: [{ type: ViewChild, args: ['customDialog', { read: IgxExcelStyleCustomDialogComponent },] }], excelStyleSearch: [{ type: ViewChild, args: ['excelStyleSearch', { read: IgxExcelStyleSearchComponent },] }], excelStyleSorting: [{ type: ViewChild, args: ['excelStyleSorting', { read: IgxExcelStyleSortingComponent },] }], defaultExcelStyleSortingTemplate: [{ type: ViewChild, args: ['defaultExcelStyleSortingTemplate', { read: TemplateRef },] }], defaultExcelStyleHidingTemplate: [{ type: ViewChild, args: ['defaultExcelStyleHidingTemplate', { read: TemplateRef },] }], defaultExcelStyleMovingTemplate: [{ type: ViewChild, args: ['defaultExcelStyleMovingTemplate', { read: TemplateRef },] }], defaultExcelStylePinningTemplate: [{ type: ViewChild, args: ['defaultExcelStylePinningTemplate', { read: TemplateRef },] }] }; if (false) { /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.filterOptimizationThreshold; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.shouldOpenSubMenu; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.expressionsList; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.destroy$; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.containsNullOrEmpty; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.selectAllSelected; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.selectAllIndeterminate; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.filterValues; /** * @type {?} * @protected */ IgxGridExcelStyleFilteringComponent.prototype.columnMoving; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.column; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.filteringService; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.listData; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.uniqueValues; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.overlayService; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.overlayComponentId; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype._subMenuPositionSettings; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype._subMenuOverlaySettings; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.className; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.mainDropdown; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.subMenu; /** @type {?} */ IgxGridExcelStyleFilteringComponent.prototype.customDialog; /** * @type {?} * @protected */ IgxGridExcelStyleFilteringComponent.prototype.excelStyleSearch; /** * @type {?} * @protected */ IgxGridExcelStyleFilteringComponent.prototype.excelStyleSorting; /** * @type {?} * @protected */ IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStyleSortingTemplate; /** * @type {?} * @protected */ IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStyleHidingTemplate; /** * @type {?} * @protected */ IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStyleMovingTemplate; /** * @type {?} * @protected */ IgxGridExcelStyleFilteringComponent.prototype.defaultExcelStylePinningTemplate; /** * @type {?} * @private */ IgxGridExcelStyleFilteringComponent.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsV0FBVyxFQUNYLHVCQUF1QixFQUN2QixXQUFXLEVBQ1gsU0FBUyxFQUdULFVBQVUsRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFHNUIsc0JBQXNCLEVBQ3pCLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxFQUVILHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQzNCLE1BQU0sOENBQThDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHdCQUF3QixFQUE2QixNQUFNLHFEQUFxRCxDQUFDO0FBQzFILE9BQU8sRUFBRSxjQUFjLEVBQXdCLE1BQU0seURBQXlELENBQUM7QUFDL0csT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBdUIsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQU0vRSxNQUFNLE9BQU8sY0FBYztJQUEzQjtRQUtXLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztDQUFBOzs7SUFMRywrQkFBa0I7O0lBQ2xCLCtCQUFrQjs7SUFDbEIsb0NBQTJCOztJQUMzQix1Q0FBOEI7O0lBQzlCLG1DQUF5Qjs7QUFNN0IsTUFBTSxPQUFPLHFDQUFxQzs7OztJQUM5QyxZQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFHLENBQUM7OztZQUpwRCxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGdDQUFnQzthQUM3Qzs7OztZQWxERyxXQUFXOzs7O0lBb0RDLHlEQUFpQzs7QUFNakQsTUFBTSxPQUFPLG9DQUFvQzs7OztJQUM3QyxZQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFHLENBQUM7OztZQUpwRCxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLCtCQUErQjthQUM1Qzs7OztZQXpERyxXQUFXOzs7O0lBMkRDLHdEQUFpQzs7QUFNakQsTUFBTSxPQUFPLG9DQUFvQzs7OztJQUM3QyxZQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFHLENBQUM7OztZQUpwRCxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLCtCQUErQjthQUM1Qzs7OztZQWhFRyxXQUFXOzs7O0lBa0VDLHdEQUFpQzs7QUFNakQsTUFBTSxPQUFPLHFDQUFxQzs7OztJQUM5QyxZQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFHLENBQUM7OztZQUpwRCxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGdDQUFnQzthQUM3Qzs7OztZQXZFRyxXQUFXOzs7O0lBeUVDLHlEQUFpQzs7Ozs7QUFZakQsTUFBTSxPQUFPLG1DQUFtQzs7OztJQWtGNUMsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEvRWxDLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQUN6QixvQkFBZSxHQUFHLElBQUksS0FBSyxFQUFnQixDQUFDO1FBQzVDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ2xDLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUM1QixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDekIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQU8sQ0FBQztRQUU1QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJckMsYUFBUSxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1FBQ3ZDLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBSWpCLDZCQUF3QixHQUFHO1lBQy9CLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLEdBQUc7U0FDNUMsQ0FBQztRQUVNLDRCQUF1QixHQUFvQjtZQUMvQyxtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLEtBQUssRUFBRSxLQUFLO1lBQ1osZ0JBQWdCLEVBQUUsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDakYsY0FBYyxFQUFFLElBQUksc0JBQXNCLEVBQUU7U0FDL0MsQ0FBQztRQUdGLGNBQVMsR0FBRyxrQkFBa0IsQ0FBQztJQWtEYyxDQUFDOzs7O0lBckI5QyxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQzs7OztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDL0MsQ0FBQzs7OztJQUVELElBQUksV0FBVztRQUNYLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDMUIsS0FBSyxRQUFRLENBQUMsT0FBTztnQkFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyw2QkFBNkIsQ0FBQztZQUNuRSxLQUFLLFFBQVEsQ0FBQyxNQUFNO2dCQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLDRCQUE0QixDQUFDO1lBQ2xFLEtBQUssUUFBUSxDQUFDLElBQUk7Z0JBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQztZQUNoRTtnQkFDSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDO1NBQ25FO0lBQ0wsQ0FBQzs7OztJQUlELFdBQVc7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEtBQUssRUFBZ0IsQ0FBQztRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEksSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtZQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQzVEO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7O2tCQUNsQixFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzFGLElBQUksRUFBRSxFQUFFO2dCQUNKLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQy9DO1NBQ0o7UUFFRCxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7O0lBRU0sZ0JBQWdCO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRTtZQUN0QyxPQUFPLGlDQUFpQyxDQUFDO1NBQzVDO1FBRUQsT0FBTywyQ0FBMkMsQ0FBQztJQUN2RCxDQUFDOzs7Ozs7OztJQUVNLFVBQVUsQ0FBQyxNQUEwQixFQUFFLGdCQUFxQyxFQUFFLGNBQWlDLEVBQ2xILGtCQUEwQjtRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBRTdDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdkYsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7Ozs7O0lBS00sWUFBWSxDQUFDLEtBQWE7UUFDN0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7Ozs7O0lBS00sa0JBQWtCLENBQUMsS0FBYTtRQUNuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLG1CQUFtQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ2xHLENBQUM7Ozs7SUFFTSxLQUFLO1FBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7OztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7Ozs7SUFFTSxpQkFBaUIsQ0FBQyxTQUFTO1FBQzlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUM7O2tCQUVsRixRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUU7O2tCQUMxRCxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUU7O2dCQUV4RSxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSzs7Z0JBQzFDLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLO1lBQ3ZDLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3hCLEVBQUUsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFO2dCQUN4QixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztnQkFDdEcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7YUFDMUc7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDO2FBQzNHO1lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztTQUNsQztJQUNMLENBQUM7Ozs7O0lBRU0sbUJBQW1CLENBQUMsU0FBUztRQUNoQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLHdCQUFlLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQzs7OztJQUVNLGVBQWU7UUFDbEIscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7OztJQUVNLGtCQUFrQixDQUFDLFNBQThCO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDbEUsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBRU8sd0JBQXdCO1FBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNqQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFDOUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQzdELElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFDN0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUM5RCxPQUFPLElBQUksQ0FBQztTQUNmOztjQUVLLDBCQUEwQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ2pFLENBQUMsR0FBRyxDQUFDLGNBQWMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLGFBQWEsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFDMUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQ3hDLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxPQUFPO2dCQUN6QyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFDekMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTTtRQUVwRCxPQUFPLDBCQUEwQixLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQ3RFLENBQUM7Ozs7O0lBRU8sNkJBQTZCO1FBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUMzQyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7O2tCQUN4QixVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO1lBRTFELElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtnQkFDakMsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO1FBRUQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzNELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNqRCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOzs7O0lBRU0sa0JBQWtCOztZQUNqQixJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOztjQUNuRCxtQkFBbUIsR0FBOEIsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0I7O2NBQ25GLGVBQWUsR0FBRyxJQUFJLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7UUFFakgsS0FBSyxNQUFNLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRTtZQUN6RCxJQUFJLE9BQU8sWUFBWSx3QkFBd0IsRUFBRTs7c0JBQ3ZDLGNBQWMsR0FBRyxtQkFBQSxPQUFPLEVBQTRCO2dCQUMxRCxJQUFJLGNBQWMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7b0JBQ2hELE1BQU07aUJBQ1Q7YUFDSjtZQUNELGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxJQUFJLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7O2tCQUNwQyxLQUFLLEdBQUcsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFO1lBQ2xELElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRTtZQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BFLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDdEMsT0FBTyxDQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFBLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNsRixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFFLENBQUM7aUJBQ3JDO2dCQUNELE9BQU8sQ0FBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFFLENBQUM7WUFDcEgsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDWDthQUFNO1lBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxDQ