{"version":3,"file":"js/decidim_core.js","mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AACA;AAEA;AACA;AACA;;AAEA;AACA;AAAA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;;AACA;AAAA;;AACA;AACA;;AACA;;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;AACA;AAAA;;AACA;AACA;;AACA;;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AAAA;AACA;AACA;AACA;;AACA;;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AAAA;AACA;AACA;AACA;;AACA;;AACA;;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AAAA;;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;;AACA;AAJA;;AAOA;AACA;AACA;AACA;AArBA;;AAwBA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AACA;;AACA;AACA;AACA;AACA;;AACA;AAEA;AACA;;AACA;;AACA;AACA;AACA;AACA;AAFA;AAIA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;AAXA;;;AAeA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;AACA;AAAA;;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AATA;AADA;AAaA;AAEA;AACA;AACA;AACA;AACA;;;;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;;;AACA;AACA;;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AACA;;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AADA;AAGA;AADA;AAGA;AApBA;;;AAwBA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AADA;AAGA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE1SA;;AACA;;AAEA;AACA;AACA;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAGA;;AAGA;;;AAGA;;;;;;;;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAHA;AAKA;AACA;;AAEA;AACA;AACA;AAXA;AAaA;AArBA;;;;;;;;;;;;;;ACJA;AAEA;AACA;AACA;AAFA;;;;;;;;;;ACFA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAGA;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AA5BA;;AA+BA;AACA;AACA;;AAEA;AACA;AAMA;AACA;AAAA;AAAA;AACA;AAFA;AAIA;AAfA;AAkBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AALA;AAFA;AAlDA;;;;;;;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AACA;AACA;AACA;AAJA;AAOA;;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AAEA;AACA;;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AARA;;;;;;;;;;;;;;ACNA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AACA;AAEA;AACA;AACA;;AACA;AACA;AACA;;AAEA;;AACA;AACA;AARA;;;AAYA;;AACA;AACA;AAdA;;;AAkBA;AACA;AACA;AAFA;AAIA;AACA;;AAEA;AACA;AACA;AAFA;;AAIA;AACA;AACA;AACA;AACA;AACA;AALA;AAOA;AACA;AACA;;AACA;;AAGA;;AACA;AACA;;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAHA;AAKA;AA3DA;;;AA+DA;;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AALA;AAOA;AACA;AACA;AAXA;AAeA;;;AACA;AACA;AAjFA;AADA;;;;;;;;;;;;;AClCA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAFA;AAIA;AATA;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAFA;AAIA;AANA;;AASA;AACA;AADA;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAVA;;;AAcA;AACA;AAGA;AACA;AACA;AACA;;AACA;;AACA;AACA;AADA;AAGA;AACA;AAbA;AAgBA;AA9BA;AADA;;;;;;;;;;ACrBA;AACA;AAEA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AA1BA;AA6BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AAdA;AAhCA;;;;;;;;;;;;;;;ACAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAPA;AAWA;AACA;AACA;AACA;;AACA;AACA;AACA;AADA;AADA;;;;;;;;;;;;;;;ACzBA;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AACA;AACA;AACA;;AAEA;;AACA;AACA;AACA;;AAEA;;AACA;AACA;AACA;;AAEA;AAhBA;AAkBA;AACA;AACA;AACA;AArBA;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChCA;AAEA;AAKA;AAGA;AAEA;AACA;AADA;AAGA;;AAEA;AAKA;AAAA;;AACA;AAEA;AACA;;;;AAEA;AAAA;;AACA;AAAA;AAAA;AACA;AACA;;AACA;AAAA;AAAA;AACA;AACA;;AACA;AAEA;AACA;AAFA;AAKA;AACA;;AAEA;AACA;;AACA;AACA;AACA;AACA;;AACA;AACA;;;AAEA;AACA;AAEA;AACA;;;AAEA;AACA;AACA;;;AAEA;AACA;AACA;;;AA/CA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBA;AACA;AACA;AACA;;AAEA;AACA;;AACA;AACA;AACA;;AAEA;AANA;;AASA;AACA;;AAEA;AACA;AAIA;AARA;;AAWA;AAEA;AACA;AAEA;AAIA;AAJA;;AAOA;AACA;AACA;AAEA;AACA;AADA;AAGA;AAjBA;AA3BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;AAEA;AACA;AACA;;AAEA;AACA;AAAA;;AACA;AACA;AACA;;;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AAGA;AACA;;AACA;AACA;AACA;;;AAEA;AAAA;;;AAEA;;AACA;AACA;AACA;AACA;AACA;AACA;AADA;AAGA;AACA;AALA;AAQA;AAdA;AAkBA;;;AACA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;;;AAEA;AACA;AACA;AAAA;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;AAEA;AAAA;;AACA;AACA;AACA;AACA;;AAEA;AACA;AADA;AAIA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAPA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AADA;AAGA;AACA;AACA;AACA;;;AAEA;AACA;AACA;;;AAEA;AACA;AACA;;;AAEA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;;AACA;AACA;;AAEA;;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;AC5IA;AACA;AACA;AADA;AADA;;;;;;;;;;;;;;ACAA;AAGA;;AACA;AACA;AACA;AACA;;AAEA;AACA;AADA;AALA;AASA;AACA;AACA;AACA;;AAEA;AACA;AADA;AALA;AAWA;AACA;AACA;AACA;AACA;;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AAPA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7BA;AACA;AADA;AAGA;;AAEA;AAKA;AAAA;;AAAA;;AACA;AAEA;AACA;AADA;AAGA;;;;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AAEA;AACA;AADA;AAGA;;;AAvCA;AACA;AACA;;;;;;AAHA;AA2CA;AACA;AACA;AADA;AAGA;AACA;AADA;AAJA;;;;;;;;;;;;;;;AChDA;AACA;AACA;AAFA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AADA;AAGA;AACA;AACA;AAAA;AAAA;;AACA;AACA;AADA;AAGA;AACA;AAPA;AAUA;AACA;AACA;;AACA;AACA;AADA;AAGA;AACA;;AAEA;AACA;;AACA;AAEA;AACA;;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;AAIA;AACA;AAEA;AACA;AACA;AACA;AAFA;AADA;AAMA;AAdA;AAkBA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;;AAEA;AACA;AADA;AAGA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AACA;AACA;AAdA;AARA;AAFA;AAFA;AADA;;;;;;;;;;;;;;AC3BA;AAEA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAPA;;AAWA;AACA;AACA;AAFA;AAIA;AAnBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AADA;AAKA;AACA;;AACA;AACA;AACA;AAFA;AAIA;AAJA;AAOA;AAEA;AAGA;;AACA;AACA;AADA;AAIA;AAEA;AACA;AADA;AAIA;AACA;AACA;AAFA;;AAMA;AACA;AACA;AACA;AACA;AAJA;AAOA;AACA;AAEA;AAHA;AAMA;AAEA;AAEA;AA1DA;;;;;;;;;;AC5BA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AAIA;AACA;AACA;AACA;AACA;AAHA;AAKA;AAXA;AAgBA;AACA;AACA;AACA;AACA;AACA;AAHA;AAKA;AACA;AA9BA;AALA;;;;;;;;;;;;;;;;ACAA;;AAGA;AACA;;AAEA;AACA;AAAA;;AACA;AACA;AACA;AACA;AAHA;AAOA;;AACA;;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;;AACA;AAAA;AAAA;;AAEA;AACA;AADA;;AAIA;AAEA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AAPA;AAWA;AAAA;AACA;AAEA;AACA;AAJA;AAjDA;AAwDA;AACA;AAAA;;;;;;;;;;;;;;AChEA;AACA;;AAEA;AACA;;AACA;AACA;AACA;;AAEA;;AACA;AACA;AADA;AAGA;AACA;AAXA;;AAcA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAPA;;AAUA;;AACA;AACA;AAAA;AAAA;AAtBA;AA0BA;AACA;;AACA;;AACA;;AACA;;;AACA;AAAA;;AACA;AACA;AAAA;AAAA;AAAA;;AACA;AACA;AACA;AAAA;AAAA;AAHA;AAFA;AASA;;AACA;;;AACA;AACA;AACA;AACA;AADA;AAGA;AACA;AAAA;AAAA;AAEA;AACA;AAHA;AAKA;AALA;AAOA;AACA;AACA;AACA;;AAGA;;AAEA;AAfA;AANA;;AA0BA;;AACA;;AACA;;;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AADA;AAGA;AACA;AACA;AACA;AACA;AACA;AAAA;AAXA;AAYA;AACA;;AACA;AACA;AACA;;AACA;AACA;AANA;;;AASA;;AAUA;AACA;AACA;AArBA;;;AAyBA;AACA;AADA;AAIA;;AAEA;AA3CA;AA6CA;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AAOA;AA9DA;;AAiEA;AACA;;AAGA;AACA;AACA;AAFA;AAIA;AACA;;AAEA;AACA;AACA;AALA;AAOA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AAPA;AASA;AACA;AAbA;AAfA;;AAgCA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AALA;;AAQA;AACA;;AACA;AACA;AACA;AACA;AALA;AAVA;;;AAoBA;AACA;AACA;AA9LA;;;AAkMA;AACA;AACA;AApMA;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAAA;AAAA;;AACA;AACA;AACA;AACA;AACA;AAJA;;AAOA;AACA;AACA;AACA;AACA;AAFA;AAFA;AAQA;AACA;AACA;AACA;AACA;AACA;AAJA;AADA;AASA;AAjCA;;;;;;;;;;ACAA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AADA;AAGA;AACA;AAXA;AAJA;;;;;;;;;;ACAA;AACA;AAEA;AACA;AACA;;AACA;AACA;AACA;AACA;AANA;AAHA;;;;;;;;;;;;;ACAA;;AAEA;AACA;AACA;AAEA;AAEA;AALA;AAQA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AAEA;AAZA;AATA;;AAyBA;AACA;AACA;AACA;AACA;AACA;AAJA;AAMA;AACA;AACA;AACA;AACA;AAJA;AAPA;;;;;;;;;;AC3BA;AAEA;AACA;AACA;AACA;;AAEA;;AACA;AACA;AACA;;AACA;AAEA;AACA;AAZA;;;;;;;;;;ACFA;AACA;AAAA;AAGA;;AACA;AACA;AAEA;AACA;AADA;AAGA;AAXA;;;;;;;;;;ACAA;AAEA;AAEA;AACA;AAEA;AAEA;AAEA;AAFA;AAKA;AALA;AAJA;AAHA;;;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AADA;AAGA;AACA;AALA;;AAQA;AACA;AACA;AACA;AACA;AAJA;;AAOA;AAEA;AACA;AAEA;AAHA;AAMA;AACA;;AACA;AACA;AACA;AACA;AACA;AACA;AAPA;AAUA;AACA;AADA;AAzCA;;;;;;;;;;;;;;;;;;;ACAA;;AAEA;AACA;;;AACA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;;;;;ACJA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;AAZA;AAeA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AACA;AACA;AACA;;AAEA;AACA;AACA;;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AAAA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AAHA;AAKA;;AAEA;AAAA;AACA;AACA;;AACA;AACA;AACA;AAJA;;AAOA;AACA;;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;;AACA;AAAA;AACA;AACA;AACA;AACA;;AACA;AAAA;AACA;;AACA;;AACA;AACA;AACA;;AACA;AAAA;AACA;AACA;AACA;AACA;AApBA;AADA;;AAuBA;AA1BA;;AA6BA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AACA;AACA;;AACA;AAAA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AAjHA;;AAmHA;AACA;AA1JA;;;;;;;;;;AClBA;AACA;AAEA;AACA;;;;;;;;;;;;ACJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACNA;AACA;AACA;AACA;AACA;;;;;ACJA;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AElDA;AACA;AACA;AACA;AACA","sources":["webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/ sync ^\\.\\/.*$","webpack://decidim_sannicolas/./app/packs/images/ sync ^\\.\\/.*$","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-comments-0.26.2/app/packs/src/decidim/comments/comments.component.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-comments-0.26.2/app/packs/src/decidim/comments/comments.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/entrypoints/decidim_core.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/account_form.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/append_elements.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/append_redirect_url_to_modals.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/back_to_list.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/callout.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/clipboard.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/conferences.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/conversations.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/dialog_mode.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/diff_mode_dropdown.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/dropdowns_menus.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/external_domain_warning.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/external_link.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/floating_help.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/focus_guard.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/form_attachments.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/form_remote.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/form_validator.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/icon.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/identity_selector_dialog.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/impersonation.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/index.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/input_autojump.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/input_emoji.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/input_multiple_mentions.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/notifications.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/represent_user_group.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/responsive_horizontal_tabs.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/results_listing.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/security/selfxss_warning.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/start_conversation_dialog.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/tooltip_keep_on_hover.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/user_registrations.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/vendor/modernizr.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/src/decidim/vendor/social-share-button.js","webpack://decidim_sannicolas/./app/packs/src/decidim/decidim_application.js","webpack://decidim_sannicolas/../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/entrypoints/decidim_core.scss?25a4","webpack://decidim_sannicolas/webpack/bootstrap","webpack://decidim_sannicolas/webpack/runtime/chunk loaded","webpack://decidim_sannicolas/webpack/runtime/compat get default export","webpack://decidim_sannicolas/webpack/runtime/define property getters","webpack://decidim_sannicolas/webpack/runtime/global","webpack://decidim_sannicolas/webpack/runtime/hasOwnProperty shorthand","webpack://decidim_sannicolas/webpack/runtime/make namespace object","webpack://decidim_sannicolas/webpack/runtime/node module decorator","webpack://decidim_sannicolas/webpack/runtime/publicPath","webpack://decidim_sannicolas/webpack/runtime/jsonp chunk loading","webpack://decidim_sannicolas/webpack/before-startup","webpack://decidim_sannicolas/webpack/startup","webpack://decidim_sannicolas/webpack/after-startup"],"sourcesContent":["var map = {\n\t\"./decidim/avatar-multiuser.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/avatar-multiuser.png\",\n\t\"./decidim/brands/google.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/brands/google.svg\",\n\t\"./decidim/cc-badge.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/cc-badge.png\",\n\t\"./decidim/decidim-logo.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/decidim-logo.svg\",\n\t\"./decidim/default-avatar.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/default-avatar.svg\",\n\t\"./decidim/gamification/badges/decidim_gamification_badges_followers.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_followers.svg\",\n\t\"./decidim/gamification/badges/decidim_gamification_badges_invitations.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_invitations.svg\",\n\t\"./decidim/icons.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/icons.svg\",\n\t\"./decidim/pattern.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/pattern.png\",\n\t\"./decidim/placeholder.jpg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/placeholder.jpg\",\n\t\"./decidim/vendor/leaflet/layers-2x.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/leaflet/layers-2x.png\",\n\t\"./decidim/vendor/leaflet/layers.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/leaflet/layers.png\",\n\t\"./decidim/vendor/leaflet/marker-icon-2x.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png\",\n\t\"./decidim/vendor/leaflet/marker-icon.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/leaflet/marker-icon.png\",\n\t\"./decidim/vendor/leaflet/marker-shadow.png\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/leaflet/marker-shadow.png\",\n\t\"./decidim/vendor/social-share-button/delicious.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/delicious.svg\",\n\t\"./decidim/vendor/social-share-button/douban.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/douban.svg\",\n\t\"./decidim/vendor/social-share-button/email.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/email.svg\",\n\t\"./decidim/vendor/social-share-button/facebook.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/facebook.svg\",\n\t\"./decidim/vendor/social-share-button/google_bookmark.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/google_bookmark.svg\",\n\t\"./decidim/vendor/social-share-button/google_plus.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/google_plus.svg\",\n\t\"./decidim/vendor/social-share-button/hacker_news.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/hacker_news.svg\",\n\t\"./decidim/vendor/social-share-button/linkedin.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/linkedin.svg\",\n\t\"./decidim/vendor/social-share-button/odnoklassniki.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/odnoklassniki.svg\",\n\t\"./decidim/vendor/social-share-button/pinterest.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/pinterest.svg\",\n\t\"./decidim/vendor/social-share-button/qq.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/qq.svg\",\n\t\"./decidim/vendor/social-share-button/reddit.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/reddit.svg\",\n\t\"./decidim/vendor/social-share-button/telegram.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/telegram.svg\",\n\t\"./decidim/vendor/social-share-button/tumblr.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/tumblr.svg\",\n\t\"./decidim/vendor/social-share-button/twitter.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/twitter.svg\",\n\t\"./decidim/vendor/social-share-button/vkontakte.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/vkontakte.svg\",\n\t\"./decidim/vendor/social-share-button/wechat.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/wechat.svg\",\n\t\"./decidim/vendor/social-share-button/weibo.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/weibo.svg\",\n\t\"./decidim/vendor/social-share-button/whatsapp.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/whatsapp.svg\",\n\t\"./decidim/vendor/social-share-button/xing.svg\": \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images/decidim/vendor/social-share-button/xing.svg\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"../.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/decidim-core-0.26.2/app/packs/images sync recursive ^\\\\.\\\\/.*$\";","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = \"./app/packs/images sync recursive ^\\\\.\\\\/.*$\";\nmodule.exports = webpackEmptyContext;","/* eslint id-length: [\"error\", { \"exceptions\": [\"$\"] }] */\n\n/**\n * A plain Javascript component that handles the comments.\n *\n * @class\n * @augments Component\n */\n\n// This is necessary for testing purposes\nconst $ = window.$;\n\nimport { createCharacterCounter } from \"src/decidim/input_character_counter\"\nimport ExternalLink from \"src/decidim/external_link\"\nimport updateExternalDomainLinks from \"src/decidim/external_domain_warning\"\n\nexport default class CommentsComponent {\n constructor($element, config) {\n this.$element = $element;\n this.commentableGid = config.commentableGid;\n this.commentsUrl = config.commentsUrl;\n this.rootDepth = config.rootDepth;\n this.order = config.order;\n this.lastCommentId = config.lastCommentId;\n this.pollingInterval = config.pollingInterval || 15000;\n this.id = this.$element.attr(\"id\") || this._getUID();\n this.mounted = false;\n }\n\n /**\n * Handles the logic for mounting the component\n * @public\n * @returns {Void} - Returns nothing\n */\n mountComponent() {\n if (this.$element.length > 0 && !this.mounted) {\n this.mounted = true;\n this._initializeComments(this.$element);\n\n $(\".order-by__dropdown .is-submenu-item a\", this.$element).on(\"click.decidim-comments\", () => this._onInitOrder());\n }\n }\n\n /**\n * Handles the logic for unmounting the component\n * @public\n * @returns {Void} - Returns nothing\n */\n unmountComponent() {\n if (this.mounted) {\n this.mounted = false;\n this._stopPolling();\n\n $(\".add-comment .opinion-toggle .button\", this.$element).off(\"click.decidim-comments\");\n $(\".add-comment textarea\", this.$element).off(\"input.decidim-comments\");\n $(\".order-by__dropdown .is-submenu-item a\", this.$element).off(\"click.decidim-comments\");\n $(\".add-comment form\", this.$element).off(\"submit.decidim-comments\");\n $(\".add-comment textarea\", this.$element).each((_i, el) => el.removeEventListener(\"emoji.added\", this._onTextInput));\n }\n }\n\n /**\n * Adds a new thread to the comments section.\n * @public\n * @param {String} threadHtml - The HTML content for the thread.\n * @param {Boolean} fromCurrentUser - A boolean indicating whether the user\n * herself was the author of the new thread. Defaults to false.\n * @returns {Void} - Returns nothing\n */\n addThread(threadHtml, fromCurrentUser = false) {\n const $parent = $(\".comments:first\", this.$element);\n const $comment = $(threadHtml);\n const $threads = $(\".comment-threads\", this.$element);\n this._addComment($threads, $comment);\n this._finalizeCommentCreation($parent, fromCurrentUser);\n }\n\n /**\n * Adds a new reply to an existing comment.\n * @public\n * @param {Number} commentId - The ID of the comment for which to add the\n * reply to.\n * @param {String} replyHtml - The HTML content for the reply.\n * @param {Boolean} fromCurrentUser - A boolean indicating whether the user\n * herself was the author of the new reply. Defaults to false.\n * @returns {Void} - Returns nothing\n */\n addReply(commentId, replyHtml, fromCurrentUser = false) {\n const $parent = $(`#comment_${commentId}`);\n const $comment = $(replyHtml);\n const $replies = $(`#comment-${commentId}-replies`);\n this._addComment($replies, $comment);\n $replies.siblings(\".comment__additionalreply\").removeClass(\"hide\");\n this._finalizeCommentCreation($parent, fromCurrentUser);\n }\n\n /**\n * Generates a unique identifier for the form.\n * @private\n * @returns {String} - Returns a unique identifier\n */\n _getUID() {\n return `comments-${new Date().setUTCMilliseconds()}-${Math.floor(Math.random() * 10000000)}`;\n }\n\n /**\n * Initializes the comments for the given parent element.\n * @private\n * @param {jQuery} $parent The parent element to initialize.\n * @returns {Void} - Returns nothing\n */\n _initializeComments($parent) {\n $(\".add-comment\", $parent).each((_i, el) => {\n const $add = $(el);\n const $form = $(\"form\", $add);\n const $opinionButtons = $(\".opinion-toggle .button\", $add);\n const $text = $(\"textarea\", $form);\n\n $opinionButtons.on(\"click.decidim-comments\", this._onToggleOpinion);\n $text.on(\"input.decidim-comments\", this._onTextInput);\n\n $(document).trigger(\"attach-mentions-element\", [$text.get(0)]);\n\n $form.on(\"submit.decidim-comments\", () => {\n const $submit = $(\"button[type='submit']\", $form);\n\n $submit.attr(\"disabled\", \"disabled\");\n this._stopPolling();\n });\n\n if ($text.length && $text.get(0) !== null) {\n // Attach event to the DOM node, instead of the jQuery object\n $text.get(0).addEventListener(\"emoji.added\", this._onTextInput);\n }\n });\n\n this._pollComments();\n }\n\n /**\n * Adds the given comment element to the given target element and\n * initializes it.\n * @private\n * @param {jQuery} $target - The target element to add the comment to.\n * @param {jQuery} $container - The comment container element to add.\n * @returns {Void} - Returns nothing\n */\n _addComment($target, $container) {\n let $comment = $(\".comment\", $container);\n if ($comment.length < 1) {\n // In case of a reply\n $comment = $container;\n }\n this.lastCommentId = parseInt($comment.data(\"comment-id\"), 10);\n\n $target.append($container);\n $container.foundation();\n this._initializeComments($container);\n createCharacterCounter($(\".add-comment textarea\", $container));\n $container.find('a[target=\"_blank\"]').each((_i, elem) => {\n const $link = $(elem);\n $link.data(\"external-link\", new ExternalLink($link));\n });\n updateExternalDomainLinks($container)\n }\n\n /**\n * Finalizes the new comment creation after the comment adding finishes\n * successfully.\n * @private\n * @param {jQuery} $parent - The parent comment element to finalize.\n * @param {Boolean} fromCurrentUser - A boolean indicating whether the user\n * herself was the author of the new comment.\n * @returns {Void} - Returns nothing\n */\n _finalizeCommentCreation($parent, fromCurrentUser) {\n if (fromCurrentUser) {\n const $add = $(\"> .add-comment\", $parent);\n const $text = $(\"textarea\", $add);\n const characterCounter = $text.data(\"remaining-characters-counter\");\n $text.val(\"\");\n if (characterCounter) {\n characterCounter.updateStatus();\n }\n if (!$add.parent().is(\".comments\")) {\n $add.addClass(\"hide\");\n }\n }\n\n // Restart the polling\n this._pollComments();\n }\n\n /**\n * Sets a timeout to poll new comments.\n * @private\n * @returns {Void} - Returns nothing\n */\n _pollComments() {\n this._stopPolling();\n\n this.pollTimeout = setTimeout(() => {\n Rails.ajax({\n url: this.commentsUrl,\n type: \"GET\",\n data: new URLSearchParams({\n \"commentable_gid\": this.commentableGid,\n \"root_depth\": this.rootDepth,\n \"order\": this.order,\n \"after\": this.lastCommentId\n }),\n success: this._pollComments()\n })\n }, this.pollingInterval);\n }\n\n /**\n * Stops polling for new comments.\n * @private\n * @returns {Void} - Returns nothing\n */\n _stopPolling() {\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n }\n }\n\n /**\n * Sets the loading comments element visible in the view.\n * @private\n * @returns {Void} - Returns nothing\n */\n _setLoading() {\n const $container = $(\"> .comments-container\", this.$element);\n $(\"> .comments\", $container).addClass(\"hide\");\n $(\"> .loading-comments\", $container).removeClass(\"hide\");\n }\n\n /**\n * Event listener for the ordering links.\n * @private\n * @returns {Void} - Returns nothing\n */\n _onInitOrder() {\n this._stopPolling();\n this._setLoading();\n }\n\n /**\n * Event listener for the opinion toggle buttons.\n * @private\n * @param {Event} ev - The event object.\n * @returns {Void} - Returns nothing\n */\n _onToggleOpinion(ev) {\n let $btn = $(ev.target);\n if (!$btn.is(\".button\")) {\n $btn = $btn.parents(\".button\");\n }\n\n const $add = $btn.closest(\".add-comment\");\n const $form = $(\"form\", $add);\n const $opinionButtons = $(\".opinion-toggle .button\", $add);\n const $selectedState = $(\".opinion-toggle .selected-state\", $add);\n const $alignment = $(\".alignment-input\", $form);\n\n $opinionButtons.removeClass(\"is-active\").attr(\"aria-pressed\", \"false\");\n $btn.addClass(\"is-active\").attr(\"aria-pressed\", \"true\");\n\n if ($btn.is(\".opinion-toggle--ok\")) {\n $alignment.val(1);\n } else if ($btn.is(\".opinion-toggle--meh\")) {\n $alignment.val(0);\n } else if ($btn.is(\".opinion-toggle--ko\")) {\n $alignment.val(-1);\n }\n\n // Announce the selected state for the screen reader\n $selectedState.text($btn.data(\"selected-label\"));\n }\n\n /**\n * Event listener for the comment field text input.\n * @private\n * @param {Event} ev - The event object.\n * @returns {Void} - Returns nothing\n */\n _onTextInput(ev) {\n const $text = $(ev.target);\n const $add = $text.closest(\".add-comment\");\n const $form = $(\"form\", $add);\n const $submit = $(\"button[type='submit']\", $form);\n\n if ($text.val().length > 0) {\n $submit.removeAttr(\"disabled\");\n } else {\n $submit.attr(\"disabled\", \"disabled\");\n }\n }\n}\n","import \"src/decidim/comments/comments.component\"\n","/* eslint no-unused-vars: 0 */\n/* eslint id-length: [\"error\", { \"exceptions\": [\"$\"] }] */\n\nimport $ from \"jquery\"\nimport Quill from \"quill\"\nimport Rails from \"@rails/ujs\"\n\nimport \"core-js/stable\";\nimport \"regenerator-runtime/runtime\";\nimport morphdom from \"morphdom\"\n// Export variable to make it available in .js.erb templates\nwindow.morphdom = morphdom\nimport \"src/decidim/vendor/foundation-datepicker\"\nimport \"src/decidim/foundation_datepicker_locales\"\nimport \"src/decidim/vendor/modernizr\"\nimport \"src/decidim/vendor/social-share-button\"\nimport \"social-share-button\"\n\nimport \"src/decidim/input_tags\"\nimport \"src/decidim/input_hashtags\"\nimport \"src/decidim/input_mentions\"\nimport \"src/decidim/input_multiple_mentions\"\nimport \"src/decidim/input_character_counter\"\nimport \"src/decidim/input_autojump\"\nimport \"src/decidim/index\"\nimport \"src/decidim/history\"\nimport \"src/decidim/callout\"\nimport \"src/decidim/clipboard\"\nimport \"src/decidim/append_elements\"\nimport \"src/decidim/user_registrations\"\nimport \"src/decidim/account_form\"\nimport \"src/decidim/data_picker\"\nimport \"src/decidim/dropdowns_menus\"\nimport \"src/decidim/append_redirect_url_to_modals\"\nimport \"src/decidim/form_attachments\"\nimport \"src/decidim/form_validator\"\nimport \"src/decidim/form_remote\"\nimport \"src/decidim/ajax_modals\"\nimport \"src/decidim/conferences\"\nimport \"src/decidim/tooltip_keep_on_hover\"\nimport \"src/decidim/diff_mode_dropdown\"\nimport \"src/decidim/conversations\"\nimport \"src/decidim/delayed\"\nimport \"src/decidim/icon\"\nimport \"src/decidim/vizzs\"\nimport \"src/decidim/responsive_horizontal_tabs\"\nimport \"src/decidim/security/selfxss_warning\"\nimport \"src/decidim/session_timeouter\"\nimport \"src/decidim/configuration\"\nimport \"src/decidim/floating_help\"\nimport \"src/decidim/confirm\"\nimport \"src/decidim/comments/comments\"\nimport \"src/decidim/results_listing\"\nimport \"src/decidim/represent_user_group\"\nimport \"src/decidim/impersonation\"\nimport \"src/decidim/start_conversation_dialog\"\nimport \"src/decidim/notifications\"\nimport \"src/decidim/identity_selector_dialog\"\nimport \"src/decidim/gallery\"\nimport \"src/decidim/back_to_list\"\n\n// CSS\nimport \"entrypoints/decidim_core.scss\"\n\n// Import from the Rails instance application\nimport \"src/decidim/decidim_application\"\n\n// Images\nrequire.context(\"../images\", true)\n\n// This needs to be loaded after confirm dialog to bind properly\nRails.start()\n\n","/**\n * Since the delete account has a modal to confirm it we need to copy the content of the\n * reason field to the hidden field in the form inside the modal.\n */\n$(() => {\n const $deleteAccountForm = $(\".delete-account\");\n const $deleteAccountModalForm = $(\".delete-account-modal\");\n\n if ($deleteAccountForm.length > 0) {\n const $openModalButton = $(\".open-modal-button\");\n const $modal = $(\"#deleteConfirm\");\n\n $openModalButton.on(\"click\", (event) => {\n try {\n const reasonValue = $deleteAccountForm.find(\"textarea#delete_account_delete_reason\").val();\n $deleteAccountModalForm.find(\"input#delete_account_delete_reason\").val(reasonValue);\n $modal.foundation(\"open\");\n } catch (error) {\n console.error(error); // eslint-disable-line no-console\n }\n\n event.preventDefault();\n event.stopPropagation();\n return false;\n });\n }\n});\n","import \"@zeitiger/appendaround\"\n\n$(() => {\n let $appendableElements = $(\".js-append\");\n $appendableElements.appendAround();\n})\n","/* eslint-disable multiline-ternary, no-ternary */\n\n/*\n *\n * This is used to make sure users are redirected to\n * the expected URL after sign in.\n *\n * When a button or link trigger a login modal we capture\n * the event and inject the URL where the user should\n * be redirected after sign in (the redirect_url param).\n *\n * The code is injected to any form or link in the modal\n * and when the modal is closed we remove the injected\n * code.\n *\n * In order for this to work the button or link must have\n * a data-open attribute with the ID of the modal to open\n * and a data-redirect-url attribute with the URL to redirect\n * the user. If any of this is missing no code will be\n * injected.\n *\n */\n$(() => {\n const removeUrlParameter = (url, parameter) => {\n const urlParts = url.split(\"?\");\n\n if (urlParts.length >= 2) {\n // Get first part, and remove from array\n const urlBase = urlParts.shift();\n\n // Join it back up\n const queryString = urlParts.join(\"?\");\n\n const prefix = `${encodeURIComponent(parameter)}=`;\n const parts = queryString.split(/[&;]/g);\n\n // Reverse iteration as may be destructive\n for (let index = parts.length - 1; index >= 0; index -= 1) {\n // Idiom for string.startsWith\n if (parts[index].lastIndexOf(prefix, 0) !== -1) {\n parts.splice(index, 1);\n }\n }\n\n if (parts.length === 0) {\n return urlBase;\n }\n\n return `${urlBase}?${parts.join(\"&\")}`;\n }\n\n return url;\n }\n\n $(document).on(\"click.zf.trigger\", (event) => {\n const target = `#${$(event.target).data(\"open\")}`;\n const redirectUrl = $(event.target).data(\"redirectUrl\");\n\n if (target && redirectUrl) {\n $(\"\").\n attr(\"id\", \"redirect_url\").\n attr(\"name\", \"redirect_url\").\n attr(\"value\", redirectUrl).\n appendTo(`${target} form`);\n\n $(`${target} a`).attr(\"href\", (index, href) => {\n const querystring = jQuery.param({\"redirect_url\": redirectUrl});\n return href + (href.match(/\\?/) ? \"&\" : \"?\") + querystring;\n });\n }\n });\n\n $(document).on(\"closed.zf.reveal\", (event) => {\n $(\"#redirect_url\", event.target).remove();\n $(\"a\", event.target).attr(\"href\", (index, href) => {\n if (href && href.indexOf(\"redirect_url\") !== -1) {\n return removeUrlParameter(href, \"redirect_url\");\n }\n\n return href;\n });\n });\n});\n","/**\n * Changes \"Back to list\" links to the one saved in sessionStorage API\n * To apply this to a link, at least one element must have the class \"js-back-to-list\".\n * For this to work it needs the filteredParams in SessionStorage, that's saved on FormFilterComponent.\n * @param {NodeList} links - Hyperlinks elements that point to the filters page that will use the fitererd params\n * @returns {void}\n */\nexport default function backToListLink(links) {\n\n if (!links) {\n return;\n }\n\n if (!window.sessionStorage) {\n return;\n }\n\n const filteredParams = JSON.parse(sessionStorage.getItem(\"filteredParams\")) || {};\n links.forEach((link) => {\n const href = link.getAttribute(\"href\");\n if (filteredParams[href]) {\n link.setAttribute(\"href\", filteredParams[href]);\n }\n });\n\n}\n","/**\n * Improves the accessibility of the callout messages for screen readers. Not\n * all screen readers would announce the callout alert contents after the page\n * reload without this.\n */\n\n$(() => {\n const $callout = $('.callout[role=\"alert\"]:first');\n if ($callout.length > 0) {\n setTimeout(() => {\n // The content insertion is to try to hint some of the screen readers\n // that the alert content has changed and needs to be announced.\n $callout.attr(\"tabindex\", \"0\").focus().html(`${$callout.html()} `);\n }, 500);\n }\n});\n","import select from \"select\";\n\n/**\n * This provides functionality to add clipboard copy functionality to buttons\n * on the page. The element to be copied from has to be defined for the button\n * using a `data` attribute and the target element has to be a form input.\n *\n * Usage:\n * 1. Create the button:\n * \n *\n * 2. Make sure the target element exists on the page:\n * \n *\n * Options through data attributes:\n * - `data-clipboard-copy` = The jQuery selector for the target input element\n * where text will be copied from.\n * - `data-clipboard-copy-label` = The label that will be shown in the button\n * after a succesful copy.\n * - `data-clipboard-copy-message` = The text that will be announced to screen\n * readers after a successful copy.\n */\n\n// How long the \"copied\" text is shown in the copy element after successful\n// copy.\nconst CLIPBOARD_COPY_TIMEOUT = 5000;\n\n$(() => {\n $(document).on(\"click\", \"[data-clipboard-copy]\", (ev) => {\n const $el = $(ev.target);\n if (!$el.data(\"clipboard-copy\") || $el.data(\"clipboard-copy\").length < 1) {\n return;\n }\n\n const $input = $($el.data(\"clipboard-copy\"));\n if ($input.length < 1 || !$input.is(\"input, textarea, select\")) {\n return;\n }\n\n // Get the available text to clipboard.\n const selectedText = select($input[0]);\n if (!selectedText || selectedText.length < 1) {\n return;\n }\n\n // Move the selected text to clipboard.\n const $temp = $(``).css({\n width: 1,\n height: 1\n });\n $el.after($temp);\n $temp.select();\n\n const copyDone = () => {\n $temp.remove();\n $el.focus();\n };\n try {\n // document.execCommand is deprecated but the Clipboard API is not\n // supported by IE (which unfortunately is still a thing).\n if (!document.execCommand(\"copy\")) {\n return;\n }\n } catch (err) {\n copyDone();\n return;\n }\n copyDone();\n\n // Change the label to indicate the copying was successful.\n const label = $el.data(\"clipboard-copy-label\");\n if (label) {\n let to = $el.data(\"clipboard-copy-label-timeout\");\n if (to) {\n clearTimeout(to);\n }\n\n if (!$el.data(\"clipboard-copy-label-original\")) {\n $el.data(\"clipboard-copy-label-original\", $el.html());\n }\n\n $el.html(label);\n to = setTimeout(() => {\n $el.html($el.data(\"clipboard-copy-label-original\"));\n $el.removeData(\"clipboard-copy-label-original\");\n $el.removeData(\"clipboard-copy-label-timeout\");\n }, CLIPBOARD_COPY_TIMEOUT);\n $el.data(\"clipboard-copy-label-timeout\", to)\n }\n\n // Alert the screen reader what just happened (the link was copied).\n let message = $el.data(\"clipboard-copy-message\");\n if (message) {\n let $msg = $el.data(\"clipboard-message-element\");\n if ($msg) {\n if ($msg.html() === message) {\n // Try to hint the screen reader to re-read the text in the message\n // element.\n message += \" \";\n }\n } else {\n $msg = $('
');\n $el.after($msg);\n $el.data(\"clipboard-message-element\", $msg);\n }\n\n // Add the non breaking space always to content to try to force the\n // screen reader to reannounce the added text.\n $msg.html(message);\n }\n });\n});\n","/* eslint-disable no-invalid-this */\n\nimport Foundation from \"foundation-sites\"\n\n$(() => {\n // True if small devices\n if (!Foundation.MediaQuery.atLeast(\"medium\")) {\n const $speaker = $(\".js-conference\")\n\n $speaker.hover(function () {\n const top = $(window).scrollTop() + ($(window).height() * 0.1)\n $(this).find(\".js-bio\").css(\"top\", top)\n })\n }\n});\n","/**\n * Scroll smoothly to the last message automatically when the page is fully loaded.\n * To apply this to a page, at least one element must have the class \"scroll-to-last-message\".\n * @returns {void}\n */\nconst scrollToLastMessage = function() {\n if ($(\".scroll-to-last-message\").length > 0) {\n window.scrollTo({\n top: $(\".conversation-chat:last-child\").offset().top,\n behavior: \"smooth\"\n });\n }\n}\n\n$(document).ready(() => {\n scrollToLastMessage();\n});\n","/**\n * A method to enable the dialog mode for the given dialog(s).\n *\n * This should be called when the dialog is opened. It implements two things for\n * the dialog:\n * 1. It places the focus to the title element making sure the screen reader\n * focuses in the correct position of the document. Otherwise some screen\n * readers continue reading outside of the document.\n * 2. Document \"tab guards\" that force the keyboard focus within the modal when\n * the user is using keyboard or keyboard emulating devices for browsing the\n * document.\n *\n * The \"tab guards\" are added at the top and bottom of the document to keep the\n * user's focus within the dialog if they accidentally or intentionally place\n * the focus outside of the document, e.g. in different window or in the browser\n * address bar. They guard the focus on both sides of the document returning\n * focus back to the first or last focusable element within the dialog.\n *\n * @param {jQuery} $dialogs The jQuery element(s) to apply the mode for.\n * @return {Void} Nothing\n */\nexport default ($dialogs) => {\n $dialogs.each((_i, dialog) => {\n const $dialog = $(dialog);\n\n const $container = $(\"body\");\n const $title = $(\".reveal__title:first\", $dialog);\n\n if ($title.length > 0) {\n // Focus on the title to make the screen reader to start reading the\n // content within the modal.\n $title.attr(\"tabindex\", $title.attr(\"tabindex\") || -1);\n $title.trigger(\"focus\");\n }\n\n // Once the final modal closes, disable the focus guarding\n $dialog.off(\"closed.zf.reveal.focusguard\").on(\"closed.zf.reveal.focusguard\", () => {\n $dialog.off(\"closed.zf.reveal.focusguard\");\n\n // After the last dialog is closed, the tab guards should be removed.\n // This is done when the focus guard is disabled. If there is still a\n // visible reveal item in the DOM, make that the currently \"guarded\"\n // element. Note that there may be multiple dialogs open on top of each\n // other at the same time.\n const $visibleReveal = $(\".reveal:visible:last\", $container);\n if ($visibleReveal.length > 0) {\n window.focusGuard.trap($visibleReveal[0]);\n } else {\n window.focusGuard.disable();\n }\n });\n\n window.focusGuard.trap(dialog);\n });\n};\n","$(() => {\n const $allDiffViews = $(\".row.diff_view\");\n\n $(document).on(\"click\", \".diff-view-by a.diff-view-mode\", (event) => {\n event.preventDefault();\n const $target = $(event.target)\n let type = \"escaped\";\n const $selected = $target.parents(\".is-dropdown-submenu-parent\").find(\"#diff-view-selected\");\n if ($selected.text().trim() === $target.text().trim()) {\n return;\n }\n\n $selected.text($target.text());\n\n if ($target.attr(\"id\") === \"diff-view-unified\") {\n if ($(\".row.diff_view_split_escaped\").hasClass(\"hide\")) {\n type = \"unescaped\";\n }\n\n $allDiffViews.addClass(\"hide\");\n $(`.row.diff_view_unified_${type}`).removeClass(\"hide\");\n }\n if ($target.attr(\"id\") === \"diff-view-split\") {\n if ($(\".row.diff_view_unified_escaped\").hasClass(\"hide\")) {\n type = \"unescaped\";\n }\n\n $allDiffViews.addClass(\"hide\");\n $(`.row.diff_view_split_${type}`).removeClass(\"hide\");\n }\n })\n\n $(document).on(\"click\", \".diff-view-by a.diff-view-html\", (event) => {\n event.preventDefault();\n const $target = $(event.target);\n $target.parents(\".is-dropdown-submenu-parent\").find(\"#diff-view-html-selected\").text($target.text());\n const $visibleDiffViewsId = $allDiffViews.not(\".hide\").first().attr(\"id\").split(\"_\").slice(1, -1).join(\"_\");\n const $visibleDiffViews = $allDiffViews.filter(`[id*=${$visibleDiffViewsId}]`)\n\n if ($target.attr(\"id\") === \"diff-view-escaped-html\") {\n $visibleDiffViews.filter(\"[id$=_unescaped]\").addClass(\"hide\");\n $visibleDiffViews.filter(\"[id$=_escaped]\").removeClass(\"hide\");\n }\n if ($target.attr(\"id\") === \"diff-view-unescaped-html\") {\n $visibleDiffViews.filter(\"[id$=_escaped]\").addClass(\"hide\");\n $visibleDiffViews.filter(\"[id$=_unescaped]\").removeClass(\"hide\");\n }\n })\n});\n","/* eslint-disable require-jsdoc */\n\n// This will apply some fixes for the Foundation dropdown menu element\n// according to W3C instructions at:\n// https://www.w3.org/TR/wai-aria-practices/examples/menu-button/menu-button-links.html\n//\n// NOTE:\n// This needs to run AFTER Foundation has been initialized because those\n// initializers will affect the drop down menu elements.\nexport default function fixDropdownMenus() {\n $(\"[data-dropdown-menu]\").each((_i, element) => {\n // This will break navigation on macOS VoiceOver app since it will let the\n // user to focus on the li element instead of the element where we\n // actually need the focus to be in.\n $(\"li.is-dropdown-submenu-parent\", element).removeAttr(\"aria-haspopup\").removeAttr(\"aria-label\");\n $(\"li.is-dropdown-submenu-parent > a:first\", element).removeAttr(\"aria-label\");\n // Foundation marks the wrong role for the submenu elements\n $(\"ul.is-dropdown-submenu\", element).attr(\"role\", \"menu\");\n })\n}\n\n// Ensure the first element is always focused when a dropdown is opened as\n// this would not always happen when using a screen reader. If this is not\n// done, the screen reader will stay quiet when the menu opens which can lead\n// to the blind user not understanding the menu has opened.\n$(() => {\n $(\"[data-dropdown-menu]\").on(\"show.zf.dropdownMenu\", (_i, element) => {\n $(\"li:first > a\", element).focus();\n });\n})\n","/* eslint-disable require-jsdoc */\n\nexport default function updateExternalDomainLinks($target) {\n const whitelist = window.Decidim.config.get(\"external_domain_whitelist\")\n\n if (window.location.pathname === \"/link\") {\n return;\n }\n\n $(\"a\", $target).filter((_i, link) => {\n const $link = $(link);\n if (!$link[0].hasAttribute(\"href\") || $link.parents(\".ql-editor\").length > 0) {\n return false;\n }\n\n const parts = $link.attr(\"href\").match(/^(([a-z]+):)?\\/\\/([^/:]+)(:[0-9]*)?(\\/.*)?$/) || null;\n if (!parts) {\n return false;\n }\n\n const domain = parts[3].replace(/^www\\./, \"\")\n if (whitelist.includes(domain)) {\n return false;\n }\n\n return true;\n }).each((_n, link) => {\n const $link = $(link);\n const externalHref = `/link?external_url=${encodeURIComponent($link.attr(\"href\"))}`;\n $link.attr(\"href\", externalHref)\n $link.attr(\"data-remote\", true)\n });\n}\n","import icon from \"src/decidim/icon\"\n\nconst EXCLUDE_CLASSES = [\n \"card--list__data__icon\",\n \"footer-social__icon\",\n \"logo-cityhall\"\n];\nconst EXCLUDE_ANCESTOR_CLASSES = [\n \"editor-container\"\n]\nconst EXCLUDE_REL = [\"license\", \"decidim\"];\n\nconst DEFAULT_MESSAGES = {\n externalLink: \"External link\"\n};\nlet MESSAGES = DEFAULT_MESSAGES;\n\nexport default class ExternalLink {\n static configureMessages(messages) {\n MESSAGES = $.extend(DEFAULT_MESSAGES, messages);\n }\n\n constructor(link) {\n this.$link = link;\n\n this.setup();\n }\n\n setup() {\n if (EXCLUDE_CLASSES.some((cls) => this.$link.hasClass(cls))) {\n return;\n }\n if (EXCLUDE_ANCESTOR_CLASSES.some((cls) => this.$link.parents().hasClass(cls))) {\n return;\n }\n if (\n EXCLUDE_REL.some((rel) => {\n const linkRels = `${this.$link.attr(\"rel\")}`.split(\" \");\n return linkRels.indexOf(rel) > -1;\n })\n ) {\n return;\n }\n\n this.$link.addClass(\"external-link-container\");\n let spacer = \" \";\n if (this.$link.text().trim().length < 1) {\n // Fixes image links extra space\n spacer = \"\";\n }\n this.$link.append(`${spacer}${this.generateElement()}`);\n }\n\n generateElement() {\n let content = `${this.generateIcon()}${this.generateScreenReaderLabel()}`;\n\n return `${content}`;\n }\n\n generateIcon() {\n return icon(\"external-link\");\n }\n\n generateScreenReaderLabel() {\n return `(${MESSAGES.externalLink})`;\n }\n}\n","$(function() {\n if (!window.localStorage) {\n return;\n }\n\n let getDismissedHelpers = () => {\n let serialized = localStorage.getItem(\"dismissedHelpers\");\n if (!serialized) {\n return [];\n }\n\n return serialized.split(\",\");\n };\n\n let addDismissedHelper = (id) => {\n let dismissedHelpers = getDismissedHelpers();\n\n if (!dismissedHelpers.includes(id)) {\n localStorage.setItem(\n \"dismissedHelpers\",\n [...dismissedHelpers, id].join(\",\")\n );\n }\n };\n\n let dismissedHelpers = getDismissedHelpers();\n\n $(\".floating-helper-container\").each((_index, elem) => {\n let id = $(elem).data(\"help-id\");\n\n $(\n \".floating-helper__trigger, .floating-helper__content-close\",\n elem\n ).on(\"click\", (ev) => {\n ev.preventDefault();\n });\n\n if (!dismissedHelpers.includes(id)) {\n $(\".floating-helper\", elem).foundation(\"toggle\");\n $(\".floating-helper__wrapper\", elem).foundation(\"toggle\");\n\n $(\".floating-helper\", elem).on(\"off.zf.toggler\", () => {\n addDismissedHelper(id);\n });\n }\n });\n});\n","import { Keyboard } from \"foundation-sites\"\n\nconst focusGuardClass = \"focusguard\";\nconst focusableNodes = [\"A\", \"IFRAME\", \"OBJECT\", \"EMBED\"];\nconst focusableDisableableNodes = [\"BUTTON\", \"INPUT\", \"TEXTAREA\", \"SELECT\"];\n\nexport default class FocusGuard {\n constructor(container) {\n this.container = container;\n this.guardedElement = null;\n }\n\n trap(element) {\n if (this.guardedElement) {\n Keyboard.releaseFocus($(this.guardedElement));\n }\n\n this.enable();\n this.guardedElement = element;\n\n // Call the release focus first so that we don't accidentally add the\n // keyboard trap twice. Note that the Foundation methods expect the elements\n // to be jQuery elements which is why we pass them through jQuery.\n Keyboard.releaseFocus($(element));\n Keyboard.trapFocus($(element));\n }\n\n enable() {\n // Check if the guards already exists due to some other dialog\n const guards = this.container.querySelectorAll(`:scope > .${focusGuardClass}`);\n if (guards.length > 0) {\n // Make sure the guards are the first and last element as there have\n // been changes in the DOM.\n guards.forEach((guard) => {\n if (guard.dataset.position === \"start\") {\n this.container.prepend(guard);\n } else {\n this.container.append(guard);\n }\n })\n\n return;\n }\n\n // Add guards at the start and end of the document and attach their focus\n // listeners\n const startGuard = this.createFocusGuard(\"start\");\n const endGuard = this.createFocusGuard(\"end\");\n\n this.container.prepend(startGuard);\n this.container.append(endGuard);\n\n startGuard.addEventListener(\"focus\", () => this.handleContainerFocus(startGuard));\n endGuard.addEventListener(\"focus\", () => this.handleContainerFocus(endGuard));\n }\n\n disable() {\n const guards = this.container.querySelectorAll(`:scope > .${focusGuardClass}`);\n guards.forEach((guard) => guard.remove());\n\n if (this.guardedElement) {\n // Note that the Foundation methods expect the elements to be jQuery\n // elements which is why we pass them through jQuery.\n Keyboard.releaseFocus($(this.guardedElement));\n this.guardedElement = null;\n }\n }\n\n createFocusGuard(position) {\n const guard = document.createElement(\"div\");\n guard.className = focusGuardClass;\n guard.dataset.position = position;\n guard.tabIndex = 0;\n guard.setAttribute(\"aria-hidden\", \"true\");\n\n return guard;\n };\n\n handleContainerFocus(guard) {\n if (!this.guardedElement) {\n guard.blur();\n return;\n }\n\n const visibleNodes = Array.from(this.guardedElement.querySelectorAll(\"*\")).filter((item) => {\n return this.isVisible(item);\n });\n\n let target = null;\n if (guard.dataset.position === \"start\") {\n // Focus at the start guard, so focus the first focusable element after that\n for (let ind = 0; ind < visibleNodes.length; ind += 1) {\n if (!this.isFocusGuard(visibleNodes[ind]) && this.isFocusable(visibleNodes[ind])) {\n target = visibleNodes[ind];\n break;\n }\n }\n } else {\n // Focus at the end guard, so focus the first focusable element after that\n for (let ind = visibleNodes.length - 1; ind >= 0; ind -= 1) {\n if (!this.isFocusGuard(visibleNodes[ind]) && this.isFocusable(visibleNodes[ind])) {\n target = visibleNodes[ind];\n break;\n }\n }\n }\n\n if (target) {\n target.focus();\n } else {\n // If no focusable element was found, blur the guard focus\n guard.blur();\n }\n };\n\n isVisible(element) {\n return element.offsetWidth > 0 || element.offsetHeight > 0;\n }\n\n isFocusGuard(element) {\n return element.classList.contains(focusGuardClass);\n }\n\n isFocusable(element) {\n if (focusableNodes.indexOf(element.nodeName) > -1) {\n return true;\n }\n if (focusableDisableableNodes.indexOf(element.nodeName) > -1 || element.getAttribute(\"contenteditable\")) {\n if (element.getAttribute(\"disabled\")) {\n return false;\n }\n return true;\n }\n\n const tabindex = parseInt(element.getAttribute(\"tabindex\"), 10);\n if (!isNaN(tabindex) && tabindex >= 0) {\n return true;\n }\n\n return false;\n }\n}\n","$(() => {\n $(\"form .attachments_container\").on(\"closed.zf.callout\", (event) => {\n $(event.target).remove();\n });\n});\n","import Rails from \"@rails/ujs\";\n\n// Make the remote form submit buttons disabled when the form is being\n// submitted to avoid multiple submits.\ndocument.addEventListener(\"ajax:beforeSend\", (ev) => {\n if (!ev.target.matches(\"form[data-remote]\")) {\n return;\n }\n\n ev.target.querySelectorAll(\"[type=submit]\").forEach((submit) => {\n submit.disabled = true;\n });\n});\ndocument.addEventListener(\"ajax:complete\", (ev) => {\n if (!ev.target.matches(\"form[data-remote]\")) {\n return;\n }\n\n ev.target.querySelectorAll(\"[type=submit]\").forEach((submit) => {\n submit.disabled = false;\n });\n});\n\n// The forms that are attached to Foundation Abide do not work properly with\n// Rails UJS Ajax forms that have the `data-remote` attribute attached to\n// them. The reason is that in case Foundation Abide sees the form as valid,\n// it will submit it normally bypassing the Rails UJS functionality.\n// The submit events happens through jQuery in Foundation Abide which is why\n// we need to bind the event with jQuery.\n$(document).on(\"submit\", \"form[data-remote][data-abide]\", (ev) => {\n ev.preventDefault();\n\n if (ev.target.querySelectorAll(\"[data-invalid]\").length > 0) {\n return;\n }\n\n Reflect.apply(Rails.handleRemote, ev.target, [ev]);\n});\n","const DEFAULT_MESSAGES = {\n correctErrors: \"There are errors on the form, please correct them.\"\n};\nlet MESSAGES = DEFAULT_MESSAGES;\n\nexport default class FormValidator {\n static configureMessages(messages) {\n MESSAGES = $.extend(DEFAULT_MESSAGES, messages);\n }\n\n constructor(form) {\n this.$form = form;\n\n this.$form.on(\"form-error.decidim\", () => {\n this.handleError();\n });\n }\n\n handleError() {\n this.announceFormError();\n\n $(\".is-invalid-input:first\", this.$form).focus();\n }\n\n /**\n * This announces immediately to the screen reader that there are errors on\n * the form that need to be fixed. Does not work on all screen readers but\n * works e.g. in Windows+Firefox+NVDA and macOS+Safari+VoiceOver\n * combinations.\n *\n * @returns {undefined}\n */\n announceFormError() {\n let $announce = $(\".sr-announce\", this.$form);\n if ($announce.length > 0) {\n $announce.remove();\n }\n $announce = $(\"\");\n $announce.attr(\"class\", \"sr-announce show-for-sr\");\n $announce.attr(\"aria-live\", \"assertive\");\n this.$form.prepend($announce);\n\n setTimeout(() => {\n $announce.text(MESSAGES.correctErrors);\n }, 100);\n }\n}\n\n$(() => {\n $(\"form\").each((_i, el) => {\n $(el).data(\"form-validator\", new FormValidator($(el)));\n });\n $(document).on(\"forminvalid.zf.abide\", function(_ev, form) {\n form.trigger(\"form-error.decidim\");\n })\n});\n","const DEFAULT_ATTRIBUTES = {\n role: \"img\",\n \"aria-hidden\": \"true\"\n};\n\n/**\n * Generates a Decidim icon element and returns it as a string.\n * @param {String} iconKey - the key of the icon to be generated\n * @param {Object} attributes - extra attributes to define for the icon SVG\n * @param {int} wait - number of milliseconds to wait before executing the function.\n * @private\n * @returns {Void} - Returns nothing.\n */\nexport default function icon(iconKey, attributes = {}) {\n const iconAttributes = $.extend(DEFAULT_ATTRIBUTES, attributes);\n const title = iconAttributes.title || iconAttributes.ariaLabel;\n Reflect.deleteProperty(iconAttributes, \"title\");\n\n const htmlAttributes = {\n \"class\": `icon icon--${iconKey}`\n };\n Object.keys(iconAttributes).forEach((key) => {\n // Convert the key to dash-format.\n const newKey = key.replace(/([A-Z])/g, (ucw) => `-${ucw[0].toLowerCase()}`);\n if (typeof htmlAttributes[key] === \"undefined\") {\n htmlAttributes[newKey] = iconAttributes[key];\n } else {\n htmlAttributes[newKey] = `${htmlAttributes[newKey]} ${iconAttributes[key]}`;\n }\n });\n\n const iconsPath = window.Decidim.config.get(\"icons_path\");\n const elHtml = ``;\n const $el = $(elHtml);\n if (title) {\n $el.prepend(`