cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
273 lines • 62.8 kB
JavaScript
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../icon/icon.component";
export class ListComponent {
elementRef;
listElement;
items = [];
title = '';
headerActions = false;
layout = 'vertical';
lineHeight = null;
showDividers = true;
grouped = false;
expandable = true;
draggable = false;
density = 'high';
accordion = null;
itemClick = new EventEmitter();
actionClick = new EventEmitter();
checkboxChange = new EventEmitter();
itemsReordered = new EventEmitter();
expandedChange = new EventEmitter();
expandedGroups = new Set();
dragItemIndex = null;
dragGroupIndex = null;
dragGroupItemIndex = null;
constructor(elementRef) {
this.elementRef = elementRef;
}
ngOnInit() {
if (!this.expandable && this.grouped) {
this.items.forEach(group => {
if (this.isGroup(group)) {
this.expandedGroups.add(group.id);
}
});
}
}
ngAfterViewInit() {
this._setupCollapseBehavior();
}
get listClasses() {
const classes = ['br-list'];
if (this.layout === 'horizontal') {
classes.push('horizontal');
}
if (this.lineHeight) {
classes.push(`data-${this._lineHeightWord(this.lineHeight)}-lines`);
}
return classes.join(' ');
}
densityClass(item) {
const density = item?.density || this.density;
switch (density) {
case 'medium': return 'py-3';
case 'low': return 'py-4';
case 'high':
default: return '';
}
}
isGroup(item) {
return item && item.hasOwnProperty('items') && Array.isArray(item.items);
}
isGroupExpanded(groupId) {
return this.expandedGroups.has(groupId);
}
toggleGroup(groupId) {
if (this.expandedGroups.has(groupId)) {
this.expandedGroups.delete(groupId);
}
else {
if (this.accordion) {
this.items.forEach(group => {
if (this.isGroup(group) && group.accordion === this.accordion) {
this.expandedGroups.delete(group.id);
}
});
}
this.expandedGroups.add(groupId);
}
}
onItemClick(item) {
this.itemClick.emit(item);
}
onActionClick(event, item) {
event.stopPropagation();
this.actionClick.emit(item);
}
onCheckboxChange(event, item) {
event.stopPropagation();
item.checked = event.target.checked;
this.checkboxChange.emit(item);
}
trackById(index, item) {
return item?.id ?? index;
}
groupTargetId(group) {
return `br-list-group-${group.id}`;
}
onDragStart(event, index) {
this.dragItemIndex = index;
this.dragGroupIndex = null;
this.dragGroupItemIndex = null;
this._setDragEffect(event);
}
onGroupItemDragStart(event, groupIndex, itemIndex) {
this.dragGroupIndex = groupIndex;
this.dragGroupItemIndex = itemIndex;
this.dragItemIndex = null;
this._setDragEffect(event, `${groupIndex}-${itemIndex}`);
}
onDragOver(event, index) {
event.preventDefault();
const listItem = this._closestBrItem(event.target);
if (listItem) {
listItem.classList.add('drag-over');
}
}
onDragLeave(event) {
const listItem = this._closestBrItem(event.target);
if (listItem) {
listItem.classList.remove('drag-over');
}
}
onDrop(event, index) {
event.preventDefault();
this._removeDragOver(event);
if (this.dragItemIndex !== null && this.dragItemIndex !== index) {
const item = this.items[this.dragItemIndex];
this.items.splice(this.dragItemIndex, 1);
this.items.splice(index, 0, item);
this.itemsReordered.emit([...this.items]);
}
}
onGroupItemDrop(event, groupIndex, itemIndex) {
event.preventDefault();
this._removeDragOver(event);
if (this.dragGroupIndex !== null && this.dragGroupItemIndex !== null) {
if (this.dragGroupIndex === groupIndex && this.dragGroupItemIndex !== itemIndex) {
const group = this.items[groupIndex];
const item = group.items[this.dragGroupItemIndex];
group.items.splice(this.dragGroupItemIndex, 1);
group.items.splice(itemIndex, 0, item);
}
else if (this.dragGroupIndex !== groupIndex) {
const sourceGroup = this.items[this.dragGroupIndex];
const targetGroup = this.items[groupIndex];
const item = sourceGroup.items[this.dragGroupItemIndex];
sourceGroup.items.splice(this.dragGroupItemIndex, 1);
targetGroup.items.splice(itemIndex, 0, item);
}
this.itemsReordered.emit([...this.items]);
}
}
onDragEnd(event) {
const element = event.target;
element.classList.remove('dragging');
this.dragItemIndex = null;
this.dragGroupIndex = null;
this.dragGroupItemIndex = null;
}
_lineHeightWord(value) {
const map = { '1': 'one', '2': 'two', '3': 'three' };
return map[value];
}
_setDragEffect(event, data) {
if (event.dataTransfer) {
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.setData('text/plain', data || (this.dragItemIndex ?? '').toString());
const element = event.target;
setTimeout(() => element.classList.add('dragging'), 0);
}
}
_closestBrItem(element) {
return element.closest('.br-item');
}
_removeDragOver(event) {
const listItem = this._closestBrItem(event.target);
if (listItem) {
listItem.classList.remove('drag-over');
}
}
_setupCollapseBehavior() {
const root = this.listElement?.nativeElement || this.elementRef.nativeElement;
if (!root)
return;
root.querySelectorAll('[data-toggle="collapse"]').forEach((trigger) => {
trigger.addEventListener('click', (event) => {
event.preventDefault();
const targetId = trigger.getAttribute('data-target');
const target = targetId ? document.getElementById(targetId) : null;
if (!target)
return;
const isHidden = target.hasAttribute('hidden');
if (isHidden) {
target.removeAttribute('hidden');
trigger.setAttribute('aria-expanded', 'true');
trigger.setAttribute('data-visible', 'true');
}
else {
target.setAttribute('hidden', '');
trigger.setAttribute('aria-expanded', 'false');
trigger.setAttribute('data-visible', 'false');
}
trigger.querySelectorAll('i.fas').forEach((icon) => {
const iconElement = icon;
if (isHidden) {
iconElement.classList.remove('fa-angle-down');
iconElement.classList.add('fa-angle-up');
}
else {
iconElement.classList.remove('fa-angle-up');
iconElement.classList.add('fa-angle-down');
}
});
const groupId = trigger.getAttribute('data-group-id');
if (groupId) {
this.expandedChange.emit({ id: groupId, expanded: isHidden });
}
});
trigger.setAttribute('tabindex', '0');
trigger.addEventListener('keydown', (event) => {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
trigger.click();
}
});
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ListComponent, selector: "cfc-list", inputs: { items: "items", title: "title", headerActions: "headerActions", layout: "layout", lineHeight: "lineHeight", showDividers: "showDividers", grouped: "grouped", expandable: "expandable", draggable: "draggable", density: "density", accordion: "accordion" }, outputs: { itemClick: "itemClick", actionClick: "actionClick", checkboxChange: "checkboxChange", itemsReordered: "itemsReordered", expandedChange: "expandedChange" }, viewQueries: [{ propertyName: "listElement", first: true, predicate: ["listElement"], descendants: true, static: true }], ngImport: i0, template: "<div [class]=\"listClasses\" role=\"list\" #listElement>\r\n <!-- Header -->\r\n <div class=\"header\" *ngIf=\"title\">\r\n <div class=\"title\">{{ title }}</div>\r\n <div class=\"header-actions\" *ngIf=\"headerActions\">\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'search'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'ellipsis-v'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <span class=\"br-divider\" *ngIf=\"title && showDividers\"></span>\r\n\r\n <!-- Lista simples -->\r\n <ng-container *ngIf=\"!grouped; else groupedTemplate\">\r\n <ng-container *ngFor=\"let item of items; let i = index; let last = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: item,\r\n index: i,\r\n groupIndex: null,\r\n last: last,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !last\"></span>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<!-- Template de agrupamento -->\r\n<ng-template #groupedTemplate>\r\n <ng-container *ngFor=\"let group of items; let groupIndex = index; let lastGroup = last; trackBy: trackById\">\r\n <div class=\"group\" *ngIf=\"isGroup(group)\">\r\n <!-- R\u00F3tulo simples (por r\u00F3tulo) -->\r\n <div class=\"br-item\" role=\"listitem\" *ngIf=\"!expandable\">\r\n {{ group.title }}\r\n </div>\r\n\r\n <!-- R\u00F3tulo expans\u00EDvel (por expans\u00E3o) -->\r\n <div\r\n class=\"br-item\"\r\n role=\"listitem\"\r\n *ngIf=\"expandable\"\r\n data-toggle=\"collapse\"\r\n [attr.data-target]=\"groupTargetId(group)\"\r\n [attr.data-group-id]=\"group.id\"\r\n [attr.aria-expanded]=\"isGroupExpanded(group.id)\"\r\n aria-controls=\"groupTargetId(group)\">\r\n <div class=\"content\">\r\n <div class=\"flex-fill\">{{ group.title }}</div>\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"isGroupExpanded(group.id) ? 'angle-up' : 'angle-down'\" size=\"20px\"></cfc-icon>\r\n </div>\r\n </div>\r\n\r\n <!-- Itens do grupo -->\r\n <div class=\"br-list\" [id]=\"groupTargetId(group)\" role=\"list\" [hidden]=\"!isGroupExpanded(group.id)\">\r\n <ng-container *ngFor=\"let subItem of group.items; let i = index; let lastItem = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: subItem,\r\n index: i,\r\n groupIndex: groupIndex,\r\n last: lastItem,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onGroupItemDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onGroupItemDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastItem\"></span>\r\n </ng-container>\r\n </div>\r\n\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastGroup\"></span>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template de item -->\r\n<ng-template #itemTemplate\r\n let-item\r\n let-index=\"index\"\r\n let-groupIndex=\"groupIndex\"\r\n let-clickHandler=\"clickHandler\"\r\n let-dragStartHandler=\"dragStartHandler\"\r\n let-dragOverHandler=\"dragOverHandler\"\r\n let-dragLeaveHandler=\"dragLeaveHandler\"\r\n let-dropHandler=\"dropHandler\"\r\n let-dragEndHandler=\"dragEndHandler\">\r\n <div\r\n class=\"br-item\"\r\n [class]=\"densityClass(item)\"\r\n [class.item-checked]=\"item.checked\"\r\n role=\"listitem\"\r\n [draggable]=\"draggable\"\r\n (click)=\"clickHandler(item)\"\r\n (dragstart)=\"dragStartHandler($event, index, groupIndex)\"\r\n (dragover)=\"dragOverHandler($event, index)\"\r\n (dragleave)=\"dragLeaveHandler($event)\"\r\n (drop)=\"dropHandler($event, index, groupIndex)\"\r\n (dragend)=\"dragEndHandler($event)\">\r\n\r\n <!-- R\u00F3tulo simples (sem conte\u00FAdo complexo) -->\r\n <ng-container *ngIf=\"item.label && !item.primaryText && !item.icon && !item.avatar && !item.image && !item.meta && !item.hasAction && !item.hasOwnProperty('checked')\">\r\n {{ item.label }}\r\n </ng-container>\r\n\r\n <!-- Conte\u00FAdo complexo -->\r\n <div class=\"row align-items-center\" *ngIf=\"item.primaryText || item.icon || item.avatar || item.image || item.meta || item.hasAction || item.hasOwnProperty('checked') || draggable\">\r\n <div class=\"col-auto\" *ngIf=\"draggable || item.icon || item.avatar || item.image\">\r\n <cfc-icon\r\n *ngIf=\"draggable\"\r\n [familyName]=\"'fas'\"\r\n [iconName]=\"'grip-lines'\"\r\n size=\"16px\"\r\n className=\"drag-handle\">\r\n </cfc-icon>\r\n <img *ngIf=\"item.avatar\" class=\"avatar\" [src]=\"item.avatar\" alt=\"Avatar\">\r\n <img *ngIf=\"item.image\" class=\"image\" [src]=\"item.image\" alt=\"Imagem\">\r\n <cfc-icon\r\n *ngIf=\"item.icon\"\r\n [familyName]=\"item.iconFamily || 'fas'\"\r\n [iconName]=\"item.icon\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"subtitle\" *ngIf=\"item.subtitle\">{{ item.subtitle }}</div>\r\n <div class=\"primary-text\">{{ item.primaryText }}</div>\r\n <div class=\"secondary-text\" *ngIf=\"item.secondaryText\">{{ item.secondaryText }}</div>\r\n </div>\r\n <div class=\"col-auto\" *ngIf=\"item.meta || item.hasAction || item.hasOwnProperty('checked')\">\r\n <span class=\"meta\" *ngIf=\"item.meta\">{{ item.meta }}</span>\r\n <input\r\n *ngIf=\"item.hasOwnProperty('checked')\"\r\n type=\"checkbox\"\r\n [checked]=\"item.checked\"\r\n (change)=\"onCheckboxChange($event, item)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <button\r\n *ngIf=\"item.hasAction\"\r\n class=\"action-button\"\r\n type=\"button\"\r\n (click)=\"onActionClick($event, item)\">\r\n <cfc-icon\r\n [familyName]=\"item.actionIconFamily || 'fas'\"\r\n [iconName]=\"item.actionIcon || 'chevron-right'\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block;width:100%}.header{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;font-weight:600}.header .title{font-size:14px}.header .header-actions{display:flex;gap:8px}.header .header-action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.header .header-action-button:hover{color:var(--interactive-light, #1351b4)}.row{display:flex;flex-wrap:wrap;align-items:center;width:100%;gap:8px}.align-items-center{align-items:center}.col{flex:1 1 0;min-width:0}.col-auto{flex:0 0 auto;display:flex;align-items:center;gap:8px}.flex-fill{flex:1;min-width:0}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.subtitle{font-size:12px;color:var(--color-secondary-06, #888);margin-bottom:2px}.primary-text{font-size:14px;color:var(--color, #333);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.secondary-text{font-size:12px;color:var(--color-secondary-06, #888);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meta{font-size:12px;color:var(--color-secondary-06, #888);white-space:nowrap}.avatar{width:40px;height:40px;border-radius:50%;object-fit:cover}.image{width:56px;height:56px;object-fit:cover;border-radius:4px}.action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.action-button:hover{color:var(--interactive-light, #1351b4)}.drag-handle{cursor:grab;color:var(--color-secondary-05, #9e9d9d)}.drag-handle:active{cursor:grabbing}.br-item.dragging{opacity:.5}.br-item.drag-over{background-color:var(--blue-cool-vivid-10, #c3ebfa)}.br-item.item-checked{background-color:var(--info-alternative, #c3ebfa)}.group{width:100%}input[type=checkbox]{cursor:pointer}.br-list.horizontal .group{flex:1;min-width:200px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IconComponent, selector: "cfc-icon", inputs: ["iconName", "familyName", "className", "size", "color"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-list', template: "<div [class]=\"listClasses\" role=\"list\" #listElement>\r\n <!-- Header -->\r\n <div class=\"header\" *ngIf=\"title\">\r\n <div class=\"title\">{{ title }}</div>\r\n <div class=\"header-actions\" *ngIf=\"headerActions\">\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'search'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n <button class=\"header-action-button\" type=\"button\">\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"'ellipsis-v'\" size=\"20px\"></cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <span class=\"br-divider\" *ngIf=\"title && showDividers\"></span>\r\n\r\n <!-- Lista simples -->\r\n <ng-container *ngIf=\"!grouped; else groupedTemplate\">\r\n <ng-container *ngFor=\"let item of items; let i = index; let last = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: item,\r\n index: i,\r\n groupIndex: null,\r\n last: last,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !last\"></span>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<!-- Template de agrupamento -->\r\n<ng-template #groupedTemplate>\r\n <ng-container *ngFor=\"let group of items; let groupIndex = index; let lastGroup = last; trackBy: trackById\">\r\n <div class=\"group\" *ngIf=\"isGroup(group)\">\r\n <!-- R\u00F3tulo simples (por r\u00F3tulo) -->\r\n <div class=\"br-item\" role=\"listitem\" *ngIf=\"!expandable\">\r\n {{ group.title }}\r\n </div>\r\n\r\n <!-- R\u00F3tulo expans\u00EDvel (por expans\u00E3o) -->\r\n <div\r\n class=\"br-item\"\r\n role=\"listitem\"\r\n *ngIf=\"expandable\"\r\n data-toggle=\"collapse\"\r\n [attr.data-target]=\"groupTargetId(group)\"\r\n [attr.data-group-id]=\"group.id\"\r\n [attr.aria-expanded]=\"isGroupExpanded(group.id)\"\r\n aria-controls=\"groupTargetId(group)\">\r\n <div class=\"content\">\r\n <div class=\"flex-fill\">{{ group.title }}</div>\r\n <cfc-icon [familyName]=\"'fas'\" [iconName]=\"isGroupExpanded(group.id) ? 'angle-up' : 'angle-down'\" size=\"20px\"></cfc-icon>\r\n </div>\r\n </div>\r\n\r\n <!-- Itens do grupo -->\r\n <div class=\"br-list\" [id]=\"groupTargetId(group)\" role=\"list\" [hidden]=\"!isGroupExpanded(group.id)\">\r\n <ng-container *ngFor=\"let subItem of group.items; let i = index; let lastItem = last; trackBy: trackById\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {\r\n $implicit: subItem,\r\n index: i,\r\n groupIndex: groupIndex,\r\n last: lastItem,\r\n clickHandler: onItemClick.bind(this),\r\n dragStartHandler: onGroupItemDragStart.bind(this),\r\n dragOverHandler: onDragOver.bind(this),\r\n dragLeaveHandler: onDragLeave.bind(this),\r\n dropHandler: onGroupItemDrop.bind(this),\r\n dragEndHandler: onDragEnd.bind(this)\r\n }\"></ng-container>\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastItem\"></span>\r\n </ng-container>\r\n </div>\r\n\r\n <span class=\"br-divider\" *ngIf=\"showDividers && !lastGroup\"></span>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template de item -->\r\n<ng-template #itemTemplate\r\n let-item\r\n let-index=\"index\"\r\n let-groupIndex=\"groupIndex\"\r\n let-clickHandler=\"clickHandler\"\r\n let-dragStartHandler=\"dragStartHandler\"\r\n let-dragOverHandler=\"dragOverHandler\"\r\n let-dragLeaveHandler=\"dragLeaveHandler\"\r\n let-dropHandler=\"dropHandler\"\r\n let-dragEndHandler=\"dragEndHandler\">\r\n <div\r\n class=\"br-item\"\r\n [class]=\"densityClass(item)\"\r\n [class.item-checked]=\"item.checked\"\r\n role=\"listitem\"\r\n [draggable]=\"draggable\"\r\n (click)=\"clickHandler(item)\"\r\n (dragstart)=\"dragStartHandler($event, index, groupIndex)\"\r\n (dragover)=\"dragOverHandler($event, index)\"\r\n (dragleave)=\"dragLeaveHandler($event)\"\r\n (drop)=\"dropHandler($event, index, groupIndex)\"\r\n (dragend)=\"dragEndHandler($event)\">\r\n\r\n <!-- R\u00F3tulo simples (sem conte\u00FAdo complexo) -->\r\n <ng-container *ngIf=\"item.label && !item.primaryText && !item.icon && !item.avatar && !item.image && !item.meta && !item.hasAction && !item.hasOwnProperty('checked')\">\r\n {{ item.label }}\r\n </ng-container>\r\n\r\n <!-- Conte\u00FAdo complexo -->\r\n <div class=\"row align-items-center\" *ngIf=\"item.primaryText || item.icon || item.avatar || item.image || item.meta || item.hasAction || item.hasOwnProperty('checked') || draggable\">\r\n <div class=\"col-auto\" *ngIf=\"draggable || item.icon || item.avatar || item.image\">\r\n <cfc-icon\r\n *ngIf=\"draggable\"\r\n [familyName]=\"'fas'\"\r\n [iconName]=\"'grip-lines'\"\r\n size=\"16px\"\r\n className=\"drag-handle\">\r\n </cfc-icon>\r\n <img *ngIf=\"item.avatar\" class=\"avatar\" [src]=\"item.avatar\" alt=\"Avatar\">\r\n <img *ngIf=\"item.image\" class=\"image\" [src]=\"item.image\" alt=\"Imagem\">\r\n <cfc-icon\r\n *ngIf=\"item.icon\"\r\n [familyName]=\"item.iconFamily || 'fas'\"\r\n [iconName]=\"item.icon\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"subtitle\" *ngIf=\"item.subtitle\">{{ item.subtitle }}</div>\r\n <div class=\"primary-text\">{{ item.primaryText }}</div>\r\n <div class=\"secondary-text\" *ngIf=\"item.secondaryText\">{{ item.secondaryText }}</div>\r\n </div>\r\n <div class=\"col-auto\" *ngIf=\"item.meta || item.hasAction || item.hasOwnProperty('checked')\">\r\n <span class=\"meta\" *ngIf=\"item.meta\">{{ item.meta }}</span>\r\n <input\r\n *ngIf=\"item.hasOwnProperty('checked')\"\r\n type=\"checkbox\"\r\n [checked]=\"item.checked\"\r\n (change)=\"onCheckboxChange($event, item)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <button\r\n *ngIf=\"item.hasAction\"\r\n class=\"action-button\"\r\n type=\"button\"\r\n (click)=\"onActionClick($event, item)\">\r\n <cfc-icon\r\n [familyName]=\"item.actionIconFamily || 'fas'\"\r\n [iconName]=\"item.actionIcon || 'chevron-right'\"\r\n size=\"20px\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:block;width:100%}.header{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;font-weight:600}.header .title{font-size:14px}.header .header-actions{display:flex;gap:8px}.header .header-action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.header .header-action-button:hover{color:var(--interactive-light, #1351b4)}.row{display:flex;flex-wrap:wrap;align-items:center;width:100%;gap:8px}.align-items-center{align-items:center}.col{flex:1 1 0;min-width:0}.col-auto{flex:0 0 auto;display:flex;align-items:center;gap:8px}.flex-fill{flex:1;min-width:0}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.subtitle{font-size:12px;color:var(--color-secondary-06, #888);margin-bottom:2px}.primary-text{font-size:14px;color:var(--color, #333);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.secondary-text{font-size:12px;color:var(--color-secondary-06, #888);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meta{font-size:12px;color:var(--color-secondary-06, #888);white-space:nowrap}.avatar{width:40px;height:40px;border-radius:50%;object-fit:cover}.image{width:56px;height:56px;object-fit:cover;border-radius:4px}.action-button{background:none;border:none;cursor:pointer;padding:4px;display:inline-flex;align-items:center;justify-content:center;color:var(--color-secondary-06, #888)}.action-button:hover{color:var(--interactive-light, #1351b4)}.drag-handle{cursor:grab;color:var(--color-secondary-05, #9e9d9d)}.drag-handle:active{cursor:grabbing}.br-item.dragging{opacity:.5}.br-item.drag-over{background-color:var(--blue-cool-vivid-10, #c3ebfa)}.br-item.item-checked{background-color:var(--info-alternative, #c3ebfa)}.group{width:100%}input[type=checkbox]{cursor:pointer}.br-list.horizontal .group{flex:1;min-width:200px}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { listElement: [{
type: ViewChild,
args: ['listElement', { static: true }]
}], items: [{
type: Input
}], title: [{
type: Input
}], headerActions: [{
type: Input
}], layout: [{
type: Input
}], lineHeight: [{
type: Input
}], showDividers: [{
type: Input
}], grouped: [{
type: Input
}], expandable: [{
type: Input
}], draggable: [{
type: Input
}], density: [{
type: Input
}], accordion: [{
type: Input
}], itemClick: [{
type: Output
}], actionClick: [{
type: Output
}], checkboxChange: [{
type: Output
}], itemsReordered: [{
type: Output
}], expandedChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2xpc3QvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2xpc3QvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUF5QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFPckgsTUFBTSxPQUFPLGFBQWE7SUEwQko7SUF6QndCLFdBQVcsQ0FBYztJQUU1RCxLQUFLLEdBQVUsRUFBRSxDQUFDO0lBQ2xCLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUMvQixNQUFNLEdBQThCLFVBQVUsQ0FBQztJQUMvQyxVQUFVLEdBQTJCLElBQUksQ0FBQztJQUMxQyxZQUFZLEdBQVksSUFBSSxDQUFDO0lBQzdCLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFDekIsVUFBVSxHQUFZLElBQUksQ0FBQztJQUMzQixTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzNCLE9BQU8sR0FBOEIsTUFBTSxDQUFDO0lBQzVDLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBRS9CLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3BDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3RDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3pDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBQzNDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBcUMsQ0FBQztJQUVqRixjQUFjLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDakQsYUFBYSxHQUFr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bmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjZmMtbGlzdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xpc3QuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnbGlzdEVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBsaXN0RWxlbWVudCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBoZWFkZXJBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbGF5b3V0OiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnID0gJ3ZlcnRpY2FsJztcclxuICBASW5wdXQoKSBsaW5lSGVpZ2h0OiAnMScgfCAnMicgfCAnMycgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBzaG93RGl2aWRlcnM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGdyb3VwZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBleHBhbmRhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBkcmFnZ2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBkZW5zaXR5OiAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnID0gJ2hpZ2gnO1xyXG4gIEBJbnB1dCgpIGFjY29yZGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgY2hlY2tib3hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaXRlbXNSZW9yZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG4gIEBPdXRwdXQoKSBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBleHBhbmRlZDogYm9vbGVhbiB9PigpO1xyXG5cclxuICBleHBhbmRlZEdyb3VwczogU2V0PHN0cmluZyB8IG51bWJlcj4gPSBuZXcgU2V0KCk7XHJcbiAgZHJhZ0l0ZW1JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgZHJhZ0dyb3VwSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIGRyYWdHcm91cEl0ZW1JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmV4cGFuZGFibGUgJiYgdGhpcy5ncm91cGVkKSB7XHJcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNHcm91cChncm91cCkpIHtcclxuICAgICAgICAgIHRoaXMuZXhwYW5kZWRHcm91cHMuYWRkKGdyb3VwLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2V0dXBDb2xsYXBzZUJlaGF2aW9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbGlzdENsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSBbJ2JyLWxpc3QnXTtcclxuICAgIGlmICh0aGlzLmxheW91dCA9PT0gJ2hvcml6b250YWwnKSB7XHJcbiAgICAgIGNsYXNzZXMucHVzaCgnaG9yaXpvbnRhbCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGluZUhlaWdodCkge1xyXG4gICAgICBjbGFzc2VzLnB1c2goYGRhdGEtJHt0aGlzLl9saW5lSGVpZ2h0V29yZCh0aGlzLmxpbmVIZWlnaHQpfS1saW5lc2ApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgZGVuc2l0eUNsYXNzKGl0ZW0/OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGVuc2l0eSA9IGl0ZW0/LmRlbnNpdHkgfHwgdGhpcy5kZW5zaXR5O1xyXG4gICAgc3dpdGNoIChkZW5zaXR5KSB7XHJcbiAgICAgIGNhc2UgJ21lZGl1bSc6IHJldHVybiAncHktMyc7XHJcbiAgICAgIGNhc2UgJ2xvdyc6IHJldHVybiAncHktNCc7XHJcbiAgICAgIGNhc2UgJ2hpZ2gnOlxyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0dyb3VwKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGl0ZW0gJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBBcnJheS5pc0FycmF5KGl0ZW0uaXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgaXNHcm91cEV4cGFuZGVkKGdyb3VwSWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRHcm91cHMuaGFzKGdyb3VwSWQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlR3JvdXAoZ3JvdXBJZDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5leHBhbmRlZEdyb3Vwcy5oYXMoZ3JvdXBJZCkpIHtcclxuICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5kZWxldGUoZ3JvdXBJZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5hY2NvcmRpb24pIHtcclxuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goZ3JvdXAgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNHcm91cChncm91cCkgJiYgZ3JvdXAuYWNjb3JkaW9uID09PSB0aGlzLmFjY29yZGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkR3JvdXBzLmRlbGV0ZShncm91cC5pZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5leHBhbmRlZEdyb3Vwcy5hZGQoZ3JvdXBJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1DbGljayhpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaXRlbUNsaWNrLmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBvbkFjdGlvbkNsaWNrKGV2ZW50OiBFdmVudCwgaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdChpdGVtKTtcclxuICB9XHJcblxyXG4gIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnQ6IEV2ZW50LCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaXRlbS5jaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgdGhpcy5jaGVja2JveENoYW5nZS5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gaXRlbT8uaWQgPz8gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBncm91cFRhcmdldElkKGdyb3VwOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBici1saXN0LWdyb3VwLSR7Z3JvdXAuaWR9YDtcclxuICB9XHJcblxyXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZ0l0ZW1JbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5kcmFnR3JvdXBJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLl9zZXREcmFnRWZmZWN0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uR3JvdXBJdGVtRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGdyb3VwSW5kZXg6IG51bWJlciwgaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZ0dyb3VwSW5kZXggPSBncm91cEluZGV4O1xyXG4gICAgdGhpcy5kcmFnR3JvdXBJdGVtSW5kZXggPSBpdGVtSW5kZXg7XHJcbiAgICB0aGlzLmRyYWdJdGVtSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5fc2V0RHJhZ0VmZmVjdChldmVudCwgYCR7Z3JvdXBJbmRleH0tJHtpdGVtSW5kZXh9YCk7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBjb25zdCBsaXN0SXRlbSA9IHRoaXMuX2Nsb3Nlc3RCckl0ZW0oZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcclxuICAgIGlmIChsaXN0SXRlbSkge1xyXG4gICAgICBsaXN0SXRlbS5jbGFzc0xpc3QuYWRkKCdkcmFnLW92ZXInKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxpc3RJdGVtID0gdGhpcy5fY2xvc2VzdEJySXRlbShldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgaWYgKGxpc3RJdGVtKSB7XHJcbiAgICAgIGxpc3RJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9yZW1vdmVEcmFnT3ZlcihldmVudCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZHJhZ0l0ZW1JbmRleCAhPT0gbnVsbCAmJiB0aGlzLmRyYWdJdGVtSW5kZXggIT09IGluZGV4KSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW3RoaXMuZHJhZ0l0ZW1JbmRleF07XHJcbiAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuZHJhZ0l0ZW1JbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGluZGV4LCAwLCBpdGVtKTtcclxuICAgICAgdGhpcy5pdGVtc1Jlb3JkZXJlZC5lbWl0KFsuLi50aGlzLml0ZW1zXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkdyb3VwSXRlbURyb3AoZXZlbnQ6IERyYWdFdmVudCwgZ3JvdXBJbmRleDogbnVtYmVyLCBpdGVtSW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuX3JlbW92ZURyYWdPdmVyKGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5kcmFnR3JvdXBJbmRleCAhPT0gbnVsbCAmJiB0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5kcmFnR3JvdXBJbmRleCA9PT0gZ3JvdXBJbmRleCAmJiB0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCAhPT0gaXRlbUluZGV4KSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLml0ZW1zW2dyb3VwSW5kZXhdIGFzIGFueTtcclxuICAgICAgICBjb25zdCBpdGVtID0gZ3JvdXAuaXRlbXNbdGhpcy5kcmFnR3JvdXBJdGVtSW5kZXhdO1xyXG4gICAgICAgIGdyb3VwLml0ZW1zLnNwbGljZSh0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCwgMSk7XHJcbiAgICAgICAgZ3JvdXAuaXRlbXMuc3BsaWNlKGl0ZW1JbmRleCwgMCwgaXRlbSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnR3JvdXBJbmRleCAhPT0gZ3JvdXBJbmRleCkge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZUdyb3VwID0gdGhpcy5pdGVtc1t0aGlzLmRyYWdHcm91cEluZGV4XSBhcyBhbnk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0R3JvdXAgPSB0aGlzLml0ZW1zW2dyb3VwSW5kZXhdIGFzIGFueTtcclxuICAgICAgICBjb25zdCBpdGVtID0gc291cmNlR3JvdXAuaXRlbXNbdGhpcy5kcmFnR3JvdXBJdGVtSW5kZXhdO1xyXG4gICAgICAgIHNvdXJjZUdyb3VwLml0ZW1zLnNwbGljZSh0aGlzLmRyYWdHcm91cEl0ZW1JbmRleCwgMSk7XHJcbiAgICAgICAgdGFyZ2V0R3JvdXAuaXRlbXMuc3BsaWNlKGl0ZW1JbmRleCwgMCwgaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pdGVtc1Jlb3JkZXJlZC5lbWl0KFsuLi50aGlzLml0ZW1zXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyYWdFbmQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTtcclxuICAgIHRoaXMuZHJhZ0l0ZW1JbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLmRyYWdHcm91cEluZGV4ID0gbnVsbDtcclxuICAgIHRoaXMuZHJhZ0dyb3VwSXRlbUluZGV4ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xpbmVIZWlnaHRXb3JkKHZhbHVlOiAnMScgfCAnMicgfCAnMycpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnMSc6ICdvbmUnLCAnMic6ICd0d28nLCAnMyc6ICd0aHJlZScgfTtcclxuICAgIHJldHVybiBtYXBbdmFsdWVdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0RHJhZ0VmZmVjdChldmVudDogRHJhZ0V2ZW50LCBkYXRhPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZXZlb