cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
207 lines • 82.8 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../../services/cookie-bar.service";
import * as i2 from "@angular/common";
import * as i3 from "../icon/icon.component";
export class CookieBarComponent {
cookieBarService;
set config(value) {
if (value) {
this.cookieBarService.setConfig(value);
}
}
cookieSettingsChange = new EventEmitter();
acceptCookies = new EventEmitter();
cookieConfig;
isOpen = false;
expandedGroups = {};
isNotesExpanded = false;
constructor(cookieBarService) {
this.cookieBarService = cookieBarService;
}
ngOnInit() {
// Inscreve para mudanças na configuração
this.cookieBarService.getConfig();
this.cookieConfig = this.cookieBarService.getConfig();
// Inscreve para mudanças no estado aberto/fechado
this.cookieBarService.getIsOpen().subscribe(isOpen => {
this.isOpen = isOpen;
});
// Inscreve para mudanças no output
this.cookieBarService.getCookieOutput().subscribe(output => {
if (output) {
this.cookieSettingsChange.emit(output);
}
});
}
get acceptButtonLabel() {
return this.cookieConfig?.acceptButton || 'Aceitar';
}
get secondaryButtonLabel() {
if (this.cookieConfig?.allOptOut) {
return this.cookieConfig?.optOutButton || 'Definir Cookies';
}
return this.cookieConfig?.optInButton || 'Ver Política de Cookies';
}
get lastUpdateLabel() {
return this.cookieConfig?.lastUpdateLabel || 'Última atualização';
}
get cookieGroupsLabel() {
return this.cookieConfig?.cookieGroupsLabel || 'Classes de cookies';
}
get selectAllLabel() {
return this.isSelectAllChecked()
? (this.cookieConfig?.selectAllLabel || 'Selecionar tudo')
: (this.cookieConfig?.unselectAllLabel || 'Desselecionar tudo');
}
getSelectGroupLabel(group) {
return this.isGroupChecked(group)
? (this.cookieConfig?.selectAllGroupLabel || 'Selecionar toda classe')
: (this.cookieConfig?.unselectAllGroupLabel || 'Desselecionar toda classe');
}
get onLabel() {
return this.cookieConfig?.onLabel || 'Ligado';
}
get offLabel() {
return this.cookieConfig?.offLabel || 'Desligado';
}
get alwaysActiveLabel() {
return this.cookieConfig?.alwaysActiveLabel || 'Sempre ativo';
}
get cookieNameLabel() {
return this.cookieConfig?.cookieNameLabel || 'Cookies';
}
get expiresLabel() {
return this.cookieConfig?.expiresLabel || 'Vencimento';
}
get domainLabel() {
return this.cookieConfig?.domainLabel || 'Domínio';
}
get enterpriseLabel() {
return this.cookieConfig?.enterpriseLabel || 'Empresa';
}
get purposeLabel() {
return this.cookieConfig?.purposeLabel || 'Finalidade';
}
get descriptionLabel() {
return this.cookieConfig?.descriptionLabel || 'Descrição';
}
toggleCookieBar() {
if (this.isOpen) {
this.cookieBarService.closeCookieBar();
}
else {
this.cookieBarService.openCookieBar();
}
}
toggleGroup(groupId) {
this.expandedGroups[groupId] = !this.expandedGroups[groupId];
}
isGroupExpanded(groupId) {
return this.expandedGroups[groupId] === true;
}
toggleNotes() {
this.isNotesExpanded = !this.isNotesExpanded;
}
onSelectAllChange(event) {
this.cookieBarService.updateSelectAll(event.target.checked);
}
onGroupSelectionChange(groupId, event) {
this.cookieBarService.updateGroupSelection(groupId, event.target.checked);
}
onCookieSelectionChange(groupId, cookieId, event) {
this.cookieBarService.updateCookieSelection(groupId, cookieId, event.target.checked);
}
isSelectAllChecked() {
return this.cookieConfig?.selectAll === true;
}
isSelectAllIndeterminate() {
if (!this.cookieConfig)
return false;
const optOutGroups = this.cookieConfig.cookieGroups.filter(g => g.groupOptOut);
if (optOutGroups.length === 0)
return false;
const selectedGroups = optOutGroups.filter(g => g.groupSelected);
// Verifica se todos os grupos estão selecionados
if (selectedGroups.length === optOutGroups.length) {
// Verifica se algum grupo está parcialmente selecionado
const hasPartiallySelectedGroup = optOutGroups.some(group => this.isGroupIndeterminate(group));
return hasPartiallySelectedGroup;
}
// Se alguns grupos estão selecionados, mas não todos
return selectedGroups.length > 0;
}
isGroupChecked(group) {
return group.groupSelected === true;
}
isGroupIndeterminate(group) {
if (!group.groupSelected)
return false;
const optOutCookies = group.cookieList.filter(c => c.cookieOptOut);
if (optOutCookies.length === 0)
return false;
const selectedCookies = optOutCookies.filter(c => c.cookieSelected);
return selectedCookies.length > 0 && selectedCookies.length < optOutCookies.length;
}
isCookieOptOut(cookie) {
return cookie.cookieOptOut;
}
isGroupOptOut(group) {
return group.groupOptOut;
}
accept() {
const output = {
selectAll: this.getSelectAllState(),
cookieGroups: this.cookieConfig.cookieGroups.map(group => ({
groupId: group.groupId,
groupSelected: this.getGroupState(group),
cookieList: group.cookieList.map(cookie => ({
cookieId: cookie.cookieId,
cookieSelected: cookie.cookieSelected
}))
}))
};
this.cookieBarService.accept();
this.acceptCookies.emit(output);
}
openDetailedView() {
this.cookieBarService.openCookieBar();
}
getSelectAllState() {
if (this.isSelectAllIndeterminate()) {
return 'indeterminated';
}
return this.isSelectAllChecked();
}
getGroupState(group) {
if (this.isGroupIndeterminate(group)) {
return 'indeterminated';
}
return this.isGroupChecked(group);
}
getGroupCookieCount(group) {
return group.cookieList.length;
}
getSelectedCookieCount(group) {
return group.cookieList.filter(cookie => cookie.cookieSelected).length;
}
getTotalCookieCount() {
return this.cookieConfig?.cookieGroups.reduce((count, group) => count + group.cookieList.length, 0) || 0;
}
getTotalSelectedCookieCount() {
return this.cookieConfig?.cookieGroups.reduce((count, group) => count + group.cookieList.filter(cookie => cookie.cookieSelected).length, 0) || 0;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookieBarComponent, deps: [{ token: i1.CookieBarService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CookieBarComponent, selector: "cfc-cookie-bar", inputs: { config: "config" }, outputs: { cookieSettingsChange: "cookieSettingsChange", acceptCookies: "acceptCookies" }, ngImport: i0, template: "<div\r\n class=\"br-cookiebar\"\r\n [class.default]=\"!isOpen\"\r\n [class.open]=\"isOpen\"\r\n tabindex=\"1\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-describedby=\"info-t\"\r\n aria-label=\"Componente para defini\u00E7\u00E3o de Cookies\"\r\n *ngIf=\"cookieConfig\">\r\n\r\n <!-- Vis\u00E3o minimizada (barra) -->\r\n <div class=\"br-modal\" *ngIf=\"!isOpen\">\r\n <div class=\"br-card\">\r\n <div class=\"container-fluid\">\r\n <div class=\"wrapper\">\r\n <div id=\"info-t\" class=\"br-modal-body\">\r\n <p class=\"info-text\">{{ cookieConfig.infoText }}</p>\r\n </div>\r\n </div>\r\n <div class=\"br-modal-footer actions\">\r\n <button class=\"br-button secondary small\" type=\"button\" (click)=\"openDetailedView()\">\r\n {{ secondaryButtonLabel }}\r\n </button>\r\n <button class=\"br-button primary small\" type=\"button\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Vis\u00E3o expandida (modal) -->\r\n <div class=\"br-modal\" *ngIf=\"isOpen\">\r\n <div class=\"br-card\">\r\n <div class=\"container-fluid\">\r\n <div class=\"wrapper\">\r\n <div class=\"br-modal-header entry-content\">\r\n <div class=\"br-modal-title\">\r\n <h1>{{ cookieConfig.mainTitle }}</h1>\r\n <button\r\n class=\"br-button close circle small\"\r\n type=\"button\"\r\n (click)=\"toggleCookieBar()\"\r\n [attr.aria-label]=\"cookieConfig.closeLabel || 'fechar'\">\r\n <cfc-icon [iconName]=\"'times'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n </button>\r\n </div>\r\n <p class=\"last-update\" *ngIf=\"cookieConfig.lastUpdate\">\r\n {{ lastUpdateLabel }}: <span>{{ cookieConfig.lastUpdate }}</span>\r\n </p>\r\n <p class=\"entry-text\">{{ cookieConfig.entryText }}</p>\r\n </div>\r\n\r\n <div id=\"info-t\" class=\"br-modal-body\">\r\n <p class=\"info-text\">{{ cookieConfig.infoText }}</p>\r\n\r\n <div class=\"br-list main-content\">\r\n <div class=\"header\">\r\n <div class=\"title\">{{ cookieGroupsLabel }}</div>\r\n <div class=\"br-checkbox\" *ngIf=\"cookieConfig.allOptOut\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"check-all\"\r\n [checked]=\"isSelectAllChecked()\"\r\n [indeterminate]=\"isSelectAllIndeterminate()\"\r\n (change)=\"onSelectAllChange($event)\">\r\n <label for=\"check-all\">{{ selectAllLabel }}</label>\r\n </div>\r\n <div class=\"message\" *ngIf=\"cookieConfig.allAlertMessage && !isSelectAllChecked()\">\r\n <span class=\"feedback warning\" role=\"alert\" aria-live=\"polite\">\r\n <cfc-icon [iconName]=\"'exclamation-triangle'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n {{ cookieConfig.allAlertMessage }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div\r\n class=\"br-item group-info\"\r\n *ngFor=\"let group of cookieConfig.cookieGroups; let groupIndex = index\"\r\n [class.open]=\"isGroupExpanded(group.groupId)\">\r\n <div class=\"group-header\" (click)=\"toggleGroup(group.groupId)\">\r\n <div class=\"group-name-section\">\r\n <span class=\"group-name\">{{ group.groupName }}</span>\r\n <span class=\"cookies-checked\">\r\n ({{ group.groupOptOut ? (getSelectedCookieCount(group) + ' de ') : '' }}\r\n </span>\r\n <span class=\"group-size\">{{ getGroupCookieCount(group) }})</span>\r\n </div>\r\n <div class=\"group-actions\">\r\n <div class=\"br-checkbox\" *ngIf=\"isGroupOptOut(group); else alwaysActive\">\r\n <input\r\n type=\"checkbox\"\r\n [id]=\"'check-group-' + groupIndex\"\r\n [checked]=\"isGroupChecked(group)\"\r\n [indeterminate]=\"isGroupIndeterminate(group)\"\r\n (change)=\"onGroupSelectionChange(group.groupId, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n [disabled]=\"!group.groupOptOut\">\r\n <label [for]=\"'check-group-' + groupIndex\" (click)=\"$event.stopPropagation()\">\r\n {{ getSelectGroupLabel(group) }}\r\n </label>\r\n </div>\r\n <ng-template #alwaysActive>\r\n <span class=\"always-active\">{{ alwaysActiveLabel }}</span>\r\n </ng-template>\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n [attr.aria-label]=\"(isGroupExpanded(group.groupId) ? 'Retrair' : 'Expandir') + ' grupo de Cookies ' + group.groupName\">\r\n <cfc-icon\r\n [iconName]=\"isGroupExpanded(group.groupId) ? 'angle-up' : 'angle-down'\"\r\n [familyName]=\"'fas'\"\r\n [size]=\"'16px'\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n <div class=\"message\" *ngIf=\"group.groupAlertMessage && !isGroupChecked(group)\">\r\n <span class=\"feedback warning\" role=\"alert\" aria-live=\"polite\">\r\n <cfc-icon [iconName]=\"'exclamation-triangle'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n {{ group.groupAlertMessage }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <p class=\"group-description\">{{ group.groupText }}</p>\r\n\r\n <div class=\"br-list cookie-info\" *ngIf=\"isGroupExpanded(group.groupId)\">\r\n <div class=\"br-item\">\r\n <div class=\"br-card\" *ngFor=\"let cookie of group.cookieList; let cookieIndex = index\">\r\n <div class=\"card-content\">\r\n <div class=\"cookie-alert\" *ngIf=\"cookie.alertMessage && !cookie.cookieSelected\">\r\n <span class=\"feedback warning\" role=\"alert\" aria-live=\"polite\">\r\n <cfc-icon [iconName]=\"'exclamation-triangle'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n {{ cookie.alertMessage }}\r\n </span>\r\n </div>\r\n <div class=\"cookie-row\" *ngIf=\"isCookieOptOut(cookie)\">\r\n <div class=\"br-switch small icon\">\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n [id]=\"'check-cookie-' + groupIndex + '-' + cookieIndex\"\r\n [checked]=\"cookie.cookieSelected\"\r\n (change)=\"onCookieSelectionChange(group.groupId, cookie.cookieId, $event)\">\r\n <label\r\n [for]=\"'check-cookie-' + groupIndex + '-' + cookieIndex\"\r\n [attr.aria-label]=\"cookie.cookieSelected ? onLabel : offLabel\">\r\n </label>\r\n <div class=\"switch-data\">{{ cookie.cookieSelected ? onLabel : offLabel }}</div>\r\n </div>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ cookieNameLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.cookieName }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ expiresLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.expires }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ domainLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.domain }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ enterpriseLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.entreprise }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ purposeLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.purpose }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ descriptionLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.description }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"cookieConfig.noteTitle && cookieConfig.noteList?.length\">\r\n <hr>\r\n <div class=\"br-item notes-header\" (click)=\"toggleNotes()\">\r\n <span class=\"group-name\">{{ cookieConfig.noteTitle }}</span>\r\n <button class=\"br-button circle small\" type=\"button\">\r\n <cfc-icon\r\n [iconName]=\"isNotesExpanded ? 'angle-up' : 'angle-down'\"\r\n [familyName]=\"'fas'\"\r\n [size]=\"'16px'\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n <div class=\"br-list notes\" *ngIf=\"isNotesExpanded\">\r\n <div class=\"br-item notes\" *ngFor=\"let note of cookieConfig.noteList\">\r\n <p>{{ note.question }}</p>\r\n <p>{{ note.answer }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"br-list complementary-content\" *ngIf=\"cookieConfig.links?.length\">\r\n <div class=\"br-item text-center\" *ngFor=\"let link of cookieConfig.links\">\r\n <a [href]=\"link.url\" [target]=\"link.target || '_blank'\" rel=\"noopener noreferrer\">\r\n {{ link.name }}\r\n <cfc-icon [iconName]=\"'external-link-alt'\" [familyName]=\"'fas'\" [size]=\"'12px'\"></cfc-icon>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"br-modal-footer actions justify-content-end\">\r\n <button class=\"br-button secondary small\" type=\"button\" (click)=\"toggleCookieBar()\">\r\n {{ secondaryButtonLabel }}\r\n </button>\r\n <button class=\"br-button primary small\" type=\"button\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".br-cookiebar{font-family:Rawline,Raleway,sans-serif;font-size:14px;line-height:1.45;color:#333}.br-cookiebar:focus{outline:none}.br-cookiebar.default .br-modal{position:fixed;bottom:0;left:0;width:100%;z-index:1000;background-color:#fff;border-top:1px solid #CCCCCC;box-shadow:0 -2px 10px #0000001a}.br-cookiebar.default .br-modal .br-card{max-width:1200px;margin:0 auto}.br-cookiebar.default .br-modal .container-fluid{padding:16px 24px}.br-cookiebar.default .br-modal .wrapper{display:flex;align-items:center}.br-cookiebar.default .br-modal .br-modal-body{flex:1;padding:0}.br-cookiebar.default .br-modal .br-modal-footer{display:flex;justify-content:flex-end;gap:16px;padding-top:16px;border-top:none}.br-cookiebar.open .br-modal{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1001;background-color:#00000073;display:flex;align-items:center;justify-content:center;padding:16px}.br-cookiebar.open .br-modal .br-card{width:100%;max-width:800px;max-height:calc(100vh - 32px);background-color:#fff;border-radius:8px;box-shadow:0 4px 16px #0003;display:flex;flex-direction:column}.br-cookiebar.open .br-modal .container-fluid{display:flex;flex-direction:column;flex:1;overflow:hidden;padding:0}.br-cookiebar.open .br-modal .wrapper{flex:1;overflow-y:auto;padding:24px}.br-cookiebar.open .br-modal .br-modal-footer{padding:16px 24px;border-top:1px solid #EDEDED;display:flex;justify-content:flex-end;gap:16px}.br-modal-header.entry-content{margin-bottom:16px}.br-modal-header .br-modal-title{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px}.br-modal-header .br-modal-title h1{margin:0;font-size:24px;font-weight:700;color:#333}.br-modal-header .last-update{font-size:12px;color:#888;margin:0 0 8px}.br-modal-header .last-update span{font-weight:600}.br-modal-header .entry-text{margin:0;font-size:14px;line-height:1.5;color:#333}.br-modal-body .info-text{margin:0 0 16px;font-size:14px;line-height:1.5;color:#333}.br-list.main-content{border:1px solid #EDEDED;border-radius:4px;overflow:hidden}.br-list .header{padding:16px;background-color:#f8f8f8;border-bottom:1px solid #EDEDED}.br-list .header .title{font-size:16px;font-weight:600;color:#333;margin-bottom:8px}.br-list .header .message{margin-top:8px}.br-list hr{margin:0;border:none;border-top:1px solid #EDEDED}.br-item{padding:16px;border-bottom:1px solid #EDEDED}.br-item:last-child{border-bottom:none}.br-item.group-info{cursor:pointer;transition:all .3s ease}.br-item.group-info:hover,.br-item.group-info.open{background-color:#f8f8f8}.br-item .group-header{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px}.br-item .group-header .group-name-section{display:flex;align-items:center;gap:2px;font-weight:600;color:#333}.br-item .group-header .group-name,.br-item .group-header .cookies-checked,.br-item .group-header .group-size{cursor:pointer}.br-item .group-header .group-actions{display:flex;align-items:center;gap:16px}.br-item .group-header .message{flex-basis:100%;margin-top:8px}.br-item .group-description{margin:8px 0 0;font-size:14px;color:#333;line-height:1.5}.br-item.notes-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer}.br-item.notes-header .group-name{font-weight:600;color:#333}.br-item.notes p{margin:0 0 8px}.br-item.notes p:last-child{margin-bottom:0}.br-item.text-center{text-align:center}.cookie-info{margin-top:16px}.cookie-info .br-card{border:1px solid #EDEDED;border-radius:4px;margin-bottom:16px;background-color:#fff}.cookie-info .br-card:last-child{margin-bottom:0}.cookie-info .card-content{padding:16px}.cookie-info .cookie-alert{margin-bottom:8px}.cookie-info .cookie-row{display:flex;gap:8px;margin-bottom:8px}.cookie-info .cookie-row:last-child{margin-bottom:0}.cookie-info .cookie-term{min-width:100px;font-weight:600;color:#333}.cookie-info .cookie-data{flex:1;color:#333}.br-checkbox{display:flex;align-items:center;gap:8px}.br-checkbox input[type=checkbox]{width:18px;height:18px;cursor:pointer;accent-color:#1351B4}.br-checkbox input[type=checkbox]:focus{outline:none;box-shadow:0 0 0 2px #1351b44d}.br-checkbox input[type=checkbox]:disabled{cursor:not-allowed;opacity:.6}.br-checkbox label{cursor:pointer;font-size:14px;color:#333}.br-checkbox label:hover{color:#1351b4}.br-switch{position:relative;display:inline-flex;align-items:center;gap:8px}.br-switch input[type=checkbox]{opacity:0;width:0;height:0}.br-switch input[type=checkbox]:checked+label{background-color:#1351b4}.br-switch input[type=checkbox]:checked+label:before{transform:translate(22px)}.br-switch input[type=checkbox]:focus+label{outline:none;box-shadow:0 0 0 2px #1351b44d}.br-switch label{position:relative;display:inline-block;width:46px;height:24px;background-color:#ccc;border-radius:24px;cursor:pointer;transition:.3s}.br-switch label:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}.br-switch .switch-data{font-size:14px;color:#333;font-weight:500}.br-button{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:8px 16px;border-radius:4px;border:1px solid transparent;cursor:pointer;font-weight:600;font-size:14px;text-align:center;transition:all .3s ease}.br-button:focus{outline:none;box-shadow:0 0 0 2px #1351b44d}.br-button:disabled{cursor:not-allowed;opacity:.6}.br-button.primary{background-color:#1351b4;color:#fff;border-color:#1351b4}.br-button.primary:hover{background-color:#0c326f;border-color:#0c326f}.br-button.secondary{background-color:transparent;color:#1351b4;border-color:#1351b4}.br-button.secondary:hover{background-color:#1351b41a}.br-button.small{padding:6px 12px;font-size:13px}.br-button.circle{width:32px;height:32px;padding:0;border-radius:50%;border:1px solid #CCCCCC;background-color:transparent;color:#888}.br-button.circle:hover{background-color:#f8f8f8;color:#1351b4;border-color:#1351b4}.br-button.close{color:#888}.br-button.close:hover{color:#db4800;border-color:#db4800}.br-button.block{width:100%}.feedback.warning{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px;border-radius:0 4px 4px 0}.feedback.warning cfc-icon{color:#a08000}.always-active{color:#168821;font-weight:600;font-size:14px}.complementary-content{margin-top:16px}.complementary-content .br-item{padding:8px 16px}.complementary-content a{display:inline-flex;align-items:center;gap:4px;color:#1351b4;text-decoration:none;font-weight:600}.complementary-content a:hover{text-decoration:underline}.complementary-content a cfc-icon{color:#1351b4}.justify-content-end{justify-content:flex-end}@media (max-width: 768px){.br-cookiebar.default .br-modal .container-fluid{padding:16px}.br-cookiebar.default .br-modal .br-modal-footer{flex-direction:column;width:100%}.br-cookiebar.default .br-modal .br-modal-footer .br-button{width:100%}.br-cookiebar.open .br-modal{padding:0;align-items:flex-end}.br-cookiebar.open .br-modal .br-card{max-height:100vh;border-radius:0}.br-cookiebar.open .br-modal .wrapper{padding:16px}.br-cookiebar.open .br-modal .br-modal-footer{flex-direction:column;padding:16px}.br-cookiebar.open .br-modal .br-modal-footer .br-button{width:100%}.br-item .group-header .group-actions{flex-basis:100%;justify-content:space-between}.cookie-info .cookie-row{flex-direction:column;gap:2px}.cookie-info .cookie-term{min-width:auto}}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IconComponent, selector: "cfc-icon", inputs: ["iconName", "familyName", "className", "size", "color"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookieBarComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-cookie-bar', template: "<div\r\n class=\"br-cookiebar\"\r\n [class.default]=\"!isOpen\"\r\n [class.open]=\"isOpen\"\r\n tabindex=\"1\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-describedby=\"info-t\"\r\n aria-label=\"Componente para defini\u00E7\u00E3o de Cookies\"\r\n *ngIf=\"cookieConfig\">\r\n\r\n <!-- Vis\u00E3o minimizada (barra) -->\r\n <div class=\"br-modal\" *ngIf=\"!isOpen\">\r\n <div class=\"br-card\">\r\n <div class=\"container-fluid\">\r\n <div class=\"wrapper\">\r\n <div id=\"info-t\" class=\"br-modal-body\">\r\n <p class=\"info-text\">{{ cookieConfig.infoText }}</p>\r\n </div>\r\n </div>\r\n <div class=\"br-modal-footer actions\">\r\n <button class=\"br-button secondary small\" type=\"button\" (click)=\"openDetailedView()\">\r\n {{ secondaryButtonLabel }}\r\n </button>\r\n <button class=\"br-button primary small\" type=\"button\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Vis\u00E3o expandida (modal) -->\r\n <div class=\"br-modal\" *ngIf=\"isOpen\">\r\n <div class=\"br-card\">\r\n <div class=\"container-fluid\">\r\n <div class=\"wrapper\">\r\n <div class=\"br-modal-header entry-content\">\r\n <div class=\"br-modal-title\">\r\n <h1>{{ cookieConfig.mainTitle }}</h1>\r\n <button\r\n class=\"br-button close circle small\"\r\n type=\"button\"\r\n (click)=\"toggleCookieBar()\"\r\n [attr.aria-label]=\"cookieConfig.closeLabel || 'fechar'\">\r\n <cfc-icon [iconName]=\"'times'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n </button>\r\n </div>\r\n <p class=\"last-update\" *ngIf=\"cookieConfig.lastUpdate\">\r\n {{ lastUpdateLabel }}: <span>{{ cookieConfig.lastUpdate }}</span>\r\n </p>\r\n <p class=\"entry-text\">{{ cookieConfig.entryText }}</p>\r\n </div>\r\n\r\n <div id=\"info-t\" class=\"br-modal-body\">\r\n <p class=\"info-text\">{{ cookieConfig.infoText }}</p>\r\n\r\n <div class=\"br-list main-content\">\r\n <div class=\"header\">\r\n <div class=\"title\">{{ cookieGroupsLabel }}</div>\r\n <div class=\"br-checkbox\" *ngIf=\"cookieConfig.allOptOut\">\r\n <input\r\n type=\"checkbox\"\r\n id=\"check-all\"\r\n [checked]=\"isSelectAllChecked()\"\r\n [indeterminate]=\"isSelectAllIndeterminate()\"\r\n (change)=\"onSelectAllChange($event)\">\r\n <label for=\"check-all\">{{ selectAllLabel }}</label>\r\n </div>\r\n <div class=\"message\" *ngIf=\"cookieConfig.allAlertMessage && !isSelectAllChecked()\">\r\n <span class=\"feedback warning\" role=\"alert\" aria-live=\"polite\">\r\n <cfc-icon [iconName]=\"'exclamation-triangle'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n {{ cookieConfig.allAlertMessage }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div\r\n class=\"br-item group-info\"\r\n *ngFor=\"let group of cookieConfig.cookieGroups; let groupIndex = index\"\r\n [class.open]=\"isGroupExpanded(group.groupId)\">\r\n <div class=\"group-header\" (click)=\"toggleGroup(group.groupId)\">\r\n <div class=\"group-name-section\">\r\n <span class=\"group-name\">{{ group.groupName }}</span>\r\n <span class=\"cookies-checked\">\r\n ({{ group.groupOptOut ? (getSelectedCookieCount(group) + ' de ') : '' }}\r\n </span>\r\n <span class=\"group-size\">{{ getGroupCookieCount(group) }})</span>\r\n </div>\r\n <div class=\"group-actions\">\r\n <div class=\"br-checkbox\" *ngIf=\"isGroupOptOut(group); else alwaysActive\">\r\n <input\r\n type=\"checkbox\"\r\n [id]=\"'check-group-' + groupIndex\"\r\n [checked]=\"isGroupChecked(group)\"\r\n [indeterminate]=\"isGroupIndeterminate(group)\"\r\n (change)=\"onGroupSelectionChange(group.groupId, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n [disabled]=\"!group.groupOptOut\">\r\n <label [for]=\"'check-group-' + groupIndex\" (click)=\"$event.stopPropagation()\">\r\n {{ getSelectGroupLabel(group) }}\r\n </label>\r\n </div>\r\n <ng-template #alwaysActive>\r\n <span class=\"always-active\">{{ alwaysActiveLabel }}</span>\r\n </ng-template>\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n [attr.aria-label]=\"(isGroupExpanded(group.groupId) ? 'Retrair' : 'Expandir') + ' grupo de Cookies ' + group.groupName\">\r\n <cfc-icon\r\n [iconName]=\"isGroupExpanded(group.groupId) ? 'angle-up' : 'angle-down'\"\r\n [familyName]=\"'fas'\"\r\n [size]=\"'16px'\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n <div class=\"message\" *ngIf=\"group.groupAlertMessage && !isGroupChecked(group)\">\r\n <span class=\"feedback warning\" role=\"alert\" aria-live=\"polite\">\r\n <cfc-icon [iconName]=\"'exclamation-triangle'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n {{ group.groupAlertMessage }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <p class=\"group-description\">{{ group.groupText }}</p>\r\n\r\n <div class=\"br-list cookie-info\" *ngIf=\"isGroupExpanded(group.groupId)\">\r\n <div class=\"br-item\">\r\n <div class=\"br-card\" *ngFor=\"let cookie of group.cookieList; let cookieIndex = index\">\r\n <div class=\"card-content\">\r\n <div class=\"cookie-alert\" *ngIf=\"cookie.alertMessage && !cookie.cookieSelected\">\r\n <span class=\"feedback warning\" role=\"alert\" aria-live=\"polite\">\r\n <cfc-icon [iconName]=\"'exclamation-triangle'\" [familyName]=\"'fas'\" [size]=\"'16px'\"></cfc-icon>\r\n {{ cookie.alertMessage }}\r\n </span>\r\n </div>\r\n <div class=\"cookie-row\" *ngIf=\"isCookieOptOut(cookie)\">\r\n <div class=\"br-switch small icon\">\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n [id]=\"'check-cookie-' + groupIndex + '-' + cookieIndex\"\r\n [checked]=\"cookie.cookieSelected\"\r\n (change)=\"onCookieSelectionChange(group.groupId, cookie.cookieId, $event)\">\r\n <label\r\n [for]=\"'check-cookie-' + groupIndex + '-' + cookieIndex\"\r\n [attr.aria-label]=\"cookie.cookieSelected ? onLabel : offLabel\">\r\n </label>\r\n <div class=\"switch-data\">{{ cookie.cookieSelected ? onLabel : offLabel }}</div>\r\n </div>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ cookieNameLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.cookieName }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ expiresLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.expires }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ domainLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.domain }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ enterpriseLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.entreprise }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ purposeLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.purpose }}</span>\r\n </div>\r\n <div class=\"cookie-row\">\r\n <span class=\"cookie-term\">{{ descriptionLabel }}</span>\r\n <span class=\"cookie-data\">{{ cookie.description }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"cookieConfig.noteTitle && cookieConfig.noteList?.length\">\r\n <hr>\r\n <div class=\"br-item notes-header\" (click)=\"toggleNotes()\">\r\n <span class=\"group-name\">{{ cookieConfig.noteTitle }}</span>\r\n <button class=\"br-button circle small\" type=\"button\">\r\n <cfc-icon\r\n [iconName]=\"isNotesExpanded ? 'angle-up' : 'angle-down'\"\r\n [familyName]=\"'fas'\"\r\n [size]=\"'16px'\">\r\n </cfc-icon>\r\n </button>\r\n </div>\r\n <div class=\"br-list notes\" *ngIf=\"isNotesExpanded\">\r\n <div class=\"br-item notes\" *ngFor=\"let note of cookieConfig.noteList\">\r\n <p>{{ note.question }}</p>\r\n <p>{{ note.answer }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"br-list complementary-content\" *ngIf=\"cookieConfig.links?.length\">\r\n <div class=\"br-item text-center\" *ngFor=\"let link of cookieConfig.links\">\r\n <a [href]=\"link.url\" [target]=\"link.target || '_blank'\" rel=\"noopener noreferrer\">\r\n {{ link.name }}\r\n <cfc-icon [iconName]=\"'external-link-alt'\" [familyName]=\"'fas'\" [size]=\"'12px'\"></cfc-icon>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"br-modal-footer actions justify-content-end\">\r\n <button class=\"br-button secondary small\" type=\"button\" (click)=\"toggleCookieBar()\">\r\n {{ secondaryButtonLabel }}\r\n </button>\r\n <button class=\"br-button primary small\" type=\"button\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".br-cookiebar{font-family:Rawline,Raleway,sans-serif;font-size:14px;line-height:1.45;color:#333}.br-cookiebar:focus{outline:none}.br-cookiebar.default .br-modal{position:fixed;bottom:0;left:0;width:100%;z-index:1000;background-color:#fff;border-top:1px solid #CCCCCC;box-shadow:0 -2px 10px #0000001a}.br-cookiebar.default .br-modal .br-card{max-width:1200px;margin:0 auto}.br-cookiebar.default .br-modal .container-fluid{padding:16px 24px}.br-cookiebar.default .br-modal .wrapper{display:flex;align-items:center}.br-cookiebar.default .br-modal .br-modal-body{flex:1;padding:0}.br-cookiebar.default .br-modal .br-modal-footer{display:flex;justify-content:flex-end;gap:16px;padding-top:16px;border-top:none}.br-cookiebar.open .br-modal{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1001;background-color:#00000073;display:flex;align-items:center;justify-content:center;padding:16px}.br-cookiebar.open .br-modal .br-card{width:100%;max-width:800px;max-height:calc(100vh - 32px);background-color:#fff;border-radius:8px;box-shadow:0 4px 16px #0003;display:flex;flex-direction:column}.br-cookiebar.open .br-modal .container-fluid{display:flex;flex-direction:column;flex:1;overflow:hidden;padding:0}.br-cookiebar.open .br-modal .wrapper{flex:1;overflow-y:auto;padding:24px}.br-cookiebar.open .br-modal .br-modal-footer{padding:16px 24px;border-top:1px solid #EDEDED;display:flex;justify-content:flex-end;gap:16px}.br-modal-header.entry-content{margin-bottom:16px}.br-modal-header .br-modal-title{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px}.br-modal-header .br-modal-title h1{margin:0;font-size:24px;font-weight:700;color:#333}.br-modal-header .last-update{font-size:12px;color:#888;margin:0 0 8px}.br-modal-header .last-update span{font-weight:600}.br-modal-header .entry-text{margin:0;font-size:14px;line-height:1.5;color:#333}.br-modal-body .info-text{margin:0 0 16px;font-size:14px;line-height:1.5;color:#333}.br-list.main-content{border:1px solid #EDEDED;border-radius:4px;overflow:hidden}.br-list .header{padding:16px;background-color:#f8f8f8;border-bottom:1px solid #EDEDED}.br-list .header .title{font-size:16px;font-weight:600;color:#333;margin-bottom:8px}.br-list .header .message{margin-top:8px}.br-list hr{margin:0;border:none;border-top:1px solid #EDEDED}.br-item{padding:16px;border-bottom:1px solid #EDEDED}.br-item:last-child{border-bottom:none}.br-item.group-info{cursor:pointer;transition:all .3s ease}.br-item.group-info:hover,.br-item.group-info.open{background-color:#f8f8f8}.br-item .group-header{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px}.br-item .group-header .group-name-section{display:flex;align-items:center;gap:2px;font-weight:600;color:#333}.br-item .group-header .group-name,.br-item .group-header .cookies-checked,.br-item .group-header .group-size{cursor:pointer}.br-item .group-header .group-actions{display:flex;align-items:center;gap:16px}.br-item .group-header .message{flex-basis:100%;margin-top:8px}.br-item .group-description{margin:8px 0 0;font-size:14px;color:#333;line-height:1.5}.br-item.notes-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer}.br-item.notes-header .group-name{font-weight:600;color:#333}.br-item.notes p{margin:0 0 8px}.br-item.notes p:last-child{margin-bottom:0}.br-item.text-center{text-align:center}.cookie-info{margin-top:16px}.cookie-info .br-card{border:1px solid #EDEDED;border-radius:4px;margin-bottom:16px;background-color:#fff}.cookie-info .br-card:last-child{margin-bottom:0}.cookie-info .card-content{padding:16px}.cookie-info .cookie-alert{margin-bottom:8px}.cookie-info .cookie-row{display:flex;gap:8px;margin-bottom:8px}.cookie-info .cookie-row:last-child{margin-bottom:0}.cookie-info .cookie-term{min-width:100px;font-weight:600;color:#333}.cookie-info .cookie-data{flex:1;color:#333}.br-checkbox{display:flex;align-items:center;gap:8px}.br-checkbox input[type=checkbox]{width:18px;height:18px;cursor:pointer;accent-color:#1351B4}.br-checkbox input[type=checkbox]:focus{outline:none;box-shadow:0 0 0 2px #1351b44d}.br-checkbox input[type=checkbox]:disabled{cursor:not-allowed;opacity:.6}.br-checkbox label{cursor:pointer;font-size:14px;color:#333}.br-checkbox label:hover{color:#1351b4}.br-switch{position:relative;display:inline-flex;align-items:center;gap:8px}.br-switch input[type=checkbox]{opacity:0;width:0;height:0}.br-switch input[type=checkbox]:checked+label{background-color:#1351b4}.br-switch input[type=checkbox]:checked+label:before{transform:translate(22px)}.br-switch input[type=checkbox]:focus+label{outline:none;box-shadow:0 0 0 2px #1351b44d}.br-switch label{position:relative;display:inline-block;width:46px;height:24px;background-color:#ccc;border-radius:24px;cursor:pointer;transition:.3s}.br-switch label:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}.br-switch .switch-data{font-size:14px;color:#333;font-weight:500}.br-button{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:8px 16px;border-radius:4px;border:1px solid transparent;cursor:pointer;font-weight:600;font-size:14px;text-align:center;transition:all .3s ease}.br-button:focus{outline:none;box-shadow:0 0 0 2px #1351b44d}.br-button:disabled{cursor:not-allowed;opacity:.6}.br-button.primary{background-color:#1351b4;color:#fff;border-color:#1351b4}.br-button.primary:hover{background-color:#0c326f;border-color:#0c326f}.br-button.secondary{background-color:transparent;color:#1351b4;border-color:#1351b4}.br-button.secondary:hover{background-color:#1351b41a}.br-button.small{padding:6px 12px;font-size:13px}.br-button.circle{width:32px;height:32px;padding:0;border-radius:50%;border:1px solid #CCCCCC;background-color:transparent;color:#888}.br-button.circle:hover{background-color:#f8f8f8;color:#1351b4;border-color:#1351b4}.br-button.close{color:#888}.br-button.close:hover{color:#db4800;border-color:#db4800}.br-button.block{width:100%}.feedback.warning{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px;border-radius:0 4px 4px 0}.feedback.warning cfc-icon{color:#a08000}.always-active{color:#168821;font-weight:600;font-size:14px}.complementary-content{margin-top:16px}.complementary-content .br-item{padding:8px 16px}.complementary-content a{display:inline-flex;align-items:center;gap:4px;color:#1351b4;text-decoration:none;font-weight:600}.complementary-content a:hover{text-decoration:underline}.complementary-content a cfc-icon{color:#1351b4}.justify-content-end{justify-content:flex-end}@media (max-width: 768px){.br-cookiebar.default .br-modal .container-fluid{padding:16px}.br-cookiebar.default .br-modal .br-modal-footer{flex-direction:column;width:100%}.br-cookiebar.default .br-modal .br-modal-footer .br-button{width:100%}.br-cookiebar.open .br-modal{padding:0;align-items:flex-end}.br-cookiebar.open .br-modal .br-card{max-height:100vh;border-radius:0}.br-cookiebar.open .br-modal .wrapper{padding:16px}.br-cookiebar.open .br-modal .br-modal-footer{flex-direction:column;padding:16px}.br-cookiebar.open .br-modal .br-modal-footer .br-button{width:100%}.br-item .group-header .group-actions{flex-basis:100%;justify-content:space-between}.cookie-info .cookie-row{flex-direction:column;gap:2px}.cookie-info .cookie-term{min-width:auto}}\n"] }]
}], ctorParameters: () => [{ type: i1.CookieBarService }], propDecorators: { config: [{
type: Input
}], cookieSettingsChange: [{
type: Output
}], acceptCookies: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2Nvb2tpZS1iYXIvY29va2llLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2Nvb2tpZS1iYXIvY29va2llLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVcvRSxNQUFNLE9BQU8sa0JBQWtCO0lBZVQ7SUFkcEIsSUFBYSxNQUFNLENBQUMsS0FBYTtRQUMvQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVTLG9CQUFvQixHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBQzNELGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztJQUV2RCxZQUFZLENBQW1CO0lBQy9CLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixjQUFjLEdBQStCLEVBQUUsQ0FBQztJQUNoRCxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRS9CLFlBQW9CLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQUcsQ0FBQztJQUUxRCxRQUFRO1FBQ04seUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0RCxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksSUFBSSxTQUFTLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQVcsb0JBQW9CO1FBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxJQUFJLGlCQUFpQixDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLHlCQUF5QixDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLGVBQWUsSUFBSSxvQkFBb0IsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLGlCQUFpQixJQUFJLG9CQUFvQixDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDOUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxjQUFjLElBQUksaUJBQWlCLENBQUM7WUFDMUQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxLQUFrQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLElBQUksd0JBQXdCLENBQUM7WUFDdEUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxxQkFBcUIsSUFBSSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sSUFBSSxR