{"context":{"domain":"people-le-moura"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"69fe34b018c813c5be7bddd9","name":"Leadro Moura","domain":"people-le-moura","visibility":"private","settings":{"defaultAccessPolicy":"private"},"updatedAt":"2026-08-14T19:35:06.936Z","createdAt":"2026-05-08T19:08:32.496Z"}]}},{"reference":"ComponentsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Router","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}}}},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"DeviceController","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}},{"_id":"6a4545772e19654bbce078d6","component":"data2-core-types@Component","system":"69fe34b018c813c5be7bddd9","params":{"extends":"data2-core-primitives@Block","component":"crm-pipeline-view","package":"people-le-moura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n    *{box-sizing:border-box;margin:0;padding:0}\n    .app{display:grid;grid-template-columns:200px 1fr;grid-template-rows:auto auto 1fr;height:100%;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:#f5f6fa;overflow:hidden}\n    .sidebar{grid-row:1/4;background:#16192b;display:flex;flex-direction:column}\n    .logo{padding:22px 18px 20px;color:#fff;font-size:15px;font-weight:800;letter-spacing:-.5px}\n    .logo em{color:#7c4dff;font-style:normal}\n    .nav{flex:1;padding:0 8px;display:flex;flex-direction:column;gap:2px}\n    .nav-item{padding:9px 12px;border-radius:8px;color:#7a7d94;font-size:13px;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .15s;user-select:none}\n    .nav-item:hover{background:rgba(255,255,255,.06);color:#fff}\n    .nav-item.active{background:#7c4dff;color:#fff;font-weight:600}\n    .nav-foot{padding:16px 18px;color:#4a4d6a;font-size:11px;margin-top:auto}\n    .topbar{grid-column:2;background:#fff;border-bottom:1px solid #ecedf5;padding:16px 24px;display:flex;align-items:center;gap:12px}\n    .topbar-title{font-size:17px;font-weight:700;color:#16192b;flex:1}\n    .topbar-sub{font-size:12px;color:#9598ae;font-weight:400;display:block;margin-top:1px}\n    .srch{padding:7px 12px;border:1.5px solid #e4e5ef;border-radius:8px;font-size:13px;width:210px;outline:none;color:#16192b;transition:border .15s;font-family:inherit}\n    .srch:focus{border-color:#7c4dff}\n    .vt{display:flex;background:#f0f1f8;border-radius:8px;padding:2px;gap:1px}\n    .vt-btn{padding:5px 12px;border:0;background:transparent;border-radius:6px;font-size:12px;cursor:pointer;color:#9598ae;font-weight:500;transition:all .15s;font-family:inherit}\n    .vt-btn.active{background:#fff;color:#16192b;font-weight:700;box-shadow:0 1px 3px rgba(0,0,0,.1)}\n    .kpi-bar{grid-column:2;background:#fff;border-bottom:1px solid #ecedf5;padding:0 24px;display:flex}\n    .kpi{flex:1;padding:12px 0;display:flex;flex-direction:column;gap:2px;border-right:1px solid #ecedf5}\n    .kpi:last-child{border:0}.kpi+.kpi{padding-left:20px}\n    .kv{font-size:21px;font-weight:800;color:#16192b;line-height:1}\n    .kl{font-size:10px;color:#9598ae;text-transform:uppercase;letter-spacing:.07em;font-weight:600}\n    .ks{font-size:12px;font-weight:600;margin-top:2px;color:#7c4dff}\n    .kpi.green .kv{color:#00a86b}.kpi.red .kv{color:#e63946}\n    .content{grid-column:2;display:flex;overflow:hidden}\n    .board{flex:1;display:flex;gap:12px;padding:16px 24px;overflow-x:auto;overflow-y:hidden;align-items:flex-start}\n    .lane{width:224px;flex-shrink:0;border-radius:10px;overflow:hidden;display:flex;flex-direction:column;background:#ebebf5}\n    .lane-hd{padding:10px 12px;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.07em;display:flex;align-items:center;gap:6px}\n    .lane-cnt{background:rgba(0,0,0,.13);border-radius:9px;padding:1px 6px;font-size:10px;font-weight:700}\n    .lane-body{flex:1;padding:6px;overflow-y:auto;display:flex;flex-direction:column;gap:7px;min-height:60px;max-height:calc(100vh - 280px)}\n    .lane.dragover .lane-body{background:rgba(124,77,255,.1);outline:2px dashed #7c4dff;outline-offset:-4px;border-radius:8px}\n    .card{background:#fff;border-radius:9px;padding:11px 12px;box-shadow:0 1px 3px rgba(0,0,0,.07);cursor:pointer;border:1.5px solid transparent;transition:all .15s}\n    .card:hover{border-color:#d4c6ff;box-shadow:0 3px 10px rgba(124,77,255,.12)}\n    .card.sel{border-color:#7c4dff;box-shadow:0 3px 10px rgba(124,77,255,.2)}\n    .card[data-drag]{opacity:.35}\n    .card-opp{font-size:10px;color:#b0b3c9;font-weight:600;letter-spacing:.03em;margin-bottom:4px}\n    .card-acct{font-size:13px;font-weight:700;color:#16192b;line-height:1.2;margin-bottom:7px}\n    .card-row{display:flex;align-items:center;justify-content:space-between}\n    .pill{font-size:10px;font-weight:700;padding:2px 7px;border-radius:9px}\n    .card-val{font-size:12px;font-weight:700;color:#7c4dff}\n    .card-foot{display:flex;align-items:center;gap:5px;margin-top:7px}\n    .av{width:17px;height:17px;border-radius:50%;background:#7c4dff;color:#fff;font-size:8px;font-weight:800;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n    .card-ag{font-size:11px;color:#9598ae}\n    .card-pr{font-size:11px;color:#c0c3d4;margin-left:auto;font-style:italic}\n    .empty-lane{padding:20px 0;color:#c0c3d4;font-size:12px;text-align:center}\n    .list-wrap{flex:1;display:flex;flex-direction:column;padding:16px 24px;overflow:hidden}\n    .list-hd{display:grid;grid-template-columns:120px 1fr 130px 100px 80px 110px;gap:8px;padding:8px 12px;background:#f5f6fa;border-radius:8px 8px 0 0;border:1px solid #ecedf5;border-bottom:0}\n    .list-hd span{font-size:10px;font-weight:700;color:#9598ae;text-transform:uppercase;letter-spacing:.05em}\n    .list-body{flex:1;overflow-y:auto;border:1px solid #ecedf5;border-radius:0 0 8px 8px;background:#fff}\n    .list-row{display:grid;grid-template-columns:120px 1fr 130px 100px 80px 110px;gap:8px;padding:10px 12px;align-items:center;border-bottom:1px solid #f5f6fa;cursor:pointer;transition:background .1s;font-size:13px;color:#16192b}\n    .list-row:last-child{border:0}.list-row:hover,.list-row.sel{background:#f8f7ff}\n    .mono{font-family:monospace;font-size:11px;color:#9598ae}\n    .sp{font-size:10px;font-weight:700;padding:3px 8px;border-radius:9px;white-space:nowrap;display:inline-block}\n    .sp-0{background:#dbeafe;color:#1d4ed8}.sp-1{background:#e0e7ff;color:#3730a3}\n    .sp-2{background:#ede9fe;color:#6d28d9}.sp-3{background:#fef3c7;color:#92400e}\n    .sp-4{background:#d1fae5;color:#065f46}.sp-5{background:#fee2e2;color:#991b1b}\n    .sp-x{background:#f3f4f6;color:#374151}\n    .pp-h{background:#fee2e2;color:#991b1b}.pp-m{background:#fef3c7;color:#92400e}\n    .pp-l{background:#d1fae5;color:#065f46}.pp-x{background:#f3f4f6;color:#374151}\n    .detail{width:300px;flex-shrink:0;background:#fff;border-left:1px solid #ecedf5;display:flex;flex-direction:column;overflow:hidden;transition:width .18s}\n    .detail.hide{width:0;border:0}\n    .det-hd{padding:16px 18px 12px;border-bottom:1px solid #f0f1f8;position:relative}\n    .det-opp{font-size:10px;color:#9598ae;font-family:monospace;margin-bottom:3px}\n    .det-title{font-size:14px;font-weight:700;color:#16192b;line-height:1.3;padding-right:22px}\n    .cls{position:absolute;top:14px;right:14px;background:none;border:0;font-size:15px;cursor:pointer;color:#9598ae;line-height:1;padding:3px 5px;border-radius:4px;font-family:inherit}\n    .cls:hover{background:#f0f1f8;color:#16192b}\n    .det-body{flex:1;overflow-y:auto;padding:12px 18px;display:flex;flex-direction:column;gap:10px}\n    .fg{display:flex;flex-direction:column;gap:3px}\n    .fl{font-size:10px;font-weight:700;color:#9598ae;text-transform:uppercase;letter-spacing:.06em}\n    .fi{font-size:13px;padding:7px 10px;border:1.5px solid #e4e5ef;border-radius:7px;outline:none;width:100%;font-family:inherit;color:#16192b;transition:border .15s;background:#fff;resize:vertical}\n    .fi:focus{border-color:#7c4dff}\n    select.fi{cursor:pointer}\n    textarea.fi{min-height:68px;font-size:12px}\n    .det-foot{padding:12px 18px;border-top:1px solid #f0f1f8;display:flex;flex-direction:column;gap:7px}\n    .save-btn{width:100%;padding:9px;background:#7c4dff;color:#fff;border:0;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;transition:all .15s;font-family:inherit}\n    .save-btn:hover{background:#6c3fe8}.save-btn:disabled{opacity:.5;cursor:not-allowed}\n    .ok-msg{text-align:center;font-size:12px;color:#00a86b;font-weight:600}\n    .no-data{display:flex;align-items:center;justify-content:center;height:100%;color:#9598ae;font-size:14px}\n    ::-webkit-scrollbar{width:4px;height:4px}\n    ::-webkit-scrollbar-thumb{background:#d4d5e4;border-radius:3px}\n    ::-webkit-scrollbar-track{background:transparent}\n    .modal-scrim{position:fixed;inset:0;background:rgba(22,25,43,.5);display:flex;align-items:center;justify-content:center;z-index:200}\n    .modal{background:#fff;border-radius:14px;width:500px;max-width:94vw;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 24px 64px rgba(0,0,0,.22)}\n    .modal-hd{padding:20px 22px 16px;border-bottom:1px solid #f0f1f8;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}\n    .modal-title{font-size:16px;font-weight:700;color:#16192b}\n    .modal-cls{background:none;border:0;font-size:16px;cursor:pointer;color:#9598ae;padding:4px 6px;border-radius:4px;font-family:inherit;line-height:1}\n    .modal-cls:hover{background:#f0f1f8;color:#16192b}\n    .modal-body{padding:18px 22px;display:flex;flex-direction:column;gap:12px;overflow-y:auto;flex:1}\n    .modal-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}\n    .modal-foot{padding:14px 22px;border-top:1px solid #f0f1f8;display:flex;gap:8px;justify-content:flex-end;flex-shrink:0}\n    .btn-cancel{padding:8px 18px;border:1.5px solid #e4e5ef;border-radius:8px;background:#fff;color:#16192b;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s}\n    .btn-cancel:hover{border-color:#b0b3c9}\n    .btn-create{padding:8px 18px;border:0;border-radius:8px;background:#7c4dff;color:#fff;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit;transition:all .15s}\n    .btn-create:hover{background:#6c3fe8}.btn-create:disabled{opacity:.5;cursor:not-allowed}\n    .add-btn{padding:7px 16px;background:#7c4dff;color:#fff;border:0;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit;white-space:nowrap;transition:all .15s}\n    .add-btn:hover{background:#6c3fe8}\n  `,\n  render(d2) {\n    const ds = d2.data('pipeline')\n    if (!ds || ds.loading) return `<div class=\"app\"><div class=\"sidebar\"><div class=\"logo\">Codex <em>CRM</em></div></div><div class=\"no-data\" style=\"grid-column:2;grid-row:1/4\">A carregar pipeline...</div></div>`\n    const esc = s => String(s||'').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;')\n    const fmtN = n => { n = Number(n)||0; return n>=1e6?(n/1e6).toFixed(1)+'M':n>=1e3?Math.round(n/1e3)+'K':String(Math.round(n)) }\n    const ini = s => (s||'?').split(' ').map(w=>w[0]||'').join('').slice(0,2).toUpperCase()\n    const STAGES = ['Prospecting','Qualification','Proposal','Negotiation','Closed Won','Closed Lost']\n    const S_COLOR = ['#2563eb','#4f46e5','#7c4dff','#d97706','#059669','#dc2626']\n    const S_BG = ['#dbeafe','#e0e7ff','#ede9fe','#fef3c7','#d1fae5','#fee2e2']\n    const S_CLS = ['sp-0','sp-1','sp-2','sp-3','sp-4','sp-5']\n    const stageCls = s => { const i=STAGES.indexOf(s); return i>=0?S_CLS[i]:'sp-x' }\n    const priCls = p => p==='High'?'pp-h':p==='Medium'?'pp-m':p==='Low'?'pp-l':'pp-x'\n    const q = (d2.state.q||'').toLowerCase()\n    const view = d2.state.view||'kanban'\n    const selId = d2.state.selId\n    const edits = d2.state.edits||{}\n    const saving = d2.state.saving\n    const saved = d2.state.saved\n    const all = ds.records()\n    let rows = all\n    if (q) rows = rows.filter(r => (r.account||'').toLowerCase().includes(q)||(r.opportunity_id||'').toLowerCase().includes(q)||(r.product||'').toLowerCase().includes(q)||(r.sales_agent||'').toLowerCase().includes(q))\n    const sel = selId ? all.find(r=>r._id===selId) : null\n    const open = all.filter(r=>r.deal_stage!=='Closed Won'&&r.deal_stage!=='Closed Lost')\n    const won = all.filter(r=>r.deal_stage==='Closed Won')\n    const lost = all.filter(r=>r.deal_stage==='Closed Lost')\n    const openV = open.reduce((s,r)=>s+(Number(r.close_value)||0),0)\n    const wonV = won.reduce((s,r)=>s+(Number(r.close_value)||0),0)\n    const sidebar = `<div class=\"sidebar\"><div class=\"logo\">Codex <em>CRM</em></div><div class=\"nav\"><div class=\"nav-item\" data-nav=\"accounts\">📋 Accounts</div><div class=\"nav-item active\">⚡ Pipeline</div><div class=\"nav-item\" data-nav=\"analytics\">📊 Analytics</div></div><div class=\"nav-foot\">Codex CRM v2</div></div>`\n    const topbar = `<div class=\"topbar\"><div><span class=\"topbar-sub\">Codex CRM</span><div class=\"topbar-title\">Pipeline Comercial</div></div><input class=\"srch\" placeholder=\"Pesquisar conta, produto...\" data-search value=\"${esc(d2.state.q||'')}\"><div class=\"vt\"><button class=\"vt-btn${view==='kanban'?' active':''}\" data-view=\"kanban\">⊞ Kanban</button><button class=\"vt-btn${view==='list'?' active':''}\" data-view=\"list\">≡ Lista</button></div><button class=\"add-btn\" data-action=\"new-lead\">+ Novo Lead</button></div>`\n    const kpiBar = `<div class=\"kpi-bar\"><div class=\"kpi\"><div class=\"kv\">${open.length}</div><div class=\"kl\">Em Pipeline</div><div class=\"ks\">€${fmtN(openV)}</div></div><div class=\"kpi green\"><div class=\"kv\">${won.length}</div><div class=\"kl\">Ganhos</div><div class=\"ks\" style=\"color:#00a86b\">€${fmtN(wonV)}</div></div><div class=\"kpi red\"><div class=\"kv\">${lost.length}</div><div class=\"kl\">Perdidos</div></div><div class=\"kpi\"><div class=\"kv\">${all.length}</div><div class=\"kl\">Total</div></div></div>`\n    const cardHtml = r => `<div class=\"card${selId===r._id?' sel':''}\" draggable=\"true\" data-key=\"${r._id}\" data-id=\"${r._id}\" data-action=\"select\"><div class=\"card-opp\">${esc(r.opportunity_id||'—')}</div><div class=\"card-acct\">${esc(r.account||'Sem conta')}</div><div class=\"card-row\"><span class=\"pill ${priCls(r.priority)}\">${esc(r.priority||'—')}</span><span class=\"card-val\">€${fmtN(r.close_value)}</span></div><div class=\"card-foot\"><span class=\"av\">${ini(r.sales_agent)}</span><span class=\"card-ag\">${esc(r.sales_agent||'—')}</span><span class=\"card-pr\">${esc(r.product||'')}</span></div></div>`\n    const boardHtml = `<div class=\"board\">${STAGES.map((stage,si) => { const lr=rows.filter(r=>r.deal_stage===stage); return `<div class=\"lane\" data-lane=\"${esc(stage)}\"><div class=\"lane-hd\" style=\"background:${S_BG[si]};color:${S_COLOR[si]}\">${esc(stage)}<span class=\"lane-cnt\">${lr.length}</span></div><div class=\"lane-body\">${lr.length?lr.map(cardHtml).join(''):'<div class=\"empty-lane\">○<br>Vazio</div>'}</div></div>` }).join('')}</div>`\n    const listHtml = `<div class=\"list-wrap\"><div class=\"list-hd\"><span>ID</span><span>Conta</span><span>Produto</span><span>Fase</span><span>Valor</span><span>Agente</span></div><div class=\"list-body\">${rows.length?rows.map(r=>`<div class=\"list-row${selId===r._id?' sel':''}\" data-key=\"${r._id}\" data-id=\"${r._id}\" data-action=\"select\"><span class=\"mono\">${esc(r.opportunity_id||'—')}</span><span style=\"font-weight:600\">${esc(r.account||'—')}</span><span style=\"color:#9598ae;font-size:12px\">${esc(r.product||'—')}</span><span><span class=\"sp ${stageCls(r.deal_stage)}\">${esc(r.deal_stage||'—')}</span></span><span style=\"font-weight:700;color:#7c4dff\">€${fmtN(r.close_value)}</span><span style=\"font-size:12px\">${esc(r.sales_agent||'—')}</span></div>`).join(''):'<div style=\"padding:32px;text-align:center;color:#c0c3d4;font-size:13px\">Sem resultados</div>'}</div></div>`\n    const ev = (k,fb) => { const v=edits[k]; return v!==undefined?v:(sel?sel[k]:fb)||'' }\n    const detailHtml = sel ? `<div class=\"detail\"><div class=\"det-hd\"><div class=\"det-opp\">${esc(sel.opportunity_id||'—')}</div><div class=\"det-title\">${esc(sel.account||'Oportunidade')}</div><button class=\"cls\" data-action=\"close\">✕</button></div><div class=\"det-body\"><div class=\"fg\"><div class=\"fl\">Conta</div><input class=\"fi\" data-edit=\"account\" value=\"${esc(ev('account'))}\"></div><div class=\"fg\"><div class=\"fl\">Produto</div><input class=\"fi\" data-edit=\"product\" value=\"${esc(ev('product'))}\"></div><div class=\"fg\"><div class=\"fl\">Fase</div><select class=\"fi\" data-edit=\"deal_stage\">${STAGES.map(s=>`<option${ev('deal_stage')===s?' selected':''}>${esc(s)}</option>`).join('')}</select></div><div class=\"fg\"><div class=\"fl\">Prioridade</div><select class=\"fi\" data-edit=\"priority\">${['High','Medium','Low'].map(p=>`<option${ev('priority')===p?' selected':''}>${p}</option>`).join('')}</select></div><div class=\"fg\"><div class=\"fl\">Valor (€)</div><input class=\"fi\" type=\"number\" data-edit=\"close_value\" value=\"${ev('close_value',0)}\"></div><div class=\"fg\"><div class=\"fl\">Agente</div><input class=\"fi\" data-edit=\"sales_agent\" value=\"${esc(ev('sales_agent'))}\"></div><div class=\"fg\"><div class=\"fl\">Próximo Passo</div><input class=\"fi\" data-edit=\"next_step\" value=\"${esc(ev('next_step'))}\"></div><div class=\"fg\"><div class=\"fl\">Forecast</div><select class=\"fi\" data-edit=\"forecast_category\">${['Commit','Best Case','Pipeline','Omit'].map(f=>`<option${ev('forecast_category')===f?' selected':''}>${f}</option>`).join('')}</select></div><div class=\"fg\"><div class=\"fl\">Notas</div><textarea class=\"fi\" data-edit=\"notes\">${esc(ev('notes'))}</textarea></div></div><div class=\"det-foot\">${saved?'<div class=\"ok-msg\">✓ Guardado</div>':''}<button class=\"save-btn\" data-action=\"save\"${saving?' disabled':''} >${saving?'A guardar...':'Guardar Alterações'}</button></div></div>` : '<div class=\"detail hide\"></div>'\n    const nl=d2.state.newLead||{},showNew=!!d2.state.showNew,creating=!!d2.state.creating\n    const modalHtml=showNew?`<div class=\"modal-scrim\" data-action=\"close-new\"><div class=\"modal\"><div class=\"modal-hd\"><div class=\"modal-title\">Novo Lead</div><button class=\"modal-cls\" data-action=\"close-new\">✕</button></div><div class=\"modal-body\"><div class=\"modal-row\"><div class=\"fg\"><div class=\"fl\">ID Oportunidade</div><input class=\"fi\" data-new=\"opportunity_id\" placeholder=\"OP-2026-...\" value=\"${esc(nl.opportunity_id||'')}\"></div><div class=\"fg\"><div class=\"fl\">Conta *</div><input class=\"fi\" data-new=\"account\" placeholder=\"Nome da empresa\" value=\"${esc(nl.account||'')}\"></div></div><div class=\"modal-row\"><div class=\"fg\"><div class=\"fl\">Produto</div><input class=\"fi\" data-new=\"product\" placeholder=\"Ex: Data2 Suite\" value=\"${esc(nl.product||'')}\"></div><div class=\"fg\"><div class=\"fl\">Agente</div><input class=\"fi\" data-new=\"sales_agent\" placeholder=\"Nome do agente\" value=\"${esc(nl.sales_agent||'')}\"></div></div><div class=\"modal-row\"><div class=\"fg\"><div class=\"fl\">Fase</div><select class=\"fi\" data-new=\"deal_stage\">${STAGES.map(s=>`<option${(nl.deal_stage||'Prospecting')===s?' selected':''}>${esc(s)}</option>`).join('')}</select></div><div class=\"fg\"><div class=\"fl\">Prioridade</div><select class=\"fi\" data-new=\"priority\">${['High','Medium','Low'].map(p=>`<option${(nl.priority||'Medium')===p?' selected':''}>${p}</option>`).join('')}</select></div></div><div class=\"modal-row\"><div class=\"fg\"><div class=\"fl\">Valor (€)</div><input class=\"fi\" type=\"number\" data-new=\"close_value\" placeholder=\"0\" value=\"${nl.close_value||''}\"></div><div class=\"fg\"><div class=\"fl\">Data de Fecho</div><input class=\"fi\" type=\"date\" data-new=\"close_date\" value=\"${nl.close_date||''}\"></div></div><div class=\"fg\"><div class=\"fl\">Notas</div><textarea class=\"fi\" data-new=\"notes\" style=\"min-height:60px\">${esc(nl.notes||'')}</textarea></div></div><div class=\"modal-foot\"><button class=\"btn-cancel\" data-action=\"close-new\">Cancelar</button><button class=\"btn-create\" data-action=\"create-lead\"${creating?' disabled':''}>${creating?'A criar...':'Criar Lead'}</button></div></div></div>`:''\n    return `<div class=\"app\">${sidebar}${topbar}${kpiBar}<div class=\"content\">${view==='kanban'?boardHtml:listHtml}${detailHtml}</div>${modalHtml}</div>`\n  },\n  mounted(d2) {\n    d2.on('[data-search]','input',(e,el)=>{ d2.state.q=el.value })\n    d2.on('[data-view]','click',(e,el)=>{ d2.state.view=el.dataset.view })\n    d2.on('[data-action=\"select\"]','click',(e,el)=>{\n      const id=el.dataset.id\n      if(d2.state.selId===id){d2.state.selId=null;d2.state.edits={}}\n      else{d2.state.selId=id;d2.state.edits={};d2.state.saved=false}\n    })\n    d2.on('[data-action=\"close\"]','click',()=>{d2.state.selId=null;d2.state.edits={}})\n    d2.on('[data-edit]','input',(e,el)=>{ d2.state.edits={...(d2.state.edits||{}),[el.dataset.edit]:el.value} })\n    d2.on('[data-edit]','change',(e,el)=>{ d2.state.edits={...(d2.state.edits||{}),[el.dataset.edit]:el.value} })\n    d2.on('[data-action=\"save\"]','click',async ()=>{\n      const ds=d2.data('pipeline'),id=d2.state.selId,edits=d2.state.edits||{}\n      if(!id||!Object.keys(edits).length)return\n      d2.state.saving=true;d2.state.saved=false\n      try{\n        const rec=ds.records().find(r=>r._id===id)\n        if(rec){const u={...rec,...edits};if(u.close_value!==undefined)u.close_value=Number(u.close_value)||0;await ds.update(u)}\n        d2.state.saved=true;d2.state.edits={}\n        setTimeout(()=>{d2.state.saved=false},3000)\n      }finally{d2.state.saving=false}\n    })\n    d2.on('.card','dragstart',(e,el)=>{e.dataTransfer.setData('text/plain',el.dataset.id);el.setAttribute('data-drag','')})\n    d2.on(document,'dragend',()=>{d2.$$('.card[data-drag]').forEach(el=>el.removeAttribute('data-drag'))})\n    d2.on('.lane','dragover',(e,el)=>{e.preventDefault();el.classList.add('dragover')})\n    d2.on('.lane','dragleave',(e,el)=>el.classList.remove('dragover'))\n    d2.on('.lane','drop',async(e,el)=>{\n      e.preventDefault();el.classList.remove('dragover')\n      const id=e.dataTransfer.getData('text/plain'),lane=el.dataset.lane\n      if(!id||!lane)return\n      const ds=d2.data('pipeline'),rec=ds.records().find(r=>r._id===id)\n      if(rec&&rec.deal_stage!==lane)await ds.update({...rec,deal_stage:lane})\n    })\n    d2.on('[data-nav]','click',(e,el)=>{d2.emit('onNavigate',el.dataset.nav)})\n    d2.on('[data-action=\"new-lead\"]','click',()=>{d2.state.newLead={};d2.state.showNew=true;d2.state.creating=false})\n    d2.on('[data-action=\"close-new\"]','click',(e,el)=>{if(el.classList.contains('modal-scrim')&&e.target!==el)return;d2.state.showNew=false;d2.state.newLead={}})\n    d2.on('[data-new]','input',(e,el)=>{d2.state.newLead={...(d2.state.newLead||{}),[el.dataset.new]:el.value}})\n    d2.on('[data-new]','change',(e,el)=>{d2.state.newLead={...(d2.state.newLead||{}),[el.dataset.new]:el.value}})\n    d2.on('[data-action=\"create-lead\"]','click',async()=>{\n      const nl=d2.state.newLead||{}\n      if(!nl.account)return\n      d2.state.creating=true\n      try{\n        const ts=new Date().toISOString().slice(0,10)\n        const rid=Math.random().toString(36).slice(2,6).toUpperCase()\n        await d2.data('pipeline').create({\n          opportunity_id:nl.opportunity_id||('OP-'+ts+'-'+rid),\n          account:nl.account||'',\n          product:nl.product||'',\n          sales_agent:nl.sales_agent||'',\n          deal_stage:nl.deal_stage||'Prospecting',\n          priority:nl.priority||'Medium',\n          close_value:Number(nl.close_value)||0,\n          close_date:nl.close_date||null,\n          notes:nl.notes||'',\n          forecast_category:'Pipeline'\n        })\n        d2.state.showNew=false\n        d2.state.newLead={}\n      }finally{d2.state.creating=false}\n    })\n  }\n}"}},"pipeline":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"pipeline"}}}}}}}}}},{"_id":"6a4545c9b95d9a763fc42835","component":"data2-core-types@Component","system":"69fe34b018c813c5be7bddd9","params":{"extends":"data2-core-primitives@Block","component":"crm-accounts-view","package":"people-le-moura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n    *{box-sizing:border-box;margin:0;padding:0}\n    .app{display:grid;grid-template-columns:200px 1fr;grid-template-rows:auto auto 1fr;height:100%;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:#f5f6fa;overflow:hidden}\n    .sidebar{grid-row:1/4;background:#16192b;display:flex;flex-direction:column}\n    .logo{padding:22px 18px 20px;color:#fff;font-size:15px;font-weight:800;letter-spacing:-.5px}\n    .logo em{color:#7c4dff;font-style:normal}\n    .nav{flex:1;padding:0 8px;display:flex;flex-direction:column;gap:2px}\n    .nav-item{padding:9px 12px;border-radius:8px;color:#7a7d94;font-size:13px;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .15s;user-select:none}\n    .nav-item:hover{background:rgba(255,255,255,.06);color:#fff}\n    .nav-item.active{background:#7c4dff;color:#fff;font-weight:600}\n    .nav-foot{padding:16px 18px;color:#4a4d6a;font-size:11px;margin-top:auto}\n    .topbar{grid-column:2;background:#fff;border-bottom:1px solid #ecedf5;padding:16px 24px;display:flex;align-items:center;gap:12px}\n    .topbar-title{font-size:17px;font-weight:700;color:#16192b;flex:1}\n    .topbar-sub{font-size:12px;color:#9598ae;font-weight:400;display:block;margin-top:1px}\n    .srch{padding:7px 12px;border:1.5px solid #e4e5ef;border-radius:8px;font-size:13px;width:210px;outline:none;color:#16192b;transition:border .15s;font-family:inherit}\n    .srch:focus{border-color:#7c4dff}\n    .filter-btns{display:flex;gap:6px;flex-wrap:wrap;align-items:center}\n    .fbtn{padding:5px 11px;border:1.5px solid #e4e5ef;border-radius:20px;font-size:12px;cursor:pointer;background:#fff;color:#9598ae;font-weight:500;font-family:inherit;transition:all .15s;white-space:nowrap}\n    .fbtn.active{background:#7c4dff;border-color:#7c4dff;color:#fff;font-weight:700}\n    .kpi-bar{grid-column:2;background:#fff;border-bottom:1px solid #ecedf5;padding:0 24px;display:flex}\n    .kpi{flex:1;padding:12px 0;display:flex;flex-direction:column;gap:2px;border-right:1px solid #ecedf5}\n    .kpi:last-child{border:0}.kpi+.kpi{padding-left:20px}\n    .kv{font-size:21px;font-weight:800;color:#16192b;line-height:1}\n    .kl{font-size:10px;color:#9598ae;text-transform:uppercase;letter-spacing:.07em;font-weight:600}\n    .ks{font-size:12px;font-weight:600;margin-top:2px;color:#7c4dff}\n    .content{grid-column:2;display:flex;overflow:hidden}\n    .list-wrap{flex:1;display:flex;flex-direction:column;padding:16px 24px;overflow:hidden}\n    .list-hd{display:grid;grid-template-columns:1fr 120px 90px 100px 140px 100px;gap:8px;padding:8px 12px;background:#f5f6fa;border-radius:8px 8px 0 0;border:1px solid #ecedf5;border-bottom:0}\n    .list-hd span{font-size:10px;font-weight:700;color:#9598ae;text-transform:uppercase;letter-spacing:.05em}\n    .list-body{flex:1;overflow-y:auto;border:1px solid #ecedf5;border-radius:0 0 8px 8px;background:#fff}\n    .list-row{display:grid;grid-template-columns:1fr 120px 90px 100px 140px 100px;gap:8px;padding:11px 12px;align-items:center;border-bottom:1px solid #f5f6fa;cursor:pointer;transition:background .1s;font-size:13px;color:#16192b}\n    .list-row:last-child{border:0}.list-row:hover,.list-row.sel{background:#f8f7ff}\n    .acct-name{font-weight:700;color:#16192b}\n    .acct-sub{font-size:11px;color:#9598ae;margin-top:1px}\n    .sector-pill{font-size:10px;font-weight:700;padding:3px 8px;border-radius:9px;background:#ede9fe;color:#6d28d9;white-space:nowrap;display:inline-block}\n    .rev{font-weight:700;color:#7c4dff;font-size:13px}\n    .emp{font-size:12px;color:#9598ae}\n    .loc{font-size:12px;color:#9598ae}\n    .opp-count{display:inline-flex;align-items:center;justify-content:center;background:#f0edff;color:#7c4dff;font-size:11px;font-weight:700;border-radius:12px;padding:2px 10px;min-width:28px}\n    .detail{width:320px;flex-shrink:0;background:#fff;border-left:1px solid #ecedf5;display:flex;flex-direction:column;overflow:hidden;transition:width .18s}\n    .detail.hide{width:0;border:0}\n    .det-hd{padding:16px 18px 12px;border-bottom:1px solid #f0f1f8;position:relative}\n    .det-av{width:42px;height:42px;border-radius:10px;background:linear-gradient(135deg,#7c4dff,#4a90d9);color:#fff;font-size:16px;font-weight:800;display:flex;align-items:center;justify-content:center;margin-bottom:10px}\n    .det-title{font-size:15px;font-weight:700;color:#16192b;line-height:1.3;padding-right:22px}\n    .det-sub{font-size:12px;color:#9598ae;margin-top:2px}\n    .cls{position:absolute;top:14px;right:14px;background:none;border:0;font-size:15px;cursor:pointer;color:#9598ae;line-height:1;padding:3px 5px;border-radius:4px;font-family:inherit}\n    .cls:hover{background:#f0f1f8;color:#16192b}\n    .det-body{flex:1;overflow-y:auto;padding:12px 18px;display:flex;flex-direction:column;gap:10px}\n    .sec-title{font-size:11px;font-weight:700;color:#9598ae;text-transform:uppercase;letter-spacing:.07em;margin-top:6px;padding-bottom:6px;border-bottom:1px solid #f0f1f8}\n    .fg{display:flex;flex-direction:column;gap:3px}\n    .fl{font-size:10px;font-weight:700;color:#9598ae;text-transform:uppercase;letter-spacing:.06em}\n    .fi{font-size:13px;padding:7px 10px;border:1.5px solid #e4e5ef;border-radius:7px;outline:none;width:100%;font-family:inherit;color:#16192b;transition:border .15s;background:#fff}\n    .fi:focus{border-color:#7c4dff}\n    .fv{font-size:13px;padding:7px 10px;background:#f8f9ff;border-radius:7px;border:1px solid #ecedf5;color:#16192b;line-height:1.4}\n    .opp-item{background:#f8f9ff;border-radius:8px;padding:9px 11px;border:1px solid #ecedf5;display:flex;flex-direction:column;gap:4px}\n    .opp-id{font-size:10px;color:#9598ae;font-family:monospace}\n    .opp-val{font-size:12px;font-weight:700;color:#7c4dff}\n    .opp-stage{font-size:10px;font-weight:700;padding:2px 7px;border-radius:9px;display:inline-block}\n    .sp-0{background:#dbeafe;color:#1d4ed8}.sp-1{background:#e0e7ff;color:#3730a3}\n    .sp-2{background:#ede9fe;color:#6d28d9}.sp-3{background:#fef3c7;color:#92400e}\n    .sp-4{background:#d1fae5;color:#065f46}.sp-5{background:#fee2e2;color:#991b1b}\n    .sp-x{background:#f3f4f6;color:#374151}\n    .no-opps{font-size:12px;color:#c0c3d4;text-align:center;padding:12px 0}\n    .det-foot{padding:12px 18px;border-top:1px solid #f0f1f8;display:flex;flex-direction:column;gap:7px}\n    .save-btn{width:100%;padding:9px;background:#7c4dff;color:#fff;border:0;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;transition:all .15s;font-family:inherit}\n    .save-btn:hover{background:#6c3fe8}.save-btn:disabled{opacity:.5;cursor:not-allowed}\n    .ok-msg{text-align:center;font-size:12px;color:#00a86b;font-weight:600}\n    .no-data{display:flex;align-items:center;justify-content:center;height:100%;color:#9598ae;font-size:14px}\n    ::-webkit-scrollbar{width:4px;height:4px}\n    ::-webkit-scrollbar-thumb{background:#d4d5e4;border-radius:3px}\n    ::-webkit-scrollbar-track{background:transparent}\n  `,\n  render(d2) {\n    const ds = d2.data('accounts')\n    const pds = d2.data('pipeline')\n    if (!ds || ds.loading) return `<div class=\"app\"><div class=\"sidebar\"><div class=\"logo\">Codex <em>CRM</em></div></div><div class=\"no-data\" style=\"grid-column:2;grid-row:1/4\">A carregar accounts...</div></div>`\n    const esc = s => String(s||'').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;')\n    const fmtM = n => { n=Number(n)||0; return n>=1e9?(n/1e9).toFixed(1)+'B':n>=1e6?(n/1e6).toFixed(1)+'M':n>=1e3?Math.round(n/1e3)+'K':String(Math.round(n)) }\n    const ini = s => (s||'?').split(/\\s+/).map(w=>w[0]||'').join('').slice(0,2).toUpperCase()\n    const STAGES = ['Prospecting','Qualification','Proposal','Negotiation','Closed Won','Closed Lost']\n    const S_CLS = ['sp-0','sp-1','sp-2','sp-3','sp-4','sp-5']\n    const stageCls = s => { const i=STAGES.indexOf(s); return i>=0?S_CLS[i]:'sp-x' }\n    const q = (d2.state.q||'').toLowerCase()\n    const sector = d2.state.sector||'all'\n    const selId = d2.state.selId\n    const edits = d2.state.edits||{}\n    const saving = d2.state.saving\n    const saved = d2.state.saved\n    const all = ds.records()\n    const allPipeline = pds && !pds.loading ? pds.records() : []\n    const sectors = [...new Set(all.map(r=>r.sector).filter(Boolean))].sort()\n    let rows = all\n    if (q) rows = rows.filter(r=>(r.account||'').toLowerCase().includes(q)||(r.sector||'').toLowerCase().includes(q)||(r.office_location||'').toLowerCase().includes(q))\n    if (sector !== 'all') rows = rows.filter(r=>r.sector===sector)\n    const sel = selId ? all.find(r=>r._id===selId) : null\n    const selOpps = sel ? allPipeline.filter(r=>(r.account||'').toLowerCase()===(sel.account||'').toLowerCase()) : []\n    const totalRev = all.reduce((s,r)=>s+(Number(r.revenue)||0),0)\n    const avgEmp = all.length ? Math.round(all.reduce((s,r)=>s+(Number(r.employees)||0),0)/all.length) : 0\n    const sidebar = `<div class=\"sidebar\"><div class=\"logo\">Codex <em>CRM</em></div><div class=\"nav\"><div class=\"nav-item active\">📋 Accounts</div><div class=\"nav-item\" data-nav=\"pipeline\">⚡ Pipeline</div><div class=\"nav-item\" data-nav=\"analytics\">📊 Analytics</div></div><div class=\"nav-foot\">Codex CRM v2</div></div>`\n    const sectorBtns = `<div class=\"filter-btns\"><button class=\"fbtn${sector==='all'?' active':''}\" data-sector=\"all\">Todos</button>${sectors.map(s=>`<button class=\"fbtn${sector===s?' active':''}\" data-sector=\"${esc(s)}\">${esc(s)}</button>`).join('')}</div>`\n    const topbar = `<div class=\"topbar\"><div><span class=\"topbar-sub\">Codex CRM</span><div class=\"topbar-title\">Accounts</div></div><input class=\"srch\" placeholder=\"Pesquisar conta, sector...\" data-search value=\"${esc(d2.state.q||'')}\">${sectorBtns}</div>`\n    const kpiBar = `<div class=\"kpi-bar\"><div class=\"kpi\"><div class=\"kv\">${all.length}</div><div class=\"kl\">Total Accounts</div></div><div class=\"kpi\"><div class=\"kv\">${fmtM(totalRev)}</div><div class=\"kl\">Receita Total</div><div class=\"ks\">Soma revenue</div></div><div class=\"kpi\"><div class=\"kv\">${avgEmp.toLocaleString()}</div><div class=\"kl\">Méd. Funcionários</div></div><div class=\"kpi\"><div class=\"kv\">${sectors.length}</div><div class=\"kl\">Sectores</div></div></div>`\n    const getOppCount = acctName => allPipeline.filter(r=>(r.account||'').toLowerCase()===(acctName||'').toLowerCase()).length\n    const listHtml = `<div class=\"list-wrap\"><div class=\"list-hd\"><span>Empresa</span><span>Sector</span><span>Receita</span><span>Funcionários</span><span>Localização</span><span>Oportunidades</span></div><div class=\"list-body\">${rows.length?rows.map(r=>`<div class=\"list-row${selId===r._id?' sel':''}\" data-key=\"${r._id}\" data-id=\"${r._id}\" data-action=\"select\"><div><div class=\"acct-name\">${esc(r.account||'—')}</div>${r.subsidiary_of?`<div class=\"acct-sub\">Sub de ${esc(r.subsidiary_of)}</div>`:''}</div><span><span class=\"sector-pill\">${esc(r.sector||'—')}</span></span><span class=\"rev\">€${fmtM(r.revenue)}</span><span class=\"emp\">${r.employees?(Number(r.employees)).toLocaleString():'—'}</span><span class=\"loc\">${esc(r.office_location||'—')}</span><span><span class=\"opp-count\">${getOppCount(r.account)}</span></span></div>`).join(''):'<div style=\"padding:32px;text-align:center;color:#c0c3d4;font-size:13px\">Sem resultados</div>'}</div></div>`\n    const ev = (k,fb) => { const v=edits[k]; return v!==undefined?v:(sel?sel[k]:fb)||'' }\n    const detailHtml = sel ? `<div class=\"detail\"><div class=\"det-hd\"><div class=\"det-av\">${ini(sel.account)}</div><div class=\"det-title\">${esc(sel.account||'Account')}</div><div class=\"det-sub\">${esc(sel.sector||'—')} ${sel.year_established?'· Est. '+sel.year_established:''}</div><button class=\"cls\" data-action=\"close\">✕</button></div><div class=\"det-body\"><div class=\"sec-title\">Dados da Empresa</div><div class=\"fg\"><div class=\"fl\">Nome</div><input class=\"fi\" data-edit=\"account\" value=\"${esc(ev('account'))}\"></div><div class=\"fg\"><div class=\"fl\">Sector</div><input class=\"fi\" data-edit=\"sector\" value=\"${esc(ev('sector'))}\"></div><div class=\"fg\"><div class=\"fl\">Receita (€)</div><input class=\"fi\" type=\"number\" data-edit=\"revenue\" value=\"${ev('revenue',0)}\"></div><div class=\"fg\"><div class=\"fl\">Funcionários</div><input class=\"fi\" type=\"number\" data-edit=\"employees\" value=\"${ev('employees',0)}\"></div><div class=\"fg\"><div class=\"fl\">Localização</div><input class=\"fi\" data-edit=\"office_location\" value=\"${esc(ev('office_location'))}\"></div><div class=\"fg\"><div class=\"fl\">Filial de</div><input class=\"fi\" data-edit=\"subsidiary_of\" value=\"${esc(ev('subsidiary_of'))}\"></div><div class=\"sec-title\">Oportunidades (${selOpps.length})</div>${selOpps.length?selOpps.map(o=>`<div class=\"opp-item\"><div class=\"opp-id\">${esc(o.opportunity_id||'—')}</div><div style=\"display:flex;align-items:center;justify-content:space-between;margin-top:3px\"><span class=\"opp-val\">€${fmtM(o.close_value)}</span><span class=\"opp-stage ${stageCls(o.deal_stage)}\">${esc(o.deal_stage||'—')}</span></div>${o.sales_agent?`<div style=\"font-size:11px;color:#9598ae;margin-top:3px\">${esc(o.sales_agent)}</div>`:''}</div>`).join(''):'<div class=\"no-opps\">Sem oportunidades em pipeline</div>'}</div><div class=\"det-foot\">${saved?'<div class=\"ok-msg\">✓ Guardado</div>':''}<button class=\"save-btn\" data-action=\"save\"${saving?' disabled':''} >${saving?'A guardar...':'Guardar Alterações'}</button></div></div>` : '<div class=\"detail hide\"></div>'\n    return `<div class=\"app\">${sidebar}${topbar}${kpiBar}<div class=\"content\">${listHtml}${detailHtml}</div></div>`\n  },\n  mounted(d2) {\n    d2.on('[data-search]','input',(e,el)=>{ d2.state.q=el.value })\n    d2.on('[data-sector]','click',(e,el)=>{ d2.state.sector=el.dataset.sector })\n    d2.on('[data-action=\"select\"]','click',(e,el)=>{\n      const id=el.dataset.id\n      if(d2.state.selId===id){d2.state.selId=null;d2.state.edits={}}\n      else{d2.state.selId=id;d2.state.edits={};d2.state.saved=false}\n    })\n    d2.on('[data-action=\"close\"]','click',()=>{d2.state.selId=null;d2.state.edits={}})\n    d2.on('[data-edit]','input',(e,el)=>{ d2.state.edits={...(d2.state.edits||{}),[el.dataset.edit]:el.value} })\n    d2.on('[data-action=\"save\"]','click',async()=>{\n      const ds=d2.data('accounts'),id=d2.state.selId,edits=d2.state.edits||{}\n      if(!id||!Object.keys(edits).length)return\n      d2.state.saving=true;d2.state.saved=false\n      try{\n        const rec=ds.records().find(r=>r._id===id)\n        if(rec){const u={...rec,...edits};['revenue','employees'].forEach(k=>{if(u[k]!==undefined)u[k]=Number(u[k])||0});await ds.update(u)}\n        d2.state.saved=true;d2.state.edits={}\n        setTimeout(()=>{d2.state.saved=false},3000)\n      }finally{d2.state.saving=false}\n    })\n    d2.on('[data-nav]','click',(e,el)=>{d2.emit('onNavigate',el.dataset.nav)})\n  }\n}"}},"accounts":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accounts"}}}},"pipeline":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"pipeline"}}}}}}}}}},{"_id":"6a4c13ed6c020b3085bf790c","component":"data2-core-types@Component","system":"69fe34b018c813c5be7bddd9","params":{"extends":"data2-core-primitives@Block","component":"kanbanboard","package":"people-le-moura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"function todayISO(){ return new Date().toISOString().slice(0,10) }\n// Chaves via norm() (minúsculas SEM acento): uma entrada por país cobre todas as\n// variantes de acento. Antes eram pares 'itália'/'italia' escritos a mão, e\n// qualquer variação nova (\"Estônia\" em vez de \"Estónia\") perdia a bandeira.\nconst FLAG_PAIS = {'portugal':'🇵🇹','espanha':'🇪🇸','franca':'🇫🇷','alemanha':'🇩🇪','italia':'🇮🇹','holanda':'🇳🇱','paises baixos':'🇳🇱','austria':'🇦🇹','irlanda':'🇮🇪','suecia':'🇸🇪','uk':'🇬🇧','reino unido':'🇬🇧','estonia':'🇪🇪','suica':'🇨🇭','polonia':'🇵🇱','dinamarca':'🇩🇰','finlandia':'🇫🇮','romenia':'🇷🇴','belgica':'🇧🇪','mexico':'🇲🇽','brasil':'🇧🇷','brazil':'🇧🇷','luxemburgo':'🇱🇺','noruega':'🇳🇴','republica tcheca':'🇨🇿','eslovenia':'🇸🇮','eslovaquia':'🇸🇰','hungria':'🇭🇺','grecia':'🇬🇷','bulgaria':'🇧🇬','croacia':'🇭🇷','servia':'🇷🇸','lituania':'🇱🇹','letonia':'🇱🇻','islandia':'🇮🇸','malta':'🇲🇹','monaco':'🇲🇨','chipre':'🇨🇾','turquia':'🇹🇷','ucrania':'🇺🇦','russia':'🇷🇺','estados unidos':'🇺🇸','canada':'🇨🇦','argentina':'🇦🇷','chile':'🇨🇱','colombia':'🇨🇴','japao':'🇯🇵','china':'🇨🇳','india':'🇮🇳','mocambique':'🇲🇿','angola':'🇦🇴','africa do sul':'🇿🇦','australia':'🇦🇺','israel':'🇮🇱','emirados arabes unidos':'🇦🇪','albania':'🇦🇱','andorra':'🇦🇩','armenia':'🇦🇲','azerbaijao':'🇦🇿','bielorrussia':'🇧🇾','bosnia e herzegovina':'🇧🇦','cazaquistao':'🇰🇿','cidade do vaticano':'🇻🇦','georgia':'🇬🇪','gibraltar':'🇬🇮','groenlandia':'🇬🇱','guernsey':'🇬🇬','ilha de man':'🇮🇲','ilhas faroe':'🇫🇴','jersey':'🇯🇪','kosovo':'🇽🇰','liechtenstein':'🇱🇮','macedonia do norte':'🇲🇰','moldavia':'🇲🇩','montenegro':'🇲🇪','san marino':'🇸🇲'}\nfunction flagOf(c){ if(!c) return ''; return FLAG_PAIS[norm(String(c).split('/')[0].trim())]||'' }\nfunction stagesSorted(d2){ return [...d2.data('etapas').records()].sort((a,b)=>(a.ordem||0)-(b.ordem||0)) }\nfunction norm(s){ return (s==null?'':String(s)).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g,'') }\nfunction lev(a,b){ if(a===b) return 0; const m=a.length,n=b.length; if(!m) return n; if(!n) return m; let prev=Array.from({length:n+1},(_,i)=>i),cur=new Array(n+1); for(let i=1;i<=m;i++){ cur[0]=i; for(let j=1;j<=n;j++){ const c=a[i-1]===b[j-1]?0:1; cur[j]=Math.min(prev[j]+1,cur[j-1]+1,prev[j-1]+c) } const t=prev; prev=cur; cur=t } return prev[n] }\nfunction fuzzyMatch(hay,needle){ const h=norm(hay), q=norm(needle).trim(); if(!q) return true; const words=h.split(/\\s+/).filter(Boolean); return q.split(/\\s+/).filter(Boolean).every(tok=>{ if(h.includes(tok)) return true; if(tok.length<4) return false; const md=tok.length>=7?2:1; return words.some(w=> Math.abs(w.length-tok.length)<=md && lev(w,tok)<=md) }) }\nfunction urgRank(r,today){ const dt=r.lembrete_data?String(r.lembrete_data).slice(0,10):''; if(r.lembrete_ativo&&dt&&dt<today) return 3; if(r.lembrete_ativo&&dt) return 2; if(r.lead_quente) return 1; return 0 }\nfunction defaultStage(d2){ const e=stagesSorted(d2); return e.length? e[0].nome : 'Lead Mapeado' }\nasync function saveLead(d2){\n  const d = d2.state.draft||{}; const L = d2.data('leads')\n  const isNew = d2.state.selectedId==='new'\n  const prev = isNew? null : L.records().find(r=>r._id===d2.state.selectedId)\n  const prevEtapa = prev? (prev.etapa||'') : ''\n  const nowIso = new Date().toISOString()\n  const payload = { empresa:d.empresa||'', nome:d.nome||'', cargo:d.cargo||'', cargo_confirmado:!!d.cargo_confirmado, status_empresa:d.status_empresa||'Ativo', cargo_inicio:d.cargo_inicio||'', mercado:d.mercado||'', linkedin:d.linkedin||'', email:d.email||'', tipo_ligacao:d.tipo_ligacao||'', via_quem:d.via_quem||'', forca:d.forca||'', notas:d.notas||'', etapa:d.etapa||defaultStage(d2), tipo_venda:d.tipo_venda||'', lembrete_data:d.lembrete_data||'', lembrete_ativo:!!d.lembrete_ativo, lembrete_nota:d.lembrete_nota||'', origem:d.origem||'', dominio:limpaDominio(d.dominio), telefone:d.telefone||'', data_conexao:d.data_conexao||'', verificado_em:d.verificado_em||'', interesses:d.interesses||'', lead_quente:!!d.lead_quente, lead_engajado:!!d.lead_engajado, pais_sede:paisLockSave(d.pais_sede), cidade_sede:d.cidade_sede||'', pais_lead:paisLockSave(d.pais_lead), cidade_lead:d.cidade_lead||'', filiais_europa:Array.isArray(d.filiais_europa)?d.filiais_europa:[], abordagem:d.abordagem||'' }\n  const etapaChanged = isNew || (payload.etapa !== prevEtapa)\n  if (etapaChanged){\n    payload.etapa_desde = nowIso\n    payload.historico = [ ...((prev&&prev.historico)||[]), { de: prevEtapa, para: payload.etapa, em: nowIso } ]\n    payload.movimentacoes = (((prev&&prev.movimentacoes)||0) + 1)\n    if (payload.etapa==='Fechado' && !(prev&&prev.fechado_em)) payload.fechado_em = nowIso\n  }\n  if (isNew){ await L.create(payload) } else { await L.update({ _id:d2.state.selectedId, ...payload }) }\n  d2.state.selectedId=null\n  return { etapaChanged, etapa: payload.etapa, prevEtapa }\n}\nasync function saveEtapa(d2){\n  const g=d2.state.etDraft||{}; const E=d2.data('etapas'); if(!g.nome) return\n  if(g._id){ await E.update({_id:g._id, nome:g.nome, cor:g.cor||'#6366f1'}) }\n  else { const maxo=E.records().reduce((m,x)=>Math.max(m,x.ordem||0),0); await E.create({nome:g.nome, cor:g.cor||'#6366f1', ordem:maxo+1, ativa:true}) }\n  d2.state.etDraft={cor:'#6366f1'}\n}\nasync function reorderEtapa(d2, id, dir){\n  const list = stagesSorted(d2)\n  const i = list.findIndex(e=>e._id===id); const j = i+dir\n  if(i<0 || j<0 || j>=list.length) return\n  const arr=[...list]; const t=arr[i]; arr[i]=arr[j]; arr[j]=t\n  await Promise.all(arr.map((e,idx)=> (e.ordem===idx+1)?null : d2.data('etapas').update({...e, ordem:idx+1})).filter(Boolean))\n}\n// ── Cabeçalho de card: região (cor) · marca (logo) · tamanho · urgência ──────\nconst REGIOES = {\n  iberia:   { nome:'Ibéria',   g:'linear-gradient(135deg,#12805A,#06432F)' },\n  franca:   { nome:'França',   g:'linear-gradient(135deg,#2C5FA8,#14315B)' },\n  dach:     { nome:'DACH',     g:'linear-gradient(135deg,#5A4A9C,#291F55)' },\n  benelux:  { nome:'Benelux',  g:'linear-gradient(135deg,#8A6D1F,#4A3708)' },\n  italia:   { nome:'Itália',   g:'linear-gradient(135deg,#A33B4C,#571C27)' },\n  ukie:     { nome:'UK-IE',    g:'linear-gradient(135deg,#3E4C6B,#1B2438)' },\n  nordicos: { nome:'Nórdicos', g:'linear-gradient(135deg,#0E7C8C,#06414A)' },\n  americas: { nome:'Américas', g:'linear-gradient(135deg,#93357A,#4C1440)' },\n  baltico:       { nome:'Báltico',        g:'linear-gradient(135deg,#4A7C94,#1E3D4B)' },\n  polonia:       { nome:'Polônia',        g:'linear-gradient(135deg,#C0392B,#63180F)' },\n  europacentral: { nome:'Europa Central', g:'linear-gradient(135deg,#B5651D,#5C3208)' },\n  sudesteue:     { nome:'Sudeste UE',     g:'linear-gradient(135deg,#4A8B33,#1F4114)' },\n  balcas:        { nome:'Bálcãs',         g:'linear-gradient(135deg,#7A4BB8,#351D5B)' },\n  euoutros:      { nome:'EU Outros',      g:'linear-gradient(135deg,#9A5570,#4A2434)' },\n  outros:   { nome:'Outros',   g:'linear-gradient(135deg,#5B6675,#333B47)' },\n}\n// chaves já normalizadas (norm() = minúsculas sem acentos)\nconst PAIS_REGIAO = {\n  // Alinhado com as opções do campo Registro / Mercado — um lead polaco pinta\n  // \"Polônia\", não \"Outros\". Chaves já normalizadas (norm() = minúsculas sem acento).\n  'portugal':'iberia','espanha':'iberia','andorra':'iberia',\n  'franca':'franca','monaco':'franca',\n  'alemanha':'dach','austria':'dach','suica':'dach','liechtenstein':'dach',\n  'holanda':'benelux','paises baixos':'benelux','belgica':'benelux','luxemburgo':'benelux',\n  'italia':'italia','san marino':'italia','cidade do vaticano':'italia',\n  // Jersey / Guernsey / Ilha de Man / Gibraltar entram por jurisdição, não por\n  // geografia — Gibraltar fica em UK-IE apesar de estar na península ibérica.\n  'uk':'ukie','reino unido':'ukie','inglaterra':'ukie','irlanda':'ukie',\n  'guernsey':'ukie','jersey':'ukie','ilha de man':'ukie','gibraltar':'ukie',\n  'suecia':'nordicos','dinamarca':'nordicos','finlandia':'nordicos','noruega':'nordicos',\n  'islandia':'nordicos','ilhas faroe':'nordicos','groenlandia':'nordicos',\n  // Estônia saiu de 'nordicos': com o recorte Báltico estava no balde errado.\n  'estonia':'baltico','letonia':'baltico','lituania':'baltico',\n  'polonia':'polonia',\n  'republica tcheca':'europacentral','republica checa':'europacentral',\n  'eslovaquia':'europacentral','hungria':'europacentral','eslovenia':'europacentral',\n  'romenia':'sudesteue','bulgaria':'sudesteue','grecia':'sudesteue','croacia':'sudesteue',\n  'servia':'balcas','bosnia e herzegovina':'balcas','montenegro':'balcas',\n  'macedonia do norte':'balcas','albania':'balcas','kosovo':'balcas',\n  'chipre':'euoutros','malta':'euoutros',\n  // Leste não-UE e transcontinentais ficam de fora de propósito — caem em\n  // 'outros', porque nenhum dos recortes do Mercado os cobre.\n  'estados unidos':'americas','eua':'americas','brasil':'americas','brazil':'americas',\n  'mexico':'americas','canada':'americas','argentina':'americas','chile':'americas','colombia':'americas'}\nconst TLD_PAIS = {'portugal':'pt','espanha':'es','franca':'fr','alemanha':'de','italia':'it','holanda':'nl','paises baixos':'nl','austria':'at','suica':'ch','belgica':'be','luxemburgo':'lu','irlanda':'ie','uk':'co.uk','reino unido':'co.uk','suecia':'se','dinamarca':'dk','finlandia':'fi','noruega':'no','estonia':'ee','polonia':'pl','romenia':'ro','republica checa':'cz','republica tcheca':'cz','eslovenia':'si','brasil':'com.br','mexico':'mx','japao':'co.jp','mocambique':'co.mz'}\nconst LEGAL_RE = /\\b(sgps|s\\.?a\\.?|sa|se|plc|nv|bv|ag|gmbh|ltd|limited|inc|corp|group|grupo|groupe|holding|holdings|company|spa|srl|oyj|ab|aps|sas|sarl)\\b/g\n// ── Nome canónico de país em pt-BR ─────────────────────────────────────────\n// Uma única fonte de verdade: \"Italia\", \"Italy\" e \"Itália\" convergem para\n// Itália, senão o mapa e a distribuição por país contam o mesmo país 3 vezes.\n// Chaves via norm() (minúsculas sem acento). Aplicado na GRAVAÇÃO (painel de\n// detalhe e importação de planilha), para os dados nunca voltarem a divergir.\nconst PAIS_CANON = {\n  'portugal':'Portugal','espanha':'Espanha','spain':'Espanha',\n  'franca':'França','france':'França',\n  'alemanha':'Alemanha','germany':'Alemanha','deutschland':'Alemanha',\n  'italia':'Itália','italy':'Itália',\n  'holanda':'Países Baixos','paises baixos':'Países Baixos','netherlands':'Países Baixos','nederland':'Países Baixos','the netherlands':'Países Baixos',\n  'belgica':'Bélgica','belgium':'Bélgica',\n  'austria':'Áustria',\n  'suica':'Suíça','switzerland':'Suíça','schweiz':'Suíça',\n  'irlanda':'Irlanda','ireland':'Irlanda',\n  'suecia':'Suécia','sweden':'Suécia',\n  'dinamarca':'Dinamarca','denmark':'Dinamarca',\n  'noruega':'Noruega','norway':'Noruega',\n  'finlandia':'Finlândia','finland':'Finlândia',\n  'islandia':'Islândia','iceland':'Islândia',\n  'uk':'Reino Unido','reino unido':'Reino Unido','inglaterra':'Reino Unido','england':'Reino Unido','united kingdom':'Reino Unido','great britain':'Reino Unido','gra-bretanha':'Reino Unido','gra bretanha':'Reino Unido','escocia':'Reino Unido',\n  'estonia':'Estônia','romenia':'Romênia','romania':'Romênia',\n  'eslovenia':'Eslovênia','slovenia':'Eslovênia',\n  'eslovaquia':'Eslováquia','slovakia':'Eslováquia',\n  'republica checa':'República Tcheca','republica tcheca':'República Tcheca','chequia':'República Tcheca','tchequia':'República Tcheca','czech republic':'República Tcheca','czechia':'República Tcheca',\n  'polonia':'Polônia','poland':'Polônia',\n  'hungria':'Hungria','hungary':'Hungria',\n  'grecia':'Grécia','greece':'Grécia',\n  'bulgaria':'Bulgária','croacia':'Croácia','croatia':'Croácia',\n  'servia':'Sérvia','serbia':'Sérvia',\n  'lituania':'Lituânia','lithuania':'Lituânia',\n  'letonia':'Letônia','latvia':'Letônia',\n  'luxemburgo':'Luxemburgo','luxembourg':'Luxemburgo',\n  'malta':'Malta','monaco':'Mônaco','chipre':'Chipre','cyprus':'Chipre',\n  'turquia':'Turquia','turkey':'Turquia',\n  'ucrania':'Ucrânia','ukraine':'Ucrânia',\n  'russia':'Rússia',\n  'estados unidos':'Estados Unidos','eua':'Estados Unidos','usa':'Estados Unidos','us':'Estados Unidos','united states':'Estados Unidos',\n  'canada':'Canadá','brasil':'Brasil','brazil':'Brasil',\n  'mexico':'México','argentina':'Argentina','chile':'Chile','colombia':'Colômbia',\n  'japao':'Japão','japan':'Japão','china':'China','india':'Índia',\n  'mocambique':'Moçambique','angola':'Angola',\n  'africa do sul':'África do Sul','south africa':'África do Sul',\n  'australia':'Austrália','israel':'Israel',\n  'emirados arabes unidos':'Emirados Árabes Unidos','uae':'Emirados Árabes Unidos',\n  'belarus':'Bielorrússia','moldova':'Moldávia',\n  'north macedonia':'Macedônia do Norte','macedonia':'Macedônia do Norte',\n  'bosnia':'Bósnia e Herzegovina','bosnia and herzegovina':'Bósnia e Herzegovina','herzegovina':'Bósnia e Herzegovina',\n  'vatican':'Cidade do Vaticano','vatican city':'Cidade do Vaticano','holy see':'Cidade do Vaticano','santa se':'Cidade do Vaticano','vaticano':'Cidade do Vaticano',\n  'kazakhstan':'Cazaquistão','azerbaijan':'Azerbaijão',\n  'faroe islands':'Ilhas Faroe','faroe':'Ilhas Faroe','ilhas feroe':'Ilhas Faroe','feroe':'Ilhas Faroe',\n  'greenland':'Groenlândia','isle of man':'Ilha de Man'\n}\n// Preserva a forma dupla \"França/Holanda\" canonizando cada lado, em vez de\n// descartar o segundo país. Desconhecido fica como veio (só aparado).\nfunction paisCanon(s){\n  const raw = String(s==null?'':s).trim()\n  if(!raw) return ''\n  return raw.split('/').map(function(p){\n    const t=p.trim(); if(!t) return ''\n    return PAIS_CANON[norm(t)] || t\n  }).filter(Boolean).join('/')\n}\n// ── Lista canónica de países ────────────────────────────────────────────────\n// Fonte única do dropdown E da validação. Europa completa (UE-27, EFTA,\n// microestados, Bálcãs, Leste, transcontinentais e dependências), seguida dos\n// não-europeus que já viviam no PAIS_CANON — tirá-los daqui trancaria fora da\n// lista os registos legados de Brasil / EUA / etc.\nconst PAISES_EUROPA = [\n  'Alemanha','Áustria','Bélgica','Bulgária','Chipre','Croácia','Dinamarca',\n  'Eslováquia','Eslovênia','Espanha','Estônia','Finlândia','França','Grécia',\n  'Hungria','Irlanda','Itália','Letônia','Lituânia','Luxemburgo','Malta',\n  'Países Baixos','Polônia','Portugal','República Tcheca','Romênia','Suécia',\n  'Islândia','Liechtenstein','Noruega','Reino Unido','Suíça',\n  'Andorra','Cidade do Vaticano','Mônaco','San Marino',\n  'Albânia','Bósnia e Herzegovina','Kosovo','Macedônia do Norte','Montenegro','Sérvia',\n  'Bielorrússia','Moldávia','Rússia','Ucrânia',\n  'Armênia','Azerbaijão','Cazaquistão','Geórgia','Turquia',\n  'Gibraltar','Groenlândia','Guernsey','Ilha de Man','Ilhas Faroe','Jersey'\n]\nconst PAISES_EXTRA = [\n  'Estados Unidos','Canadá','México','Brasil','Argentina','Chile','Colômbia',\n  'Israel','Emirados Árabes Unidos','Japão','China','Índia','Austrália',\n  'África do Sul','Angola','Moçambique'\n]\nconst PAISES_LISTA = PAISES_EUROPA.concat(PAISES_EXTRA)\nconst PAIS_OK = {}\nPAISES_LISTA.forEach(function(p){ PAIS_OK[norm(p)] = p })\nconst DL_PAIS_HTML = '<datalist id=\"dlpais\">'+PAISES_LISTA.map(function(p){ return '<option value=\"'+p+'\"></option>' }).join('')+'</datalist>'\n// Igual a paisCanon, mas TRAVADO: resolve o alias e depois EXIGE que o\n// resultado esteja na lista. Fora da lista devolve '' e quem chama decide.\n// Mantém a forma dupla \"França/Países Baixos\".\nfunction paisLock(s){\n  const raw = String(s==null?'':s).trim()\n  if(!raw) return ''\n  return raw.split('/').map(function(p){\n    const t = p.trim(); if(!t) return ''\n    const c = PAIS_CANON[norm(t)] || t\n    return PAIS_OK[norm(c)] || ''\n  }).filter(Boolean).join('/')\n}\n// Na gravação: trava quando reconhece, senão cai no comportamento antigo —\n// nunca apaga um país legado que esteja fora da lista.\nfunction paisLockSave(s){ return paisLock(s) || paisCanon(s) }\nfunction paisKey(r){ return norm(String(r.pais_sede||r.pais_lead||'').split('/')[0].trim()) }\n// Todos os paises de um lead: sede E lead, incluindo a forma dupla \"Franca/Holanda\".\n// Canonizados por paisCanon, para \"Italy\"/\"Italia\"/\"Italia\" contarem como um so\n// pais no filtro. paisKey() fica para o mapa/regiao, que so quer o pais primario.\nfunction paisesDoLead(r){\n  const out = []\n  ;[r.pais_sede, r.pais_lead].forEach(function(v){\n    String(v==null?'':v).split('/').forEach(function(p){\n      const t = paisCanon(p.trim())\n      if(t && out.indexOf(t)<0) out.push(t)\n    })\n  })\n  return out\n}\nfunction regiaoOf(r){ return REGIOES[PAIS_REGIAO[paisKey(r)] || 'outros'] }\n// Ordem canónica das regiões no filtro: Ibéria → França → centro → norte →\n// leste → resto. NÃO é alfabética de propósito — segue a leitura geográfica\n// oeste→leste do mapa, para o dropdown e o mapa contarem a mesma história.\nconst REG_ORDEM = ['iberia','franca','dach','benelux','italia','ukie','nordicos','baltico','polonia','europacentral','sudesteue','balcas','euoutros','americas','outros']\n// Fallback só para quem não tem país nenhum gravado: o campo Registro/Mercado\n// usa os mesmos recortes, por isso um lead com Mercado=DACH e país vazio ainda\n// aparece em DACH em vez de cair em \"Outros\".\nconst MERCADO_REGIAO = {'iberia':'iberia','dach':'dach','nordics':'nordicos','fr':'franca','it':'italia','benelux':'benelux','uk-ie':'ukie','baltico':'baltico','polonia':'polonia','europa central':'europacentral','sudeste ue':'sudesteue','balcas':'balcas','eu outros':'euoutros'}\n// TODAS as regiões de um lead (sede E lead), não só a primária: um lead\n// PT com sede na Alemanha conta em Ibéria e em DACH. regiaoOf() continua a\n// dar UMA região — é a cor do cabeçalho do card e o balde do mapa.\nfunction regioesDoLead(r){\n  const out = []\n  paisesDoLead(r).forEach(function(p){ const k = PAIS_REGIAO[norm(p)] || 'outros'; if(out.indexOf(k)<0) out.push(k) })\n  if(!out.length) out.push(MERCADO_REGIAO[norm(r.mercado)] || 'outros')\n  return out\n}\n// ── Logomarca: bandeira da União Europeia ────────────────────────────\n// SVG e não o emoji 🇪🇺: a esta escala o emoji fica à mercê da fonte do sistema\n// (no Windows nem renderiza como bandeira) e não aceita canto arredondado nem\n// sombra. Geometria oficial: campo azul 3:2, círculo de 12 estrelas de raio\n// 1/3 da altura, cada estrela inscrita num círculo de raio 1/18 da altura,\n// todas com uma ponta para cima. Gerado uma vez no load, não por render.\nconst EU_FLAG = (function(){\n  const W = 900, H = 600, cx = W/2, cy = H/2\n  const anel = H/3, R = H/18, r = R*0.381966   // 0.381966 = cos72°/cos36°\n  let estrelas = ''\n  for(let s=0; s<12; s++){\n    const a = -Math.PI/2 + s*Math.PI/6         // começa nas 12h, de 30 em 30°\n    const ex = cx + anel*Math.cos(a), ey = cy + anel*Math.sin(a)\n    let pts = ''\n    for(let i=0; i<10; i++){\n      const rad = (i%2===0) ? R : r\n      const ang = -Math.PI/2 + i*Math.PI/5\n      pts += (i?' ':'') + (ex+rad*Math.cos(ang)).toFixed(2) + ',' + (ey+rad*Math.sin(ang)).toFixed(2)\n    }\n    estrelas += `<polygon points=\"${pts}\"/>`\n  }\n  return `<svg viewBox=\"0 0 ${W} ${H}\" preserveAspectRatio=\"xMidYMid slice\" aria-hidden=\"true\"><rect width=\"${W}\" height=\"${H}\" fill=\"#003399\"/><g fill=\"#FFCC00\">${estrelas}</g></svg>`\n})()\nfunction urgOf(r, today){\n  const dt = r.lembrete_data ? String(r.lembrete_data).slice(0,10) : ''\n  const exp = !!(r.lembrete_ativo && dt && dt < today)\n  const rem = !!(r.lembrete_ativo && dt && !exp)\n  const hot = !!r.lead_quente, eng = !!r.lead_engajado\n  return { exp, rem, hot, eng, cor: exp?'#dc2626' : hot?'#ea580c' : rem?'#f59e0b' : eng?'#4f46e5' : '' }\n}\nfunction slugEmp(s){ return norm(s).replace(/\\(.*?\\)/g,' ').replace(LEGAL_RE,' ').replace(/[^a-z0-9]+/g,'') }\n// `dominio` fixado a mao manda sempre. Sem ele, adivinhamos por nome+pais e\n// fixLogos() percorre os candidatos, caindo no monograma quando nenhum resolve.\nfunction limpaDominio(s){\n  return String(s||'').trim().toLowerCase().replace(/^https?:\\/\\//,'').replace(/^www\\./,'').replace(/\\/.*$/,'')\n}\nfunction dominioCandidatos(r){\n  const manual = limpaDominio(r.dominio)\n  if(manual) return [manual]\n  const base = slugEmp(r.empresa)\n  if(!base) return []\n  const w = norm(r.empresa).replace(/\\(.*?\\)/g,' ').trim().split(/\\s+/).filter(Boolean)\n  const first = w.length ? w[0].replace(/[^a-z0-9]+/g,'') : ''\n  const tld = TLD_PAIS[paisKey(r)] || ''\n  const c = [base+'.com']\n  if(tld) c.push(base+'.'+tld)\n  if(first && first!==base){ c.push(first+'.com'); if(tld) c.push(first+'.'+tld) }\n  return c\n}\nconst favicon = d => 'https://www.google.com/s2/favicons?domain='+encodeURIComponent(d)+'&sz=128'\nfunction monograma(s){\n  const w = norm(s).replace(/\\(.*?\\)/g,' ').split(/\\s+/).filter(Boolean)\n  if(!w.length) return '?'\n  return (w.length>1 ? (w[0][0]+w[1][0]) : w[0].slice(0,2)).toUpperCase()\n}\n// O Google devolve 128x128 quando tem o logo real e 16x16 (globo genérico)\n// quando não tem — é isso que usamos para detectar falha e avançar candidato.\nfunction fixLogos(d2){\n  // NOTA: nao usar d2.$ — o save do MCP reescreve-o para d2.$ (Element|null)\n  // e o .forEach estoura. d2.root + querySelectorAll e imune a isso.\n  const root = d2.root\n  if(!root || !root.querySelectorAll) return\n  Array.from(root.querySelectorAll('img.lgi')).forEach(img=>{\n    if(img.dataset.wired) return\n    img.dataset.wired='1'\n    const cands = String(img.dataset.cands||'').split('|').filter(Boolean)\n    const step = ()=>{\n      if(img.naturalWidth>=128){\n        img.classList.add('ok')\n        const wm = img.closest('.card') && img.closest('.card').querySelector('img.wmi')\n        if(wm && !wm.dataset.set){ wm.dataset.set='1'; wm.src=img.src; wm.classList.add('ok') }\n        return\n      }\n      const i = +(img.dataset.i||0)\n      if(i+1 < cands.length){ img.dataset.i=String(i+1); img.src=favicon(cands[i+1]) }\n    }\n    img.addEventListener('load', step)\n    img.addEventListener('error', step)\n    if(img.complete) step()\n  })\n}\n// ── Mapa da Europa ───────────────────────────────────────────────────────────\n// Geometria gerada de Natural Earth 1:50m (dominio publico) com projeccao\n// Lambert Conformal Conic (paralelos padrao 40/56, meridiano central 10E),\n// coordenadas inteiras num viewBox 1000x774 e simplificacao Douglas-Peucker\n// (tolerancia 1.3 unidades SVG). Apenas nacoes — nenhuma subdivisao.\n// `cx/cy` NAO e o centroide de area: e o ponto interior mais afastado da\n// fronteira (polylabel). Com centroide de area, paises concavos como a Italia\n// levam o marcador para dentro do mar. Chipre e Malta ficaram de fora porque\n// esticavam o enquadramento sem trazer leads.\nconst EUROPA = {\"w\":1000,\"h\":774,\"c\":[{\"i\":\"AL\",\"n\":\"Albânia\",\"r\":\"outros\",\"d\":\"M735,641 734,633 739,624 741,628 745,626 753,633 755,638 755,652 760,659 764,659 766,664 762,670 761,676 756,679 758,683 756,683 755,687 752,686 748,679 739,674 739,672 741,673 738,667 740,661 738,651 740,646 739,643 735,641Z\",\"cx\":751,\"cy\":666},{\"i\":\"DE\",\"n\":\"Alemanha\",\"r\":\"dach\",\"d\":\"M581,530 576,527 569,527 568,525 565,526 567,527 565,529 554,529 552,527 556,508 561,499 553,497 552,495 542,495 537,488 539,481 534,475 538,470 538,467 536,466 537,464 532,455 536,452 537,448 534,438 542,438 546,435 544,433 549,429 548,425 545,425 545,421 549,421 552,410 550,403 552,400 562,399 564,402 563,404 565,405 566,401 568,402 568,406 570,395 577,396 585,402 578,395 574,394 574,387 570,387 570,385 574,383 571,374 578,376 584,375 588,379 586,383 596,386 600,385 601,387 597,391 598,393 606,394 609,390 614,389 619,382 625,383 630,389 634,389 636,395 641,397 644,408 640,415 647,422 646,426 649,429 649,443 653,445 654,449 651,459 648,455 644,454 646,457 635,462 627,469 622,469 618,474 616,471 618,477 622,480 620,483 624,490 628,491 641,503 640,508 636,507 635,512 626,517 629,526 631,526 631,531 627,529 627,527 619,526 619,528 612,529 605,533 601,533 600,530 593,530 593,534 590,536 588,531 584,529 581,530ZM633,384 634,385 631,385 630,387 627,385 628,377 633,380 633,384ZM640,393 638,395 635,389 640,393ZM567,376 566,373 568,370 567,374 571,374 567,376ZM603,384 600,382 603,382 603,384Z\",\"cx\":586,\"cy\":443},{\"i\":\"BY\",\"n\":\"Bielorrússia\",\"r\":\"outros\",\"d\":\"M868,393 858,397 855,403 855,408 858,413 857,415 850,412 841,417 836,412 833,417 830,415 824,416 820,417 820,420 817,417 813,418 811,416 790,416 774,421 770,428 766,427 766,430 765,419 758,415 760,409 765,405 765,400 756,379 766,379 771,376 771,373 778,367 779,370 783,369 782,367 779,367 780,355 784,351 784,348 788,347 790,344 786,343 786,336 789,332 797,330 800,322 808,322 810,324 812,322 817,322 819,327 824,323 830,322 837,325 837,331 841,335 840,342 845,344 845,347 851,352 856,353 857,359 866,358 867,361 871,363 872,365 866,372 863,373 860,371 856,373 856,377 861,380 864,390 868,393Z\",\"cx\":819,\"cy\":378},{\"i\":\"BG\",\"n\":\"Bulgária\",\"r\":\"outros\",\"d\":\"M870,615 863,618 858,615 849,620 848,623 841,628 844,633 841,636 830,640 828,638 820,638 817,635 806,641 793,645 793,635 781,625 783,622 781,614 785,613 788,605 779,600 776,595 776,590 779,588 780,584 785,587 783,590 784,592 789,590 824,588 827,587 837,576 846,573 851,575 858,574 862,577 870,576 870,584 865,585 863,589 864,600 860,607 864,608 870,615Z\",\"cx\":810,\"cy\":613},{\"i\":\"BE\",\"n\":\"Bélgica\",\"r\":\"benelux\",\"d\":\"M511,446 514,444 518,444 519,446 522,445 524,449 528,449 532,453 529,459 537,464 536,466 538,467 538,470 535,474 533,473 530,476 530,486 526,487 522,482 517,480 517,472 513,476 508,476 507,468 502,468 501,464 497,463 495,457 491,458 488,455 488,450 498,445 500,448 504,447 505,449 511,446Z\",\"cx\":516,\"cy\":459},{\"i\":\"BA\",\"n\":\"Bósnia\",\"r\":\"outros\",\"d\":\"M728,578 725,589 733,595 728,597 733,602 733,606 730,605 729,607 725,607 727,612 724,611 721,614 721,618 719,619 721,627 719,629 709,622 705,622 706,620 700,615 699,611 683,599 680,590 674,586 674,576 677,576 682,580 685,575 691,573 695,576 711,574 717,575 720,579 728,578Z\",\"cx\":708,\"cy\":595},{\"i\":\"HR\",\"n\":\"Croácia\",\"r\":\"outros\",\"d\":\"M641,572 652,572 655,568 659,572 667,571 667,567 665,566 671,563 670,555 679,551 679,548 683,548 701,561 712,561 715,557 718,557 719,563 722,565 721,568 728,571 723,573 723,579 720,579 717,575 711,574 695,576 691,573 685,575 682,580 677,576 674,576 674,586 680,590 683,599 699,611 700,615 706,620 705,622 694,613 686,611 680,612 677,607 671,604 665,597 670,596 661,588 661,582 657,577 652,575 647,586 645,586 641,579 641,572ZM719,629 721,631 715,627 697,621 708,624 707,623 709,622 719,629ZM655,589 651,579 653,579 655,589ZM660,582 658,583 654,580 656,577 660,582ZM692,616 687,616 687,614 693,614 694,615 692,616ZM699,619 686,618 690,617 699,619Z\",\"cx\":683,\"cy\":563},{\"i\":\"DK\",\"n\":\"Dinamarca\",\"r\":\"nordicos\",\"d\":\"M584,375 578,376 571,374 571,363 565,359 565,343 566,337 572,339 574,334 576,333 578,335 579,329 577,328 573,335 569,336 567,334 571,326 581,325 587,316 594,313 592,317 594,319 591,328 591,337 597,339 598,344 595,346 592,344 590,353 586,354 588,355 582,361 583,367 581,371 584,372 584,375ZM618,354 618,358 614,360 617,365 613,367 613,375 610,376 608,367 603,367 599,356 603,356 605,351 608,352 609,356 610,351 614,347 619,349 618,354ZM595,359 597,369 593,371 586,367 586,361 595,359ZM604,374 609,375 609,378 605,379 600,376 600,373 604,374ZM650,369 645,368 645,363 650,366 650,369ZM596,377 595,375 599,368 596,377Z\",\"cx\":576,\"cy\":349},{\"i\":\"SK\",\"n\":\"Eslováquia\",\"r\":\"outros\",\"d\":\"M761,483 757,499 751,500 748,497 736,498 734,499 733,504 727,509 722,507 721,510 713,512 711,518 698,520 688,515 684,508 687,497 694,497 705,482 710,481 711,484 717,478 722,483 722,486 726,486 730,481 738,482 743,478 761,483Z\",\"cx\":712,\"cy\":497},{\"i\":\"SI\",\"n\":\"Eslovénia\",\"r\":\"outros\",\"d\":\"M682,548 679,548 679,551 670,555 671,563 665,566 667,567 667,571 659,572 655,568 652,572 641,573 641,571 645,569 640,565 641,562 639,561 641,558 637,557 641,550 654,552 659,547 666,547 671,544 674,545 675,541 679,541 682,548Z\",\"cx\":659,\"cy\":560},{\"i\":\"ES\",\"n\":\"Espanha\",\"r\":\"iberia\",\"d\":\"M406,604 406,606 411,608 411,613 412,611 431,623 441,624 442,621 444,621 452,625 453,631 457,630 462,634 468,633 471,635 475,633 481,634 482,637 479,639 481,641 479,646 462,656 443,659 439,662 438,664 440,667 435,668 417,689 418,699 424,707 410,714 410,717 404,725 405,729 389,731 377,744 373,741 367,743 359,740 339,738 334,741 325,741 321,747 319,746 319,748 316,748 309,743 307,734 305,733 305,730 310,727 306,728 300,717 298,719 291,717 291,708 296,702 301,701 303,698 298,690 307,679 304,677 301,665 309,666 313,660 311,656 316,653 317,638 329,632 330,629 326,626 327,622 323,619 317,618 316,620 312,620 306,617 301,618 301,615 303,614 302,611 291,613 292,609 296,606 294,606 296,598 292,598 295,594 293,594 291,588 294,585 308,584 309,581 318,579 327,586 345,588 368,597 380,597 381,599 387,601 390,600 399,605 406,604ZM475,690 480,692 474,700 468,698 467,694 463,696 462,694 462,692 469,688 476,686 475,690ZM494,690 486,687 487,685 493,686 494,690ZM445,706 441,706 444,702 448,702 445,706ZM447,711 444,711 444,709 447,711Z\",\"cx\":363,\"cy\":681},{\"i\":\"EE\",\"n\":\"Estónia\",\"r\":\"nordicos\",\"d\":\"M786,295 780,294 776,297 770,292 761,289 758,289 750,295 751,284 748,284 746,287 742,286 738,280 740,277 736,274 736,268 742,265 741,264 745,261 756,258 756,255 776,255 783,254 784,252 786,254 783,257 781,269 784,280 789,286 786,295ZM728,282 737,285 727,291 726,297 724,298 725,293 721,291 722,288 720,286 723,286 728,282ZM731,277 727,281 721,276 725,275 727,272 731,277ZM737,282 733,282 734,280 737,282Z\",\"cx\":764,\"cy\":272},{\"i\":\"FI\",\"n\":\"Finlândia\",\"r\":\"nordicos\",\"d\":\"M717,124 710,114 711,102 706,95 706,89 704,89 703,77 698,71 689,68 674,57 678,56 677,52 682,50 690,62 697,63 702,58 711,61 713,55 716,53 715,34 718,28 723,28 728,23 729,25 740,29 742,33 740,41 742,44 738,48 742,49 742,60 758,72 754,90 770,113 767,117 769,118 769,126 771,126 770,132 773,135 776,135 777,142 784,148 781,157 795,165 800,170 798,185 789,207 776,231 773,233 769,232 763,236 763,231 762,236 757,236 758,239 756,241 751,242 743,249 731,253 729,256 730,251 726,248 724,252 721,252 722,245 709,242 707,234 708,220 703,212 703,206 699,199 699,195 702,191 701,189 703,189 702,185 709,182 708,178 716,168 724,146 731,143 729,129 723,127 721,122 717,124ZM718,246 720,246 720,250 717,248 718,246ZM726,141 724,142 725,139 728,140 726,141ZM698,185 700,184 699,187 698,185ZM709,244 707,244 707,241 709,244Z\",\"cx\":750,\"cy\":191},{\"i\":\"FR\",\"n\":\"França\",\"r\":\"franca\",\"d\":\"M553,528 549,532 546,530 543,532 544,535 536,541 536,544 531,548 531,554 528,557 532,557 532,554 535,552 540,553 540,559 543,563 540,568 545,575 544,578 537,581 538,585 542,586 543,589 540,592 540,597 546,602 552,602 549,609 537,617 533,622 527,623 522,623 511,615 506,616 498,613 496,610 483,618 479,623 481,634 462,634 457,630 458,628 453,628 452,625 444,621 439,624 431,623 427,619 424,620 412,611 411,613 411,608 406,606 406,604 411,601 418,581 421,578 419,577 418,579 423,561 427,564 428,572 430,573 428,571 428,565 422,557 422,555 425,556 425,544 422,544 416,539 413,532 414,525 412,524 414,522 419,524 409,521 408,519 410,517 405,515 406,513 402,513 391,506 386,506 381,499 386,498 383,496 384,494 388,495 381,493 381,491 385,488 404,487 407,488 410,494 414,492 419,493 420,495 421,493 429,495 427,494 428,483 425,472 433,473 434,480 447,484 456,481 452,480 453,476 471,470 474,466 475,454 477,452 488,450 488,455 491,458 495,457 497,463 501,464 502,468 507,468 508,476 513,476 517,472 517,480 522,482 526,487 536,487 540,490 542,495 552,495 553,497 561,499 553,518 553,528ZM579,631 580,645 574,661 568,656 570,654 567,653 568,650 565,649 567,647 565,639 567,636 577,632 577,626 579,627 579,631ZM423,553 422,555 420,549 423,553Z\",\"cx\":478,\"cy\":531},{\"i\":\"GR\",\"n\":\"Grécia\",\"r\":\"outros\",\"d\":\"M845,626 851,630 851,633 847,636 849,642 845,648 842,646 829,645 825,649 819,648 814,654 809,655 812,658 812,661 818,662 821,665 811,662 810,664 815,667 815,670 809,666 805,666 806,669 810,671 806,672 804,667 796,664 796,660 792,663 793,673 808,689 805,691 805,688 801,687 799,689 804,693 796,698 808,700 811,703 822,706 825,715 825,719 816,712 808,716 811,722 815,722 817,725 811,728 804,724 815,747 806,741 804,742 804,749 802,749 801,744 795,738 793,738 792,745 789,742 785,736 787,731 776,723 776,721 779,715 784,715 786,711 803,716 809,711 795,707 794,709 780,712 777,709 777,711 774,712 771,706 767,703 767,701 772,701 773,699 765,699 752,686 755,687 756,683 758,683 756,679 761,676 762,670 765,667 766,664 764,660 771,657 774,658 779,651 787,650 791,648 791,645 806,641 817,635 820,638 828,638 830,640 841,636 844,634 841,628 845,626ZM830,765 836,762 835,765 840,767 846,764 860,764 864,762 866,767 874,761 873,768 849,774 847,771 826,771 826,765 828,765 828,762 830,765ZM810,693 814,697 822,697 827,706 833,707 833,710 826,709 822,703 818,704 806,696 801,697 807,692 810,693ZM857,676 862,681 860,681 860,683 855,683 856,679 854,679 853,682 849,681 849,678 857,676ZM897,742 895,742 894,737 901,730 901,738 897,742ZM857,700 856,702 853,700 855,698 852,695 854,692 857,693 857,700Z\",\"cx\":778,\"cy\":681},{\"i\":\"NL\",\"n\":\"Holanda\",\"r\":\"benelux\",\"d\":\"M534,461 529,459 532,453 528,449 524,449 522,445 519,446 518,444 514,444 511,446 501,442 507,441 512,444 508,441 511,441 508,436 516,426 520,413 524,413 537,404 547,404 552,408 549,421 545,421 545,425 548,425 549,429 544,433 546,435 542,438 534,438 537,445 536,452 532,454 534,456 534,461ZM511,446 505,449 504,447 500,448 499,445 511,446ZM508,438 509,440 505,439 508,438ZM522,411 520,411 522,408 522,411ZM528,404 526,404 531,403 528,404Z\",\"cx\":531,\"cy\":425},{\"i\":\"HU\",\"n\":\"Hungria\",\"r\":\"outros\",\"d\":\"M757,498 764,503 769,504 769,507 758,517 759,520 749,546 745,546 743,549 738,550 728,550 723,555 721,554 719,557 715,557 712,561 701,561 682,548 679,541 676,541 681,537 680,529 683,526 679,523 688,522 687,518 689,515 698,520 711,518 713,512 721,510 722,507 727,509 733,504 734,499 736,498 748,497 751,500 757,498Z\",\"cx\":731,\"cy\":529},{\"i\":\"IE\",\"n\":\"Irlanda\",\"r\":\"ukie\",\"d\":\"M379,346 373,352 369,352 370,355 364,357 369,365 373,366 378,361 381,369 387,371 384,372 385,382 383,396 375,405 377,408 369,408 368,406 368,408 361,407 354,411 348,409 349,411 347,413 342,414 328,413 333,410 325,409 333,406 323,405 323,403 331,399 325,398 325,396 329,395 333,397 333,393 348,392 345,389 344,391 333,390 339,387 343,381 349,380 342,378 341,375 338,375 339,374 335,372 336,369 341,370 339,369 339,366 344,366 344,364 340,364 342,360 341,357 339,357 340,355 359,360 358,358 366,353 362,353 358,350 364,347 366,342 375,342 374,347 376,345 375,343 379,342 379,340 382,344 379,346ZM340,362 336,360 340,360 340,362Z\",\"cx\":366,\"cy\":385},{\"i\":\"IS\",\"n\":\"Islândia\",\"r\":\"nordicos\",\"d\":\"M360,89 369,88 363,92 364,95 366,95 363,101 367,101 365,106 370,106 372,110 369,112 369,120 366,120 363,125 360,124 357,129 352,131 346,130 333,135 321,134 317,138 316,136 314,138 306,135 298,129 296,125 298,123 295,123 293,117 289,118 278,114 280,108 281,111 287,111 291,107 294,107 288,106 295,101 290,102 288,100 290,97 289,95 277,91 276,87 288,88 296,92 298,89 295,90 292,87 300,84 294,78 282,77 278,73 281,71 284,74 284,69 289,73 291,72 288,71 287,68 290,69 289,64 292,66 292,63 294,63 296,66 295,69 298,69 297,72 299,72 301,69 298,64 302,64 298,60 302,60 305,63 309,74 307,74 309,77 307,80 304,79 304,90 311,84 314,86 319,76 323,86 326,80 332,79 334,91 336,82 340,84 341,88 346,84 348,87 352,87 354,80 359,81 360,89Z\",\"cx\":319,\"cy\":110},{\"i\":\"IT\",\"n\":\"Itália\",\"r\":\"italia\",\"d\":\"M543,563 555,564 560,559 559,557 565,553 564,556 570,561 569,563 571,566 573,566 577,552 579,552 580,556 586,555 589,558 588,551 594,551 594,544 602,546 605,542 612,542 619,539 618,541 623,548 641,550 637,557 641,558 639,561 641,562 640,565 645,569 643,570 641,566 639,568 634,567 632,570 621,574 621,578 625,584 621,589 625,602 642,613 650,631 664,644 673,647 685,646 686,648 681,654 683,656 702,662 708,667 716,670 723,675 726,681 724,687 720,685 715,678 709,678 704,674 701,674 696,683 695,691 705,698 707,706 698,711 698,718 690,731 684,731 683,729 683,724 687,719 686,716 691,713 691,709 681,687 668,683 666,674 658,676 660,673 657,671 653,672 646,662 637,663 629,658 613,641 605,639 606,636 599,630 599,628 595,627 596,623 590,606 577,598 569,596 565,598 558,607 549,609 552,602 546,602 540,597 540,592 543,589 542,586 538,585 537,581 544,578 545,574 540,568 543,563ZM681,725 674,742 678,750 676,759 667,758 663,753 654,751 642,743 633,742 629,738 630,731 633,729 637,732 639,729 644,728 645,730 652,732 682,724 681,725ZM581,672 584,681 582,685 583,690 580,708 572,707 569,714 567,714 561,707 563,692 561,692 562,684 561,679 558,676 558,671 564,672 575,663 581,668 581,672ZM594,629 594,632 589,632 589,630 594,629ZM562,710 561,712 560,709 562,710Z\",\"cx\":596,\"cy\":582},{\"i\":\"XK\",\"n\":\"Kosovo\",\"r\":\"outros\",\"d\":\"M748,619 752,614 751,611 754,609 765,617 765,619 771,619 768,627 769,629 766,630 765,633 763,631 757,634 757,639 755,639 753,633 745,626 744,621 748,619Z\",\"cx\":757,\"cy\":624},{\"i\":\"LV\",\"n\":\"Letónia\",\"r\":\"outros\",\"d\":\"M786,336 761,325 759,328 754,329 730,330 719,339 717,323 719,321 722,306 731,302 742,314 746,315 753,310 750,295 758,289 770,292 776,297 780,294 788,295 788,297 793,300 792,308 795,308 800,314 802,322 800,322 797,330 789,332 786,336Z\",\"cx\":776,\"cy\":313},{\"i\":\"LT\",\"n\":\"Lituânia\",\"r\":\"outros\",\"d\":\"M745,372 743,368 743,360 740,358 734,359 724,356 719,339 725,333 730,330 759,328 763,325 767,329 773,329 783,336 786,336 786,343 790,344 788,347 784,348 784,351 780,355 779,367 782,367 782,370 779,370 778,367 771,373 771,376 766,379 761,378 757,380 753,374 747,371 745,372Z\",\"cx\":760,\"cy\":349},{\"i\":\"LU\",\"n\":\"Luxemburgo\",\"r\":\"benelux\",\"d\":\"M535,474 534,476 539,481 539,484 537,488 531,488 529,486 531,484 529,478 533,473 535,474Z\",\"cx\":534,\"cy\":483},{\"i\":\"MK\",\"n\":\"Macedónia do Norte\",\"r\":\"outros\",\"d\":\"M769,629 781,625 789,630 793,635 793,645 787,650 779,651 774,658 771,657 764,660 762,658 760,659 755,652 754,639 757,639 757,634 763,631 765,633 766,630 769,629Z\",\"cx\":768,\"cy\":645},{\"i\":\"MD\",\"n\":\"Moldávia\",\"r\":\"outros\",\"d\":\"M820,490 823,486 832,482 846,487 850,485 854,489 856,487 859,498 865,500 867,506 872,508 875,514 878,515 878,517 875,518 872,516 871,518 866,518 866,520 865,517 861,519 864,525 861,534 859,535 860,540 856,542 853,540 854,537 851,529 851,521 846,511 838,505 826,491 822,489 820,490Z\",\"cx\":847,\"cy\":498},{\"i\":\"ME\",\"n\":\"Montenegro\",\"r\":\"outros\",\"d\":\"M729,607 735,613 748,618 744,621 745,626 741,628 739,624 737,626 734,633 735,641 719,629 721,627 719,624 721,614 724,611 727,612 725,607 729,607Z\",\"cx\":730,\"cy\":621},{\"i\":\"NO\",\"n\":\"Noruega\",\"r\":\"nordicos\",\"d\":\"M674,57 670,58 673,60 672,72 669,73 657,70 655,84 650,81 645,87 644,93 641,96 644,106 636,119 636,125 629,128 629,147 622,163 626,165 627,173 626,175 618,174 614,176 609,185 607,192 610,198 608,200 611,214 610,226 616,232 617,238 616,241 612,241 615,256 613,263 608,267 606,273 606,287 604,288 602,283 597,282 594,277 594,269 590,285 586,287 582,283 584,286 571,301 558,306 553,306 552,303 551,305 548,304 550,301 546,301 539,295 537,290 539,284 544,287 547,285 544,286 542,280 548,273 538,278 536,281 534,281 534,274 536,270 541,270 546,267 541,266 545,259 550,254 550,260 551,255 555,252 548,254 534,270 535,261 541,260 537,258 535,253 541,248 537,250 535,249 534,244 536,239 555,239 556,243 556,240 562,237 560,237 561,232 559,238 554,238 552,235 549,239 538,239 535,235 535,231 539,230 535,227 535,221 541,221 546,224 554,223 538,220 538,215 540,216 542,212 546,210 547,212 553,211 554,210 548,211 551,206 564,208 562,206 568,203 554,204 557,199 563,196 568,196 574,202 569,195 570,192 574,191 571,189 573,185 579,185 578,188 584,185 588,190 595,188 594,185 601,181 599,179 600,175 596,178 598,180 591,186 587,187 585,183 583,184 584,179 593,167 602,160 603,158 600,160 600,156 608,150 611,152 615,146 609,150 607,148 608,141 612,134 615,133 613,129 621,127 624,124 616,126 615,119 620,113 623,113 620,112 623,106 635,103 626,102 630,95 636,100 637,96 632,93 633,90 629,93 630,86 634,87 635,85 632,84 639,80 641,87 642,82 639,78 643,75 647,76 651,74 643,74 642,71 649,65 650,58 654,57 654,49 656,52 660,52 657,48 660,47 661,42 665,40 665,49 667,38 670,37 669,51 672,46 674,46 671,38 674,36 676,37 676,34 682,38 683,37 676,29 688,24 690,30 693,32 692,26 698,14 696,11 699,6 703,9 708,8 705,16 706,27 711,9 714,5 716,17 719,14 719,7 721,6 718,4 720,0 727,1 725,9 727,8 729,18 730,3 734,3 738,6 741,4 743,8 746,7 750,10 746,17 734,19 742,22 743,27 747,26 747,23 749,26 751,23 754,26 754,29 748,28 749,32 744,37 742,44 740,42 742,36 740,29 727,23 723,28 718,28 715,34 716,53 713,55 711,61 702,58 697,63 690,62 682,50 677,52 678,56 674,57ZM636,72 638,65 641,65 642,70 639,72 638,76 623,81 626,76 630,75 633,71 632,61 637,55 635,61 637,68 636,72ZM648,47 653,51 652,56 648,56 646,61 643,59 645,57 644,53 647,52 646,49 648,47ZM660,35 663,36 662,40 659,42 658,46 653,48 652,46 654,42 657,42 656,39 659,36 659,31 660,35ZM630,64 632,70 624,71 625,67 629,65 629,62 630,64ZM690,13 687,20 683,21 680,19 690,13Z\",\"cx\":584,\"cy\":224},{\"i\":\"PL\",\"n\":\"Polónia\",\"r\":\"outros\",\"d\":\"M766,430 768,435 775,442 774,445 776,450 772,453 761,472 763,478 762,481 765,484 753,482 751,479 747,478 740,479 738,482 730,481 726,486 722,486 722,483 717,478 711,484 704,474 696,471 694,473 690,470 692,469 692,466 688,468 684,465 680,465 682,469 678,472 671,466 673,461 668,462 658,458 658,455 654,454 654,457 652,458 654,449 653,445 649,443 649,429 646,426 646,420 640,415 644,408 641,397 645,399 645,395 640,393 664,384 668,378 687,370 695,372 696,373 691,371 693,376 697,379 706,376 725,375 747,371 754,375 765,400 765,405 760,409 758,415 765,419 766,430Z\",\"cx\":711,\"cy\":424},{\"i\":\"PT\",\"n\":\"Portugal\",\"r\":\"iberia\",\"d\":\"M293,613 296,611 302,611 303,614 301,615 301,618 306,617 312,620 316,620 317,618 323,619 327,622 326,626 330,631 317,638 316,653 311,656 313,660 309,666 301,665 304,677 307,679 298,690 303,698 301,701 296,702 291,708 291,717 281,719 271,714 263,714 269,706 273,685 276,686 273,683 268,684 268,679 271,679 273,675 278,672 270,678 266,678 265,674 270,664 282,650 282,647 288,638 290,621 292,618 290,615 293,613ZM3,599 9,601 9,604 1,600 0,596 2,596 3,599ZM4,620 2,620 2,618 4,620Z\",\"cx\":302,\"cy\":644},{\"i\":\"GB\",\"n\":\"Reino Unido\",\"r\":\"ukie\",\"d\":\"M421,430 412,433 404,427 402,428 401,427 403,426 399,423 392,424 389,421 391,416 404,413 408,408 408,399 400,400 406,394 419,392 421,395 422,391 426,394 424,393 423,388 425,385 424,382 428,376 422,374 420,366 422,362 428,359 422,358 417,361 414,359 410,360 406,357 405,360 402,355 411,344 409,339 411,334 414,335 411,332 412,330 406,335 407,330 410,328 404,332 400,344 397,344 402,336 402,330 410,317 402,320 399,315 404,313 403,311 407,308 406,300 409,299 407,296 410,292 415,293 413,288 414,285 418,285 420,278 423,281 441,281 440,287 428,294 429,298 425,301 435,300 438,302 449,303 452,308 441,325 430,329 438,331 436,333 433,333 430,336 424,333 424,335 432,338 437,337 447,349 449,368 456,373 462,382 460,386 463,393 458,390 453,390 458,391 463,396 465,403 460,408 463,410 466,408 473,408 481,415 478,427 473,430 472,433 466,434 468,435 466,438 461,439 474,443 473,447 467,451 459,453 448,451 443,452 435,448 436,449 433,451 426,450 427,452 421,452 414,448 408,449 403,456 397,452 388,453 383,457 376,455 377,452 384,450 400,435 415,437 425,428 421,430ZM386,370 381,369 378,361 373,366 369,365 364,357 370,355 368,353 373,352 379,346 392,346 395,356 393,359 397,360 397,364 395,362 393,368 388,371 386,370ZM406,280 400,285 402,285 402,287 395,291 393,290 396,288 394,286 396,281 399,283 399,280 405,277 406,280ZM402,298 402,303 407,305 402,309 402,305 399,305 398,301 395,299 397,296 401,295 402,298ZM467,244 469,247 465,258 466,251 462,248 465,248 464,244 466,242 467,244ZM401,324 395,323 398,320 396,317 399,316 402,321 401,324Z\",\"cx\":439,\"cy\":412},{\"i\":\"CZ\",\"n\":\"República Checa\",\"r\":\"outros\",\"d\":\"M709,481 703,484 694,497 687,497 685,503 679,500 672,501 662,497 656,497 656,502 654,502 653,506 644,506 628,491 624,490 620,483 622,480 618,477 616,471 618,474 622,469 627,469 635,462 646,457 644,454 648,455 651,459 654,457 654,454 658,455 658,458 668,462 673,461 671,466 678,472 682,469 680,465 684,465 688,468 692,466 692,469 690,470 694,473 696,471 704,474 709,481Z\",\"cx\":647,\"cy\":479},{\"i\":\"RO\",\"n\":\"Roménia\",\"r\":\"outros\",\"d\":\"M856,542 860,545 865,545 865,543 873,539 876,539 879,542 879,550 872,554 871,549 868,551 869,559 870,558 868,563 870,576 862,577 858,574 851,575 846,573 837,576 827,587 824,588 789,590 784,592 783,590 785,587 776,581 776,578 779,578 779,576 775,575 770,579 758,575 760,573 757,572 759,568 747,563 746,557 737,550 750,545 751,538 754,535 759,520 758,517 763,511 766,511 773,502 777,504 788,504 793,502 798,506 815,496 816,492 821,489 826,491 850,517 852,534 854,537 853,540 856,542Z\",\"cx\":808,\"cy\":546},{\"i\":\"SE\",\"n\":\"Suécia\",\"r\":\"nordicos\",\"d\":\"M603,285 605,288 608,267 611,266 614,261 615,252 612,241 616,241 617,238 616,232 610,226 611,214 608,200 610,198 607,192 609,185 614,176 618,174 626,175 627,173 627,167 622,163 629,147 629,128 636,125 636,119 644,106 641,96 644,93 645,87 650,81 655,84 657,70 669,73 672,72 673,60 670,58 674,57 689,68 698,71 703,77 704,89 706,89 706,95 711,102 710,114 717,124 708,126 707,128 704,125 703,127 700,126 700,132 697,134 698,136 694,137 695,141 693,139 695,143 692,151 697,160 693,165 692,172 682,183 679,182 677,188 674,188 675,189 670,193 672,196 669,199 666,197 668,204 665,207 662,206 665,212 663,218 665,224 662,223 661,226 664,245 669,248 672,247 679,253 679,256 684,259 685,264 675,273 682,273 676,281 666,290 657,291 664,291 665,293 662,295 664,299 664,306 662,308 664,315 662,320 662,332 657,345 644,345 644,348 641,348 638,351 640,359 638,362 622,362 623,354 617,344 620,345 619,340 622,339 612,324 609,314 607,313 607,308 604,305 604,300 601,299 600,285 603,285ZM691,305 688,308 690,315 683,325 684,322 681,318 681,312 689,303 691,305ZM665,341 664,342 663,340 663,335 668,318 670,318 665,341ZM692,303 690,303 693,301 694,302 692,303ZM682,270 681,271 681,269 683,269 682,270Z\",\"cx\":660,\"cy\":156},{\"i\":\"CH\",\"n\":\"Suíça\",\"r\":\"dach\",\"d\":\"M581,530 580,540 585,541 589,545 592,542 594,544 594,551 588,551 589,558 586,555 580,556 579,552 577,552 573,566 571,566 569,563 570,561 564,556 565,553 559,557 560,559 555,564 544,564 540,559 540,553 537,552 532,554 532,557 528,558 531,554 531,548 536,544 536,541 544,535 543,532 545,530 549,532 553,528 565,529 567,528 565,527 566,525 581,530Z\",\"cx\":553,\"cy\":545},{\"i\":\"RS\",\"n\":\"Sérvia\",\"r\":\"outros\",\"d\":\"M758,575 770,579 775,575 779,576 779,578 776,578 776,581 780,584 779,588 776,590 776,595 780,601 788,605 785,613 781,614 781,619 783,621 782,625 774,626 769,629 768,627 771,619 765,619 765,617 754,609 751,611 752,614 748,619 747,617 735,613 729,608 730,605 733,606 733,602 728,597 733,595 725,589 728,578 722,578 724,577 723,573 728,571 721,568 722,565 719,563 718,557 721,554 723,555 726,553 728,550 737,550 746,557 747,563 759,568 757,572 760,573 758,575Z\",\"cx\":751,\"cy\":592},{\"i\":\"UA\",\"n\":\"Ucrânia\",\"r\":\"outros\",\"d\":\"M985,466 976,469 975,474 973,474 969,480 956,487 949,501 951,498 951,494 949,493 946,503 951,509 945,505 942,507 940,505 929,505 928,509 923,508 913,513 903,512 902,511 905,508 897,507 909,505 911,502 905,504 896,493 900,498 901,504 897,505 896,503 894,507 887,510 883,526 878,531 875,531 878,541 873,539 865,543 865,545 860,545 856,542 860,540 859,535 861,534 864,525 861,519 865,517 866,520 866,518 871,518 872,516 875,518 878,517 878,515 875,514 872,508 867,506 865,500 859,498 856,487 854,489 850,485 846,487 832,482 823,486 816,492 815,496 798,506 793,502 788,504 777,504 773,502 769,506 769,504 764,503 757,498 761,483 765,484 762,481 763,478 761,472 772,453 776,450 774,445 775,442 768,435 766,427 770,428 774,421 790,416 811,416 813,418 817,417 820,420 820,417 824,416 830,415 833,417 836,412 841,417 850,412 857,415 858,413 855,408 855,403 858,397 868,393 871,394 874,391 874,387 881,386 883,383 891,381 903,390 900,394 904,401 914,399 919,401 927,413 930,410 941,412 949,404 962,411 963,407 975,408 977,406 979,408 987,409 990,407 993,411 993,416 990,421 995,422 992,427 1000,434 1000,443 988,448 983,456 985,466ZM906,512 908,513 902,514 898,511 900,513 906,512Z\",\"cx\":892,\"cy\":446},{\"i\":\"AT\",\"n\":\"Áustria\",\"r\":\"dach\",\"d\":\"M581,536 581,530 584,529 588,531 590,536 593,534 593,530 600,530 601,533 605,533 612,529 619,528 619,526 627,527 627,529 631,531 631,526 629,526 626,517 635,512 636,507 640,508 640,503 644,506 653,506 654,502 656,502 656,497 662,497 672,501 683,501 685,503 684,508 689,515 687,518 688,522 679,523 683,526 680,529 681,537 674,542 674,545 671,544 666,547 659,547 654,552 623,548 618,541 619,539 612,542 605,542 602,546 594,545 593,542 589,545 581,540 581,536Z\",\"cx\":654,\"cy\":527}]};\nconst REG_COR = {iberia:'#12805A',franca:'#2C5FA8',dach:'#5A4A9C',benelux:'#8A6D1F',italia:'#A33B4C',ukie:'#3E4C6B',nordicos:'#0E7C8C',americas:'#93357A',outros:'#5B6675'}\nconst PIE_COR = ['#4f46e5','#0d9488','#ea580c','#0284c7','#db2777','#65a30d','#7c3aed','#dc2626','#0891b2','#a16207']\nconst escM = s => (s==null?'':String(s)).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/\"/g,'&quot;')\n// indice por nome normalizado — liga directamente a pais_sede / pais_lead\nconst EU_IDX = {}\nEUROPA.c.forEach(c=>{ EU_IDX[norm(c.n)] = c })\n;[['paises baixos','Holanda'],['uk','Reino Unido'],['inglaterra','Reino Unido'],['gra-bretanha','Reino Unido'],['chequia','República Checa'],['republica tcheca','República Checa'],['tchequia','República Checa'],['macedonia','Macedónia do Norte'],['bosnia e herzegovina','Bósnia'],['bosnia-herzegovina','Bósnia'],['servia','Sérvia']].forEach(p=>{ const c=EU_IDX[norm(p[1])]; if(c) EU_IDX[p[0]]=c })\n\nfunction urgRankMapa(r, today){\n  const dt = r.lembrete_data ? String(r.lembrete_data).slice(0,10) : ''\n  if(r.lembrete_ativo && dt && dt < today) return 3\n  if(r.lead_quente) return 2\n  if(r.lembrete_ativo && dt) return 1\n  return 0\n}\nconst URG_CLS = ['ok','rem','hot','exp']\nconst radDe = n => Math.min(30, 11 + Math.sqrt(n)*3.4)\n\n// separa os leads visiveis entre paises do mapa e o resto do mundo\nfunction agrupaPorPais(rows, campo){\n  const dentro = {}, fora = {}\n  rows.forEach(r=>{\n    const raw = String(r[campo]||'').split('/')[0].trim()\n    const c = EU_IDX[norm(raw)]\n    if(c){ (dentro[c.i] = dentro[c.i] || []).push(r) }\n    else { const k = raw || 'Sem país'; (fora[k] = fora[k] || []).push(r) }\n  })\n  return { dentro, fora }\n}\n\nfunction mapaSvg(dentro, today){\n  const paths = EUROPA.c.map(c=>{\n    const list = dentro[c.i]\n    return `<path class=\"pais${list?' on':''}\"${list?` style=\"fill:${REG_COR[c.r]}\"`:''} d=\"${c.d}\"><title>${escM(c.n)}${list?' — '+list.length+' lead(s)':''}</title></path>`\n  }).join('')\n  const isos = Object.keys(dentro)\n  const labs = isos.map(iso=>{\n    const c = EU_IDX[norm((EUROPA.c.find(x=>x.i===iso)||{}).n||'')]; if(!c) return ''\n    return `<text class=\"plab\" x=\"${c.cx}\" y=\"${(c.cy + radDe(dentro[iso].length) + 15).toFixed(1)}\">${escM(c.n)}</text>`\n  }).join('')\n  const mks = isos.map(iso=>{\n    const c = EUROPA.c.find(x=>x.i===iso); if(!c) return ''\n    const list = dentro[iso], rad = radDe(list.length)\n    const pior = list.reduce((m,r)=>Math.max(m, urgRankMapa(r,today)), 0)\n    const tip = escM(c.n+' · '+list.length+' lead(s)\\n' + list.slice(0,12).map(r=>'• '+(r.empresa||'—')+' — '+(r.nome||'')).join('\\n') + (list.length>12?'\\n… +'+(list.length-12)+' mais':''))\n    return `<g class=\"mk ${URG_CLS[pior]}\" transform=\"translate(${c.cx},${c.cy})\"><title>${tip}</title><circle class=\"halo\" r=\"${(rad+7).toFixed(1)}\"></circle><circle class=\"dot\" r=\"${rad.toFixed(1)}\"></circle><text class=\"cnt\" y=\"${(rad*0.34).toFixed(1)}\" style=\"font-size:${(rad*0.86).toFixed(1)}px\">${list.length}</text></g>`\n  }).join('')\n  return `<svg viewBox=\"0 0 ${EUROPA.w} ${EUROPA.h}\" preserveAspectRatio=\"xMidYMid meet\" class=\"eusvg\">${paths}${mks}${labs}</svg>`\n}\n\n// donut dos leads cuja sede/pais nao esta no mapa da Europa\nfunction donutSvg(itens){\n  const tot = itens.reduce((a,e)=>a+e.n, 0)\n  if(!tot) return ''\n  const R=58, r0=34, cx=68, cy=68\n  const centro = `<text x=\"${cx}\" y=\"${cy+2}\" class=\"dtot\">${tot}</text><text x=\"${cx}\" y=\"${cy+16}\" class=\"dlab\">leads</text>`\n  // uma unica fatia = circulo completo; o arco degenera, logo desenhamos um anel\n  if(itens.length===1) return `<svg viewBox=\"0 0 136 136\" class=\"donut\"><circle cx=\"${cx}\" cy=\"${cy}\" r=\"${(R+r0)/2}\" fill=\"none\" stroke=\"${itens[0].cor}\" stroke-width=\"${R-r0}\"></circle>${centro}</svg>`\n  let acc=0\n  const arcs = itens.map(e=>{\n    const a0 = acc/tot*Math.PI*2 - Math.PI/2; acc += e.n\n    const a1 = acc/tot*Math.PI*2 - Math.PI/2\n    const big = (a1-a0) > Math.PI ? 1 : 0\n    const pt = (rr,a)=>(cx+rr*Math.cos(a)).toFixed(1)+','+(cy+rr*Math.sin(a)).toFixed(1)\n    return `<path d=\"M${pt(R,a0)}A${R},${R} 0 ${big} 1 ${pt(R,a1)}L${pt(r0,a1)}A${r0},${r0} 0 ${big} 0 ${pt(r0,a0)}Z\" fill=\"${e.cor}\"><title>${escM(e.label)} — ${e.n}</title></path>`\n  }).join('')\n  return `<svg viewBox=\"0 0 136 136\" class=\"donut\">${arcs}${centro}</svg>`\n}\n// ── Import / Export de planilha (CSV + XLSX) ────────────────────────────────\nconst IO_FIELDS = [\n  ['_id','ID'],['empresa','Empresa'],['nome','Nome Completo'],['cargo','Cargo'],\n  ['etapa','Etapa'],['origem','Tamanho'],['tipo_venda','Tipo de Venda'],\n  ['linkedin','LinkedIn URL'],['email','Email'],\n  ['telefone','Telefone'],['dominio','Dominio da Empresa'],\n  ['tipo_ligacao','Tipo de Ligacao'],['via_quem','Via Quem'],['forca','Forca'],\n  ['status_empresa','Status na Empresa'],['cargo_confirmado','Cargo Confirmado'],\n  ['cargo_inicio','Inicio no Cargo'],['mercado','Registro / Mercado'],\n  ['pais_sede','Pais da Sede'],['cidade_sede','Cidade da Sede'],\n  ['filiais_europa','Filiais na Europa'],['pais_lead','Pais do Lead'],\n  ['cidade_lead','Cidade do Lead'],['lead_quente','Lead Quente'],\n  ['lead_engajado','Lead Engajado'],['lembrete_ativo','Lembrete Ativo'],\n  ['lembrete_data','Data do Lembrete'],['lembrete_nota','Nota do Lembrete'],\n  ['data_conexao','Data de Conexao'],['verificado_em','Verificado Em'],\n  ['interesses','Interesses Notaveis'],['abordagem','Abordagem'],['notas','Notas'],\n  ['etapa_desde','Etapa Desde'],['movimentacoes','Movimentacoes'],\n  ['fechado_em','Fechado Em'],['arquivado','Arquivado'],['arquivado_em','Arquivado Em'],\n  ['historico','Historico (JSON)']\n]\nconst IO_BOOL = ['lembrete_ativo','lead_quente','lead_engajado','cargo_confirmado','arquivado']\nconst IO_DATE = ['lembrete_data','data_conexao','verificado_em','etapa_desde','fechado_em','arquivado_em','cargo_inicio']\nconst IO_NUM = ['movimentacoes']\nconst IO_LIB = 'xlsx@0.18.5'\n// NFD decompoe acentos; o strip final remove as marcas combinantes junto com\n// pontuacao/espacos — assim \"Pais da Sede\" e \"País da Sede\" caem no mesmo token.\nfunction ioNorm(s){ return String(s==null?'':s).trim().toLowerCase().normalize('NFD').replace(/[^a-z0-9]+/g,'') }\nfunction ioDateOut(v){ if(!v) return ''; const s=String(v); return s.length>=10? s.slice(0,10) : s }\nfunction ioCellOut(r,key){\n  const v = r[key]\n  if(key==='historico') return (Array.isArray(v)&&v.length)? JSON.stringify(v) : ''\n  if(key==='filiais_europa') return Array.isArray(v)? v.join('; ') : (v||'')\n  if(IO_BOOL.indexOf(key)>=0) return v? 'Sim' : 'Nao'\n  if(IO_DATE.indexOf(key)>=0) return ioDateOut(v)\n  return v==null? '' : String(v)\n}\nfunction ioBoolIn(v){ const s=ioNorm(v); return s==='sim'||s==='s'||s==='true'||s==='1'||s==='x'||s==='yes'||s==='y'||s==='verdadeiro' }\nfunction ioDateIn(v){\n  const s=String(v==null?'':v).trim(); if(!s) return ''\n  let m=s.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/)\n  if(m) return m[1]+'-'+String(m[2]).padStart(2,'0')+'-'+String(m[3]).padStart(2,'0')\n  m=s.match(/^(\\d{1,2})[\\/.](\\d{1,2})[\\/.](\\d{4})/)\n  if(m) return m[3]+'-'+String(m[2]).padStart(2,'0')+'-'+String(m[1]).padStart(2,'0')\n  // AAAA-MM fica como esta: o campo cargo_inicio vem de um input type=month e\n  // e gravado com 7 caracteres. Expandir para -01 faria o round-trip mentir.\n  m=s.match(/^(\\d{4})-(\\d{1,2})$/)\n  if(m) return m[1]+'-'+String(m[2]).padStart(2,'0')\n  return s\n}\nfunction ioHeaderKeys(headerRow){\n  const byNorm={}\n  IO_FIELDS.forEach(function(f){ byNorm[ioNorm(f[1])]=f[0]; byNorm[ioNorm(f[0])]=f[0] })\n  const cols=[], unknown=[]\n  ;(headerRow||[]).forEach(function(h,i){\n    const raw=String(h==null?'':h).trim(); if(!raw) return\n    const k=byNorm[ioNorm(h)]\n    if(k) cols.push({i:i, key:k}); else unknown.push(raw)\n  })\n  return {cols:cols, unknown:unknown}\n}\nfunction ioAoa(recs){\n  const head=IO_FIELDS.map(function(f){ return f[1] })\n  const rows=recs.map(function(r){ return IO_FIELDS.map(function(f){ return ioCellOut(r,f[0]) }) })\n  return [head].concat(rows)\n}\nfunction ioDownload(blob, filename){\n  const url=URL.createObjectURL(blob)\n  const a=document.createElement('a')\n  a.href=url; a.download=filename\n  document.body.appendChild(a); a.click(); a.remove()\n  setTimeout(function(){ URL.revokeObjectURL(url) }, 4000)\n}\nfunction ioBuildPlan(aoa, existing, stageNames){\n  const hk=ioHeaderKeys(aoa[0]||[])\n  const cols=hk.cols\n  const byId={}, byLi={}, byMail={}, byNome={}\n  existing.forEach(function(r){\n    byId[String(r._id)]=r\n    if(r.linkedin) byLi[ioNorm(r.linkedin)]=r\n    if(r.email) byMail[ioNorm(r.email)]=r\n    byNome[ioNorm(r.empresa)+'|'+ioNorm(r.nome)]=r\n  })\n  const nowIso=new Date().toISOString()\n  const creates=[], updates=[], errors=[]\n  let semEtapa=0, iguais=0\n  for(let ri=1; ri<aoa.length; ri++){\n    const row=aoa[ri]||[]\n    let vazia=true\n    for(let c=0;c<row.length;c++){ if(String(row[c]==null?'':row[c]).trim()){ vazia=false; break } }\n    if(vazia) continue\n    const raw={}\n    cols.forEach(function(c){ raw[c.key]=row[c.i] })\n    const nome=String(raw.nome==null?'':raw.nome).trim()\n    const empresa=String(raw.empresa==null?'':raw.empresa).trim()\n    if(!nome && !empresa){ errors.push({linha:ri+1, quem:'—', motivo:'sem Empresa e sem Nome'}); continue }\n    // Etapa casa de forma tolerante (maiusculas/acentos/espacos) e e gravada\n    // sempre com o nome canonico da etapa — planilha editada a mao nao quebra.\n    const etapaIn=String(raw.etapa==null?'':raw.etapa).trim()\n    let etapa=''\n    if(etapaIn){\n      for(let s=0;s<stageNames.length;s++){ if(ioNorm(stageNames[s])===ioNorm(etapaIn)){ etapa=stageNames[s]; break } }\n      if(!etapa){ errors.push({linha:ri+1, quem:(empresa||nome), motivo:'etapa desconhecida: \"'+etapaIn+'\"'}); continue }\n    }\n    const payload={}\n    cols.forEach(function(c){\n      const k=c.key; if(k==='_id') return\n      const v=raw[k]; if(v===undefined) return\n      const s=String(v==null?'':v).trim()\n      if(k==='historico'){ if(s){ try{ const j=JSON.parse(s); if(Array.isArray(j)) payload.historico=j }catch(_){} } return }\n      if(k==='filiais_europa'){ payload.filiais_europa = s? s.split(/[;|]/).map(function(x){ return x.trim() }).filter(Boolean) : []; return }\n      if(k==='etapa'){ payload.etapa=etapa; return }\n      if(k==='pais_sede'||k==='pais_lead'){ payload[k]=paisCanon(s); return }\n      if(IO_BOOL.indexOf(k)>=0){ payload[k]=ioBoolIn(v); return }\n      if(IO_DATE.indexOf(k)>=0){ payload[k]=ioDateIn(v); return }\n      // Celula numerica vazia NAO vira 0 — senao importar zeraria o contador de\n      // movimentacoes de todo lead que ainda nao tem o campo.\n      if(IO_NUM.indexOf(k)>=0){ if(!s) return; const n=parseInt(s,10); if(!isNaN(n)) payload[k]=n; return }\n      payload[k]=s\n    })\n    const idIn=String(raw._id==null?'':raw._id).trim()\n    let prev=null\n    if(idIn && byId[idIn]) prev=byId[idIn]\n    if(!prev && payload.linkedin && byLi[ioNorm(payload.linkedin)]) prev=byLi[ioNorm(payload.linkedin)]\n    if(!prev && payload.email && byMail[ioNorm(payload.email)]) prev=byMail[ioNorm(payload.email)]\n    if(!prev && byNome[ioNorm(empresa)+'|'+ioNorm(nome)]) prev=byNome[ioNorm(empresa)+'|'+ioNorm(nome)]\n    if(prev){\n      const novaEtapa = etapa || prev.etapa || ''\n      const mudou = !!etapa && etapa!==(prev.etapa||'')\n      const upd={_id:prev._id}\n      Object.keys(payload).forEach(function(k){ upd[k]=payload[k] })\n      if(mudou){\n        upd.etapa=novaEtapa\n        upd.etapa_desde=nowIso\n        if(!payload.historico) upd.historico=(prev.historico||[]).concat([{de:prev.etapa||'', para:novaEtapa, em:nowIso}])\n        if(payload.movimentacoes===undefined) upd.movimentacoes=((prev.movimentacoes||0)+1)\n        if(novaEtapa==='Fechado' && !prev.fechado_em) upd.fechado_em=nowIso\n      }\n      // Reimportar um export intacto nao deve reescrever a tabela: comparo a\n      // celula da planilha com a celula que o export produziria para o registo\n      // actual — mesma serializacao nos dois lados, logo igual = nada mudou.\n      // Comparacao com trim nos dois lados: parte dos dados guardados tem espaco\n      // ou newline nas pontas, e isso sozinho nao justifica regravar a linha.\n      let same=true\n      const pk=Object.keys(payload)\n      for(let k=0;k<pk.length;k++){\n        if(String(ioCellOut(prev,pk[k])).trim()!==String(ioCellOut(payload,pk[k])).trim()){ same=false; break }\n      }\n      if(same && !mudou){ iguais++; continue }\n      updates.push({payload:upd, quem:(empresa||nome), etapa:novaEtapa, mudouEtapa:mudou})\n    } else {\n      if(!etapa) semEtapa++\n      const et = etapa || stageNames[0] || 'Lead Mapeado'\n      payload.etapa=et\n      payload.etapa_desde=nowIso\n      if(!payload.historico) payload.historico=[{de:'', para:et, em:nowIso}]\n      if(payload.movimentacoes===undefined) payload.movimentacoes=1\n      if(payload.arquivado===undefined) payload.arquivado=false\n      if(!payload.status_empresa) payload.status_empresa='Ativo'\n      creates.push({payload:payload, quem:(empresa||nome), etapa:et})\n    }\n  }\n  return {creates:creates, updates:updates, errors:errors, unknown:hk.unknown, colunas:cols.length, semEtapa:semEtapa, iguais:iguais}\n}\nexport default {\n  css: `\n  .kb{position:fixed\n;inset:0;height:100%;display:flex;flex-direction:column;background:#f1f5f9;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;color:#0f172a}\n  /* ── Cabeçalho: duas faixas finas (52+42 = 94px) ─────────────────────────\n     Antes era UMA faixa com 5 grelhas de chips: num MacBook 14\" (1512px)\n     embrulhava em 4 linhas e comia ~160px de altura do board. Agora:\n     faixa 1 = marca · busca · vista · acções; faixa 2 = filtros. */\n  .hdr{display:flex;flex-direction:column;background:#fff;border-bottom:1px solid #e2e8f0;box-shadow:0 1px 3px rgba(15,23,42,.04)}\n  .hrow{display:flex;align-items:center;gap:12px;padding:0 18px}\n  .hrow1{height:56px}\n  .hrow2{height:42px;gap:9px;border-top:1px solid #f1f5f9;background:#fbfcfe}\n  .brand{flex:0 0 auto;display:flex;align-items:center;gap:11px}\n  .blogo{flex:0 0 auto;width:60px;height:40px;border-radius:7px;overflow:hidden;box-shadow:0 1px 3px rgba(15,23,42,.22),inset 0 0 0 1px rgba(255,255,255,.14)}\n  .blogo svg{width:100%;height:100%;display:block}\n  .btxt{min-width:0;display:flex;flex-direction:column;gap:2px}\n  /* ui-serif = New York no macOS; Charter/Georgia cobrem o resto. O título é a\n     única coisa em serifa no ecrã — é o que o faz ler como marca e não como\n     mais um label da interface. */\n  .brand .t{font-family:ui-serif,'New York','Iowan Old Style',Charter,Georgia,serif;font-size:20px;font-weight:600;line-height:1.05;letter-spacing:-.005em;color:#0f172a}\n  .brand .s{display:flex;align-items:center;gap:6px;font-size:10.5px;color:#94a3b8;line-height:1.15;white-space:nowrap}\n\n  .search{flex:1 1 190px;max-width:300px;padding:7px 11px;border:1px solid #e2e8f0;border-radius:9px;background:#f8fafc;font-size:12.5px;color:#0f172a;outline:none;font-family:inherit}\n  .search:focus{border-color:#6366f1;background:#fff}\n  .hacts{flex:0 0 auto;display:flex;align-items:center;gap:8px}\n  /* min-width:0 + width: um <input> como flex item tem min-width:auto = a\n     largura intrínseca do campo (~180px), e o flex-basis de 82px não ganhava. */\n  .verifdays{flex:0 0 82px;width:82px;min-width:0;padding:7px 9px;border:1px solid #e2e8f0;border-radius:8px;background:#fff;font-size:12px;font-weight:600;color:#475569;outline:none;font-family:inherit}\n  .verifdays:focus{border-color:#6366f1}\n  .fpais{flex:0 0 auto;max-width:196px;height:30px;padding:0 8px;border:1px solid #e2e8f0;border-radius:9px;background:#fff;font-size:12px;font-weight:600;color:#334155;outline:none;cursor:pointer;font-family:inherit}\n  .fpais:focus{border-color:#6366f1}\n  .fgrp{display:flex;align-items:center;gap:6px;flex-wrap:nowrap}\n  .flabel{font-size:9px;font-weight:800;color:#94a3b8;letter-spacing:.06em;margin:0 2px 0 6px}\n  .chip{padding:6px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#fff;font-size:12px;font-weight:600;color:#475569;cursor:pointer;font-family:inherit}\n  .chip.on{background:#4f46e5;border-color:#4f46e5;color:#fff}\n  .btn-primary{padding:8px 15px;border:0;border-radius:9px;background:#16a34a;font-size:12.5px;font-weight:700;color:#fff;cursor:pointer;font-family:inherit;white-space:nowrap}\n  .btn-primary:hover{background:#15803d}\n  .ibtn{width:32px;height:32px;border:1px solid #e2e8f0;border-radius:9px;background:#fff;color:#475569;font-size:15px;font-weight:800;line-height:1;cursor:pointer;font-family:inherit}\n  .ibtn:hover{background:#f8fafc}\n  .ibtn.on{background:#eef2ff;border-color:#c7d2fe;color:#4338ca}\n  /* Segmentado (vista, ativos/arquivados): o par lê-se como UM controlo de\n     modo, e ocupa menos altura do que dois chips soltos. */\n  .seg{flex:0 0 auto;display:flex;gap:2px;padding:2px;background:#eef2f6;border:1px solid #e6ebf1;border-radius:9px}\n  .seg button{border:0;background:transparent;padding:5px 10px;border-radius:7px;font-size:11.5px;font-weight:700;color:#64748b;cursor:pointer;white-space:nowrap;font-family:inherit}\n  .seg button:hover{color:#334155}\n  .seg button.on{background:#fff;color:#0f172a;box-shadow:0 1px 2px rgba(15,23,42,.12)}\n  .seg button.on.arq{background:#0f766e;color:#fff}\n  .maptabs{margin-left:auto}\n  /* Filtros agrupados: Região e País ficam à vista (os recortes do dia-a-dia);\n     Tamanho/Venda/Flag/Verificação/No cargo vivem no popover \"Mais filtros\"\n     com contador, e o que estiver activo aparece como chip removível. */\n  .popwrap{position:relative;flex:0 0 auto}\n  .fbtn{display:inline-flex;align-items:center;gap:7px;height:30px;padding:0 10px;border:1px solid #e2e8f0;border-radius:9px;background:#fff;font-size:12px;font-weight:700;color:#334155;cursor:pointer;white-space:nowrap;font-family:inherit}\n  .fbtn:hover{border-color:#cbd5e1;background:#f8fafc}\n  .fbtn.on{background:#eef2ff;border-color:#c7d2fe;color:#312e81}\n  .fbtn .cv{font-size:8px;color:#94a3b8}\n  .fbtn .bdg{background:#4f46e5;color:#fff;border-radius:99px;font-size:9.5px;font-weight:800;padding:1.5px 6px;line-height:1.2}\n  .rsw{width:12px;height:12px;border-radius:4px;flex:0 0 auto;box-shadow:inset 0 0 0 1px rgba(15,23,42,.14)}\n  .rsw.all{background:linear-gradient(135deg,#94a3b8,#cbd5e1)}\n  .pop{position:absolute;top:calc(100% + 7px);left:0;z-index:40;background:#fff;border:1px solid #e2e8f0;border-radius:13px;box-shadow:0 18px 44px rgba(15,23,42,.18);padding:10px;animation:popin .12s ease}\n  @keyframes popin{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}\n  .popt{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:9.5px;font-weight:800;color:#0f172a;text-transform:uppercase;letter-spacing:.06em;padding:2px 4px 9px}\n  .popt span{font-size:10px;font-weight:700;color:#94a3b8;letter-spacing:.01em;text-transform:none}\n  .reggrid{display:grid;grid-template-columns:repeat(2,minmax(178px,1fr));gap:4px}\n  .regi{display:flex;align-items:center;gap:8px;padding:7px 9px;border:1px solid transparent;border-radius:9px;background:#f8fafc;cursor:pointer;text-align:left;font-family:inherit}\n  .regi.wide{grid-column:1/-1}\n  .regi:hover{background:#eef2ff}\n  .regi.on{background:#eef2ff;border-color:#c7d2fe}\n  .regi .rn{flex:1 1 auto;font-size:12px;font-weight:600;color:#334155;white-space:nowrap}\n  .regi .rc{font-size:11px;font-weight:800;color:#94a3b8}\n  .regi.on .rc{color:#4f46e5}\n  .popmais{width:min(560px,88vw);display:flex;flex-direction:column;gap:7px}\n  .popmais .fgrp{flex-wrap:wrap;padding:1px 3px}\n  .popf{display:flex;justify-content:flex-end;border-top:1px solid #f1f5f9;margin-top:2px;padding-top:8px}\n  .popmenu{left:auto;right:0;min-width:214px;display:flex;flex-direction:column;gap:2px;padding:8px}\n  .mi{display:flex;align-items:center;gap:9px;width:100%;padding:8px 10px;border:0;border-radius:9px;background:transparent;font-size:12.5px;font-weight:600;color:#334155;cursor:pointer;text-align:left;font-family:inherit}\n  .mi:hover{background:#f1f5f9}\n  .activef{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px;overflow-x:auto;scrollbar-width:none}\n  .activef::-webkit-scrollbar{display:none}\n  .afc{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 9px;border-radius:999px;background:#eef2ff;border:1px solid #c7d2fe;font-size:11px;font-weight:600;color:#3730a3;white-space:nowrap}\n  .afc b{font-weight:800;color:#4338ca}\n  .afc button{border:0;background:transparent;color:#6366f1;cursor:pointer;font-size:11px;line-height:1;padding:0;font-family:inherit}\n  .afclr{flex:0 0 auto;border:0;background:transparent;color:#64748b;font-size:11px;font-weight:700;cursor:pointer;white-space:nowrap;text-decoration:underline;font-family:inherit}\n  .afclr:hover{color:#0f172a}\n  .board{flex:1;display:flex;gap:14px;overflow-x:auto;overflow-y:hidden;padding:16px 20px}\n  .metrics{display:flex;gap:8px;padding:8px 18px;background:#fff;border-bottom:1px solid #e2e8f0;flex-wrap:wrap}\n  .metric{flex:0 0 auto;min-width:86px;padding:6px 12px;background:#f8fafc;border:1px solid #eef2f6;border-radius:9px}\n  .metric .mv{font-size:17px;font-weight:800;letter-spacing:-.02em;color:#0f172a}\n  .metric .ml{font-size:10px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;margin-top:1px}\n  .metric.hot .mv{color:#ea580c}\n  .metric.exp .mv{color:#dc2626}\n  .col{flex:0 0 372px;display:flex;flex-direction:column;background:#e9eef4;border-radius:14px;overflow:hidden;max-height:100%}\n  .col.over{outline:2px dashed #6366f1;outline-offset:-2px;background:#e6e9ff}\n  .colhead{display:flex;align-items:center;justify-content:space-between;padding:11px 14px;color:#fff;font-size:13px;font-weight:700}\n  .colhead .cnt{background:rgba(255,255,255,.28);border-radius:20px;padding:1px 9px;font-size:11px;font-weight:700}\n  .cards{flex:1;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:10px}\n  .empty{color:#94a3b8;font-size:11px;text-align:center;padding:16px 6px;border:1.5px dashed #cbd5e1;border-radius:10px}\n  .card{background:#fff;border:1px solid #e5e9f0;border-radius:11px;padding:0;overflow:hidden;flex:0 0 auto;position:relative;cursor:grab;touch-action:none;user-select:none;box-shadow:0 1px 2px rgba(15,23,42,.06);transition:box-shadow .12s,transform .12s}\n  .card:hover{box-shadow:0 6px 16px rgba(15,23,42,.12);transform:translateY(-1px)}\n  .card.dragging{opacity:.45;transform:rotate(1.5deg)}\n  .chead{position:relative;height:58px;display:flex;align-items:center;gap:8px;padding:0 11px;overflow:hidden}\n  /* watermark no CORPO, nao no header: a 44px o lado direito do header ja tem\n     bandeira + tamanho + icones de urgencia, e o logo virava borrao atras deles. */\n  .card .wmi{position:absolute;right:10px;bottom:9px;width:60px;height:60px;object-fit:contain;opacity:0;filter:grayscale(1);pointer-events:none;z-index:0}\n  /* mascara radial: muitos favicons tem fundo opaco e sem isto o watermark\n     aparece como um retangulo cinza em vez do glifo da marca. */\n  .card .wmi{-webkit-mask-image:radial-gradient(circle at 50% 50%,#000 42%,transparent 72%);mask-image:radial-gradient(circle at 50% 50%,#000 42%,transparent 72%)}\n  .card .wmi.ok{opacity:.13}\n  .cbody{position:relative;z-index:1}\n  .logorow{display:flex;align-items:flex-start;gap:10px}\n  .logoprev{position:relative;flex:0 0 46px;width:46px;height:46px;border-radius:10px;background:#eef2f6;border:1px solid #e2e8f0;display:flex;align-items:center;justify-content:center;overflow:hidden}\n  .logoprev .lgi{position:absolute;inset:5px;width:calc(100% - 10px);height:calc(100% - 10px);object-fit:contain;opacity:0;transition:opacity .15s}\n  .logoprev .lgi.ok{opacity:1}\n  .logoprev .lgi.ok ~ .mono{opacity:0}\n  .logoprev .mono{font-size:14px;font-weight:800;color:#64748b;transition:opacity .15s}\n  .logofields{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:5px}\n  .logohint{font-size:11px;color:#94a3b8;line-height:1.35}\n  .logohint b{color:#475569;font-weight:700}\n  /* ── vista Mapa ── */\n  .mapwrap{flex:1;display:flex;gap:14px;padding:14px 20px 18px;min-height:0}\n  .mapcard{flex:1 1 auto;min-width:0;background:#fff;border:1px solid #e5e9f0;border-radius:14px;display:flex;flex-direction:column;overflow:hidden}\n  .mapcard .ch{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 16px;border-bottom:1px solid #eef2f6;flex-wrap:wrap}\n  .mapcard .ch b{font-size:14px}\n  .mapcard .ch .hint{font-size:11px;color:#94a3b8}\n  .mapbox{flex:1;min-height:0;padding:6px 12px 12px;position:relative}\n  .eusvg{width:100%;height:100%;display:block}\n  .pais{fill:#e9eef4;stroke:#fff;stroke-width:1.1;transition:fill-opacity .15s}\n  .pais.on{fill-opacity:.22}\n  .pais.on:hover{fill-opacity:.38}\n  .plab{font:700 11px Inter,sans-serif;fill:#334155;text-anchor:middle;paint-order:stroke;stroke:#fff;stroke-width:3px}\n  .mk .halo{fill:currentColor;opacity:.15}\n  .mk .dot{fill:currentColor;stroke:#fff;stroke-width:2.5}\n  .mk .cnt{fill:#fff;font-weight:800;text-anchor:middle;font-family:Inter,sans-serif}\n  .mk.ok{color:#16a34a} .mk.rem{color:#f59e0b} .mk.hot{color:#ea580c} .mk.exp{color:#dc2626}\n  .mleg{position:absolute;left:20px;bottom:16px;background:rgba(255,255,255,.94);border:1px solid #e5e9f0;border-radius:10px;padding:9px 12px;display:flex;flex-direction:column;gap:5px;font-size:11px;color:#64748b;box-shadow:0 6px 18px rgba(15,23,42,.08)}\n  .mleg b{color:#0f172a;font-size:9px;text-transform:uppercase;letter-spacing:.06em}\n  .mleg .r{display:flex;align-items:center;gap:7px}\n  .mleg i{width:9px;height:9px;border-radius:50%}\n  .mapside{flex:0 0 322px;display:flex;flex-direction:column;gap:14px;min-height:0}\n  .sidecard{background:#fff;border:1px solid #e5e9f0;border-radius:14px;padding:14px 16px;display:flex;flex-direction:column;gap:10px;min-height:0}\n  .sidecard>b{font-size:13px}\n  .sidecard .hint{font-size:11px;color:#94a3b8;line-height:1.4}\n  .donut{width:136px;height:136px;display:block;margin:2px auto 0}\n  .dtot{font:800 20px Inter,sans-serif;fill:#0f172a;text-anchor:middle}\n  .dlab{font:700 8.5px Inter,sans-serif;fill:#94a3b8;text-anchor:middle;text-transform:uppercase;letter-spacing:.06em}\n  .plist{display:flex;flex-direction:column;gap:5px;overflow-y:auto}\n  .pitem{display:flex;align-items:center;gap:8px;font-size:12px;color:#334155}\n  .pitem i{width:9px;height:9px;border-radius:3px;flex:0 0 auto}\n  .pitem .pn{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .pitem .pv{font-weight:800;color:#0f172a}\n  .toplist{display:flex;flex-direction:column;gap:7px;overflow-y:auto}\n  .trow{display:flex;align-items:center;gap:8px;font-size:12px}\n  .trow .tn{flex:0 0 94px;color:#334155;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .trow .tbar{flex:1 1 auto;height:6px;background:#eef2f6;border-radius:99px;overflow:hidden}\n  .trow .tbar span{display:block;height:100%;border-radius:99px}\n  .trow .tv{flex:0 0 26px;text-align:right;font-weight:800;color:#0f172a}\n  .chead .lg{position:relative;flex:0 0 27px;width:27px;height:27px;border-radius:7px;background:rgba(255,255,255,.22);border:1px solid rgba(255,255,255,.3);display:flex;align-items:center;justify-content:center;overflow:hidden}\n  .chead .lg .mono{font-size:10.5px;font-weight:800;color:#fff;letter-spacing:-.02em;transition:opacity .15s}\n  .chead .lg .lgi{position:absolute;inset:3px;width:calc(100% - 6px);height:calc(100% - 6px);object-fit:contain;opacity:0;transition:opacity .15s;pointer-events:none}\n  .chead .lg .lgi.ok{opacity:1}\n  .chead .lg .lgi.ok ~ .mono{opacity:0}\n  .chead .emp{position:relative;flex:1 1 auto;min-width:0;font-size:14px;font-weight:800;color:#fff;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px rgba(0,0,0,.28)}\n  .chead .rgt{position:relative;flex:0 0 auto;display:flex;align-items:center;gap:5px}\n  .chead .cflag{font-size:29px;line-height:1}\n  .chead .szp{font-size:9.5px;font-weight:800;letter-spacing:.03em;padding:2.5px 6px;border-radius:5px;line-height:1.35}\n  .szp.ent{background:#fff;color:#0f172a}\n  .szp.mm{background:rgba(15,23,42,.28);color:#fff;border:1px solid rgba(255,255,255,.55)}\n  .chead .uic{display:flex;gap:2px;font-size:11.5px;line-height:1}\n  .chead .ubar{position:absolute;left:0;right:0;bottom:0;height:3px}\n  .cbody{padding:11px 13px 13px}\n  .c-emp{font-size:13px;font-weight:800}\n  .c-nome{font-size:14px;font-weight:700;color:#0f172a}\n  .c-cargo{font-size:12px;color:#94a3b8;margin-top:4px;line-height:1.35;max-height:34px;overflow:hidden}\n  .c-tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px}\n  .lflag{font-size:15px;vertical-align:middle}\n  .tag{font-size:10px;font-weight:700;padding:3.5px 8px;border-radius:6px}\n  .tag-org{background:#f1f5f9;color:#475569;border:1px solid #e2e8f0}\n  .tag-rem{background:#fde68a;color:#854d0e}\n  .tag-exp{background:#dc2626;color:#fff}\n  .tag-ver{background:#dcfce7;color:#166534;border:1px solid #bbf7d0}\n  .tag-saiu{background:#fee2e2;color:#991b1b;border:1px solid #fecaca}\n  .tag-trans{background:#fef9c3;color:#854d0e;border:1px solid #fde68a}\n  .tag-novo{background:#dbeafe;color:#1e40af;border:1px solid #bfdbfe}\n  .tag-mkt{background:#ccfbf1;color:#115e59;border:1px solid #99f6e4}\n  .tag-hot{background:#ea580c;color:#fff}\n  .card.hot{border-color:#fdba74;box-shadow:0 0 0 1px #fdba74,0 1px 2px rgba(15,23,42,.06)}\n  .chip-hot.on{background:#ea580c;border-color:#ea580c;color:#fff}\n  .hotbtn{width:100%;padding:11px 14px;border:1px solid #fed7aa;border-radius:10px;background:#fff7ed;color:#c2410c;font-weight:800;font-size:13px;cursor:pointer;text-align:left}\n  .hotbtn.on{background:#ea580c;border-color:#ea580c;color:#fff}\n  .tag-eng{background:#4f46e5;color:#fff}\n  .card.eng{border-color:#c7d2fe;box-shadow:0 0 0 1px #c7d2fe,0 1px 2px rgba(15,23,42,.06)}\n  .chip-eng.on{background:#4f46e5;border-color:#4f46e5;color:#fff}\n  .engbtn{width:100%;padding:11px 14px;border:1px solid #c7d2fe;border-radius:10px;background:#eef2ff;color:#4338ca;font-weight:800;font-size:13px;cursor:pointer;text-align:left}\n  .engbtn.on{background:#4f46e5;border-color:#4f46e5;color:#fff}\n  .metric.won .mv{color:#16a34a}\n  .cele{position:fixed;inset:0;z-index:100;pointer-events:none;overflow:hidden;display:flex;align-items:center;justify-content:center}\n  .cele-msg{background:rgba(15,23,42,.9);color:#fff;padding:20px 34px;border-radius:18px;font-size:26px;font-weight:800;letter-spacing:-.01em;box-shadow:0 24px 70px rgba(0,0,0,.45);animation:celepop .5s cubic-bezier(.2,1.5,.4,1)}\n  @keyframes celepop{0%{transform:scale(.5);opacity:0}60%{transform:scale(1.08)}100%{transform:scale(1);opacity:1}}\n  .conf{position:absolute;top:-24px;width:10px;height:15px;border-radius:2px;will-change:transform;animation:conffall linear forwards}\n  @keyframes conffall{0%{transform:translateY(-24px) rotate(0);opacity:1}100%{transform:translateY(105vh) rotate(720deg);opacity:.85}}\n  .scrim{position:fixed;inset:0;background:rgba(15,23,42,.45);backdrop-filter:blur(2px);display:flex;z-index:50}\n  .panel{margin-left:auto;width:min(860px,96vw);height:100%;background:#fff;display:flex;flex-direction:column;box-shadow:-8px 0 30px rgba(15,23,42,.25);animation:slidein .18s ease;transition:width .18s ease}\n  .panel.full{width:100vw}\n  @keyframes slidein{from{transform:translateX(30px);opacity:.6}to{transform:none;opacity:1}}\n  .p-top{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #eef2f6}\n  .p-top b{font-size:17px}\n  .x{width:30px;height:30px;border:0;border-radius:8px;background:#f1f5f9;cursor:pointer;font-size:14px;color:#475569}\n  .p-body{flex:1;overflow-y:auto;padding:18px 20px;display:flex;flex-direction:column;gap:12px}\n  .f{display:flex;flex-direction:column;gap:5px}\n  .frow{display:flex;gap:12px}\n  .frow .f{flex:1}\n  .f.fsm{flex:0 0 42%}\n  .f>span{font-size:10px;font-weight:800;color:#64748b;text-transform:uppercase;letter-spacing:.04em}\n  .fi{padding:9px 11px;border:1px solid #cbd5e1;border-radius:9px;background:#f8fafc;font-size:13px;color:#0f172a;outline:none;font-family:inherit}\n  .fi:focus{border-color:#6366f1;background:#fff}\n  .confcargo{display:inline-flex;align-items:center;gap:8px;padding:9px 12px;border:1px solid #cbd5e1;border-radius:9px;background:#f8fafc;font-size:13px;font-weight:700;color:#64748b;cursor:pointer;white-space:nowrap}\n  .confcargo .dot{width:16px;height:16px;border-radius:50%;border:2px solid #cbd5e1;box-sizing:border-box;flex:0 0 auto}\n  .confcargo.on{border-color:#16a34a;color:#166534;background:#f0fdf4}\n  .confcargo.on .dot{border-color:#16a34a;background:#16a34a;box-shadow:inset 0 0 0 3px #fff}\n  .ta{min-height:64px;resize:vertical}\n  .sect{font-size:10px;font-weight:800;color:#64748b;text-transform:uppercase;letter-spacing:.04em;margin-top:6px}\n  .schips{display:flex;flex-wrap:wrap;gap:6px}\n  .filwrap{display:flex;flex-direction:column;gap:8px}\n  .filchips{display:flex;flex-wrap:wrap;gap:6px}\n  .filchip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;background:#eef2ff;border:1px solid #c7d2fe;border-radius:999px;font-size:12px;font-weight:600;color:#3730a3}\n  .filchip button{border:0;background:transparent;color:#6366f1;cursor:pointer;font-size:12px;line-height:1;padding:0}\n  .filrow{display:flex;gap:8px}\n  .filrow .fi{flex:1}\n  .filadd{flex:0 0 auto;padding:9px 14px;border:0;border-radius:9px;background:#4f46e5;color:#fff;font-size:12px;font-weight:700;cursor:pointer}\n  .filempty{font-size:11px;color:#94a3b8;padding:2px 0}\n  .empwrap{position:relative}\n  .empsug{position:absolute;top:100%;left:0;right:0;z-index:30;background:#fff;border:1px solid #e2e8f0;border-radius:10px;box-shadow:0 12px 30px rgba(15,23,42,.16);margin-top:4px;max-height:220px;overflow-y:auto;padding:4px}\n  .empsug-i{display:flex;flex-direction:column;gap:1px;padding:8px 10px;border-radius:7px;cursor:pointer}\n  .empsug-i:hover{background:#eef2ff}\n  .es-n{font-size:13px;font-weight:700;color:#0f172a}\n  .es-g{font-size:11px;color:#94a3b8}\n  .schip{padding:6px 10px;border:1px solid #e2e8f0;border-radius:7px;background:#f1f5f9;font-size:11px;font-weight:600;color:#475569;cursor:pointer}\n  .tvbtns{display:flex;gap:8px;flex-wrap:wrap}\n  .tvb{padding:8px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#f1f5f9;font-size:12px;font-weight:600;color:#475569;cursor:pointer}\n  .tvb.on.spr{background:#0284c7;color:#fff;border-color:#0284c7}\n  .tvb.on.sui{background:#7c3aed;color:#fff;border-color:#7c3aed}\n  .tvb.on.aloc{background:#0d9488;color:#fff;border-color:#0d9488}\n  .tvb.on{background:#4f46e5;border-color:#4f46e5;color:#fff}\n  .confbox{margin:auto;width:min(440px,92vw);background:#fff;border-radius:16px;padding:22px;box-shadow:0 24px 70px rgba(15,23,42,.4);animation:celepop .3s ease}\n  .conft{font-size:17px;font-weight:800;margin-bottom:8px}\n  .confm{font-size:13px;color:#334155;line-height:1.5}\n  .conff{display:flex;gap:10px;justify-content:flex-end;margin-top:18px}\n  .remrow{display:flex;gap:8px}\n  .remtog{flex:0 0 auto;padding:9px 14px;border:1px solid #e2e8f0;border-radius:9px;background:#e2e8f0;font-size:12px;font-weight:700;color:#475569;cursor:pointer}\n  .remtog.on{background:#f59e0b;border-color:#f59e0b;color:#fff}\n  .remrow .fi{flex:1}\n  .remquick{display:flex;gap:8px}\n  .qb{flex:1;padding:8px;border:0;border-radius:8px;background:#fef3c7;font-size:12px;font-weight:600;color:#92400e;cursor:pointer}\n  .qb.clr{background:#e2e8f0;color:#475569}\n  .p-foot{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #eef2f6}\n  .del{padding:11px 16px;border:0;border-radius:9px;background:#dc2626;color:#fff;font-weight:700;font-size:13px;cursor:pointer}\n  .cancel{margin-left:auto;padding:11px 16px;border:0;border-radius:9px;background:#e2e8f0;color:#475569;font-weight:600;font-size:13px;cursor:pointer}\n  .save{padding:11px 22px;border:0;border-radius:9px;background:#16a34a;color:#fff;font-weight:700;font-size:13px;cursor:pointer}\n  .gpanel{margin:auto;width:min(600px,94vw);max-height:86vh;background:#fff;border-radius:16px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px rgba(15,23,42,.35)}\n  .gform{display:flex;align-items:center;gap:10px;padding:16px 20px;border-bottom:1px solid #eef2f6;flex-wrap:wrap}\n  .gform .fi{flex:1;min-width:120px}\n  .gform .cor{flex:0 0 120px}\n  .cprev{width:34px;height:34px;border-radius:8px;border:1px solid #e2e8f0}\n  .glist{overflow-y:auto;padding:14px 20px;display:flex;flex-direction:column;gap:8px}\n  .grow{display:flex;align-items:center;gap:10px;padding:9px 12px;background:#f8fafc;border:1px solid #eef2f6;border-radius:10px}\n  .ord{font-size:11px;font-weight:700;color:#94a3b8;width:16px;text-align:center;flex:0 0 auto}\n  .gmove{width:30px;height:30px;border:0;border-radius:7px;background:#eef2f6;color:#334155;font-size:14px;font-weight:700;cursor:pointer;flex:0 0 auto}\n  .gmove:disabled{opacity:.35;cursor:default}\n  .sw{width:22px;height:22px;border-radius:6px;flex:0 0 auto}\n  .gn{flex:1;font-size:13px;font-weight:600}\n  .ge{padding:6px 12px;border:0;border-radius:7px;background:#eef2ff;color:#4f46e5;font-size:12px;font-weight:600;cursor:pointer}\n  .gd{padding:6px 12px;border:0;border-radius:7px;background:#fef2f2;color:#dc2626;font-size:12px;font-weight:600;cursor:pointer}\n  .iopanel{margin:auto;width:min(620px,94vw);max-height:86vh;background:#fff;border-radius:16px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px rgba(15,23,42,.35)}\n  .iobody{padding:16px 20px;display:flex;flex-direction:column;gap:12px;overflow:auto}\n  .iorow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n  .iolbl{font-size:9px;font-weight:800;color:#94a3b8;letter-spacing:.06em;flex:0 0 96px}\n  .iohint{font-size:12px;color:#64748b;line-height:1.5}\n  .iohint b{color:#334155}\n  .ioerr{padding:10px 12px;border-radius:9px;background:#fef2f2;border:1px solid #fecaca;color:#b91c1c;font-size:12px;line-height:1.5}\n  .iook{padding:10px 12px;border-radius:9px;background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d;font-size:12px;line-height:1.5}\n  .iodrop{padding:22px;border:2px dashed #cbd5e1;border-radius:12px;background:#f8fafc;text-align:center}\n  .iodrop input{margin-top:10px;font-size:12px}\n  .iostats{display:flex;gap:10px;flex-wrap:wrap}\n  .iostat{flex:1 1 120px;padding:10px 12px;border:1px solid #e2e8f0;border-radius:10px;background:#f8fafc}\n  .iostat .v{font-size:22px;font-weight:800;line-height:1.1}\n  .iostat .l{font-size:10px;font-weight:700;color:#94a3b8;letter-spacing:.05em;margin-top:2px}\n  .iostat.new .v{color:#16a34a}\n  .iostat.upd .v{color:#4f46e5}\n  .iostat.err .v{color:#dc2626}\n  .ioerrlist{max-height:150px;overflow:auto;border:1px solid #e2e8f0;border-radius:9px}\n  .ioerrlist div{padding:6px 10px;font-size:11px;color:#475569;border-bottom:1px solid #f1f5f9;display:flex;gap:8px}\n  .ioerrlist div:last-child{border-bottom:0}\n  .ioerrlist .ln{font-weight:800;color:#94a3b8;flex:0 0 52px}\n  .iobar{height:8px;border-radius:99px;background:#e2e8f0;overflow:hidden}\n  .iobar span{display:block;height:100%;background:#4f46e5;transition:width .2s}\n  .card.arch{opacity:.72;filter:saturate(.55)}\n  .card.arch:hover{opacity:1;filter:none}\n  .restore{width:100%;margin-top:8px;padding:8px 10px;border:0;border-radius:8px;background:#0d9488;color:#fff;font-size:12px;font-weight:700;cursor:pointer}\n  .restore:hover{background:#0f766e}\n  .load{display:flex;align-items:center;justify-content:center;height:100%;color:#94a3b8;font-size:14px}\n  `,\n  render(d2){\n    const L = d2.data('leads'), E = d2.data('etapas')\n    if (L.loading || E.loading) return `<div class=\"kb\"><div class=\"load\">A carregar leads…</div></div>`\n    const esc = s => (s==null?'':String(s)).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/\"/g,'&quot;')\n    const today = todayISO()\n    const st = d2.state\n    const fO = st.filterOrigem||'', fT = st.filterTipo||'', fFlag = st.filterFlag||'', q = (st.search||'').trim()\n    const fV = st.filterVerif||'', fVd = +(st.filterVerifDias||0)\n    const verCutoff = fVd>0 ? new Date(Date.now()-fVd*864e5).toISOString().slice(0,10) : ''\n    const fNovo = st.filterNovo90||''\n    const fPais = st.filterPais||''\n    const fReg = st.filterRegiao||''\n    const anyFilter = fO||fT||fFlag||q||fV||fVd||fNovo||fPais||fReg\n    const cutoff90 = new Date(Date.now()-90*864e5).toISOString().slice(0,10)\n    const isNovo90 = r=>{ const raw=r.cargo_inicio?String(r.cargo_inicio).slice(0,10):''; const dd=raw.length===7?raw+'-01':raw; return !!dd && dd>=cutoff90 && dd<=today }\n    const etapas = stagesSorted(d2)\n    const arqMode = !!st.verArquivados\n    const nArq = L.records().filter(r=>!!r.arquivado).length\n    const leads = L.records().filter(r=> arqMode ? !!r.arquivado : !r.arquivado)\n    const match = r => (!fO || r.origem===fO) && (!fT || r.tipo_venda===fT) && (!fFlag || (fFlag==='quente'? !!r.lead_quente : fFlag==='engajado'? !!r.lead_engajado : true)) && (!fV || !!r.verificado_em) && (!fVd || (r.verificado_em && String(r.verificado_em).slice(0,10) >= verCutoff)) && (!fNovo || isNovo90(r)) && (!fPais || paisesDoLead(r).indexOf(fPais)>=0) && (!fReg || regioesDoLead(r).indexOf(fReg)>=0) && (!q || fuzzyMatch((r.empresa||'')+' '+(r.nome||'')+' '+(r.cargo||''), q))\n    function cardHtml(r){\n      const dt = r.lembrete_data ? String(r.lembrete_data).slice(0,10) : ''\n      const verDt = r.verificado_em ? String(r.verificado_em).slice(0,10) : ''\n      const stEmp = r.status_empresa||''\n      const novo90 = isNovo90(r)\n      const mkt = r.mercado||''\n      const exp = r.lembrete_ativo && dt && dt < today\n      const rem = r.lembrete_ativo && !exp\n      const tv = r.tipo_venda||''\n      const tvColor = tv==='Sprints Rápidos' ? '#0284c7' : (tv==='AI Suite' ? '#7c3aed' : (tv==='Alocação' ? '#0d9488' : '#64748b'))\n      const _flL=flagOf(r.pais_lead), _flS=flagOf(r.pais_sede)\n      const _two = r.pais_lead&&r.pais_sede&&norm(r.pais_lead)!==norm(r.pais_sede)&&_flL&&_flS&&_flL!==_flS\n      const flag = _two ? (_flL+' '+_flS) : (_flL||_flS)\n      const flagT = _two ? ('Lead: '+r.pais_lead+' · Sede: '+r.pais_sede) : (r.pais_lead||r.pais_sede||'')\n      const reg = regiaoOf(r)\n      const urg = urgOf(r, today)\n      const cands = dominioCandidatos(r)\n      const ent = r.origem==='Enterprise'\n      return `<div class=\"card${arqMode?' arch':''}\" data-key=\"${r._id}\" data-id=\"${r._id}\">\n        <img class=\"wmi\" alt=\"\" draggable=\"false\"/>\n        <div class=\"chead\" style=\"background:${reg.g}\" title=\"${esc(reg.nome)}${r.pais_sede?' · '+esc(r.pais_sede):''}\">\n          <span class=\"lg\">${cands.length?`<img class=\"lgi\" alt=\"\" draggable=\"false\" data-cands=\"${esc(cands.join('|'))}\" data-i=\"0\" src=\"${esc(favicon(cands[0]))}\"/>`:''}<span class=\"mono\">${esc(monograma(r.empresa))}</span></span>\n          <span class=\"emp\">${esc(r.empresa)||'&nbsp;'}</span>\n          <span class=\"rgt\">\n            ${flag?`<span class=\"cflag\" title=\"${esc(flagT)}\">${flag}</span>`:''}\n            ${r.origem?`<span class=\"szp ${ent?'ent':'mm'}\" title=\"${esc(r.origem)}\">${ent?'ENT':'MM'}</span>`:''}\n            ${(urg.exp||urg.hot||urg.rem||urg.eng)?`<span class=\"uic\">${urg.exp?'⚠':''}${urg.hot?'🔥':''}${urg.rem?'🔔':''}${urg.eng?'🤝':''}</span>`:''}\n          </span>\n          ${urg.cor?`<span class=\"ubar\" style=\"background:${urg.cor}\"></span>`:''}\n        </div>\n        <div class=\"cbody\">\n          <div class=\"c-nome\">${esc(r.nome)}</div>\n          <div class=\"c-cargo\">${esc(r.cargo)}</div>\n          <div class=\"c-tags\">\n            ${rem?`<span class=\"tag tag-rem\">🔔 ${esc(dt.slice(5))}</span>`:''}\n            ${exp?`<span class=\"tag tag-exp\">⚠ ${esc(dt.slice(5))}</span>`:''}\n            ${verDt?`<span class=\"tag tag-ver\">✓ ${esc(verDt.slice(5))}</span>`:''}\n            ${stEmp==='Saiu'?`<span class=\"tag tag-saiu\">🚪 Saiu</span>`:''}\n            ${stEmp==='Em transição'?`<span class=\"tag tag-trans\">🔄 Transição</span>`:''}\n            ${(novo90||stEmp==='Novo no cargo <90d')?`<span class=\"tag tag-novo\">🆕 Novo</span>`:''}\n          </div>\n          ${arqMode?`<button class=\"restore\" data-restore=\"${r._id}\">↩ Restaurar</button>`:''}\n        </div></div>`\n    }\n    const cols = etapas.map(et=>{\n      const cs = leads.filter(r=>r.etapa===et.nome && match(r)).sort((a,b)=>{ const ra=urgRank(a,today), rb=urgRank(b,today); if(ra!==rb) return rb-ra; const da=(a.lembrete_data||'').slice(0,10), db=(b.lembrete_data||'').slice(0,10); if(da&&db&&da!==db) return da<db?-1:1; if(da&&!db) return -1; if(!da&&db) return 1; return 0 })\n      return `<div class=\"col\" data-stage=\"${esc(et.nome)}\">\n        <div class=\"colhead\" style=\"background:${esc(et.cor||'#64748b')}\"><span>${esc(et.nome)}</span><span class=\"cnt\">${cs.length}</span></div>\n        <div class=\"cards\">${cs.length? cs.map(cardHtml).join('') : `<div class=\"empty\">${arqMode?'Nenhum lead arquivado aqui':'Arraste cards para aqui'}</div>`}</div>\n      </div>`\n    }).join('')\n    // Lista de paises derivada dos proprios leads (nao ha lista fixa a manter):\n    // ordenada por volume, com contagem, para o filtro dizer onde esta o pipeline.\n    const paisCount = {}\n    leads.forEach(r=>{ paisesDoLead(r).forEach(p=>{ paisCount[p] = (paisCount[p]||0)+1 }) })\n    const paisLista = Object.keys(paisCount).sort((a,b)=> (paisCount[b]-paisCount[a]) || a.localeCompare(b,'pt'))\n    const paisOpts = ['<option value=\"\">Todos os países</option>'].concat(paisLista.map(p=>{\n      const fl = flagOf(p)\n      return `<option value=\"${esc(p)}\"${fPais===p?' selected':''}>${fl?fl+' ':''}${esc(p)} (${paisCount[p]})</option>`\n    })).join('')\n    const chip=(active,label,val,attr)=>`<button class=\"chip ${active?'on':''}\" data-${attr}=\"${esc(val)}\">${esc(label)}</button>`\n    // Contagem por regiao, derivada dos proprios leads: o dropdown so mostra\n    // regioes que tem pipeline, e diz quantos leads ha em cada uma.\n    const regCount = {}\n    leads.forEach(r=>{ regioesDoLead(r).forEach(k=>{ regCount[k]=(regCount[k]||0)+1 }) })\n    const regLista = REG_ORDEM.filter(k=>regCount[k])\n    const pop = st.pop||''\n    const nMais = [fO,fT,fFlag,((fV||fVd)?'1':''),fNovo].filter(Boolean).length\n    // O quadradinho usa o MESMO gradiente do cabecalho do card: escolher\n    // \"DACH\" no filtro e ver cards roxos no board fecha o circuito visual.\n    const regSw = k => k? `<span class=\"rsw\" style=\"background:${REGIOES[k].g}\"></span>` : '<span class=\"rsw all\"></span>'\n    const popReg = pop!=='reg' ? '' : `<div class=\"pop popreg\">\n      <div class=\"popt\">Região <span>${regLista.length} com leads</span></div>\n      <div class=\"reggrid\"><button class=\"regi wide ${!fReg?'on':''}\" data-freg=\"\">${regSw('')}<span class=\"rn\">Todas as regiões</span><span class=\"rc\">${leads.length}</span></button>${regLista.map(k=>`<button class=\"regi ${fReg===k?'on':''}\" data-freg=\"${k}\">${regSw(k)}<span class=\"rn\">${esc(REGIOES[k].nome)}</span><span class=\"rc\">${regCount[k]}</span></button>`).join('')}</div></div>`\n    const popMais = pop!=='mais' ? '' : `<div class=\"pop popmais\">\n      <div class=\"popt\">Mais filtros${nMais?` <span>${nMais} activo(s)</span>`:''}</div>\n      <div class=\"fgrp\"><span class=\"flabel\">TAMANHO</span>${chip(!fO,'Todos','','forigem')}${chip(fO==='Enterprise','Enterprise','Enterprise','forigem')}${chip(fO==='Mid-Market','Mid-Market','Mid-Market','forigem')}</div>\n      <div class=\"fgrp\"><span class=\"flabel\">VENDA</span>${chip(!fT,'Todas','','ftipo')}${chip(fT==='Sprints Rápidos','Sprints','Sprints Rápidos','ftipo')}${chip(fT==='AI Suite','AI Suite','AI Suite','ftipo')}${chip(fT==='Alocação','Alocação','Alocação','ftipo')}</div>\n      <div class=\"fgrp\"><span class=\"flabel\">FLAG</span><button class=\"chip ${!fFlag?'on':''}\" data-fflag=\"\">Todos</button><button class=\"chip chip-hot ${fFlag==='quente'?'on':''}\" data-fflag=\"quente\">🔥 Quentes</button><button class=\"chip chip-eng ${fFlag==='engajado'?'on':''}\" data-fflag=\"engajado\">🤝 Engajados</button></div>\n      <div class=\"fgrp\"><span class=\"flabel\">VERIFICAÇÃO</span><button class=\"chip ${!fV&&!fVd?'on':''}\" data-fverif=\"\">Todos</button><button class=\"chip ${(fV==='sim'||fVd)?'on':''}\" data-fverif=\"sim\">✓ Verificados</button><input class=\"verifdays\" type=\"number\" min=\"1\" placeholder=\"≤ dias\" value=\"${fVd||''}\"/></div>\n      <div class=\"fgrp\"><span class=\"flabel\">NO CARGO</span><button class=\"chip ${!fNovo?'on':''}\" data-fnovo=\"\">Todos</button><button class=\"chip ${fNovo==='sim'?'on':''}\" data-fnovo=\"sim\">🆕 &lt;90 dias</button></div>\n      <div class=\"popf\"><button class=\"afclr\" data-act=\"filclear\">Limpar todos os filtros</button></div></div>`\n    const popMenu = pop!=='menu' ? '' : `<div class=\"pop popmenu\">\n      <button class=\"mi\" data-act=\"relatorio\">📊 Relatório de funil</button>\n      <button class=\"mi\" data-act=\"gerir\">🗂 Gerir etapas</button>\n      <button class=\"mi\" data-act=\"ioexp\">⬇ Exportar planilha</button>\n      <button class=\"mi\" data-act=\"ioimp\">⬆ Importar planilha</button></div>`\n    // Chips do que esta activo: o filtro escondido no popover continua visivel\n    // aqui, com o ✕ que o limpa — senao um filtro esquecido explica sozinho um\n    // board \"vazio\" e ninguem descobre porque.\n    const afChip=(rot,val,attr)=>`<span class=\"afc\">${rot?`<b>${esc(rot)}</b>`:''}${esc(val)}<button data-${attr}=\"\" title=\"Limpar\">✕</button></span>`\n    const actives = [\n      fReg? `<span class=\"afc\">${regSw(fReg)}${esc(REGIOES[fReg].nome)}<button data-freg=\"\" title=\"Limpar\">✕</button></span>` : '',\n      fPais? afChip('País', fPais, 'fpais') : '',\n      fO? afChip('Tamanho', fO, 'forigem') : '',\n      fT? afChip('Venda', fT, 'ftipo') : '',\n      fFlag? afChip('', fFlag==='quente'?'🔥 Quentes':'🤝 Engajados', 'fflag') : '',\n      (fV||fVd)? afChip('Verificado', fVd? '≤ '+fVd+' dias' : 'sim', 'fverif') : '',\n      fNovo? afChip('', '🆕 <90 dias no cargo', 'fnovo') : ''\n    ].filter(Boolean).join('')\n    const header = `<div class=\"hdr\">\n      <div class=\"hrow hrow1\">\n        <div class=\"brand\"><span class=\"blogo\" title=\"União Europeia\">${EU_FLAG}</span><div class=\"btxt\"><div class=\"t\">Pipeline Comercial Europa</div><div class=\"s\">${arqMode? `${leads.length} arquivados · ↩ Restaurar devolve ao board` : `${leads.length} leads · arraste os cards entre etapas`}</div></div></div>\n        <input class=\"search\" placeholder=\"Pesquisar nome ou empresa…\" value=\"${esc(st.search||'')}\"/>\n        <div class=\"seg maptabs\"><button class=\"${st.view==='mapa'?'':'on'}\" data-view=\"board\">Board</button><button class=\"${st.view==='mapa'?'on':''}\" data-view=\"mapa\">🗺 Mapa</button></div>\n        <div class=\"hacts\">\n          <button class=\"btn-primary\" data-act=\"novo\">+ Novo Lead</button>\n          <div class=\"popwrap\"><button class=\"ibtn ${pop==='menu'?'on':''}\" data-pop=\"menu\" title=\"Relatório, etapas, planilhas\">⋯</button>${popMenu}</div>\n        </div>\n      </div>\n      <div class=\"hrow hrow2\">\n        <div class=\"popwrap\"><button class=\"fbtn ${fReg?'on':''}\" data-pop=\"reg\">${regSw(fReg)}${fReg?esc(REGIOES[fReg].nome):'Região'}<span class=\"cv\">▾</span></button>${popReg}</div>\n        <select class=\"fpais\">${paisOpts}</select>\n        <div class=\"popwrap\"><button class=\"fbtn ${nMais?'on':''}\" data-pop=\"mais\">Mais filtros${nMais?`<span class=\"bdg\">${nMais}</span>`:''}<span class=\"cv\">▾</span></button>${popMais}</div>\n        <div class=\"activef\">${actives}${anyFilter?`<button class=\"afclr\" data-act=\"filclear\">Limpar</button>`:''}</div>\n        <div class=\"seg\"><button class=\"${!arqMode?'on':''}\" data-varq=\"0\">Ativos</button><button class=\"${arqMode?'on arq':''}\" data-varq=\"1\">🗄 Arquivados${nArq?' · '+nArq:''}</button></div>\n      </div></div>`\n    const draft = st.draft||{}\n    function fld(label,key,ph){ return `<label class=\"f\"><span>${esc(label)}</span><input class=\"fi\" data-df=\"${key}\" value=\"${esc(draft[key])}\" placeholder=\"${esc(ph||'')}\"/></label>` }\n    function detailHtml(){\n      const d = draft, isNew = st.selectedId==='new'\n      const _sugArr = dominioCandidatos({...d, dominio:''})\n      const _logoSug = _sugArr.length ? _sugArr[0] : ''\n      const _domArr = dominioCandidatos(d)\n      const _logoDom = _domArr.length ? _domArr[0] : ''\n      const qEmp=(d.empresa||'').trim(), supEmp=st.empSuppress||''\n      let empSug=[]\n      if(qEmp.length>=1 && qEmp!==supEmp){ const nq=norm(qEmp), seen={}; for(const r of leads){ const e=(r.empresa||'').trim(); if(!e) continue; const ne=norm(e); if(ne!==nq && ne.includes(nq) && !(e in seen)) seen[e]={pais_sede:'',cidade_sede:''} } for(const r of leads){ const e=(r.empresa||'').trim(); if(seen[e]){ if(!seen[e].pais_sede&&r.pais_sede)seen[e].pais_sede=r.pais_sede; if(!seen[e].cidade_sede&&r.cidade_sede)seen[e].cidade_sede=r.cidade_sede } } empSug=Object.keys(seen).sort((a,b)=>{ const na=norm(a).startsWith(nq)?0:1, nb=norm(b).startsWith(nq)?0:1; return na-nb||a.localeCompare(b) }).slice(0,6).map(e=>({nome:e,...seen[e]})) }\n      const sc = etapas.map(et=>`<button class=\"schip\" data-setstage=\"${esc(et.nome)}\" style=\"${d.etapa===et.nome?('background:'+esc(et.cor)+';color:#fff;border-color:'+esc(et.cor)):''}\">${esc(et.nome)}</button>`).join('')\n      return `<div class=\"scrim\"><div class=\"panel${st.panelFull?' full':''}\">\n        <div class=\"p-top\"><b>${isNew?'Novo Lead':'Detalhe do Lead'}</b><div style=\"display:flex;gap:8px\"><button class=\"x\" data-act=\"togglefull\" title=\"${st.panelFull?'Restaurar tamanho':'Ecrã inteiro'}\">${st.panelFull?'❐':'⛶'}</button><button class=\"x\" data-act=\"close\">✕</button></div></div>\n        <div class=\"p-body\">\n          <button class=\"hotbtn ${d.lead_quente?'on':''}\" data-act=\"hottoggle\">${d.lead_quente?'🔥 Lead Quente — ativo':'🔥 Marcar como Lead Quente'}</button>\n          <button class=\"engbtn ${d.lead_engajado?'on':''}\" data-act=\"engtoggle\">${d.lead_engajado?'🤝 Lead Engajado — ativo':'🤝 Marcar como Lead Engajado'}</button>\n          <label class=\"f empwrap\"><span>Empresa</span><input class=\"fi\" data-df=\"empresa\" data-empinput value=\"${esc(d.empresa)}\" placeholder=\"Nome da empresa\" autocomplete=\"off\"/>${empSug.length?`<div class=\"empsug\">${empSug.map(c=>`<div class=\"empsug-i\" data-emppick=\"${esc(c.nome)}\"><span class=\"es-n\">${esc(c.nome)}</span><span class=\"es-g\">${esc([c.pais_sede,c.cidade_sede].filter(Boolean).join(' · ')||'sem geografia guardada')}</span></div>`).join('')}</div>`:''}</label>\n          <div class=\"sect\">Logo da empresa</div>\n          <div class=\"logorow\">\n            <span class=\"logoprev\">${_logoDom?`<img class=\"lgi\" alt=\"\" draggable=\"false\" data-cands=\"${esc(_logoDom)}\" data-i=\"0\" src=\"${esc(favicon(_logoDom))}\"/>`:''}<span class=\"mono\">${esc(monograma(d.empresa))}</span></span>\n            <div class=\"logofields\">\n              <input class=\"fi\" data-df=\"dominio\" value=\"${esc(d.dominio||'')}\" placeholder=\"${esc(_logoSug||'ex: empresa.com')}\"/>\n              <div class=\"logohint\">${d.dominio?`Domínio fixado: <b>${esc(_logoDom)}</b> — carrega em Guardar para persistir.`:(_logoSug?`A adivinhar <b>${esc(_logoSug)}</b> pelo nome e país. Escreve o domínio para fixar — útil quando o palpite falha e só aparece o monograma.`:'Escreve o domínio da empresa (ex: empresa.com) para o logo aparecer no card.')}</div>\n            </div>\n            ${(_logoSug&&!d.dominio)?`<button class=\"remtog\" data-logoact=\"${esc(_logoSug)}\">Fixar palpite</button>`:''}\n            ${d.dominio?`<button class=\"remtog\" data-logoact=\"clear\">Voltar ao automático</button>`:''}\n          </div>\n          ${fld('Nome completo','nome')}<div class=\"frow\"><label class=\"f\"><span>Cargo</span><input class=\"fi\" data-df=\"cargo\" value=\"${esc(d.cargo)}\" placeholder=\"\"/></label><label class=\"f\" style=\"flex:0 0 auto\"><span>Confirmado na experiência</span><button class=\"confcargo ${d.cargo_confirmado?'on':''}\" data-act=\"cargotoggle\" title=\"Cargo confirmado na experiência do LinkedIn?\"><span class=\"dot\"></span>${d.cargo_confirmado?'Sim':'Não'}</button></label></div><div class=\"frow\"><label class=\"f\"><span>Status na empresa</span><select class=\"fi\" data-df=\"status_empresa\" style=\"cursor:pointer\">${['Ativo','Saiu','Em transição','Novo no cargo <90d'].map(o=>`<option value=\"${esc(o)}\" ${(d.status_empresa||'Ativo')===o?'selected':''}>${esc(o)}</option>`).join('')}</select></label><label class=\"f\"><span>Início no cargo atual</span><input class=\"fi\" type=\"month\" data-df=\"cargo_inicio\" style=\"cursor:pointer\" value=\"${esc((d.cargo_inicio||'').slice(0,7))}\"/></label></div>${fld('Email','email')}<label class=\"f\"><span>Telefone</span><input class=\"fi\" type=\"tel\" data-df=\"telefone\" value=\"${esc(d.telefone)}\" placeholder=\"+351 912 345 678 · +55 11 91234-5678\"/></label>${fld('LinkedIn URL','linkedin')}<div class=\"frow\"><label class=\"f\"><span>Data de conexão</span><input class=\"fi\" type=\"date\" data-df=\"data_conexao\" style=\"cursor:pointer\" value=\"${esc((d.data_conexao||'').slice(0,10))}\"/></label><label class=\"f\"><span>Registro / Mercado</span><select class=\"fi\" data-df=\"mercado\" style=\"cursor:pointer\"><option value=\"\" ${!d.mercado?'selected':''}>—</option>${[['Iberia','Iberia'],['DACH','DACH'],['Nordics','Nordics'],['FR','FR'],['IT','Itália'],['Benelux','Benelux'],['UK-IE','UK-IE'],['Báltico','Báltico'],['Polônia','Polônia'],['Europa Central','Europa Central'],['Sudeste UE','Sudeste UE'],['Balcãs','Balcãs'],['EU Outros','EU Outros']].map(o=>`<option value=\"${esc(o[0])}\" ${d.mercado===o[0]?'selected':''}>${esc(o[1])}</option>`).join('')}</select></label></div><label class=\"f\"><span>Verificado no LinkedIn</span><div class=\"remrow\"><input class=\"fi\" type=\"date\" data-df=\"verificado_em\" style=\"cursor:pointer\" value=\"${esc((d.verificado_em||'').slice(0,10))}\"/><button class=\"remtog${d.verificado_em?' on':''}\" data-act=\"verhoje\">✓ Hoje</button><button class=\"remtog\" data-act=\"verclear\">Limpar</button></div></label>${fld('Via quem','via_quem')}<div class=\"frow\"><div class=\"f\"><div class=\"sect\">Tamanho</div><div class=\"tvbtns\"><button class=\"tvb ${d.origem==='Enterprise'?'on':''}\" data-orig=\"Enterprise\">Enterprise</button><button class=\"tvb ${d.origem==='Mid-Market'?'on':''}\" data-orig=\"Mid-Market\">Mid-Market</button></div></div><div class=\"f\"><div class=\"sect\">Abordagem</div><div class=\"tvbtns\"><button class=\"tvb ${d.abordagem==='Conexão'?'on':''}\" data-abord=\"Conexão\">Conexão</button><button class=\"tvb ${d.abordagem==='InMail'?'on':''}\" data-abord=\"InMail\">InMail</button></div></div></div>\n          <div class=\"sect\">Localização</div>\n          <div class=\"frow\"><label class=\"f\"><span>País da Sede ${flagOf(d.pais_sede)?`<span class=\"lflag\">${flagOf(d.pais_sede)}</span>`:''}</span><input class=\"fi\" data-df=\"pais_sede\" value=\"${esc(d.pais_sede)}\" list=\"dlpais\" autocomplete=\"off\" placeholder=\"Digite para procurar…\"/></label>${fld('Cidade da Sede','cidade_sede')}</div>\n          <div class=\"frow\"><label class=\"f\"><span>País do Lead ${flagOf(d.pais_lead)?`<span class=\"lflag\">${flagOf(d.pais_lead)}</span>`:''}</span><input class=\"fi\" data-df=\"pais_lead\" value=\"${esc(d.pais_lead)}\" list=\"dlpais\" autocomplete=\"off\" placeholder=\"Digite para procurar…\"/></label>${fld('Cidade do Lead','cidade_lead')}</div>${DL_PAIS_HTML}\n          <label class=\"f\"><span>Filiais na Europa</span><div class=\"filwrap\"><div class=\"filchips\">${(d.filiais_europa||[]).length?(d.filiais_europa||[]).map((f,i)=>`<span class=\"filchip\">${esc(f)}<button data-remfil=\"${i}\">✕</button></span>`).join(''):'<span class=\"filempty\">Nenhuma filial adicionada</span>'}</div><div class=\"filrow\"><input class=\"fi\" data-filinput value=\"${esc(d._filnew)}\" placeholder=\"Ex.: Madrid, Paris, Milão… (Enter para adicionar)\"/><button class=\"filadd\" data-act=\"filadd\">+ Adicionar</button></div></div></label>\n          <label class=\"f\"><span>Interesses notáveis</span><textarea class=\"fi ta\" data-df=\"interesses\">${esc(d.interesses)}</textarea></label><label class=\"f\"><span>Notas</span><textarea class=\"fi ta\" data-df=\"notas\">${esc(d.notas)}</textarea></label>\n          <div class=\"sect\">Mover para etapa</div><div class=\"schips\">${sc}</div>\n          <div class=\"sect\">Tipo de venda</div>\n          <div class=\"tvbtns\"><button class=\"tvb ${d.tipo_venda==='Sprints Rápidos'?'on spr':''}\" data-tv=\"Sprints Rápidos\">Sprints Rápidos</button><button class=\"tvb ${d.tipo_venda==='AI Suite'?'on sui':''}\" data-tv=\"AI Suite\">AI Suite</button><button class=\"tvb ${d.tipo_venda==='Alocação'?'on aloc':''}\" data-tv=\"Alocação\">Alocação</button><button class=\"tvb\" data-tv=\"\">Nenhum</button></div>\n          <div class=\"sect\">Lembrete</div>\n          <div class=\"remrow\"><button class=\"remtog ${d.lembrete_ativo?'on':''}\" data-act=\"remtoggle\">${d.lembrete_ativo?'🔔 Ativo':'Ativar'}</button><input class=\"fi\" type=\"date\" data-df=\"lembrete_data\" value=\"${esc((d.lembrete_data||'').slice(0,10))}\"/></div>\n          <div class=\"remquick\"><button class=\"qb\" data-remadd=\"7\">+7 dias</button><button class=\"qb\" data-remadd=\"15\">+15 dias</button><button class=\"qb\" data-remadd=\"30\">+30 dias</button><button class=\"qb clr\" data-act=\"remclear\">Limpar</button></div>\n          <input class=\"fi\" data-df=\"lembrete_nota\" placeholder=\"Nota do lembrete\" value=\"${esc(d.lembrete_nota)}\"/>\n        </div>\n        <div class=\"p-foot\">${isNew?'':(d.arquivado?'<button class=\"save\" style=\"background:#0d9488\" data-act=\"restore\">↩ Restaurar</button>':'<button class=\"del\" data-act=\"delete\">Apagar</button>')}<button class=\"cancel\" data-act=\"close\">Cancelar</button><button class=\"save\" data-act=\"save\">Guardar</button></div>\n      </div></div>`\n    }\n    function gerirHtml(){\n      const g = st.etDraft||{cor:'#6366f1'}\n      const rows = etapas.map((et,i)=>`<div class=\"grow\"><span class=\"ord\">${i+1}</span><span class=\"sw\" style=\"background:${esc(et.cor)}\"></span><span class=\"gn\">${esc(et.nome)}</span><button class=\"gmove\" data-etup=\"${et._id}\" ${i===0?'disabled':''}>↑</button><button class=\"gmove\" data-etdown=\"${et._id}\" ${i===etapas.length-1?'disabled':''}>↓</button><button class=\"ge\" data-etedit=\"${et._id}\">Editar</button><button class=\"gd\" data-etdel=\"${et._id}\">Apagar</button></div>`).join('')\n      return `<div class=\"scrim\"><div class=\"gpanel\">\n        <div class=\"p-top\"><b>Gerir Etapas</b><button class=\"x\" data-act=\"gclose\">✕</button></div>\n        <div class=\"gform\"><input class=\"fi\" data-egf=\"nome\" placeholder=\"Nome da etapa\" value=\"${esc(g.nome)}\"/><input class=\"fi cor\" data-egf=\"cor\" placeholder=\"#6366f1\" value=\"${esc(g.cor)}\"/><span class=\"cprev\" style=\"background:${esc(g.cor||'#6366f1')}\"></span><button class=\"save\" data-act=\"etsave\">${g._id?'Guardar':'Adicionar'}</button><button class=\"cancel\" data-act=\"etclear\">Limpar</button></div>\n        <div class=\"glist\">${rows}</div>\n      </div></div>`\n    }\n    const visible = leads.filter(match)\n    const mHot = visible.filter(r=>r.lead_quente).length\n    const mEng = visible.filter(r=>r.lead_engajado).length\n    const mExp = visible.filter(r=>{ const dt=r.lembrete_data?String(r.lembrete_data).slice(0,10):''; return r.lembrete_ativo&&dt&&dt<today }).length\n    const mRem = visible.filter(r=>{ const dt=r.lembrete_data?String(r.lembrete_data).slice(0,10):''; return r.lembrete_ativo&&dt&&dt>=today }).length\n    const isClosed = r => !!r.fechado_em || r.etapa==='Fechado' || r.etapa==='Customer Success'\n    const mFech = visible.filter(isClosed).length\n    const lastStage = etapas.length? etapas[etapas.length-1].nome : ''\n    const mCS = lastStage? visible.filter(r=>r.etapa===lastStage).length : 0\n    const conv = visible.length? Math.round(mCS/visible.length*100) : 0\n    const fechPct = visible.length? Math.round(mFech/visible.length*100) : 0\n    const metrics = `<div class=\"metrics\"><div class=\"metric\"><div class=\"mv\">${visible.length}</div><div class=\"ml\">${arqMode?'🗄 Arquivados':'Leads'}${anyFilter?' · filtrados':''}</div></div><div class=\"metric hot\"><div class=\"mv\">${mHot}</div><div class=\"ml\">🔥 Quentes</div></div><div class=\"metric\"><div class=\"mv\" style=\"color:#4f46e5\">${mEng}</div><div class=\"ml\">🤝 Engajados</div></div><div class=\"metric\"><div class=\"mv\">${mRem}</div><div class=\"ml\">🔔 Lembretes</div></div><div class=\"metric exp\"><div class=\"mv\">${mExp}</div><div class=\"ml\">⚠ Expirados</div></div><div class=\"metric won\"><div class=\"mv\">${mFech} · ${fechPct}%</div><div class=\"ml\">✅ Fechados</div></div><div class=\"metric\"><div class=\"mv\">${conv}%</div><div class=\"ml\">${esc(lastStage||'Final')}</div></div></div>`\n    function ioHtml(){\n      const mode = st.ioOpen\n      const XL = d2.lib(IO_LIB)\n      const top = `<div class=\"p-top\"><b>${mode==='exp'?'⬇ Exportar leads':'⬆ Importar leads'}</b><button class=\"x\" data-act=\"ioclose\">✕</button></div>`\n      const wrap = b => `<div class=\"scrim\" style=\"z-index:70\"><div class=\"iopanel\">${top}${b}</div></div>`\n      if(!XL){\n        const st2 = d2.lib.state(IO_LIB)\n        return wrap(`<div class=\"iobody\">${st2==='error'\n          ? `<div class=\"ioerr\">Não foi possível carregar a biblioteca de planilhas.<br>${esc(d2.lib.error(IO_LIB)||'')}</div>`\n          : `<div class=\"iohint\">A carregar a biblioteca de planilhas…</div>`}</div>`)\n      }\n      if(mode==='exp'){\n        const scope = st.ioScope||'all'\n        const incArq = !!st.ioArq\n        const base = L.records().filter(r=> incArq ? true : !r.arquivado)\n        const n = scope==='filt' ? base.filter(match).length : base.length\n        return wrap(`<div class=\"iobody\">\n          <div class=\"iorow\"><span class=\"iolbl\">O QUE</span>\n            <button class=\"chip ${scope==='all'?'on':''}\" data-ioscope=\"all\">Todos os leads</button>\n            <button class=\"chip ${scope==='filt'?'on':''}\" data-ioscope=\"filt\">Só o filtro actual</button></div>\n          <div class=\"iorow\"><span class=\"iolbl\">ARQUIVADOS</span>\n            <button class=\"chip ${incArq?'on':''}\" data-ioarq=\"${incArq?'0':'1'}\">${incArq?'Incluídos':'Excluídos'}</button></div>\n          <div class=\"iohint\"><b>${n} lead(s)</b> · ${IO_FIELDS.length} colunas, incluindo <b>Etapa</b> (a posição no kanban) e <b>ID</b>.<br>Mantenha a coluna <b>ID</b> na planilha: ao reimportar, ela faz o lead ser <b>actualizado</b> em vez de duplicado.</div>\n        </div>\n        <div class=\"p-foot\"><button class=\"cancel\" data-act=\"ioclose\">Fechar</button><button class=\"save\" data-act=\"expcsv\">⬇ CSV</button><button class=\"save\" data-act=\"expxlsx\">⬇ XLSX</button></div>`)\n      }\n      const prog = st.impProg\n      if(prog){\n        const pct = prog.total? Math.round(prog.done/prog.total*100) : 0\n        return wrap(`<div class=\"iobody\">\n          <div class=\"iohint\">A gravar <b>${prog.done}</b> de <b>${prog.total}</b> lead(s)… não feche esta janela.</div>\n          <div class=\"iobar\"><span style=\"width:${pct}%\"></span></div></div>`)\n      }\n      const done = st.impDone\n      if(done){\n        return wrap(`<div class=\"iobody\">\n          <div class=\"iook\">Importação concluída · <b>${done.criados}</b> criado(s), <b>${done.actualizados}</b> actualizado(s)${done.falhas?`, <b>${done.falhas}</b> falha(s) de gravação`:''}.</div>\n        </div>\n        <div class=\"p-foot\"><button class=\"cancel\" data-act=\"ioclose\">Fechar</button><button class=\"save\" data-act=\"impreset\">Importar outra planilha</button></div>`)\n      }\n      const plan = st.impPlan\n      if(!plan){\n        return wrap(`<div class=\"iobody\">\n          ${st.impErr?`<div class=\"ioerr\">${esc(st.impErr)}</div>`:''}\n          <div class=\"iodrop\">Escolha um ficheiro <b>.xlsx</b> ou <b>.csv</b><input class=\"iofile\" type=\"file\" accept=\".csv,.xlsx,.xls\"/></div>\n          <div class=\"iohint\">Os cabeçalhos são reconhecidos pelo nome da coluna (<b>Empresa</b>, <b>Nome Completo</b>, <b>Etapa</b>…) ou pelo nome interno do campo — maiúsculas e acentos não importam. Colunas que eu não reconhecer são listadas antes de gravar, nunca ignoradas em silêncio.<br>Nada é gravado até você confirmar. Leads que não estiverem na planilha ficam intactos — importar <b>nunca apaga</b>.<br>O caminho mais seguro: <b>Exportar</b> primeiro, editar a planilha, e subir de volta.</div>\n        </div>`)\n      }\n      const errs = plan.errors.slice(0,8).map(e=>`<div><span class=\"ln\">L${e.linha}</span><span>${esc(e.quem)} — ${esc(e.motivo)}</span></div>`).join('')\n      const nMove = plan.updates.filter(u=>u.mudouEtapa).length\n      return wrap(`<div class=\"iobody\">\n        <div class=\"iohint\">Ficheiro <b>${esc(plan.ficheiro||'')}</b> · ${plan.colunas} coluna(s) reconhecida(s)</div>\n        <div class=\"iostats\">\n          <div class=\"iostat new\"><div class=\"v\">${plan.creates.length}</div><div class=\"l\">NOVOS</div></div>\n          <div class=\"iostat upd\"><div class=\"v\">${plan.updates.length}</div><div class=\"l\">ACTUALIZADOS</div></div>\n          <div class=\"iostat err\"><div class=\"v\">${plan.errors.length}</div><div class=\"l\">LINHAS COM ERRO</div></div>\n          <div class=\"iostat\"><div class=\"v\">${plan.iguais}</div><div class=\"l\">SEM ALTERAÇÃO</div></div>\n        </div>\n        ${plan.iguais?`<div class=\"iohint\">${plan.iguais} linha(s) estão idênticas ao que já existe — não são regravadas.</div>`:''}\n        ${nMove?`<div class=\"iohint\">${nMove} lead(s) mudam de etapa — o histórico e a contagem de movimentações são actualizados, como num arraste no board.</div>`:''}\n        ${plan.semEtapa?`<div class=\"iohint\">${plan.semEtapa} lead(s) novo(s) sem coluna Etapa preenchida entram na primeira etapa.</div>`:''}\n        ${plan.unknown.length?`<div class=\"ioerr\">Colunas ignoradas (não correspondem a nenhum campo): <b>${esc(plan.unknown.join(', '))}</b></div>`:''}\n        ${plan.errors.length?`<div class=\"iohint\">Linhas com erro <b>não são importadas</b>. As restantes seguem normalmente.</div><div class=\"ioerrlist\">${errs}${plan.errors.length>8?`<div><span class=\"ln\">…</span><span>e mais ${plan.errors.length-8}</span></div>`:''}</div>`:''}\n      </div>\n      <div class=\"p-foot\"><button class=\"del\" data-act=\"impreset\">Escolher outro</button><button class=\"cancel\" data-act=\"ioclose\">Cancelar</button><button class=\"save\" data-act=\"impconfirm\" ${(plan.creates.length+plan.updates.length)?'':'disabled'}>Gravar ${plan.creates.length+plan.updates.length} lead(s)</button></div>`)\n    }\n    let modal=''\n    if (st.ioOpen) modal = ioHtml()\n    else if (st.selectedId) modal = detailHtml()\n    else if (st.gerirOpen) modal = gerirHtml()\n    let cele=''\n    if (st.celebrate){ const CC=['#22c55e','#4f46e5','#f59e0b','#ec4899','#0ea5e9','#eab308','#f97316']; let pcs=''; for(let i=0;i<64;i++){ const left=(i*61)%100, dur=(1.9+((i%6)*0.22)).toFixed(2), del=((i%12)*0.06).toFixed(2), rot=(i*53)%360, col=CC[i%CC.length]; pcs+=`<span class=\"conf\" style=\"left:${left}%;background:${col};animation-duration:${dur}s;animation-delay:${del}s;transform:rotate(${rot}deg)\"></span>` } cele=`<div class=\"cele\">${pcs}<div class=\"cele-msg\">${st.celebrate.emoji} ${esc(st.celebrate.label)}</div></div>` }\n    let confTam=''\n    if (st.confirmTamanho){ const c=st.confirmTamanho; confTam=`<div class=\"scrim\" style=\"z-index:60\"><div class=\"confbox\"><div class=\"conft\">Alterar Tamanho da empresa</div><div class=\"confm\">O <b>Tamanho</b> de <b>${esc(c.emp)}</b> será definido como <b>${esc(c.novo)}</b> em mais <b>${c.n} lead(s)</b> dessa empresa. O Tamanho é da empresa e vale para todos. Confirmar?</div><div class=\"conff\"><button class=\"cancel\" data-act=\"tamCancel\">Cancelar</button><button class=\"save\" data-act=\"tamConfirm\">Aplicar a todos</button></div></div></div>` }\n    let confDel=''\n    if (st.confirmDelete){ const c=st.confirmDelete; const who=esc([c.empresa,c.nome].filter(Boolean).join(' — ')||'este lead'); confDel=`<div class=\"scrim\" style=\"z-index:70\"><div class=\"confbox\"><div class=\"conft\">Arquivar lead</div><div class=\"confm\">O lead <b>${who}</b> será <b>arquivado</b> e sairá do board. Os dados não são apagados — dá para restaurar depois. Confirmar?</div><div class=\"conff\"><button class=\"cancel\" data-act=\"delCancel\">Cancelar</button><button class=\"del\" data-act=\"delConfirm\">Arquivar</button></div></div></div>` }\n    let mapa=''\n    if(st.view==='mapa'){\n      const porLead = st.mapaPor==='lead'\n      const g = agrupaPorPais(visible, porLead?'pais_lead':'pais_sede')\n      const nDentro = Object.keys(g.dentro).reduce((a,k)=>a+g.dentro[k].length,0)\n      const foraItens = Object.keys(g.fora).sort((a,b)=>g.fora[b].length-g.fora[a].length)\n        .map((k,i)=>({label:k, n:g.fora[k].length, cor:PIE_COR[i%PIE_COR.length]}))\n      const nFora = foraItens.reduce((a,e)=>a+e.n,0)\n      const top = Object.keys(g.dentro).map(iso=>({c:EUROPA.c.find(x=>x.i===iso), n:g.dentro[iso].length}))\n        .filter(x=>x.c).sort((a,b)=>b.n-a.n)\n      const maxN = top.length? top[0].n : 1\n      const pill=(v,l)=>`<button class=\"chip ${((st.mapaPor||'sede')===v)?'on':''}\" data-mpor=\"${v}\">${l}</button>`\n      mapa = `<div class=\"mapwrap\">\n        <div class=\"mapcard\">\n          <div class=\"ch\"><b>Leads por país</b>\n            <div class=\"fgrp\"><span class=\"flabel\">AGRUPAR POR</span>${pill('sede','Sede da empresa')}${pill('lead','País do lead')}</div>\n            <span class=\"hint\">${nDentro} na Europa · ${nFora} fora · marcador = nº de leads</span></div>\n          <div class=\"mapbox\">${mapaSvg(g.dentro, today)}\n            <div class=\"mleg\"><b>Urgência</b>\n              <div class=\"r\"><i style=\"background:#dc2626\"></i>Lembrete expirado</div>\n              <div class=\"r\"><i style=\"background:#ea580c\"></i>Lead quente</div>\n              <div class=\"r\"><i style=\"background:#f59e0b\"></i>Lembrete activo</div>\n              <div class=\"r\"><i style=\"background:#16a34a\"></i>Sem urgência</div></div></div></div>\n        <div class=\"mapside\">\n          <div class=\"sidecard\"><b>Fora da Europa</b>${nFora?`${donutSvg(foraItens)}<div class=\"plist\">${foraItens.map(e=>`<div class=\"pitem\"><i style=\"background:${e.cor}\"></i><span class=\"pn\">${esc(e.label)}</span><span class=\"pv\">${e.n}</span></div>`).join('')}</div>`:`<span class=\"hint\">Todos os leads filtrados têm ${porLead?'país do lead':'sede'} na Europa.</span>`}</div>\n          <div class=\"sidecard\" style=\"flex:1 1 auto;overflow:hidden\"><b>Ranking de países</b>\n            <div class=\"toplist\">${top.length? top.map(t=>`<div class=\"trow\"><span class=\"tn\">${esc(t.c.n)}</span><span class=\"tbar\"><span style=\"width:${Math.round(t.n/maxN*100)}%;background:${REG_COR[t.c.r]}\"></span></span><span class=\"tv\">${t.n}</span></div>`).join('') : '<span class=\"hint\">Sem leads no filtro actual.</span>'}</div></div></div></div>`\n    }\n    return `<div class=\"kb\">${header}${st.view==='mapa'? mapa : `${metrics}<div class=\"board\">${cols}</div>`}${modal}${cele}${confTam}${confDel}</div>`\n  },\n  updated(d2){ fixLogos(d2) },\n  mounted(d2){\n    fixLogos(d2)\n    d2.data('leads').loadAll(); d2.data('etapas').loadAll()\n    if(!d2.state.draft) d2.state.draft={}\n    const setDraft=(patch)=>{ d2.state.draft={...(d2.state.draft||{}), ...patch} }\n    const addFil=()=>{ const v=(((d2.state.draft||{})._filnew)||'').trim(); if(!v) return; const arr=[...(((d2.state.draft||{}).filiais_europa)||[])]; if(!arr.includes(v)) arr.push(v); setDraft({filiais_europa:arr, _filnew:''}) }\n    let celeTimer=null\n    const fireCele=(stage)=>{ d2.state.celebrate={ label:stage, emoji: stage==='Customer Success'?'🏆':'🎉' }; if(celeTimer) clearTimeout(celeTimer); celeTimer=setTimeout(()=>{ d2.state.celebrate=null }, 2800) }\n    d2.onUnmount(()=>{ if(celeTimer) clearTimeout(celeTimer) })\n    // Drag & drop por ponteiro — funciona no rato e no touch\n    let drag=null, ghostEl=null, overCol=null, srcCard=null\n    const hitCol=(x,y)=>{ const rn=srcCard&&srcCard.getRootNode&&srcCard.getRootNode(); const el=(rn&&rn.elementFromPoint)?rn.elementFromPoint(x,y):document.elementFromPoint(x,y); return (el&&el.closest)?el.closest('.col'):null }\n    const clearDrag=()=>{ if(ghostEl){ ghostEl.remove(); ghostEl=null } if(overCol){ overCol.classList.remove('over'); overCol=null } if(srcCard){ srcCard.classList.remove('dragging') } drag=null; srcCard=null }\n    d2.on('.card','pointerdown',(e,el)=>{ if(e.button!=null && e.button!==0) return; if(e.target&&e.target.closest&&e.target.closest('[data-restore]')) return; try{ el.setPointerCapture(e.pointerId) }catch(_){}; srcCard=el; drag={ id:el.dataset.id, x:e.clientX, y:e.clientY, moved:false } })\n    d2.on(window,'pointermove',(e)=>{ if(!drag) return; if(d2.state.verArquivados) return; if(!drag.moved){ if(Math.hypot(e.clientX-drag.x, e.clientY-drag.y)<5) return; drag.moved=true; const rec=d2.data('leads').records().find(r=>r._id===drag.id); ghostEl=document.createElement('div'); ghostEl.textContent=(rec&&(rec.empresa||rec.nome))||'Lead'; Object.assign(ghostEl.style,{position:'fixed',left:'0',top:'0',pointerEvents:'none',zIndex:'9999',padding:'10px 12px',borderRadius:'11px',background:'#fff',boxShadow:'0 12px 32px rgba(15,23,42,.28)',border:'1px solid #e5e9f0',font:'700 13px Inter,-apple-system,sans-serif',color:'#0f172a',maxWidth:'330px'}); document.body.appendChild(ghostEl); if(srcCard) srcCard.classList.add('dragging') } ghostEl.style.transform=`translate3d(${e.clientX+10}px,${e.clientY+10}px,0)`; const col=hitCol(e.clientX,e.clientY); if(col!==overCol){ if(overCol) overCol.classList.remove('over'); overCol=col; if(col) col.classList.add('over') } })\n    d2.on(window,'pointerup',async (e)=>{ if(!drag) return; const d=drag, moved=drag.moved, col=hitCol(e.clientX,e.clientY); clearDrag(); if(!moved){ const rec=d2.data('leads').records().find(r=>r._id===d.id); if(rec){ d2.state.draft={...rec}; d2.state.selectedId=rec._id; d2.state.empSuppress=rec.empresa||'' } return } const stage=(col&&col.dataset)?col.dataset.stage:null; if(stage){ const L=d2.data('leads'); const rec=L.records().find(r=>r._id===d.id); if(rec && rec.etapa!==stage){ const nowIso=new Date().toISOString(); const upd={ ...rec, etapa:stage, etapa_desde:nowIso, historico:[ ...((rec.historico)||[]), { de:rec.etapa||'', para:stage, em:nowIso } ], movimentacoes:(((rec.movimentacoes)||0)+1) }; if(stage==='Fechado' && !rec.fechado_em) upd.fechado_em=nowIso; await L.update(upd); if(stage==='Fechado'||stage==='Customer Success') fireCele(stage) } } })\n    d2.onUnmount(()=>{ if(ghostEl) ghostEl.remove() })\n    d2.on('[data-forigem]','click',(e,el)=>{ d2.state.filterOrigem=el.dataset.forigem })\n    d2.on('[data-ftipo]','click',(e,el)=>{ d2.state.filterTipo=el.dataset.ftipo })\n    d2.on('[data-fflag]','click',(e,el)=>{ d2.state.filterFlag = el.dataset.fflag||'' })\n    d2.on('[data-fverif]','click',(e,el)=>{ const v=el.dataset.fverif; d2.state.filterVerif=v; if(!v) d2.state.filterVerifDias=0 })\n    d2.on('.verifdays','input',(e,el)=>{ const n=parseInt(el.value,10); d2.state.filterVerifDias=(n>0?n:0) })\n    d2.on('[data-fnovo]','click',(e,el)=>{ d2.state.filterNovo90=el.dataset.fnovo||'' })\n    d2.on('.fpais','change',(e,el)=>{ d2.state.filterPais = el.value||'' })\n    d2.on('[data-fpais]','click',(e,el)=>{ d2.state.filterPais = el.dataset.fpais||'' })\n    d2.on('[data-freg]','click',(e,el)=>{ d2.state.filterRegiao = el.dataset.freg||''; d2.state.pop=null })\n    d2.on('[data-pop]','click',(e,el)=>{ const k=el.dataset.pop; d2.state.pop = (d2.state.pop===k)? null : k })\n    // Fecha o popover ao clicar fora. composedPath() atravessa o shadow DOM —\n    // num listener de window o e.target vem retargetado para o host, e um\n    // closest('.popwrap') nunca acertaria no painel.\n    d2.on(window,'pointerdown',(e)=>{\n      if(!d2.state.pop) return\n      const path = (e.composedPath? e.composedPath() : [])\n      for(let i=0;i<path.length;i++){ const n=path[i]; if(n && n.classList && n.classList.contains('popwrap')) return }\n      d2.state.pop=null\n    })\n    d2.on('[data-varq]','click',(e,el)=>{ d2.state.verArquivados = el.dataset.varq==='1' })\n    d2.on('[data-ioscope]','click',(e,el)=>{ d2.state.ioScope=el.dataset.ioscope })\n    d2.on('[data-ioarq]','click',(e,el)=>{ d2.state.ioArq = el.dataset.ioarq==='1' })\n    d2.on('.iofile','change',async (e,el)=>{\n      const f = el.files && el.files[0]; if(!f) return\n      const XL = d2.lib(IO_LIB)\n      if(!XL){ d2.state.impErr='A biblioteca de planilhas ainda esta a carregar — tente outra vez em um instante.'; return }\n      d2.state.impErr=''; d2.state.impPlan=null; d2.state.impDone=null\n      try{\n        let wb\n        if(/\\.csv$/i.test(f.name)){ const txt=await f.text(); wb=XL.read(txt,{type:'string'}) }\n        else { const buf=await f.arrayBuffer(); wb=XL.read(buf,{type:'array'}) }\n        const ws = wb.Sheets[wb.SheetNames[0]]\n        if(!ws){ d2.state.impErr='O ficheiro nao tem nenhuma folha legivel.'; return }\n        const aoa = XL.utils.sheet_to_json(ws,{header:1, raw:false, defval:''})\n        if(!aoa.length){ d2.state.impErr='A primeira folha do ficheiro esta vazia.'; return }\n        const stageNames = stagesSorted(d2).map(x=>x.nome)\n        const plan = ioBuildPlan(aoa, d2.data('leads').records(), stageNames)\n        if(!plan.colunas){ d2.state.impErr='Nenhuma coluna do ficheiro corresponde a um campo de lead. Exporte primeiro para ver os cabecalhos esperados.'; return }\n        plan.ficheiro = f.name\n        d2.state.impPlan = plan\n      }catch(err){ d2.state.impErr='Nao foi possivel ler o ficheiro: '+((err&&err.message)||err) }\n    })\n    d2.on('[data-restore]','click',async (e,el)=>{ if(e.stopPropagation) e.stopPropagation(); const id=el.dataset.restore; if(!id) return; await d2.data('leads').update({_id:id, arquivado:false, arquivado_em:null}) })\n    let searchTimer=null\n    d2.on('.search','input',(e,el)=>{ const v=el.value; if(searchTimer) clearTimeout(searchTimer); searchTimer=setTimeout(()=>{ d2.state.search=v }, 180) })\n    d2.onUnmount(()=>{ if(searchTimer) clearTimeout(searchTimer) })\n    d2.on('[data-df]','input',(e,el)=>{ setDraft({[el.dataset.df]:el.value}) })\n    // Trava os dois campos de país no blur: o que o utilizador digitou é\n    // resolvido pelo alias e depois validado contra PAISES_LISTA. Não\n    // reconhecido REPÕE o valor gravado em vez de apagar — assim um país\n    // legado fora da lista não morre num blur acidental.\n    const lockPais = (e,el)=>{\n      const k = el.dataset.df\n      const lock = paisLock(el.value)\n      const rec = (d2.state.selectedId && d2.state.selectedId!=='new') ? d2.data('leads').records().find(r=>r._id===d2.state.selectedId) : null\n      const keep = lock || (rec ? (rec[k]||'') : '')\n      el.value = keep\n      setDraft({[k]: keep})\n    }\n    d2.on('input[data-df=\"pais_sede\"]','change',lockPais)\n    d2.on('input[data-df=\"pais_lead\"]','change',lockPais)\n    d2.on('select[data-df]','change',(e,el)=>{ setDraft({[el.dataset.df]:el.value}) })\n    d2.on('input[data-df=\"data_conexao\"]','click',(e,el)=>{ try{ if(el.showPicker) el.showPicker() }catch(_){} })\n    d2.on('input[data-df=\"verificado_em\"]','click',(e,el)=>{ try{ if(el.showPicker) el.showPicker() }catch(_){} })\n    d2.on('input[data-df=\"cargo_inicio\"]','click',(e,el)=>{ try{ if(el.showPicker) el.showPicker() }catch(_){} })\n    d2.on('[data-empinput]','input',(e,el)=>{ if(d2.state.empSuppress) d2.state.empSuppress='' })\n    d2.on('[data-emppick]','click',(e,el)=>{ const nome=el.dataset.emppick; try{ const inp=el.closest('.empwrap')&&el.closest('.empwrap').querySelector('input[data-empinput]'); if(inp) inp.value=nome }catch(_){}; const recs=d2.data('leads').records().filter(r=>(r.empresa||'').trim()===nome); const g={pais_sede:'',cidade_sede:'',filiais_europa:[],origem:''}; recs.forEach(r=>{ if(!g.pais_sede&&r.pais_sede)g.pais_sede=r.pais_sede; if(!g.cidade_sede&&r.cidade_sede)g.cidade_sede=r.cidade_sede; if(!g.filiais_europa.length&&Array.isArray(r.filiais_europa)&&r.filiais_europa.length)g.filiais_europa=r.filiais_europa; if(!g.origem&&r.origem)g.origem=r.origem }); setDraft({empresa:nome, pais_sede:g.pais_sede, cidade_sede:g.cidade_sede, filiais_europa:g.filiais_europa, pais_lead:g.pais_sede, cidade_lead:g.cidade_sede, origem:g.origem||(d2.state.draft||{}).origem||''}); d2.state.empSuppress=nome })\n    d2.on('[data-view]','click',(e,el)=>{ d2.state.view = el.dataset.view })\n    d2.on('[data-mpor]','click',(e,el)=>{ d2.state.mapaPor = el.dataset.mpor })\n    d2.on('[data-logoact]','click',(e,el)=>{ const v=el.dataset.logoact; setDraft({ dominio: v==='clear' ? '' : v }) })\n    d2.on('[data-filinput]','input',(e,el)=>{ setDraft({_filnew:el.value}) })\n    d2.on('[data-filinput]','keydown',(e,el)=>{ if(e.key==='Enter'){ if(e.preventDefault) e.preventDefault(); addFil() } })\n    d2.on('[data-remfil]','click',(e,el)=>{ const i=+el.dataset.remfil; const arr=[...(((d2.state.draft||{}).filiais_europa)||[])]; arr.splice(i,1); setDraft({filiais_europa:arr}) })\n    d2.on('[data-setstage]','click',(e,el)=>{ setDraft({etapa:el.dataset.setstage}) })\n    d2.on('[data-tv]','click',(e,el)=>{ setDraft({tipo_venda:el.dataset.tv}) })\n    d2.on('[data-orig]','click',(e,el)=>{ setDraft({origem:el.dataset.orig}) })\n    d2.on('[data-abord]','click',(e,el)=>{ setDraft({abordagem:el.dataset.abord}) })\n    d2.on('[data-remadd]','click',(e,el)=>{ const days=+el.dataset.remadd; setDraft({lembrete_data:new Date(Date.now()+days*864e5).toISOString().slice(0,10), lembrete_ativo:true}) })\n    d2.on('[data-egf]','input',(e,el)=>{ d2.state.etDraft={...(d2.state.etDraft||{}), [el.dataset.egf]:el.value} })\n    d2.on('[data-etedit]','click',(e,el)=>{ const et=d2.data('etapas').records().find(r=>r._id===el.dataset.etedit); if(et) d2.state.etDraft={...et} })\n    d2.on('[data-etdel]','click',async (e,el)=>{ await d2.data('etapas').remove(el.dataset.etdel) })\n    d2.on('[data-etup]','click',async (e,el)=>{ await reorderEtapa(d2, el.dataset.etup, -1) })\n    d2.on('[data-etdown]','click',async (e,el)=>{ await reorderEtapa(d2, el.dataset.etdown, 1) })\n    d2.on('[data-act]','click',async (e,el)=>{\n      const a=el.dataset.act\n      if(d2.state.pop) d2.state.pop=null\n      if(a==='filclear'){\n        d2.state.filterOrigem=''; d2.state.filterTipo=''; d2.state.filterFlag=''\n        d2.state.filterVerif=''; d2.state.filterVerifDias=0; d2.state.filterNovo90=''\n        d2.state.filterPais=''; d2.state.filterRegiao=''; d2.state.search=''\n        // o input de busca e controlado pelo utilizador, nao pelo template:\n        // sem isto o texto ficava no ecra depois de limpar o estado.\n        try{ const si=d2.root&&d2.root.querySelector('.search'); if(si) si.value='' }catch(_){}\n      }\n      else if(a==='novo'){ d2.state.draft={etapa:defaultStage(d2), origem:'Enterprise', tipo_venda:'', lembrete_ativo:false, status_empresa:'Ativo'}; d2.state.selectedId='new'; d2.state.empSuppress='' }\n      else if(a==='relatorio'){ d2.router('kanban-router').goTo('/relatorio') }\n      else if(a==='ioexp'){ d2.state.ioOpen='exp' }\n      else if(a==='ioimp'){ d2.state.ioOpen='imp'; d2.state.impPlan=null; d2.state.impErr=''; d2.state.impDone=null }\n      else if(a==='ioclose'){ d2.state.ioOpen=null; d2.state.impPlan=null; d2.state.impErr=''; d2.state.impDone=null }\n      else if(a==='impreset'){ d2.state.impPlan=null; d2.state.impErr=''; d2.state.impDone=null }\n      else if(a==='expcsv' || a==='expxlsx'){\n        const XL=d2.lib(IO_LIB); if(!XL) return\n        const L2=d2.data('leads')\n        const incArq=!!d2.state.ioArq\n        let recs=L2.records().filter(r=> incArq ? true : !r.arquivado)\n        if((d2.state.ioScope||'all')==='filt'){ const vis=d2.$('.card').map(c=>c.dataset.id); recs=recs.filter(r=>vis.indexOf(r._id)>=0) }\n        const ws=XL.utils.aoa_to_sheet(ioAoa(recs))\n        const hoje=new Date().toISOString().slice(0,10)\n        if(a==='expcsv'){\n          const csv=XL.utils.sheet_to_csv(ws)\n          ioDownload(new Blob(['﻿'+csv],{type:'text/csv;charset=utf-8'}), 'leads-kanban-'+hoje+'.csv')\n        } else {\n          const wb=XL.utils.book_new(); XL.utils.book_append_sheet(wb,ws,'Leads')\n          const out=XL.write(wb,{bookType:'xlsx',type:'array'})\n          ioDownload(new Blob([out],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}), 'leads-kanban-'+hoje+'.xlsx')\n        }\n      }\n      else if(a==='impconfirm'){\n        const plan=d2.state.impPlan; if(!plan) return\n        const L2=d2.data('leads')\n        const jobs=plan.creates.map(c=>({t:'c',p:c.payload})).concat(plan.updates.map(u=>({t:'u',p:u.payload})))\n        if(!jobs.length) return\n        let done=0, falhas=0, idx=0\n        d2.state.impProg={done:0,total:jobs.length}\n        const worker=async()=>{\n          while(idx<jobs.length){\n            const j=jobs[idx++]\n            try{ if(j.t==='c') await L2.create(j.p); else await L2.update(j.p) }catch(_){ falhas++ }\n            done++\n            if(done%5===0 || done===jobs.length) d2.state.impProg={done:done,total:jobs.length}\n          }\n        }\n        await Promise.all(Array.from({length:Math.min(6,jobs.length)},worker))\n        d2.state.impProg=null\n        d2.state.impDone={criados:plan.creates.length, actualizados:plan.updates.length, falhas:falhas}\n        d2.state.impPlan=null\n        await L2.refresh(); await L2.loadAll()\n      }\n      else if(a==='gerir'){ d2.state.etDraft={cor:'#6366f1'}; d2.state.gerirOpen=true }\n      else if(a==='close'){ d2.state.selectedId=null }\n      else if(a==='togglefull'){ d2.state.panelFull=!d2.state.panelFull }\n      else if(a==='verhoje'){ setDraft({verificado_em:new Date().toISOString().slice(0,10)}) }\n      else if(a==='verclear'){ setDraft({verificado_em:''}) }\n      else if(a==='cargotoggle'){ setDraft({cargo_confirmado:!(d2.state.draft||{}).cargo_confirmado}) }\n      else if(a==='gclose'){ d2.state.gerirOpen=false }\n      else if(a==='remtoggle'){ setDraft({lembrete_ativo:!(d2.state.draft||{}).lembrete_ativo}) }\n      else if(a==='remclear'){ setDraft({lembrete_data:'', lembrete_ativo:false, lembrete_nota:''}) }\n      else if(a==='hottoggle'){ setDraft({lead_quente:!(d2.state.draft||{}).lead_quente}) }\n      else if(a==='engtoggle'){ setDraft({lead_engajado:!(d2.state.draft||{}).lead_engajado}) }\n      else if(a==='filadd'){ addFil() }\n      else if(a==='save'){ const dr=d2.state.draft||{}, emp=(dr.empresa||'').trim(), novo=dr.origem||'', sel=d2.state.selectedId, L=d2.data('leads'); const orig = sel==='new'?null:((L.records().find(r=>r._id===sel)||{}).origem||''); const changed = sel==='new'? !!novo : (novo!==orig); const others=(changed&&emp&&novo)?L.records().filter(r=>(r.empresa||'').trim()===emp && r._id!==sel && (r.origem||'')!==novo):[]; if(others.length){ d2.state.confirmTamanho={emp, novo, n:others.length} } else { const rs=await saveLead(d2); if(rs && rs.etapaChanged && (rs.etapa==='Fechado'||rs.etapa==='Customer Success')) fireCele(rs.etapa) } }\n      else if(a==='tamCancel'){ d2.state.confirmTamanho=null }\n      else if(a==='tamConfirm'){ const c=d2.state.confirmTamanho||{}; const novo=c.novo, emp=c.emp, L=d2.data('leads'); const rs=await saveLead(d2); const others=L.records().filter(r=>(r.empresa||'').trim()===emp && (r.origem||'')!==novo); for(const r of others){ await L.update({...r, origem:novo}) } d2.state.confirmTamanho=null; if(rs && rs.etapaChanged && (rs.etapa==='Fechado'||rs.etapa==='Customer Success')) fireCele(rs.etapa) }\n      else if(a==='delete'){ const id=d2.state.selectedId; if(id&&id!=='new'){ const r=d2.data('leads').records().find(x=>x._id===id)||{}; d2.state.confirmDelete={id, nome:r.nome||'', empresa:r.empresa||''} } }\n      else if(a==='restore'){ const id=d2.state.selectedId; if(id&&id!=='new'){ await d2.data('leads').update({_id:id, arquivado:false, arquivado_em:null}) } d2.state.selectedId=null }\n      else if(a==='delCancel'){ d2.state.confirmDelete=null }\n      else if(a==='delConfirm'){ const c=d2.state.confirmDelete||{}; if(c.id){ await d2.data('leads').update({_id:c.id, arquivado:true, arquivado_em:new Date().toISOString()}) } d2.state.confirmDelete=null; d2.state.selectedId=null }\n      else if(a==='etsave'){ await saveEtapa(d2) }\n      else if(a==='etclear'){ d2.state.etDraft={cor:'#6366f1'} }\n    })\n  }\n}"}},"leads":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"leads"}}}},"etapas":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"etapas"}}}}}}}}}},{"_id":"6a6939b3253cab7975053081","component":"data2-core-types@Component","system":"69fe34b018c813c5be7bddd9","params":{"extends":"data2-core-primitives@Block","component":"funnelreport","package":"people-le-moura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"function stagesSorted(d2){ return [...d2.data('etapas').records()].sort((a,b)=>(a.ordem||0)-(b.ordem||0)) }\nfunction daysBetween(a,b){ const t=(new Date(b)-new Date(a))/864e5; return t>0?t:0 }\n// Chaves sem acento + normalizacao na leitura: uma entrada cobre todas as\n// variantes de acento. Espelha FLAG_PAIS do kanbanboard.\nfunction normP(s){ return (s==null?'':String(s)).toLowerCase().normalize('NFD').replace(/[^a-z0-9 ]+/g,'').trim() }\nconst FLAG_PAIS = {'portugal':'🇵🇹','espanha':'🇪🇸','franca':'🇫🇷','alemanha':'🇩🇪','italia':'🇮🇹','holanda':'🇳🇱','paises baixos':'🇳🇱','austria':'🇦🇹','irlanda':'🇮🇪','suecia':'🇸🇪','uk':'🇬🇧','reino unido':'🇬🇧','estonia':'🇪🇪','suica':'🇨🇭','polonia':'🇵🇱','dinamarca':'🇩🇰','finlandia':'🇫🇮','romenia':'🇷🇴','belgica':'🇧🇪','mexico':'🇲🇽','brasil':'🇧🇷','brazil':'🇧🇷','luxemburgo':'🇱🇺','noruega':'🇳🇴','republica tcheca':'🇨🇿','republica checa':'🇨🇿','eslovenia':'🇸🇮','eslovaquia':'🇸🇰','hungria':'🇭🇺','grecia':'🇬🇷','bulgaria':'🇧🇬','croacia':'🇭🇷','servia':'🇷🇸','lituania':'🇱🇹','letonia':'🇱🇻','islandia':'🇮🇸','malta':'🇲🇹','monaco':'🇲🇨','chipre':'🇨🇾','turquia':'🇹🇷','ucrania':'🇺🇦','russia':'🇷🇺','estados unidos':'🇺🇸','canada':'🇨🇦','argentina':'🇦🇷','chile':'🇨🇱','colombia':'🇨🇴','japao':'🇯🇵','china':'🇨🇳','india':'🇮🇳','mocambique':'🇲🇿','angola':'🇦🇴','africa do sul':'🇿🇦','australia':'🇦🇺','israel':'🇮🇱','emirados arabes unidos':'🇦🇪'}\nfunction flagOf(c){ if(!c) return ''; return FLAG_PAIS[normP(String(c).split('/')[0])]||'' }\nexport default {\n  css: `\n  .rp{position:fixed;inset:0;display:flex;flex-direction:column;background:#f1f5f9;font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;color:#0f172a;overflow:hidden}\n  .load{display:flex;align-items:center;justify-content:center;height:100%;color:#94a3b8;font-size:14px}\n  .top{display:flex;align-items:center;gap:16px;padding:14px 22px;background:#fff;border-bottom:1px solid #e2e8f0}\n  .back{padding:9px 14px;border:1px solid #cbd5e1;border-radius:9px;background:#fff;font-size:13px;font-weight:700;color:#334155;cursor:pointer}\n  .back:hover{background:#f8fafc}\n  .ttl .t{font-size:19px;font-weight:800;letter-spacing:-.02em}\n  .ttl .s{font-size:11px;color:#94a3b8;margin-top:1px}\n  .filters{display:flex;align-items:center;gap:20px;padding:12px 22px;background:#fff;border-bottom:1px solid #e2e8f0;flex-wrap:wrap}\n  .fg{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n  .fl{font-size:9px;font-weight:800;color:#94a3b8;letter-spacing:.06em;margin-right:4px}\n  .chip{padding:6px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#fff;font-size:12px;font-weight:600;color:#475569;cursor:pointer}\n  .chip.on{background:#4f46e5;border-color:#4f46e5;color:#fff}\n  .di{padding:7px 10px;border:1px solid #cbd5e1;border-radius:8px;background:#f8fafc;font-size:12px;color:#0f172a;outline:none;font-family:inherit}\n  .dash{color:#94a3b8;font-size:12px}\n  .clr{padding:6px 10px;border:0;border-radius:8px;background:#e2e8f0;color:#475569;font-size:11px;font-weight:700;cursor:pointer}\n  .kpis{display:flex;gap:12px;padding:16px 22px 4px;flex-wrap:wrap}\n  .kpi{flex:1 1 160px;min-width:150px;padding:14px 16px;background:#fff;border:1px solid #eef2f6;border-radius:12px;box-shadow:0 1px 2px rgba(15,23,42,.04)}\n  .kpi .kv{font-size:24px;font-weight:800;letter-spacing:-.02em}\n  .kpi .kl{font-size:11px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.03em;margin-top:2px}\n  .kpi.won .kv{color:#16a34a}\n  .grid{flex:1;display:grid;grid-template-columns:1.15fr .85fr;gap:16px;padding:16px 22px 22px;overflow:hidden;min-height:0}\n  .panel2{background:#fff;border:1px solid #eef2f6;border-radius:14px;padding:16px 18px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 1px 3px rgba(15,23,42,.04)}\n  .ph{font-size:14px;font-weight:800;margin-bottom:12px}\n  .phs{display:block;font-size:10px;font-weight:600;color:#94a3b8;margin-top:2px}\n  .funnel{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:7px;padding-right:4px}\n  .frow2{display:grid;grid-template-columns:150px 1fr 40px 56px;align-items:center;gap:10px}\n  .fname{font-size:11px;font-weight:700;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n  .fbarwrap{background:#f1f5f9;border-radius:7px;height:26px;overflow:hidden}\n  .fbar{height:100%;display:flex;align-items:center;justify-content:flex-end;min-width:26px;border-radius:7px;transition:width .3s;padding-right:8px}\n  .fbn{color:#fff;font-size:11px;font-weight:800}\n  .fpc{font-size:11px;font-weight:700;color:#64748b;text-align:right}\n  .fcv{font-size:11px;font-weight:800;color:#16a34a;text-align:right}\n  .dwell{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:7px;padding-right:4px}\n  .drow{display:grid;grid-template-columns:150px 1fr 66px;align-items:center;gap:10px}\n  .dname{font-size:11px;font-weight:700;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n  .dbarwrap{background:#f1f5f9;border-radius:7px;height:20px;overflow:hidden}\n  .dbar{height:100%;border-radius:7px;transition:width .3s}\n  .dval{font-size:11px;font-weight:700;color:#475569;text-align:right}\n  .muted{color:#cbd5e1;font-weight:600}\n  .rcol{display:flex;flex-direction:column;gap:16px;min-height:0;overflow:hidden}\n  .rcol .panel2{flex:1;min-height:0}\n  .geo{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:6px;padding-right:4px}\n  .grow2{display:grid;grid-template-columns:132px 1fr 58px;align-items:center;gap:10px}\n  .gname{font-size:11px;font-weight:700;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n  .gbarwrap{background:#f1f5f9;border-radius:7px;height:18px;overflow:hidden}\n  .gbar{height:100%;border-radius:7px;background:#4f46e5}\n  .gval{font-size:11px;font-weight:700;color:#475569;text-align:right}\n  .note{margin-top:12px;font-size:10px;color:#94a3b8;line-height:1.4;border-top:1px dashed #e2e8f0;padding-top:10px}\n  `,\n  render(d2){\n    const L=d2.data('leads'), E=d2.data('etapas')\n    if(L.loading||E.loading) return `<div class=\"rp\"><div class=\"load\">A carregar relatório…</div></div>`\n    const esc=s=>(s==null?'':String(s)).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/\"/g,'&quot;')\n    const st=d2.state\n    const etapas=stagesSorted(d2)\n    const ordOf={}, colOf={}\n    etapas.forEach(e=>{ ordOf[e.nome]=e.ordem||0; colOf[e.nome]=e.cor||'#64748b' })\n    const nowIso=new Date().toISOString()\n    const fO=st.fO||'', fT=st.fT||'', pFrom=st.pFrom||'', pTo=st.pTo||''\n    const inPeriod=r=>{ if(!pFrom&&!pTo) return true; const d=(r.data_conexao||'').slice(0,10); if(!d) return false; if(pFrom&&d<pFrom) return false; if(pTo&&d>pTo) return false; return true }\n    const match=r=>!r.arquivado&&(!fO||r.origem===fO)&&(!fT||r.tipo_venda===fT)&&inPeriod(r)\n    const leads=L.records().filter(match)\n    const total=leads.length\n    const reachN=et=>{ const o=ordOf[et.nome]; return leads.filter(r=>((ordOf[r.etapa]||0)>=o)||(Array.isArray(r.historico)&&r.historico.some(h=>h&&h.para===et.nome))).length }\n    const rc=etapas.map(et=>({et,n:reachN(et)}))\n    const maxR=Math.max(1,...rc.map(x=>x.n))\n    const funnel=rc.map((x,i)=>{ const pt=total?Math.round(x.n/total*100):0; const nx=rc[i+1]; const cv=(nx&&x.n)?Math.round(nx.n/x.n*100):null; const w=Math.round(x.n/maxR*100); return `<div class=\"frow2\"><div class=\"fname\">${esc(x.et.nome)}</div><div class=\"fbarwrap\"><div class=\"fbar\" style=\"width:${w}%;background:${esc(colOf[x.et.nome])}\"><span class=\"fbn\">${x.n}</span></div></div><div class=\"fpc\">${pt}%</div><div class=\"fcv\">${cv==null?'—':(cv+'% ↓')}</div></div>` }).join('')\n    const dSum={}, dCnt={}\n    leads.forEach(r=>{ const h=Array.isArray(r.historico)?[...r.historico].filter(x=>x&&x.em&&x.para).sort((a,b)=>a.em<b.em?-1:1):[]; for(let k=0;k<h.length;k++){ const stg=h[k].para; const end=(k+1<h.length)?h[k+1].em:(r.etapa===stg?nowIso:null); if(!end) continue; const dd=daysBetween(h[k].em,end); dSum[stg]=(dSum[stg]||0)+dd; dCnt[stg]=(dCnt[stg]||0)+1 } })\n    const dRows=etapas.map(et=>{ const c=dCnt[et.nome]||0; return {et,c,avg:c?dSum[et.nome]/c:0} })\n    const maxD=Math.max(1,...dRows.map(x=>x.avg))\n    const dwell=dRows.map(x=>`<div class=\"drow\"><div class=\"dname\">${esc(x.et.nome)}</div><div class=\"dbarwrap\">${x.c?`<div class=\"dbar\" style=\"width:${Math.max(3,Math.round(x.avg/maxD*100))}%;background:${esc(colOf[x.et.nome])}\"></div>`:''}</div><div class=\"dval\">${x.c?(x.avg<1?'<1d':Math.round(x.avg)+'d'):'<span class=\"muted\">a acumular</span>'}</div></div>`).join('')\n    const isClosed=r=>!!r.fechado_em||r.etapa==='Fechado'||r.etapa==='Customer Success'\n    const closed=leads.filter(isClosed)\n    const winRate=total?Math.round(closed.length/total*100):0\n    const cyc=closed.map(r=>{ if(!r.fechado_em) return null; let s=null; if(Array.isArray(r.historico)&&r.historico.length){ const ss=[...r.historico].filter(x=>x&&x.em).sort((a,b)=>a.em<b.em?-1:1); if(ss.length) s=ss[0].em } if(!s) s=r.data_conexao||null; if(!s) return null; return daysBetween(s,r.fechado_em) }).filter(v=>v!=null)\n    const avgCyc=cyc.length?Math.round(cyc.reduce((a,b)=>a+b,0)/cyc.length):null\n    const avgMov=total?(leads.reduce((a,r)=>a+(r.movimentacoes||0),0)/total):0\n    const chip=(active,label,val,attr)=>`<button class=\"chip ${active?'on':''}\" data-${attr}=\"${esc(val)}\">${esc(label)}</button>`\n    const gcount={}\n    leads.forEach(r=>{ const c=((r.pais_lead||r.pais_sede||'')+'').trim()||'(sem info)'; gcount[c]=(gcount[c]||0)+1 })\n    const gsorted=Object.entries(gcount).sort((a,b)=>b[1]-a[1])\n    const gmax=Math.max(1,...gsorted.map(x=>x[1]))\n    const geoRows=gsorted.map(([c,n])=>`<div class=\"grow2\"><div class=\"gname\">${flagOf(c)?flagOf(c)+' ':''}${esc(c)}</div><div class=\"gbarwrap\"><div class=\"gbar\" style=\"width:${Math.max(4,Math.round(n/gmax*100))}%\"></div></div><div class=\"gval\">${n} · ${total?Math.round(n/total*100):0}%</div></div>`).join('')\n    return `<div class=\"rp\">\n      <div class=\"top\"><button class=\"back\" data-act=\"voltar\">← Voltar ao Pipeline</button><div class=\"ttl\"><div class=\"t\">Relatório de Funil</div><div class=\"s\">Pipeline Europa · conversão, tempo por etapa e fecho</div></div></div>\n      <div class=\"filters\">\n        <div class=\"fg\"><span class=\"fl\">TAMANHO</span>${chip(!fO,'Todos','','fo')}${chip(fO==='Enterprise','Enterprise','Enterprise','fo')}${chip(fO==='Mid-Market','Mid-Market','Mid-Market','fo')}</div>\n        <div class=\"fg\"><span class=\"fl\">VENDA</span>${chip(!fT,'Todas','','ft')}${chip(fT==='Sprints Rápidos','Sprints','Sprints Rápidos','ft')}${chip(fT==='AI Suite','AI Suite','AI Suite','ft')}${chip(fT==='Alocação','Alocação','Alocação','ft')}</div>\n        <div class=\"fg\"><span class=\"fl\">PERÍODO · CONEXÃO</span><input class=\"di\" type=\"date\" data-p=\"from\" value=\"${esc(pFrom)}\"/><span class=\"dash\">→</span><input class=\"di\" type=\"date\" data-p=\"to\" value=\"${esc(pTo)}\"/>${(pFrom||pTo)?`<button class=\"clr\" data-act=\"pclear\">limpar</button>`:''}</div>\n      </div>\n      <div class=\"kpis\">\n        <div class=\"kpi\"><div class=\"kv\">${total}</div><div class=\"kl\">Leads no filtro</div></div>\n        <div class=\"kpi won\"><div class=\"kv\">${closed.length} · ${winRate}%</div><div class=\"kl\">✅ Fechados · win-rate</div></div>\n        <div class=\"kpi\"><div class=\"kv\">${avgCyc==null?'—':avgCyc+'d'}</div><div class=\"kl\">⏱ Ciclo médio de venda</div></div>\n        <div class=\"kpi\"><div class=\"kv\">${avgMov.toFixed(1)}</div><div class=\"kl\">↔ Movimentações médias</div></div>\n      </div>\n      <div class=\"grid\">\n        <div class=\"panel2\"><div class=\"ph\">Funil de conversão<span class=\"phs\">alcance por etapa · % do total · conversão para a próxima</span></div><div class=\"funnel\">${funnel}</div></div>\n        <div class=\"rcol\">\n          <div class=\"panel2\"><div class=\"ph\">Tempo médio por etapa<span class=\"phs\">média de permanência, do histórico</span></div><div class=\"dwell\">${dwell}</div></div>\n          <div class=\"panel2\"><div class=\"ph\">Distribuição por país<span class=\"phs\">país do lead · fallback sede</span></div><div class=\"geo\">${geoRows}</div><div class=\"note\">Tempo/ciclo acumulam desde 28/07; alcance, conversão e geografia cobrem todo o histórico.</div></div>\n        </div>\n      </div>\n    </div>`\n  },\n  mounted(d2){\n    d2.data('leads').loadAll(); d2.data('etapas').loadAll()\n    d2.on('[data-fo]','click',(e,el)=>{ d2.state.fO=el.dataset.fo })\n    d2.on('[data-ft]','click',(e,el)=>{ d2.state.fT=el.dataset.ft })\n    d2.on('[data-p]','change',(e,el)=>{ if(el.dataset.p==='from') d2.state.pFrom=el.value; else d2.state.pTo=el.value })\n    d2.on('[data-act]','click',(e,el)=>{ const a=el.dataset.act; if(a==='voltar'){ d2.router('kanban-router').goTo('/') } else if(a==='pclear'){ d2.state.pFrom=''; d2.state.pTo='' } })\n  }\n}"}},"leads":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"leads"}}}},"etapas":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"etapas"}}}}}}}}}},{"_id":"6a9221ffeed7600008c5a6e7","component":"data2-core-types@Component","system":"69fe34b018c813c5be7bddd9","params":{"extends":"data2-core-primitives@Block","component":"preaction-reporte","package":"people-le-moura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const ESCALAS = {\n  ST: {\n    nome: 'Segurança do Trabalho',\n    abaixo: [\n      { k: 'OBSERVACAO_ST', r: 'Observação de ST', d: 'condição ou comportamento inseguro' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'contato com o risco, sem lesão' }\n    ],\n    acima: [\n      { k: 'FAC', r: 'FAC', d: 'primeiros socorros' },\n      { k: 'MTC', r: 'MTC', d: 'tratamento médico' },\n      { k: 'RWC', r: 'RWC', d: 'trabalho restrito' },\n      { k: 'LTI', r: 'LTI', d: 'afastamento' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  },\n  SA: {\n    nome: 'Segurança dos Alimentos',\n    abaixo: [\n      { k: 'OBSERVACAO_SA', r: 'Observação de SA', d: 'desvio de processo sem consumação' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'barrado antes do comensal' }\n    ],\n    acima: [\n      { k: 'NAO_EVOLUIU', r: 'Não evoluiu', d: 'descartado tecnicamente' },\n      { k: 'SUSPEITA', r: 'Suspeita', d: 'suspeita de DTHA' },\n      { k: 'LESAO', r: 'Lesão', d: 'lesão causada pelo alimento' },\n      { k: 'DTHA_ALERGIA', r: 'DTHA / Alergia', d: 'confirmada ou manifestada' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  }\n};\n\n// Casos de demonstração, acessíveis só por ?caso=<chave>. Não aparecem como botão na tela.\n// São eventos NOVOS de propósito: nenhum deles existe no histórico do painel, para que\n// o reporte feito ao vivo apareça como registro novo no topo da lista, sem duplicar nada.\nconst EXEMPLOS = [\n  { t: 'O forno', v: 'Ó, é o seguinte. Eu tava tirando a assadeira do forno combinado, aí encostei o antebraço na grade quente. Ardeu bastante, ficou uma marca vermelha. Peguei gelo do kit de primeiros socorros e botei uma gaze. Continuei o turno normal. Tô reportando como quase acidente.' },\n  { t: 'A câmara fria', v: 'Escorreguei dentro da câmara fria carregando uma caixa de carne e torci o punho. Fui no pronto-socorro, imobilizaram o punho e o médico falou pra eu não pegar peso por uma semana. Me botaram no administrativo nesse período. Estou reportando como acidente.' },\n  { t: 'A prateleira', v: 'Tava organizando o estoque seco e uma caixa de arroz caiu da prateleira de cima e bateu no meu ombro. Doeu na hora e o ombro ficou dolorido, mas não procurei ninguém e terminei o turno. Não tem roxo nem marca nenhuma. Tô reportando como quase acidente.' },\n  { t: 'O corpo estranho', v: 'Um comensal achou um pedaço duro de plástico dentro do arroz e machucou a gengiva mordendo. Ele sangrou um pouco e foi levado ao ambulatório. Estou reportando como quase acidente de segurança dos alimentos.' }\n];\n\n// d2.rush() resolve para a origem do app e devolve 404 para quem nao e builder.\n// O host de API responde publicamente e tem CORS liberado para esta origem.\nconst RUSH = 'https://people-le-moura.data2apis.com/rush/';\n\n// ---- Porta de entrada -------------------------------------------------------\n// A senha NAO vive aqui. Este componente so pergunta; quem confere e o servidor, no\n// endpoint sst-entrar, que devolve um token apenas quando a senha bate. Abrir o\n// devtools nesta pagina nao entrega a senha de ninguem.\nconst AREA_PROTEGIDA = 'app';\nconst CHAVE_TOKEN = 'preaction-acesso-app';\n\nfunction tokenGuardado() {\n  try { return localStorage.getItem(CHAVE_TOKEN) || ''; } catch (e) { return ''; }\n}\n\nfunction liberado(s) {\n  return !!((s && s.autorizado) || tokenGuardado());\n}\n\nfunction telaSenha(s) {\n  return `\n    <style>\n      .porta{display:flex;justify-content:center;padding:8vh 18px 40px}\n      .porta-cx{width:100%;max-width:372px;background:#fff;border:1px solid #d6ddd8;border-radius:4px;padding:28px 26px;display:flex;flex-direction:column;gap:12px}\n      .porta-chip{align-self:flex-start;font-size:10px;font-weight:700;letter-spacing:1.6px;border:1.5px solid #15211c;padding:3px 9px;border-radius:2px}\n      .porta-t{font-size:20px;font-weight:700;letter-spacing:-.3px;margin-top:4px;line-height:1.2}\n      .porta-d{font-size:13.5px;color:#3c4a44;line-height:1.55}\n      .porta-senha{width:100%;padding:12px 13px;border:1px solid #cfd8d2;border-radius:3px;font-size:15px;font-family:inherit;background:#fff;color:#15211c}\n      .porta-senha:focus{outline:none;border-color:#186a4b;box-shadow:0 0 0 2px rgba(24,106,75,.15)}\n      .porta-btn{padding:12px 18px;border-radius:3px;border:1px solid #15211c;background:#15211c;color:#fff;font-size:15px;font-weight:600;font-family:inherit;cursor:pointer}\n      .porta-btn:hover{background:#000}\n      .porta-btn[disabled]{opacity:.5;cursor:not-allowed}\n      .porta-err{font-size:13px;color:#8c2a1e;font-weight:600}\n    </style>\n    <div class=\"porta\">\n      <div class=\"porta-cx\">\n        <div class=\"porta-chip\">PREACTION</div>\n        <div class=\"porta-t\">Demonstração PreAction</div>\n        <div class=\"porta-d\">Ambiente fechado, com dados fictícios. Informe a senha para continuar.</div>\n        <input class=\"porta-senha\" type=\"password\" placeholder=\"Senha\"${s.entrando ? ' disabled' : ''}>\n        <button class=\"porta-btn\"${s.entrando ? ' disabled' : ''}>${s.entrando ? 'Conferindo…' : 'Entrar'}</button>\n        ${s.erroSenha ? '<div class=\"porta-err\">' + esc(s.erroSenha) + '</div>' : ''}\n      </div>\n    </div>`;\n}\n\nasync function chamar(ep, corpo) {\n  let res;\n  try {\n    res = await fetch(RUSH + ep, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(corpo || {})\n    });\n  } catch (e) {\n    throw new Error('Sem resposta do serviço ' + ep + '. Verifique a conexão.');\n  }\n  if (!res.ok) throw new Error('O serviço ' + ep + ' respondeu ' + res.status + '.');\n  const json = await res.json();\n  return json && json.data !== undefined ? json.data : json;\n}\n\nconst DECL_ROTULO = {\n  QUASE_ACIDENTE: 'quase acidente',\n  OBSERVACAO_ST: 'observação de ST',\n  OBSERVACAO_SA: 'observação de SA',\n  RECONHECIMENTO_POSITIVO: 'reconhecimento positivo',\n  ACIDENTE: 'acidente',\n  NAO_INFORMADO: 'sem tipo informado'\n};\n\nfunction rotuloDeclarado(c) {\n  if (!c) return 'sem tipo informado';\n  return DECL_ROTULO[String(c).toUpperCase()] || String(c).toLowerCase().replace(/_/g, ' ');\n}\n\nfunction esc(s) {\n  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction realce(texto, trecho) {\n  const t = String(texto || '');\n  const alvo = String(trecho || '').trim();\n  if (!alvo) return esc(t);\n  const i = t.toLowerCase().indexOf(alvo.toLowerCase().slice(0, 60));\n  if (i < 0) return esc(t);\n  const fim = Math.min(t.length, i + alvo.length);\n  return esc(t.slice(0, i)) + '<mark>' + esc(t.slice(i, fim)) + '</mark>' + esc(t.slice(fim));\n}\n\nexport default {\n  css: `\n:host{all:initial}\n*{box-sizing:border-box}\n.wrap{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;color:#15211c;background:#f2f4f1;height:100%;overflow:auto;padding:20px;line-height:1.5}\n.shell{max-width:860px;margin:0 auto;display:flex;flex-direction:column;gap:14px}\n\n.top{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}\n.brand{display:flex;flex-direction:column;gap:3px}\n.brand .n{font-size:20px;font-weight:700;letter-spacing:-.2px}\n.brand .s{font-size:12.5px;color:#5b6862}\n.chip{border:1.5px solid #15211c;padding:4px 10px;font-size:11px;font-weight:700;letter-spacing:1.5px}\n\n.card{background:#fff;border:1px solid #d6ddd8;border-radius:4px}\n.card .hd{padding:11px 16px;border-bottom:1px solid #e6ebe7;font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:#6b7873}\n.card .bd{padding:16px}\n\n.tabs{display:flex;gap:0;border-bottom:1px solid #d6ddd8}\n.tab{flex:1;padding:12px 8px;font-size:14px;font-weight:600;background:none;border:none;border-bottom:3px solid transparent;cursor:pointer;color:#6b7873;font-family:inherit}\n.tab[data-on=\"1\"]{color:#15211c;border-bottom-color:#186a4b}\n.tab:hover{background:#f7f9f7}\n\ntextarea{width:100%;min-height:130px;padding:12px;border:1px solid #cfd8d2;border-radius:3px;font:400 14.5px/1.55 inherit;resize:vertical;color:#15211c;background:#fff}\ntextarea:focus{outline:2px solid #186a4b;outline-offset:-1px}\n\n.btn{padding:10px 18px;border-radius:3px;border:1px solid #15211c;background:#15211c;color:#fff;font:600 14px inherit;cursor:pointer;font-family:inherit}\n.btn:hover{background:#000}\n.btn[disabled]{opacity:.4;cursor:not-allowed}\n.btn.ghost{background:#fff;color:#15211c}\n.btn.ghost:hover{background:#f2f4f1}\n.btn.rec{background:#b33a2b;border-color:#b33a2b}\n.btn.rec.on{background:#8c2a1e;border-color:#8c2a1e}\n.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:12px}\n.nav{display:flex;gap:10px;align-items:center}\n.nav button{padding:7px 14px;font-size:12.5px;border:1px solid #cfd8d2;background:#fff;border-radius:3px;cursor:pointer;font-family:inherit;color:#3c4a44;font-weight:600}\n.nav button:hover{border-color:#186a4b;color:#186a4b}\n.hint{font-size:12.5px;color:#6b7873}\n\n.mic{display:flex;align-items:center;gap:12px}\n.dot{width:11px;height:11px;border-radius:50%;background:#c8d0cb;flex:none}\n.dot.on{background:#b33a2b;animation:pulse 1.1s infinite}\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:.25}}\n@media (prefers-reduced-motion:reduce){.dot.on{animation:none}}\n\n.live{margin-top:12px;padding:12px;background:#f7f9f7;border:1px dashed #cfd8d2;border-radius:3px;min-height:70px;font-size:14.5px}\n.live .p{color:#8b968f}\n\n.ex{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}\n.ex button{padding:5px 11px;font-size:12px;border:1px solid #cfd8d2;background:#fff;border-radius:999px;cursor:pointer;font-family:inherit;color:#3c4a44}\n.ex button:hover{border-color:#186a4b;color:#186a4b}\n\n.steps{display:flex;flex-direction:column;gap:9px}\n.step{display:flex;gap:11px;align-items:center;font-size:14px;color:#8b968f}\n.step .b{width:19px;height:19px;border-radius:50%;border:2px solid #d6ddd8;flex:none;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}\n.step[data-s=\"doing\"]{color:#15211c;font-weight:600}\n.step[data-s=\"doing\"] .b{border-color:#186a4b;border-top-color:transparent;animation:spin .8s linear infinite}\n.step[data-s=\"done\"]{color:#3c4a44}\n.step[data-s=\"done\"] .b{border-color:#186a4b;background:#186a4b;color:#fff}\n@keyframes spin{to{transform:rotate(360deg)}}\n\n.alert{padding:15px 18px;border-radius:4px;display:flex;gap:14px;align-items:flex-start}\n.alert.up{background:#fbeae7;border:1.5px solid #b33a2b}\n.alert.down{background:#e7f2ec;border:1.5px solid #186a4b}\n.alert .ic{flex:none;margin-top:1px}\n.alert .t{font-size:15.5px;font-weight:700;margin-bottom:3px}\n.alert.up .t{color:#8c2a1e}\n.alert.down .t{color:#14563c}\n.alert .d{font-size:13.5px;color:#3c4a44}\n\n.pyr{display:flex;flex-direction:column;align-items:center;gap:3px;padding:4px 0}\n.lvl{width:100%;max-width:430px;display:flex;align-items:center;gap:9px;padding:7px 12px;border-radius:3px;background:#f2f4f1;font-size:13px;border:1.5px solid transparent}\n.lvl .k{font-weight:700;min-width:112px;font-size:12.5px}\n.lvl .d{color:#6b7873;font-size:12px;flex:1}\n.lvl .tag{font-size:9.5px;font-weight:700;letter-spacing:.8px;padding:2px 6px;border-radius:2px;white-space:nowrap}\n.lvl.apurado{background:#fff;border-color:#15211c;box-shadow:0 1px 4px rgba(0,0,0,.1)}\n.lvl.apurado .tag{background:#15211c;color:#fff}\n.lvl.declarado .tag{background:#d6ddd8;color:#3c4a44}\n.lvl.acima{background:#fdf3f1}\n.lvl.acima.apurado{background:#fbeae7;border-color:#b33a2b}\n.lvl.acima.apurado .tag{background:#b33a2b}\n.linha{width:100%;max-width:430px;display:flex;align-items:center;gap:9px;margin:6px 0}\n.linha .r{flex:1;height:2.5px;background:#15211c}\n.linha .l{font-size:9.5px;font-weight:700;letter-spacing:1.3px;color:#15211c;white-space:nowrap}\n\n.kv{display:grid;grid-template-columns:150px 1fr;gap:7px 14px;font-size:13.5px}\n.kv dt{color:#6b7873;font-size:11px;letter-spacing:.7px;text-transform:uppercase;padding-top:2px}\n.kv dd{margin:0}\nmark{background:#ffe9a8;padding:1px 2px;border-radius:2px}\n.quote{border-left:3px solid #b33a2b;padding:9px 13px;background:#fdf3f1;font-size:14px;border-radius:0 3px 3px 0}\n.just{font-size:13.5px;color:#3c4a44;margin-top:10px}\n.desc{font-size:14px;background:#f7f9f7;padding:12px;border-radius:3px;border:1px solid #e6ebe7}\n\n.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:10px 18px}\n.fld{display:flex;flex-direction:column;gap:2px}\n.fld .l{font-size:10px;letter-spacing:.7px;text-transform:uppercase;color:#6b7873}\n.fld .v{font-size:13.5px;font-weight:500}\n.warn{font-size:12px;color:#8c6d1f;background:#fdf6e3;border:1px solid #f0e0b0;padding:8px 11px;border-radius:3px;margin-top:11px}\n.err{font-size:13px;color:#8c2a1e;background:#fbeae7;border:1px solid #e6b8b0;padding:11px 13px;border-radius:3px}\n.ok{font-size:13.5px;color:#14563c;background:#e7f2ec;border:1px solid #a9d3bf;padding:11px 13px;border-radius:3px}\nimg.prev{max-width:100%;border:1px solid #d6ddd8;border-radius:3px;margin-top:11px;display:block}\ninput[type=file]{font-size:13px;font-family:inherit}\ntextarea.desc-edit{width:100%;min-height:104px;padding:13px;border:1px solid #cfd8d2;border-radius:3px;font:400 14.5px/1.6 inherit;resize:vertical;color:#15211c;background:#f7f9f7}\ntextarea.desc-edit:focus{outline:2px solid #186a4b;outline-offset:-1px;background:#fff}\n.dica{font-size:12.5px;color:#6b7873;margin-top:7px}\n`,\n\n  render(d2) {\n    const s = d2.state;\n    if (!liberado(s)) return `<div class=\"wrap\">${telaSenha(s)}</div>`;\n    const etapa = s.etapa || 'entrada';\n    let corpo = '';\n\n    if (etapa === 'entrada') corpo = telaEntrada(d2, s);\n    else if (etapa === 'processando') corpo = telaProcessando(s);\n    else if (etapa === 'enviado') corpo = telaEnviado(s);\n    else corpo = telaRevisao(s);\n\n    return `<div class=\"wrap\"><div class=\"shell\">\n      <div class=\"top\">\n        <div class=\"brand\">\n          <div class=\"n\">Reporte PreAction</div>\n          <div class=\"s\">Quase acidente · condição de risco · comportamento de risco</div>\n        </div>\n        <div class=\"nav\">${etapa === 'revisao' ? '<button class=\"voltar-topo\">&larr; Voltar</button>' : ''}<div class=\"chip\">PREACTION</div></div>\n      </div>\n      ${corpo}\n    </div></div>`;\n  },\n\n  mounted(d2) {\n    if (!d2.state.etapa) d2.setState({ etapa: 'entrada', tab: 'voz', texto: '' });\n\n    d2.on('.tab', 'click', (e) => {\n      d2.state.tab = e.target.closest('.tab').getAttribute('data-tab');\n    });\n\n    d2.on('.ta', 'input', (e) => { d2.state.texto = e.target.value; });\n\n    let rec = null;\n    const SR = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n    d2.on('.mic-btn', 'click', () => {\n      if (d2.state.gravando) { if (rec) rec.stop(); return; }\n      if (!SR) { d2.state.erro = 'Este navegador não tem reconhecimento de fala. Use o Chrome, ou digite na aba Digitar.'; return; }\n      let base = d2.state.texto || '';\n      rec = new SR();\n      rec.lang = 'pt-BR';\n      rec.continuous = true;\n      rec.interimResults = true;\n      rec.onresult = (ev) => {\n        let firme = '', parcial = '';\n        for (let i = ev.resultIndex; i < ev.results.length; i++) {\n          const t = ev.results[i][0].transcript;\n          if (ev.results[i].isFinal) firme += t; else parcial += t;\n        }\n        if (firme) { base = (base + ' ' + firme).trim(); d2.state.texto = base; }\n        d2.state.parcial = parcial;\n      };\n      rec.onerror = (ev) => {\n        d2.setState({ gravando: false, parcial: '', erro: 'Microfone: ' + ev.error + '. Verifique a permissão do navegador.' });\n      };\n      rec.onend = () => { d2.setState({ gravando: false, parcial: '' }); };\n      try { rec.start(); d2.setState({ gravando: true, erro: '', parcial: '' }); }\n      catch (err) { d2.state.erro = 'Não consegui iniciar o microfone: ' + err.message; }\n    });\n\n    d2.on('.file', 'change', async (e) => {\n      const f = e.target.files && e.target.files[0];\n      if (!f) return;\n      d2.setState({ etapa: 'processando', passo: 'upload', erro: '' });\n      try {\n        const up = await d2.drive('sst-anexos').upload([f]);\n        const url = up && up[0] && up[0].fileUrl;\n        if (!url) throw new Error('O upload não devolveu URL do arquivo.');\n        d2.setState({ fotoUrl: url, passo: 'lendo' });\n\n        const r1 = await chamar('sst-ler-foto', { fotoUrl: url });\n        const texto = r1 && r1.texto;\n        if (!texto) throw new Error('Não consegui ler o formulário na foto.');\n        d2.setState({ texto: texto, passo: 'classificando' });\n\n        await analisar(d2, texto);\n      } catch (err) {\n        d2.setState({ etapa: 'entrada', erro: String(err.message || err) });\n      }\n    });\n\n    d2.on('.go', 'click', async () => {\n      const texto = (d2.state.texto || '').trim();\n      if (texto.length < 15) { d2.state.erro = 'Descreva o que aconteceu antes de analisar.'; return; }\n      d2.setState({ etapa: 'processando', passo: 'classificando', erro: '' });\n      try { await analisar(d2, texto); }\n      catch (err) { d2.setState({ etapa: 'entrada', erro: String(err.message || err) }); }\n    });\n\n    d2.on('.enviar', 'click', async () => {\n      const s = d2.state;\n      if (!s.ex) return;\n      d2.setState({ enviando: true, erro: '' });\n      try {\n        const protocolo = 'PA-' + String(Date.now()).slice(-5);\n        const versoes = s.versoes || [];\n        const descricaoFinal = (s.descAtual || s.ex.descricao || '').trim();\n        const corpo = Object.assign({}, s.ex, {\n          descricao: descricaoFinal,\n          descricao_editada: versoes.length > 1,\n          versoes_json: JSON.stringify(versoes),\n          versoes_total: versoes.length,\n          versoes_texto: versoes.map(function (v) { return 'v' + v.n + ' (' + v.origem + '): ' + v.texto; }).join('\\n'),\n          protocolo: protocolo,\n          criado_em: new Date().toISOString(),\n          origem: s.origem || 'texto',\n          unidade: 'Un. 4472 — Refeitório Central',\n          texto: s.textoOriginal || s.texto,\n          anexo_url: s.fotoUrl || '',\n          anexo_tipo: s.fotoUrl ? 'foto' : ''\n        });\n        const r = await chamar('sst-registrar', corpo);\n        d2.setState({ enviando: false, etapa: 'enviado', protocolo: (r && r.protocolo) || protocolo });\n      } catch (err) {\n        d2.setState({ enviando: false, erro: 'Não consegui enviar: ' + String(err.message || err) });\n      }\n    });\n\n    // Quem reporta nao tem caminho para o painel: o painel e da central de seguranca.\n    // \"Corrigir\" libera a edicao da descricao. Cada correcao concluida vira uma versao\n    // numerada, e o servidor classifica a mais pesada.\n    d2.on('.corrigir', 'click', () => { d2.setState({ editando: true, erro: '' }); });\n\n    d2.on('.concluir', 'click', () => {\n      const s = d2.state;\n      const campo = d2.$('.desc-edit');\n      const novo = campo ? campo.value.trim() : (s.descAtual || '');\n      if (novo.length < 10) { d2.setState({ erro: 'A descrição ficou curta demais. Conte o que aconteceu.' }); return; }\n      const versoes = (s.versoes || []).slice();\n      if (novo !== (s.descAtual || '')) {\n        versoes.push({ n: versoes.length + 1, texto: novo, origem: 'correcao', em: new Date().toISOString() });\n      }\n      d2.setState({ editando: false, descAtual: novo, versoes: versoes, erro: '' });\n    });\n\n    d2.on('.voltar-topo', 'click', () => {\n      d2.setState({ etapa: 'entrada', editando: false, erro: '' });\n    });\n\n    d2.on('.novo', 'click', () => {\n      d2.setState({ etapa: 'entrada', tab: 'voz', texto: '', ex: null, cl: null, salvo: null, protocolo: null, fotoUrl: null, erro: '', parcial: '', editando: false, descAtual: '', versoes: [], textoOriginal: '' });\n    });\n\n    // deep links para roteiro de demo e captura de tela:\n    //   ?aba=voz|foto|texto                   abre direto na aba\n    //   ?caso=forno|camara|prateleira|vidro   carrega e analisa o caso na hora\n    // So roda depois da porta: sem isso o caso seria analisado por tras da tela de senha,\n    // gastando chamada de modelo para quem nem entrou.\n    const aplicarDeepLinks = () => {\n      try {\n        const q = new URLSearchParams(location.search);\n        const aba = q.get('aba');\n        if (aba === 'voz' || aba === 'foto' || aba === 'texto') d2.state.tab = aba;\n        const mapa = { forno: 0, camara: 1, prateleira: 2, vidro: 3 };\n        const caso = q.get('caso');\n        if (caso && mapa[caso] !== undefined) {\n          const v = EXEMPLOS[mapa[caso]].v;\n          d2.setState({ texto: v, tab: 'texto', etapa: 'processando', passo: 'classificando', erro: '' });\n          analisar(d2, v).catch((err) => d2.setState({ etapa: 'entrada', erro: String(err.message || err) }));\n        }\n      } catch (e) { /* sem query string, segue normal */ }\n    };\n\n    const entrar = async () => {\n      const campo = d2.$('.porta-senha');\n      const senha = campo ? String(campo.value || '').trim() : '';\n      if (!senha) { d2.setState({ erroSenha: 'Digite a senha.' }); return; }\n      d2.setState({ entrando: true, erroSenha: '' });\n      try {\n        const r = await chamar('sst-entrar', { area: AREA_PROTEGIDA, senha: senha });\n        if (r && r.ok && r.token) {\n          try { localStorage.setItem(CHAVE_TOKEN, r.token); } catch (e) { /* navegador sem storage */ }\n          d2.setState({ entrando: false, autorizado: true, erroSenha: '' });\n          aplicarDeepLinks();\n        } else {\n          d2.setState({ entrando: false, erroSenha: 'Senha incorreta.' });\n        }\n      } catch (err) {\n        d2.setState({ entrando: false, erroSenha: 'Não consegui conferir a senha. ' + String(err.message || err) });\n      }\n    };\n\n    d2.on('.porta-btn', 'click', entrar);\n    d2.on('.porta-senha', 'keydown', (e) => { if (e.key === 'Enter') entrar(); });\n\n    if (liberado(d2.state)) aplicarDeepLinks();\n  }\n};\n\n// Extrai APENAS os campos do formulário. A classificação na pirâmide NAO acontece aqui\n// e nao volta para o navegador de quem reporta: ela roda no servidor, no envio.\n// Mostrar o veredito antes do envio ensinaria a pessoa a reescrever o relato para\n// escapar da linha, que e exatamente a subnotificacao que a solucao existe para combater.\nasync function analisar(d2, texto) {\n  const out = await chamar('sst-extrair', { texto: texto });\n  const ex = out && out.extraido;\n  if (!ex || !ex.descricao) throw new Error('Não consegui organizar o reporte. Tente de novo.');\n  // v1 e a descricao que a IA extraiu. Cada correcao concluida entra como v2, v3...\n  // O texto bruto do PRIMEIRO relato fica preso em textoOriginal e e ele que vai para o\n  // servidor como fonte da verdade, mesmo que a pessoa volte e reescreva o relato cru.\n  const st = d2.state;\n  const versoes = (st.versoes || []).slice();\n  const ultima = versoes.length ? versoes[versoes.length - 1].texto : null;\n  if (ex.descricao !== ultima) {\n    versoes.push({\n      n: versoes.length + 1,\n      texto: ex.descricao,\n      origem: versoes.length ? 'reanalise' : 'transcricao',\n      em: new Date().toISOString()\n    });\n  }\n  d2.setState({\n    etapa: 'revisao',\n    ex: ex,\n    editando: false,\n    descAtual: ex.descricao,\n    versoes: versoes,\n    textoOriginal: st.textoOriginal || texto,\n    origem: st.fotoUrl ? 'foto' : (st.tab === 'voz' ? 'voz' : 'texto')\n  });\n}\n\nfunction telaEntrada(d2, s) {\n  const tab = s.tab || 'voz';\n  const on = (t) => (tab === t ? '1' : '0');\n  let painel = '';\n\n  if (tab === 'voz') {\n    painel = `\n      <div class=\"mic\">\n        <span class=\"dot ${s.gravando ? 'on' : ''}\"></span>\n        <button class=\"btn rec mic-btn ${s.gravando ? 'on' : ''}\">${s.gravando ? 'Parar de gravar' : 'Falar o reporte'}</button>\n        <span class=\"hint\">${s.gravando ? 'Ouvindo… fale naturalmente, como você falaria com o encarregado.' : 'Aperte e conte o que aconteceu. Não precisa saber escrever.'}</span>\n      </div>\n      <div class=\"live\">${s.texto ? esc(s.texto) : ''}${s.parcial ? ' <span class=\"p\">' + esc(s.parcial) + '</span>' : ''}${!s.texto && !s.parcial ? '<span class=\"p\">A transcrição aparece aqui enquanto você fala.</span>' : ''}</div>`;\n  } else if (tab === 'foto') {\n    painel = `\n      <div class=\"hint\">Fotografe o formulário de papel já preenchido. A IA lê os campos marcados e a descrição manuscrita.</div>\n      <div class=\"row\"><input class=\"file\" type=\"file\" accept=\"image/*\" capture=\"environment\"></div>\n      ${s.fotoUrl ? '<img class=\"prev\" src=\"' + esc(s.fotoUrl) + '\" alt=\"Formulário enviado\">' : ''}`;\n  } else {\n    painel = `<textarea class=\"ta\" placeholder=\"Descreva o que aconteceu, com suas palavras.\">${esc(s.texto || '')}</textarea>`;\n  }  return `\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button class=\"tab\" data-tab=\"voz\"   data-on=\"${on('voz')}\">Falar</button>\n        <button class=\"tab\" data-tab=\"foto\"  data-on=\"${on('foto')}\">Fotografar o papel</button>\n        <button class=\"tab\" data-tab=\"texto\" data-on=\"${on('texto')}\">Digitar</button>\n      </div>\n      <div class=\"bd\">\n        ${painel}\n        ${s.erro ? '<div class=\"err\" style=\"margin-top:12px\">' + esc(s.erro) + '</div>' : ''}\n        ${tab !== 'foto' ? '<div class=\"row\"><button class=\"btn go\">Analisar reporte</button><span class=\"hint\">A IA organiza o que você disse no formulário.</span></div>' : ''}\n      </div>\n    </div>`;\n}\n\nfunction telaProcessando(s) {\n  const ordem = ['upload', 'lendo', 'classificando'];\n  const atual = ordem.indexOf(s.passo || 'classificando');\n  const rotulos = {\n    upload: 'Enviando a foto',\n    lendo: 'Lendo o formulário manuscrito',\n    classificando: 'Preenchendo o formulário e conferindo a pirâmide'\n  };\n  const passos = ordem.map((k, i) => {\n    const st = i < atual ? 'done' : (i === atual ? 'doing' : 'todo');\n    return `<div class=\"step\" data-s=\"${st}\"><span class=\"b\">${st === 'done' ? '<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" aria-hidden=\"true\"><path d=\"M4 12.5 9.5 18 20 6.5\" fill=\"none\" stroke=\"#fff\" stroke-width=\"3.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>' : ''}</span>${esc(rotulos[k])}</div>`;\n  }).join('');\n  return `<div class=\"card\"><div class=\"hd\">Analisando</div><div class=\"bd\"><div class=\"steps\">${passos}</div></div></div>`;\n}\n\n// Tela de conferência do colaborador. Mostra o que ELE mandou e como ficou o formulário.\n// Nao mostra nivel, nao mostra pirâmide, nao mostra se cruzou a linha.\nfunction telaRevisao(s) {\n  const ex = s.ex || {};\n\n  const incertos = (ex.campos_incertos || []).length\n    ? '<div class=\"warn\">A IA não teve certeza destes campos, confira: ' + esc((ex.campos_incertos || []).join(', ')) + '</div>' : '';\n\n  const campos = [\n    ['Setor', ex.setor], ['Turno', ex.turno], ['Tipo de reporte', ex.tipo_declarado],\n    ['Área', ex.area_declarada === 'SA' ? 'Segurança dos Alimentos' : (ex.area_declarada ? 'Segurança do Trabalho' : '')],\n    ['Agente do risco', ex.agente],\n    ['Houve lesão', ex.houve_lesao === true ? 'Sim' : (ex.houve_lesao === false ? 'Não' : '')],\n    ['Parte do corpo', ex.parte_corpo], ['Atendimento recebido', ex.atendimento],\n    ['EPI em uso', ex.epi_em_uso === true ? 'Sim' : (ex.epi_em_uso === false ? 'Não' : 'Não informado')],\n    ['Ação imediata', ex.acao_imediata],\n    ['Reportado por', ex.reportado_por], ['Função', ex.funcao]\n  ].filter((c) => c[1]).map((c) => `<div class=\"fld\"><span class=\"l\">${esc(c[0])}</span><span class=\"v\">${esc(c[1])}</span></div>`).join('');\n\n  return `\n    <div class=\"card\">\n      <div class=\"hd\">Confira antes de enviar</div>\n      <div class=\"bd\">\n        <div class=\"fld\" style=\"margin-bottom:12px\"><span class=\"l\">Título</span><span class=\"v\" style=\"font-size:16px\">${esc(ex.titulo || '')}</span></div>\n        <div class=\"rot\" style=\"font-size:10px;letter-spacing:.7px;text-transform:uppercase;color:#6b7873;margin-bottom:6px\">Descrição do fato</div>\n        ${s.editando\n          ? '<textarea class=\"desc-edit\">' + esc(s.descAtual || '') + '</textarea>' +\n            '<div class=\"dica\">Corrija o que a transcrição trocou. O que você falou continua guardado do jeito que saiu, e cada correção fica registrada.</div>'\n          : '<div class=\"desc\">' + esc(s.descAtual || '') + '</div>'}\n        <div class=\"grid2\" style=\"margin-top:16px\">${campos}</div>\n        ${incertos}\n        <div class=\"row acoes\">\n          ${s.editando\n            ? '<button class=\"btn concluir\">Concluir correção</button>'\n            : '<button class=\"btn enviar\"' + (s.enviando ? ' disabled' : '') + '>' + (s.enviando ? 'Enviando…' : 'Enviar reporte') + '</button>' +\n              '<button class=\"btn ghost corrigir\">Corrigir</button>'}\n        </div>\n        ${s.erro ? '<div class=\"err\" style=\"margin-top:11px\">' + esc(s.erro) + '</div>' : ''}\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">${s.origem === 'foto' ? 'A foto que você enviou' : 'O que você relatou, na íntegra'}</div>\n      <div class=\"bd\">\n        ${s.fotoUrl ? '<img class=\"prev\" style=\"margin:0 0 12px\" src=\"' + esc(s.fotoUrl) + '\" alt=\"Formulário enviado\">' : ''}\n        <div class=\"desc\" style=\"font-size:13.5px;color:#3c4a44\">${esc(s.texto || '')}</div>\n      </div>\n    </div>`;\n}\n\nfunction telaEnviado(s) {\n  return `\n    <div class=\"alert down\">\n      <svg class=\"ic\" viewBox=\"0 0 24 24\" width=\"23\" height=\"23\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"1.8\"/><path d=\"M7 12.4 10.6 16 17 8.6\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n      <div>\n        <div class=\"t\">Reporte enviado</div>\n        <div class=\"d\">Protocolo <strong>${esc(s.protocolo || '')}</strong>. A Gerência de Unidade já recebeu. Obrigado por reportar.</div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"bd\">\n        <div class=\"hint\" style=\"font-size:13.5px\">Se a descrição indicar que o caso precisa de apuração, o SESMT abre a investigação. Você não precisa fazer mais nada.</div>\n        <div class=\"row\">\n          <button class=\"btn novo\">Fazer outro reporte</button>\n        </div>\n      </div>\n    </div>`;\n}"}}}}}}}},{"_id":"6a922cd114ffb857b3dfa288","component":"data2-core-types@Component","system":"69fe34b018c813c5be7bddd9","params":{"extends":"data2-core-primitives@Block","component":"preaction-painel","package":"people-le-moura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const ORDEM_ST = ['OBSERVACAO_ST', 'QUASE_ACIDENTE', 'FAC', 'MTC', 'RWC', 'LTI', 'FAT'];\nconst ORDEM_SA = ['OBSERVACAO_SA', 'QUASE_ACIDENTE', 'NAO_EVOLUIU', 'SUSPEITA', 'LESAO', 'DTHA_ALERGIA', 'FAT'];\nconst ACIMA = ['FAC', 'MTC', 'RWC', 'LTI', 'FAT', 'NAO_EVOLUIU', 'SUSPEITA', 'LESAO', 'DTHA_ALERGIA'];\nconst ROTULO = {\n  OBSERVACAO_ST: 'Observação ST', OBSERVACAO_SA: 'Observação SA',\n  QUASE_ACIDENTE: 'Quase acidente', RECONHECIMENTO_POSITIVO: 'Reconhecimento',\n  FAC: 'FAC · primeiros socorros', MTC: 'MTC · tratamento médico',\n  RWC: 'RWC · trabalho restrito', LTI: 'LTI · afastamento', FAT: 'FAT · fatalidade',\n  NAO_EVOLUIU: 'Não evoluiu', SUSPEITA: 'Suspeita', LESAO: 'Lesão por alimento',\n  DTHA_ALERGIA: 'DTHA / Alergia'\n};\n\nfunction esc(s) {\n  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\nfunction eAcima(n) { return ACIMA.indexOf(n) >= 0; }\nfunction dataCurta(v) {\n  if (!v) return '—';\n  const d = new Date(v);\n  if (isNaN(d)) return '—';\n  return String(d.getDate()).padStart(2, '0') + '/' + String(d.getMonth() + 1).padStart(2, '0');\n}\n\n// d2.rush() resolve para a origem do app e devolve 404 para quem nao e builder.\nconst RUSH = 'https://people-le-moura.data2apis.com/rush/';\n\n// ---- Porta de entrada -------------------------------------------------------\n// Mesma senha da tela de reporte, porque as duas vivem no mesmo endereco e o\n// localStorage e compartilhado: entrar uma vez destranca as duas na apresentacao.\n// A senha NAO vive aqui; quem confere e o sst-entrar, no servidor.\nconst AREA_PROTEGIDA = 'app';\nconst CHAVE_TOKEN = 'preaction-acesso-app';\n\nfunction tokenGuardado() {\n  try { return localStorage.getItem(CHAVE_TOKEN) || ''; } catch (e) { return ''; }\n}\n\nfunction liberado(s) {\n  return !!((s && s.autorizado) || tokenGuardado());\n}\n\nfunction telaSenha(s) {\n  return `\n    <style>\n      .porta{display:flex;justify-content:center;padding:8vh 18px 40px}\n      .porta-cx{width:100%;max-width:372px;background:#fff;border:1px solid #d6ddd8;border-radius:4px;padding:28px 26px;display:flex;flex-direction:column;gap:12px}\n      .porta-chip{align-self:flex-start;font-size:10px;font-weight:700;letter-spacing:1.6px;border:1.5px solid #15211c;padding:3px 9px;border-radius:2px}\n      .porta-t{font-size:20px;font-weight:700;letter-spacing:-.3px;margin-top:4px;line-height:1.2}\n      .porta-d{font-size:13.5px;color:#3c4a44;line-height:1.55}\n      .porta-senha{width:100%;padding:12px 13px;border:1px solid #cfd8d2;border-radius:3px;font-size:15px;font-family:inherit;background:#fff;color:#15211c}\n      .porta-senha:focus{outline:none;border-color:#186a4b;box-shadow:0 0 0 2px rgba(24,106,75,.15)}\n      .porta-btn{padding:12px 18px;border-radius:3px;border:1px solid #15211c;background:#15211c;color:#fff;font-size:15px;font-weight:600;font-family:inherit;cursor:pointer}\n      .porta-btn:hover{background:#000}\n      .porta-btn[disabled]{opacity:.5;cursor:not-allowed}\n      .porta-err{font-size:13px;color:#8c2a1e;font-weight:600}\n    </style>\n    <div class=\"porta\">\n      <div class=\"porta-cx\">\n        <div class=\"porta-chip\">PREACTION</div>\n        <div class=\"porta-t\">Painel de Reportes</div>\n        <div class=\"porta-d\">Ambiente fechado, com dados fictícios. Informe a senha para continuar.</div>\n        <input class=\"porta-senha\" type=\"password\" placeholder=\"Senha\"${s.entrando ? ' disabled' : ''}>\n        <button class=\"porta-btn\"${s.entrando ? ' disabled' : ''}>${s.entrando ? 'Conferindo…' : 'Entrar'}</button>\n        ${s.erroSenha ? '<div class=\"porta-err\">' + esc(s.erroSenha) + '</div>' : ''}\n      </div>\n    </div>`;\n}\n\nasync function chamar(ep, corpo) {\n  let res;\n  try {\n    res = await fetch(RUSH + ep, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(corpo || {})\n    });\n  } catch (e) {\n    throw new Error('Sem resposta do serviço ' + ep + '. Verifique a conexão.');\n  }\n  if (!res.ok) throw new Error('O serviço ' + ep + ' respondeu ' + res.status + '.');\n  const json = await res.json();\n  return json && json.data !== undefined ? json.data : json;\n}\n\nconst ESCALAS = {\n  ST: {\n    nome: 'Segurança do Trabalho',\n    abaixo: [\n      { k: 'OBSERVACAO_ST', r: 'Observação de ST', d: 'condição ou comportamento inseguro' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'contato com o risco, sem lesão' }\n    ],\n    acima: [\n      { k: 'FAC', r: 'FAC', d: 'primeiros socorros' },\n      { k: 'MTC', r: 'MTC', d: 'tratamento médico' },\n      { k: 'RWC', r: 'RWC', d: 'trabalho restrito' },\n      { k: 'LTI', r: 'LTI', d: 'afastamento' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  },\n  SA: {\n    nome: 'Segurança dos Alimentos',\n    abaixo: [\n      { k: 'OBSERVACAO_SA', r: 'Observação de SA', d: 'desvio de processo sem consumação' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'barrado antes do comensal' }\n    ],\n    acima: [\n      { k: 'NAO_EVOLUIU', r: 'Não evoluiu', d: 'descartado tecnicamente' },\n      { k: 'SUSPEITA', r: 'Suspeita', d: 'suspeita de DTHA' },\n      { k: 'LESAO', r: 'Lesão', d: 'lesão causada pelo alimento' },\n      { k: 'DTHA_ALERGIA', r: 'DTHA / Alergia', d: 'confirmada ou manifestada' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  }\n};\n\nfunction codigoDeclarado(r) {\n  const t = String(r.ia_nivel_declarado || r.tipo_declarado || '').toUpperCase();\n  if (t.indexOf('QUASE') >= 0) return 'QUASE_ACIDENTE';\n  if (t.indexOf('RECONHEC') >= 0) return 'RECONHECIMENTO_POSITIVO';\n  if (t.indexOf('CONDI') >= 0 || t.indexOf('COMPORTAMENTO') >= 0 || t.indexOf('OBSERVA') >= 0) {\n    return r.ia_area === 'SA' ? 'OBSERVACAO_SA' : 'OBSERVACAO_ST';\n  }\n  if (t.indexOf('ACIDENTE') >= 0) return 'ACIDENTE';\n  return '';\n}\n\nfunction dataLonga(v) {\n  if (!v) return '—';\n  const d = new Date(v);\n  if (isNaN(d)) return '—';\n  const M = ['jan','fev','mar','abr','mai','jun','jul','ago','set','out','nov','dez'];\n  return String(d.getDate()).padStart(2, '0') + ' ' + M[d.getMonth()] + ' ' + d.getFullYear() +\n    ' · ' + String(d.getHours()).padStart(2, '0') + 'h' + String(d.getMinutes()).padStart(2, '0');\n}\n\nfunction realce(texto, trecho) {\n  const t = String(texto || '');\n  const alvo = String(trecho || '').trim();\n  if (!alvo) return esc(t);\n  const i = t.toLowerCase().indexOf(alvo.toLowerCase().slice(0, 60));\n  if (i < 0) return esc(t);\n  const fim = Math.min(t.length, i + alvo.length);\n  return esc(t.slice(0, i)) + '<mark>' + esc(t.slice(i, fim)) + '</mark>' + esc(t.slice(fim));\n}\n\nfunction pill(st) {\n  if (!st || st === 'Novo' || st === 'Alerta aberto') return '';\n  if (st === 'Em investigação') return '<span class=\"pill inv\">EM INVESTIGAÇÃO</span>';\n  if (st === 'Encerrado') return '<span class=\"pill fim\">ENCERRADO</span>';\n  return '<span class=\"pill\">' + esc(st) + '</span>';\n}\n\nfunction acoesDe(r, s) {\n  const ocupado = s.salvandoStatus === r._id;\n  const btn = (st, txt, ghost) =>\n    '<button class=\"st-btn' + (ghost ? ' ghost' : '') + '\" data-id=\"' + esc(r._id) + '\" data-st=\"' + esc(st) + '\"' +\n    (ocupado ? ' disabled' : '') + '>' + esc(txt) + '</button>';\n  const out = [];\n  if (r.status !== 'Em investigação' && r.status !== 'Encerrado') {\n    out.push(btn('Em investigação', eAcima(r.ia_nivel) ? 'Abrir investigação' : 'Marcar para análise', false));\n  }\n  if (r.status !== 'Encerrado') out.push(btn('Encerrado', 'Encerrar', true));\n  else out.push(btn('Alerta aberto', 'Reabrir', true));\n  if (ocupado) out.push('<span class=\"stat\">gravando…</span>');\n  return out.join('');\n}\n\n// A IA devolve o resumo da atenuacao como fragmento, sem maiuscula e sem ponto final.\n// Isso costura a frase dela com a nossa sem virar um amontoado.\nfunction frase(t) {\n  const s = String(t || '').trim().replace(/[.,;:\\s]+$/, '');\n  if (!s) return '';\n  return s.charAt(0).toUpperCase() + s.slice(1) + '.';\n}\n\n// Linha do tempo das versões. Somente leitura, sempre: o painel e da central de seguranca,\n// e nem ela edita o que o colaborador escreveu. O valor esta justamente em o texto ser\n// intocavel depois de enviado.\nfunction linhaVersoes(r) {\n  let vs = [];\n  try { vs = JSON.parse(r.versoes_json || '[]'); } catch (e) { vs = []; }\n  if (vs.length < 2) return '';\n\n  const gov = String(r.ia_versao_governante || '').toLowerCase();\n  const rotulos = { transcricao: 'Transcrição', reanalise: 'Novo relato', correcao: 'Correção' };\n\n  const itens = vs.map((v) => {\n    const governa = ('v' + v.n) === gov;\n    return '<div class=\"ver' + (governa ? ' gov' : '') + '\">' +\n      '<div class=\"vh\"><span class=\"vn\">v' + esc(v.n) + '</span>' +\n      '<span class=\"vo\">' + esc(rotulos[v.origem] || v.origem || '') + '</span>' +\n      (v.em ? '<span class=\"vt\">' + esc(dataLonga(v.em)) + '</span>' : '') +\n      (governa ? '<span class=\"tag\">CLASSIFICADA</span>' : '') +\n      '</div><div class=\"vx\">' + esc(v.texto || '') + '</div></div>';\n  }).join('');\n\n  const selo = r.ia_atenuacao ? '<span class=\"pill inv\" style=\"margin-left:8px\">ATENUAÇÃO DETECTADA</span>' : '';\n  const nota = r.ia_atenuacao\n    ? '<div class=\"just\" style=\"color:#8c2a1e\"><strong>O que a edição tirou:</strong> ' + esc(frase(r.ia_atenuacao_resumo)) + '</div>'\n    : '<div class=\"just\" style=\"color:#6b7873\">As correções não removeram fatos que mudassem o nível na pirâmide.</div>';\n\n  return '<div class=\"card\"><div class=\"hd\">Histórico de versões' + selo + '</div><div class=\"bd\">' +\n    '<div class=\"vers\">' + itens + '</div>' + nota +\n    '<div class=\"just\" style=\"color:#6b7873\">A classificação vale sempre a versão mais pesada, seja ela a primeira ou a última.</div>' +\n    '</div></div>';\n}\n\nfunction telaDetalhe(r, s) {\n  const area = ESCALAS[r.ia_area] ? r.ia_area : 'ST';\n  const escala = ESCALAS[area];\n  const acima = eAcima(r.ia_nivel);\n  const decl = codigoDeclarado(r);\n\n  const nivelHTML = (n, ehAcima) => {\n    const cls = ['lvl'];\n    if (ehAcima) cls.push('acima');\n    const eApurado = n.k === r.ia_nivel;\n    const eDeclarado = !eApurado && n.k === decl;\n    if (eApurado) cls.push('apurado');\n    if (eDeclarado) cls.push('declarado');\n    let tag = '';\n    if (eApurado) tag = '<span class=\"tag\">APURADO</span>';\n    else if (eDeclarado) tag = '<span class=\"tag\">DECLARADO</span>';\n    return '<div class=\"' + cls.join(' ') + '\"><span class=\"k\">' + esc(n.r) + '</span><span class=\"dd\">' + esc(n.d) + '</span>' + tag + '</div>';\n  };\n\n  const pyr = escala.acima.slice().reverse().map((n) => nivelHTML(n, true)).join('')\n    + '<div class=\"pyr-linha\"><div class=\"r\"></div><div class=\"l\">A LINHA</div><div class=\"r\"></div></div>'\n    + escala.abaixo.slice().reverse().map((n) => nivelHTML(n, false)).join('');\n\n  const svgUp = '<svg class=\"ic\" viewBox=\"0 0 24 24\" width=\"23\" height=\"23\" aria-hidden=\"true\"><path d=\"M12 3 22.5 20.5H1.5Z\" fill=\"none\" stroke=\"#b33a2b\" stroke-width=\"2\" stroke-linejoin=\"round\"/><path d=\"M12 9.5v4.6\" stroke=\"#b33a2b\" stroke-width=\"2.3\" stroke-linecap=\"round\"/><circle cx=\"12\" cy=\"17.6\" r=\"1.25\" fill=\"#b33a2b\"/></svg>';\n  const svgDown = '<svg class=\"ic\" viewBox=\"0 0 24 24\" width=\"23\" height=\"23\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"1.8\"/><path d=\"M7 12.4 10.6 16 17 8.6\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n  const alerta = acima\n    ? '<div class=\"alert up\">' + svgUp + '<div><div class=\"t\">Este reporte cruzou a linha</div><div class=\"d\">Foi registrado como <strong>' +\n      esc(r.tipo_declarado || 'sem tipo informado') + '</strong>, mas o que está descrito é <strong>' + esc(ROTULO[r.ia_nivel] || r.ia_nivel) +\n      '</strong> — indicador reativo. Investigação obrigatória, por menor que seja.</div></div></div>'\n    : '<div class=\"alert down\">' + svgDown + '<div><div class=\"t\">Abaixo da linha — indicador preventivo</div><div class=\"d\">Classificado como <strong>' +\n      esc(ROTULO[r.ia_nivel] || r.ia_nivel) + '</strong>. Segue no fluxo preventivo, sem investigação obrigatória.</div></div></div>';\n\n  const alertaAtenuacao = r.ia_atenuacao\n    ? '<div class=\"alert up\">' + svgUp + '<div><div class=\"t\">A descrição foi amenizada antes do envio</div><div class=\"d\">' +\n      esc(frase(r.ia_atenuacao_resumo || 'uma versão posterior removeu fatos que mudavam o nível na pirâmide')) +\n      ' A classificação abaixo vale a versão mais pesada' + (r.ia_versao_governante ? ', a ' + esc(r.ia_versao_governante) : '') +\n      '. O histórico completo está no fim da página.</div></div></div>'\n    : '';\n\n  const campos = [\n    ['Unidade', r.unidade], ['Setor', r.setor], ['Turno', r.turno],\n    ['Reportado por', r.reportado_por || 'Anônimo'], ['Função', r.funcao],\n    ['Entrada por', r.origem], ['Tipo declarado', r.tipo_declarado],\n    ['Área', r.ia_area === 'SA' ? 'Segurança dos Alimentos' : 'Segurança do Trabalho'],\n    ['Agente do risco', r.agente],\n    ['Houve lesão', r.houve_lesao === true ? 'Sim' : (r.houve_lesao === false ? 'Não' : '')],\n    ['Parte do corpo', r.parte_corpo], ['Atendimento', r.atendimento],\n    ['EPI em uso', r.epi_em_uso === true ? 'Sim' : (r.epi_em_uso === false ? 'Não' : 'Não informado')],\n    ['Status', r.status]\n  ].filter((c) => c[1]).map((c) => '<div class=\"f\"><span class=\"l\">' + esc(c[0]) + '</span><span class=\"v\">' + esc(c[1]) + '</span></div>').join('');\n\n  return `<div class=\"wrap\"><div class=\"shell\">\n    <div class=\"top\">\n      <div>\n        <div class=\"prot\">${esc(r.protocolo || 'sem protocolo')} &nbsp;·&nbsp; ${esc(dataLonga(r.criado_em))}</div>\n        <div class=\"dtit\">${esc(r.titulo || '(sem título)')}</div>\n      </div>\n      <div class=\"nav\"><button class=\"voltar\">&larr; Voltar ao painel</button><div class=\"chip\">PREACTION</div></div>\n    </div>\n\n    ${alerta}\n    ${alertaAtenuacao}\n\n    <div class=\"card\">\n      <div class=\"hd\">Identificação do reporte</div>\n      <div class=\"bd\"><div class=\"ident\">${campos}</div></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">O que o colaborador descreveu${r.descricao_editada ? '<span class=\"pill inv\" style=\"margin-left:8px\">EDITADO</span>' : ''}</div>\n      <div class=\"bd\">\n        <div class=\"desc\">${realce(r.descricao || '(sem descrição)', r.ia_trecho)}</div>\n        <div class=\"just\" style=\"color:#6b7873\">O trecho em destaque é o que determinou a classificação.${r.descricao_editada ? ' <strong>Este texto foi corrigido antes do envio</strong> — o histórico de versões está mais abaixo. A classificação vale a versão mais pesada, que não é necessariamente esta.' : ''}</div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">Onde o evento cai na pirâmide · ${esc(escala.nome)}</div>\n      <div class=\"bd\">\n        <div class=\"pyr\">${pyr}</div>\n        <div class=\"quote\" style=\"margin-top:14px\">\n          <div class=\"lb\">O trecho que decidiu</div>\n          \"${esc(r.ia_trecho || '—')}\"\n        </div>\n        <div class=\"just\"><strong>Por quê:</strong> ${esc(r.ia_justificativa || '')}</div>\n        <div class=\"just\"><strong>Ação recomendada:</strong> ${esc(r.ia_acao || '')}</div>\n        <div class=\"just\" style=\"color:#6b7873\">Confiança da classificação: ${esc(r.ia_confianca)}%${r.ia_gravidade && r.ia_gravidade !== 'nenhuma' ? ' · gravidade da divergência: ' + esc(r.ia_gravidade) : ''}</div>\n      </div>\n    </div>\n\n    ${r.acao_imediata ? '<div class=\"card\"><div class=\"hd\">Ação imediata tomada na operação</div><div class=\"bd\"><div class=\"desc\">' + esc(r.acao_imediata) + '</div></div></div>' : ''}\n\n    ${linhaVersoes(r)}\n\n    <div class=\"card\">\n      <div class=\"hd\">O que a IA recebeu — texto original, sem edição</div>\n      <div class=\"bd\"><div class=\"desc bruto\">${esc(r.transcricao || '(não registrado)')}</div></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">Investigação</div>\n      <div class=\"bd\">\n        <div class=\"acoes\" style=\"margin:0;padding:0;border:none\">\n          <span class=\"stat\">Status atual: <strong>${esc(r.status || '—')}</strong></span>\n          ${acoesDe(r, s)}\n        </div>\n        ${s.aviso ? '<div class=\"aviso\" style=\"margin:12px 0 0\">' + esc(s.aviso) + '</div>' : ''}\n      </div>\n    </div>\n  </div></div>`;\n}\n\nexport default {\n  css: `\n:host{all:initial}\n*{box-sizing:border-box}\n.wrap{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;color:#15211c;background:#f2f4f1;height:100%;overflow:auto;padding:22px;line-height:1.5}\n.shell{max-width:1040px;margin:0 auto;display:flex;flex-direction:column;gap:16px}\n\n.top{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;flex-wrap:wrap}\n.top .n{font-size:21px;font-weight:700;letter-spacing:-.2px}\n.top .s{font-size:12.5px;color:#5b6862;margin-top:2px}\n.chip{border:1.5px solid #15211c;padding:4px 10px;font-size:11px;font-weight:700;letter-spacing:1.5px}\n\n.tese{background:#fbeae7;border:1.5px solid #b33a2b;border-radius:4px;padding:16px 19px;display:flex;gap:16px;align-items:center;flex-wrap:wrap}\n.tese .big{font-size:40px;font-weight:700;color:#8c2a1e;line-height:1;font-variant-numeric:tabular-nums}\n.tese .txt{flex:1;min-width:250px}\n.tese .t1{font-size:15.5px;font-weight:700;color:#8c2a1e}\n.tese .t2{font-size:13.5px;color:#3c4a44;margin-top:3px}\n\n.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}\n.kpi{background:#fff;border:1px solid #d6ddd8;border-radius:4px;padding:14px 16px}\n.kpi .v{font-size:26px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.1}\n.kpi .l{font-size:10.5px;letter-spacing:.8px;text-transform:uppercase;color:#6b7873;margin-top:4px}\n.kpi.up .v{color:#b33a2b}\n.kpi.down .v{color:#186a4b}\n\n.card{background:#fff;border:1px solid #d6ddd8;border-radius:4px}\n.card .hd{padding:11px 16px;border-bottom:1px solid #e6ebe7;font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:#6b7873;display:flex;justify-content:space-between;gap:10px;align-items:center;flex-wrap:wrap}\n.card .bd{padding:16px}\n\n.dist{display:flex;flex-direction:column;gap:4px}\n.dl{display:flex;align-items:center;gap:10px;font-size:12.5px}\n.dl .nm{width:170px;flex:none;color:#3c4a44}\n.dl .bar{height:17px;border-radius:2px;background:#8dd2af;min-width:2px}\n.dl.up .bar{background:#e0918a}\n.dl .ct{font-size:12px;color:#6b7873;font-variant-numeric:tabular-nums}\n.dl.zero .nm,.dl.zero .ct{color:#aab5af}\n.divisor{display:flex;align-items:center;gap:9px;margin:7px 0}\n.divisor .r{flex:1;height:2.5px;background:#15211c}\n.divisor .l{font-size:9.5px;font-weight:700;letter-spacing:1.3px;white-space:nowrap}\n\n.fil{display:flex;gap:6px;flex-wrap:wrap}\n.fil button{padding:5px 12px;font-size:12px;border:1px solid #cfd8d2;background:#fff;border-radius:999px;cursor:pointer;font-family:inherit;color:#3c4a44}\n.fil button[data-on=\"1\"]{background:#15211c;color:#fff;border-color:#15211c}\n\ntable{width:100%;border-collapse:collapse;font-size:13.5px}\nth{text-align:left;padding:8px 12px;font-size:10px;letter-spacing:.9px;text-transform:uppercase;color:#6b7873;border-bottom:1px solid #cfd8d2;white-space:nowrap}\ntd{padding:10px 12px;border-bottom:1px solid #eef2ef;vertical-align:top}\ntr.linha{cursor:pointer}\ntr.linha:hover td{background:#f7f9f7}\ntr.alerta td{background:#fdf3f1}\ntr.alerta:hover td{background:#fbeae7}\n.tit{font-weight:600}\n.sub{font-size:11.5px;color:#6b7873;margin-top:1px}\n.badge{display:inline-block;font-size:9.5px;font-weight:700;letter-spacing:.7px;padding:2px 7px;border-radius:2px;white-space:nowrap}\n.badge.up{background:#b33a2b;color:#fff}\n.badge.down{background:#e2ebe5;color:#2c4a3c}\n.seta{color:#8b968f;padding:0 5px}\n.decl{color:#6b7873;text-decoration:line-through}\n.det td{background:#f7f9f7!important;font-size:13px}\n.det .q{border-left:3px solid #b33a2b;padding:7px 12px;background:#fff;border-radius:0 3px 3px 0;margin-bottom:8px}\n.det .lb{font-size:9.5px;letter-spacing:.8px;text-transform:uppercase;color:#8c2a1e;margin-bottom:3px}\n.det p{margin:0 0 7px}\n.nav{display:flex;gap:10px;align-items:center}\n.nav button{padding:7px 14px;font-size:12.5px;border:1px solid #cfd8d2;background:#fff;border-radius:3px;cursor:pointer;font-family:inherit;color:#3c4a44;font-weight:600}\n.nav button:hover{border-color:#186a4b;color:#186a4b}\n.acoes{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin-top:11px;padding-top:11px;border-top:1px solid #e2e8e4}\n.acoes .stat{font-size:12.5px;color:#6b7873;margin-right:4px}\n.st-btn{padding:6px 13px;font-size:12.5px;border:1px solid #15211c;background:#15211c;color:#fff;border-radius:3px;cursor:pointer;font-family:inherit;font-weight:600}\n.st-btn.ghost{background:#fff;color:#15211c}\n.st-btn:hover{opacity:.85}\n.st-btn[disabled]{opacity:.4;cursor:not-allowed}\n.pill{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.6px;padding:1px 6px;border-radius:2px;background:#e2e8e4;color:#3c4a44;margin-left:6px}\n.pill.inv{background:#fdf6e3;color:#8c6d1f}\n.pill.fim{background:#e7f2ec;color:#14563c}\n.aviso{margin:0 16px 12px;font-size:12.5px;color:#8c6d1f;background:#fdf6e3;border:1px solid #f0e0b0;padding:9px 12px;border-radius:3px}\n.vazio{padding:26px;text-align:center;color:#8b968f;font-size:14px}\n.carregando{padding:26px;text-align:center;color:#6b7873;font-size:14px}\n.err{margin:16px;font-size:13px;color:#8c2a1e;background:#fbeae7;border:1px solid #e6b8b0;padding:11px 13px;border-radius:3px}\n@media(max-width:700px){.dl .nm{width:120px}th.ocult,td.ocult{display:none}}\n\n.voltar{padding:7px 14px;font-size:12.5px;border:1px solid #cfd8d2;background:#fff;border-radius:3px;cursor:pointer;font-family:inherit;color:#3c4a44;font-weight:600}\n.voltar:hover{border-color:#186a4b;color:#186a4b}\n.prot{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:#6b7873;letter-spacing:.4px}\n.dtit{font-size:22px;font-weight:700;letter-spacing:-.3px;line-height:1.2;margin-top:3px}\n.ident{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px 20px}\n.ident .f{display:flex;flex-direction:column;gap:1px}\n.ident .f .l{font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:#6b7873}\n.ident .f .v{font-size:14px;font-weight:500}\n.alert{padding:15px 18px;border-radius:4px;display:flex;gap:14px;align-items:flex-start}\n.alert.up{background:#fbeae7;border:1.5px solid #b33a2b}\n.alert.down{background:#e7f2ec;border:1.5px solid #186a4b}\n.alert .ic{flex:none;margin-top:1px}\n.alert .t{font-size:15.5px;font-weight:700;margin-bottom:3px}\n.alert.up .t{color:#8c2a1e}\n.alert.down .t{color:#14563c}\n.alert .d{font-size:13.5px;color:#3c4a44}\n.pyr{display:flex;flex-direction:column;align-items:center;gap:3px;padding:4px 0}\n.lvl{width:100%;max-width:440px;display:flex;align-items:center;gap:9px;padding:7px 12px;border-radius:3px;background:#f2f4f1;font-size:13px;border:1.5px solid transparent}\n.lvl .k{font-weight:700;min-width:112px;font-size:12.5px}\n.lvl .dd{color:#6b7873;font-size:12px;flex:1}\n.lvl .tag{font-size:9.5px;font-weight:700;letter-spacing:.8px;padding:2px 6px;border-radius:2px;white-space:nowrap}\n.lvl.apurado{background:#fff;border-color:#15211c;box-shadow:0 1px 4px rgba(0,0,0,.1)}\n.lvl.apurado .tag{background:#15211c;color:#fff}\n.lvl.declarado .tag{background:#d6ddd8;color:#3c4a44}\n.lvl.acima{background:#fdf3f1}\n.lvl.acima.apurado{background:#fbeae7;border-color:#b33a2b}\n.lvl.acima.apurado .tag{background:#b33a2b}\n.pyr-linha{width:100%;max-width:440px;display:flex;align-items:center;gap:9px;margin:6px 0}\n.pyr-linha .r{flex:1;height:2.5px;background:#15211c}\n.pyr-linha .l{font-size:9.5px;font-weight:700;letter-spacing:1.3px;color:#15211c;white-space:nowrap}\n.quote{border-left:3px solid #b33a2b;padding:10px 14px;background:#fdf3f1;font-size:14.5px;border-radius:0 3px 3px 0}\n.quote .lb{font-size:10px;letter-spacing:.9px;text-transform:uppercase;color:#8c2a1e;margin-bottom:4px}\n.just{font-size:13.5px;color:#3c4a44;margin-top:11px}\n.desc{font-size:14.5px;background:#f7f9f7;padding:14px;border-radius:3px;border:1px solid #e6ebe7;line-height:1.65}\n.desc.bruto{font-size:13px;color:#3c4a44}\nmark{background:#ffe9a8;padding:1px 2px;border-radius:2px}\n.vers{display:flex;flex-direction:column;gap:10px}\n.ver{border:1px solid #e6ebe7;border-radius:3px;padding:11px 13px;background:#fbfcfb}\n.ver.gov{border-color:#b33a2b;background:#fdf3f1}\n.ver .vh{display:flex;align-items:center;gap:9px;margin-bottom:6px;flex-wrap:wrap}\n.ver .vn{font-family:ui-monospace,Menlo,monospace;font-size:12px;font-weight:700;color:#15211c}\n.ver .vo{font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:#6b7873}\n.ver .vt{font-size:11px;color:#6b7873;margin-left:auto;font-variant-numeric:tabular-nums}\n.ver .tag{font-size:9.5px;font-weight:700;letter-spacing:.8px;padding:2px 6px;border-radius:2px;background:#b33a2b;color:#fff}\n.ver .vx{font-size:13.5px;line-height:1.6;color:#3c4a44}\n`,\n\n  render(d2) {\n    const s = d2.state;\n    if (!liberado(s)) return `<div class=\"wrap\">${telaSenha(s)}</div>`;\n    if (s.erro) return `<div class=\"wrap\"><div class=\"shell\"><div class=\"err\">${esc(s.erro)}</div></div></div>`;\n    if (!s.registros) return `<div class=\"wrap\"><div class=\"shell\"><div class=\"card\"><div class=\"carregando\">Carregando reportes…</div></div></div></div>`;\n\n    const regs = s.registros.slice().sort((a, b) => new Date(b.criado_em || 0) - new Date(a.criado_em || 0));\n\n    if (s.detalhe) {\n      const alvo = regs.filter((x) => x.protocolo === s.detalhe)[0];\n      if (alvo) return telaDetalhe(alvo, s);\n    }\n\n    const total = regs.length;\n    const acima = regs.filter((r) => eAcima(r.ia_nivel));\n    const diverg = regs.filter((r) => r.ia_divergencia);\n    const taxa = total ? Math.round((diverg.length / total) * 100) : 0;\n\n    const datas = regs.map((r) => new Date(r.criado_em)).filter((d) => !isNaN(d));\n    const unids = [];\n    regs.forEach((r) => { const u = (r.unidade || '').trim(); if (u && unids.indexOf(u) < 0) unids.push(u); });\n    const periodo = datas.length\n      ? dataCurta(new Date(Math.min.apply(null, datas))) + ' a ' + dataCurta(new Date(Math.max.apply(null, datas))) + ' · ' + unids.length + (unids.length === 1 ? ' unidade' : ' unidades')\n      : 'sem reportes no período';\n\n    const filtro = s.filtro || 'todos';\n    let lista = regs;\n    if (filtro === 'acima') lista = acima;\n    else if (filtro === 'diverg') lista = diverg;\n\n    const contaSA = regs.filter((r) => r.ia_area === 'SA').length;\n    const ordem = contaSA > total / 2 ? ORDEM_SA : ORDEM_ST;\n    const contagem = {};\n    regs.forEach((r) => { contagem[r.ia_nivel] = (contagem[r.ia_nivel] || 0) + 1; });\n    const maxCt = Math.max(1, ...ordem.map((k) => contagem[k] || 0));\n    const barras = ordem.slice().reverse().map((k) => {\n      const ct = contagem[k] || 0;\n      const up = eAcima(k);\n      const larg = Math.round((ct / maxCt) * 100);\n      const linha = `<div class=\"dl ${up ? 'up' : ''} ${ct ? '' : 'zero'}\"><span class=\"nm\">${esc(ROTULO[k] || k)}</span><span class=\"bar\" style=\"width:${ct ? Math.max(larg, 4) : 0}%\"></span><span class=\"ct\">${ct}</span></div>`;\n      return { k: k, up: up, html: linha };\n    });\n    let dist = '';\n    let jaCruzou = false;\n    barras.forEach((b) => {\n      if (!b.up && !jaCruzou) {\n        jaCruzou = true;\n        dist += `<div class=\"divisor\"><div class=\"r\"></div><span class=\"l\">A LINHA</span><div class=\"r\"></div></div>`;\n      }\n      dist += b.html;\n    });\n    const recon = contagem['RECONHECIMENTO_POSITIVO'] || 0;\n    if (recon) dist += `<div class=\"dl\"><span class=\"nm\">${esc(ROTULO.RECONHECIMENTO_POSITIVO)}</span><span class=\"bar\" style=\"width:${Math.max(Math.round((recon / maxCt) * 100), 4)}%\"></span><span class=\"ct\">${recon}</span></div>`;\n\n    const linhas = lista.length ? lista.map((r) => {\n      const up = eAcima(r.ia_nivel);\n      const declDif = r.ia_divergencia && r.tipo_declarado;\n\n      return `<tr class=\"linha ${up ? 'alerta' : ''}\" data-key=\"${esc(r._id)}\" data-prot=\"${esc(r.protocolo || '')}\">\n          <td style=\"white-space:nowrap;font-variant-numeric:tabular-nums\">${dataCurta(r.criado_em)}</td>\n          <td><div class=\"tit\">${esc(r.titulo || '(sem título)')}${pill(r.status)}</div><div class=\"sub\">${esc(r.protocolo || '')} · ${esc(r.reportado_por || 'anônimo')}</div></td>\n          <td class=\"ocult\"><div class=\"sub\" style=\"margin:0\">${esc((r.unidade || '').split('—')[0].trim())}</div></td>\n          <td>${declDif ? '<span class=\"decl\">' + esc(r.tipo_declarado) + '</span><span class=\"seta\">&rarr;</span>' : ''}<strong>${esc(ROTULO[r.ia_nivel] || r.ia_nivel || '—')}</strong></td>\n          <td><span class=\"badge ${up ? 'up' : 'down'}\">${up ? 'ACIMA' : 'abaixo'}</span></td>\n        </tr>`;\n    }).join('') : '<tr><td colspan=\"5\"><div class=\"vazio\">Nenhum reporte neste filtro.</div></td></tr>';\n\n    const fb = (k, t) => `<button data-f=\"${k}\" data-on=\"${filtro === k ? '1' : '0'}\">${t}</button>`;\n\n    return `<div class=\"wrap\"><div class=\"shell\">\n      <div class=\"top\">\n        <div><div class=\"n\">Painel de Reportes PreAction</div><div class=\"s\">${esc(periodo)}</div></div>\n        <div class=\"nav\"><button class=\"ir-reporte\">&larr; Novo reporte</button><div class=\"chip\">PREACTION</div></div>\n      </div>\n\n      <div class=\"tese\">\n        <div class=\"big\">${diverg.length}</div>\n        <div class=\"txt\">\n          <div class=\"t1\">${diverg.length === 1 ? 'reporte cruzou a linha sem ninguém perceber' : 'reportes cruzaram a linha sem ninguém perceber'}</div>\n          <div class=\"t2\">Foram registrados como indicador preventivo, mas a descrição do próprio colaborador conta um evento reativo. Sem a IA, ${diverg.length === 1 ? 'este caso ficaria' : 'estes casos ficariam'} fora da estatística e sem investigação.</div>\n        </div>\n      </div>\n\n      <div class=\"kpis\">\n        <div class=\"kpi\"><div class=\"v\">${total}</div><div class=\"l\">Reportes no período</div></div>\n        <div class=\"kpi up\"><div class=\"v\">${acima.length}</div><div class=\"l\">Acima da linha</div></div>\n        <div class=\"kpi up\"><div class=\"v\">${taxa}%</div><div class=\"l\">Taxa de subnotificação</div></div>\n        <div class=\"kpi down\"><div class=\"v\">${total - acima.length}</div><div class=\"l\">Preventivos</div></div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">Distribuição na pirâmide</div>\n        <div class=\"bd\"><div class=\"dist\">${dist}</div></div>\n      </div>\n\n      ${s.aviso ? '<div class=\"aviso\">' + esc(s.aviso) + '</div>' : ''}\n\n      <div class=\"card\">\n        <div class=\"hd\"><span>Reportes</span><span class=\"fil\">${fb('todos', 'Todos (' + total + ')')}${fb('acima', 'Acima da linha (' + acima.length + ')')}${fb('diverg', 'Divergências (' + diverg.length + ')')}</span></div>\n        <table>\n          <thead><tr><th>Data</th><th>Reporte</th><th class=\"ocult\">Unidade</th><th>Declarado → apurado</th><th>Linha</th></tr></thead>\n          <tbody>${linhas}</tbody>\n        </table>\n      </div>\n    </div></div>`;\n  },\n\n  mounted(d2) {\n    const carregar = async () => {\n      try {\n        const r = await chamar('sst-listar', {});\n        const regs = (r && r.registros) || [];\n        // deep links: ?filtro=acima|diverg  ·  ?aberto=<protocolo>\n        let aberto = null;\n        let filtro = d2.state.filtro;\n        try {\n          const q = new URLSearchParams(location.search);\n          const f = q.get('filtro');\n          if (f === 'acima' || f === 'diverg' || f === 'todos') filtro = f;\n          const prot = q.get('aberto');\n          if (prot && regs.filter((x) => x.protocolo === prot).length) aberto = prot;\n        } catch (e) { /* sem query string */ }\n        d2.setState({ registros: regs, erro: '', detalhe: d2.state.detalhe || aberto, filtro: filtro });\n      } catch (err) {\n        d2.setState({ erro: 'Não consegui carregar os reportes: ' + String(err.message || err) });\n      }\n    };\n    const entrar = async () => {\n      const campo = d2.$('.porta-senha');\n      const senha = campo ? String(campo.value || '').trim() : '';\n      if (!senha) { d2.setState({ erroSenha: 'Digite a senha.' }); return; }\n      d2.setState({ entrando: true, erroSenha: '' });\n      try {\n        const r = await chamar('sst-entrar', { area: AREA_PROTEGIDA, senha: senha });\n        if (r && r.ok && r.token) {\n          try { localStorage.setItem(CHAVE_TOKEN, r.token); } catch (e) { /* navegador sem storage */ }\n          d2.setState({ entrando: false, autorizado: true, erroSenha: '' });\n          carregar();\n        } else {\n          d2.setState({ entrando: false, erroSenha: 'Senha incorreta.' });\n        }\n      } catch (err) {\n        d2.setState({ entrando: false, erroSenha: 'Não consegui conferir a senha. ' + String(err.message || err) });\n      }\n    };\n\n    d2.on('.porta-btn', 'click', entrar);\n    d2.on('.porta-senha', 'keydown', (e) => { if (e.key === 'Enter') entrar(); });\n\n    // So busca os reportes depois da porta.\n    if (liberado(d2.state)) carregar();\n\n    d2.on('.fil button', 'click', (e) => {\n      d2.setState({ filtro: e.target.getAttribute('data-f'), detalhe: null });\n    });\n\n    d2.on('tr.linha', 'click', (e) => {\n      const tr = e.target.closest('tr.linha');\n      if (!tr || e.target.closest('.st-btn')) return;\n      d2.setState({ detalhe: tr.getAttribute('data-prot') });\n    });\n\n    d2.on('.voltar', 'click', () => { d2.setState({ detalhe: null }); });\n\n    d2.on('.ir-reporte', 'click', () => { d2.router('preaction-router').goTo('/'); });\n\n    d2.on('.st-btn', 'click', async (e) => {\n      const b = e.target.closest('.st-btn');\n      if (!b) return;\n      const id = b.getAttribute('data-id');\n      const st = b.getAttribute('data-st');\n      d2.setState({ salvandoStatus: id, aviso: '' });\n      try {\n        await chamar('sst-status', {\n          id: id,\n          status: st,\n          investigacao_por: 'Gerência de SST',\n          investigacao_em: new Date().toISOString()\n        });\n        const regs = (d2.state.registros || []).map((r) => (r._id === id ? Object.assign({}, r, { status: st }) : r));\n        d2.setState({ registros: regs, salvandoStatus: null });\n      } catch (err) {\n        d2.setState({ salvandoStatus: null, aviso: 'Não consegui atualizar o status: ' + String(err.message || err) });\n      }\n    });\n  }\n};"}}}}}}}},{"_id":"6a9238cfeed7600008c5c200","component":"data2-core-types@Component","system":"69fe34b018c813c5be7bddd9","params":{"extends":"data2-core-primitives@Block","component":"preaction-roteiro","package":"people-le-moura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const IMG = 'https://people-le-moura.data2.media/file/';\nconst P = {\n  foto: IMG + 'kgGq0Yn7LlK6V3VbFQTnb',\n  revisao: IMG + 'PiZGoc1ymt2eeJ5Pjc9e5',\n  naoEscala: IMG + 'qDdeJX4yo260ZiIQ8URT_',\n  alimentos: IMG + 'mT6Tju9R2e6bPZtq5q3XK',\n  painel: IMG + 'UvD-tjzFHCzkYtDmtV5Gu',\n  detalhe: IMG + '5GROaPn2ZXw-2uLdfudpx',\n  papel: IMG + 'vLWXqx4W92kGR3ebFBGYp',\n  atenuacao: IMG + 'f9SsKs8RZM30bPMD8qJ8K'\n};\n// Forma com -- em vez de ponto: o certificado wildcard *.next.data2.app cobre UM rotulo.\n// 'app.sistema.next.data2.app' sao dois rotulos e o TLS pendura em parte dos hosts.\n// 'app--sistema.next.data2.app' e um rotulo so e funciona sempre.\nconst BASE = 'https://sst--people-le-moura.next.data2.app';\n\nconst PASSOS = [\n  {\n    n: 1, t: '00:00 – 00:40', tit: 'Abra pelo problema, não pelo produto',\n    tela: 'Painel do gestor', url: BASE + '/painel', img: P.painel,\n    fazer: [\n      'Abra o painel <strong>antes</strong> de mostrar qualquer tela de cadastro.',\n      'Deixe o número 8 e os 44% na tela por alguns segundos, em silêncio.',\n      'Aponte a barra preta no meio do gráfico e diga o nome dela: a linha.'\n    ],\n    falar: 'Esses são 18 reportes de cinco unidades. Oito deles foram registrados como indicador preventivo, mas a descrição do próprio colaborador conta um acidente. Sem ninguém perceber, eles cruzaram a linha. Quarenta e quatro por cento.',\n    porque: 'Se você começar pela tela de cadastro, a conversa vira \"app de formulário\" e entra na fila de TI. Começando pelo número, vira compliance.'\n  },\n  {\n    n: 2, t: '00:40 – 01:40', tit: 'O reporte, do jeito que acontece na operação',\n    tela: 'Reportar · falar e conferir', url: BASE + '/?aba=voz', img: P.revisao,\n    fazer: [\n      'Volte para a tela de reporte pela seta no topo.',\n      'Clique em <strong>Falar o reporte</strong> e autorize o microfone.',\n      'Fale devagar, em tom de operação, o texto ao lado.',\n      'Pare de gravar e clique em <strong>Analisar reporte</strong>.',\n      'Mostre a tela de conferência e clique em <strong>Enviar reporte</strong>. Leia o protocolo em voz alta.'\n    ],\n    falar: 'Ó, é o seguinte. Eu tava tirando a assadeira do forno combinado, aí encostei o antebraço na grade quente. Ardeu bastante, ficou uma marca vermelha. Peguei gelo do kit de primeiros socorros e botei uma gaze. Continuei o turno normal. Tô reportando como quase acidente.',\n    nota: 'O texto acima é para <strong>você falar</strong>, não para ler na tela. Ele diz \"quase acidente\" e descreve uma queimadura tratada — guarde isso. Este evento <strong>não existe no histórico</strong>, então depois de enviar ele aparece como registro novo no topo do painel.',\n    porque: 'A dor que ele levantou primeiro foi o analfabetismo. Ver as palavras aparecendo enquanto se fala responde isso sem precisar explicar.'\n  },\n  {\n    n: 3, t: '01:40 – 02:20', tit: 'Repare no que ele NÃO viu',\n    tela: 'Reportar · tela de conferência', url: BASE + '/?caso=forno', img: P.revisao,\n    destaque: true,\n    fazer: [\n      'Volte à tela de conferência e percorra a tela inteira com o cursor.',\n      'Diga o que <strong>não</strong> está ali: nenhuma pirâmide, nenhum nível, nenhum aviso de que cruzou a linha.',\n      'Aponte o botão <strong>Corrigir</strong> ao lado de Enviar: corrigir é permitido, e não há nada ali sugerindo descartar.',\n      'Só então fale a frase ao lado.'\n    ],\n    falar: 'Olha o que o colaborador vê antes de enviar: o que ele falou e o formulário preenchido. Só isso. Ele não vê a classificação. Se visse que o quase acidente dele está virando acidente, ele voltaria e mudaria a história — por pressão do encarregado, por medo de perder o bônus, ou só por não querer dar trabalho. A classificação roda no servidor, no momento do envio, e vai direto para vocês. Corrigir o texto ele pode, e daqui a pouco eu mostro o que acontece quando alguém corrige para menos.',\n    porque: 'Um gerente de SST sabe melhor que ninguém que indicador que o reportante enxerga é indicador que o reportante aprende a manipular. Mostrar que a ferramenta foi desenhada contra isso vale mais do que qualquer número de acurácia.'\n  },\n  {\n    n: 4, t: '02:20 – 03:00', tit: 'A operação que não tem tablet',\n    tela: 'Reportar · aba Fotografar o papel', url: BASE + '/?aba=foto', img: P.foto,\n    fazer: [\n      'Clique em <strong>Fazer outro reporte</strong> e vá na aba <strong>Fotografar o papel</strong>.',\n      'Escolha o arquivo do formulário preenchido (o print ao lado, item 4b).',\n      'Aguarde os três passos: enviando, lendo o manuscrito, classificando.',\n      'Mostre que ele leu os checkboxes E a descrição à mão. Envie também.'\n    ],\n    falar: 'A maior parte das unidades não tem tablet e não vai ter tão cedo. Aqui a Gerente de Unidade só bate a foto do papel que já existe. É o mesmo fluxo do Rydoo que vocês usam para reembolso.',\n    porque: 'Ele mesmo deu essa analogia no áudio. Usar a palavra Rydoo mostra que você ouviu.',\n    extraImg: P.papel, extraCap: '4b · O formulário de papel usado no teste. Guarde este arquivo à mão antes de gravar.'\n  },\n  {\n    n: 5, t: '03:00 – 03:50', tit: 'O achado — este é o momento da demo',\n    tela: 'Painel · análise completa', url: BASE + '/painel?aberto=PA-04509', img: P.detalhe,\n    destaque: true,\n    fazer: [\n      'Vá ao painel, filtre por <strong>Divergências</strong> e clique numa linha.',\n      'Não fale por dois segundos. Deixe a tarja vermelha ser lida.',\n      'Aponte a pirâmide: <strong>DECLARADO</strong> abaixo da linha, <strong>APURADO</strong> acima.',\n      'Leia em voz alta o trecho em amarelo, dentro do texto do próprio colaborador.'\n    ],\n    falar: 'Ele escreveu \"quase acidente\". Mas na descrição dele mesmo está: foi ao pronto-socorro e foi afastado por dois dias. Isso é LTI — indicador reativo, investigação obrigatória. A informação sempre esteve ali. Só estava no campo errado, e ninguém tinha como ver.',\n    nota: 'Aqui está tudo que o gestor precisa para auditar num lugar só: quem reportou, em que unidade, o texto original sem edição e o trecho exato que fez a IA subir o nível.',\n    porque: 'É o exemplo que ele te deu no áudio, devolvido funcionando. Se a demo inteira falhar e só isso rodar, valeu.'\n  },\n  {\n    n: 6, t: '03:50 – 04:40', tit: 'Quando alguém pede para amenizar',\n    tela: 'Painel · histórico de versões', url: BASE + '/painel?aberto=PA-04918', img: P.atenuacao,\n    destaque: true,\n    fazer: [\n      'Abra o caso do <strong>fatiador de frios</strong>.',\n      'Leia a segunda tarja vermelha: a descrição foi amenizada antes do envio.',\n      'Desça até <strong>Histórico de versões</strong>, no fim da página.',\n      'Mostre a <strong>v1</strong> em vermelho, marcada como CLASSIFICADA, e a <strong>v2</strong> logo abaixo.',\n      'Leia as duas em voz alta, uma depois da outra. A diferença fala sozinha.'\n    ],\n    falar: 'A colaboradora ditou: levei três pontos e me tiraram do fatiador por cinco dias. Sete minutos depois, o texto virou: um corte pequeno, continuei o serviço normal. Eu não sei o que aconteceu nesses sete minutos, e não preciso saber. O sistema guardou as duas versões, classificou pela mais pesada e avisou vocês que houve atenuação. Corrigir continua sendo direito de quem reporta. O que deixou de existir foi corrigir sem deixar rastro.',\n    nota: 'A regra vale nos dois sentidos: se a correção <strong>acrescentar</strong> gravidade — \"esqueci de dizer que fui ao ambulatório\" — é a versão nova que passa a valer. O sistema não pune quem edita; ele fica com a versão mais pesada.',\n    porque: 'Esta é a resposta para a pergunta que o gerente de unidade não vai fazer em voz alta. O passo 3 prova que o colaborador não consegue manipular sozinho; este prova que ninguém consegue manipular depois, nem com pressão em cima.'\n  },\n  {\n    n: 7, t: '04:40 – 05:20', tit: 'Mostre que ela também sabe NÃO escalar',\n    tela: 'Painel · caso que ficou abaixo', url: BASE + '/painel?aberto=PA-04810', img: P.naoEscala,\n    fazer: [\n      'Abra o caso do carrinho de bandejas.',\n      'Aponte a tarja <strong>verde</strong> e a pirâmide com o marcador abaixo da linha.',\n      'Leia a justificativa: houve dor, mas nenhum atendimento.'\n    ],\n    falar: 'Aqui teve contato e teve dor. Mas não houve atendimento nenhum. Continua sendo quase acidente, e a IA não escalou. Alarme falso queima a confiança de vocês tão rápido quanto a subnotificação.',\n    porque: 'É a pergunta que um gerente de SST faz na hora: \"e se ela exagerar?\". Responder antes de ser perguntado vale mais do que responder depois.'\n  },\n  {\n    n: 8, t: '05:20 – 06:00', tit: 'A outra pirâmide, e o ciclo fechando',\n    tela: 'Painel · Segurança dos Alimentos', url: BASE + '/painel?aberto=PA-04588', img: P.alimentos,\n    fazer: [\n      'Abra o caso do amendoim.',\n      'Mostre que a pirâmide <strong>mudou</strong>: agora é a escala de Segurança dos Alimentos.',\n      'Desça até o bloco <strong>Investigação</strong>, no rodapé da mesma tela.',\n      'Clique em <strong>Abrir investigação</strong> e mostre a etiqueta mudando na lista.'\n    ],\n    falar: 'A pirâmide de vocês é dupla. A IA decide sozinha se o risco é ao trabalhador ou ao comensal antes de posicionar o nível. E o alerta não morre na tela: o gestor abre a investigação aqui, e o reporte fica marcado até alguém encerrar.',\n    porque: 'Fecha as duas pontas que faltavam: que a solução leu a pirâmide inteira, e que o achado vira tarefa. Investigação obrigatória sem lugar para registrar não convence auditoria.'\n  }\n];\n\nconst ATALHOS = [\n  ['Painel do gestor', BASE + '/painel'],\n  ['Painel só com as divergências', BASE + '/painel?filtro=diverg'],\n  ['Análise completa de um caso com divergência', BASE + '/painel?aberto=PA-04509'],\n  ['Análise completa do caso que NÃO escalou', BASE + '/painel?aberto=PA-04810'],\n  ['Análise completa · caso com atenuação detectada', BASE + '/painel?aberto=PA-04918'],\n  ['Análise completa · Segurança dos Alimentos', BASE + '/painel?aberto=PA-04588'],\n  ['Reportar — aba Falar', BASE + '/?aba=voz'],\n  ['Reportar — aba Fotografar', BASE + '/?aba=foto'],\n  ['Conferência · o forno', BASE + '/?caso=forno'],\n  ['Conferência · a câmara fria', BASE + '/?caso=camara'],\n  ['Conferência · a prateleira', BASE + '/?caso=prateleira'],\n  ['Conferência · o corpo estranho', BASE + '/?caso=vidro']\n];\n\nconst PERGUNTAS = [\n  { q: 'O colaborador não vai mudar a história para escapar da classificação?', a: 'Não tem como: ele nunca vê a classificação. Antes de enviar ele só vê o que falou e o formulário preenchido. A pirâmide roda no servidor, no momento do envio, e o resultado aparece apenas para vocês no painel. Foi desenhado assim de propósito — indicador que o reportante enxerga é indicador que ele aprende a manipular. E se alguém pressionar para reescrever depois? Ele pode corrigir, mas cada versão fica registrada, a classificação vale sempre a mais pesada, e o painel avisa que houve atenuação mostrando as duas versões lado a lado.' },\n  { q: 'E se ela errar a classificação?', a: 'Ela erra. Por isso a tela mostra o trecho exato que decidiu e a justificativa — o gestor confere em dois segundos e corrige antes de gravar. E o alerta é conservador: na dúvida ela escolhe o nível menor e baixa a confiança.' },\n  { q: 'Qual a acurácia?', a: '17 de 17 num gabarito de 17 casos de cozinha industrial e refeitório, medido ponta a ponta, mais 4 de 4 numa bateria separada só do versionamento — atenuação, agravamento, correção legítima e versão única. Mas seja honesto: esse gabarito fui eu que escrevi a partir de perfis públicos de risco. Com casos reais de vocês, a medida passa a valer.' },\n  { q: 'Funciona com o barulho da cozinha?', a: 'Não testamos em campo. Na demo a transcrição roda no navegador. Num piloto real isso muda para gravação local com envio depois, e o áudio fica anexado ao registro.' },\n  { q: 'Onde ficam os dados?', a: 'Nesta demo, num ambiente de protótipo, com dados fictícios. Nada de vocês. Descrição de lesão com pessoa identificável é dado de saúde sob a LGPD — num piloto isso entra com controle de acesso desde o primeiro dia.' },\n  { q: 'Dá para integrar com o sistema que já usamos?', a: 'A classificação é um serviço que recebe texto e devolve o nível na pirâmide. Ela pode viver dentro desta tela ou atrás do formulário que vocês já têm.' }\n];\n\n// Eventos NOVOS, que nao existem no historico do painel. Assim o reporte feito ao vivo\n// aparece como registro novo no topo da lista, sem duplicar nada que ja esta la.\nconst CASOS = [\n  ['O forno', 'FAC · acima da linha', 'Diz \"quase acidente\" e descreve queimadura tratada com gelo e gaze. É o caso do passo 2.', BASE + '/?caso=forno'],\n  ['A câmara fria', 'RWC · acima da linha', 'Punho imobilizado e uma semana no administrativo. Testa função restrita contra afastamento.', BASE + '/?caso=camara'],\n  ['A prateleira', 'Quase acidente · abaixo', 'Caixa caiu no ombro, doeu, nenhum atendimento. É o caso em que a IA NÃO escala.', BASE + '/?caso=prateleira'],\n  ['O corpo estranho', 'Lesão · acima da linha', 'Plástico no arroz feriu a gengiva do comensal. Puxa a pirâmide de Segurança dos Alimentos.', BASE + '/?caso=vidro']\n];\n\nconst CUIDADOS = [\n  ['Use o Chrome', 'O ditado por voz só funciona no Chrome. No Safari e no Firefox a aba Falar não grava.'],\n  ['A URL precisa do <code>.next.</code> e do <code>--</code>', 'Sem o <code>.next.</code> a página abre em branco. E use <code>app--sistema</code>, não <code>app.sistema</code>: a forma com ponto depende de certificado emitido para aquele host e falha em parte deles, com timeout.'],\n  ['Teste o microfone antes', 'Autorize o microfone uma vez com antecedência. A caixa de permissão no meio da gravação estraga o ritmo.'],\n  ['Tenha o plano B pronto', 'Se o microfone falhar, abra um dos endereços de caso pronto da tabela acima. A tela já aparece preenchida e ninguém percebe. Deixe um deles aberto numa aba antes de começar.'],\n  ['Não prometa piloto de campo', 'Isto é protótipo. Falta segurança, teste com foto real de celular e o formulário de verdade da Sodexo.']\n];\n\nconst BASELINE = { total: 18, acima: 10, diverg: 8, taxa: 44 };\n\n// d2.rush() resolve para a origem do app e devolve 404 para quem nao e builder.\nconst RUSH = 'https://people-le-moura.data2apis.com/rush/';\n\n// ---- Porta de entrada -------------------------------------------------------\n// Senha PROPRIA, diferente da senha do app. Este roteiro traz o que falar, o porque\n// de cada passo e os avisos honestos (\"esse gabarito fui eu que escrevi\", \"nao prometa\n// piloto de campo\"). Se dividisse a senha com o app, o cliente que recebe a senha e\n// acha esta URL leria o roteiro de venda inteiro.\n// A senha NAO vive aqui; quem confere e o sst-entrar, no servidor.\nconst AREA_PROTEGIDA = 'roteiro';\nconst CHAVE_TOKEN = 'preaction-acesso-roteiro';\n\nfunction tokenGuardado() {\n  try { return localStorage.getItem(CHAVE_TOKEN) || ''; } catch (e) { return ''; }\n}\n\nfunction liberado(s) {\n  return !!((s && s.autorizado) || tokenGuardado());\n}\n\nfunction telaSenha(s) {\n  return `\n    <style>\n      .porta{display:flex;justify-content:center;padding:8vh 18px 40px}\n      .porta-cx{width:100%;max-width:372px;background:#fff;border:1px solid #d6ddd8;border-radius:4px;padding:28px 26px;display:flex;flex-direction:column;gap:12px}\n      .porta-chip{align-self:flex-start;font-size:10px;font-weight:700;letter-spacing:1.6px;border:1.5px solid #15211c;padding:3px 9px;border-radius:2px}\n      .porta-t{font-size:20px;font-weight:700;letter-spacing:-.3px;margin-top:4px;line-height:1.2}\n      .porta-d{font-size:13.5px;color:#3c4a44;line-height:1.55}\n      .porta-senha{width:100%;padding:12px 13px;border:1px solid #cfd8d2;border-radius:3px;font-size:15px;font-family:inherit;background:#fff;color:#15211c}\n      .porta-senha:focus{outline:none;border-color:#186a4b;box-shadow:0 0 0 2px rgba(24,106,75,.15)}\n      .porta-btn{padding:12px 18px;border-radius:3px;border:1px solid #15211c;background:#15211c;color:#fff;font-size:15px;font-weight:600;font-family:inherit;cursor:pointer}\n      .porta-btn:hover{background:#000}\n      .porta-btn[disabled]{opacity:.5;cursor:not-allowed}\n      .porta-err{font-size:13px;color:#8c2a1e;font-weight:600}\n    </style>\n    <div class=\"porta\">\n      <div class=\"porta-cx\">\n        <div class=\"porta-chip\">PREACTION</div>\n        <div class=\"porta-t\">Roteiro interno</div>\n        <div class=\"porta-d\">Material de preparo, não de apresentação. Tem senha própria, diferente da senha da demo.</div>\n        <input class=\"porta-senha\" type=\"password\" placeholder=\"Senha do roteiro\"${s.entrando ? ' disabled' : ''}>\n        <button class=\"porta-btn\"${s.entrando ? ' disabled' : ''}>${s.entrando ? 'Conferindo…' : 'Entrar'}</button>\n        ${s.erroSenha ? '<div class=\"porta-err\">' + esc(s.erroSenha) + '</div>' : ''}\n      </div>\n    </div>`;\n}\n\nasync function chamar(ep, corpo) {\n  let res;\n  try {\n    res = await fetch(RUSH + ep, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(corpo || {})\n    });\n  } catch (e) {\n    throw new Error('Sem resposta do serviço ' + ep + '.');\n  }\n  if (!res.ok) throw new Error('O serviço ' + ep + ' respondeu ' + res.status + '.');\n  const json = await res.json();\n  return json && json.data !== undefined ? json.data : json;\n}\n\nfunction esc(s) {\n  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\n// Assinatura da base: protocolo + nivel de cada caso, ordenado. Comparar totais nao\n// basta -- dois casos trocados entre si mantem total, acima e divergencias identicos e\n// passariam por \"confere\" numa conferencia de numeros.\nfunction assinar(regs) {\n  return (regs || [])\n    .map((r) => (r && r.protocolo ? r.protocolo : '?') + ':' + (r && r.ia_nivel ? r.ia_nivel : '?'))\n    .sort()\n    .join('|');\n}\n\nfunction diferencas(atuais, padrao) {\n  const mapa = (lista) => {\n    const m = {};\n    (lista || []).forEach((r) => { if (r && r.protocolo) m[r.protocolo] = r.ia_nivel || '?'; });\n    return m;\n  };\n  const a = mapa(atuais);\n  const p = mapa(padrao);\n  const out = [];\n  Object.keys(p).forEach((k) => {\n    if (!(k in a)) out.push(k + ' sumiu da base');\n    else if (a[k] !== p[k]) out.push(k + ' está como ' + a[k] + ', deveria ser ' + p[k]);\n  });\n  Object.keys(a).forEach((k) => { if (!(k in p)) out.push(k + ' é um reporte novo, não estava na cópia-ouro'); });\n  return out;\n}\n\nfunction barraEstado(d2) {\n  const s = d2.state;\n  if (s.restaurando) {\n    return '<div class=\"estado lendo\"><div class=\"info\"><div class=\"t\">Restaurando o estado da demo…</div>' +\n      '<div class=\"d\">Apagando os reportes atuais e recolocando os ' + BASELINE.total + ' do baseline. Leva alguns segundos.</div></div></div>';\n  }\n  if (!s.atual) {\n    return '<div class=\"estado lendo\"><div class=\"info\"><div class=\"t\">Conferindo o estado da demo…</div>' +\n      '<div class=\"d\">Lendo os reportes que estão na base agora.</div></div>' +\n      '<button class=\"btn-rest\" disabled>Restaurar estado</button></div>';\n  }\n  const a = s.atual;\n  const igual = a.confere && a.fora === 0;\n  const nums = a.total + ' reportes · ' + a.acima + ' acima da linha · ' + a.diverg + ' divergências · ' + a.taxa + '% subnotificação' +\n    (a.fora ? ' · ' + a.fora + ' fora do status inicial' : '');\n  const titulo = igual\n    ? 'Estado da demo confere com a cópia-ouro'\n    : 'O estado mudou — restaure antes de apresentar';\n  const desc = igual\n    ? 'Conferido caso a caso contra a cópia-ouro: os ' + BASELINE.total + ' protocolos e os níveis de cada um batem. Pode gravar.'\n    : 'A base não bate com a cópia-ouro. Enquanto não restaurar, o que você falar não vai corresponder ao que aparece na tela.';\n\n  const listaDiffs = (a.diffs && a.diffs.length)\n    ? '<div class=\"d\" style=\"color:#8c2a1e;margin-top:7px\">' +\n      a.diffs.slice(0, 6).map((x) => '· ' + esc(x)).join('<br>') +\n      (a.diffs.length > 6 ? '<br>· e mais ' + (a.diffs.length - 6) + '.' : '') +\n      '</div>'\n    : '';\n  return '<div class=\"estado ' + (igual ? 'ok' : 'fora') + '\">' +\n    '<div class=\"info\"><div class=\"t\">' + esc(titulo) + '</div><div class=\"d\">' + esc(desc) + '</div>' +\n    '<div class=\"nums\" style=\"margin-top:6px\">' + esc(nums) + '</div>' +\n    listaDiffs +\n    (s.aviso ? '<div class=\"d\" style=\"color:#8c2a1e;margin-top:6px\">' + esc(s.aviso) + '</div>' : '') +\n    '</div>' +\n    '<div style=\"display:flex;flex-direction:column;gap:7px\">' +\n    '<button class=\"btn-rest\">' + (igual ? 'Restaurar mesmo assim' : 'Restaurar estado da demo') + '</button>' +\n    '<button class=\"btn-rest\" data-ouro=\"1\" style=\"background:#fff;color:#8c2a1e;border-color:#b33a2b\" title=\"Ignora o baseline e volta à cópia-ouro, que nenhum script escreve\">Cópia-ouro</button>' +\n    '</div></div>';\n}\n\nexport default {\n  css: `\n:host{all:initial}\n*{box-sizing:border-box}\n.wrap{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;color:#15211c;background:#f2f4f1;height:100%;overflow:auto;padding:26px 20px 70px;line-height:1.6}\n.shell{max-width:1000px;margin:0 auto;display:flex;flex-direction:column;gap:20px}\n\nheader{display:flex;flex-direction:column;gap:9px;padding-bottom:20px;border-bottom:2px solid #15211c}\n.eyebrow{font-size:10.5px;font-weight:700;letter-spacing:1.6px;text-transform:uppercase;color:#6b7873}\nh1{margin:0;font-size:clamp(25px,4vw,34px);line-height:1.1;letter-spacing:-.4px}\n.lede{font-size:15.5px;color:#3c4a44;max-width:66ch}\n.meta{display:flex;gap:10px;flex-wrap:wrap;margin-top:6px}\n.tagm{font-size:11.5px;font-weight:600;background:#e2e8e4;color:#3c4a44;padding:3px 10px;border-radius:2px}\n\n.card{background:#fff;border:1px solid #d6ddd8;border-radius:4px}\n.card>.hd{padding:12px 18px;border-bottom:1px solid #e6ebe7;font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:#6b7873}\n.card>.bd{padding:18px}\n\n.estado{display:flex;gap:16px;align-items:center;flex-wrap:wrap;border-radius:4px;padding:15px 18px;border:1.5px solid}\n.estado.ok{background:#e7f2ec;border-color:#186a4b}\n.estado.fora{background:#fbeae7;border-color:#b33a2b}\n.estado.lendo{background:#f7f9f7;border-color:#d6ddd8}\n.estado .info{flex:1;min-width:230px}\n.estado .t{font-weight:700;font-size:14.5px}\n.estado.ok .t{color:#14563c}\n.estado.fora .t{color:#8c2a1e}\n.estado .d{font-size:13px;color:#3c4a44;margin-top:2px}\n.estado .nums{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:#3c4a44}\n.btn-rest{padding:10px 18px;border-radius:3px;border:1px solid #15211c;background:#15211c;color:#fff;font:600 14px inherit;font-family:inherit;cursor:pointer;white-space:nowrap}\n.btn-rest:hover{background:#000}\n.btn-rest[disabled]{opacity:.45;cursor:not-allowed}\n.estado.ok .btn-rest{background:#fff;color:#15211c}\n\n.aviso{background:#fdf6e3;border:1.5px solid #e8d9a8;border-radius:4px;padding:15px 18px}\n.aviso .t{font-weight:700;font-size:14.5px;color:#8c6d1f;margin-bottom:5px}\n.aviso ul{margin:6px 0 0;padding-left:19px;font-size:13.5px;color:#3c4a44}\n.aviso li{margin-bottom:4px}\n.aviso code{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;background:#fff;padding:1px 5px;border-radius:2px;border:1px solid #e8d9a8}\n\n.passo{background:#fff;border:1px solid #d6ddd8;border-radius:4px;overflow:hidden}\n.passo.destaque{border:2px solid #b33a2b}\n.passo .cab{display:flex;gap:14px;align-items:flex-start;padding:16px 18px;border-bottom:1px solid #e6ebe7}\n.passo.destaque .cab{background:#fbeae7;border-bottom-color:#e6b8b0}\n.num{width:31px;height:31px;flex:none;border-radius:50%;background:#15211c;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px}\n.passo.destaque .num{background:#b33a2b}\n.cab .txt{flex:1;min-width:0}\n.cab h2{margin:0;font-size:17.5px;line-height:1.25;letter-spacing:-.2px}\n.cab .sub{font-size:12px;color:#6b7873;margin-top:3px}\n.cab .tempo{font-size:11.5px;font-weight:700;color:#6b7873;white-space:nowrap;font-variant-numeric:tabular-nums;background:#f2f4f1;padding:4px 9px;border-radius:2px}\n.passo.destaque .cab .tempo{background:#fff;color:#8c2a1e}\n\n.corpo{display:grid;grid-template-columns:1fr 1fr;gap:0}\n.col{padding:18px}\n.col+.col{border-left:1px solid #e6ebe7}\n@media(max-width:820px){.corpo{grid-template-columns:1fr}.col+.col{border-left:none;border-top:1px solid #e6ebe7}}\n\n.rot{font-size:10px;font-weight:700;letter-spacing:1.1px;text-transform:uppercase;color:#6b7873;margin-bottom:8px}\nol.acoes{margin:0;padding-left:19px;font-size:14px}\nol.acoes li{margin-bottom:7px}\n.fala{background:#f2f4f1;border-left:3px solid #186a4b;border-radius:0 3px 3px 0;padding:12px 15px;font-size:14.5px;font-style:italic;color:#15211c}\n.nota{font-size:12.5px;color:#6b7873;margin-top:9px}\n.porque{margin-top:13px;padding-top:12px;border-top:1px dashed #d6ddd8;font-size:13px;color:#3c4a44}\n.porque b{color:#186a4b;font-style:normal}\n\nfigure{margin:0}\nimg{display:block;width:100%;height:auto;border:1px solid #d6ddd8;border-radius:3px;background:#fff}\nfigcaption{font-size:11.5px;color:#6b7873;margin-top:7px}\n.linkurl{display:inline-block;font-family:ui-monospace,Menlo,monospace;font-size:11.5px;color:#186a4b;word-break:break-all;margin-top:6px}\n\ntable{width:100%;border-collapse:collapse;font-size:13.5px}\nth{text-align:left;padding:9px 14px;font-size:10px;letter-spacing:.9px;text-transform:uppercase;color:#6b7873;border-bottom:1px solid #cfd8d2}\ntd{padding:9px 14px;border-bottom:1px solid #eef2ef;vertical-align:top}\ntd.k{font-weight:600;white-space:nowrap}\ntd.v{font-family:ui-monospace,Menlo,monospace;font-size:11.5px;color:#186a4b;word-break:break-all}\n.sub2{font-family:ui-monospace,Menlo,monospace;font-size:10.5px;font-weight:400;color:#6b7873;margin-top:2px;white-space:nowrap}\ntbody tr:last-child td{border-bottom:none}\n\n.qa{display:flex;flex-direction:column;gap:14px}\n.qa .q{font-weight:700;font-size:14.5px}\n.qa .a{font-size:13.5px;color:#3c4a44;margin-top:3px}\n\n.cuid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}\n.cuid .i{background:#f7f9f7;border:1px solid #e2e8e4;border-radius:3px;padding:13px 15px}\n.cuid .i b{display:block;font-size:13.5px;margin-bottom:3px}\n.cuid .i span{font-size:12.5px;color:#3c4a44}\n.cuid code{font-family:ui-monospace,Menlo,monospace;font-size:11.5px;background:#fff;padding:1px 4px;border-radius:2px;border:1px solid #e2e8e4}\n\nfooter{font-size:12px;color:#6b7873;border-top:1px solid #d6ddd8;padding-top:16px;display:flex;flex-direction:column;gap:5px}\n`,\n\n  render(d2) {\n    if (!liberado(d2.state)) return `<div class=\"wrap\">${telaSenha(d2.state)}</div>`;\n    const passos = PASSOS.map((p) => `\n      <div class=\"passo ${p.destaque ? 'destaque' : ''}\">\n        <div class=\"cab\">\n          <div class=\"num\">${p.n}</div>\n          <div class=\"txt\">\n            <h2>${esc(p.tit)}</h2>\n            <div class=\"sub\">Tela: ${esc(p.tela)}</div>\n          </div>\n          <div class=\"tempo\">${esc(p.t)}</div>\n        </div>\n        <div class=\"corpo\">\n          <div class=\"col\">\n            <div class=\"rot\">O que fazer</div>\n            <ol class=\"acoes\">${p.fazer.map((f) => '<li>' + f + '</li>').join('')}</ol>\n            <div class=\"rot\" style=\"margin-top:16px\">O que dizer</div>\n            <div class=\"fala\">\"${esc(p.falar)}\"</div>\n            ${p.nota ? '<div class=\"nota\">' + p.nota + '</div>' : ''}\n            <div class=\"porque\"><b>Por que assim:</b> ${esc(p.porque)}</div>\n          </div>\n          <div class=\"col\">\n            <figure>\n              <img src=\"${esc(p.img)}\" alt=\"Tela: ${esc(p.tela)}\" loading=\"lazy\">\n              <figcaption>${p.n} · ${esc(p.tela)}<br><span class=\"linkurl\">${esc(p.url)}</span></figcaption>\n            </figure>\n            ${p.extraImg ? '<figure style=\"margin-top:14px\"><img src=\"' + esc(p.extraImg) + '\" alt=\"Formulário de papel\" loading=\"lazy\"><figcaption>' + p.extraCap + '</figcaption></figure>' : ''}\n          </div>\n        </div>\n      </div>`).join('');\n\n    const atalhos = ATALHOS.map((a) => `<tr><td class=\"k\">${esc(a[0])}</td><td class=\"v\">${esc(a[1])}</td></tr>`).join('');\n    const casos = CASOS.map((c) => `<tr><td class=\"k\">${esc(c[0])}<div class=\"sub2\">${esc(c[1])}</div></td><td style=\"font-size:13px;color:#3c4a44\">${esc(c[2])}</td><td class=\"v\">${esc(c[3])}</td></tr>`).join('');\n    const perguntas = PERGUNTAS.map((p) => `<div><div class=\"q\">${esc(p.q)}</div><div class=\"a\">${esc(p.a)}</div></div>`).join('');\n    const cuidados = CUIDADOS.map((c) => `<div class=\"i\"><b>${c[0]}</b><span>${c[1]}</span></div>`).join('');\n\n    return `<div class=\"wrap\"><div class=\"shell\">\n\n      <header>\n        <div class=\"eyebrow\">Sodexo · Piloto PreAction · Protótipo Data2</div>\n        <h1>Roteiro da demonstração</h1>\n        <p class=\"lede\">Oito passos, cerca de seis minutos. O arco é: mostrar o problema, fazer um reporte como um colaborador faria, provar que ele não vê a classificação, revelar o achado no painel do gestor e mostrar que nem uma correção feita sob pressão apaga o que foi dito primeiro. Cada passo traz o que fazer, o que dizer e o print de como a tela deve estar.</p>\n        <div class=\"meta\"><span class=\"tagm\">~6 min</span><span class=\"tagm\">8 passos</span><span class=\"tagm\">Chrome obrigatório</span><span class=\"tagm\">Dados fictícios</span><span class=\"tagm\">Ensaie à vontade — dá para restaurar</span></div>\n      </header>\n\n      ${barraEstado(d2)}\n\n      <div class=\"aviso\">\n        <div class=\"t\">Antes de apertar o gravar</div>\n        <ul>\n          <li>Abra no <strong>Chrome</strong>. O ditado por voz não existe em Safari nem Firefox.</li>\n          <li>Use o endereço com <code>--</code> entre app e sistema: <code>${esc(BASE)}</code>. A forma com ponto no lugar do <code>--</code> falha em parte dos hosts, por certificado.</li>\n          <li>Autorize o microfone uma vez, com antecedência.</li>\n          <li>Deixe o arquivo do formulário de papel salvo na área de trabalho (imagem do passo 4b).</li>\n          <li>Abra duas abas: uma na tela de reporte, outra no painel. Trocar de aba é mais rápido que navegar.</li>\n        </ul>\n      </div>\n\n      ${passos}\n\n      <div class=\"card\">\n        <div class=\"hd\">Casos prontos — abrem a tela de conferência já preenchida</div>\n        <div class=\"bd\" style=\"padding:0\">\n          <table>\n            <thead><tr><th>Caso</th><th>O que ele prova</th><th>Endereço</th></tr></thead>\n            <tbody>${casos}</tbody>\n          </table>\n        </div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">Atalhos — leve a tela direto ao estado que você quer</div>\n        <div class=\"bd\" style=\"padding:0\">\n          <table>\n            <thead><tr><th>Estado</th><th>Endereço</th></tr></thead>\n            <tbody>${atalhos}</tbody>\n          </table>\n        </div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">O que ele vai perguntar</div>\n        <div class=\"bd\"><div class=\"qa\">${perguntas}</div></div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">Cuidados</div>\n        <div class=\"bd\"><div class=\"cuid\">${cuidados}</div></div>\n      </div>\n\n      <footer>\n        <div>Prints capturados da solução em 29 de agosto de 2026. Se a tela mudar, recapture — um roteiro com print velho confunde mais do que ajuda.</div>\n        <div>Os ${BASELINE.total} reportes do painel são casos sintéticos, montados a partir de perfis públicos de risco em cozinha industrial e refeitório. Nenhum dado da Sodexo foi usado.</div>\n      </footer>\n\n    </div></div>`;\n  },\n\n  mounted(d2) {\n    const ler = async () => {\n      try {\n        const [r, ouro] = await Promise.all([chamar('sst-listar', {}), chamar('sst-ouro-ler', {})]);\n        const regs = (r && r.registros) || [];\n        const padrao = (((ouro && ouro.registros) || []).map((x) => x.dados || {}));\n        const acima = regs.filter((x) => x.ia_acima_da_linha).length;\n        const diverg = regs.filter((x) => x.ia_divergencia).length;\n        const fora = regs.filter((x) => x.status !== 'Novo' && x.status !== 'Alerta aberto').length;\n        d2.setState({\n          atual: {\n            total: regs.length, acima: acima, diverg: diverg, fora: fora,\n            taxa: regs.length ? Math.round((diverg / regs.length) * 100) : 0,\n            confere: assinar(regs) === assinar(padrao),\n            diffs: diferencas(regs, padrao)\n          },\n          aviso: ''\n        });\n      } catch (err) {\n        d2.setState({ atual: { total: 0, acima: 0, diverg: 0, fora: 0, taxa: 0 }, aviso: 'Não consegui ler a base: ' + String(err.message || err) });\n      }\n    };\n    const entrar = async () => {\n      const campo = d2.$('.porta-senha');\n      const senha = campo ? String(campo.value || '').trim() : '';\n      if (!senha) { d2.setState({ erroSenha: 'Digite a senha.' }); return; }\n      d2.setState({ entrando: true, erroSenha: '' });\n      try {\n        const r = await chamar('sst-entrar', { area: AREA_PROTEGIDA, senha: senha });\n        if (r && r.ok && r.token) {\n          try { localStorage.setItem(CHAVE_TOKEN, r.token); } catch (e) { /* navegador sem storage */ }\n          d2.setState({ entrando: false, autorizado: true, erroSenha: '' });\n          ler();\n        } else {\n          d2.setState({ entrando: false, erroSenha: 'Senha incorreta.' });\n        }\n      } catch (err) {\n        d2.setState({ entrando: false, erroSenha: 'Não consegui conferir a senha. ' + String(err.message || err) });\n      }\n    };\n\n    d2.on('.porta-btn', 'click', entrar);\n    d2.on('.porta-senha', 'keydown', (e) => { if (e.key === 'Enter') entrar(); });\n\n    if (liberado(d2.state)) ler();\n\n    d2.on('.btn-rest', 'click', async (e) => {\n      const btn = e.target.closest('.btn-rest');\n      const ouro = btn && btn.getAttribute('data-ouro') === '1';\n      d2.setState({ restaurando: true, aviso: '' });\n      try {\n        await chamar(ouro ? 'sst-restaurar-ouro' : 'sst-restaurar', {});\n        await ler();\n      } catch (err) {\n        d2.setState({ aviso: 'Falhou ao restaurar: ' + String(err.message || err) });\n      } finally {\n        d2.setState({ restaurando: false });\n        ler();\n      }\n    });\n  }\n};"}}}}}}}},{"_id":"5ecd05ded68ce41360f74b43","component":"data2-core-types@Component","params":{"extendable":{"placeholder":"children"},"component":"Block","package":"data2-core-primitives"}},{"_id":"5f494791a575399a45020f87","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@input","params":{"style":{"width":"100%","height":"100%","boxSizing":"border-box","background":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"comparisonSubject":true}}],"then":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"checkboxFill"}}}},"rgba(0,118,255,1)"]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"else":{"params":{"content":"none"},"component":"data2-core-primitives@String"}}},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","outline":"none","appearance":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"vertical"}}],"then":"slider-vertical","else":"none"}},"cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}}},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex","source":"VIRTUAL_COMPONENT_PARAMS"}},"step":{"component":"data2-core-types@Reference","params":{"reference":"step","source":"VIRTUAL_COMPONENT_PARAMS"}},"min":{"component":"data2-core-types@Reference","params":{"reference":"min","source":"VIRTUAL_COMPONENT_PARAMS"}},"max":{"component":"data2-core-types@Reference","params":{"reference":"max","source":"VIRTUAL_COMPONENT_PARAMS"}},"maxLength":{"params":{"then":{"params":{},"component":"data2-core-primitives@Undefined"},"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-comparison-operators@Equal"}],"else":{"component":"data2-core-types@Reference","params":{"reference":"maxLength","source":"VIRTUAL_COMPONENT_PARAMS"}}},"component":"data2-core-flow@If"},"orient":{"component":"data2-core-types@Reference","params":{"reference":"orient","source":"VIRTUAL_COMPONENT_PARAMS"}},"type":{"component":"data2-core-types@Reference","params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder","source":"VIRTUAL_COMPONENT_PARAMS"}},{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}}]}},"value":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"defaultCase":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":"YYYY-MM-DD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"month"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"datetime-local"}}}},"value":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"format":{"component":"data2-core-primitives@String","params":{"content":"YYYY-MM-DDTHH:mm"}}}}}}]},"component":"data2-core-flow@Switch"},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"defaultChecked":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":"checkbox"}}],"then":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"else":""}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"compare":{"params":{"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoComplete"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Identical"},"else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-flow@If"}}},"data-lpignore":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"}],"then":"","else":"true"}},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus","source":"VIRTUAL_COMPONENT_PARAMS"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur","source":"VIRTUAL_COMPONENT_PARAMS"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"}}}}},"component":"DataFieldBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}},{"_id":"5ed9bed7b9e0891ce913e884","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5f472ae463c680de4ff296e9","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Data2TableDataSource","extends":"data2-core@DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5f804e93c8da12be8b498dfa","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@textarea","params":{"style":{"width":"100%","height":"100%","resize":"none","boxSizing":"border-box","background":{"params":{"content":"transparent"},"component":"data2-core-primitives@String"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingTop":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingBottom":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}},"component":"data2-core-types@Reference"},"--d2-placeholder-color":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"placeholderTextColor"}}},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"value":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}}],"then":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":"YYYY-MM-DD"}},"else":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"maxLength":{"component":"data2-core-types@Reference","params":{"reference":"maxLength"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"},"lang":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lang"}}}}}}}},"component":"DataTextBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a9219f453f46404027643da","component":"data2-rush@HTTPListener","reference":"sst-ler-foto","system":"69fe34b018c813c5be7bddd9","params":{},"deleteMetadata":{}},{"_id":"6a95e58185cd1d60110aa9bf","component":"data2-rush@HTTPListener","reference":"sst-registrar","system":"69fe34b018c813c5be7bddd9","params":{},"deleteMetadata":{}},{"_id":"6a9abba7de69ea2796366f58","component":"data2-rush@HTTPListener","reference":"sst-entrar","system":"69fe34b018c813c5be7bddd9","params":{},"deleteMetadata":{}},{"_id":"6a95e5770e454ecd8a032417","component":"data2-rush@HTTPListener","reference":"sst-extrair","system":"69fe34b018c813c5be7bddd9","params":{},"deleteMetadata":{}},{"_id":"6a9228e5eed7600008c5af48","component":"data2-rush@HTTPListener","reference":"sst-listar","system":"69fe34b018c813c5be7bddd9","params":{},"deleteMetadata":{}},{"_id":"6a922dfdceaa5f4634dd5127","component":"data2-rush@HTTPListener","reference":"sst-status","system":"69fe34b018c813c5be7bddd9","params":{},"deleteMetadata":{}},{"_id":"6a9acb9164fcc90053b09f1f","component":"data2-rush@HTTPListener","reference":"sst-ouro-ler","system":"69fe34b018c813c5be7bddd9","params":{},"deleteMetadata":{}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a6939cfdc1fded10b0450a6","component":"data2-core-primitives@Router","system":"69fe34b018c813c5be7bddd9","displayName":"Kanban Router","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"/","name":"Pipeline","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"tw7GDnGQfoUySgEqoye42"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/relatorio","name":"Relatório de Funil","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"FZGRxV9SAJWFzKsAbchYA"}}}}]},"reference":"kanban-router"},{"_id":"6a922dee515aa8eb498435d5","component":"data2-core-primitives@Router","system":"69fe34b018c813c5be7bddd9","displayName":"PreAction — Router","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"","name":"Reportar · PreAction","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"WpsQQr2s0cz4eHqAmA74b"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/painel","name":"Painel do Gestor · PreAction","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"k-Pm_HPKJLvocqWHY_sPU"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/roteiro","name":"Roteiro da Demo · PreAction","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"vxoPscTCxv2-qeEmlGtiW"}}}}]},"reference":"preaction-router","deleteMetadata":{}},{"_id":"6a4bff49be5b19656f25ac91","component":"data2-core-primitives@Artboard","system":"69fe34b018c813c5be7bddd9","displayName":"Kanban Comercial — Board","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Pipeline versão antiga — Board"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":6222,"y":4444,"exactX":6222.22,"exactY":4444.45}}},"reference":"1h7ki-2FJ7GFGM0eeimi_"},{"_id":"6a6939b3d17786f7e5581160","component":"data2-core-primitives@Artboard","system":"69fe34b018c813c5be7bddd9","displayName":"Pipeline — Relatório de Funil","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Pipeline — Relatório de Funil"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":116,"y":-36,"exactX":116.42,"exactY":-35.84}}},"reference":"FZGRxV9SAJWFzKsAbchYA"},{"_id":"6a4c139e6c020b3085bf7778","component":"data2-core-primitives@Artboard","system":"69fe34b018c813c5be7bddd9","displayName":"Pipeline EU V4","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Pipeline Kanban"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":-1671,"y":26,"exactX":-1671.28,"exactY":25.73}}},"reference":"tw7GDnGQfoUySgEqoye42"},{"_id":"6a9238d3c028f6518567da8a","component":"data2-core-primitives@Artboard","system":"69fe34b018c813c5be7bddd9","displayName":"PreAction — Roteiro da Demo","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"PreAction — Roteiro da Demo"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":1600}},"position":{"component":"data2-core-types@Position","params":{"x":-906,"y":1395,"exactX":-906.17,"exactY":1395.35}}},"reference":"vxoPscTCxv2-qeEmlGtiW","deleteMetadata":{}},{"_id":"6a922cd42c78bf972cef5854","component":"data2-core-primitives@Artboard","system":"69fe34b018c813c5be7bddd9","displayName":"PreAction — Painel","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"PreAction — Painel"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1200,"height":1500}},"position":{"component":"data2-core-types@Position","params":{"x":1647,"y":1531,"exactX":1647.37,"exactY":1530.7}}},"reference":"k-Pm_HPKJLvocqWHY_sPU","deleteMetadata":{}},{"_id":"6a92220814ffb857b3df9498","component":"data2-core-primitives@Artboard","system":"69fe34b018c813c5be7bddd9","displayName":"PreAction — Reporte","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"PreAction — Reporte"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1080,"height":1400}},"position":{"component":"data2-core-types@Position","params":{"x":329,"y":1564,"exactX":328.8,"exactY":1563.74}}},"reference":"WpsQQr2s0cz4eHqAmA74b","deleteMetadata":{}},{"_id":"5820399b0002879737dbc82f","parent":"6a4bff49be5b19656f25ac91","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"Root","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#eef2f6"}}}}]}},"onVisibleOnScreen":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"prop":"sort","args":[{"ordem":1}]}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"paginate","args":[{"size":1000}]}},{"component":"data2-core-flow@AwaitReady","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.leads","value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"data.records"}}}}]}}},"index":0,"reference":"kbRoot"},{"_id":"67d1bdb430e264bc369a6b0a","parent":"6a4bff49be5b19656f25ac91","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"DetailOverlay","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a73"}}}}]}},"hide":{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.detailOpen"}}}}},"index":200,"reference":"kbDetailOverlay"},{"_id":"74aa4e126dcfb359a2b1db2a","parent":"6a4bff49be5b19656f25ac91","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GerirOverlay","params":{"position":{"component":"data2-core-types@Position","params":{"x":-237,"y":26,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":-236.55,"exactY":25.92}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a73"}}}}]}},"hide":{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.gerirOpen"}}}}},"index":300,"reference":"kbGerirOverlay"},{"_id":"69c9a75f4e200cdb5a884cf7","parent":"6a6939b3d17786f7e5581160","component":"people-le-moura@funnelreport","system":"69fe34b018c813c5be7bddd9","displayName":"funnelreport","params":{"leads":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"etapas":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":4,"y":119,"freeTransform":true,"left":true,"top":true,"exactX":4.41,"exactY":118.95}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"nns3TxN7kugng5eEKUJJT"},{"_id":"32e0b100d4b7d5b4dfa65286","parent":"6a4c139e6c020b3085bf7778","component":"people-le-moura@kanbanboard","system":"69fe34b018c813c5be7bddd9","displayName":"kanbanboard","params":{"leads":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"etapas":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":9,"y":9,"freeTransform":true,"left":true,"top":true,"exactX":8.99,"exactY":8.99}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"auJfSpcma_9SeK29koOMa"},{"_id":"fb6b5ca6db0a277d2cfc93a2","parent":"6a9238d3c028f6518567da8a","component":"people-le-moura@preaction-roteiro","system":"69fe34b018c813c5be7bddd9","displayName":"Roteiro da Demo","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":2,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"exactX":1.77,"exactY":0}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":1600}}}},"reference":"QxtJiafgrsh4w4WYZ2TRm","deleteMetadata":{}},{"_id":"c097aee6cef23007f20b2d8f","parent":"6a922cd42c78bf972cef5854","component":"people-le-moura@preaction-painel","system":"69fe34b018c813c5be7bddd9","displayName":"Painel PreAction","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1200,"height":1500}}}},"reference":"cyWvEY3_7XOZQfiKOGiyY","deleteMetadata":{}},{"_id":"d24a34f87b78e1dc23b80b64","parent":"6a92220814ffb857b3df9498","component":"people-le-moura@preaction-reporte","system":"69fe34b018c813c5be7bddd9","displayName":"Reporte PreAction","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1080,"height":1400}}}},"reference":"miBQOip89XgjUtm1oIu2B","deleteMetadata":{}},{"_id":"f403cb74e94ee410c1c99b36","parent":"5820399b0002879737dbc82f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"Header","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":78}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}},"shadow":{"component":"data2-core-types@Shadow","params":{"x":0,"y":2,"blur":8,"color":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a1a"}}}}},"index":0,"reference":"OvcSZmiLvEpwp6j7Kvq7t"},{"_id":"b6e303bc7a600af6443e0842","parent":"5820399b0002879737dbc82f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BoardArea","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":78,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":822}},"childrenMode":"cols","scroll":{"component":"data2-core-types@Scroll","params":{"x":true}},"repeat":{"component":"data2-core-types@DataSetReference","params":{"reference":"kanban-etapasDataSet"}},"repeatReference":"etapa"},"index":1,"reference":"kbEtapas"},{"_id":"dd0f16f106553ab971159a1d","parent":"67d1bdb430e264bc369a6b0a","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"DetailPanel","params":{"position":{"component":"data2-core-types@Position","params":{"x":920,"y":0,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":520,"height":900}},"childrenMode":"rows","fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}},"scroll":{"component":"data2-core-types@Scroll","params":{"y":true}},"shadow":{"component":"data2-core-types@Shadow","params":{"x":{"component":"data2-core-numerical-operators@Subtract","params":{"components":[0,4]}},"y":0,"blur":24,"color":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a33"}}}}},"index":201,"reference":"g8a46faglBrqF-xthwLl_"},{"_id":"c069198dab33d1838129d246","parent":"74aa4e126dcfb359a2b1db2a","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GerirPanel","params":{"position":{"component":"data2-core-types@Position","params":{"x":410,"y":110,"freeTransform":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":620,"height":680}},"childrenMode":"rows","fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":16}},"scroll":{"component":"data2-core-types@Scroll","params":{"y":true}},"shadow":{"component":"data2-core-types@Shadow","params":{"x":0,"y":10,"blur":40,"color":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a44"}}}}},"index":301,"reference":"ZoJPmANVrPdZf4QHmFfVq"},{"_id":"270d6ac0f006c7a03185e6fb","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"Title","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":14,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":26}},"text":"Kanban Comercial","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":20,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","verticalAlignment":"middle"}}},"index":0,"reference":"0D_-IcjYF_4wLDtijOUu0"},{"_id":"6cb338a4ea0eca37c0a69f0a","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"Subtitle","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":44,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":340,"height":18}},"text":"Controlo comercial · 306 leads · Data2","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":12},"index":1,"reference":"1n3VvV-y3VOsCv3qmZR8H"},{"_id":"2d6a2c6695f7d19dc7a4658c","parent":"f403cb74e94ee410c1c99b36","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"Search","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.search","type":"text","placeholder":"  Pesquisar nome ou empresa...","super":{"position":{"component":"data2-core-types@Position","params":{"x":380,"y":22,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":240,"height":36}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f1f5f9"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13}},"index":2,"reference":"kbSearch"},{"_id":"bbc750a51d09a00699fb8d67","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"FiltroOrigemLabel","params":{"position":{"component":"data2-core-types@Position","params":{"x":648,"y":14,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":120,"height":12}},"text":"ORIGEM","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#94a3b8"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":3,"reference":"ht62kbjsGSiYJxClkGpJ0"},{"_id":"f4bef1c3225e98720935fe6c","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"OrigTodos","params":{"position":{"component":"data2-core-types@Position","params":{"x":648,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":56,"height":30}},"text":"Todos","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterOrigem","value":""}}]}}},"index":4,"reference":"kbOrigTodos"},{"_id":"93b8b6e0a0fa77e271d8db78","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"OrigContactos","params":{"position":{"component":"data2-core-types@Position","params":{"x":708,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":76,"height":30}},"text":"Enterprise","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterOrigem","value":"Enterprise"}}]}}},"index":5,"reference":"kbOrigCont"},{"_id":"5c0c9eac2bc0f24b293eee8a","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"OrigMid","params":{"position":{"component":"data2-core-types@Position","params":{"x":788,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":90,"height":30}},"text":"Mid-Market","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterOrigem","value":"Mid-Market"}}]}}},"index":6,"reference":"kbOrigMid"},{"_id":"e5d496ca455dbd0dec80f6af","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"FiltroVendaLabel","params":{"position":{"component":"data2-core-types@Position","params":{"x":892,"y":14,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":140,"height":12}},"text":"TIPO DE VENDA","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#94a3b8"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":7,"reference":"qNZnHkrNOYWUCMbbuv8VV"},{"_id":"a42f0fb9d33fb3e265aa59e9","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"VendaTodos","params":{"position":{"component":"data2-core-types@Position","params":{"x":892,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":56,"height":30}},"text":"Todas","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterTipoVenda","value":""}}]}}},"index":8,"reference":"kbVenTodos"},{"_id":"c1fc9b26bf9c69689852f62f","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"VendaSprints","params":{"position":{"component":"data2-core-types@Position","params":{"x":952,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":68,"height":30}},"text":"Sprints","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#0284c7"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterTipoVenda","value":"Sprints Rápidos"}}]}}},"index":9,"reference":"kbVenSpr"},{"_id":"4635af35713f7dab4b7386c9","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"VendaSuite","params":{"position":{"component":"data2-core-types@Position","params":{"x":1024,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":74,"height":30}},"text":"Suíte IA","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#7c3aed"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterTipoVenda","value":"Suíte Completa IA"}}]}}},"index":10,"reference":"kbVenSui"},{"_id":"d517962ce5a93c208955ae32","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnGerir","params":{"position":{"component":"data2-core-types@Position","params":{"x":1160,"y":20,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":128,"height":38}},"text":"Gerir Etapas","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textSize":13,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.gerirOpen","value":true}}]}}},"index":11,"reference":"kbBtnGerir"},{"_id":"f19ef44d51d99ab88ac52d7b","parent":"f403cb74e94ee410c1c99b36","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnNovo","params":{"position":{"component":"data2-core-types@Position","params":{"x":1296,"y":20,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":128,"height":38}},"text":"+ Novo Lead","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textSize":13,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"700"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#16a34a"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.selectedLeadId","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.mode","value":"new"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_empresa","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_nome","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_cargo","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_linkedin","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_email","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_ligacao","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_via_quem","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_forca","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_status_outreach","value":"A contactar"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_notas","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_etapa","value":"Lead Mapeado"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo","value":false}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_nota","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_origem","value":"Enterprise"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.detailOpen","value":true}}]}}},"index":12,"reference":"kbBtnNovo"},{"_id":"947bf7bf43d6db102166bff7","parent":"b6e303bc7a600af6443e0842","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"ColWrap","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":822}}},"index":0,"reference":"B8u4hnx2ryvo1A5W5u-tE"},{"_id":"38e7292c8da483d7367db7b9","parent":"dd0f16f106553ab971159a1d","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"PanelContent","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":520,"height":1380}}},"index":0,"reference":"cCfZInQst3TDLdDlaVLlE"},{"_id":"d4edfd431567df72d6792a5e","parent":"c069198dab33d1838129d246","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GContent","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":620,"height":980}}},"index":0,"reference":"ERLS9JTXY1HHsh3Dv8XMZ"},{"_id":"a6dddeadadb574f8d587a35d","parent":"947bf7bf43d6db102166bff7","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"Column","params":{"position":{"component":"data2-core-types@Position","params":{"x":10,"y":10,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":806}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e8edf3"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":12}}},"index":0,"reference":"-D_3wmxSqfU6nV6aisi8y"},{"_id":"8b97914e0bfb9635da9de1e2","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"DTitle","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":20,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":28}},"text":"Detalhe do Lead","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":18,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","verticalAlignment":"middle"}}},"index":0,"reference":"jx1njeaA3j7xjd_-rD4jF"},{"_id":"1f859e5aded3caf8ed762bba","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"DClose","params":{"position":{"component":"data2-core-types@Position","params":{"x":466,"y":18,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":30,"height":30}},"text":"✕","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}},"textSize":15,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f1f5f9"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.detailOpen","value":false}}]}}},"index":1,"reference":"kbClose"},{"_id":"aaeba69b03fa23de7f8d0d10","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LEmpresa","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":64,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"EMPRESA","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":2,"reference":"ZxHQA5LrLtwimJgcG14zy"},{"_id":"7c169f04a18f66455c90b45a","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FEmpresa","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_empresa","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":82,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Empresa"},"index":3,"reference":"K_Vq6S3TWBkCm8bx9kBW0"},{"_id":"95607f00cb3fd241f5c15932","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LNome","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":128,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Nome Completo","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":4,"reference":"rze_i8Lvl8768xsWsCbMB"},{"_id":"e7d08d02dac8dcbf5daf8c68","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FNome","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_nome","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":146,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Nome completo"},"index":5,"reference":"Yxeak9ySunidZxJcJA8I6"},{"_id":"6069396bac061cf27d014699","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LCargo","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":192,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Cargo","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":6,"reference":"NMg4t2RJFziWAXVn9F08X"},{"_id":"809ccf254b4a1162faf24e4e","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FCargo","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_cargo","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":210,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Cargo"},"index":7,"reference":"Pw7LBqtCkTv6Gcta1apSf"},{"_id":"11ad99ac21877ab63cb761e9","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LEmail","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":256,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Email","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":8,"reference":"ih4CrXJFEFzWNI2DB0oji"},{"_id":"dcda5309d04cfa9f428ad2d6","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FEmail","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_email","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":274,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Email"},"index":9,"reference":"tuQrgGrthjKnL9Vv0fvIl"},{"_id":"7ca074554632c7dc3849bf75","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LLinkedin","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":320,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"LinkedIn URL","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":10,"reference":"8CGzwWO58Q0t6u8Q9dfw1"},{"_id":"9e65f3fe3f869c591c0a1153","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FLinkedin","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_linkedin","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":338,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  URL do LinkedIn"},"index":11,"reference":"7VJkr2IzbTqHvs5LV_Nul"},{"_id":"ae919c0a7f947a32c3ba0b45","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LTipoLig","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":384,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Tipo de Ligação","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":12,"reference":"1Kt-zIlL3gM9mxgC9ZiCq"},{"_id":"9a8ba70e4ddf7d20e08875e7","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FTipoLig","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_tipo_ligacao","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":402,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Tipo de ligação"},"index":13,"reference":"tPqHFYoWjIlpuNWw7qQYr"},{"_id":"f0de9f5869df0c50f8345615","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LViaQuem","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":448,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Via Quem","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":14,"reference":"UmrBxiqroCDtN61YXkyN0"},{"_id":"5319bea0198c830edc460527","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FViaQuem","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_via_quem","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":466,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Via quem"},"index":15,"reference":"pyc0wh4Gm8uwFuLwBGZyA"},{"_id":"132fa6a28b68ae913b147c33","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LForca","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":512,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Força da Relação","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":16,"reference":"Pd0BqgWK4Up5x4O8r1Ksi"},{"_id":"376c9ae2ef4dab85cb31f301","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FForca","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_forca","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":530,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Força da relação"},"index":17,"reference":"BqsSZJzqSnHZWRzCId0yV"},{"_id":"be91c7a0883b57be80fbde4c","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LStatus","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":576,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Status Outreach","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":18,"reference":"eYgalPtsiID86idKWJP88"},{"_id":"06b8b1230013b882ba5e7251","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FStatus","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_status_outreach","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":594,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Status outreach"},"index":19,"reference":"mLe70h5p2Fn6snJoqhBNG"},{"_id":"73055ee372a4e6f522a24a91","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LOrigem","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":640,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Origem","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":20,"reference":"JyX0Bf1H_pkucSFIQhYqR"},{"_id":"86f88be2a2817f714d26c73c","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FOrigem","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_origem","type":"text","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":658,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13},"placeholder":"  Contactos / Mid-Market"},"index":21,"reference":"JhONgxaORiaDHAs0fQiJt"},{"_id":"3e7973285fdb73ff2de19ecf","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LNotas","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":704,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Notas","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":22,"reference":"076j1riaMKLJdU-Clc7Yb"},{"_id":"75dc4a8bea6c0eedd104b2b2","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataTextBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FNotas","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_notas","padding":{"left":10,"right":10,"top":8},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":722,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":72}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13}},"index":23,"reference":"CjJIEVe7bxEIYSkszh2zu"},{"_id":"c3c7bc85f49a02b780e60907","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LEtapa","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":812,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Mover para etapa","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":24,"reference":"BavzMbWqbzK_RhsialTvf"},{"_id":"443a25613a46d6c15a4cccda","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"StageGrid","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":832,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":190}},"childrenMode":"grid","repeat":{"component":"data2-core-types@DataSetReference","params":{"reference":"kanban-etapasDataSet"}},"repeatReference":"et2"},"index":25,"reference":"QqJK51lJrf9NGQIpf2QPi"},{"_id":"780d36640bb5bf4165cdb91a","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LTipoVenda","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":1038,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Tipo de Venda","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":26,"reference":"82OSpMA831FxJwR8ntXve"},{"_id":"f4f02d7ef7a62a9d303c7b9c","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnTipoSprints","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":1058,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":150,"height":36}},"text":"Sprints Rápidos","textSize":12,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda"}},"==","Sprints Rápidos"],"then":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}}}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda"}},"==","Sprints Rápidos"],"then":{"component":"data2-core-types@Color","params":{"rgba":"#0284c7"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda","value":"Sprints Rápidos"}}]}}},"index":27,"reference":"kbTipoSprints"},{"_id":"ea65f072ce38e2baa8cccac5","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnTipoSuite","params":{"position":{"component":"data2-core-types@Position","params":{"x":182,"y":1058,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":168,"height":36}},"text":"Suíte Completa IA","textSize":12,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda"}},"==","Suíte Completa IA"],"then":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}}}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda"}},"==","Suíte Completa IA"],"then":{"component":"data2-core-types@Color","params":{"rgba":"#7c3aed"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda","value":"Suíte Completa IA"}}]}}},"index":28,"reference":"kbTipoSuite"},{"_id":"7dd5395c73db36f2ec61f1c4","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnTipoNone","params":{"position":{"component":"data2-core-types@Position","params":{"x":358,"y":1058,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":90,"height":36}},"text":"Nenhum","textSize":12,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda","value":""}}]}}},"index":29,"reference":"kbTipoNone"},{"_id":"eb53d43e208cee96d23a70a3","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"LLembrete","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":1116,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Lembrete","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","textTransform":"uppercase"}}},"index":30,"reference":"gwJcM32Dkit4rQ5AwKgzt"},{"_id":"8ca61411ab22f238a322b2ba","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnRemToggle","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":1136,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":224,"height":38}},"cursor":"pointer","preventUserSelection":true,"textSize":12,"text":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo"}},"==",true],"then":"🔔 Lembrete ativo","else":"Ativar lembrete"}},"textColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo"}},"==",true],"then":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}}}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"700"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo"}},"==",true],"then":{"component":"data2-core-types@Color","params":{"rgba":"#f59e0b"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo"}},"resultName":"v"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo","value":{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"v"}}}}}}]}}},"index":31,"reference":"kbRemToggle"},{"_id":"69c52ec722239d2119f23fd8","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FLembreteData","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_lembrete_data","type":"date","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":256,"y":1136,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":248,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13}},"index":32,"reference":"4QuFoCF54fjqQiQJ5u1c_"},{"_id":"1f25a1beb6f338926f6689c9","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnRem7","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":1184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":108,"height":32}},"text":"+7 dias","textSize":12,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#fef3c7"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data","value":{"component":"data2-core-functions@DateAdd","params":{"date":{"component":"data2-core-functions@DateNow","params":{}},"count":7,"period":"day"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo","value":true}}]}}},"index":33,"reference":"kbRem7"},{"_id":"b63e86fccdf309a54e7e9036","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnRem15","params":{"position":{"component":"data2-core-types@Position","params":{"x":140,"y":1184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":108,"height":32}},"text":"+15 dias","textSize":12,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#fef3c7"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data","value":{"component":"data2-core-functions@DateAdd","params":{"date":{"component":"data2-core-functions@DateNow","params":{}},"count":15,"period":"day"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo","value":true}}]}}},"index":34,"reference":"kbRem15"},{"_id":"f36a7acb87b70f941fdd89be","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnRem30","params":{"position":{"component":"data2-core-types@Position","params":{"x":256,"y":1184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":108,"height":32}},"text":"+30 dias","textSize":12,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#fef3c7"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data","value":{"component":"data2-core-functions@DateAdd","params":{"date":{"component":"data2-core-functions@DateNow","params":{}},"count":30,"period":"day"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo","value":true}}]}}},"index":35,"reference":"kbRem30"},{"_id":"50992d3470fcff96e0e3e4db","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnRemClear","params":{"position":{"component":"data2-core-types@Position","params":{"x":372,"y":1184,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":116,"height":32}},"text":"Limpar","textSize":12,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo","value":false}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_nota","value":""}}]}}},"index":36,"reference":"kbRemClear"},{"_id":"e2e6076300d400c523d3580d","parent":"38e7292c8da483d7367db7b9","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"FLembreteNota","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.f_lembrete_nota","type":"text","placeholder":"  Nota do lembrete (opcional)","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":1228,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":472,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13}},"index":37,"reference":"Vs1a_ifW4i0zcl8jgapM8"},{"_id":"c96d068ef83ae0e21a7aa37a","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnDelete","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":1296,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":120,"height":44}},"text":"Apagar","textSize":13,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"700"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#dc2626"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"hide":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.mode"}},"comparisonSubject":"new"}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"deleteRecord","args":[{"_id":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.selectedLeadId"}}}]}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"refresh","args":[]}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"paginate","args":[{"size":1000}]}},{"component":"data2-core-flow@AwaitReady","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.leads","value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"data.records"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.detailOpen","value":false}}]}}},"index":38,"reference":"kbDelete"},{"_id":"f67bc3509ec9d98db1804215","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnCancel","params":{"position":{"component":"data2-core-types@Position","params":{"x":158,"y":1296,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":130,"height":44}},"text":"Cancelar","textSize":13,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.detailOpen","value":false}}]}}},"index":39,"reference":"kbCancel"},{"_id":"8551ce587e193c455b2a7753","parent":"38e7292c8da483d7367db7b9","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"BtnSave","params":{"position":{"component":"data2-core-types@Position","params":{"x":300,"y":1296,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":196,"height":44}},"text":"Guardar","textSize":13,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"700"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#16a34a"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.selectedLeadId"}},"comparisonSubject":""}},"then":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"saveRecord","args":[{"empresa":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_empresa"}},"nome":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_nome"}},"cargo":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_cargo"}},"linkedin":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_linkedin"}},"email":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_email"}},"tipo_ligacao":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_ligacao"}},"via_quem":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_via_quem"}},"forca":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_forca"}},"status_outreach":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_status_outreach"}},"notas":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_notas"}},"etapa":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_etapa"}},"tipo_venda":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda"}},"lembrete_data":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data"}},"lembrete_ativo":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo"}},"lembrete_nota":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_nota"}},"origem":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_origem"}}}]}},"resultName":"saved"}}]}},"else":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"saveRecord","args":[{"_id":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.selectedLeadId"}},"empresa":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_empresa"}},"nome":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_nome"}},"cargo":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_cargo"}},"linkedin":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_linkedin"}},"email":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_email"}},"tipo_ligacao":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_ligacao"}},"via_quem":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_via_quem"}},"forca":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_forca"}},"status_outreach":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_status_outreach"}},"notas":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_notas"}},"etapa":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_etapa"}},"tipo_venda":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda"}},"lembrete_data":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data"}},"lembrete_ativo":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo"}},"lembrete_nota":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_nota"}},"origem":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_origem"}}}]}},"resultName":"upd"}}]}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"refresh","args":[]}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"paginate","args":[{"size":1000}]}},{"component":"data2-core-flow@AwaitReady","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.leads","value":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-leadsDataSet"}},"prop":"data.records"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.detailOpen","value":false}}]}}},"index":40,"reference":"kbSave"},{"_id":"9e028d26db5a852eaa87207d","parent":"d4edfd431567df72d6792a5e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GTitle","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":22,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":28}},"text":"Gerir Etapas do Kanban","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":18,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","verticalAlignment":"middle"}}},"index":0,"reference":"XkT8vlWj1Aanz_B3bI2Lu"},{"_id":"2503f5b17e1589a507372c05","parent":"d4edfd431567df72d6792a5e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GClose","params":{"position":{"component":"data2-core-types@Position","params":{"x":566,"y":20,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":30,"height":30}},"text":"✕","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}},"textSize":15,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f1f5f9"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.gerirOpen","value":false}}]}}},"index":1,"reference":"kbGerirClose"},{"_id":"8b6a7db7cc2362b984915a82","parent":"d4edfd431567df72d6792a5e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GFormCard","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":66,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":572,"height":210}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":12,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}},"index":2,"reference":"k7_9-fsEU1jrnFEi0qmeI"},{"_id":"6ca55840a7950d17157150f9","parent":"d4edfd431567df72d6792a5e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GListLabel","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":292,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"ETAPAS ATUAIS","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":3,"reference":"-YAg5fIRoNYi1f39g1RPg"},{"_id":"b6729b77004cddd4509af68a","parent":"d4edfd431567df72d6792a5e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GList","params":{"position":{"component":"data2-core-types@Position","params":{"x":24,"y":312,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":572,"height":620}},"childrenMode":"rows","repeat":{"component":"data2-core-types@DataSetReference","params":{"reference":"kanban-etapasDataSet"}},"repeatReference":"et3"},"index":4,"reference":"Qvc5QL6dyWJniS0j5WxU9"},{"_id":"23100104d10502f7d0a58ad2","parent":"a6dddeadadb574f8d587a35d","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"ColHeader","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":46}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":{"component":"data2-core-types@Reference","params":{"reference":"etapaRepeater.cor"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":10}}},"index":0,"reference":"6WT2tDDhHQzLq80kaIqMt"},{"_id":"5f5708a5266e914f53436903","parent":"a6dddeadadb574f8d587a35d","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"CardsList","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":52,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":752}},"childrenMode":"rows","scroll":{"component":"data2-core-types@Scroll","params":{"y":true}},"repeat":{"component":"data2-core-functions@ArrayFilter","params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.leads"}},"filter":{"component":"data2-core-functions@Function","params":{"parameters":["lead"],"body":{"component":"data2-core-logical-operators@And","params":{"components":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"lead.etapa"}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":"etapaRepeater.nome"}}}},{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterOrigem"}},"comparisonSubject":""}},{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"lead.origem"}},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterOrigem"}}}}]}},{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterTipoVenda"}},"comparisonSubject":""}},{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"lead.tipo_venda"}},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.filterTipoVenda"}}}}]}},{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.search"}},"comparisonSubject":""}},{"component":"data2-core-functions@Includes","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"lead.empresa"}},"pattern":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.search"}}}},{"component":"data2-core-functions@Includes","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"lead.nome"}},"pattern":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.search"}}}}]}}]}}}}}},"repeatReference":"lead"},"index":1,"reference":"_BZh2mQjt_27Djqs_LHmL"},{"_id":"0debb3c7bbf337bcb86ead66","parent":"443a25613a46d6c15a4cccda","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"StageChipWrap","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":157,"height":38}}},"index":0,"reference":"Dn54l6B7ypidGMTmDNIOl"},{"_id":"0aed98b8edb7aaae4d171607","parent":"8b6a7db7cc2362b984915a82","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GLNome","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":14,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Nome da etapa","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":0,"reference":"3nv8zuF7CxJ5AAv5cNDnJ"},{"_id":"e6f4888530181ccae6e5cab7","parent":"8b6a7db7cc2362b984915a82","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"GFNome","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.et_nome","type":"text","placeholder":"  Nome da etapa","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":360,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13}},"index":1,"reference":"Lw91RLvABYALa2Avd8QsU"},{"_id":"64ab3d053d98d8c8bba4f87d","parent":"8b6a7db7cc2362b984915a82","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GLCor","params":{"position":{"component":"data2-core-types@Position","params":{"x":392,"y":14,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":12}},"text":"Cor (hex)","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#64748b"}},"textSize":10,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":2,"reference":"eC52v9uE4e0uJzrwMY7l5"},{"_id":"224faed54f93b2aaed24ef45","parent":"8b6a7db7cc2362b984915a82","component":"data2-blocks@DataFieldBlock","system":"69fe34b018c813c5be7bddd9","displayName":"GFCor","params":{"dataset":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"field":"data.et_cor","type":"text","placeholder":"#6366f1","padding":{"left":10,"right":10},"super":{"position":{"component":"data2-core-types@Position","params":{"x":392,"y":32,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":164,"height":38}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#cbd5e1"}}}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13}},"index":3,"reference":"xCbY9ZSb19lmTMYE8_fyH"},{"_id":"7319fb6f7ce28a79f0223f44","parent":"8b6a7db7cc2362b984915a82","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GPreviewCor","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":82,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":556,"height":26}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_cor"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}}},"index":4,"reference":"DfHAvQEXcw2sjCQ2SL_7A"},{"_id":"388fb95a200786cb227fed9e","parent":"8b6a7db7cc2362b984915a82","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GBtnSave","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":120,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":200,"height":40}},"text":"Guardar Etapa","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textSize":13,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"700"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#4f46e5"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@If","params":{"compare":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_id"}},"comparisonSubject":""}},"then":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"prop":"saveRecord","args":[{"nome":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_nome"}},"cor":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_cor"}},"ordem":90,"ativa":true}]}},"resultName":"novo"}}]}},"else":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-flow@Step","params":{"action":{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"prop":"saveRecord","args":[{"_id":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_id"}},"nome":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_nome"}},"cor":{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_cor"}}}]}},"resultName":"ed"}}]}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"prop":"refresh","args":[]}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_id","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_nome","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_cor","value":"#6366f1"}}]}}},"index":5,"reference":"kbEtSave"},{"_id":"35263cc5342df230ed356f24","parent":"8b6a7db7cc2362b984915a82","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GBtnClear","params":{"position":{"component":"data2-core-types@Position","params":{"x":228,"y":120,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":150,"height":40}},"text":"Nova / Limpar","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}},"textSize":13,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_id","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_nome","value":""}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_cor","value":"#6366f1"}}]}}},"index":6,"reference":"kbEtClear"},{"_id":"5e3be5ef4c0dcfb1274c6b3d","parent":"8b6a7db7cc2362b984915a82","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GHint","params":{"position":{"component":"data2-core-types@Position","params":{"x":16,"y":172,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":556,"height":14}},"text":"Renomear uma etapa não move cards já colocados na etapa antiga.","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#94a3b8"}},"textSize":10},"index":7,"reference":"9OgwX5sdeBB8Om0BugSCS"},{"_id":"10dc1fc7eea76b7ef37ad654","parent":"b6729b77004cddd4509af68a","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GRowWrap","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":572,"height":46}}},"index":0,"reference":"iFwtvFTyKP1ljnpnlxVmB"},{"_id":"b1d76bb33d4c05c807e080fd","parent":"23100104d10502f7d0a58ad2","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"ColName","params":{"position":{"component":"data2-core-types@Position","params":{"x":14,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":46}},"text":{"component":"data2-core-types@Reference","params":{"reference":"etapaRepeater.nome"}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textSize":13,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","verticalAlignment":"middle"}}},"index":0,"reference":"2YDp-G4zUwwCCbMXcLyOC"},{"_id":"46fcae42f5e8fe42d7637a71","parent":"5f5708a5266e914f53436903","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"CardWrap","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":284,"height":134}}},"index":0,"reference":"mp4ppX52i58f6ME84X5Ze"},{"_id":"76937acf3486086aae6ddbce","parent":"0debb3c7bbf337bcb86ead66","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"StageChip","params":{"position":{"component":"data2-core-types@Position","params":{"x":4,"y":4,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":149,"height":30}},"text":{"component":"data2-core-types@Reference","params":{"reference":"et2Repeater.nome"}},"textSize":10,"cursor":"pointer","preventUserSelection":true,"textColor":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_etapa"}},"==",{"component":"data2-core-types@Reference","params":{"reference":"et2Repeater.nome"}}],"then":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}}}},"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_etapa"}},"==",{"component":"data2-core-types@Reference","params":{"reference":"et2Repeater.nome"}}],"then":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#eef2f6"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_etapa","value":{"component":"data2-core-types@Reference","params":{"reference":"et2Repeater.nome"}}}}]}}},"index":0,"reference":"kbStageChip"},{"_id":"a3238947454175952cb48f9e","parent":"10dc1fc7eea76b7ef37ad654","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GRow","params":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":572,"height":40}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f8fafc"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":8,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}},"index":0,"reference":"-jQFpwySjgKqwxavdyd4u"},{"_id":"f6e800f0a196364500f2048f","parent":"46fcae42f5e8fe42d7637a71","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"Card","params":{"position":{"component":"data2-core-types@Position","params":{"x":8,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":268,"height":120}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":10,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}},"cursor":"pointer","shadow":{"component":"data2-core-types@Shadow","params":{"x":0,"y":1,"blur":3,"color":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a14"}}}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.selectedLeadId","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater._id"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.mode","value":"edit"}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_empresa","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.empresa"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_nome","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.nome"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_cargo","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.cargo"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_linkedin","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.linkedin"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_email","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.email"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_ligacao","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.tipo_ligacao"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_via_quem","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.via_quem"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_forca","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.forca"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_status_outreach","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.status_outreach"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_notas","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.notas"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_etapa","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.etapa"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_tipo_venda","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.tipo_venda"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_data","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.lembrete_data"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_ativo","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.lembrete_ativo"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_lembrete_nota","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.lembrete_nota"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.f_origem","value":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.origem"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.detailOpen","value":true}}]}}},"index":0,"reference":"kbCard"},{"_id":"65a3f1c0bcd458b9c0bc6603","parent":"a3238947454175952cb48f9e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GSwatch","params":{"position":{"component":"data2-core-types@Position","params":{"x":12,"y":8,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":24,"height":24}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":{"component":"data2-core-types@Reference","params":{"reference":"et3Repeater.cor"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}}},"index":0,"reference":"JPuyQcEXA0fn5tAi1vhIs"},{"_id":"8dedb40961243d4ab8f7be97","parent":"a3238947454175952cb48f9e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GRowNome","params":{"position":{"component":"data2-core-types@Position","params":{"x":46,"y":0,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":300,"height":40}},"text":{"component":"data2-core-types@Reference","params":{"reference":"et3Repeater.nome"}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13,"textFormat":{"component":"data2-core-types@TextFormat","params":{"verticalAlignment":"middle","fontWeight":"600"}}},"index":1,"reference":"XNf7r0srf_broBQwtj_IL"},{"_id":"5f30abc8f1dccbf67323aa3c","parent":"a3238947454175952cb48f9e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GRowEdit","params":{"position":{"component":"data2-core-types@Position","params":{"x":410,"y":5,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":74,"height":30}},"text":"Editar","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#4f46e5"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#eef2ff"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_id","value":{"component":"data2-core-types@Reference","params":{"reference":"et3Repeater._id"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_nome","value":{"component":"data2-core-types@Reference","params":{"reference":"et3Repeater.nome"}}}},{"component":"data2-core-types@Setter","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanbanStore"}},"prop":"data.et_cor","value":{"component":"data2-core-types@Reference","params":{"reference":"et3Repeater.cor"}}}}]}}},"index":2,"reference":"kbEtEdit"},{"_id":"453f864fe3a93d0a2c5ce37c","parent":"a3238947454175952cb48f9e","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"GRowDel","params":{"position":{"component":"data2-core-types@Position","params":{"x":490,"y":5,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":74,"height":30}},"text":"Apagar","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#dc2626"}},"textSize":12,"cursor":"pointer","preventUserSelection":true,"textFormat":{"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","verticalAlignment":"middle","fontWeight":"600"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#fef2f2"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":6}},"onClick":{"component":"data2-core-flow@Series","params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"prop":"deleteRecord","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":"et3Repeater._id"}}}]}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"kanban-etapasDataSet"}},"prop":"refresh","args":[]}}]}}},"index":3,"reference":"kbEtDel"},{"_id":"e94587519fdcedfcb03689f8","parent":"f6e800f0a196364500f2048f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"CardEmpresa","params":{"position":{"component":"data2-core-types@Position","params":{"x":12,"y":10,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":244,"height":18}},"text":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.empresa"}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#0f172a"}},"textSize":13,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700"}}},"index":0,"reference":"uncO0eASdCtuOqytgNe5S"},{"_id":"7f4d19d203507343e0191492","parent":"f6e800f0a196364500f2048f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"CardNome","params":{"position":{"component":"data2-core-types@Position","params":{"x":12,"y":30,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":244,"height":18}},"text":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.nome"}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#334155"}},"textSize":13},"index":1,"reference":"egiaiNVo4vTP0_lnQtjzB"},{"_id":"ca3a067419eeb050cf46ba5e","parent":"f6e800f0a196364500f2048f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"CardCargo","params":{"position":{"component":"data2-core-types@Position","params":{"x":12,"y":50,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":244,"height":30}},"text":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.cargo"}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#94a3b8"}},"textSize":11,"textFormat":{"component":"data2-core-types@TextFormat","params":{"wordWrap":"break-word"}}},"index":2,"reference":"dIe-s6uhnV9OvA_yX_Vrj"},{"_id":"241c5866bd6effb3ceaa4a8d","parent":"f6e800f0a196364500f2048f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"TagTipoVenda","params":{"position":{"component":"data2-core-types@Position","params":{"x":12,"y":90,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":96,"height":18}},"text":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.tipo_venda"}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textSize":9,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.tipo_venda"}},"==","Sprints Rápidos"],"then":{"component":"data2-core-types@Color","params":{"rgba":"#0284c7"}},"else":{"component":"data2-core-types@Color","params":{"rgba":"#7c3aed"}}}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":5}},"hide":{"component":"data2-core-comparison-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.tipo_venda"}},"comparisonSubject":""}}},"index":3,"reference":"YrWQK5wEKl3TwXoKvacbG"},{"_id":"add435dd63bc85f0438178b6","parent":"f6e800f0a196364500f2048f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"TagOrigem","params":{"position":{"component":"data2-core-types@Position","params":{"x":116,"y":90,"freeTransform":true,"left":true,"right":false,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":74,"height":18}},"text":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.origem"}},"textColor":{"component":"data2-core-types@Color","params":{"rgba":"#475569"}},"textSize":9,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"600","horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#f1f5f9"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":5,"width":1,"color":{"component":"data2-core-types@Color","params":{"rgba":"#e2e8f0"}}}}},"index":4,"reference":"FOED0g6GoT35Sh4QS3dmZ"},{"_id":"17074e2a9b331637e3fab0f5","parent":"f6e800f0a196364500f2048f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"TagLembrete","params":{"position":{"component":"data2-core-types@Position","params":{"x":182,"y":90,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":78,"height":18}},"text":"🔔 Lembrete","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#854d0e"}},"textSize":9,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#fde68a"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":5}},"hide":{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-logical-operators@And","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.lembrete_ativo"}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-comparison-operators@LesserThan","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.lembrete_data"}},"comparisonSubject":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-functions@DateNow","params":{}},"format":"YYYY-MM-DD"}}}}}}]}}}}},"index":5,"reference":"Ur3ZE0hjm5uYE-Zl9QD_s"},{"_id":"4ba8d30de71c649b426b2bd5","parent":"f6e800f0a196364500f2048f","component":"data2-core-primitives@Block","system":"69fe34b018c813c5be7bddd9","displayName":"TagExpirado","params":{"position":{"component":"data2-core-types@Position","params":{"x":182,"y":90,"freeTransform":true,"left":false,"right":true,"top":true,"bottom":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":78,"height":18}},"text":"⚠ Expirado","textColor":{"component":"data2-core-types@Color","params":{"rgba":"#ffffff"}},"textSize":9,"textFormat":{"component":"data2-core-types@TextFormat","params":{"fontWeight":"700","horizontalAlignment":"center","verticalAlignment":"middle"}},"fill":{"component":"data2-core-types@Fill","params":{"backgrounds":[{"component":"data2-core-types@Background","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"#dc2626"}}}}]}},"border":{"component":"data2-core-types@Border","params":{"radius":5}},"hide":{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-logical-operators@And","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.lembrete_ativo"}},{"component":"data2-core-comparison-operators@LesserThan","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"leadRepeater.lembrete_data"}},"comparisonSubject":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-functions@DateNow","params":{}},"format":"YYYY-MM-DD"}}}}]}}}}},"index":6,"reference":"jIeTSITYQuQQeH-NHtOHc"}]}},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"reference":"ApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a4c03a538d004bafdea5943","displayName":"Pipeline versão antiga","reference":"HwRamR_cTqhHfxaug4eRR","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"kanban-comercial"}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"1h7ki-2FJ7GFGM0eeimi_"}}},"system":"69fe34b018c813c5be7bddd9","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a4bfc66e06d0c5a80f9d60f","component":"data2-core@DataSet","system":"69fe34b018c813c5be7bddd9","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"kanban-leads"}}},"reference":"kanban-leadsDataSet"},{"_id":"6a4bff45451adf7b2e560679","component":"data2-core@Store","system":"69fe34b018c813c5be7bddd9","params":{"initialData":{"selectedLeadId":"","detailOpen":false,"mode":"edit","gerirOpen":false,"f_empresa":"","f_nome":"","f_cargo":"","f_linkedin":"","f_email":"","f_tipo_ligacao":"","f_via_quem":"","f_forca":"","f_status_outreach":"","f_notas":"","f_etapa":"","f_tipo_venda":"","f_lembrete_data":"","f_lembrete_ativo":false,"f_lembrete_nota":"","f_origem":"","filterOrigem":"","filterTipoVenda":"","search":"","nowMs":0,"et_nome":"","et_cor":"#6366f1","et_id":"","leads":[]}},"reference":"kanbanStore"},{"_id":"6a4bfc6131101787becc4116","component":"data2-core@DataSet","system":"69fe34b018c813c5be7bddd9","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"kanban-etapas"}}},"reference":"kanban-etapasDataSet"},{"_id":"6a4bfc66e06d0c5a80f9d609","component":"data2-core@Data2TableDataSource","system":"69fe34b018c813c5be7bddd9","params":{"table":"kanban-leads","schema":[{"component":"data2-core-types@Field","params":{"key":"empresa","title":"Empresa","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"nome","title":"Nome Completo","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"cargo","title":"Cargo","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"linkedin","title":"LinkedIn URL","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"email","title":"Email","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"tipo_ligacao","title":"Tipo de Ligação","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"via_quem","title":"Via Quem","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"forca","title":"Força","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"notas","title":"Notas","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"etapa","title":"Etapa","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"tipo_venda","title":"Tipo de Venda","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"lembrete_data","title":"Data do Lembrete","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"lembrete_ativo","title":"Lembrete Ativo","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"key":"lembrete_nota","title":"Nota do Lembrete","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"origem","title":"Origem","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"telefone","title":"Telefone","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"data_conexao","title":"Data de Conexão","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"interesses","title":"Interesses Notáveis","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"lead_quente","title":"Lead Quente","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"key":"lead_engajado","title":"Lead Engajado","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"key":"etapa_desde","title":"Etapa Desde","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"historico","title":"Histórico de Etapas","component":"data2-core-primitives@Array"}},{"component":"data2-core-types@Field","params":{"key":"movimentacoes","title":"Movimentações","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"key":"fechado_em","title":"Fechado Em","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"pais_sede","title":"País da Sede","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"cidade_sede","title":"Cidade da Sede","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"filiais_europa","title":"Filiais na Europa","component":"data2-core-primitives@Array"}},{"component":"data2-core-types@Field","params":{"key":"pais_lead","title":"País do Lead","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"cidade_lead","title":"Cidade do Lead","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"abordagem","title":"Abordagem","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"verificado_em","title":"Verificado no LinkedIn Em","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"arquivado","title":"Arquivado","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"key":"arquivado_em","title":"Arquivado Em","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"cargo_confirmado","title":"Cargo Confirmado na Experiência","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"key":"status_empresa","title":"Status na Empresa","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"cargo_inicio","title":"Início no Cargo Atual","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"key":"mercado","title":"Registro / Mercado","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"dominio","title":"Domínio da Empresa (logo)","component":"data2-core-primitives@String"}}]},"reference":"kanban-leads"},{"_id":"6a4bfc61451adf7b2e55f139","component":"data2-core@Data2TableDataSource","system":"69fe34b018c813c5be7bddd9","params":{"table":"kanban-etapas","schema":[{"component":"data2-core-types@Field","params":{"key":"nome","title":"Nome da Etapa","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"ordem","title":"Ordem","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"key":"cor","title":"Cor","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"ativa","title":"Ativa","component":"data2-core-primitives@Boolean"}}]},"reference":"kanban-etapas"}]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}