PageSourceSearch

https://clm.tech/wp-content/plugins/clm-vendor-finder/vendor-finder.js

js clm.tech collected 2026-10-06 12:51:06 UTC 58,822 bytes, 1,025 lines download raw bytes

1
2/* ═══════════════════════════════════════════════════════
3   DATA — CLM Solutions Catalog
4   Source: https://clm.tech/en-solutions/
5═══════════════════════════════════════════════════════ */
6const SOLUTIONS = [
7  {
8    id:'adc', acronym:'ADC',
9    title:'Controladores de Entrega de Aplicações',
10    desc:'Melhore desempenho, segurança e eficiência de recursos além do balanceamento de carga básico — entregando funções de rede e segurança em escala.',
11    vendors:['F5','A10 Networks','NSFocus'],
12    challenges:['Desempenho de aplicações','Segurança web','Balanceamento de carga','Proteção contra DDoS']
13  },
14  {
15    id:'backup', acronym:'Backup',
16    title:'Backup e Recuperação',
17    desc:'Mantenha cópias seguras de dados críticos e restaure operações com mínima interrupção após ransomware, desastre ou crise prolongada.',
18    vendors:['Veeam','ExaGrid','HYCU'],
19    challenges:['Resiliência a ransomware','Continuidade de negócios','Recuperação de desastres','Proteção de dados']
20  },
21  {
22    id:'bas', acronym:'BAS',
23    title:'Simulação de Violação e Ataque',
24    desc:'Identifique proativamente vulnerabilidades e lacunas defensivas antes que adversários reais possam explorá-las.',
25    vendors:['Picus'],
26    challenges:['Security posture validation','Gestão de vulnerabilidades','Automação de red team']
27  },
28  {
29    id:'casb', acronym:'CASB',
30    title:'Agentes de Segurança de Acesso à Nuvem',
31    desc:'Posicione-se entre usuários e aplicações em nuvem para monitorar atividades, aplicar políticas de segurança e reduzir riscos.',
32    vendors:['Netskope','Skyhigh Security'],
33    challenges:['Segurança em nuvem','Visibilidade de SaaS','Shadow IT','Prevenção de perda de dados','Conformidade em nuvem']
34  },
35  {
36    id:'dspm', acronym:'DSPM',
37    title:'Gestão de Postura de Segurança de Dados',
38    desc:'Tenha uma visão clara de quão seguros são seus dados — da avaliação de riscos à aplicação de políticas de governança.',
39    vendors:['Netskope','Varonis'],
40    challenges:['Governança de dados','Avaliação de risco de dados','Descoberta de dados sensíveis','Exposição de dados na nuvem']
41  },
42  {
43    id:'devsecops', acronym:'DevSecOps',
44    title:'DevSecOps',
45    desc:'Integre segurança em cada fase do ciclo de vida do desenvolvimento de software sem comprometer velocidade ou agilidade.',
46    vendors:['Zimperium'],
47    challenges:['Mobile app security','Desenvolvimento seguro','Segurança no SDLC','CI/CD security']
48  },
49  {
50    id:'edr', acronym:'EDR',
51    title:'Endpoint Detection and Response',
52    desc:'Detecte ameaças emergentes, previna ataques, apoie investigação e remediação, e habilite caça proativa a ameaças além do EPP.',
53    vendors:['SentinelOne'],
54    challenges:['Advanced threat detection','Resposta a incidentes','Caça a ameaças','Ataques zero-day','Ransomware']
55  },
56  {
57    id:'epp', acronym:'EPP',
58    title:'Endpoint Protection Platform',
59    desc:'Primeira linha de defesa crítica — detecte e bloqueie ameaças maliciosas no nível do dispositivo usando indicadores de comprometimento.',
60    vendors:['SentinelOne'],
61    challenges:['Malware prevention','Segurança de endpoint','Proteção de dispositivos']
62  },
63  {
64    id:'iga', acronym:'IGA',
65    title:'Identity Governance and Administration',
66    desc:'Garanta que apenas indivíduos autorizados tenham acesso às informações certas no momento certo — fundamental para a segurança digital.',
67    vendors:['RSA','SailPoint','Delinea'],
68    challenges:['Governança de acesso','Compliance','Ciclo de vida de identidade','Privilégio mínimo','Audit']
69  },
70  {
71    id:'iam', acronym:'IAM',
72    title:'Identity Access Management',
73    desc:'Garanta que as pessoas certas tenham acesso autenticado aos recursos certos, no momento certo, suportando a postura de cibersegurança e conformidade.',
74    vendors:['Thales','F5','Delinea','RSA','Silverfort'],
75    challenges:['Segurança de identidade','Authentication','Controle de acesso','Zero Trust','Compliance']
76  },
77  {
78    id:'itdr', acronym:'ITDR',
79    title:'Identity Threat Detection and Response',
80    desc:'Proteja identidades digitais e dados sensíveis contra ameaças com capacidades focadas de detecção e resposta.',
81    vendors:['ProofPoint','Vectra','Delinea','SentinelOne','Varonis','Silverfort'],
82    challenges:['Ataques de identidade','Roubo de conta','Roubo de credenciais','Ameaças internas']
83  },
84  {
85    id:'hci', acronym:'HCI',
86    title:'Hyperconverged Infrastructure',
87    desc:'Sistema unificado definido por software combinando armazenamento, computação, rede e gerenciamento em uma única solução escalável.',
88    vendors:['Nutanix'],
89    challenges:['Data center modernization','Consolidação de infraestrutura','Nuvem híbrida','Infraestrutura VDI']
90  },
91  {
92    id:'iot', acronym:'IoT/OT',
93    title:'IoT / OT / IoMT Security',
94    desc:'Proteja redes de dispositivos físicos e industriais — de sensores IoT a sistemas OT que controlam equipamentos industriais e dispositivos de saúde.',
95    vendors:['Nozomi Networks','Forescout','Claroty','AppGate'],
96    challenges:['Segurança OT','Visibilidade IoT','Segurança industrial','Infraestrutura crítica','IoT na saúde']
97  },
98  {
99    id:'mfa', acronym:'MFA',
100    title:'Multi-Factor Authentication',
101    desc:'Adicione camadas extras de proteção para evitar acesso não autorizado mesmo quando senhas são comprometidas.',
102    vendors:['RSA','Delinea','Thales','Silverfort'],
103    challenges:['Segurança de autenticação','Prevenção de phishing','Acesso privilegiado','Zero Trust','Compliance']
104  },
105  {
106    id:'nac', acronym:'NAC',
107    title:'Controle de Acesso à Rede',
108    desc:'Aplique políticas para controlar o acesso à rede por dispositivos e usuários sem comprometer a produtividade.',
109    vendors:['Arista','Forescout'],
110    challenges:['Visibilidade de dispositivos','Segmentação de rede','Acesso Zero Trust','Segurança BYOD','Controle de IoT']
111  },
112  {
113    id:'ndr', acronym:'NDR',
114    title:'Detecção e Resposta de Rede',
115    desc:'Use análise comportamental e IA para detectar ameaças em redes de alta velocidade sem comprometer o desempenho.',
116    vendors:['Arista','Vectra','Hillstone Networks'],
117    challenges:['Visibilidade de rede','Movimentação lateral','Detecção de ameaças','Tráfego leste-oeste','SOC orientado por IA']
118  },
119  {
120    id:'npb', acronym:'NPB',
121    title:'Brokers de Pacotes de Rede',
122    desc:'Consolide monitoramento em tempo real, elimine pontos cegos e otimize ferramentas de segurança com dados de tráfego de rede de alta qualidade.',
123    vendors:['Arista','Gigamon'],
124    challenges:['Visibilidade de rede','Pontos cegos','Otimização de ferramentas','Monitoramento de tráfego','Tráfego criptografado']
125  },
126  {
127    id:'ngfw', acronym:'NGFW',
128    title:'Firewalls de Próxima Geração',
129    desc:'Evoluiu além dos firewalls tradicionais para entregar recursos poderosos de cibersegurança com controle significativamente maior e consciência de aplicações.',
130    vendors:['Arista','Hillstone Networks'],
131    challenges:['Segurança de perímetro','Controle de aplicações','Prevenção de ameaças','Segmentação de rede','Segurança leste-oeste']
132  },
133  {
134    id:'object', acronym:'S3',
135    title:'Object Storage (S3)',
136    desc:'Armazenamento distribuído escalável de alto desempenho entregando um único namespace e pool para acesso paralelo de dados de alta largura de banda.',
137    vendors:['Zadara','Veeam','Lenovo'],
138    challenges:['Armazenamento em nuvem','Dados não estruturados','Destino de backup','Armazenamento de arquivo','Otimização de custos']
139  },
140  {
141    id:'pam', acronym:'PAM',
142    title:'Privileged Access Management',
143    desc:'Garanta que funções críticas de administradores e usuários privilegiados não sejam comprometidas — normalmente parte de uma estratégia IAM mais ampla.',
144    vendors:['Delinea'],
145    challenges:['Privileged accounts','Segurança administrativa','Cofre de credenciais','Privilégio mínimo','Zero Trust']
146  },
147  {
148    id:'encryption', acronym:'DPE',
149    title:'Data Protection and Encryption',
150    desc:'Criptografe dados sensíveis em repouso, em trânsito ou ambos — garantindo que apenas usuários ou máquinas autorizados possam acessá-los.',
151    vendors:['Thales'],
152    challenges:['Data encryption','Gestão de chaves','Compliance','GDPR','Soberania de dados','HSM']
153  },
154  {
155    id:'rbi', acronym:'RBI',
156    title:'Remote Browser Isolation',
157    desc:'Separe a navegação do usuário de seu dispositivo executando conteúdo web em um servidor remoto — impedindo que código malicioso alcance os endpoints.',
158    vendors:['Parallels','ProofPoint','Skyhigh Security'],
159    challenges:['Segurança web','Exploits zero-day no browser','Segurança BYOD','Acesso de terceiros','Phishing']
160  },
161  {
162    id:'sase', acronym:'SASE',
163    title:'Borda de Serviço de Acesso Seguro',
164    desc:'Convirja SD-WAN e segurança de rede para identificar usuários e dispositivos, aplicar políticas e entregar acesso seguro com prioridade na nuvem.',
165    vendors:['Cato Networks','Netskope'],
166    challenges:['Força de trabalho remota','Conectividade de filiais','Zero Trust','Segurança cloud-first','Transformação de WAN']
167  },
168  {
169    id:'email', acronym:'SEG',
170    title:'Secure Email Gateways',
171    desc:'Proteja o vetor de ataque de maior risco — o e-mail — contra malware, phishing, anexos maliciosos e spam.',
172    vendors:['ProofPoint'],
173    challenges:['Phishing','Segurança de e-mail','BEC / Business email compromise','Entrega de malware','Entrega de ransomware']
174  },
175  {
176    id:'siem', acronym:'SIEM',
177    title:'Gestão de Informações e Eventos de Segurança',
178    desc:'Colete e analise dados de segurança em escala, gerando insights priorizados em tempo real e relatórios de conformidade para equipes de segurança.',
179    vendors:['SentinelOne','Aiuken'],
180    challenges:['Operações de SOC','Gestão de logs','Relatórios de conformidade','Correlação de ameaças','Fadiga de alertas']
181  },
182  {
183    id:'soar', acronym:'SOAR',
184    title:'Orquestração, Automação e Resposta de Segurança',
185    desc:'Responda a ameaças e incidentes com pouca ou nenhuma intervenção humana — liberando equipes para focar em tarefas de alto julgamento.',
186    vendors:['Aiuken'],
187    challenges:['SOC automation','Resposta a incidentes','Triagem de alertas','Automação de playbooks','Redução de MTTR']
188  },
189  {
190    id:'sse', acronym:'SSE',
191    title:'Security Service Edge',
192    desc:'Plataforma baseada em nuvem integrando SWG, ZTNA, CASB e FWaaS em um único serviço de segurança para organizações cloud-first.',
193    vendors:['Netskope','Skyhigh Security','Cato Networks'],
194    challenges:['Zero Trust','Segurança em nuvem','Acesso remoto','Proteção de SaaS','Estratégia SASE']
195  },
196  {
197    id:'sdn', acronym:'SDN',
198    title:'Software-Defined Networking',
199    desc:'Gerencie e controle redes por software para maior flexibilidade, automação e c
199ontrole centralizado.',
200    vendors:['Arista'],
201    challenges:['Network automation','Rede de data center','Agilidade de rede','Rede pronta para nuvem']
202  },
203  {
204    id:'sdwan', acronym:'SD-WAN',
205    title:'WAN Definida por Software',
206    desc:'Seleção dinâmica de caminho de aplicação baseada em políticas em conexões WAN — cada vez mais crítica à medida que serviços migram para a borda.',
207    vendors:['Arista','Cato Networks','Netskope','Hillstone Networks'],
208    challenges:['Conectividade de filiais','Otimização de WAN','Migração para nuvem','Substituição de MPLS','Resiliência de rede']
209  },
210  {
211    id:'token', acronym:'Token',
212    title:'Tokenization',
213    desc:'Substitua dados sensíveis por tokens — símbolos de identificação sem valor explorável ou informações confidenciais.',
214    vendors:['Thales'],
215    challenges:['PCI DSS compliance','Segurança de pagamentos','Mascaramento de dados','Proteção de dados sensíveis']
216  },
217  {
218    id:'uem', acronym:'UEM',
219    title:'Unified Endpoint Management',
220    desc:'Gerencie, monitore e proteja todos os dispositivos da organização — a evolução do MDM e EMM.',
221    vendors:['Hexnode'],
222    challenges:['Mobile device management','Política BYOD','Conformidade de dispositivos','Endpoints de trabalhadores remotos']
223  },
224  {
225    id:'ueba', acronym:'UEBA',
226    title:'Análise de Comportamento de Usuários e Entidades',
227    desc:'Construa perfis comportamentais de linha de base e sinalize atividades anômalas para descobrir ameaças internas e ataques ocultos.',
228    vendors:['Varonis','Skyhigh Security'],
229    challenges:['Ameaças internas','Anomalias comportamentais','Exfiltração de dados','Pontuação de risco do usuário']
230  },
231  {
232    id:'asv', acronym:'ASV',
233    title:'Automated Security Validation',
234    desc:'Valide continuamente controles de segurança por meio de validação de exposição, testes de penetração e verificação de conformidade.',
235    vendors:['Pentera'],
236    challenges:['Continuous security testing','Automação de pentest','Eficácia dos controles de segurança','Gestão de exposição']
237  },
238  {
239    id:'vdi', acronym:'VDI',
240    title:'Virtual Desktop Infrastructure',
241    desc:'Permita que usuários acessem remotamente sistemas corporativos de forma segura a partir de qualquer dispositivo.',
242    vendors:['Parallels','Dizzion'],
243    challenges:['Trabalho remoto','Desktops virtuais','Desktop como Serviço','BYOD','Acesso remoto seguro']
244  },
245  {
246    id:'waap', acronym:'WAAP',
247    title:'Proteção de Aplicações Web e APIs',
248    desc:'Proteja aplicações web e APIs de ataques cibernéticos — uma evolução do WAF tradicional com cobertura mais ampla.',
249    vendors:['F5','Akamai','Imperva','Thales'],
250    challenges:['Segurança de APIs','Ataques a aplicações web','Gestão de bots','Mitigação de DDoS','Segurança de aplicações']
251  },
252  {
253    id:'waf', acronym:'WAF',
254    title:'Web Application Firewall',
255    desc:'Proteja aplicações web de ataques de lógica de negócios, injeção SQL, XSS, fraude e outras ameaças web.',
256    vendors:['F5','Akamai','Hillstone Networks','Imperva','Thales'],
257    challenges:['Segurança de aplicações web','OWASP Top 10','Proteção de APIs','Prevenção de bots','Compliance']
258  },
259  {
260    id:'imperva-waf', acronym:'WAF+',
261    title:'Web Application Firewall (Thales | Imperva)',
262    desc:'WAF líder de mercado da Imperva, agora parte da Thales — protegendo aplicações e APIs contra OWASP Top 10, ataques de lógica de negócios, SQL injection, XSS, fraude e ameaças zero-day em ambientes cloud, on-premises e híbridos.',
263    vendors:['Thales'],
264    challenges:['Segurança de aplicações web','OWASP Top 10','Proteção de APIs','Segurança de aplicações em nuvem','WAF híbrido','Exploits zero-day']
265  },
266  {
267    id:'imperva-ddos', acronym:'DDoS',
268    title:'DDoS Protection (Thales | Imperva)',
269    desc:'Mitigação de DDoS da Imperva, agora sob a Thales — defesa contra ataques volumétricos para redes, aplicações e DNS com scrubbing contínuo e detecção em menos de um segundo em escala global.',
270    vendors:['Thales'],
271    challenges:['Mitigação de DDoS','Ataques volumétricos','Disponibilidade de aplicações','Proteção de DNS','Resiliência de rede']
272  },
273  {
274    id:'imperva-api', acronym:'APIS',
275    title:'API Security (Thales | Imperva)',
276    desc:'Descubra, monitore e proteja todos os endpoints de API — detectando abuso, vazamento de dados e APIs ocultas. Parte do portfólio de segurança de aplicações da Thales herdado da Imperva.',
277    vendors:['Thales'],
278    challenges:['Segurança de APIs','Descoberta de APIs','Vazamento de dados via API','APIs ocultas','Segurança de aplicações']
279  },
280  {
281    id:'imperva-bot', acronym:'ABP',
282    title:'Advanced Bot Protection (Thales | Imperva)',
283    desc:'Combata bots maliciosos, fraude online, credential stuffing e ataques de roubo de conta — protegendo aplicações web e mobile enquanto permite tráfego legítimo.',
284    vendors:['Thales'],
285    challenges:['Gestão de bots','Roubo de conta','Credential stuffing','Fraude online','Web scraping']
286  },
287  {
288    id:'imperva-dsf', acronym:'DSF',
289    title:'Data Security Fabric (Thales | Imperva)',
290    desc:'Imperva Data Security Fabric — segurança de dados unificada para dados estruturados e não estruturados, bancos de dados on-premises e em nuvem. Análise de risco, monitoramento de atividade e descoberta de dados sensíveis em escala.',
291    vendors:['Thales'],
292    challenges:['Data security','Monitoramento de atividade de banco de dados','Descoberta de dados sensíveis','Proteção de dados na nuvem','Conformidade de dados','Visibilidade de risco de dados']
293  },
294  {
295    id:'imperva-rasp', acronym:'RASP',
296    title:'Runtime Application Self-Protection (Thales | Imperva)',
297    desc:'RASP protege aplicações por dentro — detectando e bloqueando ataques em tempo real sem alterar o código-fonte, independentemente dos controles de perímetro de rede.',
298    vendors:['Thales'],
299    challenges:['Segurança de aplicações','Exploits zero-day','Cadeia de fornecimento de software segura','DevSecOps','Proteção em tempo de execução']
300  },
301  {
302    id:'halcyon', acronym:'ARP',
303    title:'Anti-Ransomware Platform',
304    desc:'A única plataforma criada especificamente para derrotar ransomware de ponta a ponta. Combina prevenção pré-execução com IA/ML, disrupção comportamental, técnicas de deception, captura de chaves de criptografia e recuperação automatizada.',
305    vendors:['Halcyon'],
306    challenges:['Resiliência a ransomware','Prevenção de ransomware','Recuperação de ransomware','Continuidade de negócios','Segurança de endpoint','Resiliência cibernética','Prevenção de extorsão de dados']
307  },
308  {
309    id:'lan', acronym:'LAN',
310    title:'Wired & Wireless LAN Access',
311    desc:'Acesso a rede de campus e filial cabeada e sem fio de alto desempenho e seguro, com gerenciamento unificado e aplicação de políticas.',
312    vendors:['Arista'],
313    challenges:['Rede de campus','Segurança Wi-Fi','Acesso à rede','Infraestrutura de filial']
314  },
315  {
316    id:'ztna', acronym:'ZTNA',
317    title:'Acesso à Rede Zero Trust',
318    vendors:['Netskope','Cato Networks','AppGate'],
319    challenges:['Zero Trust','Trabalho remoto','Acesso seguro','Privilégio mínimo','Microsegmentation'],
320    desc:'Perímetro definido por software e acesso centrado em identidade — usuários acessam apenas recursos autorizados, nunca a rede inteira.',
321  },
322  {
323    id:'cps', acronym:'CPS',
324    title:'Cyber-Physical Systems Protection',
325    vendors:['Claroty','Nozomi Networks','Forescout'],
326    challenges:['Segurança OT','Segurança IoT','Segurança industrial','Infraestrutura crítica','Visibilidade de ativos'],
327    desc:'Proteção abrangente para OT, IoT industrial e dispositivos médicos conectados — descoberta de ativos, gestão de exposição e detecção de ameaças. Líder no Gartner MQ 2026.',
328  },
329  {
330    id:'mft', acronym:'MFT',
331    title:'Managed File Transfer',
332    vendors:['Progress Software'],
333    challenges:['Compliance','Governança de dados','Compartilhamento seguro de arquivos','Trilhas de auditoria','Automation'],
334    desc:'Fluxos de transferência de arquivos seguros, automatizados e em conformidade com registro de auditoria completo — MOVEit, WhatsUp Gold, Flowmon NDR e Kemp LoadMaster ADC.',
335  },
336  {
337    id:'nspm', acronym:'NSPM',
338    title:'Network Security Policy Management',
339    vendors:['AlgoSec'],
340    challenges:['Firewall management','Compliance','Segmentação de rede','Gestão de mudanças','Zero Trust'],
341    desc:'Automatize o gerenciamento de políticas de firewall, visibilidade de conectividade de aplicações e relatórios de conformidade em ambientes híbridos e multi-cloud.',
342  },
343  {
344    id:'wanopt', acronym:'WAN',
345    title:'WAN Optimization & Observability',
346    vendors:['Riverbed'],
347    challenges:['WAN performance','Entrega de aplicações','Monitoramento de rede','Experiência digital','Trabalho híbrido'],
348    desc:'Otimização de WAN, SD-WAN e monitoramento de experiência digital para acelerar o desempenho de aplicações em empresas distribuídas.',
349  },
350];
351
352/* ── Vendor metadata ──────────────────────────────────── */
353const VENDORS = {
354  'A10 Networks':      { color:'#00843D', desc:'Controladores de entrega de aplicações, proteção DDoS e balanceamento de carga para data centers e nuvem.' },
355  'Aiuken':            { color:'#003087', desc:'Serviços gerenciados de SOC com SIEM, SOAR e inteligência de ameaças 24x7 para empresas da América Latina.' },
356  'Akamai':            { color:'#009BDE', desc:'Segurança em nuvem, CDN, WAF, proteção DDoS e WAAP em escala global.' },
357  'AlgoSec':           { color:'#E4002B', desc:'Gerenciamento de políticas de segurança de rede, automação de firewall e conectividade de aplicações.' },
358  'AppGate':           { color:'#003366', desc:'Acesso à Rede de Zero Trust (ZTNA) e Perímetro Definido por Software para ambientes híbridos e OT.' },
359  'Arista':            { color:'#56B7E6', desc:'Rede em nuvem — switching, roteamento, NDR, NAC, SDN e SD-WAN.' },
360  'Cato Networks':     { color:'#00BF6F', desc:'Plataforma SASE — SD-WAN, SSE e Zero Trust em um único serviço cloud-native.' },
361  'Claroty':           { color:'#004B87', desc:'Proteção de sistemas ciberfísicos (CPS) — visibilidade de ativos, gestão de exposição, proteção de rede e detecção de ameaças para OT, IoT e IoMT. Líder no Gartner MQ 2026.' },
362  'Delinea':           { color:'#E4002B', desc:'Gestão de acesso privilegiado (PAM) e segurança de identidade para ambientes corporativos.' },
363  'Dizzion':           { color:'#0057B8', desc:'Desktop como Serviço (DaaS) para trabalho remoto seguro em qualquer dispositivo.' },
364  'ExaGrid':           { color:'#E4002B', desc:'Armazenamento de backup em camadas com appliances de deduplicação e recuperação de ransomware.' },
365  'F5':                { color:'#e30000', desc:'Entrega de aplicações, segurança multi-cloud e soluções de segurança de APIs.' },
366  'Forescout':         { color:'#E31B23', desc:'Visibilidade de dispositivos e segmentação zero-trust para ambientes de TI, OT e IoT.' },
367  'Gigamon':           { color:'#E4002B', desc:'Pipeline de observabilidade profunda e visibilidade de rede para ferramentas de segurança e operações.' },
368  'Halcyon':           { color:'#FF6B00', desc:'Plataforma Anti-Ransomware criada especificamente — prevenção com IA/ML, disrupção comportamental, 
368captura de chaves de criptografia e recuperação rápida. Fortune Cyber 60 por três anos consecutivos.' },
369  'Hexnode':           { color:'#E4002B', desc:'Gerenciamento unificado de endpoints e dispositivos móveis (UEM/MDM) pela Mitsogo — iOS, Android, Windows, macOS.' },
370  'Hillstone Networks':{ color:'#E4002B', desc:'NGFW, NDR, WAF e SD-WAN para redes empresariais híbridas e de nível de operadora.' },
371  'HYCU':              { color:'#00A3E0', desc:'Backup e recuperação criados especificamente para cargas de trabalho cloud-native, SaaS e híbridas.' },
372  'Imperva':           { color:'#004990', desc:'WAF, mitigação de DDoS, segurança de APIs, proteção contra bots, RASP e data security fabric.' },
373  'Lenovo':            { color:'#E01E26', desc:'Servidores corporativos, storage (ThinkSystem) e infraestrutura HCI para data centers.' },
374  'Netskope':          { color:'#BF1B3E', desc:'Líder em SSE — SWG, CASB, ZTNA e DLP unificados em uma plataforma cloud-native.' },
375  'NSFocus':           { color:'#005BAC', desc:'Mitigação de DDoS, WAF e soluções de segurança de rede para operadoras e empresas.' },
376  'Nozomi Networks':   { color:'#0050A0', desc:'Segurança OT e IoT — visibilidade de ativos, detecção de ameaças e detecção de anomalias para ambientes industriais.' },
377  'Nutanix':           { color:'#024DA1', desc:'Infraestrutura hiperconvergente (HCI) e plataforma multi-cloud híbrida.' },
378  'Parallels':         { color:'#ED1C24', desc:'Infraestrutura de desktop virtual (VDI) e isolamento remoto de navegador (RBI).' },
379  'Pentera':           { color:'#0E1C4E', desc:'Validação automatizada de segurança e testes de penetração contínuos.' },
380  'Picus':             { color:'#E4002B', desc:'Simulação de violação e ataque (BAS) para validação contínua de controles de segurança.' },
381  'Progress Software': { color:'#5C2D91', desc:'Kemp LoadMaster ADC, Flowmon NDR, WhatsUp Gold monitoramento de rede e MOVEit transferência segura de arquivos.' },
382  'ProofPoint':        { color:'#002060', desc:'Segurança de e-mail, ameaças internas, isolamento remoto de navegador e inteligência de ameaças.' },
383  'Rimini Street':     { color:'#003087', desc:'Suporte independente de software empresarial e serviços gerenciados para Oracle, SAP e outras plataformas.' },
384  'Riverbed':          { color:'#00205B', desc:'Otimização de WAN, SD-WAN, gerenciamento de desempenho de rede e monitoramento de experiência digital.' },
385  'RSA':               { color:'#E60000', desc:'Garantia de identidade e acesso — MFA, IGA e autenticação baseada em risco.' },
386  'SailPoint':         { color:'#002A70', desc:'Governança e administração de identidades (IGA) em escala corporativa.' },
387  'SentinelOne':       { color:'#6E1FFF', desc:'EDR, EPP, SIEM, XDR e proteção de identidade contra ameaças com IA.' },
388  'Silverfort':        { color:'#1A237E', desc:'Proteção unificada de identidade e MFA adaptativo para todos os usuários e recursos — sem agente.' },
389  'Skyhigh Security':  { color:'#00A4E4', desc:'Plataforma SSE cloud-native com CASB, SWG, DLP e isolamento remoto de navegador.' },
390  'Thales':            { color:'#E4002B', desc:'Líder global em cibersegurança — criptografia de dados, HSM, gestão de chaves e tokenização.' },
391  'Varonis':           { color:'#003087', desc:'Segurança de dados, UEBA e DSPM para armazenamentos de dados on-premises e em nuvem.' },
392  'Vectra':            { color:'#003087', desc:'NDR e ITDR com IA para ambientes híbridos, multi-cloud e de identidade.' },
393  'Veeam':             { color:'#00B336', desc:'Proteção de dados moderna, backup, replicação e recuperação para qualquer nuvem.' },
394  'Viewtinet':         { color:'#0057A8', desc:'Visibilidade de rede, monitoramento de SD-WAN e soluções de gerenciamento de desempenho.' },
395  'Zadara':            { color:'#0057A8', desc:'Armazenamento empresarial cloud-native — block, file e object (S3) como serviço.' },
396  'Zimperium':         { color:'#6B4FBB', desc:'Defesa contra ameaças móveis (MTD) e segurança de aplicações móveis para apps corporativos.' },
397};
398
399/* ── All unique challenges ────────────────────────────── */
400const ALL_CHALLENGES = [...new Set(SOLUTIONS.flatMap(s => s.challenges))].sort();
401const ALL_VENDORS    = [...new Set(SOLUTIONS.flatMap(s => s.vendors))].sort();
402
403/* ── State ─────────────────────────────────────────────── */
404let activeVendors    = new Set();
405let activeChallenges = new Set();
406let sortMode         = 'alpha';
407
408/* ── Init ───────────────────────────────────────────────── */
409function init() {
410  // Build vendor chips
411  const vc = document.getElementById('vendor-chips');
412  vc.innerHTML = ALL_VENDORS.map(v => {
413    const color = VENDORS[v]?.color || '#575756';
414    return `<span class="f-chip" data-vendor="${v}"
415      onclick="toggleVendor('${v}',this)"
416      style="--vc:${color}">${v}</span>`;
417  }).join('');
418
419  // Build challenge list
420  const cl = document.getElementById('challenge-list');
421  cl.innerHTML = ALL_CHALLENGES.map(c =>
422    `<div class="c-chip" data-challenge="${c}" onclick="toggleChallenge('${c}',this)">
423      <span class="c-chip-dot"></span>
424      <span class="c-chip-text">${c}</span>
425    </div>`
426  ).join('');
427
428  applyFilters();
429}
430
431function toggleVendor(v, el) {
432  activeVendors.has(v) ? activeVendors.delete(v) : activeVendors.add(v);
433  el.classList.toggle('active');
434  applyFilters();
435}
436function toggleChallenge(c, el) {
437  activeChallenges.has(c) ? activeChallenges.delete(c) : activeChallenges.add(c);
438  el.classList.toggle('active');
439  applyFilters();
440}
441function clearVendors()    { activeVendors.clear();    document.querySelectorAll('.f-chip').forEach(e=>e.classList.remove('active'));    applyFilters(); }
442function clearChallenges() { activeChallenges.clear(); document.querySelectorAll('.c-chip').forEach(e=>e.classList.remove('active')); applyFilters(); }
443function setSort(mode, el) { sortMode=mode; document.querySelectorAll('.sort-btn').forEach(b=>b.classList.remove('active')); el.classList.add('active'); applyFilters(); }
444
445/* ── Filter & render ─────────────────────────────────── */
446function applyFilters() {
447  const q = document.getElementById('search-inp').value.toLowerCase();
448
449  let results = SOLUTIONS.filter(s => {
450    // Buscar filter
451    if (q) {
452      const hay = [s.title, s.acronym, s.desc, ...s.vendors, ...s.challenges].join(' ').toLowerCase();
453      if (!hay.includes(q)) return false;
454    }
455    // Vendor filter
456    if (activeVendors.size > 0) {
457      if (!s.vendors.some(v => activeVendors.has(v))) return false;
458    }
459    // Challenge filter
460    if (activeChallenges.size > 0) {
461      if (![...activeChallenges].some(c => s.challenges.includes(c))) return false;
462    }
463    return true;
464  });
465
466  // Score by challenge matches
467  results = results.map(s => ({
468    ...s,
469    matchScore: activeChallenges.size > 0
470      ? [...activeChallenges].filter(c => s.challenges.includes(c)).length
471      : 0
472  }));
473
474  // Sort
475  if (sortMode === 'alpha')   results.sort((a,b) => a.title.localeCompare(b.title));
476  if (sortMode === 'vendors') results.sort((a,b) => b.vendors.length - a.vendors.length);
477  if (sortMode === 'match')   results.sort((a,b) => b.matchScore - a.matchScore || a.title.localeCompare(b.title));
478
479  const grid = document.getElementById('cards-grid');
480  const count = document.getElementById('results-count');
481  count.innerHTML = `Showing <strong>${results.length}</strong> of ${SOLUTIONS.length} solutions`;
482
483  if (!results.length) {
484    grid.innerHTML = `<div class="empty">
485      <div class="empty-icon">🔍</div>
486      <div class="empty-title">No solutions match your filters</div>
487      <div class="empty-sub">Try adjusting the vendor, challenge, or search term</div>
488    </div>`;
489    return;
490  }
491
492  const badgeLabels = {req:'Obrigatório',rec:'Recomendado',opt:'Opcional'};
493
494  grid.innerHTML = results.map(s => {
495    const isHighlight = s.matchScore > 0;
496    const matchTxt = s.matchScore > 0
497      ? `<span class="match-score">● ${s.matchScore} challenge match${s.matchScore>1?'es':''}</span>`
498      : '';
499    const vendorBadges = s.vendors.map(v =>
500      `<span class="vendor-badge ${activeVendors.has(v)?'sel':''}"
501        onclick="event.stopPropagation();openVendorModal('${v}')">${v}</span>`
502    ).join('');
503    const challengeTags = s.challenges.slice(0,3).map(c =>
504      `<span class="c-tag">${c}</span>`
505    ).join('');
506
507    return `<div class="sol-card ${isHighlight?'highlight':''}" onclick="openSolutionModal('${s.id}')">
508      <div class="card-head">
509        <div class="card-title">${s.title}</div>
510        <span class="card-acronym">${s.acronym}</span>
511      </div>
512      <div class="card-desc">${s.desc}</div>
513      <div class="card-vendors">${vendorBadges}</div>
514      <div class="card-footer">
515        <div class="challenge-tags">${challengeTags}${s.challenges.length>3?`<span class="c-tag">+${s.challenges.length-3}</span>`:''}</div>
516        ${matchTxt}
517      </div>
518    </div>`;
519  }).join('');
520}
521
522/* ── Modals ──────────────────────────────────────────── */
523function openSolutionModal(id) {
524  const s = SOLUTIONS.find(x => x.id === id);
525  if (!s) return;
526  document.getElementById('modal-vendor-name').textContent = s.title;
527  document.getElementById('modal-vendor-sub').textContent  = `${s.acronym} · ${s.vendors.length} vendor${s.vendors.length>1?'s':''}`;
528  const body = document.getElementById('modal-body');
529  body.innerHTML = `
530    <div class="modal-section">
531      <div class="modal-section-label">What does it do?</div>
532      <p style="font-size:13px;color:var(--muted);line-height:1.7">${s.desc}</p>
533    </div>
534    <div class="modal-section">
535      <div class="modal-section-label">CLM Vendors for this solution (${s.vendors.length})</div>
536      <div>
537        ${s.vendors.map(v => {
538          const info = VENDORS[v] || {};
539          return `<div style="display:flex;align-items:flex-start;gap:12px;padding:12px 0;border-bottom:1px solid var(--bord)">
540            <div style="width:10px;height:10px;border-radius:50%;background:${info.color||'#575756'};margin-top:4px;flex-shrink:0"></div>
541            <div style="flex:1">
542              <div style="font-size:13px;font-weight:700;color:var(--navy);margin-bottom:2px">${v}</div>
543              <div style="font-size:12px;color:var(--hint);line-height:1.5">${info.desc||''}</div>
544            </div>
545            <button class="btn btn-outline btn-sm" onclick="openVendorModal('${v}')">View all ${v} solutions →</button>
546          </div>`;
547        }).join('')}
548      </div>
549    </div>
550    <div class="modal-section">
551      <div class="modal-section-label">Business challenges addressed (${s.challenges.length})</div>
552      <div style="display:flex;flex-wrap:wrap;gap:6px;margin-top:2px">
553        ${s.challenges.map(c =>
554          `<span class="sol-pill" onclick="closeModal();filterByChallenge('${c}')">
555            <span class="sol-pill-dot" style="background:var(--red)"></span>${c}
556          </span>`
557        ).join('')}
558      </div>
559    </div>`;
560  document.getElementById('vendor-modal').style.display = 'flex';
561  document.body.style.overflow = 'hidden';
562}
563
564function openVendorModal(vendorName) {
565  const info = VENDORS[vendorName] || {};
566  const solutions = SOLUTIONS.filter(s => s.vendors.includes(vendorName));
567  document.getElementById('modal-vendor-name').textContent = vendorName;
568  document.getElementById('modal-vendor-sub').textContent  =
569    `${solutions.length} solution${solutions.length>1?'s':''} · CLM Value Added Distributor`;
570  const body = document.getElementById('modal-body');
571  body.innerHTML = `
572    <div class="modal-section">
573      <div class="modal-section-label">About ${vendorName}</div>
574      <p style="font-size:13px;color:var(--muted);line-height:1.7">${info.desc||'Parceiro vendor CLM.'}</p>
575    </div>
576    <div class="modal-section">
577      <div class="modal-section-label">Solutions covered by ${vendorName}</div>
578      <div>
579        ${solutions.map(s => `
580          <div style="display:flex;align-items:flex-start;gap:12px;padding:12px 0;border-bottom:1px solid var(--bord);cursor:pointer"
581               onclick="closeModal();setTimeout(()=>openSolutionModal('${s.id}'),150)">
582            <span style="font-size:9px;font-weight:800;padding:3px 7px;border-radius:3px;background:var(--nav-l);color:var(--navy);margin-top:1px;white-space:nowrap">${s.acronym}</span>
583            <div style="flex:1">
584              <div style="font-size:13px;font-weight:600;color:var(--navy);margin-bottom:2px">${s.title}</div>
585              <div style="font-size:12px;color:var(--hint);line-height:1.5">${s.desc.substring(0,100)}…</div>
586              <div style="display:flex;flex-wrap:wrap;gap:4px;margin-top:6px">
587                ${s.challenges.slice(0,4).map(c=>`<span class="c-tag">${c}</span>`).join('')}
588              </div>
589            </div>
590          </div>`).join('')}
591      </div>
592    </div>
593    <div class="modal-section">
594      <div class="modal-section-label">Filter results by ${vendorName}</div>
595      <button class="btn btn-red btn-sm" onclick="closeModal();filterByVendor('${vendorName}')">
596        Show only ${vendorName} solutions →
597      </button>
598    </div>`;
599  document.getElementById('vendor-modal').style.display = 'flex';
600  document.body.style.overflow = 'hidden';
601}
602
603function closeModal() {
604  document.getElementById('vendor-modal').style.display = 'none';
605  document.body.style.overflow = '';
606}
607
608function filterByVendor(v) {
609  clearVendors();
610  activeVendors.add(v);
611  document.querySelector(`.f-chip[data-vendor="${v}"]`)?.classList.add('active');
612  applyFilters();
613}
614
615function filterByChallenge(c) {
616  activeChallenges.add(c);
617  document.querySelector(`.c-chip[data-challenge="${c}"]`)?.classList.add('active');
618  applyFilters();
619}
620
621// Keyboard: Escape closes modal
622document.addEventListener('keydown', e => { if(e.key==='Escape') closeModal(); });
623
624init();
625
626/* ══════════════════════════════════════════════════════════════════════════
627   QUIZ DE DIAGNÓSTICO — CLM Vendor Finder
628   Bilíngue PT / ES · 8 perguntas adaptativas · resultado com vendors + soluções
629══════════════════════════════════════════════════════════════════════════ */
630
631const QUIZ_I18N = {
632  pt: {
633    title:     '🎯 Quiz de Diagnóstico',
634    sub:       'CLM — Encontre a solução certa',
635    langQ:     'Escolha o idioma / Seleccione el idioma',
636    back:      '← Voltar',
637    next:      'Próxima →',
638    finish:    'Ver resultado',
639    restart:   '🔄 Refazer o quiz',
640    resultTitle:'Soluções recomendadas para o seu cenário',
641    resultSub:  'Com base nas suas respostas, estes são os fabricantes CLM mais indicados:',
642    noResult:   'Nenhuma solução encontrada para este cenário. Fale com nosso time de pré-vendas.',
643  },
644  es: {
645    title:     '🎯 Quiz de Diagnóstico',
646    sub:       'CLM — Encuentre la solución correcta',
647    langQ:     'Escolha o idioma / Seleccione el idioma',
648    back:      '← Volver',
649    next:      'Siguiente →',
650    finish:    'Ver resultado',
651    restart:   '🔄 Repetir el quiz',
652    resultTitle:'Soluciones recomendadas para su escenario',
653    resultSub:  'Según sus respuestas, estos son los fabricantes CLM más recomendados:',
654    noResult:   'No se encontraron soluciones para este escenario. Hable con nuestro equipo.',
655  },
656};
657
658// Perguntas bilíngues — cada resposta pontua um array de vendors
659const QUIZ_QUESTIONS = [
660  {
661    id: 'env',
662    pt: { q: 'Qual é o ambiente principal do cliente?', sub: 'Escolha o que melhor descreve a infraestrutura.' },
663    es: { q: '¿Cuál es el entorno principal del cliente?', sub: 'Elija el que mejor describe la infraestructura.' },
664    options: [
665      { pt:'Corporativo — escritórios e usuários remotos', es:'Corporativo — oficinas y usuarios remotos',
666        icon:'🏢', tags:['corp'] },
667      { pt:'Industrial / OT — fábricas, utilities, infraestrutura crítica', es:'Industrial / OT — fábricas, utilities, infraestructura crítica',
668        icon:'🏭', tags:['ot'] },
669      { pt:'Data Center / Nuvem', es:'Centro de Datos / Nube',
670        icon:'☁️', tags:['dc'] },
671      { pt:'Híbrido — todos os ambientes acima', es:'Híbrido — todos los entornos anteriores',
672        icon:'🔀', tags:['corp','ot','dc'] },
673    ]
674  },
675  {
676    id: 'pain',
677    pt: { q: 'Qual é o maior problema que o cliente quer resolver?', sub: 'Selecione a área de maior dor.' },
678    es: { q: '¿Cuál es el mayor problema que el cliente quiere resolver?', sub: 'Seleccione el área de mayor dolor.' },
679    options: [
680      { pt:'Identidade e acesso — quem pode acessar o quê', es:'Identidad y acceso — quién puede acceder a qué',
681        icon:'🔑', tags:['identity'] },
682      { pt:'Proteção de dados — vazamento, ransomware, backup', es:'Protección de datos — filtración, ransomware, respaldo',
683        icon:'🛡️', tags:['data'] },
684      { pt:'Visibilidade de rede — o que está acontecendo na rede', es:'Visibilidad de red — qué está pasando en la red',
685        icon:'👁️', tags:['network'] },
686      { pt:'Segurança de endpoints e mobile', es:'Seguridad de endpoints y móviles',
687        icon:'💻', tags:['endpoint'] },
688      { pt:'Compliance, auditoria e governança', es:'Cumplimiento, auditoría y gobernanza',
689        icon:'📋', tags:['compliance'] },
690      { pt:'Performance e entrega de aplicações', es:'Rendimiento y entrega de aplicaciones',
691        icon:'⚡', tags:['perf'] },
692    ]
693  },
694  {
695    id: 'users',
696    pt: { q: 'Quantos usuários / dispositivos estão no escopo?', sub: 'Estimativa aproximada é suficiente.' },
697    es: { q: '¿Cuántos usuarios / dispositivos están en el alcance?', sub: 'Una estimación aproximada es suficiente.' },
698    options: [
699      { pt:'Até 500', es:'Hasta 500', icon:'👥', tags:['smb'] },
700      { pt:'500 a 5.000', es:'500 a 5.000', icon:'🏬', tags:['mid'] },
701      { pt:'Mais de 5.000', es:'Más de 5.000', icon:'🌐', tags:['ent'] },
702    ]
703  },
704  {
705    id: 'cloud',
706    pt: { q: 'Qual é a estratégia de nuvem do cliente?', sub: '' },
707    es: { q: '¿Cuál es la estrategia de nube del cliente?', sub: '' },
708    options: [
709      { pt:'On-premises — tudo no data center próprio', es:'On-premises — todo en el data center propio',
710        icon:'🖥️', tags:['onprem'] },
711      { pt:'Cloud-first — principalmente AWS, Azure ou GCP', es:'Cloud-first — principalmente AWS, Azure o GCP',
712        icon:'☁️', tags:['cloud'] },
713      { pt:'Híbrido — on-prem e nuvem combinados', es:'Híbrido — on-prem y nube combinados',
714        icon:'🔀', tags:['onprem','cloud'] },
715      { pt:'SaaS — praticamente tudo como serviço', es:'SaaS — prácticamente todo como servicio',
716        icon:'📦', tags:['cloud','saas'] },
717    ]
718  },
719  {
720    id: 'threat',
721    pt: { q: 'Qual ameaça o cliente mais teme?', sub: 'Escolha a que gera mais urgência.' },
722    es: { q: '¿Qué amenaza le preocupa más al cliente?', sub: 'Elija la que genera más urgencia.' },
723    options: [
724      { pt:'Ransomware e sequestro de dados', es:'Ransomware y secuestro de datos',
725        icon:'🔐', tags:['ransomware'] },
726      { pt:'Acesso indevido de funcionários ou terceiros', es:'Acceso indebido de empleados o terceros',
727        icon:'🕵️', tags:['insider'] },
728      { pt:'Ataques externos — APT, phishing, DDoS', es:'Ataques externos — APT, phishing, DDoS',
729        icon:'🌐', tags:['external'] },
730      { pt:'Vazamento de dados sensíveis', es:'Filtración de datos sensibles',
731        icon:'💧', tags:['dlp'] },
732      { pt:'Dispositivos não gerenciados na rede', es:'Dispositivos no gestionados en la red',
733        icon:'📱', tags:['unmanaged'] },
734    ]
735  },
736  {
737    id: 'regulation',
738    pt: { q: 'O cliente possui requisitos regulatórios?', sub: 'Impacta diretamente as soluções recomendadas.' },
739    es: { q: '¿El cliente tiene requisitos regulatorios?', sub: 'Impacta directamente en las soluciones recomendadas.' },
740    options: [
741      { pt:'Sim — LGPD, ISO 27001 ou setor regulado (saúde, financeiro)', es:'Sí — LGPD, ISO 27001 o sector regulado (salud, financiero)',
742        icon:'⚖️', tags:['regulated'] },
743      { pt:'Sim — OT/ICS (IEC 62443, NIST SP 800-82)', es:'Sí — OT/ICS (IEC 62443, NIST SP 800-82)',
744        icon:'🏭', tags:['ot','regulated'] },
745      { pt:'Não há requisitos específicos', es:'No hay requisitos específicos',
746        icon:'✅', tags:[] },
747    ]
748  },
749  {
750    id: 'maturity',
751    pt: { q: 'Qual é a maturidade de segurança do cliente?', sub: 'Avalie o estado atual do programa de segurança.' },
752    es: { q: '¿Cuál es la madurez de seguridad del cliente?', sub: 'Evalúe el estado actual del programa de seguridad.' },
753    options: [
754      { pt:'Inicial — sem ferramentas formais, processos manuais', es:'Inicial — sin herramientas formales, procesos manuales',
755        icon:'🌱', tags:['low_mat'] },
756      { pt:'Em desenvolvimento — algumas ferramentas, equipe pequena', es:'En desarrollo — algunas herramientas, equipo pequeño',
757        icon:'📈', tags:['mid_mat'] },
758      { pt:'Avançado — SOC, SIEM, processos definidos', es:'Avanzado — SOC, SIEM, procesos definidos',
759        icon:'🏆', tags:['high_mat'] },
760    ]
761  },
762  {
763    id: 'priority',
764    pt: { q: 'O que é mais importante para o cliente na escolha da solução?', sub: '' },
765    es: { q: '¿Qué es más importante para el cliente al elegir la solución?', sub: '' },
766    options: [
767      { pt:'Facilidade de implantação e uso', es:'Facilidad de implementación y uso',
768        icon:'🚀', tags:['easy'] },
769      { pt:'Menor custo total (TCO)', es:'Menor coste total (TCO)',
770        icon:'💰', tags:['cost'] },
771      { pt:'Melhor proteção técnica — não importa a complexidade', es:'Mejor protección técnica — no importa la complejidad',
772        icon:'🔬', tags:['tech'] },
773      { pt:'Integração com ferramentas existentes', es:'Integración con herramientas existentes',
774        icon:'🔗', tags:['integration'] },
775    ]
776  },
777];
778
779// Mapeamento de combinações de tags → vendors recomendados com solução
780// Cada entrada: { tags (array de tags que devem estar presentes), vendor, solution, weight }
781const QUIZ_MAPPING = [
782  // Identidade
783  { tags:['identity'],           vendor:'Delinea',          solution:'PAM — Privileged Access Management', weight:10 },
784  { tags:['identity'],           vendor:'SailPoint',        solution:'IGA — Identity Governance', weight:9 },
785  { tags:['identity'],           vendor:'RSA',              solution:'MFA — Multi-Factor Authentication', weight:8 },
786  { tags:['identity'],           vendor:'Silverfort',       solution:'Unified Identity Protection', weight:9 },
787  { tags:['identity','insider'], vendor:'Varonis',          solution:'UEBA — User Behavior Analytics', weight:9 },
788  { tags:['identity','insider'], vendor:'Delinea',          solution:'PAM — Controle de Acessos Privilegiados', weight:10 },
789  { tags:['identity','corp'],    vendor:'SailPoint',        solution:'IGA — Governança de Identidades', weight:10 },
790
791  // Dados
792  { tags:['data'],               vendor:'Varonis',          solution:'DSPM — Data Security Posture', weight:10 },
793  { tags:['data'],               vendor:'Netskope',         solution:'CASB + DLP — Proteção de Dados em Nuvem', weight:9 },
794  { tags:['data'],               vendor:'Thales',           solution:'Criptografia e Gestão de Chaves', weight:8 },
795  { tags:['data','ransomware'],  vendor:'Halcyon',          solution:'Anti-Ransomware Platform', weight:11 },
796  { tags:['data','ransomware'],  vendor:'Veeam',            solution:'Backup & Recovery', weight:10 },
797  { tags:['data','ransomware'],  vendor:'ExaGrid',          solution:'Backup Storage com Deduplicação', weight:9 },
798  { tags:['data','dlp'],         vendor:'Netskope',         solution:'DLP — Data Loss Prevention', weight:10 },
799  { tags:['data','dlp'],         vendor:'Skyhigh Security', solution:'CASB + DLP — Proteção em Nuvem', weight:9 },
800  { tags:['data','regulated'],   vendor:'Thales',           solution:'Criptografia e HSM — Compliance', weight:10 },
801  { tags:['data','regulated'],   vendor:'Imperva',          solution:'Data Security Fabric', weight:9 },
802
803  // Rede
804  { tags:['network'],            vendor:'Gigamon',          solution:'Deep Observability — Visibilidade de Rede', weight:11 },
805  { tags:['network'],            vendor:'Arista',           solution:'NDR — Network Detection and Response', weight:9 },
806  { tags:['network'],            vendor:'Vectra',           solution:'NDR — AI-Powered Threat Detection', weight:10 },
807  { tags:['network'],            vendor:'Hillstone Networks',solution:'NDR + NGFW', weight:8 },
808  { tags:['network','external'], vendor:'NSFocus',          solution:'DDoS Mitigation', weight:10 },
809  { tags:['network','external'], vendor:'Imperva',          solution:'WAF + DDoS Protection', weight:10 },
810  { tags:['network','external'], vendor:'Akamai',           solution:'WAAP — Web App & API Protection', weight:9 },
811  { tags:['network','unmanaged'],vendor:'Forescout',        solution:'NAC — Device Visibility & Control', weight:11 },
812  { tags:['network','unmanaged'],vendor:'Arista',           solution:'NAC — Network Access Control', weight:9 },
813  { tags:['network','ot'],       vendor:'Claroty',          solution:'CPS — Cyber-Physical Systems Protection', weight:12 },
814  { tags:['network','ot'],       vendor:'Nozomi Networks',  solution:'OT/IoT Security', weight:11 },
815
816  // Endpoint
817  { tags:['endpoint'],           vendor:'SentinelOne',      solution:'EDR/EPP — Endpoint Protection', weight:11 },
818  { tags:['endpoint','ransomware'],vendor:'SentinelOne',    solution:'EDR + Anti-Ransomware', weight:12 },
819  { tags:['endpoint','ransomware'],vendor:'Halcyon',        solution:'Anti-Ransomware Platform', weight:12 },
820  { tags:['endpoint','unmanaged'],vendor:'Hexnode',         solution:'UEM — Unified Endpoint Management', weight:10 },
821
822  // Compliance
823  { tags:['compliance'],         vendor:'SailPoint',        solution:'IGA — Governança e Auditoria de Identidades', weight:10 },
824  { tags:['compliance'],         vendor:'Varonis',          solution:'DSPM — Auditoria de Acesso a Dados', weight:9 },
825  { tags:['compliance'],         vendor:'AlgoSec',          solution:'NSPM — Gestão de Políticas de Firewall', weight:9 },
826  { tags:['compliance','regulated'],vendor:'Thales',        solution:'HSM + Criptografia — Conformidade Regulatória', weight:11 },
827  { tags:['compliance','regulated'],vendor:'RSA',           solution:'MFA + IGA — Conformidade', weight:9 },
828  { tags:['compliance','data'],  vendor:'Progress Software',solution:'MOVEit — Transferência 
828Segura de Arquivos', weight:8 },
829
830  // Performance
831  { tags:['perf'],               vendor:'F5',               solution:'ADC — Application Delivery Controller', weight:11 },
832  { tags:['perf'],               vendor:'A10 Networks',     solution:'ADC + DDoS Protection', weight:10 },
833  { tags:['perf'],               vendor:'Akamai',           solution:'CDN + Performance Global', weight:9 },
834  { tags:['perf','dc'],          vendor:'Nutanix',          solution:'HCI — Hyperconverged Infrastructure', weight:10 },
835  { tags:['perf','dc'],          vendor:'Zadara',           solution:'Cloud Storage — Block, File, Object', weight:9 },
836  { tags:['perf','dc'],          vendor:'Lenovo',           solution:'Servidores e Storage ThinkSystem', weight:8 },
837  { tags:['perf','onprem'],      vendor:'Riverbed',         solution:'WAN Optimization & Observability', weight:10 },
838
839  // Cloud / SASE / ZTNA
840  { tags:['cloud','corp'],       vendor:'Netskope',         solution:'SSE — Security Service Edge', weight:11 },
841  { tags:['cloud','corp'],       vendor:'Cato Networks',    solution:'SASE — SD-WAN + SSE', weight:11 },
842  { tags:['cloud','corp'],       vendor:'Skyhigh Security', solution:'SSE — CASB + SWG + DLP', weight:10 },
843  { tags:['cloud'],              vendor:'AppGate',          solution:'ZTNA — Zero Trust Network Access', weight:9 },
844  { tags:['saas'],               vendor:'Netskope',         solution:'CASB — Cloud Access Security Broker', weight:11 },
845  { tags:['saas'],               vendor:'Skyhigh Security', solution:'CASB — Cloud Security', weight:10 },
846
847  // OT específico
848  { tags:['ot'],                 vendor:'Claroty',          solution:'CPS — Cyber-Physical Systems Protection', weight:12 },
849  { tags:['ot'],                 vendor:'Nozomi Networks',  solution:'OT/IoT Security & Visibility', weight:11 },
850  { tags:['ot'],                 vendor:'Forescout',        solution:'Device Visibility for OT/IoT', weight:9 },
851  { tags:['ot'],                 vendor:'AppGate',          solution:'ZTNA for OT — Secure Remote Access', weight:9 },
852
853  // Email / Phishing
854  { tags:['external'],           vendor:'ProofPoint',       solution:'Email Security + Threat Intelligence', weight:9 },
855  { tags:['external'],           vendor:'Skyhigh Security', solution:'RBI — Remote Browser Isolation', weight:8 },
856
857  // SOC / SIEM
858  { tags:['high_mat'],           vendor:'SentinelOne',      solution:'SIEM + XDR — Security Operations', weight:9 },
859  { tags:['high_mat'],           vendor:'Aiuken',           solution:'Managed SOC + SIEM + SOAR', weight:10 },
860  { tags:['high_mat','network'], vendor:'Vectra',           solution:'NDR + ITDR para SOC Avançado', weight:10 },
861];
862
863// Estado do quiz
864let quizLang = 'pt';
865let quizStep = -1; // -1 = seleção de idioma, 0-7 = perguntas, 8 = resultado
866let quizAnswers = {}; // { questionId: [tags] }
867let quizActiveTags = new Set();
868
869function openQuiz() {
870  quizStep = -1;
871  quizAnswers = {};
872  quizActiveTags = new Set();
873  document.getElementById('quiz-overlay').classList.add('open');
874  renderQuizStep();
875}
876
877function closeQuiz() {
878  document.getElementById('quiz-overlay').classList.remove('open');
879}
880
881function renderQuizStep() {
882  const body   = document.getElementById('quiz-body');
883  const i18n   = QUIZ_I18N[quizLang];
884  const hTitle = document.getElementById('quiz-header-title');
885  const hSub   = document.getElementById('quiz-header-sub');
886  hTitle.textContent = i18n.title;
887  hSub.textContent   = i18n.sub;
888
889  // ── Seleção de idioma ─────────────────────────────────────────────────────
890  if (quizStep === -1) {
891    body.innerHTML = `
892      <div style="text-align:center;padding:16px 0 8px">
893        <div class="quiz-q" style="text-align:center">${QUIZ_QUESTIONS[0].pt.q.replace(QUIZ_QUESTIONS[0].pt.q, QUIZ_I18N.pt.langQ)}</div>
894        <div class="quiz-lang">
895          <button class="quiz-lang-btn" onclick="setQuizLang('pt')">🇧🇷 Português</button>
896          <button class="quiz-lang-btn" onclick="setQuizLang('es')">🇪🇸 Español</button>
897        </div>
898      </div>`;
899    return;
900  }
901
902  // ── Resultado ─────────────────────────────────────────────────────────────
903  if (quizStep >= QUIZ_QUESTIONS.length) {
904    renderQuizResult(); return;
905  }
906
907  // ── Pergunta ──────────────────────────────────────────────────────────────
908  const q        = QUIZ_QUESTIONS[quizStep];
909  const totalQ   = QUIZ_QUESTIONS.length;
910  const selected = quizAnswers[q.id] || null;
911
912  // Progress dots
913  const dots = Array.from({length: totalQ}, (_, i) => {
914    let cls = 'quiz-progress-dot';
915    if (i < quizStep) cls += ' done';
916    else if (i === quizStep) cls += ' active';
917    return `<div class="${cls}"></div>`;
918  }).join('');
919
920  const opts = q.options.map((o, i) => {
921    const isSel = selected && JSON.stringify(selected) === JSON.stringify(o.tags);
922    return `<button class="quiz-opt${isSel ? ' selected' : ''}" onclick="selectQuizOpt(${i})">
923      <span class="quiz-opt-icon">${o.icon}</span>
924      <div>
925        <div class="quiz-opt-text">${o[quizLang]}</div>
926      </div>
927    </button>`;
928  }).join('');
929
930  body.innerHTML = `
931    <div class="quiz-progress">${dots}</div>
932    <div class="quiz-q">${q[quizLang].q}</div>
933    ${q[quizLang].sub ? `<div class="quiz-q-sub">${q[quizLang].sub}</div>` : ''}
934    <div class="quiz-options">${opts}</div>
935    <div class="quiz-nav">
936      <button class="quiz-nav-btn" onclick="quizBack()" ${quizStep === 0 ? 'disabled' : ''}>${i18n.back}</button>
937      <button class="quiz-nav-btn primary" id="quiz-next-btn"
938        onclick="quizNext()" ${selected === null ? 'disabled' : ''}>
939        ${quizStep === totalQ - 1 ? i18n.finish : i18n.next}
940      </button>
941    </div>`;
942}
943
944function setQuizLang(lang) {
945  quizLang = lang;
946  quizStep = 0;
947  renderQuizStep();
948}
949
950function selectQuizOpt(idx) {
951  const q = QUIZ_QUESTIONS[quizStep];
952  quizAnswers[q.id] = q.options[idx].tags;
953  renderQuizStep();
954}
955
956function quizNext() {
957  const q = QUIZ_QUESTIONS[quizStep];
958  if (!quizAnswers[q.id]) return;
959  quizStep++;
960  renderQuizStep();
961}
962
963function quizBack() {
964  if (quizStep > 0) { quizStep--; renderQuizStep(); }
965}
966
967function renderQuizResult() {
968  const i18n = QUIZ_I18N[quizLang];
969
970  // Acumular todas as tags das respostas
971  const allTags = new Set();
972  Object.values(quizAnswers).forEach(tags => tags.forEach(t => allTags.add(t)));
973
974  // Pontuar vendors
975  const scores = {};
976  const solutionMap = {};
977
978  QUIZ_MAPPING.forEach(m => {
979    const match = m.tags.every(t => allTags.has(t));
980    if (!match) return;
981    scores[m.vendor]   = (scores[m.vendor] || 0) + m.weight;
982    if (!solutionMap[m.vendor]) solutionMap[m.vendor] = [];
983    if (!solutionMap[m.vendor].includes(m.solution))
984      solutionMap[m.vendor].push(m.solution);
985  });
986
987  // Ordenar por score e pegar top 6
988  const ranked = Object.entries(scores)
989    .sort((a, b) => b[1] - a[1])
990    .slice(0, 6);
991
992  if (!ranked.length) {
993    document.getElementById('quiz-body').innerHTML = `
994      <div style="text-align:center;padding:24px;color:var(--muted)">${i18n.noResult}</div>
995      <button class="quiz-restart" onclick="openQuiz()">${i18n.restart}</button>`;
996    return;
997  }
998
999  const cards = ranked.map(([vendor, score], idx) => {
1000    const vData     = VENDORS[vendor] || {};
1001    const solutions = (solutionMap[vendor] || []).slice(0, 2).join(' · ');
1002    const rankCls   = idx === 0 ? 'quiz-rec-rank gold' : 'quiz-rec-rank';
1003    return `
1004      <div class="quiz-rec-card">
1005        <div class="${rankCls}">${idx + 1}</div>
1006        <div class="quiz-rec-body">
1007          <div class="quiz-rec-vendor">${vendor}</div>
1008          <div class="quiz-rec-solution">${solutions}</div>
1009          <div class="quiz-rec-desc">${vData.desc || ''}</div>
1010        </div>
1011      </div>`;
1012  }).join('');
1013
1014  document.getElementById('quiz-body').innerHTML = `
1015    <div class="quiz-result-title">${i18n.resultTitle}</div>
1016    <div class="quiz-result-sub">${i18n.resultSub}</div>
1017    ${cards}
1018    <button class="quiz-restart" onclick="openQuiz()">${i18n.restart}</button>`;
1019}
1020
1021// Fechar com Escape
1022document.addEventListener('keydown', e => {
1023  if (e.key === 'Escape') closeQuiz();
1024});
1025

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.