1 | {"version":3,"file":"table__testing.js","sources":["../../../../../../src/material/table/testing/cell-harness.ts","../../../../../../src/material/table/testing/row-harness.ts","../../../../../../src/material/table/testing/table-harness.ts","../../../../../../src/material/table/testing/public-api.ts","../../../../../../src/material/table/testing/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n HarnessPredicate,\n ComponentHarnessConstructor,\n ContentContainerComponentHarness\n} from '@angular/cdk/testing';\nimport {CellHarnessFilters} from './table-harness-filters';\n\n/** Harness for interacting with a standard Angular Material table cell. */\nexport class MatCellHarness extends ContentContainerComponentHarness {\n /** The selector for the host element of a `MatCellHarness` instance. */\n static hostSelector = '.mat-cell';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a table cell with specific attributes.\n * @param options Options for narrowing the search\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with(options: CellHarnessFilters = {}): HarnessPredicate<MatCellHarness> {\n return MatCellHarness._getCellPredicate(MatCellHarness, options);\n }\n\n /** Gets the cell's text. */\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n /** Gets the name of the column that the cell belongs to. */\n async getColumnName(): Promise<string> {\n const host = await this.host();\n const classAttribute = await host.getAttribute('class');\n\n if (classAttribute) {\n const prefix = 'mat-column-';\n const name = classAttribute.split(' ').map(c => c.trim()).find(c => c.startsWith(prefix));\n\n if (name) {\n return name.split(prefix)[1];\n }\n }\n\n throw Error('Could not determine column name of cell.');\n }\n\n protected static _getCellPredicate<T extends MatCellHarness>(\n type: ComponentHarnessConstructor<T>,\n options: CellHarnessFilters): HarnessPredicate<T> {\n return new HarnessPredicate(type, options)\n .addOption('text', options.text,\n (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text))\n .addOption('columnName', options.columnName,\n (harness, name) => HarnessPredicate.stringMatches(harness.getColumnName(), name));\n }\n}\n\n/** Harness for interacting with a standard Angular Material table header cell. */\nexport class MatHeaderCellHarness extends MatCellHarness {\n /** The selector for the host element of a `MatHeaderCellHarness` instance. */\n static override hostSelector = '.mat-header-cell';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for\n * a table header cell with specific attributes.\n * @param options Options for narrowing the search\n * @return a `HarnessPredicate` configured with the given options.\n */\n static override with(options: CellHarnessFilters = {}): HarnessPredicate<MatHeaderCellHarness> {\n return MatHeaderCellHarness._getCellPredicate(MatHeaderCellHarness, options);\n }\n}\n\n/** Harness for interacting with a standard Angular Material table footer cell. */\nexport class MatFooterCellHarness extends MatCellHarness {\n /** The selector for the host element of a `MatFooterCellHarness` instance. */\n static override hostSelector = '.mat-footer-cell';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for\n * a table footer cell with specific attributes.\n * @param options Options for narrowing the search\n * @return a `HarnessPredicate` configured with the given options.\n */\n static override with(options: CellHarnessFilters = {}): HarnessPredicate<MatFooterCellHarness> {\n return MatFooterCellHarness._getCellPredicate(MatFooterCellHarness, options);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n ComponentHarness,\n ComponentHarnessConstructor,\n HarnessPredicate,\n parallel,\n} from '@angular/cdk/testing';\nimport {RowHarnessFilters, CellHarnessFilters} from './table-harness-filters';\nimport {MatCellHarness, MatHeaderCellHarness, MatFooterCellHarness} from './cell-harness';\n\n/** Text extracted from a table row organized by columns. */\nexport interface MatRowHarnessColumnsText {\n [columnName: string]: string;\n}\n\nexport abstract class _MatRowHarnessBase<\n CellType extends (ComponentHarnessConstructor<Cell> & {\n with: (options?: CellHarnessFilters) => HarnessPredicate<Cell>}),\n Cell extends ComponentHarness & {getText(): Promise<string>, getColumnName(): Promise<string>}\n> extends ComponentHarness {\n protected abstract _cellHarness: CellType;\n\n /** Gets a list of `MatCellHarness` for all cells in the row. */\n async getCells(filter: CellHarnessFilters = {}): Promise<Cell[]> {\n return this.locatorForAll(this._cellHarness.with(filter))();\n }\n\n /** Gets the text of the cells in the row. */\n async getCellTextByIndex(filter: CellHarnessFilters = {}): Promise<string[]> {\n const cells = await this.getCells(filter);\n return parallel(() => cells.map(cell => cell.getText()));\n }\n\n /** Gets the text inside the row organized by columns. */\n async getCellTextByColumnName(): Promise<MatRowHarnessColumnsText> {\n const output: MatRowHarnessColumnsText = {};\n const cells = await this.getCells();\n const cellsData = await parallel(() => cells.map(cell => {\n return parallel(() => [cell.getColumnName(), cell.getText()]);\n }));\n cellsData.forEach(([columnName, text]) => output[columnName] = text);\n return output;\n }\n}\n\n/** Harness for interacting with a standard Angular Material table row. */\nexport class MatRowHarness extends _MatRowHarnessBase<typeof MatCellHarness, MatCellHarness> {\n /** The selector for the host element of a `MatRowHarness` instance. */\n static hostSelector = '.mat-row';\n protected _cellHarness = MatCellHarness;\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a table row with specific attributes.\n * @param options Options for narrowing the search\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with(options: RowHarnessFilters = {}): HarnessPredicate<MatRowHarness> {\n return new HarnessPredicate(MatRowHarness, options);\n }\n}\n\n/** Harness for interacting with a standard Angular Material table header row. */\nexport class MatHeaderRowHarness extends _MatRowHarnessBase<\n typeof MatHeaderCellHarness, MatHeaderCellHarness> {\n /** The selector for the host element of a `MatHeaderRowHarness` instance. */\n static hostSelector = '.mat-header-row';\n protected _cellHarness = MatHeaderCellHarness;\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for\n * a table header row with specific attributes.\n * @param options Options for narrowing the search\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with(options: RowHarnessFilters = {}): HarnessPredicate<MatHeaderRowHarness> {\n return new HarnessPredicate(MatHeaderRowHarness, options);\n }\n}\n\n\n/** Harness for interacting with a standard Angular Material table footer row. */\nexport class MatFooterRowHarness extends _MatRowHarnessBase<\n typeof MatFooterCellHarness, MatFooterCellHarness> {\n /** The selector for the host element of a `MatFooterRowHarness` instance. */\n static hostSelector = '.mat-footer-row';\n protected _cellHarness = MatFooterCellHarness;\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for\n * a table footer row cell with specific attributes.\n * @param options Options for narrowing the search\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with(options: RowHarnessFilters = {}): HarnessPredicate<MatFooterRowHarness> {\n return new HarnessPredicate(MatFooterRowHarness, options);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n ComponentHarness,\n ComponentHarnessConstructor,\n ContentContainerComponentHarness,\n HarnessPredicate,\n parallel,\n} from '@angular/cdk/testing';\nimport {TableHarnessFilters, RowHarnessFilters} from './table-harness-filters';\nimport {\n MatRowHarness,\n MatHeaderRowHarness,\n MatFooterRowHarness,\n MatRowHarnessColumnsText,\n} from './row-harness';\n\n/** Text extracted from a table organized by columns. */\nexport interface MatTableHarnessColumnsText {\n [columnName: string]: {\n text: string[];\n headerText: string[];\n footerText: string[];\n };\n}\n\ninterface RowBase extends ComponentHarness {\n getCellTextByColumnName(): Promise<MatRowHarnessColumnsText>;\n getCellTextByIndex(): Promise<string[]>;\n}\n\nexport abstract class _MatTableHarnessBase<\n HeaderRowType extends (ComponentHarnessConstructor<HeaderRow> & {\n with: (options?: RowHarnessFilters) => HarnessPredicate<HeaderRow>}),\n HeaderRow extends RowBase,\n RowType extends (ComponentHarnessConstructor<Row> & {\n with: (options?: RowHarnessFilters) => HarnessPredicate<Row>}),\n Row extends RowBase,\n FooterRowType extends (ComponentHarnessConstructor<FooterRow> & {\n with: (options?: RowHarnessFilters) => HarnessPredicate<FooterRow>}),\n FooterRow extends RowBase\n> extends ContentContainerComponentHarness<string> {\n protected abstract _headerRowHarness: HeaderRowType;\n protected abstract _rowHarness: RowType;\n protected abstract _footerRowHarness: FooterRowType;\n\n /** Gets all of the header rows in a table. */\n async getHeaderRows(filter: RowHarnessFilters = {}): Promise<HeaderRow[]> {\n return this.locatorForAll(this._headerRowHarness.with(filter))();\n }\n\n /** Gets all of the regular data rows in a table. */\n async getRows(filter: RowHarnessFilters = {}): Promise<Row[]> {\n return this.locatorForAll(this._rowHarness.with(filter))();\n }\n\n /** Gets all of the footer rows in a table. */\n async getFooterRows(filter: RowHarnessFilters = {}): Promise<FooterRow[]> {\n return this.locatorForAll(this._footerRowHarness.with(filter))();\n }\n\n /** Gets the text inside the entire table organized by rows. */\n async getCellTextByIndex(): Promise<string[][]> {\n const rows = await this.getRows();\n return parallel(() => rows.map(row => row.getCellTextByIndex()));\n }\n\n /** Gets the text inside the entire table organized by columns. */\n async getCellTextByColumnName(): Promise<MatTableHarnessColumnsText> {\n const [headerRows, footerRows, dataRows] = await parallel(() => [\n this.getHeaderRows(),\n this.getFooterRows(),\n this.getRows()\n ]);\n\n const text: MatTableHarnessColumnsText = {};\n const [headerData, footerData, rowsData] = await parallel(() => [\n parallel(() => headerRows.map(row => row.getCellTextByColumnName())),\n parallel(() => footerRows.map(row => row.getCellTextByColumnName())),\n parallel(() => dataRows.map(row => row.getCellTextByColumnName())),\n ]);\n\n rowsData.forEach(data => {\n Object.keys(data).forEach(columnName => {\n const cellText = data[columnName];\n\n if (!text[columnName]) {\n text[columnName] = {\n headerText: getCellTextsByColumn(headerData, columnName),\n footerText: getCellTextsByColumn(footerData, columnName),\n text: []\n };\n }\n\n text[columnName].text.push(cellText);\n });\n });\n\n return text;\n }\n}\n\n/** Harness for interacting with a standard mat-table in tests. */\nexport class MatTableHarness extends _MatTableHarnessBase<\n typeof MatHeaderRowHarness, MatHeaderRowHarness,\n typeof MatRowHarness, MatRowHarness,\n typeof MatFooterRowHarness, MatFooterRowHarness\n> {\n /** The selector for the host element of a `MatTableHarness` instance. */\n static hostSelector = '.mat-table';\n protected _headerRowHarness = MatHeaderRowHarness;\n protected _rowHarness = MatRowHarness;\n protected _footerRowHarness = MatFooterRowHarness;\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a table with specific attributes.\n * @param options Options for narrowing the search\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with(options: TableHarnessFilters = {}): HarnessPredicate<MatTableHarness> {\n return new HarnessPredicate(MatTableHarness, options);\n }\n}\n\n/** Extracts the text of cells only under a particular column. */\nfunction getCellTextsByColumn(rowsData: MatRowHarnessColumnsText[], column: string): string[] {\n const columnTexts: string[] = [];\n\n rowsData.forEach(data => {\n Object.keys(data).forEach(columnName => {\n if (columnName === column) {\n columnTexts.push(data[columnName]);\n }\n });\n });\n\n return columnTexts;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport * from './table-harness';\nexport * from './row-harness';\nexport * from './cell-harness';\nexport * from './table-harness-filters';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAAA;;;;;;;AAeA;MACa,cAAe,SAAQ,gCAAgC;;;;;;IASlE,OAAO,IAAI,CAAC,UAA8B,EAAE;QAC1C,OAAO,cAAc,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;KAClE;;IAGK,OAAO;;YACX,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;SACnC;KAAA;;IAGK,aAAa;;YACjB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAExD,IAAI,cAAc,EAAE;gBAClB,MAAM,MAAM,GAAG,aAAa,CAAC;gBAC7B,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE1F,IAAI,IAAI,EAAE;oBACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC9B;aACF;YAED,MAAM,KAAK,CAAC,0CAA0C,CAAC,CAAC;SACzD;KAAA;IAES,OAAO,iBAAiB,CAChC,IAAoC,EACpC,OAA2B;QAC3B,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;aACvC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAC3B,CAAC,OAAO,EAAE,IAAI,KAAK,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;aAC9E,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,EACvC,CAAC,OAAO,EAAE,IAAI,KAAK,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;KACzF;;AA1CD;AACO,2BAAY,GAAG,WAAW,CAAC;AA4CpC;MACa,oBAAqB,SAAQ,cAAc;;;;;;;IAUtD,OAAgB,IAAI,CAAC,UAA8B,EAAE;QACnD,OAAO,oBAAoB,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;KAC9E;;AAXD;AACgB,iCAAY,GAAG,kBAAkB,CAAC;AAapD;MACa,oBAAqB,SAAQ,cAAc;;;;;;;IAUtD,OAAgB,IAAI,CAAC,UAA8B,EAAE;QACnD,OAAO,oBAAoB,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;KAC9E;;AAXD;AACgB,iCAAY,GAAG,kBAAkB;;ACjFnD;;;;;;;MAsBsB,kBAIpB,SAAQ,gBAAgB;;IAIlB,QAAQ,CAAC,SAA6B,EAAE;;YAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;SAC7D;KAAA;;IAGK,kBAAkB,CAAC,SAA6B,EAAE;;YACtD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;SAC1D;KAAA;;IAGK,uBAAuB;;YAC3B,MAAM,MAAM,GAA6B,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI;gBACnD,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;aAC/D,CAAC,CAAC,CAAC;YACJ,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;YACrE,OAAO,MAAM,CAAC;SACf;KAAA;CACF;AAED;MACa,aAAc,SAAQ,kBAAyD;IAA5F;;QAGY,iBAAY,GAAG,cAAc,CAAC;KAUzC;;;;;;IAHC,OAAO,IAAI,CAAC,UAA6B,EAAE;QACzC,OAAO,IAAI,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;KACrD;;AAXD;AACO,0BAAY,GAAG,UAAU,CAAC;AAanC;MACa,mBAAoB,SAAQ,kBACW;IADpD;;QAIY,iBAAY,GAAG,oBAAoB,CAAC;KAW/C;;;;;;;IAHC,OAAO,IAAI,CAAC,UAA6B,EAAE;QACzC,OAAO,IAAI,gBAAgB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;KAC3D;;AAZD;AACO,gCAAY,GAAG,iBAAiB,CAAC;AAe1C;MACa,mBAAoB,SAAQ,kBACW;IADpD;;QAIY,iBAAY,GAAG,oBAAoB,CAAC;KAW/C;;;;;;;IAHC,OAAO,IAAI,CAAC,UAA6B,EAAE;QACzC,OAAO,IAAI,gBAAgB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;KAC3D;;AAZD;AACO,gCAAY,GAAG,iBAAiB;;AC3FzC;;;;;;;MAqCsB,oBAUpB,SAAQ,gCAAwC;;IAM1C,aAAa,CAAC,SAA4B,EAAE;;YAChD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;SAClE;KAAA;;IAGK,OAAO,CAAC,SAA4B,EAAE;;YAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;SAC5D;KAAA;;IAGK,aAAa,CAAC,SAA4B,EAAE;;YAChD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;SAClE;KAAA;;IAGK,kBAAkB;;YACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;SAClE;KAAA;;IAGK,uBAAuB;;YAC3B,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM;gBAC9D,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,OAAO,EAAE;aACf,CAAC,CAAC;YAEH,MAAM,IAAI,GAA+B,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM;gBAC9D,QAAQ,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC;gBACpE,QAAQ,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC;gBACpE,QAAQ,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC;aACnE,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,CAAC,IAAI;gBACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU;oBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;oBAElC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;wBACrB,IAAI,CAAC,UAAU,CAAC,GAAG;4BACjB,UAAU,EAAE,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC;4BACxD,UAAU,EAAE,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC;4BACxD,IAAI,EAAE,EAAE;yBACT,CAAC;qBACH;oBAED,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACtC,CAAC,CAAC;aACJ,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;SACb;KAAA;CACF;AAED;MACa,eAAgB,SAAQ,oBAIpC;IAJD;;QAOY,sBAAiB,GAAG,mBAAmB,CAAC;QACxC,gBAAW,GAAG,aAAa,CAAC;QAC5B,sBAAiB,GAAG,mBAAmB,CAAC;KAUnD;;;;;;IAHC,OAAO,IAAI,CAAC,UAA+B,EAAE;QAC3C,OAAO,IAAI,gBAAgB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;KACvD;;AAbD;AACO,4BAAY,GAAG,YAAY,CAAC;AAerC;AACA,SAAS,oBAAoB,CAAC,QAAoC,EAAE,MAAc;IAChF,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,QAAQ,CAAC,OAAO,CAAC,IAAI;QACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU;YAClC,IAAI,UAAU,KAAK,MAAM,EAAE;gBACzB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;aACpC;SACF,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB;;AC/IA;;;;;;;;ACAA;;;;;;;;;;"} |
---|