{"context":{"domain":"tempo"},"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":"6a45d210b5865956b508ba84","name":"Tempo","domain":"tempo","visibility":"public","settings":{"defaultAccessPolicy":"public"},"updatedAt":"2026-07-27T14:19:36.810Z","createdAt":"2026-07-02T02:50:56.722Z"}]}},{"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":"6a45da51b0a857d0aa5c421c","component":"data2-core-types@Component","system":"6a45d210b5865956b508ba84","params":{"extends":"data2-core-primitives@Block","component":"deck-editor","package":"tempo","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 TYPES = [\n  ['cover','Capa'],['statement','Statement'],['section','Divisoria'],['text','Texto'],\n  ['split','Split (imagem+texto)'],['trio','Trio (3 cards)'],['gallery','Galeria'],\n  ['data','Dados (numeros)'],['bigstat','Numero gigante'],['chart','Grafico'],['amenities','Infraestrutura'],\n  ['quote','Citacao'],['list','Lista numerada'],['image','Imagem'],['contact','Contato'],['closing','Encerramento']\n];\nconst FIELDS = {\n  cover:[['kicker','text'],['title','text'],['subtitle','textarea'],['image','image'],['logo','bool']],\n  statement:[['kicker','text'],['title','text'],['sub','textarea'],['image','image']],\n  section:[['number','text'],['kicker','text'],['title','text'],['image','image']],\n  text:[['kicker','text'],['title','text'],['image','image'],['body','strings']],\n  split:[['kicker','text'],['title','text'],['side','text'],['image','image'],['body','strings']],\n  trio:[['kicker','text'],['title','text'],['cards','objs',[['image','image'],['title','text'],['text','textarea']]]],\n  gallery:[['kicker','text'],['title','text'],['items','objs',[['image','image']]]],\n  data:[['number','text'],['kicker','text'],['title','text'],['stats','objs',[['big','text'],['label','text'],['sub','text']]],['note','textarea'],['image','image']],\n  bigstat:[['kicker','text'],['big','text'],['label','text'],['sub','text'],['image','image']],\n  chart:[['number','text'],['kicker','text'],['title','text'],['chartType','text'],['prefix','text'],['suffix','text'],['compact','bool'],['xlabel','text'],['ylabel','text'],['data','objs',[['label','text'],['value','text'],['x','text'],['y','text'],['r','text']]],['note','textarea']],\n  amenities:[['number','text'],['kicker','text'],['title','text'],['items','objs',[['title','text'],['desc','textarea']]]],\n  quote:[['text','textarea'],['author','text'],['image','image']],\n  list:[['kicker','text'],['title','text'],['items','objs',[['lead','text'],['desc','textarea']]]],\n  image:[['image','image'],['caption','text']],\n  contact:[['title','text'],['address','text'],['hours','text'],['email','text'],['site','text'],['image','image']],\n  closing:[['title','text'],['subtitle','text'],['image','image'],['logo','bool']]\n};\nconst LBL = {title:'Titulo',subtitle:'Subtitulo',sub:'Texto de apoio',image:'Imagem',logo:'Mostrar logo',body:'Paragrafos (linha em branco separa)',cards:'Cards',kpis:'KPIs',stats:'Numeros',note:'Nota',items:'Itens',lead:'Destaque',desc:'Descricao',caption:'Legenda',text:'Texto',big:'Numero',label:'Rotulo',kicker:'Etiqueta (kicker)',number:'No da secao',side:'Lado da imagem (right/left)',author:'Autor',address:'Endereco',hours:'Horario',email:'Contato/e-mail',site:'Site',chartType:'Tipo: bar / hbar / line',prefix:'Prefixo (ex: R$ )',suffix:'Sufixo (ex: %)',compact:'Abreviar milhares (12,3k)',value:'Valor',data:'Series (rotulo + valor)',x:'X (scatter)',y:'Y (scatter)',r:'Tamanho bolha (scatter)',xlabel:'Rotulo eixo X',ylabel:'Rotulo eixo Y'};\nconst TEMPLATES = {\n  cover:{type:'cover',logo:true,kicker:'Etiqueta',title:'TITULO',subtitle:'subtitulo',image:''},\n  statement:{type:'statement',title:'FRASE DE IMPACTO',sub:'texto de apoio',image:''},\n  section:{type:'section',number:'01',kicker:'Secao',title:'SECAO',image:''},\n  text:{type:'text',kicker:'',title:'TITULO',image:'',body:['Paragrafo um.','Paragrafo dois.']},\n  split:{type:'split',kicker:'',side:'right',title:'TITULO',image:'',body:['Paragrafo um.','Paragrafo dois.']},\n  trio:{type:'trio',title:'TITULO',cards:[{image:'',title:'CARD 1',text:'texto'},{image:'',title:'CARD 2',text:'texto'},{image:'',title:'CARD 3',text:'texto'}]},\n  gallery:{type:'gallery',title:'GALERIA',items:[{image:''},{image:''},{image:''},{image:''}]},\n  data:{type:'data',number:'',kicker:'',title:'TITULO',stats:[{big:'00',label:'rotulo',sub:''},{big:'00',label:'rotulo',sub:''}],note:''},\n  bigstat:{type:'bigstat',big:'200',label:'rotulo',sub:'',image:''},\n  chart:{type:'chart',title:'GRAFICO',chartType:'bar',prefix:'',suffix:'',compact:false,data:[{label:'A',value:'10'},{label:'B',value:'20'},{label:'C',value:'15'}],note:''},\n  amenities:{type:'amenities',number:'',kicker:'',title:'TITULO',items:[{title:'ITEM',desc:'descricao'},{title:'ITEM',desc:'descricao'}]},\n  quote:{type:'quote',text:'Frase de impacto.',author:'Autor',image:''},\n  list:{type:'list',title:'TITULO',items:[{lead:'Destaque',desc:'descricao'}]},\n  image:{type:'image',image:'',caption:''},\n  contact:{type:'contact',title:'CONTATO',address:'Rua ...',hours:'Ter-Dom - 12h-22h',email:'eventos@tempobyporsche.com',site:'tempobyporsche.com',image:''},\n  closing:{type:'closing',logo:true,title:'ENCERRAMENTO',subtitle:'contato'}\n};\nlet _FOOT = 'TEMPO BY PORSCHE', _N = 0;\nfunction _fmtCls(meta){ const f = String((meta && meta.format) || 'a4').toLowerCase(); return (f==='16x9'||f==='paisagem'||f==='landscape'||f==='horizontal') ? 'land' : ''; }\n\nexport default {\n  css: `\n@font-face{font-family:'Pressio';src:url('https://tempobyporsche.com/wp-content/uploads/2026/02/pressio-no44.woff2') format('woff2');font-weight:400 900;font-display:swap}\n@font-face{font-family:'Raleway';src:url('https://tempobyporsche.com/wp-content/uploads/2026/02/Raleway-VariableFont_wght.ttf') format('truetype');font-weight:200 800;font-display:swap}\n:host,.root{--gold:#FFB81C;--paper:#0a0a0a;--line:#2b2b2b;--muted:#8a8a8a;--body:#cfcfcf}\n*{box-sizing:border-box}\n.root{position:absolute;inset:0;background:#0f0f0f;font-family:Raleway,system-ui,sans-serif;color:#eee;overflow:hidden}\n\n/* GATE */\n.gate{position:absolute;inset:0;z-index:1000;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#0a0a0a;gap:22px}\n.gate .logo{height:120px;width:auto;opacity:.95}\n.gate .brand{font-weight:800;letter-spacing:5px;color:var(--gold);font-size:16px;text-transform:uppercase}\n.gate .sub{color:#888;font-size:13px;letter-spacing:2px;text-transform:uppercase}\n.gate input{background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:9px;padding:13px 16px;font-size:15px;font-family:Raleway;width:280px;text-align:center;letter-spacing:2px}\n.gate input:focus{outline:none;border-color:var(--gold)}\n.gate button{background:var(--gold);color:#000;border:none;border-radius:9px;padding:12px 30px;font-size:14px;font-weight:700;cursor:pointer;font-family:Raleway;letter-spacing:1px}\n.gate .err{color:#ff6b6b;font-size:12px;height:14px}\n\n/* TOP BAR */\n.top{height:56px;display:flex;align-items:center;gap:12px;padding:0 18px;background:#0b0b0b;border-bottom:1px solid #262626;flex-shrink:0}\n.top .brand{font-weight:800;letter-spacing:2px;color:var(--gold);font-size:14px;white-space:nowrap}\n.top input.tt{background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:7px;padding:7px 10px;font-size:13px;font-family:Raleway}\n.top .sp{flex:1}\nselect,.btn{background:#161616;border:1px solid #2a2a2a;color:#eee;border-radius:7px;padding:8px 12px;font-size:13px;cursor:pointer;font-family:Raleway}\nselect:focus,input:focus{outline:none}\n.btn.gold{background:var(--gold);color:#000;border-color:var(--gold);font-weight:700}\n.btn.g{background:transparent;color:var(--gold);border-color:#444}\n.dirty{color:#FF9F1C;font-size:12px;white-space:nowrap}\n\n/* LAYOUT */\n.wrap{display:grid;grid-template-columns:250px 1fr 400px;position:absolute;top:56px;left:0;right:0;bottom:0}\n.side{border-right:1px solid #222;overflow:auto;padding:12px}\n.side h3{font-size:11px;letter-spacing:1px;color:#888;text-transform:uppercase;margin:6px 4px}\n.sl{background:#151515;border:1px solid #242424;border-radius:9px;padding:9px 11px;margin-bottom:8px;cursor:pointer}\n.sl.sel{border-color:var(--gold);background:#1b1706}\n.sl .ty{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--gold)}\n.sl .tt{font-size:13px;color:#eee;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.sl .row{display:flex;gap:4px;margin-top:7px}\n.sl .row button{flex:1;background:#0f0f0f;border:1px solid #2a2a2a;color:#aaa;border-radius:5px;padding:3px;font-size:11px;cursor:pointer}\n.addbar{display:flex;gap:6px;margin-top:10px}.addbar select{flex:1}\n.form{overflow:auto;padding:20px 24px}\n.form h2{font-size:14px;color:var(--gold);text-transform:uppercase;letter-spacing:1px;margin:0 0 16px}\n.f{margin-bottom:14px}.f label{display:block;font-size:11px;color:#999;text-transform:uppercase;letter-spacing:.5px;margin-bottom:5px}\n.f input[type=text],.f textarea{width:100%;background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:8px;padding:9px 11px;font-size:14px;font-family:Raleway}\n.f textarea{min-height:70px;resize:vertical;line-height:1.5}\n.imgf{display:flex;gap:8px;align-items:center}.imgf input{flex:1}.imgf img{width:44px;height:44px;object-fit:cover;border-radius:6px;background:#222}\n.objs{border:1px solid #242424;border-radius:10px;padding:12px;background:#121212}\n.obj{border-bottom:1px solid #222;padding:8px 0;margin-bottom:8px}.obj:last-child{border-bottom:0}\n.obj .oh{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.obj .oh b{font-size:12px;color:#bbb}\n.mini{background:#0f0f0f;border:1px solid #2a2a2a;color:#f88;border-radius:5px;padding:2px 8px;font-size:11px;cursor:pointer}\n.addmini{background:#1a1a1a;border:1px dashed #3a3a3a;color:var(--gold);border-radius:7px;padding:7px;width:100%;cursor:pointer;font-size:12px;margin-top:6px}\n.prev{border-left:1px solid #222;background:#161616;overflow:auto;padding:18px;display:flex;flex-direction:column;align-items:center}\n.prevbox{width:794px;transform:scale(.44);transform-origin:top center;margin-bottom:-620px}\n.hint{color:#666;font-size:12px;margin-top:8px}\n\n/* GALLERY MODAL */\n.galm{position:absolute;inset:0;background:#000d;z-index:50;display:none;padding:36px}.galm.on{display:block}\n.galbox{max-width:1150px;margin:0 auto;background:#111;border:1px solid #2a2a2a;border-radius:12px;padding:16px;height:100%;display:flex;flex-direction:column}\n.galh{display:flex;justify-content:space-between;align-items:center;color:#ccc;margin-bottom:12px;font-size:13px}\n.galh button{background:#161616;border:1px solid #333;color:#aaa;border-radius:6px;padding:6px 12px;cursor:pointer}\n.gg{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;overflow:auto}\n.gg img{width:100%;height:120px;object-fit:cover;border-radius:6px;cursor:pointer;border:2px solid transparent;background:#222}\n.gg img:hover{border-color:var(--gold)}\n\n/* SLIDE (deck.css, verbatim identity) */\n.slide{position:relative;width:794px;height:1123px;background:var(--paper);overflow:hidden;color:#fff;font-family:Raleway,system-ui,sans-serif;font-weight:300}\n.slide .bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\n.slide .scrim{position:absolute;inset:0;background:linear-gradient(180deg,rgba(10,10,10,.82),rgba(10,10,10,.35) 45%,rgba(10,10,10,.92))}\n.slide .grain{display:none}\n.slide .pad{position:absolute;inset:0;padding:80px 76px;display:flex;flex-direction:column}\n.slide .logo{height:70px;width:auto}\n.slide h2.title{font-family:Pressio;font-weight:400;color:#fff;text-transform:uppercase;letter-spacing:.5px;line-height:.94;margin:0}\n.slide .gold{color:var(--gold)}\n.kick{font-family:Raleway;font-weight:600;letter-spacing:6px;text-transform:uppercase;color:var(--gold);font-size:12px;display:flex;align-items:center;gap:14px}\n.kick .num{font-family:Pressio;font-size:15px;color:#fff;opacity:.5}\n.kick .ln{flex:1;height:1px;background:var(--line);max-width:90px}\n.slide .body p{font-size:16px;line-height:1.75;color:var(--body);margin:0 0 15px;font-weight:300;max-width:600px}\n.slide .foot{position:absolute;bottom:34px;left:76px;right:76px;display:flex;justify-content:space-between;align-items:center;font-family:Raleway;letter-spacing:3px;font-size:9.5px;color:#7a7a7a;text-transform:uppercase;border-top:1px solid var(--line);padding-top:14px}\n.slide .foot .fl{display:flex;align-items:center;gap:10px}.slide .foot .fl img{height:15px;opacity:.7}\n.slide .ph{position:absolute;inset:0;background:repeating-linear-gradient(45deg,#121212,#121212 14px,#161616 14px,#161616 28px);display:flex;align-items:center;justify-content:center;color:#4a4a4a;font-size:12px;font-family:Raleway;letter-spacing:2px}\n.slide.cover .pad{justify-content:space-between}\n.slide.cover .top{display:flex;justify-content:space-between;align-items:flex-start}\n.slide.cover .ttl{margin-top:auto}\n.slide.cover h2.title{font-size:82px;margin-top:14px}\n.slide.cover .rule{width:64px;height:2px;background:var(--gold);margin:26px 0 18px}\n.slide.cover .sub{font-size:17px;color:#e6e6e6;font-weight:300;max-width:520px;line-height:1.6}\n.slide.statement .pad{align-items:flex-start;justify-content:center}\n.slide.statement h2.title{font-size:62px;max-width:660px;line-height:.98}\n.slide.statement .sub{font-size:18px;color:#eaeaea;margin-top:30px;font-weight:300;max-width:520px;line-height:1.7}\n.slide.section .pad{justify-content:center}\n.slide.section .ghost{position:absolute;right:60px;bottom:40px;font-family:Pressio;font-size:300px;line-height:.7;color:#ffffff0d}\n.slide.section h2.title{font-size:64px;max-width:600px}\n.slide.text h2.title{font-size:50px;margin:14px 0 26px;max-width:600px}\n.slide.text .body{columns:2;column-gap:40px}\n.slide.text .top-img{width:100%;height:300px;object-fit:cover;margin-bottom:30px}\n.slide.split{display:flex;align-items:stretch}\n.slide.split.rev{flex-direction:row-reverse}\n.slide.split .half.txt{flex:0 0 52%;min-width:0;display:flex;flex-direction:column;justify-content:center;padding:80px 60px 80px 76px}\n.slide.split .half.img{flex:0 0 48%;position:relative;overflow:hidden}\n.slide.split .half.img img,.slide.split .half.img .ph{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\n.slide.split h2.title{font-size:40px;margin:14px 0 22px}\n.slide.split .body,.slide.split .body p{max-width:none}\n.slide.split .foot{display:none}\n.slide.trio h2.title{font-size:38px;margin:12px 0 34px}\n.slide .cols{display:grid;grid-template-columns:1fr 1fr 1fr;gap:26px}\n.slide .col img,.slide .col .ph{width:100%;height:250px;object-fit:cover}\n.slide .col h3{font-family:Pressio;font-weight:400;color:var(--gold);text-transform:uppercase;font-size:18px;margin:18px 0 10px;letter-spacing:.5px;line-height:1.05}\n.slide .col p{font-size:12.5px;line-height:1.6;color:#c9c9c9;font-weight:300}\n.slide.gallery h2.title{font-size:36px;margin:12px 0 24px}\n.slide .grid2{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:14px;flex:1}\n.slide .grid2 img,.slide .grid2 .ph{width:100%;height:100%;object-fit:cover;min-height:200px}\n.slide.data h2.title{font-size:46px;margin:14px 0 40px}\n.slide .stats{display:grid;grid-template-columns:1fr 1fr}\n.slide .stat{padding:26px 24px 26px 0;border-top:1px solid var(--line)}\n.slide .stat .big{font-family:Pressio;font-weight:400;color:var(--gold);font-size:58px;line-height:.85}\n.slide .stat .lab{font-size:14px;color:#eee;margin-top:12px;font-weight:400;letter-spacing:.3px}\n.slide .stat .ksub{font-size:12px;color:var(--muted);margin-top:4px}\n.slide .note{margin-top:38px;font-size:15px;line-height:1.7;color:#dcdcdc;font-weight:300;max-width:600px}\n.slide.data .planta{display:block;width:100%;max-height:360px;object-fit:contain;object-position:center;margin:30px auto 0;padding-top:26px;border-top:1px solid var(--line);background:transparent}\n.slide.data .planta.ph{height:300px;background:repeating-linear-gradient(45deg,#121212,#121212 14px,#161616 14px,#161616 28px)}\n.slide.bigstat .pad{align-items:flex-start;justify-content:center}\n.slide.bigstat .big{font-family:Pressio;color:var(--gold);font-size:220px;line-height:.8}\n.slide.bigstat .lab{font-size:24px;color:#fff;margin-top:16px;font-weight:300;letter-spacing:.5px}\n.slide.bigstat .ksub{font-size:15px;color:var(--muted);margin-top:8px}\n.slide.amenities h2.title{font-size:42px;margin:12px 0 30px}\n.slide .amg{display:grid;grid-template-columns:1fr 1fr;gap:2px;background:var(--line)}\n.slide .am{background:var(--paper);padding:24px 22px}\n.slide .am h4{font-family:Pressio;font-weight:400;color:var(--gold);text-transform:uppercase;font-size:17px;margin:0 0 8px;letter-spacing:.5px}\n.slide .am p{font-size:12.5px;line-height:1.6;color:#c4c4c4;font-weight:300;margin:0}\n.slide.quote .pad{justify-content:center}\n.slide.quote .q{font-family:Pressio;font-weight:400;color:#fff;text-transform:uppercase;font-size:46px;line-height:1.05;max-width:640px}\n.slide.quote .q:before{content:'“';color:var(--gold);display:block;font-size:90px;line-height:.4;margin-bottom:20px}\n.slide.quote .au{margin-top:34px;font-size:13px;letter-spacing:3px;text-transform:uppercase;color:var(--muted)}\n.slide.list h2.title{font-size:44px;margin:12px 0 28px}\n.slide .li{display:grid;grid-template-columns:64px 1fr;gap:8px;padding:18px 0;border-top:1px solid var(--line)}\n.slide .li .n{font-family:Pressio;color:var(--gold);font-size:30px;line-height:1}\n.slide .li .lead{font-family:Raleway;font-weight:600;color:#fff;font-size:18px}\n.slide .li .desc{font-size:13.5px;color:#c4c4c4;font-weight:300;line-height:1.6;margin-top:4px}\n.slide.contact .pad{justify-content:center}\n.slide.contact h2.title{font-size:52px;margin-bottom:34px}\n.slide.contact .crow{display:flex;flex-direction:column;gap:20px}\n.slide.contact .ci .cl{font-size:11px;letter-spacing:3px;text-transform:uppercase;color:var(--gold);margin-bottom:5px}\n.slide.contact .ci .cv{font-size:19px;color:#eee;font-weight:300}\n.slide.closing .pad{align-items:center;justify-content:center;text-align:center;gap:32px}\n.slide.closing h2.title{font-size:58px}\n.slide.closing .sub{font-size:14px;color:var(--muted);letter-spacing:4px;font-family:Raleway;text-transform:uppercase}\n.slide.closing .logo{height:130px}\n.slide.chart h2.title{font-size:44px;margin:14px 0 20px}\n.slide .chartwrap{flex:1;display:flex;align-items:center;justify-content:center;min-height:0;width:100%}\n.slide .csvg{width:100%;height:100%;max-height:660px}\n.slide .csvg text{font-family:Raleway,system-ui,sans-serif}\n.slide .csvg .clab{font-size:23px;fill:#eaeaea;font-weight:500}\n.slide .csvg .cval{font-size:22px;fill:#FFB81C;font-weight:700}\n.slide .csvg .cax{font-size:18px;fill:#8a8a8a;font-weight:500}\n.slide .csvg .cgrid{stroke:#2b2b2b;stroke-width:1}\n.slide.chart .note{margin-top:20px}\n\n/* PAISAGEM - opt-in via meta.format = 16x9. Sem a classe .land nada muda. */\n.deck.land .slide,.pdeck.land .slide,.prevbox.land .slide{width:1123px;height:794px}\n.prevbox.land{width:1123px;transform:scale(.32);margin-bottom:-540px}\n.land .slide .pad{padding:54px 68px}\n.land .slide .foot{bottom:26px;left:68px;right:68px;padding-top:11px}\n.land .slide.cover h2.title{font-size:74px}\n.land .slide.cover .rule{margin:20px 0 14px}\n.land .slide.cover .sub{font-size:16px;max-width:620px}\n.land .slide.statement h2.title{font-size:56px;max-width:820px}\n.land .slide.statement .sub{margin-top:22px;max-width:660px}\n.land .slide.section h2.title{font-size:58px;max-width:760px}\n.land .slide.section .ghost{font-size:210px;right:50px;bottom:26px}\n.land .slide.text h2.title{font-size:42px;margin:12px 0 20px;max-width:none}\n.land .slide.text .top-img{height:200px;margin-bottom:22px}\n.land .slide.text .body{column-gap:44px}\n.land .slide.text .body p{max-width:none}\n.land .slide.split .half.txt{padding:54px 52px 54px 68px}\n.land .slide.split h2.title{font-size:38px;margin:12px 0 18px}\n.land .slide.split .body p{font-size:15px;line-height:1.65;margin-bottom:12px}\n.land .slide.trio h2.title{font-size:34px;margin:10px 0 26px}\n.land .slide.trio .cols{gap:24px}\n.land .slide .col img,.land .slide .col .ph{height:190px}\n.land .slide .col h3{font-size:17px;margin:14px 0 8px}\n.land .slide .col p{font-size:12px}\n.land .slide.gallery h2.title{font-size:32px;margin:10px 0 18px}\n.land .slide.data h2.title{font-size:40px;margin:12px 0 24px}\n.land .slide .stat{padding:18px 20px 18px 0}\n.land .slide .stat .big{font-size:46px}\n.land .slide .stat .lab{font-size:13px;margin-top:9px}\n.land .slide .note{margin-top:24px;font-size:14px;max-width:820px}\n.land .slide.data .planta{max-height:230px;margin:20px auto 0;padding-top:18px}\n.land .slide.bigstat .big{font-size:170px}\n.land .slide.bigstat .lab{font-size:21px}\n.land .slide.amenities h2.title{font-size:36px;margin:10px 0 22px}\n.land .slide .amg{grid-template-columns:1fr 1fr 1fr}\n.land .slide .am{padding:18px 18px}\n.land .slide .am h4{font-size:15px}\n.land .slide .am p{font-size:11.5px}\n.land .slide.quote .q{font-size:42px;max-width:860px}\n.land .slide.list h2.title{font-size:38px;margin:10px 0 18px}\n.land .slide .li{padding:12px 0;grid-template-columns:56px 1fr}\n.land .slide .li .n{font-size:26px}\n.land .slide .li .lead{font-size:16px}\n.land .slide .li .desc{font-size:12.5px;margin-top:3px}\n.land .slide.contact h2.title{font-size:44px;margin-bottom:26px}\n.land .slide.contact .crow{display:grid;grid-template-columns:1fr 1fr;gap:20px 40px}\n.land .slide.contact .ci .cv{font-size:17px}\n.land .slide.closing h2.title{font-size:52px}\n.land .slide.closing .logo{height:104px}\n.land .slide.closing .pad{gap:24px}\n.land .slide.chart h2.title{font-size:38px;margin:12px 0 14px}\n.land .slide .csvg{max-height:430px}\n\n/* VIEWER (presentation + print) */\n.viewer{position:absolute;inset:0;background:#161616;overflow:auto;padding:40px 0}\n.viewbar{position:fixed;top:14px;right:18px;z-index:60;display:flex;gap:8px}\n.viewer .deck{display:flex;flex-direction:column;align-items:center;gap:26px}\n.viewer .slide{box-shadow:0 10px 40px #0008}\n@media print{\n  .root.viewing>.top,.root.viewing>.wrap{display:none!important}\n  .viewbar{display:none}\n  .viewer{padding:0;background:#fff;position:static;overflow:visible}\n  .viewer .deck{gap:0}\n  .slide{box-shadow:none;page-break-after:always;break-after:page}\n  @page{size:A4;margin:0}\n}\n`,\n\n  render(d2) {\n    const S = d2.state;\n    if (S.screen === undefined) {\n      let persisted = null;\n      try { persisted = sessionStorage.getItem('deckScreen'); } catch(e){}\n      let authed = false;\n      try { var _a = JSON.parse(localStorage.getItem('tempoAuth')||'null'); authed = !!(_a && _a.user && (Date.now()-(_a.ts||0) < 2592000000) && ((_a.user.role==='admin')||(_a.user.apps && _a.user.apps.indexOf('deck')>=0))); if (authed) S.user = _a.user; } catch(e){}\n      S.screen = (persisted === 'editor' || persisted === 'viewer') ? persisted : 'editor';\n    }\n    try { d2.log('RENDER screen=', S.screen); } catch(e){}\n    const LOGO = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\n\n    const GATE_OVERLAY = (S.screen === 'gate') ? `<div class=\"gate\" id=\"gateOverlay\">\n        <img class=\"logo\" src=\"${LOGO}\">\n        <div class=\"brand\">Tempo &middot; Editor de Deck</div>\n        <div class=\"sub\">Acesso restrito</div>\n        <input id=\"eml\" type=\"email\" placeholder=\"e-mail\" autocomplete=\"username\" value=\"${(S.email||'').replace(/\"/g,'&quot;')}\" style=\"margin-bottom:10px\">\n        <input id=\"pw\" type=\"password\" placeholder=\"senha\" autocomplete=\"off\" value=\"${(S.pw||'').replace(/\"/g,'&quot;')}\">\n        <button id=\"unlock\">Entrar</button>\n        <div class=\"err\">${S.gateErr||''}</div>\n      </div>` : '';\n\n    if (S.screen === 'viewer') {\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGO)).join('');\n      return `<div class=\"root\" data-key=\"screen-viewer\"><div class=\"viewer\">\n        <div class=\"viewbar\">\n          <button class=\"btn g\" id=\"backEdit\">&larr; Editor</button>\n          <button class=\"btn gold\" id=\"doPrint\">Imprimir / PDF</button>\n        </div>\n        <div class=\"deck ${_fmtCls(deck.meta)}\">${html}</div>\n      </div></div>`;\n    }\n\n    // EDITOR\n    const deck = S.deck || {meta:{footer:'TEMPO BY PORSCHE'},slides:[]};\n    if (!Array.isArray(deck.slides)) deck.slides = [];\n    let sel = (S.sel==null)?-1:S.sel;\n    if (sel >= deck.slides.length) sel = deck.slides.length ? 0 : -1;\n    const decks = S.decks || [];\n    const listHtml = (deck.slides||[]).map((s,i)=>`\n      <div class=\"sl ${i===sel?'sel':''}\" data-slide=\"${i}\">\n        <div class=\"ty\">${esc(s.type)}</div><div class=\"tt\">${esc(s.title||s.subtitle||'(sem titulo)')}</div>\n        <div class=\"row\">\n          <button data-move=\"${i}\" data-dir=\"-1\">&uarr;</button>\n          <button data-move=\"${i}\" data-dir=\"1\">&darr;</button>\n          <button data-dup=\"${i}\">&#10697;</button>\n          <button data-del=\"${i}\">&#10005;</button>\n        </div>\n      </div>`).join('') || '<p class=\"hint\">sem slides</p>';\n\n    const options = TYPES.map(([v,l])=>`<option value=\"${v}\">${l}</option>`).join('');\n    let previewHtml = '';\n    try { previewHtml = (sel>=0 && deck.slides[sel]) ? (DeckRenderFoot(deck.meta&&deck.meta.footer), DeckRenderOne(deck.slides[sel],1,LOGO)) : ''; } catch(err){ previewHtml = '<p class=\"hint\">preview indisponivel</p>'; }\n    let formHtml = '<p class=\"hint\">Selecione ou adicione um slide.</p>';\n    try { if (sel>=0 && deck.slides[sel]) formHtml = renderForm(deck.slides[sel]); } catch(err){ formHtml = '<p class=\"hint\">form indisponivel</p>'; }\n\n    return `<div class=\"root\" data-key=\"screen-editor\">\n      ${GATE_OVERLAY}\n      <div class=\"top\">\n        <span class=\"brand\">TEMPO &middot; EDITOR</span>\n        <select id=\"deckSel\">${decks.map(dd=>`<option value=\"${esc(dd.slug)}\" ${dd.slug===S.curDeck?'selected':''}>${esc(dd.nome||dd.slug)}</option>`).join('')}</select>\n        <button class=\"btn\" id=\"newDeck\">+ deck</button>\n        <input class=\"tt\" id=\"metaTitle\" placeholder=\"titulo\" style=\"width:230px\" value=\"${escAttr(deck.meta&&deck.meta.title)}\">\n        <input class=\"tt\" id=\"metaFoot\" placeholder=\"rodape\" style=\"width:170px\" value=\"${escAttr(deck.meta&&deck.meta.footer)}\">\n        <select id=\"metaFmt\" title=\"formato do slide\"><option value=\"a4\" ${_fmtCls(deck.meta)?'':'selected'}>Retrato</option><option value=\"16x9\" ${_fmtCls(deck.meta)?'selected':''}>Paisagem</option></select>\n        <span class=\"sp\"></span>\n        <span class=\"dirty\" id=\"dstate\">${S.dirty?'● nao salvo':(S.savedFlag?'salvo ✓':'')}</span>\n        <button class=\"btn gold\" id=\"saveBtn\">Salvar</button>\n        <button class=\"btn g\" id=\"viewBtn\">Abrir ↗</button>\n        <button class=\"btn g\" id=\"logoutBtn\" title=\"Encerrar sessão\">Sair</button>\n      </div>\n      <div class=\"wrap\">\n        <div class=\"side\">\n          <h3>Slides</h3>\n          <div id=\"list\">${listHtml}</div>\n          <div class=\"addbar\">\n            <select id=\"addType\">${options}</select>\n            <button class=\"btn gold\" id=\"addBtn\">+</button>\n          </div>\n        </div>\n        <div class=\"form\" id=\"form\">${formHtml}</div>\n        <div class=\"prev\"><div class=\"prevbox ${_fmtCls(deck.meta)}\" id=\"prev\">${previewHtml}</div><div class=\"hint\">preview</div></div>\n      </div>\n      <div class=\"galm ${S.galOpen?'on':''}\" id=\"galm\">\n        <div class=\"galbox\">\n          <div class=\"galh\"><span>Galeria do evento &mdash; clique numa foto para inserir</span><button id=\"galClose\">fechar</button></div>\n          <div class=\"gg\" id=\"gg\">${(S.photos||[]).map(p=>{const full=p.full||p,th=p.thumb||full;return `<img loading=\"lazy\" src=\"${escAttr(th)}\" data-full=\"${escAttr(full)}\">`;}).join('')||'<p class=\"hint\">sem fotos</p>'}</div>\n        </div>\n      </div>\n    </div>`;\n  },\n\n  updated(d2, root) {\n    try { if (d2.state._bindGateDirect) d2.state._bindGateDirect(); } catch(e){ d2.log('updated bind err', e); }\n  },\n\n  mounted(d2, root) {\n    const S = d2.state;\n    if (S.screen === undefined) S.screen = 'editor';\n\n    const api = () => d2.rush('deck-api');\n\n    async function loadList() {\n      try {\n        const r = await callApi({ action: 'list' });\n        S.decks = (r && r.decks) || [];\n        paint();\n      } catch (e) { d2.log('list err', e); }\n    }\n    async function loadDeck(slug) {\n      try {\n        const r = await callApi({ action: 'load', slug });\n        const rec = r && r.deck;\n        S.curDeck = slug;\n        if (rec) {\n          S.deck = { meta: safeParse(rec.meta_json, {footer:'TEMPO BY PORSCHE'}), slides: safeParse(rec.slides_json, []) };\n        } else {\n          S.deck = { meta:{footer:'TEMPO BY PORSCHE'}, slides:[] };\n        }\n        S.sel = (S.deck.slides.length>0)?0:-1;\n        S.dirty = false; S.savedFlag = false;\n        paint();\n      } catch (e) { d2.log('load err', e); }\n    }\n    async function loadPhotos() {\n      try {\n        const r = await callApi({ action: 'gallery' });\n        S.photos = (r && r.photos) || [];\n        paint();\n      } catch (e) { d2.log('gallery err', e); }\n    }\n\n    // ---------- IMPERATIVE PAINT ----------\n    // d2.refresh()/morph does NOT re-render in this runtime (proven in the gate bug).\n    // All UI updates are painted imperatively into the existing DOM.\n    const LOGOURL = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\n    async function callApi(payload){\n      try {\n        let r = await api().invoke(payload);\n        if (r && r.data !== undefined) r = r.data;           // rush envelope {data:{...}}\n        if (r && r.response && r.response.data !== undefined) r = r.response.data;\n        if (r && (r.ok !== undefined || r.decks !== undefined || r.photos !== undefined || r.deck !== undefined)) return r;\n        d2.log('rush resposta inesperada', r);\n      } catch(e){ d2.log('rush invoke falhou, tentando fetch', e); }\n      const res = await fetch('https://tempo.data2apis.com/rush/deck-api', { method:'POST', headers:{'content-type':'application/json'}, body: JSON.stringify(payload) });\n      const j = await res.json();\n      return (j && j.data !== undefined) ? j.data : j;\n    }\n    function buildListHtml(){\n      const deck = S.deck || {slides:[]};\n      const slides = deck.slides || [];\n      const sel = (S.sel==null)?-1:S.sel;\n      return slides.map((s,i)=>`\n      <div class=\"sl ${i===sel?'sel':''}\" data-slide=\"${i}\">\n        <div class=\"ty\">${esc(s.type)}</div><div class=\"tt\">${esc(s.title||s.subtitle||'(sem titulo)')}</div>\n        <div class=\"row\">\n          <button data-move=\"${i}\" data-dir=\"-1\">&uarr;</button>\n          <button data-move=\"${i}\" data-dir=\"1\">&darr;</button>\n          <button data-dup=\"${i}\">&#10697;</button>\n          <button data-del=\"${i}\">&#10005;</button>\n        </div>\n      </div>`).join('') || '<p class=\"hint\">sem slides</p>';\n    }\n    function paint(){\n      try {\n        const deck = S.deck || {meta:{},slides:[]};\n        const selEl = d2.$('#deckSel');\n        if (selEl) selEl.innerHTML = (S.decks||[]).map(dd=>`<option value=\"${escAttr(dd.slug)}\" ${dd.slug===S.curDeck?'selected':''}>${esc(dd.nome||dd.slug)}</option>`).join('');\n        const mt = d2.$('#metaTitle'); if (mt) mt.value = (deck.meta && deck.meta.title) || '';\n        const mf = d2.$('#metaFoot'); if (mf) mf.value = (deck.meta && deck.meta.footer) || '';\n        const mfmt = d2.$('#metaFmt'); if (mfmt) mfmt.value = _fmtCls(deck.meta) ? '16x9' : 'a4';\n        const pbx = d2.$('#prev'); if (pbx) pbx.classList.toggle('land', !!_fmtCls(deck.meta));\n        const list = d2.$('#list'); if (list) list.innerHTML = buildListHtml();\n        const form = d2.$('#form');\n        if (form) {\n          let fh = '<p class=\"hint\">Selecione ou adicione um slide.</p>';\n          try { if (S.sel>=0 && deck.slides && deck.slides[S.sel]) fh = renderForm(deck.slides[S.sel]); } catch(e){}\n          form.innerHTML = fh;\n        }\n        refreshPreview();\n        const ds = d2.$('#dstate'); if (ds) ds.textContent = S.dirty?'● nao salvo':(S.savedFlag?'salvo ✓':'');\n        const gm = d2.$('#galm'); if (gm) gm.classList.toggle('on', !!S.galOpen);\n        const gg = d2.$('#gg'); if (gg) gg.innerHTML = (S.photos||[]).map(p=>{const full=p.full||p,th=p.thumb||full;return `<img loading=\"lazy\" src=\"${escAttr(th)}\" data-full=\"${escAttr(full)}\">`;}).join('')||'<p class=\"hint\">sem fotos</p>';\n      } catch(e){ d2.log('paint err', e); }\n    }\n    function showViewer(){\n      const rootEl = d2.$('.root'); if(!rootEl) return;\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGOURL)).join('');\n      const v = document.createElement('div');\n      v.className = 'viewer'; v.id = 'viewerOverlay'; v.style.zIndex = '900';\n      v.innerHTML = `<div class=\"viewbar\"><button class=\"btn g\" id=\"backEdit\">&larr; Editor</button><button class=\"btn gold\" id=\"doPrint\">Imprimir / PDF</button></div><div class=\"deck ${_fmtCls(deck.meta)}\">${html}</div>`;\n      rootEl.appendChild(v);\n      rootEl.classList.add('viewing');\n      const b = v.querySelector('#backEdit'); if (b) b.onclick = () => closeViewer();\n      const p = v.querySelector('#doPrint'); if (p) p.onclick = () => doPrint();\n    }\n    function closeViewer(){\n      const v = d2.$('#viewerOverlay'); if (v) v.remove();\n      const rootEl = d2.$('.root'); if (rootEl) rootEl.classList.remove('viewing');\n    }\n    // Print in a DEDICATED window: escapes the player's clipped layout AND forces\n    // background printing (dark slides would otherwise come out blank).\n    function doPrint(){\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGOURL)).join('');\n      let css = '';\n      try { const sr = d2.$('.root').getRootNode(); sr.querySelectorAll('style').forEach(st=>{ css += st.textContent; }); } catch(e){}\n      const doc = '<!doctype html><html><head><meta charset=\"utf-8\"><title>' + esc((deck.meta&&deck.meta.title)||'Tempo · Deck') + '</title><style>' + css + `\n        html,body{margin:0;padding:0;background:#fff}\n        /* .root nao existe aqui: redeclara as variaveis da marca no wrapper de print */\n        .pdeck{--gold:#FFB81C;--paper:#0a0a0a;--line:#2b2b2b;--muted:#8a8a8a;--body:#cfcfcf;display:flex;flex-direction:column;align-items:center}\n        .pdeck .slide{page-break-after:always;break-after:page;box-shadow:none;margin:0}\n        /* gradientes rasterizam caro no print: troca por overlay chapado (leve) */\n        .pdeck .slide .scrim{background:rgba(10,10,10,.45)!important}\n        .pdeck .slide.image .scrim{background:rgba(10,10,10,.35)!important}\n        .pdeck .slide .grain{display:none!important}\n        @page{size:A4 ${_fmtCls(deck.meta)?'landscape':''};margin:0}\n        *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}\n      </style></head><body><div class=\"pdeck ${_fmtCls(deck.meta)}\">` + html + '</div><scr' + 'ipt>window.onload=function(){setTimeout(function(){window.print();},800);};</scr' + 'ipt></body></html>';\n      let w = null;\n      try { w = window.open('', '_blank'); } catch(e){}\n      if (w) { w.document.open(); w.document.write(doc); w.document.close(); }\n      else { try { d2.dialog.alert('Habilite pop-ups para exportar o PDF.'); } catch(e){} }\n    }\n    // Native event delegation on the root for DYNAMIC content (list rows, form fields,\n    // gallery buttons) — these nodes don't exist at mount, so d2.on cannot be trusted for them.\n    const hostRoot = d2.$('.root');\n    if (hostRoot && !hostRoot._deleg) {\n      hostRoot._deleg = true;\n      hostRoot.addEventListener('click', (e) => {\n        const t = e.target; if (!t || !t.closest) return;\n        const mv = t.closest('[data-move]'); if (mv) { e.stopPropagation(); move(+mv.dataset.move, +mv.dataset.dir); return; }\n        const dp = t.closest('[data-dup]'); if (dp) { e.stopPropagation(); dup(+dp.dataset.dup); return; }\n        const dl = t.closest('[data-del]'); if (dl) { e.stopPropagation(); (async()=>{ const ok = await d2.dialog.confirm('excluir slide?'); if (ok) del(+dl.dataset.del); })(); return; }\n        const gb = t.closest('.galBtn'); if (gb) { S.pickCtx = gb.dataset.idx!=null ? {k:gb.dataset.k, idx:+gb.dataset.idx, sk:gb.dataset.sk} : {k:gb.dataset.k}; S.galOpen = true; paint(); return; }\n        const ub = t.closest('.upBtn'); if (ub) { S.pickCtx = ub.dataset.idx!=null ? {k:ub.dataset.k, idx:+ub.dataset.idx, sk:ub.dataset.sk} : {k:ub.dataset.k}; doUpload(); return; }\n        const ao = t.closest('.addObjBtn'); if (ao) { addObj(ao.dataset.k); return; }\n        const dob = t.closest('.delObjBtn'); if (dob) { delObj(dob.dataset.k, +dob.dataset.idx); return; }\n        const sl = t.closest('.sl'); if (sl && !t.closest('button')) { selectSlide(+sl.dataset.slide); return; }\n      });\n      hostRoot.addEventListener('input', (e) => {\n        const t = e.target; if (!t || !t.matches) return;\n        if (t.matches('[data-f]')) {\n          const k = t.dataset.f, kind = t.dataset.kind;\n          if (kind === 'bool') return;\n          if (kind === 'strings') setStrings(k, t.value); else setF(k, t.value);\n          return;\n        }\n        if (t.matches('[data-obj]')) setObj(t.dataset.obj, +t.dataset.idx, t.dataset.sk, t.value);\n      });\n      hostRoot.addEventListener('change', (e) => {\n        const t = e.target; if (!t || !t.matches) return;\n        if (t.matches('[data-f]') && t.dataset.kind === 'bool') setF(t.dataset.f, t.checked);\n      });\n    }\n\n    // bootstrap once\n    if (!S._booted) {\n      S._booted = true;\n      loadPhotos();\n      loadList();\n      loadDeck(S.curDeck || 'descritivo');\n    }\n\n    // ---------- GATE ----------\n    d2.on('#eml', 'input', (e, el) => { S.email = el.value; });\n    d2.on('#eml', 'keydown', (e, el) => { if (e.key === 'Enter') { e.preventDefault(); const p=d2.$('#pw'); if(p) p.focus(); } });\n    d2.on('#pw', 'input', (e, el) => { S.pw = el.value; });\n    d2.on('#pw', 'keydown', (e, el) => { if (e.key === 'Enter') { e.preventDefault(); tryUnlock(); } });\n    d2.on('#unlock', 'click', (e) => { if (e && e.preventDefault) e.preventDefault(); tryUnlock(); });\n    function currentPw(){\n      const el = d2.$('#pw');\n      const v = el ? el.value : undefined;\n      return (v != null && v !== '') ? v : (S.pw || '');\n    }\n    async function tryUnlock() {\n      const emEl = d2.$('#eml'); const email = ((emEl && emEl.value)||'').trim();\n      const pw = currentPw();\n      if (!email || !pw) { S.gateErr='informe e-mail e senha'; const e0=d2.$('.err'); if(e0) e0.textContent='informe e-mail e senha'; return; }\n      const eBusy = d2.$('.err'); if (eBusy) eBusy.textContent='entrando…';\n      let ok=false, msg='e-mail ou senha inválidos';\n      try {\n        const r = await d2.rush('auth-login').invoke({ email: email, password: pw });\n        const d = (r && r.data!==undefined) ? r.data : r;\n        ok = !!(d && d.ok); if (d && d.message) msg = d.message; if (ok) { var acc = (d.user.role==='admin')||(d.user.apps && d.user.apps.indexOf('deck')>=0); if (!acc) { ok=false; msg='Sem acesso ao Deck'; } else { S.user = d.user; try { localStorage.setItem('tempoAuth', JSON.stringify({user:d.user, ts:Date.now()})); } catch(e){} } }\n      } catch(e){ d2.log('auth err', e); msg='erro de conexão. tente de novo.'; }\n      if (!ok) {\n        S.gateErr = msg;\n        const errEl = d2.$('.err'); if (errEl) errEl.textContent = msg;\n        return;\n      }\n      S.email = email;\n      // SUCCESS. The CodeHost morph refuses to swap gate->editor via render alone\n      // (render re-runs with screen=editor but the morph keeps the gate subtree).\n      // Escape the framework: flip state, then imperatively remove the stale gate\n      // node so the next render() has nothing to morph against, then force a refresh.\n      S.pw = pw;\n      if (!S.deck) S.deck = { meta:{footer:'TEMPO BY PORSCHE'}, slides:[] };\n      if (S.sel == null) S.sel = -1;\n      S.gateErr = '';\n      S.screen = 'editor';\n      d2.state.screen = 'editor';\n      // The CodeHost morph won't swap gate->editor and d2.refresh() is a no-op here.\n      // Escape the framework: reload the component so it remounts fresh and render()\n      // runs from scratch with screen already 'editor' (persisted below via URL flag).\n      // Escape the morph deterministically: the editor is always in the DOM (behind the\n      // gate overlay); unlocking just removes the overlay node imperatively.\n      try { const g = d2.$('#gateOverlay'); if (g) g.remove(); } catch(e){}\n      paint();\n    }\n    // belt-and-suspenders: bind directly to the shadow-root elements too (in case delegated\n    // click/keydown on the root doesn't reach them). Re-bound each render; guarded against dupes.\n    function bindGateDirect(){\n      if (S.screen !== 'gate') return;\n      const btn = d2.$('#unlock'); const inp = d2.$('#pw');\n      if (btn && !btn._bound){ btn._bound = true; d2.on(btn, 'click', (e)=>{ if(e&&e.preventDefault)e.preventDefault(); tryUnlock(); }); }\n      if (inp && !inp._bound){ inp._bound = true;\n        d2.on(inp, 'input', (e)=>{ S.pw = inp.value; });\n        d2.on(inp, 'keydown', (e)=>{ if (e.key === 'Enter'){ e.preventDefault(); tryUnlock(); } });\n      }\n      const eml = d2.$('#eml');\n      if (eml && !eml._bound){ eml._bound = true;\n        d2.on(eml, 'input', (e)=>{ S.email = eml.value; });\n        d2.on(eml, 'keydown', (e)=>{ if (e.key === 'Enter'){ e.preventDefault(); const p=d2.$('#pw'); if(p) p.focus(); } });\n      }\n    }\n    bindGateDirect();\n    d2.state._bindGateDirect = bindGateDirect;\n\n    // ---------- TOP BAR ----------\n    d2.on('#deckSel', 'change', (e, el) => { loadDeck(el.value); });\n    d2.on('#metaTitle', 'input', (e, el) => { ensureMeta(); S.deck.meta.title = el.value; markDirty(); });\n    d2.on('#metaFoot', 'input', (e, el) => { ensureMeta(); S.deck.meta.footer = el.value; markDirty(); });\n    d2.on('#metaFmt', 'change', (e, el) => { ensureMeta(); S.deck.meta.format = el.value; markDirty(); const pbx = d2.$('#prev'); if (pbx) pbx.classList.toggle('land', el.value !== 'a4'); });\n    d2.on('#newDeck', 'click', async () => {\n      const name = await d2.dialog.prompt('nome do novo deck (sem espacos):', 'novo');\n      if (!name) return;\n      const slug = name.toLowerCase().replace(/[^a-z0-9_-]/g,'-');\n      S.curDeck = slug;\n      S.deck = { meta:{title:name, footer:'TEMPO BY PORSCHE'}, slides:[] };\n      S.sel = -1; markDirty();\n      await save(); await loadList(); paint();\n    });\n    d2.on('#saveBtn', 'click', () => save());\n    d2.on('#viewBtn', 'click', () => { showViewer(); });\n    d2.on('#logoutBtn', 'click', async () => {\n      try {\n        const a = d2.auth('rAMokwNexe8bJoWWveODt');\n        if (a) await a.logout();\n      } catch(e){ d2.log('logout err', e); }\n      try { localStorage.removeItem('tempoAuth'); } catch(e){}\n      try { sessionStorage.removeItem('deckScreen'); } catch(e){}\n      // reload so the Router re-evaluates the route policy and shows the login artboard\n      try { location.reload(); } catch(e){}\n    });\n\n    // ---------- VIEWER ----------\n    d2.on('#backEdit', 'click', () => { closeViewer(); });\n    d2.on('#doPrint', 'click', () => doPrint());\n\n    // ---------- SIDEBAR ----------\n    // sidebar: handled by native delegation on .root (see IMPERATIVE PAINT block)\n    d2.on('#addBtn', 'click', () => {\n      const selEl = d2.$('#addType'); addSlide(selEl ? selEl.value : 'cover');\n    });\n\n    // ---------- FORM (delegated) ----------\n    // form + gallery/upload triggers: handled by native delegation on .root (see IMPERATIVE PAINT block)\n\n    // ---------- GALLERY MODAL ----------\n    d2.on('#galClose', 'click', () => { S.galOpen=false; paint(); });\n    d2.on('#galm', 'click', (e, el) => { if (e.target && e.target.id === 'galm') { S.galOpen=false; paint(); } });\n    d2.on('#gg', 'click', (e) => {\n      const img = e.target && e.target.closest('img[data-full]');\n      if (!img) return;\n      applyPhoto(img.dataset.full);\n    });\n\n    // ---------- helpers ----------\n    function ensureMeta(){ if(!S.deck.meta) S.deck.meta = {footer:'TEMPO BY PORSCHE'}; }\n    function markDirty(){ S.dirty=true; S.savedFlag=false; const d=d2.$('#dstate'); if(d) d.textContent='● nao salvo'; refreshPreview(); }\n    function refreshPreview(){\n      const sel = S.sel; const p = d2.$('#prev');\n      if (!p) return;\n      if (sel==null || sel<0 || !S.deck || !S.deck.slides || !S.deck.slides[sel]) { p.innerHTML=''; return; }\n      DeckRenderFoot(S.deck.meta && S.deck.meta.footer);\n      p.innerHTML = DeckRenderOne(S.deck.slides[sel], 1, 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg');\n    }\n    function selectSlide(i){ S.sel=i; paint(); }\n    function setF(k,v){ S.deck.slides[S.sel][k]=v; markDirty(); if(k==='title'||k==='subtitle'){ const li=d2.$$('.sl')[S.sel]; if(li){const tt=li.querySelector('.tt'); if(tt) tt.textContent=(S.deck.slides[S.sel].title||S.deck.slides[S.sel].subtitle||'(sem titulo)');} } }\n    function setStrings(k,v){ S.deck.slides[S.sel][k]=v.split(/\\n\\n+/).map(x=>x.trim()).filter(Boolean); markDirty(); }\n    function setObj(k,idx,sk,v){ if(!S.deck.slides[S.sel][k]) S.deck.slides[S.sel][k]=[]; if(!S.deck.slides[S.sel][k][idx]) S.deck.slides[S.sel][k][idx]={}; S.deck.slides[S.sel][k][idx][sk]=v; markDirty(); }\n    function addObj(k){ const s=S.deck.slides[S.sel]; s[k]=s[k]||[]; s[k].push({}); markDirty(); rerenderForm(); }\n    function delObj(k,idx){ S.deck.slides[S.sel][k].splice(idx,1); markDirty(); rerenderForm(); }\n    function rerenderForm(){ const f=d2.$('#form'); if(f && S.sel>=0) f.innerHTML = renderForm(S.deck.slides[S.sel]); }\n    function addSlide(t){ const tpl=TEMPLATES[t]; if(!tpl) return; const s=JSON.parse(JSON.stringify(tpl)); const at=S.sel>=0?S.sel+1:S.deck.slides.length; S.deck.slides.splice(at,0,s); S.sel=at; markDirty(); paint(); }\n    function dup(i){ S.deck.slides.splice(i+1,0,JSON.parse(JSON.stringify(S.deck.slides[i]))); S.sel=i+1; markDirty(); paint(); }\n    function del(i){ S.deck.slides.splice(i,1); S.sel=Math.min(i,S.deck.slides.length-1); markDirty(); paint(); }\n    function move(i,dir){ const j=i+dir; if(j<0||j>=S.deck.slides.length) return; const a=S.deck.slides; const t=a[i]; a[i]=a[j]; a[j]=t; S.sel=j; markDirty(); paint(); }\n    function applyPhoto(u){ const c=S.pickCtx; if(!c) return; if(c.sk!=null){ if(!S.deck.slides[S.sel][c.k]) S.deck.slides[S.sel][c.k]=[]; if(!S.deck.slides[S.sel][c.k][c.idx]) S.deck.slides[S.sel][c.k][c.idx]={}; S.deck.slides[S.sel][c.k][c.idx][c.sk]=u; } else { S.deck.slides[S.sel][c.k]=u; } S.galOpen=false; markDirty(); paint(); }\n\n    async function doUpload(){\n      const input = document.createElement('input');\n      input.type='file'; input.accept='image/*';\n      input.onchange = async () => {\n        const file = input.files && input.files[0]; if(!file) return;\n        try {\n          const out = await d2.drive('deckmedia').uploadFromFiles([file]);\n          const fileUrl = out && out[0] && (out[0].fileUrl || (out[0].params && out[0].params.fileUrl));\n          if(!fileUrl){ await d2.dialog.alert('falha no upload'); return; }\n          await callApi({ action:'upload', full: fileUrl, thumb: fileUrl });\n          applyPhoto(fileUrl);\n          if (S.photos) S.photos.push({ full: fileUrl, thumb: fileUrl });\n        } catch(e){ d2.log('upload err', e); await d2.dialog.alert('falha no upload: '+e); }\n      };\n      input.click();\n    }\n\n    async function save(){\n      ensureMeta();\n      try {\n        const r = await callApi({\n          action:'save', slug: S.curDeck,\n          nome: (S.deck.meta && S.deck.meta.title) || S.curDeck,\n          meta_json: JSON.stringify(S.deck.meta||{}),\n          slides_json: JSON.stringify(S.deck.slides||[]),\n          updated_at: new Date().toISOString()\n        });\n        if (r && r.ok) { S.dirty=false; S.savedFlag=true; const d=d2.$('#dstate'); if(d) d.textContent='salvo ✓'; }\n        else { await d2.dialog.alert('erro ao salvar'); }\n      } catch(e){ d2.log('save err', e); await d2.dialog.alert('erro ao salvar: '+e); }\n    }\n  }\n};\n\n/* ---------------- module-scope helpers ---------------- */\nfunction esc(v){ return String(v==null?'':v).replace(/</g,'&lt;'); }\nfunction escAttr(v){ return String(v==null?'':v).replace(/\"/g,'&quot;'); }\nfunction safeParse(s, fb){ try { return typeof s==='string' ? JSON.parse(s) : (s||fb); } catch(e){ return fb; } }\n\n\n\n\n\nfunction renderForm(s){\n  const defs = FIELDS[s.type]||[];\n  let h = `<h2>${esc(s.type)}</h2>`;\n  defs.forEach(([k,kind,sub])=>{ h += `<div class=\"f\"><label>${LBL[k]||k}</label>${fieldHTML(s,k,kind,sub)}</div>`; });\n  return h;\n}\nfunction fieldHTML(s,k,kind,sub){\n  if(kind==='text') return `<input type=\"text\" data-f=\"${k}\" data-kind=\"text\" value=\"${escAttr(s[k])}\">`;\n  if(kind==='textarea') return `<textarea data-f=\"${k}\" data-kind=\"textarea\">${esc(s[k])}</textarea>`;\n  if(kind==='bool') return `<label style=\"text-transform:none;color:#ccc\"><input type=\"checkbox\" data-f=\"${k}\" data-kind=\"bool\" ${s[k]?'checked':''}> sim</label>`;\n  if(kind==='image') return imgFieldHTML(k, s[k], null, null);\n  if(kind==='strings'){ const arr=s[k]||[]; return `<textarea style=\"min-height:120px\" data-f=\"${k}\" data-kind=\"strings\">${esc(arr.join('\\n\\n'))}</textarea>`; }\n  if(kind==='objs'){ const arr=s[k]||[]; let h='<div class=\"objs\">';\n    arr.forEach((o,idx)=>{ h+=`<div class=\"obj\"><div class=\"oh\"><b>${idx+1}</b><button class=\"mini delObjBtn\" data-k=\"${k}\" data-idx=\"${idx}\">remover</button></div>`;\n      sub.forEach(([sk,skind])=>{ h+=`<div class=\"f\"><label>${LBL[sk]||sk}</label>${objField(k,idx,sk,skind,o)}</div>`; }); h+='</div>'; });\n    h+=`<button class=\"addmini addObjBtn\" data-k=\"${k}\">+ adicionar</button></div>`; return h; }\n  return '';\n}\nfunction objField(k,idx,sk,kind,o){\n  if(kind==='textarea') return `<textarea data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\">${esc(o[sk])}</textarea>`;\n  if(kind==='image') return imgFieldHTML(k, o[sk], idx, sk);\n  return `<input type=\"text\" data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\" value=\"${escAttr(o[sk])}\">`;\n}\nfunction imgFieldHTML(k, val, idx, sk){\n  const objAttrs = (idx!=null) ? `data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\"` : `data-f=\"${k}\" data-kind=\"text\"`;\n  const ctxAttrs = (idx!=null) ? `data-k=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\"` : `data-k=\"${k}\"`;\n  return `<div class=\"imgf\">\n    <input type=\"text\" ${objAttrs} value=\"${escAttr(val)}\" placeholder=\"url da imagem\">\n    <img src=\"${escAttr(val)}\" onerror=\"this.style.opacity=.2\">\n    <button class=\"mini galBtn\" style=\"color:var(--gold)\" ${ctxAttrs}>galeria</button>\n    <button class=\"mini upBtn\" style=\"color:#9ad\" ${ctxAttrs}>upload</button>\n  </div>`;\n}\n\n/* ---- DeckRender (render.js verbatim logic, logo param'd) ---- */\nfunction DeckRenderFoot(f){ _N = 0; _FOOT = f || 'TEMPO BY PORSCHE'; }\nfunction DeckRenderOne(s, pageNum, LOGO){ _N = (pageNum||1)-1; return _renderSlide(s, LOGO); }\nfunction _renderSlide(s, LOGO){\n  const eS = v => (v==null?'':String(v));\n  const img = (src,cls)=>src?`<img class=\"${cls||''}\" src=\"${eS(src)}\" onerror=\"this.outerHTML='<div class=\\\\'ph ${cls||''}\\\\'>foto: ${eS(src)}</div>'\">`:`<div class=\"ph ${cls||''}\">sem foto</div>`;\n  const foot = ()=>{ _N++; return `<div class=\"foot\"><div class=\"fl\"><img src=\"${LOGO}\">${eS(_FOOT)}</div><div>${String(_N).padStart(2,'0')}</div></div>`; };\n  const kick = (k,num)=>k||num?`<div class=\"kick\">${num?`<span class=\"num\">${eS(num)}</span>`:''}<span class=\"ln\"></span>${eS(k||'')}</div>`:'';\n  const paras = b=>(b||[]).map(p=>`<p>${eS(p)}</p>`).join('');\n  const stats = x=>x.stats||x.kpis||[];\n  const _chartSVG = (s) => {\n    const GOLD='#FFB81C';\n    const enc = v => String(v==null?'':v).replace(/&/g,'&amp;').replace(/</g,'&lt;');\n    const data = (s.data||[]).map(d => ({label:enc(d.label), v:(+d.value||0)}));\n    if(!data.length) return '<div class=\"ph\" style=\"position:relative;height:420px\">grafico sem dados</div>';\n    const ct = s.chartType||'bar';\n    if(ct==='scatter'){\n      const pts=(s.data||[]).map(d=>({label:enc(d.label),x:(+d.x||0),y:(+d.y||0),r:(+d.r||0)}));\n      if(!pts.length) return '<div class=\"ph\" style=\"position:relative;height:420px\">sem dados</div>';\n      const W=1000,H=560,pl=96,pr=56,pt=54,pb=72,iw=W-pl-pr,ih=H-pt-pb;\n      const xmax=Math.max(...pts.map(p=>p.x))*1.10;\n      const yv=pts.map(p=>p.y), ymax=Math.min(100,Math.max(...yv)+6), ymin=Math.max(0,Math.min(...yv)-10);\n      const rmax=Math.max(...pts.map(p=>p.r),1);\n      const fx=v=>pl+v/xmax*iw, fy=v=>pt+ih-(v-ymin)/((ymax-ymin)||1)*ih, fr=v=>9+Math.sqrt(v/rmax)*33;\n      const kfmt=v=>Math.abs(v)>=1000?(v/1000).toLocaleString('pt-BR',{maximumFractionDigits:0})+'k':String(Math.round(v));\n      const med=a=>{const b=a.slice().sort((x,y)=>x-y),m=Math.floor(b.length/2);return b.length%2?b[m]:(b[m-1]+b[m])/2;};\n      const xmid=(s.xmid!=null?+s.xmid:med(pts.map(p=>p.x))), ymid=(s.ymid!=null?+s.ymid:med(pts.map(p=>p.y)));\n      let out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let g=0;g<=4;g++){const yy=ymin+(ymax-ymin)*g/4,py=fy(yy);out+='<line x1=\"'+pl+'\" y1=\"'+py.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+py.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+py.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+Math.round(yy)+(s.suffix||'%')+'</text>';}\n      for(let g=0;g<=4;g++){const xv=xmax*g/4,px=fx(xv);out+='<text x=\"'+px.toFixed(1)+'\" y=\"'+(H-32)+'\" class=\"cax\" text-anchor=\"middle\">'+(s.prefix||'')+kfmt(xv)+'</text>';}\n      out+='<line x1=\"'+fx(xmid).toFixed(1)+'\" y1=\"'+pt+'\" x2=\"'+fx(xmid).toFixed(1)+'\" y2=\"'+(pt+ih)+'\" stroke=\"#3a3a3a\" stroke-width=\"1\" stroke-dasharray=\"5 5\"/>';\n      out+='<line x1=\"'+pl+'\" y1=\"'+fy(ymid).toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+fy(ymid).toFixed(1)+'\" stroke=\"#3a3a3a\" stroke-width=\"1\" stroke-dasharray=\"5 5\"/>';\n      const ql=[[fx(xmax)-6,pt+22,'end','ESTRELAS'],[pl+6,pt+22,'start','ENIGMAS'],[fx(xmax)-6,pt+ih-8,'end','CAVALOS DE BATALHA'],[pl+6,pt+ih-8,'start','REVISAR']];\n      ql.forEach(q=>{out+='<text x=\"'+q[0].toFixed(1)+'\" y=\"'+q[1]+'\" text-anchor=\"'+q[2]+'\" style=\"font-size:15px;fill:#5c5c5c;font-weight:700;letter-spacing:1px\">'+q[3]+'</text>';});\n      pts.forEach(p=>{const cx=fx(p.x),cy=fy(p.y),rr=fr(p.r);out+='<circle cx=\"'+cx.toFixed(1)+'\" cy=\"'+cy.toFixed(1)+'\" r=\"'+rr.toFixed(1)+'\" fill=\"#FFB81C\" fill-opacity=\"0.30\" stroke=\"#FFB81C\" stroke-width=\"2\"/><text x=\"'+cx.toFixed(1)+'\" y=\"'+(cy-rr-6).toFixed(1)+'\" text-anchor=\"middle\" style=\"font-size:19px;fill:#eaeaea;font-weight:600\">'+p.label+'</text>';});\n      out+='<text x=\"'+(pl+iw/2).toFixed(1)+'\" y=\"'+(H-8)+'\" text-anchor=\"middle\" style=\"font-size:16px;fill:#9a9a9a\">'+(s.xlabel||'Faturamento')+'  ·  tamanho da bolha = lucro</text>';\n      out+='<text x=\"24\" y=\"'+(pt+ih/2).toFixed(1)+'\" text-anchor=\"middle\" style=\"font-size:16px;fill:#9a9a9a\" transform=\"rotate(-90 24 '+(pt+ih/2).toFixed(1)+')\">'+(s.ylabel||'Margem')+'</text>';\n      return out+'</svg>';\n    }\n    if(ct==='stackbar'){\n      const COLORS=s.colors||['#B8801A','#FFB81C','#FFE08A'];\n      const series=s.series||[];\n      const dd=(s.data||[]).map(d=>({label:enc(d.label),parts:(d.parts||[]).map(Number)}));\n      const totals=dd.map(d=>d.parts.reduce((a,b)=>a+b,0));\n      const mx=Math.max(1,...totals);\n      const fmtS=v=>{let n=Number(v),t; if(s.compact&&Math.abs(n)>=1000)t=(n/1000).toLocaleString('pt-BR',{maximumFractionDigits:0})+'k'; else t=String(Math.round(n)); return (s.prefix||'')+t+(s.suffix||'');};\n      const W=1000,H=560,pl=82,pr=24,pt=88,pb=64,iw=W-pl-pr,ih=H-pt-pb,n=dd.length,slot=iw/n,bw=Math.min(96,slot*0.5);\n      let out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      let lx=pl; series.forEach((nm,i)=>{out+='<rect x=\"'+lx+'\" y=\"18\" width=\"20\" height=\"20\" rx=\"3\" fill=\"'+COLORS[i%COLORS.length]+'\"/><text x=\"'+(lx+27)+'\" y=\"28\" class=\"cax\" text-anchor=\"start\" dominant-baseline=\"central\" style=\"fill:#ccc\">'+enc(nm)+'</text>'; lx+=70+enc(nm).length*11;});\n      for(let g=0;g<=4;g++){const gy=pt+ih-(g/4*ih);out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmtS(mx*g/4)+'</text>';}\n      dd.forEach((d,i)=>{const cx=pl+slot*i+slot/2; let yTop=pt+ih;\n        d.parts.forEach((v,j)=>{const h=v/mx*ih,y=yTop-h; out+='<rect x=\"'+(cx-bw/2).toFixed(1)+'\" y=\"'+y.toFixed(1)+'\" width=\"'+bw.toFixed(1)+'\" height=\"'+h.toFixed(1)+'\" fill=\"'+COLORS[j%COLORS.length]+'\"/>'; yTop=y;});\n        out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(yTop-12).toFixed(1)+'\" class=\"cval\" text-anchor=\"middle\">'+fmtS(totals[i])+'</text>';\n        out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(H-24)+'\" class=\"cax\" text-anchor=\"middle\">'+d.label+'</text>';});\n      return out+'</svg>';\n    }\n    const max = Math.max(1, ...data.map(d=>d.v));\n    const fmt = v => { let n=Number(v), t;\n      if(s.compact && Math.abs(n)>=1000) t=(n/1000).toLocaleString('pt-BR',{maximumFractionDigits: Math.abs(n)>=10000?0:1})+'k';\n      else t=Math.round(n).toLocaleString('pt-BR');\n      return (s.prefix||'')+t+(s.suffix||''); };\n    const W=1000; let out='';\n    if(ct==='hbar'){\n      const n=data.length, rh=Math.max(46, 520/n), H=n*rh, lw=340, x0=lw+18, bw=W-x0-160;\n      out='<svg viewBox=\"0 0 '+W+' '+H.toFixed(0)+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let i=0;i<n;i++){ const d=data[i], cy=i*rh+rh/2, bh=Math.min(34,rh*0.5), by=cy-bh/2, w=Math.max(2, d.v/max*bw);\n        out+='<text x=\"'+lw+'\" y=\"'+cy.toFixed(1)+'\" class=\"clab\" text-anchor=\"end\" dominant-baseline=\"central\">'+d.label+'</text>';\n        out+='<rect x=\"'+x0+'\" y=\"'+by.toFixed(1)+'\" width=\"'+w.toFixed(1)+'\" height=\"'+bh.toFixed(1)+'\" rx=\"3\" fill=\"'+GOLD+'\"/>';\n        out+='<text x=\"'+(x0+w+12).toFixed(1)+'\" y=\"'+cy.toFixed(1)+'\" class=\"cval\" dominant-baseline=\"central\">'+fmt(d.v)+'</text>'; }\n      return out+'</svg>';\n    }\n    if(ct==='line'){\n      const H=520, pl=82, pr=28, pt=28, pb=52, iw=W-pl-pr, ih=H-pt-pb, n=data.length;\n      const xf=i=> pl + (n<=1? iw/2 : i/(n-1)*iw);\n      const yf=v=> pt + ih - (v/max*ih);\n      out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let g=0;g<=4;g++){ const gy=pt+ih-(g/4*ih); out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmt(max*g/4)+'</text>'; }\n      let area='M'+xf(0).toFixed(1)+' '+(pt+ih).toFixed(1)+' ', line='';\n      for(let i=0;i<n;i++){ const x=xf(i).toFixed(1), y=yf(data[i].v).toFixed(1); line+=(i?'L':'M')+x+' '+y+' '; area+='L'+x+' '+y+' '; }\n      area+='L'+xf(n-1).toFixed(1)+' '+(pt+ih).toFixed(1)+' Z';\n      out+='<path d=\"'+area+'\" fill=\"'+GOLD+'\" fill-opacity=\"0.12\"/><path d=\"'+line+'\" fill=\"none\" stroke=\"'+GOLD+'\" stroke-width=\"3\" stroke-linejoin=\"round\"/>';\n      const step=Math.ceil(n/9);\n      for(let i=0;i<n;i++){ out+='<circle cx=\"'+xf(i).toFixed(1)+'\" cy=\"'+yf(data[i].v).toFixed(1)+'\" r=\"3.2\" fill=\"'+GOLD+'\"/>'; if(i%step===0||i===n-1) out+='<text x=\"'+xf(i).toFixed(1)+'\" y=\"'+(H-14)+'\" class=\"cax\" text-anchor=\"middle\">'+data[i].label+'</text>'; }\n      return out+'</svg>';\n    }\n    const H=520, pl=82, pr=24, pt=40, pb=60, iw=W-pl-pr, ih=H-pt-pb, n=data.length, slot=iw/n, bw=Math.min(74, slot*0.62);\n    out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n    for(let g=0;g<=4;g++){ const gy=pt+ih-(g/4*ih); out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmt(max*g/4)+'</text>'; }\n    for(let i=0;i<n;i++){ const d=data[i], cx=pl+slot*i+slot/2, h=Math.max(1,d.v/max*ih), y=pt+ih-h;\n      out+='<rect x=\"'+(cx-bw/2).toFixed(1)+'\" y=\"'+y.toFixed(1)+'\" width=\"'+bw.toFixed(1)+'\" height=\"'+h.toFixed(1)+'\" rx=\"3\" fill=\"'+GOLD+'\"/>';\n      out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(y-12).toFixed(1)+'\" class=\"cval\" text-anchor=\"middle\">'+fmt(d.v)+'</text>';\n      out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(H-22)+'\" class=\"cax\" text-anchor=\"middle\">'+d.label+'</text>'; }\n    return out+'</svg>';\n  };\n\n  const R = {\n    chart:s=>`<div class=\"slide chart\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"chartwrap\">${_chartSVG(s)}</div>${s.note?`<div class=\"note\">${eS(s.note)}</div>`:''}</div>${foot()}</div>`,\n    cover:s=>`<div class=\"slide cover\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\">\n      <div class=\"top\">${s.kicker?kick(s.kicker):'<span></span>'}${s.logo?`<img class=\"logo\" src=\"${LOGO}\">`:''}</div>\n      <div class=\"ttl\"><h2 class=\"title\">${eS(s.title)}</h2><div class=\"rule\"></div>${s.subtitle?`<div class=\"sub\">${eS(s.subtitle)}</div>`:''}</div></div></div>`,\n    statement:s=>`<div class=\"slide statement\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\">\n      ${kick(s.kicker)}<h2 class=\"title\" style=\"margin-top:${s.kicker?'22px':'0'}\">${eS(s.title)}</h2>${s.sub?`<div class=\"sub\">${eS(s.sub)}</div>`:''}</div></div>`,\n    section:s=>`<div class=\"slide section\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div>${s.number?`<div class=\"ghost\">${eS(s.number)}</div>`:''}<div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\" style=\"margin-top:20px\">${eS(s.title)}</h2></div>${foot()}</div>`,\n    text:s=>`<div class=\"slide text\"><div class=\"pad\">${s.image?img(s.image,'top-img'):''}${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"body\">${paras(s.body)}</div></div>${foot()}</div>`,\n    split:s=>`<div class=\"slide split ${s.side==='left'?'rev':''}\"><div class=\"half txt\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"body\">${paras(s.body)}</div></div><div class=\"half img\">${img(s.image)}</div>${foot()}</div>`,\n    trio:s=>`<div class=\"slide trio\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"cols\">${(s.cards||[]).map(c=>`<div class=\"col\">${img(c.image)}<h3>${eS(c.title)}</h3><p>${eS(c.text)}</p></div>`).join('')}</div></div>${foot()}</div>`,\n    gallery:s=>`<div class=\"slide gallery\"><div class=\"pad\">${s.title?`<h2 class=\"title\">${eS(s.title)}</h2>`:''}\n      <div class=\"grid2\">${(s.items||[]).map(it=>img(it.image||it)).join('')}</div></div>${foot()}</div>`,\n    data:s=>`<div class=\"slide data\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"stats\">${stats(s).map(k=>`<div class=\"stat\"><div class=\"big\">${eS(k.big)}</div><div class=\"lab\">${eS(k.label)}</div>${k.sub?`<div class=\"ksub\">${eS(k.sub)}</div>`:''}</div>`).join('')}</div>\n      ${s.note?`<div class=\"note\">${eS(s.note)}</div>`:''}${s.image?img(s.image,'planta'):''}</div>${foot()}</div>`,\n    bigstat:s=>`<div class=\"slide bigstat\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"pad\">${kick(s.kicker)}<div class=\"big\">${eS(s.big)}</div><div class=\"lab\">${eS(s.label)}</div>${s.sub?`<div class=\"ksub\">${eS(s.sub)}</div>`:''}</div>${foot()}</div>`,\n    amenities:s=>`<div class=\"slide amenities\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"amg\">${(s.items||[]).map(it=>`<div class=\"am\"><h4>${eS(it.title)}</h4><p>${eS(it.desc)}</p></div>`).join('')}</div></div>${foot()}</div>`,\n    quote:s=>`<div class=\"slide quote\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\"><div class=\"q\">${eS(s.text)}</div>${s.author?`<div class=\"au\">${eS(s.author)}</div>`:''}</div></div>`,\n    list:s=>`<div class=\"slide list\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      ${(s.items||[]).map((it,i)=>`<div class=\"li\"><div class=\"n\">${String(i+1).padStart(2,'0')}</div><div><div class=\"lead\">${eS(it.lead)}</div><div class=\"desc\">${eS(it.desc)}</div></div></div>`).join('')}</div>${foot()}</div>`,\n    image:s=>`<div class=\"slide image\">${img(s.image,'bg')}<div class=\"scrim\" style=\"background:linear-gradient(0deg,#0a0a0af0,#0a0a0a00 45%)\"></div>${s.caption?`<div class=\"pad\" style=\"justify-content:flex-end\"><div class=\"sub\" style=\"font-size:15px;color:#ddd\">${eS(s.caption)}</div></div>`:''}${foot()}</div>`,\n    contact:s=>`<div class=\"slide contact\">${s.image?img(s.image,'bg'):''}${s.image?'<div class=\"scrim\"></div>':''}<div class=\"pad\">\n      <h2 class=\"title\">${eS(s.title||'CONTATO')}</h2><div class=\"crow\">\n      ${s.address?`<div class=\"ci\"><div class=\"cl\">Endereco</div><div class=\"cv\">${eS(s.address)}</div></div>`:''}\n      ${s.hours?`<div class=\"ci\"><div class=\"cl\">Horario</div><div class=\"cv\">${eS(s.hours)}</div></div>`:''}\n      ${s.email?`<div class=\"ci\"><div class=\"cl\">Contato</div><div class=\"cv\">${eS(s.email)}</div></div>`:''}\n      ${s.site?`<div class=\"ci\"><div class=\"cl\">Site</div><div class=\"cv\">${eS(s.site)}</div></div>`:''}\n      </div></div>${foot()}</div>`,\n    closing:s=>`<div class=\"slide closing\">${img(s.image,'bg')}${s.image?'<div class=\"scrim\"></div>':''}<div class=\"pad\">${s.logo?`<img class=\"logo\" src=\"${LOGO}\">`:''}<h2 class=\"title\">${eS(s.title)}</h2>${s.subtitle?`<div class=\"sub\">${eS(s.subtitle)}</div>`:''}</div></div>`\n  };\n  return (R[s.type]||(x=>`<div class=\"slide\"><div class=\"pad\"><h2 class=\"title\">tipo: ${eS(x.type)}</h2></div></div>`))(s);\n}"}}}}}},"__d2PrevCode":{"code":"const TYPES = [\n  ['cover','Capa'],['statement','Statement'],['section','Divisoria'],['text','Texto'],\n  ['split','Split (imagem+texto)'],['trio','Trio (3 cards)'],['gallery','Galeria'],\n  ['data','Dados (numeros)'],['bigstat','Numero gigante'],['chart','Grafico'],['amenities','Infraestrutura'],\n  ['quote','Citacao'],['list','Lista numerada'],['image','Imagem'],['contact','Contato'],['closing','Encerramento']\n];\nconst FIELDS = {\n  cover:[['kicker','text'],['title','text'],['subtitle','textarea'],['image','image'],['logo','bool']],\n  statement:[['kicker','text'],['title','text'],['sub','textarea'],['image','image']],\n  section:[['number','text'],['kicker','text'],['title','text'],['image','image']],\n  text:[['kicker','text'],['title','text'],['image','image'],['body','strings']],\n  split:[['kicker','text'],['title','text'],['side','text'],['image','image'],['body','strings']],\n  trio:[['kicker','text'],['title','text'],['cards','objs',[['image','image'],['title','text'],['text','textarea']]]],\n  gallery:[['kicker','text'],['title','text'],['items','objs',[['image','image']]]],\n  data:[['number','text'],['kicker','text'],['title','text'],['stats','objs',[['big','text'],['label','text'],['sub','text']]],['note','textarea'],['image','image']],\n  bigstat:[['kicker','text'],['big','text'],['label','text'],['sub','text'],['image','image']],\n  chart:[['number','text'],['kicker','text'],['title','text'],['chartType','text'],['prefix','text'],['suffix','text'],['compact','bool'],['xlabel','text'],['ylabel','text'],['data','objs',[['label','text'],['value','text'],['x','text'],['y','text'],['r','text']]],['note','textarea']],\n  amenities:[['number','text'],['kicker','text'],['title','text'],['items','objs',[['title','text'],['desc','textarea']]]],\n  quote:[['text','textarea'],['author','text'],['image','image']],\n  list:[['kicker','text'],['title','text'],['items','objs',[['lead','text'],['desc','textarea']]]],\n  image:[['image','image'],['caption','text']],\n  contact:[['title','text'],['address','text'],['hours','text'],['email','text'],['site','text'],['image','image']],\n  closing:[['title','text'],['subtitle','text'],['image','image'],['logo','bool']]\n};\nconst LBL = {title:'Titulo',subtitle:'Subtitulo',sub:'Texto de apoio',image:'Imagem',logo:'Mostrar logo',body:'Paragrafos (linha em branco separa)',cards:'Cards',kpis:'KPIs',stats:'Numeros',note:'Nota',items:'Itens',lead:'Destaque',desc:'Descricao',caption:'Legenda',text:'Texto',big:'Numero',label:'Rotulo',kicker:'Etiqueta (kicker)',number:'No da secao',side:'Lado da imagem (right/left)',author:'Autor',address:'Endereco',hours:'Horario',email:'Contato/e-mail',site:'Site',chartType:'Tipo: bar / hbar / line',prefix:'Prefixo (ex: R$ )',suffix:'Sufixo (ex: %)',compact:'Abreviar milhares (12,3k)',value:'Valor',data:'Series (rotulo + valor)',x:'X (scatter)',y:'Y (scatter)',r:'Tamanho bolha (scatter)',xlabel:'Rotulo eixo X',ylabel:'Rotulo eixo Y'};\nconst TEMPLATES = {\n  cover:{type:'cover',logo:true,kicker:'Etiqueta',title:'TITULO',subtitle:'subtitulo',image:''},\n  statement:{type:'statement',title:'FRASE DE IMPACTO',sub:'texto de apoio',image:''},\n  section:{type:'section',number:'01',kicker:'Secao',title:'SECAO',image:''},\n  text:{type:'text',kicker:'',title:'TITULO',image:'',body:['Paragrafo um.','Paragrafo dois.']},\n  split:{type:'split',kicker:'',side:'right',title:'TITULO',image:'',body:['Paragrafo um.','Paragrafo dois.']},\n  trio:{type:'trio',title:'TITULO',cards:[{image:'',title:'CARD 1',text:'texto'},{image:'',title:'CARD 2',text:'texto'},{image:'',title:'CARD 3',text:'texto'}]},\n  gallery:{type:'gallery',title:'GALERIA',items:[{image:''},{image:''},{image:''},{image:''}]},\n  data:{type:'data',number:'',kicker:'',title:'TITULO',stats:[{big:'00',label:'rotulo',sub:''},{big:'00',label:'rotulo',sub:''}],note:''},\n  bigstat:{type:'bigstat',big:'200',label:'rotulo',sub:'',image:''},\n  chart:{type:'chart',title:'GRAFICO',chartType:'bar',prefix:'',suffix:'',compact:false,data:[{label:'A',value:'10'},{label:'B',value:'20'},{label:'C',value:'15'}],note:''},\n  amenities:{type:'amenities',number:'',kicker:'',title:'TITULO',items:[{title:'ITEM',desc:'descricao'},{title:'ITEM',desc:'descricao'}]},\n  quote:{type:'quote',text:'Frase de impacto.',author:'Autor',image:''},\n  list:{type:'list',title:'TITULO',items:[{lead:'Destaque',desc:'descricao'}]},\n  image:{type:'image',image:'',caption:''},\n  contact:{type:'contact',title:'CONTATO',address:'Rua ...',hours:'Ter-Dom - 12h-22h',email:'eventos@tempobyporsche.com',site:'tempobyporsche.com',image:''},\n  closing:{type:'closing',logo:true,title:'ENCERRAMENTO',subtitle:'contato'}\n};\nlet _FOOT = 'TEMPO BY PORSCHE', _N = 0;\nfunction _fmtCls(meta){ const f = String((meta && meta.format) || 'a4').toLowerCase(); return (f==='16x9'||f==='paisagem'||f==='landscape'||f==='horizontal') ? 'land' : ''; }\n\nexport default {\n  css: `\n@font-face{font-family:'Pressio';src:url('https://tempobyporsche.com/wp-content/uploads/2026/02/pressio-no44.woff2') format('woff2');font-weight:400 900;font-display:swap}\n@font-face{font-family:'Raleway';src:url('https://tempobyporsche.com/wp-content/uploads/2026/02/Raleway-VariableFont_wght.ttf') format('truetype');font-weight:200 800;font-display:swap}\n:host,.root{--gold:#FFB81C;--paper:#0a0a0a;--line:#2b2b2b;--muted:#8a8a8a;--body:#cfcfcf}\n*{box-sizing:border-box}\n.root{position:absolute;inset:0;background:#0f0f0f;font-family:Raleway,system-ui,sans-serif;color:#eee;overflow:hidden}\n\n/* GATE */\n.gate{position:absolute;inset:0;z-index:1000;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#0a0a0a;gap:22px}\n.gate .logo{height:120px;width:auto;opacity:.95}\n.gate .brand{font-weight:800;letter-spacing:5px;color:var(--gold);font-size:16px;text-transform:uppercase}\n.gate .sub{color:#888;font-size:13px;letter-spacing:2px;text-transform:uppercase}\n.gate input{background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:9px;padding:13px 16px;font-size:15px;font-family:Raleway;width:280px;text-align:center;letter-spacing:2px}\n.gate input:focus{outline:none;border-color:var(--gold)}\n.gate button{background:var(--gold);color:#000;border:none;border-radius:9px;padding:12px 30px;font-size:14px;font-weight:700;cursor:pointer;font-family:Raleway;letter-spacing:1px}\n.gate .err{color:#ff6b6b;font-size:12px;height:14px}\n\n/* TOP BAR */\n.top{height:56px;display:flex;align-items:center;gap:12px;padding:0 18px;background:#0b0b0b;border-bottom:1px solid #262626;flex-shrink:0}\n.top .brand{font-weight:800;letter-spacing:2px;color:var(--gold);font-size:14px;white-space:nowrap}\n.top input.tt{background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:7px;padding:7px 10px;font-size:13px;font-family:Raleway}\n.top .sp{flex:1}\nselect,.btn{background:#161616;border:1px solid #2a2a2a;color:#eee;border-radius:7px;padding:8px 12px;font-size:13px;cursor:pointer;font-family:Raleway}\nselect:focus,input:focus{outline:none}\n.btn.gold{background:var(--gold);color:#000;border-color:var(--gold);font-weight:700}\n.btn.g{background:transparent;color:var(--gold);border-color:#444}\n.dirty{color:#FF9F1C;font-size:12px;white-space:nowrap}\n\n/* LAYOUT */\n.wrap{display:grid;grid-template-columns:250px 1fr 400px;position:absolute;top:56px;left:0;right:0;bottom:0}\n.side{border-right:1px solid #222;overflow:auto;padding:12px}\n.side h3{font-size:11px;letter-spacing:1px;color:#888;text-transform:uppercase;margin:6px 4px}\n.sl{background:#151515;border:1px solid #242424;border-radius:9px;padding:9px 11px;margin-bottom:8px;cursor:pointer}\n.sl.sel{border-color:var(--gold);background:#1b1706}\n.sl .ty{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:var(--gold)}\n.sl .tt{font-size:13px;color:#eee;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.sl .row{display:flex;gap:4px;margin-top:7px}\n.sl .row button{flex:1;background:#0f0f0f;border:1px solid #2a2a2a;color:#aaa;border-radius:5px;padding:3px;font-size:11px;cursor:pointer}\n.addbar{display:flex;gap:6px;margin-top:10px}.addbar select{flex:1}\n.form{overflow:auto;padding:20px 24px}\n.form h2{font-size:14px;color:var(--gold);text-transform:uppercase;letter-spacing:1px;margin:0 0 16px}\n.f{margin-bottom:14px}.f label{display:block;font-size:11px;color:#999;text-transform:uppercase;letter-spacing:.5px;margin-bottom:5px}\n.f input[type=text],.f textarea{width:100%;background:#161616;border:1px solid #2a2a2a;color:#fff;border-radius:8px;padding:9px 11px;font-size:14px;font-family:Raleway}\n.f textarea{min-height:70px;resize:vertical;line-height:1.5}\n.imgf{display:flex;gap:8px;align-items:center}.imgf input{flex:1}.imgf img{width:44px;height:44px;object-fit:cover;border-radius:6px;background:#222}\n.objs{border:1px solid #242424;border-radius:10px;padding:12px;background:#121212}\n.obj{border-bottom:1px solid #222;padding:8px 0;margin-bottom:8px}.obj:last-child{border-bottom:0}\n.obj .oh{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.obj .oh b{font-size:12px;color:#bbb}\n.mini{background:#0f0f0f;border:1px solid #2a2a2a;color:#f88;border-radius:5px;padding:2px 8px;font-size:11px;cursor:pointer}\n.addmini{background:#1a1a1a;border:1px dashed #3a3a3a;color:var(--gold);border-radius:7px;padding:7px;width:100%;cursor:pointer;font-size:12px;margin-top:6px}\n.prev{border-left:1px solid #222;background:#161616;overflow:auto;padding:18px;display:flex;flex-direction:column;align-items:center}\n.prevbox{width:794px;transform:scale(.44);transform-origin:top center;margin-bottom:-620px}\n.hint{color:#666;font-size:12px;margin-top:8px}\n\n/* GALLERY MODAL */\n.galm{position:absolute;inset:0;background:#000d;z-index:50;display:none;padding:36px}.galm.on{display:block}\n.galbox{max-width:1150px;margin:0 auto;background:#111;border:1px solid #2a2a2a;border-radius:12px;padding:16px;height:100%;display:flex;flex-direction:column}\n.galh{display:flex;justify-content:space-between;align-items:center;color:#ccc;margin-bottom:12px;font-size:13px}\n.galh button{background:#161616;border:1px solid #333;color:#aaa;border-radius:6px;padding:6px 12px;cursor:pointer}\n.gg{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;overflow:auto}\n.gg img{width:100%;height:120px;object-fit:cover;border-radius:6px;cursor:pointer;border:2px solid transparent;background:#222}\n.gg img:hover{border-color:var(--gold)}\n\n/* SLIDE (deck.css, verbatim identity) */\n.slide{position:relative;width:794px;height:1123px;background:var(--paper);overflow:hidden;color:#fff;font-family:Raleway,system-ui,sans-serif;font-weight:300}\n.slide .bg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\n.slide .scrim{position:absolute;inset:0;background:linear-gradient(180deg,rgba(10,10,10,.82),rgba(10,10,10,.35) 45%,rgba(10,10,10,.92))}\n.slide .grain{display:none}\n.slide .pad{position:absolute;inset:0;padding:80px 76px;display:flex;flex-direction:column}\n.slide .logo{height:70px;width:auto}\n.slide h2.title{font-family:Pressio;font-weight:400;color:#fff;text-transform:uppercase;letter-spacing:.5px;line-height:.94;margin:0}\n.slide .gold{color:var(--gold)}\n.kick{font-family:Raleway;font-weight:600;letter-spacing:6px;text-transform:uppercase;color:var(--gold);font-size:12px;display:flex;align-items:center;gap:14px}\n.kick .num{font-family:Pressio;font-size:15px;color:#fff;opacity:.5}\n.kick .ln{flex:1;height:1px;background:var(--line);max-width:90px}\n.slide .body p{font-size:16px;line-height:1.75;color:var(--body);margin:0 0 15px;font-weight:300;max-width:600px}\n.slide .foot{position:absolute;bottom:34px;left:76px;right:76px;display:flex;justify-content:space-between;align-items:center;font-family:Raleway;letter-spacing:3px;font-size:9.5px;color:#7a7a7a;text-transform:uppercase;border-top:1px solid var(--line);padding-top:14px}\n.slide .foot .fl{display:flex;align-items:center;gap:10px}.slide .foot .fl img{height:15px;opacity:.7}\n.slide .ph{position:absolute;inset:0;background:repeating-linear-gradient(45deg,#121212,#121212 14px,#161616 14px,#161616 28px);display:flex;align-items:center;justify-content:center;color:#4a4a4a;font-size:12px;font-family:Raleway;letter-spacing:2px}\n.slide.cover .pad{justify-content:space-between}\n.slide.cover .top{display:flex;justify-content:space-between;align-items:flex-start}\n.slide.cover .ttl{margin-top:auto}\n.slide.cover h2.title{font-size:82px;margin-top:14px}\n.slide.cover .rule{width:64px;height:2px;background:var(--gold);margin:26px 0 18px}\n.slide.cover .sub{font-size:17px;color:#e6e6e6;font-weight:300;max-width:520px;line-height:1.6}\n.slide.statement .pad{align-items:flex-start;justify-content:center}\n.slide.statement h2.title{font-size:62px;max-width:660px;line-height:.98}\n.slide.statement .sub{font-size:18px;color:#eaeaea;margin-top:30px;font-weight:300;max-width:520px;line-height:1.7}\n.slide.section .pad{justify-content:center}\n.slide.section .ghost{position:absolute;right:60px;bottom:40px;font-family:Pressio;font-size:300px;line-height:.7;color:#ffffff0d}\n.slide.section h2.title{font-size:64px;max-width:600px}\n.slide.text h2.title{font-size:50px;margin:14px 0 26px;max-width:600px}\n.slide.text .body{columns:2;column-gap:40px}\n.slide.text .top-img{width:100%;height:300px;object-fit:cover;margin-bottom:30px}\n.slide.split{display:flex;align-items:stretch}\n.slide.split.rev{flex-direction:row-reverse}\n.slide.split .half.txt{flex:0 0 52%;min-width:0;display:flex;flex-direction:column;justify-content:center;padding:80px 60px 80px 76px}\n.slide.split .half.img{flex:0 0 48%;position:relative;overflow:hidden}\n.slide.split .half.img img,.slide.split .half.img .ph{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\n.slide.split h2.title{font-size:40px;margin:14px 0 22px}\n.slide.split .body,.slide.split .body p{max-width:none}\n.slide.split .foot{display:none}\n.slide.trio h2.title{font-size:38px;margin:12px 0 34px}\n.slide .cols{display:grid;grid-template-columns:1fr 1fr 1fr;gap:26px}\n.slide .col img,.slide .col .ph{width:100%;height:250px;object-fit:cover}\n.slide .col h3{font-family:Pressio;font-weight:400;color:var(--gold);text-transform:uppercase;font-size:18px;margin:18px 0 10px;letter-spacing:.5px;line-height:1.05}\n.slide .col p{font-size:12.5px;line-height:1.6;color:#c9c9c9;font-weight:300}\n.slide.gallery h2.title{font-size:36px;margin:12px 0 24px}\n.slide .grid2{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:14px;flex:1}\n.slide .grid2 img,.slide .grid2 .ph{width:100%;height:100%;object-fit:cover;min-height:200px}\n.slide.data h2.title{font-size:46px;margin:14px 0 40px}\n.slide .stats{display:grid;grid-template-columns:1fr 1fr}\n.slide .stat{padding:26px 24px 26px 0;border-top:1px solid var(--line)}\n.slide .stat .big{font-family:Pressio;font-weight:400;color:var(--gold);font-size:58px;line-height:.85}\n.slide .stat .lab{font-size:14px;color:#eee;margin-top:12px;font-weight:400;letter-spacing:.3px}\n.slide .stat .ksub{font-size:12px;color:var(--muted);margin-top:4px}\n.slide .note{margin-top:38px;font-size:15px;line-height:1.7;color:#dcdcdc;font-weight:300;max-width:600px}\n.slide.data .planta{display:block;width:100%;max-height:360px;object-fit:contain;object-position:center;margin:30px auto 0;padding-top:26px;border-top:1px solid var(--line);background:transparent}\n.slide.data .planta.ph{height:300px;background:repeating-linear-gradient(45deg,#121212,#121212 14px,#161616 14px,#161616 28px)}\n.slide.bigstat .pad{align-items:flex-start;justify-content:center}\n.slide.bigstat .big{font-family:Pressio;color:var(--gold);font-size:220px;line-height:.8}\n.slide.bigstat .lab{font-size:24px;color:#fff;margin-top:16px;font-weight:300;letter-spacing:.5px}\n.slide.bigstat .ksub{font-size:15px;color:var(--muted);margin-top:8px}\n.slide.amenities h2.title{font-size:42px;margin:12px 0 30px}\n.slide .amg{display:grid;grid-template-columns:1fr 1fr;gap:2px;background:var(--line)}\n.slide .am{background:var(--paper);padding:24px 22px}\n.slide .am h4{font-family:Pressio;font-weight:400;color:var(--gold);text-transform:uppercase;font-size:17px;margin:0 0 8px;letter-spacing:.5px}\n.slide .am p{font-size:12.5px;line-height:1.6;color:#c4c4c4;font-weight:300;margin:0}\n.slide.quote .pad{justify-content:center}\n.slide.quote .q{font-family:Pressio;font-weight:400;color:#fff;text-transform:uppercase;font-size:46px;line-height:1.05;max-width:640px}\n.slide.quote .q:before{content:'“';color:var(--gold);display:block;font-size:90px;line-height:.4;margin-bottom:20px}\n.slide.quote .au{margin-top:34px;font-size:13px;letter-spacing:3px;text-transform:uppercase;color:var(--muted)}\n.slide.list h2.title{font-size:44px;margin:12px 0 28px}\n.slide .li{display:grid;grid-template-columns:64px 1fr;gap:8px;padding:18px 0;border-top:1px solid var(--line)}\n.slide .li .n{font-family:Pressio;color:var(--gold);font-size:30px;line-height:1}\n.slide .li .lead{font-family:Raleway;font-weight:600;color:#fff;font-size:18px}\n.slide .li .desc{font-size:13.5px;color:#c4c4c4;font-weight:300;line-height:1.6;margin-top:4px}\n.slide.contact .pad{justify-content:center}\n.slide.contact h2.title{font-size:52px;margin-bottom:34px}\n.slide.contact .crow{display:flex;flex-direction:column;gap:20px}\n.slide.contact .ci .cl{font-size:11px;letter-spacing:3px;text-transform:uppercase;color:var(--gold);margin-bottom:5px}\n.slide.contact .ci .cv{font-size:19px;color:#eee;font-weight:300}\n.slide.closing .pad{align-items:center;justify-content:center;text-align:center;gap:32px}\n.slide.closing h2.title{font-size:58px}\n.slide.closing .sub{font-size:14px;color:var(--muted);letter-spacing:4px;font-family:Raleway;text-transform:uppercase}\n.slide.closing .logo{height:130px}\n.slide.chart h2.title{font-size:44px;margin:14px 0 20px}\n.slide .chartwrap{flex:1;display:flex;align-items:center;justify-content:center;min-height:0;width:100%}\n.slide .csvg{width:100%;height:100%;max-height:660px}\n.slide .csvg text{font-family:Raleway,system-ui,sans-serif}\n.slide .csvg .clab{font-size:23px;fill:#eaeaea;font-weight:500}\n.slide .csvg .cval{font-size:22px;fill:#FFB81C;font-weight:700}\n.slide .csvg .cax{font-size:18px;fill:#8a8a8a;font-weight:500}\n.slide .csvg .cgrid{stroke:#2b2b2b;stroke-width:1}\n.slide.chart .note{margin-top:20px}\n\n/* PAISAGEM - opt-in via meta.format = 16x9. Sem a classe .land nada muda. */\n.deck.land .slide,.pdeck.land .slide,.prevbox.land .slide{width:1123px;height:794px}\n.prevbox.land{width:1123px;transform:scale(.32);margin-bottom:-540px}\n.land .slide .pad{padding:54px 68px}\n.land .slide .foot{bottom:26px;left:68px;right:68px;padding-top:11px}\n.land .slide.cover h2.title{font-size:74px}\n.land .slide.cover .rule{margin:20px 0 14px}\n.land .slide.cover .sub{font-size:16px;max-width:620px}\n.land .slide.statement h2.title{font-size:56px;max-width:820px}\n.land .slide.statement .sub{margin-top:22px;max-width:660px}\n.land .slide.section h2.title{font-size:58px;max-width:760px}\n.land .slide.section .ghost{font-size:210px;right:50px;bottom:26px}\n.land .slide.text h2.title{font-size:42px;margin:12px 0 20px;max-width:none}\n.land .slide.text .top-img{height:200px;margin-bottom:22px}\n.land .slide.text .body{column-gap:44px}\n.land .slide.text .body p{max-width:none}\n.land .slide.split .half.txt{padding:54px 52px 54px 68px}\n.land .slide.split h2.title{font-size:38px;margin:12px 0 18px}\n.land .slide.split .body p{font-size:15px;line-height:1.65;margin-bottom:12px}\n.land .slide.trio h2.title{font-size:34px;margin:10px 0 26px}\n.land .slide.trio .cols{gap:24px}\n.land .slide .col img,.land .slide .col .ph{height:190px}\n.land .slide .col h3{font-size:17px;margin:14px 0 8px}\n.land .slide .col p{font-size:12px}\n.land .slide.gallery h2.title{font-size:32px;margin:10px 0 18px}\n.land .slide.data h2.title{font-size:40px;margin:12px 0 24px}\n.land .slide .stat{padding:18px 20px 18px 0}\n.land .slide .stat .big{font-size:46px}\n.land .slide .stat .lab{font-size:13px;margin-top:9px}\n.land .slide .note{margin-top:24px;font-size:14px;max-width:820px}\n.land .slide.data .planta{max-height:230px;margin:20px auto 0;padding-top:18px}\n.land .slide.bigstat .big{font-size:170px}\n.land .slide.bigstat .lab{font-size:21px}\n.land .slide.amenities h2.title{font-size:36px;margin:10px 0 22px}\n.land .slide .amg{grid-template-columns:1fr 1fr 1fr}\n.land .slide .am{padding:18px 18px}\n.land .slide .am h4{font-size:15px}\n.land .slide .am p{font-size:11.5px}\n.land .slide.quote .q{font-size:42px;max-width:860px}\n.land .slide.list h2.title{font-size:38px;margin:10px 0 18px}\n.land .slide .li{padding:12px 0;grid-template-columns:56px 1fr}\n.land .slide .li .n{font-size:26px}\n.land .slide .li .lead{font-size:16px}\n.land .slide .li .desc{font-size:12.5px;margin-top:3px}\n.land .slide.contact h2.title{font-size:44px;margin-bottom:26px}\n.land .slide.contact .crow{display:grid;grid-template-columns:1fr 1fr;gap:20px 40px}\n.land .slide.contact .ci .cv{font-size:17px}\n.land .slide.closing h2.title{font-size:52px}\n.land .slide.closing .logo{height:104px}\n.land .slide.closing .pad{gap:24px}\n.land .slide.chart h2.title{font-size:38px;margin:12px 0 14px}\n.land .slide .csvg{max-height:430px}\n\n/* VIEWER (presentation + print) */\n.viewer{position:absolute;inset:0;background:#161616;overflow:auto;padding:40px 0}\n.viewbar{position:fixed;top:14px;right:18px;z-index:60;display:flex;gap:8px}\n.viewer .deck{display:flex;flex-direction:column;align-items:center;gap:26px}\n.viewer .slide{box-shadow:0 10px 40px #0008}\n@media print{\n  .root.viewing>.top,.root.viewing>.wrap{display:none!important}\n  .viewbar{display:none}\n  .viewer{padding:0;background:#fff;position:static;overflow:visible}\n  .viewer .deck{gap:0}\n  .slide{box-shadow:none;page-break-after:always;break-after:page}\n  @page{size:A4;margin:0}\n}\n`,\n\n  render(d2) {\n    const S = d2.state;\n    if (S.screen === undefined) {\n      let persisted = null;\n      try { persisted = sessionStorage.getItem('deckScreen'); } catch(e){}\n      let authed = false;\n      try { var _a = JSON.parse(localStorage.getItem('tempoAuth')||'null'); authed = !!(_a && _a.user && (Date.now()-(_a.ts||0) < 2592000000) && ((_a.user.role==='admin')||(_a.user.apps && _a.user.apps.indexOf('deck')>=0))); if (authed) S.user = _a.user; } catch(e){}\n      S.screen = (persisted === 'editor' || persisted === 'viewer') ? persisted : 'editor';\n    }\n    try { d2.log('RENDER screen=', S.screen); } catch(e){}\n    const LOGO = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\n\n    const GATE_OVERLAY = (S.screen === 'gate') ? `<div class=\"gate\" id=\"gateOverlay\">\n        <img class=\"logo\" src=\"${LOGO}\">\n        <div class=\"brand\">Tempo &middot; Editor de Deck</div>\n        <div class=\"sub\">Acesso restrito</div>\n        <input id=\"eml\" type=\"email\" placeholder=\"e-mail\" autocomplete=\"username\" value=\"${(S.email||'').replace(/\"/g,'&quot;')}\" style=\"margin-bottom:10px\">\n        <input id=\"pw\" type=\"password\" placeholder=\"senha\" autocomplete=\"off\" value=\"${(S.pw||'').replace(/\"/g,'&quot;')}\">\n        <button id=\"unlock\">Entrar</button>\n        <div class=\"err\">${S.gateErr||''}</div>\n      </div>` : '';\n\n    if (S.screen === 'viewer') {\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGO)).join('');\n      return `<div class=\"root\" data-key=\"screen-viewer\"><div class=\"viewer\">\n        <div class=\"viewbar\">\n          <button class=\"btn g\" id=\"backEdit\">&larr; Editor</button>\n          <button class=\"btn gold\" id=\"doPrint\">Imprimir / PDF</button>\n        </div>\n        <div class=\"deck ${_fmtCls(deck.meta)}\">${html}</div>\n      </div></div>`;\n    }\n\n    // EDITOR\n    const deck = S.deck || {meta:{footer:'TEMPO BY PORSCHE'},slides:[]};\n    if (!Array.isArray(deck.slides)) deck.slides = [];\n    let sel = (S.sel==null)?-1:S.sel;\n    if (sel >= deck.slides.length) sel = deck.slides.length ? 0 : -1;\n    const decks = S.decks || [];\n    const listHtml = (deck.slides||[]).map((s,i)=>`\n      <div class=\"sl ${i===sel?'sel':''}\" data-slide=\"${i}\">\n        <div class=\"ty\">${esc(s.type)}</div><div class=\"tt\">${esc(s.title||s.subtitle||'(sem titulo)')}</div>\n        <div class=\"row\">\n          <button data-move=\"${i}\" data-dir=\"-1\">&uarr;</button>\n          <button data-move=\"${i}\" data-dir=\"1\">&darr;</button>\n          <button data-dup=\"${i}\">&#10697;</button>\n          <button data-del=\"${i}\">&#10005;</button>\n        </div>\n      </div>`).join('') || '<p class=\"hint\">sem slides</p>';\n\n    const options = TYPES.map(([v,l])=>`<option value=\"${v}\">${l}</option>`).join('');\n    let previewHtml = '';\n    try { previewHtml = (sel>=0 && deck.slides[sel]) ? (DeckRenderFoot(deck.meta&&deck.meta.footer), DeckRenderOne(deck.slides[sel],1,LOGO)) : ''; } catch(err){ previewHtml = '<p class=\"hint\">preview indisponivel</p>'; }\n    let formHtml = '<p class=\"hint\">Selecione ou adicione um slide.</p>';\n    try { if (sel>=0 && deck.slides[sel]) formHtml = renderForm(deck.slides[sel]); } catch(err){ formHtml = '<p class=\"hint\">form indisponivel</p>'; }\n\n    return `<div class=\"root\" data-key=\"screen-editor\">\n      ${GATE_OVERLAY}\n      <div class=\"top\">\n        <span class=\"brand\">TEMPO &middot; EDITOR</span>\n        <select id=\"deckSel\">${decks.map(dd=>`<option value=\"${esc(dd.slug)}\" ${dd.slug===S.curDeck?'selected':''}>${esc(dd.nome||dd.slug)}</option>`).join('')}</select>\n        <button class=\"btn\" id=\"newDeck\">+ deck</button>\n        <input class=\"tt\" id=\"metaTitle\" placeholder=\"titulo\" style=\"width:230px\" value=\"${escAttr(deck.meta&&deck.meta.title)}\">\n        <input class=\"tt\" id=\"metaFoot\" placeholder=\"rodape\" style=\"width:170px\" value=\"${escAttr(deck.meta&&deck.meta.footer)}\">\n        <select id=\"metaFmt\" title=\"formato do slide\"><option value=\"a4\" ${_fmtCls(deck.meta)?'':'selected'}>Retrato</option><option value=\"16x9\" ${_fmtCls(deck.meta)?'selected':''}>Paisagem</option></select>\n        <span class=\"sp\"></span>\n        <span class=\"dirty\" id=\"dstate\">${S.dirty?'● nao salvo':(S.savedFlag?'salvo ✓':'')}</span>\n        <button class=\"btn gold\" id=\"saveBtn\">Salvar</button>\n        <button class=\"btn g\" id=\"viewBtn\">Abrir ↗</button>\n        <button class=\"btn g\" id=\"logoutBtn\" title=\"Encerrar sessão\">Sair</button>\n      </div>\n      <div class=\"wrap\">\n        <div class=\"side\">\n          <h3>Slides</h3>\n          <div id=\"list\">${listHtml}</div>\n          <div class=\"addbar\">\n            <select id=\"addType\">${options}</select>\n            <button class=\"btn gold\" id=\"addBtn\">+</button>\n          </div>\n        </div>\n        <div class=\"form\" id=\"form\">${formHtml}</div>\n        <div class=\"prev\"><div class=\"prevbox ${_fmtCls(deck.meta)}\" id=\"prev\">${previewHtml}</div><div class=\"hint\">preview</div></div>\n      </div>\n      <div class=\"galm ${S.galOpen?'on':''}\" id=\"galm\">\n        <div class=\"galbox\">\n          <div class=\"galh\"><span>Galeria do evento &mdash; clique numa foto para inserir</span><button id=\"galClose\">fechar</button></div>\n          <div class=\"gg\" id=\"gg\">${(S.photos||[]).map(p=>{const full=p.full||p,th=p.thumb||full;return `<img loading=\"lazy\" src=\"${escAttr(th)}\" data-full=\"${escAttr(full)}\">`;}).join('')||'<p class=\"hint\">sem fotos</p>'}</div>\n        </div>\n      </div>\n    </div>`;\n  },\n\n  updated(d2, root) {\n    try { if (d2.state._bindGateDirect) d2.state._bindGateDirect(); } catch(e){ d2.log('updated bind err', e); }\n  },\n\n  mounted(d2, root) {\n    const S = d2.state;\n    if (S.screen === undefined) S.screen = 'editor';\n\n    const api = () => d2.rush('deck-api');\n\n    async function loadList() {\n      try {\n        const r = await callApi({ action: 'list' });\n        S.decks = (r && r.decks) || [];\n        paint();\n      } catch (e) { d2.log('list err', e); }\n    }\n    async function loadDeck(slug) {\n      try {\n        const r = await callApi({ action: 'load', slug });\n        const rec = r && r.deck;\n        S.curDeck = slug;\n        if (rec) {\n          S.deck = { meta: safeParse(rec.meta_json, {footer:'TEMPO BY PORSCHE'}), slides: safeParse(rec.slides_json, []) };\n        } else {\n          S.deck = { meta:{footer:'TEMPO BY PORSCHE'}, slides:[] };\n        }\n        S.sel = (S.deck.slides.length>0)?0:-1;\n        S.dirty = false; S.savedFlag = false;\n        paint();\n      } catch (e) { d2.log('load err', e); }\n    }\n    async function loadPhotos() {\n      try {\n        const r = await callApi({ action: 'gallery' });\n        S.photos = (r && r.photos) || [];\n        paint();\n      } catch (e) { d2.log('gallery err', e); }\n    }\n\n    // ---------- IMPERATIVE PAINT ----------\n    // d2.refresh()/morph does NOT re-render in this runtime (proven in the gate bug).\n    // All UI updates are painted imperatively into the existing DOM.\n    const LOGOURL = 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg';\n    async function callApi(payload){\n      try {\n        let r = await api().invoke(payload);\n        if (r && r.data !== undefined) r = r.data;           // rush envelope {data:{...}}\n        if (r && r.response && r.response.data !== undefined) r = r.response.data;\n        if (r && (r.ok !== undefined || r.decks !== undefined || r.photos !== undefined || r.deck !== undefined)) return r;\n        d2.log('rush resposta inesperada', r);\n      } catch(e){ d2.log('rush invoke falhou, tentando fetch', e); }\n      const res = await fetch('https://tempo.data2apis.com/rush/deck-api', { method:'POST', headers:{'content-type':'application/json'}, body: JSON.stringify(payload) });\n      const j = await res.json();\n      return (j && j.data !== undefined) ? j.data : j;\n    }\n    function buildListHtml(){\n      const deck = S.deck || {slides:[]};\n      const slides = deck.slides || [];\n      const sel = (S.sel==null)?-1:S.sel;\n      return slides.map((s,i)=>`\n      <div class=\"sl ${i===sel?'sel':''}\" data-slide=\"${i}\">\n        <div class=\"ty\">${esc(s.type)}</div><div class=\"tt\">${esc(s.title||s.subtitle||'(sem titulo)')}</div>\n        <div class=\"row\">\n          <button data-move=\"${i}\" data-dir=\"-1\">&uarr;</button>\n          <button data-move=\"${i}\" data-dir=\"1\">&darr;</button>\n          <button data-dup=\"${i}\">&#10697;</button>\n          <button data-del=\"${i}\">&#10005;</button>\n        </div>\n      </div>`).join('') || '<p class=\"hint\">sem slides</p>';\n    }\n    function paint(){\n      try {\n        const deck = S.deck || {meta:{},slides:[]};\n        const selEl = d2.$('#deckSel');\n        if (selEl) selEl.innerHTML = (S.decks||[]).map(dd=>`<option value=\"${escAttr(dd.slug)}\" ${dd.slug===S.curDeck?'selected':''}>${esc(dd.nome||dd.slug)}</option>`).join('');\n        const mt = d2.$('#metaTitle'); if (mt) mt.value = (deck.meta && deck.meta.title) || '';\n        const mf = d2.$('#metaFoot'); if (mf) mf.value = (deck.meta && deck.meta.footer) || '';\n        const mfmt = d2.$('#metaFmt'); if (mfmt) mfmt.value = _fmtCls(deck.meta) ? '16x9' : 'a4';\n        const pbx = d2.$('#prev'); if (pbx) pbx.classList.toggle('land', !!_fmtCls(deck.meta));\n        const list = d2.$('#list'); if (list) list.innerHTML = buildListHtml();\n        const form = d2.$('#form');\n        if (form) {\n          let fh = '<p class=\"hint\">Selecione ou adicione um slide.</p>';\n          try { if (S.sel>=0 && deck.slides && deck.slides[S.sel]) fh = renderForm(deck.slides[S.sel]); } catch(e){}\n          form.innerHTML = fh;\n        }\n        refreshPreview();\n        const ds = d2.$('#dstate'); if (ds) ds.textContent = S.dirty?'● nao salvo':(S.savedFlag?'salvo ✓':'');\n        const gm = d2.$('#galm'); if (gm) gm.classList.toggle('on', !!S.galOpen);\n        const gg = d2.$('#gg'); if (gg) gg.innerHTML = (S.photos||[]).map(p=>{const full=p.full||p,th=p.thumb||full;return `<img loading=\"lazy\" src=\"${escAttr(th)}\" data-full=\"${escAttr(full)}\">`;}).join('')||'<p class=\"hint\">sem fotos</p>';\n      } catch(e){ d2.log('paint err', e); }\n    }\n    function showViewer(){\n      const rootEl = d2.$('.root'); if(!rootEl) return;\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGOURL)).join('');\n      const v = document.createElement('div');\n      v.className = 'viewer'; v.id = 'viewerOverlay'; v.style.zIndex = '900';\n      v.innerHTML = `<div class=\"viewbar\"><button class=\"btn g\" id=\"backEdit\">&larr; Editor</button><button class=\"btn gold\" id=\"doPrint\">Imprimir / PDF</button></div><div class=\"deck ${_fmtCls(deck.meta)}\">${html}</div>`;\n      rootEl.appendChild(v);\n      rootEl.classList.add('viewing');\n      const b = v.querySelector('#backEdit'); if (b) b.onclick = () => closeViewer();\n      const p = v.querySelector('#doPrint'); if (p) p.onclick = () => doPrint();\n    }\n    function closeViewer(){\n      const v = d2.$('#viewerOverlay'); if (v) v.remove();\n      const rootEl = d2.$('.root'); if (rootEl) rootEl.classList.remove('viewing');\n    }\n    // Print in a DEDICATED window: escapes the player's clipped layout AND forces\n    // background printing (dark slides would otherwise come out blank).\n    function doPrint(){\n      const deck = S.deck || {meta:{},slides:[]};\n      DeckRenderFoot(deck.meta && deck.meta.footer);\n      const html = (deck.slides||[]).map((s,i)=>DeckRenderOne(s,i+1,LOGOURL)).join('');\n      let css = '';\n      try { const sr = d2.$('.root').getRootNode(); sr.querySelectorAll('style').forEach(st=>{ css += st.textContent; }); } catch(e){}\n      const doc = '<!doctype html><html><head><meta charset=\"utf-8\"><title>' + esc((deck.meta&&deck.meta.title)||'Tempo · Deck') + '</title><style>' + css + `\n        html,body{margin:0;padding:0;background:#fff}\n        /* .root nao existe aqui: redeclara as variaveis da marca no wrapper de print */\n        .pdeck{--gold:#FFB81C;--paper:#0a0a0a;--line:#2b2b2b;--muted:#8a8a8a;--body:#cfcfcf;display:flex;flex-direction:column;align-items:center}\n        .pdeck .slide{page-break-after:always;break-after:page;box-shadow:none;margin:0}\n        /* gradientes rasterizam caro no print: troca por overlay chapado (leve) */\n        .pdeck .slide .scrim{background:rgba(10,10,10,.45)!important}\n        .pdeck .slide.image .scrim{background:rgba(10,10,10,.35)!important}\n        .pdeck .slide .grain{display:none!important}\n        @page{size:A4 ${_fmtCls(deck.meta)?'landscape':''};margin:0}\n        *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}\n      </style></head><body><div class=\"pdeck ${_fmtCls(deck.meta)}\">` + html + '</div><scr' + 'ipt>window.onload=function(){setTimeout(function(){window.print();},800);};</scr' + 'ipt></body></html>';\n      let w = null;\n      try { w = window.open('', '_blank'); } catch(e){}\n      if (w) { w.document.open(); w.document.write(doc); w.document.close(); }\n      else { try { d2.dialog.alert('Habilite pop-ups para exportar o PDF.'); } catch(e){} }\n    }\n    // Native event delegation on the root for DYNAMIC content (list rows, form fields,\n    // gallery buttons) — these nodes don't exist at mount, so d2.on cannot be trusted for them.\n    const hostRoot = d2.$('.root');\n    if (hostRoot && !hostRoot._deleg) {\n      hostRoot._deleg = true;\n      hostRoot.addEventListener('click', (e) => {\n        const t = e.target; if (!t || !t.closest) return;\n        const mv = t.closest('[data-move]'); if (mv) { e.stopPropagation(); move(+mv.dataset.move, +mv.dataset.dir); return; }\n        const dp = t.closest('[data-dup]'); if (dp) { e.stopPropagation(); dup(+dp.dataset.dup); return; }\n        const dl = t.closest('[data-del]'); if (dl) { e.stopPropagation(); (async()=>{ const ok = await d2.dialog.confirm('excluir slide?'); if (ok) del(+dl.dataset.del); })(); return; }\n        const gb = t.closest('.galBtn'); if (gb) { S.pickCtx = gb.dataset.idx!=null ? {k:gb.dataset.k, idx:+gb.dataset.idx, sk:gb.dataset.sk} : {k:gb.dataset.k}; S.galOpen = true; paint(); return; }\n        const ub = t.closest('.upBtn'); if (ub) { S.pickCtx = ub.dataset.idx!=null ? {k:ub.dataset.k, idx:+ub.dataset.idx, sk:ub.dataset.sk} : {k:ub.dataset.k}; doUpload(); return; }\n        const ao = t.closest('.addObjBtn'); if (ao) { addObj(ao.dataset.k); return; }\n        const dob = t.closest('.delObjBtn'); if (dob) { delObj(dob.dataset.k, +dob.dataset.idx); return; }\n        const sl = t.closest('.sl'); if (sl && !t.closest('button')) { selectSlide(+sl.dataset.slide); return; }\n      });\n      hostRoot.addEventListener('input', (e) => {\n        const t = e.target; if (!t || !t.matches) return;\n        if (t.matches('[data-f]')) {\n          const k = t.dataset.f, kind = t.dataset.kind;\n          if (kind === 'bool') return;\n          if (kind === 'strings') setStrings(k, t.value); else setF(k, t.value);\n          return;\n        }\n        if (t.matches('[data-obj]')) setObj(t.dataset.obj, +t.dataset.idx, t.dataset.sk, t.value);\n      });\n      hostRoot.addEventListener('change', (e) => {\n        const t = e.target; if (!t || !t.matches) return;\n        if (t.matches('[data-f]') && t.dataset.kind === 'bool') setF(t.dataset.f, t.checked);\n      });\n    }\n\n    // bootstrap once\n    if (!S._booted) {\n      S._booted = true;\n      loadPhotos();\n      loadList();\n      loadDeck(S.curDeck || 'descritivo');\n    }\n\n    // ---------- GATE ----------\n    d2.on('#eml', 'input', (e, el) => { S.email = el.value; });\n    d2.on('#eml', 'keydown', (e, el) => { if (e.key === 'Enter') { e.preventDefault(); const p=d2.$('#pw'); if(p) p.focus(); } });\n    d2.on('#pw', 'input', (e, el) => { S.pw = el.value; });\n    d2.on('#pw', 'keydown', (e, el) => { if (e.key === 'Enter') { e.preventDefault(); tryUnlock(); } });\n    d2.on('#unlock', 'click', (e) => { if (e && e.preventDefault) e.preventDefault(); tryUnlock(); });\n    function currentPw(){\n      const el = d2.$('#pw');\n      const v = el ? el.value : undefined;\n      return (v != null && v !== '') ? v : (S.pw || '');\n    }\n    async function tryUnlock() {\n      const emEl = d2.$('#eml'); const email = ((emEl && emEl.value)||'').trim();\n      const pw = currentPw();\n      if (!email || !pw) { S.gateErr='informe e-mail e senha'; const e0=d2.$('.err'); if(e0) e0.textContent='informe e-mail e senha'; return; }\n      const eBusy = d2.$('.err'); if (eBusy) eBusy.textContent='entrando…';\n      let ok=false, msg='e-mail ou senha inválidos';\n      try {\n        const r = await d2.rush('auth-login').invoke({ email: email, password: pw });\n        const d = (r && r.data!==undefined) ? r.data : r;\n        ok = !!(d && d.ok); if (d && d.message) msg = d.message; if (ok) { var acc = (d.user.role==='admin')||(d.user.apps && d.user.apps.indexOf('deck')>=0); if (!acc) { ok=false; msg='Sem acesso ao Deck'; } else { S.user = d.user; try { localStorage.setItem('tempoAuth', JSON.stringify({user:d.user, ts:Date.now()})); } catch(e){} } }\n      } catch(e){ d2.log('auth err', e); msg='erro de conexão. tente de novo.'; }\n      if (!ok) {\n        S.gateErr = msg;\n        const errEl = d2.$('.err'); if (errEl) errEl.textContent = msg;\n        return;\n      }\n      S.email = email;\n      // SUCCESS. The CodeHost morph refuses to swap gate->editor via render alone\n      // (render re-runs with screen=editor but the morph keeps the gate subtree).\n      // Escape the framework: flip state, then imperatively remove the stale gate\n      // node so the next render() has nothing to morph against, then force a refresh.\n      S.pw = pw;\n      if (!S.deck) S.deck = { meta:{footer:'TEMPO BY PORSCHE'}, slides:[] };\n      if (S.sel == null) S.sel = -1;\n      S.gateErr = '';\n      S.screen = 'editor';\n      d2.state.screen = 'editor';\n      // The CodeHost morph won't swap gate->editor and d2.refresh() is a no-op here.\n      // Escape the framework: reload the component so it remounts fresh and render()\n      // runs from scratch with screen already 'editor' (persisted below via URL flag).\n      // Escape the morph deterministically: the editor is always in the DOM (behind the\n      // gate overlay); unlocking just removes the overlay node imperatively.\n      try { const g = d2.$('#gateOverlay'); if (g) g.remove(); } catch(e){}\n      paint();\n    }\n    // belt-and-suspenders: bind directly to the shadow-root elements too (in case delegated\n    // click/keydown on the root doesn't reach them). Re-bound each render; guarded against dupes.\n    function bindGateDirect(){\n      if (S.screen !== 'gate') return;\n      const btn = d2.$('#unlock'); const inp = d2.$('#pw');\n      if (btn && !btn._bound){ btn._bound = true; d2.on(btn, 'click', (e)=>{ if(e&&e.preventDefault)e.preventDefault(); tryUnlock(); }); }\n      if (inp && !inp._bound){ inp._bound = true;\n        d2.on(inp, 'input', (e)=>{ S.pw = inp.value; });\n        d2.on(inp, 'keydown', (e)=>{ if (e.key === 'Enter'){ e.preventDefault(); tryUnlock(); } });\n      }\n      const eml = d2.$('#eml');\n      if (eml && !eml._bound){ eml._bound = true;\n        d2.on(eml, 'input', (e)=>{ S.email = eml.value; });\n        d2.on(eml, 'keydown', (e)=>{ if (e.key === 'Enter'){ e.preventDefault(); const p=d2.$('#pw'); if(p) p.focus(); } });\n      }\n    }\n    bindGateDirect();\n    d2.state._bindGateDirect = bindGateDirect;\n\n    // ---------- TOP BAR ----------\n    d2.on('#deckSel', 'change', (e, el) => { loadDeck(el.value); });\n    d2.on('#metaTitle', 'input', (e, el) => { ensureMeta(); S.deck.meta.title = el.value; markDirty(); });\n    d2.on('#metaFoot', 'input', (e, el) => { ensureMeta(); S.deck.meta.footer = el.value; markDirty(); });\n    d2.on('#metaFmt', 'change', (e, el) => { ensureMeta(); S.deck.meta.format = el.value; markDirty(); const pbx = d2.$('#prev'); if (pbx) pbx.classList.toggle('land', el.value !== 'a4'); });\n    d2.on('#newDeck', 'click', async () => {\n      const name = await d2.dialog.prompt('nome do novo deck (sem espacos):', 'novo');\n      if (!name) return;\n      const slug = name.toLowerCase().replace(/[^a-z0-9_-]/g,'-');\n      S.curDeck = slug;\n      S.deck = { meta:{title:name, footer:'TEMPO BY PORSCHE'}, slides:[] };\n      S.sel = -1; markDirty();\n      await save(); await loadList(); paint();\n    });\n    d2.on('#saveBtn', 'click', () => save());\n    d2.on('#viewBtn', 'click', () => { showViewer(); });\n\n    // ---------- VIEWER ----------\n    d2.on('#backEdit', 'click', () => { closeViewer(); });\n    d2.on('#doPrint', 'click', () => doPrint());\n\n    // ---------- SIDEBAR ----------\n    // sidebar: handled by native delegation on .root (see IMPERATIVE PAINT block)\n    d2.on('#addBtn', 'click', () => {\n      const selEl = d2.$('#addType'); addSlide(selEl ? selEl.value : 'cover');\n    });\n\n    // ---------- FORM (delegated) ----------\n    // form + gallery/upload triggers: handled by native delegation on .root (see IMPERATIVE PAINT block)\n\n    // ---------- GALLERY MODAL ----------\n    d2.on('#galClose', 'click', () => { S.galOpen=false; paint(); });\n    d2.on('#galm', 'click', (e, el) => { if (e.target && e.target.id === 'galm') { S.galOpen=false; paint(); } });\n    d2.on('#gg', 'click', (e) => {\n      const img = e.target && e.target.closest('img[data-full]');\n      if (!img) return;\n      applyPhoto(img.dataset.full);\n    });\n\n    // ---------- helpers ----------\n    function ensureMeta(){ if(!S.deck.meta) S.deck.meta = {footer:'TEMPO BY PORSCHE'}; }\n    function markDirty(){ S.dirty=true; S.savedFlag=false; const d=d2.$('#dstate'); if(d) d.textContent='● nao salvo'; refreshPreview(); }\n    function refreshPreview(){\n      const sel = S.sel; const p = d2.$('#prev');\n      if (!p) return;\n      if (sel==null || sel<0 || !S.deck || !S.deck.slides || !S.deck.slides[sel]) { p.innerHTML=''; return; }\n      DeckRenderFoot(S.deck.meta && S.deck.meta.footer);\n      p.innerHTML = DeckRenderOne(S.deck.slides[sel], 1, 'https://tempobyporsche.com/wp-content/uploads/2026/02/logo_tempo_by_porsche_white_V.svg');\n    }\n    function selectSlide(i){ S.sel=i; paint(); }\n    function setF(k,v){ S.deck.slides[S.sel][k]=v; markDirty(); if(k==='title'||k==='subtitle'){ const li=d2.$$('.sl')[S.sel]; if(li){const tt=li.querySelector('.tt'); if(tt) tt.textContent=(S.deck.slides[S.sel].title||S.deck.slides[S.sel].subtitle||'(sem titulo)');} } }\n    function setStrings(k,v){ S.deck.slides[S.sel][k]=v.split(/\\n\\n+/).map(x=>x.trim()).filter(Boolean); markDirty(); }\n    function setObj(k,idx,sk,v){ if(!S.deck.slides[S.sel][k]) S.deck.slides[S.sel][k]=[]; if(!S.deck.slides[S.sel][k][idx]) S.deck.slides[S.sel][k][idx]={}; S.deck.slides[S.sel][k][idx][sk]=v; markDirty(); }\n    function addObj(k){ const s=S.deck.slides[S.sel]; s[k]=s[k]||[]; s[k].push({}); markDirty(); rerenderForm(); }\n    function delObj(k,idx){ S.deck.slides[S.sel][k].splice(idx,1); markDirty(); rerenderForm(); }\n    function rerenderForm(){ const f=d2.$('#form'); if(f && S.sel>=0) f.innerHTML = renderForm(S.deck.slides[S.sel]); }\n    function addSlide(t){ const tpl=TEMPLATES[t]; if(!tpl) return; const s=JSON.parse(JSON.stringify(tpl)); const at=S.sel>=0?S.sel+1:S.deck.slides.length; S.deck.slides.splice(at,0,s); S.sel=at; markDirty(); paint(); }\n    function dup(i){ S.deck.slides.splice(i+1,0,JSON.parse(JSON.stringify(S.deck.slides[i]))); S.sel=i+1; markDirty(); paint(); }\n    function del(i){ S.deck.slides.splice(i,1); S.sel=Math.min(i,S.deck.slides.length-1); markDirty(); paint(); }\n    function move(i,dir){ const j=i+dir; if(j<0||j>=S.deck.slides.length) return; const a=S.deck.slides; const t=a[i]; a[i]=a[j]; a[j]=t; S.sel=j; markDirty(); paint(); }\n    function applyPhoto(u){ const c=S.pickCtx; if(!c) return; if(c.sk!=null){ if(!S.deck.slides[S.sel][c.k]) S.deck.slides[S.sel][c.k]=[]; if(!S.deck.slides[S.sel][c.k][c.idx]) S.deck.slides[S.sel][c.k][c.idx]={}; S.deck.slides[S.sel][c.k][c.idx][c.sk]=u; } else { S.deck.slides[S.sel][c.k]=u; } S.galOpen=false; markDirty(); paint(); }\n\n    async function doUpload(){\n      const input = document.createElement('input');\n      input.type='file'; input.accept='image/*';\n      input.onchange = async () => {\n        const file = input.files && input.files[0]; if(!file) return;\n        try {\n          const out = await d2.drive('deckmedia').uploadFromFiles([file]);\n          const fileUrl = out && out[0] && (out[0].fileUrl || (out[0].params && out[0].params.fileUrl));\n          if(!fileUrl){ await d2.dialog.alert('falha no upload'); return; }\n          await callApi({ action:'upload', full: fileUrl, thumb: fileUrl });\n          applyPhoto(fileUrl);\n          if (S.photos) S.photos.push({ full: fileUrl, thumb: fileUrl });\n        } catch(e){ d2.log('upload err', e); await d2.dialog.alert('falha no upload: '+e); }\n      };\n      input.click();\n    }\n\n    async function save(){\n      ensureMeta();\n      try {\n        const r = await callApi({\n          action:'save', slug: S.curDeck,\n          nome: (S.deck.meta && S.deck.meta.title) || S.curDeck,\n          meta_json: JSON.stringify(S.deck.meta||{}),\n          slides_json: JSON.stringify(S.deck.slides||[]),\n          updated_at: new Date().toISOString()\n        });\n        if (r && r.ok) { S.dirty=false; S.savedFlag=true; const d=d2.$('#dstate'); if(d) d.textContent='salvo ✓'; }\n        else { await d2.dialog.alert('erro ao salvar'); }\n      } catch(e){ d2.log('save err', e); await d2.dialog.alert('erro ao salvar: '+e); }\n    }\n  }\n};\n\n/* ---------------- module-scope helpers ---------------- */\nfunction esc(v){ return String(v==null?'':v).replace(/</g,'&lt;'); }\nfunction escAttr(v){ return String(v==null?'':v).replace(/\"/g,'&quot;'); }\nfunction safeParse(s, fb){ try { return typeof s==='string' ? JSON.parse(s) : (s||fb); } catch(e){ return fb; } }\n\n\n\n\n\nfunction renderForm(s){\n  const defs = FIELDS[s.type]||[];\n  let h = `<h2>${esc(s.type)}</h2>`;\n  defs.forEach(([k,kind,sub])=>{ h += `<div class=\"f\"><label>${LBL[k]||k}</label>${fieldHTML(s,k,kind,sub)}</div>`; });\n  return h;\n}\nfunction fieldHTML(s,k,kind,sub){\n  if(kind==='text') return `<input type=\"text\" data-f=\"${k}\" data-kind=\"text\" value=\"${escAttr(s[k])}\">`;\n  if(kind==='textarea') return `<textarea data-f=\"${k}\" data-kind=\"textarea\">${esc(s[k])}</textarea>`;\n  if(kind==='bool') return `<label style=\"text-transform:none;color:#ccc\"><input type=\"checkbox\" data-f=\"${k}\" data-kind=\"bool\" ${s[k]?'checked':''}> sim</label>`;\n  if(kind==='image') return imgFieldHTML(k, s[k], null, null);\n  if(kind==='strings'){ const arr=s[k]||[]; return `<textarea style=\"min-height:120px\" data-f=\"${k}\" data-kind=\"strings\">${esc(arr.join('\\n\\n'))}</textarea>`; }\n  if(kind==='objs'){ const arr=s[k]||[]; let h='<div class=\"objs\">';\n    arr.forEach((o,idx)=>{ h+=`<div class=\"obj\"><div class=\"oh\"><b>${idx+1}</b><button class=\"mini delObjBtn\" data-k=\"${k}\" data-idx=\"${idx}\">remover</button></div>`;\n      sub.forEach(([sk,skind])=>{ h+=`<div class=\"f\"><label>${LBL[sk]||sk}</label>${objField(k,idx,sk,skind,o)}</div>`; }); h+='</div>'; });\n    h+=`<button class=\"addmini addObjBtn\" data-k=\"${k}\">+ adicionar</button></div>`; return h; }\n  return '';\n}\nfunction objField(k,idx,sk,kind,o){\n  if(kind==='textarea') return `<textarea data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\">${esc(o[sk])}</textarea>`;\n  if(kind==='image') return imgFieldHTML(k, o[sk], idx, sk);\n  return `<input type=\"text\" data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\" value=\"${escAttr(o[sk])}\">`;\n}\nfunction imgFieldHTML(k, val, idx, sk){\n  const objAttrs = (idx!=null) ? `data-obj=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\"` : `data-f=\"${k}\" data-kind=\"text\"`;\n  const ctxAttrs = (idx!=null) ? `data-k=\"${k}\" data-idx=\"${idx}\" data-sk=\"${sk}\"` : `data-k=\"${k}\"`;\n  return `<div class=\"imgf\">\n    <input type=\"text\" ${objAttrs} value=\"${escAttr(val)}\" placeholder=\"url da imagem\">\n    <img src=\"${escAttr(val)}\" onerror=\"this.style.opacity=.2\">\n    <button class=\"mini galBtn\" style=\"color:var(--gold)\" ${ctxAttrs}>galeria</button>\n    <button class=\"mini upBtn\" style=\"color:#9ad\" ${ctxAttrs}>upload</button>\n  </div>`;\n}\n\n/* ---- DeckRender (render.js verbatim logic, logo param'd) ---- */\nfunction DeckRenderFoot(f){ _N = 0; _FOOT = f || 'TEMPO BY PORSCHE'; }\nfunction DeckRenderOne(s, pageNum, LOGO){ _N = (pageNum||1)-1; return _renderSlide(s, LOGO); }\nfunction _renderSlide(s, LOGO){\n  const eS = v => (v==null?'':String(v));\n  const img = (src,cls)=>src?`<img class=\"${cls||''}\" src=\"${eS(src)}\" onerror=\"this.outerHTML='<div class=\\\\'ph ${cls||''}\\\\'>foto: ${eS(src)}</div>'\">`:`<div class=\"ph ${cls||''}\">sem foto</div>`;\n  const foot = ()=>{ _N++; return `<div class=\"foot\"><div class=\"fl\"><img src=\"${LOGO}\">${eS(_FOOT)}</div><div>${String(_N).padStart(2,'0')}</div></div>`; };\n  const kick = (k,num)=>k||num?`<div class=\"kick\">${num?`<span class=\"num\">${eS(num)}</span>`:''}<span class=\"ln\"></span>${eS(k||'')}</div>`:'';\n  const paras = b=>(b||[]).map(p=>`<p>${eS(p)}</p>`).join('');\n  const stats = x=>x.stats||x.kpis||[];\n  const _chartSVG = (s) => {\n    const GOLD='#FFB81C';\n    const enc = v => String(v==null?'':v).replace(/&/g,'&amp;').replace(/</g,'&lt;');\n    const data = (s.data||[]).map(d => ({label:enc(d.label), v:(+d.value||0)}));\n    if(!data.length) return '<div class=\"ph\" style=\"position:relative;height:420px\">grafico sem dados</div>';\n    const ct = s.chartType||'bar';\n    if(ct==='scatter'){\n      const pts=(s.data||[]).map(d=>({label:enc(d.label),x:(+d.x||0),y:(+d.y||0),r:(+d.r||0)}));\n      if(!pts.length) return '<div class=\"ph\" style=\"position:relative;height:420px\">sem dados</div>';\n      const W=1000,H=560,pl=96,pr=56,pt=54,pb=72,iw=W-pl-pr,ih=H-pt-pb;\n      const xmax=Math.max(...pts.map(p=>p.x))*1.10;\n      const yv=pts.map(p=>p.y), ymax=Math.min(100,Math.max(...yv)+6), ymin=Math.max(0,Math.min(...yv)-10);\n      const rmax=Math.max(...pts.map(p=>p.r),1);\n      const fx=v=>pl+v/xmax*iw, fy=v=>pt+ih-(v-ymin)/((ymax-ymin)||1)*ih, fr=v=>9+Math.sqrt(v/rmax)*33;\n      const kfmt=v=>Math.abs(v)>=1000?(v/1000).toLocaleString('pt-BR',{maximumFractionDigits:0})+'k':String(Math.round(v));\n      const med=a=>{const b=a.slice().sort((x,y)=>x-y),m=Math.floor(b.length/2);return b.length%2?b[m]:(b[m-1]+b[m])/2;};\n      const xmid=(s.xmid!=null?+s.xmid:med(pts.map(p=>p.x))), ymid=(s.ymid!=null?+s.ymid:med(pts.map(p=>p.y)));\n      let out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let g=0;g<=4;g++){const yy=ymin+(ymax-ymin)*g/4,py=fy(yy);out+='<line x1=\"'+pl+'\" y1=\"'+py.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+py.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+py.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+Math.round(yy)+(s.suffix||'%')+'</text>';}\n      for(let g=0;g<=4;g++){const xv=xmax*g/4,px=fx(xv);out+='<text x=\"'+px.toFixed(1)+'\" y=\"'+(H-32)+'\" class=\"cax\" text-anchor=\"middle\">'+(s.prefix||'')+kfmt(xv)+'</text>';}\n      out+='<line x1=\"'+fx(xmid).toFixed(1)+'\" y1=\"'+pt+'\" x2=\"'+fx(xmid).toFixed(1)+'\" y2=\"'+(pt+ih)+'\" stroke=\"#3a3a3a\" stroke-width=\"1\" stroke-dasharray=\"5 5\"/>';\n      out+='<line x1=\"'+pl+'\" y1=\"'+fy(ymid).toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+fy(ymid).toFixed(1)+'\" stroke=\"#3a3a3a\" stroke-width=\"1\" stroke-dasharray=\"5 5\"/>';\n      const ql=[[fx(xmax)-6,pt+22,'end','ESTRELAS'],[pl+6,pt+22,'start','ENIGMAS'],[fx(xmax)-6,pt+ih-8,'end','CAVALOS DE BATALHA'],[pl+6,pt+ih-8,'start','REVISAR']];\n      ql.forEach(q=>{out+='<text x=\"'+q[0].toFixed(1)+'\" y=\"'+q[1]+'\" text-anchor=\"'+q[2]+'\" style=\"font-size:15px;fill:#5c5c5c;font-weight:700;letter-spacing:1px\">'+q[3]+'</text>';});\n      pts.forEach(p=>{const cx=fx(p.x),cy=fy(p.y),rr=fr(p.r);out+='<circle cx=\"'+cx.toFixed(1)+'\" cy=\"'+cy.toFixed(1)+'\" r=\"'+rr.toFixed(1)+'\" fill=\"#FFB81C\" fill-opacity=\"0.30\" stroke=\"#FFB81C\" stroke-width=\"2\"/><text x=\"'+cx.toFixed(1)+'\" y=\"'+(cy-rr-6).toFixed(1)+'\" text-anchor=\"middle\" style=\"font-size:19px;fill:#eaeaea;font-weight:600\">'+p.label+'</text>';});\n      out+='<text x=\"'+(pl+iw/2).toFixed(1)+'\" y=\"'+(H-8)+'\" text-anchor=\"middle\" style=\"font-size:16px;fill:#9a9a9a\">'+(s.xlabel||'Faturamento')+'  ·  tamanho da bolha = lucro</text>';\n      out+='<text x=\"24\" y=\"'+(pt+ih/2).toFixed(1)+'\" text-anchor=\"middle\" style=\"font-size:16px;fill:#9a9a9a\" transform=\"rotate(-90 24 '+(pt+ih/2).toFixed(1)+')\">'+(s.ylabel||'Margem')+'</text>';\n      return out+'</svg>';\n    }\n    if(ct==='stackbar'){\n      const COLORS=s.colors||['#B8801A','#FFB81C','#FFE08A'];\n      const series=s.series||[];\n      const dd=(s.data||[]).map(d=>({label:enc(d.label),parts:(d.parts||[]).map(Number)}));\n      const totals=dd.map(d=>d.parts.reduce((a,b)=>a+b,0));\n      const mx=Math.max(1,...totals);\n      const fmtS=v=>{let n=Number(v),t; if(s.compact&&Math.abs(n)>=1000)t=(n/1000).toLocaleString('pt-BR',{maximumFractionDigits:0})+'k'; else t=String(Math.round(n)); return (s.prefix||'')+t+(s.suffix||'');};\n      const W=1000,H=560,pl=82,pr=24,pt=88,pb=64,iw=W-pl-pr,ih=H-pt-pb,n=dd.length,slot=iw/n,bw=Math.min(96,slot*0.5);\n      let out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      let lx=pl; series.forEach((nm,i)=>{out+='<rect x=\"'+lx+'\" y=\"18\" width=\"20\" height=\"20\" rx=\"3\" fill=\"'+COLORS[i%COLORS.length]+'\"/><text x=\"'+(lx+27)+'\" y=\"28\" class=\"cax\" text-anchor=\"start\" dominant-baseline=\"central\" style=\"fill:#ccc\">'+enc(nm)+'</text>'; lx+=70+enc(nm).length*11;});\n      for(let g=0;g<=4;g++){const gy=pt+ih-(g/4*ih);out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmtS(mx*g/4)+'</text>';}\n      dd.forEach((d,i)=>{const cx=pl+slot*i+slot/2; let yTop=pt+ih;\n        d.parts.forEach((v,j)=>{const h=v/mx*ih,y=yTop-h; out+='<rect x=\"'+(cx-bw/2).toFixed(1)+'\" y=\"'+y.toFixed(1)+'\" width=\"'+bw.toFixed(1)+'\" height=\"'+h.toFixed(1)+'\" fill=\"'+COLORS[j%COLORS.length]+'\"/>'; yTop=y;});\n        out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(yTop-12).toFixed(1)+'\" class=\"cval\" text-anchor=\"middle\">'+fmtS(totals[i])+'</text>';\n        out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(H-24)+'\" class=\"cax\" text-anchor=\"middle\">'+d.label+'</text>';});\n      return out+'</svg>';\n    }\n    const max = Math.max(1, ...data.map(d=>d.v));\n    const fmt = v => { let n=Number(v), t;\n      if(s.compact && Math.abs(n)>=1000) t=(n/1000).toLocaleString('pt-BR',{maximumFractionDigits: Math.abs(n)>=10000?0:1})+'k';\n      else t=Math.round(n).toLocaleString('pt-BR');\n      return (s.prefix||'')+t+(s.suffix||''); };\n    const W=1000; let out='';\n    if(ct==='hbar'){\n      const n=data.length, rh=Math.max(46, 520/n), H=n*rh, lw=340, x0=lw+18, bw=W-x0-160;\n      out='<svg viewBox=\"0 0 '+W+' '+H.toFixed(0)+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let i=0;i<n;i++){ const d=data[i], cy=i*rh+rh/2, bh=Math.min(34,rh*0.5), by=cy-bh/2, w=Math.max(2, d.v/max*bw);\n        out+='<text x=\"'+lw+'\" y=\"'+cy.toFixed(1)+'\" class=\"clab\" text-anchor=\"end\" dominant-baseline=\"central\">'+d.label+'</text>';\n        out+='<rect x=\"'+x0+'\" y=\"'+by.toFixed(1)+'\" width=\"'+w.toFixed(1)+'\" height=\"'+bh.toFixed(1)+'\" rx=\"3\" fill=\"'+GOLD+'\"/>';\n        out+='<text x=\"'+(x0+w+12).toFixed(1)+'\" y=\"'+cy.toFixed(1)+'\" class=\"cval\" dominant-baseline=\"central\">'+fmt(d.v)+'</text>'; }\n      return out+'</svg>';\n    }\n    if(ct==='line'){\n      const H=520, pl=82, pr=28, pt=28, pb=52, iw=W-pl-pr, ih=H-pt-pb, n=data.length;\n      const xf=i=> pl + (n<=1? iw/2 : i/(n-1)*iw);\n      const yf=v=> pt + ih - (v/max*ih);\n      out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n      for(let g=0;g<=4;g++){ const gy=pt+ih-(g/4*ih); out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmt(max*g/4)+'</text>'; }\n      let area='M'+xf(0).toFixed(1)+' '+(pt+ih).toFixed(1)+' ', line='';\n      for(let i=0;i<n;i++){ const x=xf(i).toFixed(1), y=yf(data[i].v).toFixed(1); line+=(i?'L':'M')+x+' '+y+' '; area+='L'+x+' '+y+' '; }\n      area+='L'+xf(n-1).toFixed(1)+' '+(pt+ih).toFixed(1)+' Z';\n      out+='<path d=\"'+area+'\" fill=\"'+GOLD+'\" fill-opacity=\"0.12\"/><path d=\"'+line+'\" fill=\"none\" stroke=\"'+GOLD+'\" stroke-width=\"3\" stroke-linejoin=\"round\"/>';\n      const step=Math.ceil(n/9);\n      for(let i=0;i<n;i++){ out+='<circle cx=\"'+xf(i).toFixed(1)+'\" cy=\"'+yf(data[i].v).toFixed(1)+'\" r=\"3.2\" fill=\"'+GOLD+'\"/>'; if(i%step===0||i===n-1) out+='<text x=\"'+xf(i).toFixed(1)+'\" y=\"'+(H-14)+'\" class=\"cax\" text-anchor=\"middle\">'+data[i].label+'</text>'; }\n      return out+'</svg>';\n    }\n    const H=520, pl=82, pr=24, pt=40, pb=60, iw=W-pl-pr, ih=H-pt-pb, n=data.length, slot=iw/n, bw=Math.min(74, slot*0.62);\n    out='<svg viewBox=\"0 0 '+W+' '+H+'\" class=\"csvg\" preserveAspectRatio=\"xMidYMid meet\">';\n    for(let g=0;g<=4;g++){ const gy=pt+ih-(g/4*ih); out+='<line x1=\"'+pl+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(W-pr)+'\" y2=\"'+gy.toFixed(1)+'\" class=\"cgrid\"/><text x=\"'+(pl-12)+'\" y=\"'+gy.toFixed(1)+'\" class=\"cax\" text-anchor=\"end\" dominant-baseline=\"central\">'+fmt(max*g/4)+'</text>'; }\n    for(let i=0;i<n;i++){ const d=data[i], cx=pl+slot*i+slot/2, h=Math.max(1,d.v/max*ih), y=pt+ih-h;\n      out+='<rect x=\"'+(cx-bw/2).toFixed(1)+'\" y=\"'+y.toFixed(1)+'\" width=\"'+bw.toFixed(1)+'\" height=\"'+h.toFixed(1)+'\" rx=\"3\" fill=\"'+GOLD+'\"/>';\n      out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(y-12).toFixed(1)+'\" class=\"cval\" text-anchor=\"middle\">'+fmt(d.v)+'</text>';\n      out+='<text x=\"'+cx.toFixed(1)+'\" y=\"'+(H-22)+'\" class=\"cax\" text-anchor=\"middle\">'+d.label+'</text>'; }\n    return out+'</svg>';\n  };\n\n  const R = {\n    chart:s=>`<div class=\"slide chart\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"chartwrap\">${_chartSVG(s)}</div>${s.note?`<div class=\"note\">${eS(s.note)}</div>`:''}</div>${foot()}</div>`,\n    cover:s=>`<div class=\"slide cover\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\">\n      <div class=\"top\">${s.kicker?kick(s.kicker):'<span></span>'}${s.logo?`<img class=\"logo\" src=\"${LOGO}\">`:''}</div>\n      <div class=\"ttl\"><h2 class=\"title\">${eS(s.title)}</h2><div class=\"rule\"></div>${s.subtitle?`<div class=\"sub\">${eS(s.subtitle)}</div>`:''}</div></div></div>`,\n    statement:s=>`<div class=\"slide statement\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\">\n      ${kick(s.kicker)}<h2 class=\"title\" style=\"margin-top:${s.kicker?'22px':'0'}\">${eS(s.title)}</h2>${s.sub?`<div class=\"sub\">${eS(s.sub)}</div>`:''}</div></div>`,\n    section:s=>`<div class=\"slide section\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div>${s.number?`<div class=\"ghost\">${eS(s.number)}</div>`:''}<div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\" style=\"margin-top:20px\">${eS(s.title)}</h2></div>${foot()}</div>`,\n    text:s=>`<div class=\"slide text\"><div class=\"pad\">${s.image?img(s.image,'top-img'):''}${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"body\">${paras(s.body)}</div></div>${foot()}</div>`,\n    split:s=>`<div class=\"slide split ${s.side==='left'?'rev':''}\"><div class=\"half txt\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2><div class=\"body\">${paras(s.body)}</div></div><div class=\"half img\">${img(s.image)}</div>${foot()}</div>`,\n    trio:s=>`<div class=\"slide trio\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"cols\">${(s.cards||[]).map(c=>`<div class=\"col\">${img(c.image)}<h3>${eS(c.title)}</h3><p>${eS(c.text)}</p></div>`).join('')}</div></div>${foot()}</div>`,\n    gallery:s=>`<div class=\"slide gallery\"><div class=\"pad\">${s.title?`<h2 class=\"title\">${eS(s.title)}</h2>`:''}\n      <div class=\"grid2\">${(s.items||[]).map(it=>img(it.image||it)).join('')}</div></div>${foot()}</div>`,\n    data:s=>`<div class=\"slide data\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"stats\">${stats(s).map(k=>`<div class=\"stat\"><div class=\"big\">${eS(k.big)}</div><div class=\"lab\">${eS(k.label)}</div>${k.sub?`<div class=\"ksub\">${eS(k.sub)}</div>`:''}</div>`).join('')}</div>\n      ${s.note?`<div class=\"note\">${eS(s.note)}</div>`:''}${s.image?img(s.image,'planta'):''}</div>${foot()}</div>`,\n    bigstat:s=>`<div class=\"slide bigstat\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"pad\">${kick(s.kicker)}<div class=\"big\">${eS(s.big)}</div><div class=\"lab\">${eS(s.label)}</div>${s.sub?`<div class=\"ksub\">${eS(s.sub)}</div>`:''}</div>${foot()}</div>`,\n    amenities:s=>`<div class=\"slide amenities\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      <div class=\"amg\">${(s.items||[]).map(it=>`<div class=\"am\"><h4>${eS(it.title)}</h4><p>${eS(it.desc)}</p></div>`).join('')}</div></div>${foot()}</div>`,\n    quote:s=>`<div class=\"slide quote\">${img(s.image,'bg')}<div class=\"scrim\"></div><div class=\"grain\"></div><div class=\"pad\"><div class=\"q\">${eS(s.text)}</div>${s.author?`<div class=\"au\">${eS(s.author)}</div>`:''}</div></div>`,\n    list:s=>`<div class=\"slide list\"><div class=\"pad\">${kick(s.kicker,s.number)}<h2 class=\"title\">${eS(s.title)}</h2>\n      ${(s.items||[]).map((it,i)=>`<div class=\"li\"><div class=\"n\">${String(i+1).padStart(2,'0')}</div><div><div class=\"lead\">${eS(it.lead)}</div><div class=\"desc\">${eS(it.desc)}</div></div></div>`).join('')}</div>${foot()}</div>`,\n    image:s=>`<div class=\"slide image\">${img(s.image,'bg')}<div class=\"scrim\" style=\"background:linear-gradient(0deg,#0a0a0af0,#0a0a0a00 45%)\"></div>${s.caption?`<div class=\"pad\" style=\"justify-content:flex-end\"><div class=\"sub\" style=\"font-size:15px;color:#ddd\">${eS(s.caption)}</div></div>`:''}${foot()}</div>`,\n    contact:s=>`<div class=\"slide contact\">${s.image?img(s.image,'bg'):''}${s.image?'<div class=\"scrim\"></div>':''}<div class=\"pad\">\n      <h2 class=\"title\">${eS(s.title||'CONTATO')}</h2><div class=\"crow\">\n      ${s.address?`<div class=\"ci\"><div class=\"cl\">Endereco</div><div class=\"cv\">${eS(s.address)}</div></div>`:''}\n      ${s.hours?`<div class=\"ci\"><div class=\"cl\">Horario</div><div class=\"cv\">${eS(s.hours)}</div></div>`:''}\n      ${s.email?`<div class=\"ci\"><div class=\"cl\">Contato</div><div class=\"cv\">${eS(s.email)}</div></div>`:''}\n      ${s.site?`<div class=\"ci\"><div class=\"cl\">Site</div><div class=\"cv\">${eS(s.site)}</div></div>`:''}\n      </div></div>${foot()}</div>`,\n    closing:s=>`<div class=\"slide closing\">${img(s.image,'bg')}${s.image?'<div class=\"scrim\"></div>':''}<div class=\"pad\">${s.logo?`<img class=\"logo\" src=\"${LOGO}\">`:''}<h2 class=\"title\">${eS(s.title)}</h2>${s.subtitle?`<div class=\"sub\">${eS(s.subtitle)}</div>`:''}</div></div>`\n  };\n  return (R[s.type]||(x=>`<div class=\"slide\"><div class=\"pad\"><h2 class=\"title\">tipo: ${eS(x.type)}</h2></div></div>`))(s);\n}","at":"2026-08-13T13:56:30.042Z"}}},{"_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}}}}}]}},{"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":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a7dc9573aabf15c02c5d347","component":"data2-core-primitives@Router","system":"6a45d210b5865956b508ba84","displayName":"Deck Router","params":{"routes":[{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"params":{"reference":"rAMokwNexe8bJoWWveODt"},"component":"data2-core-types@InteractiveModuleReference"}}}],"content":{"params":{"reference":"t2mUvQ8yn40-sXaj4LGC1"},"component":"data2-core-types@ArtboardReference"}}}],"login":{"params":{"reference":"aXMg8LSnqXUojJphn5mdO"},"component":"data2-core-types@ArtboardReference"}},"reference":"17oYu6q2Px8FYnWuQ8BNY","deleteMetadata":{}},{"_id":"6a7dca0b537bb58c0466c171","component":"data2-core-primitives@Artboard","system":"6a45d210b5865956b508ba84","displayName":"Tempo Login Screen","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1366,"height":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(10,10,10,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"reference":"aXMg8LSnqXUojJphn5mdO","deleteMetadata":{}},{"_id":"6a45da578c5c69fa78ec75f7","component":"data2-core-primitives@Artboard","system":"6a45d210b5865956b508ba84","displayName":"Deck Editor","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Deck Editor"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":2164,"y":241,"exactX":2163.93,"exactY":240.64}}},"reference":"t2mUvQ8yn40-sXaj4LGC1"},{"_id":"6a7dca16537bb58c0466c172","parent":"6a7dca0b537bb58c0466c171","component":"data2-core-primitives@Block","system":"6a45d210b5865956b508ba84","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":451,"height":366}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":458,"y":203,"exactX":458,"exactY":203.33}}},"deleteMetadata":{}},{"_id":"cc0365cf4c4bb17db0533bfc","parent":"6a45da578c5c69fa78ec75f7","component":"tempo@deck-editor","system":"6a45d210b5865956b508ba84","displayName":"deck-editor","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":1440,"height":900}}}},"reference":"lJh4FUQQu1YJ1ZmhkJn-E"},{"_id":"6a7dca1c537bb58c0466c173","parent":"6a7dca16537bb58c0466c172","component":"data2-core-primitives@Block","system":"6a45d210b5865956b508ba84","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"J73-Yp9CD6EhMzq7WTyMt"}},"positionX":"center","positionY":"center","size":"contain","repeat":"no-repeat"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":228,"height":100,"exactWidth":228,"exactHeight":100.06}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":109,"y":0,"exactX":false,"exactY":false}}},"deleteMetadata":{}},{"_id":"6a7dca66537bb58c0466c174","parent":"6a7dca16537bb58c0466c172","component":"data2-blocks@DataFieldBlock","system":"6a45d210b5865956b508ba84","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"rgba(36,36,36,1)","radius":{"leftTop":5,"rightTop":5,"leftBottom":5,"rightBottom":5},"width":{"left":1,"top":1,"right":1,"bottom":1},"type":"solid"}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(22,22,22,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":44,"exactWidth":225.69,"exactHeight":44}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":113,"y":122,"exactX":113,"exactY":122}},"textColor":{"params":{"rgba":"rgba(255,255,255,1)"},"component":"data2-core-types@Color"}},"dataset":{"params":{"reference":"rAMokwNexe8bJoWWveODt"},"component":"data2-core-types@InteractiveModuleReference"},"field":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"credentials.email"}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":10}},"right":{"component":"data2-core-primitives@Number","params":{"content":10}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"E-mail"}}},"deleteMetadata":{}},{"_id":"6a7dca70537bb58c0466c175","parent":"6a7dca16537bb58c0466c172","component":"data2-blocks@DataFieldBlock","system":"6a45d210b5865956b508ba84","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"rgba(36,36,36,1)","radius":{"leftTop":5,"rightTop":5,"leftBottom":5,"rightBottom":5},"width":{"left":1,"top":1,"right":1,"bottom":1},"type":"solid"}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(22,22,22,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":226,"height":44,"exactWidth":225.69,"exactHeight":44}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":113,"y":196,"exactX":false,"exactY":false}},"textColor":{"params":{"rgba":"rgba(255,255,255,1)"},"component":"data2-core-types@Color"}},"dataset":{"params":{"reference":"rAMokwNexe8bJoWWveODt"},"component":"data2-core-types@InteractiveModuleReference"},"field":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"credentials.password"}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":10}},"right":{"component":"data2-core-primitives@Number","params":{"content":10}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"password"}},"type":"password"},"deleteMetadata":{}},{"_id":"6a7dca75537bb58c0466c176","parent":"6a7dca16537bb58c0466c172","component":"data2-core-primitives@Block","system":"6a45d210b5865956b508ba84","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,184,29,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":110,"height":44,"exactWidth":109.64,"exactHeight":44}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":171,"y":278,"exactX":false,"exactY":false}},"onClick":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"rAMokwNexe8bJoWWveODt"}},"prop":"login"},"component":"data2-core-types@Interaction"},"text":"Login","textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}}},"deleteMetadata":{}}]}},{"_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":"6a7dc95c3aabf15c02c5d348","displayName":"Deck","reference":"67hdQcnqP-kBbMLdZf9p2","params":{"responseHeaders":{"X-Frame-Options":{"params":{"content":""},"component":"data2-core-primitives@String"},"Content-Security-Policy":{"params":{"content":""},"component":"data2-core-primitives@String"},"X-XSS-Protection":{"params":{"content":""},"component":"data2-core-primitives@String"}},"entryPoint":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"17oYu6q2Px8FYnWuQ8BNY"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"deck"}}},"system":"6a45d210b5865956b508ba84","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a7dc94b3aabf15c02c5d346","component":"data2-core@AuthenticationStrategy","system":"6a45d210b5865956b508ba84","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"params":{"reference":"4l0LFU2dVfqFYBWOh5gaz"},"component":"data2-core-types@DataSetReference"},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"email"}},{"component":"data2-core-types@FieldReference","params":{"key":"password"}}]},"reference":"rAMokwNexe8bJoWWveODt","deleteMetadata":{}},{"_id":"6a7dc97a3aabf15c02c5d349","component":"data2-core@DataSet","system":"6a45d210b5865956b508ba84","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"aogrfbWALZcTEvpRgCRSe"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":20}},"reference":"4l0LFU2dVfqFYBWOh5gaz","deleteMetadata":{}},{"_id":"6a7dc9433aabf15c02c5d345","component":"data2-core@Data2TableDataSource","system":"6a45d210b5865956b508ba84","params":{"table":"aogrfbWALZcTEvpRgCRSe","multi":["create"],"super":{},"schema":[{"component":"data2-core-types@Field","params":{"title":"email","key":"email","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"password","key":"password","component":"data2-core-types@Password"}}]},"reference":"aogrfbWALZcTEvpRgCRSe","deleteMetadata":{}}]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}