1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SiteFooter-DLo4eAan.js","assets/sponsored-projects-B8Oj41bx.js","assets/earth-eXQ9J5K9.js","assets/headphones-OltNYcAH.js","assets/mail-B7ssh2v6.js","assets/phone-BEuxaCt0.js","assets/map-pin-CMZxlW4v.js","assets/linkedin-B4DHPo73.js","assets/youtube-C3_oGQ6A.js","assets/instagram-vI_T0tWp.js","assets/twitter-BRsfzm2H.js","assets/StickyCta-C3rn5VVU.js","assets/segment-cta-CHSENPbW.js","assets/InTheWild-D5-wbaQz.js","assets/gala-christian-melissa-C7CbJ1on.js","assets/dialog-DXrW5Hkr.js","assets/index-LQ4Vn129.js","assets/chevron-left-CJPyH8Hi.js","assets/chevron-right-ByzJyc9e.js","assets/zoom-in-Cqgt6bH5.js","assets/rotate-ccw-D5SeRsA_.js","assets/singapore-mti-DQ6SbNiB.js","assets/speaking-podium-BJ8I7fMX.js","assets/TestimonialCarousel-XvdN_nPl.js","assets/InitialsAvatar-MAh43bN_.js","assets/LatestWebinar-DnwpczEw.js","assets/safe-href-BLNcU9sr.js","assets/circle-play-CxHnUCzu.js","assets/Services-DAfNl4rF.js","assets/PageHero-EZf0LIzX.js","assets/LandingFaq-DQ9nglM5.js","assets/landing-faqs-DcxnTAEZ.js","assets/bell-Bb3pRxrp.js","assets/FdaCybersecurityHub-D0Y9nx3z.js","assets/TableOfContents-ERdjg7Vp.js","assets/toc-scroll-430RQ7B5.js","assets/ServiceDetail-C83xG1W5.js","assets/service-landing-BjeWKCcR.js","assets/service-authors-zM2zphCj.js","assets/team-BtaePX5q.js","assets/kristy-kennedy-Csu_SFDx.js","assets/service-standards-CRNdvoG2.js","assets/NotableIncidents-41lm1LV_.js","assets/external-link-vqVjt2sU.js","assets/Breadcrumbs-DEdF4lUI.js","assets/briefcase-DdbVtFI4.js","assets/TaggedTestimonialCard-CTvulpUT.js","assets/check-DPYtEcn6.js","assets/testimonials-DAPicCXV.js","assets/arrow-left-f7NYukZw.js","assets/star-CTs_0qM-.js","assets/ServiceSegmentLanding-5-jpmNtD.js","assets/MtiApac-CFEa_yxZ.js","assets/HubSpotMeetingEmbed-OOoPiSDT.js","assets/mti-apac-readiness-BZpWZn8B.js","assets/mti-apac-content-BUY0jgZJ.js","assets/presentation-D5P_-yf8.js","assets/circle-check-BHM-hq2X.js","assets/calendar-days-B2xOrgJl.js","assets/printer-qsPBNyWu.js","assets/mic-HOaMEu3o.js","assets/MtiApacReadiness-BI28JKyj.js","assets/MtiApacResources-Ct883tJv.js","assets/MtiApacSubPage-BaMIwTwj.js","assets/loader-circle-HtT08UNf.js","assets/MtiApacBudget-BDy7mOfG.js","assets/MtiApacFaq-D-E7-HEP.js","assets/Lp510k-BZBFAfr7.js","assets/AdLanding-pjjOXCsn.js","assets/pathway-compare-Dm-8l5eQ.js","assets/Lp524b-DKtjljQZ.js","assets/LpPmaDeNovo-DOJq0ibA.js","assets/LpDeficiencyLetter-BlRx5_rH.js","assets/LpHoldLetter-vjc1SAHb.js","assets/LpRefuseToAccept-BugM9pRw.js","assets/LpMedDevicePenTest-BK36IQ62.js","assets/LpMedDevicePenTestRequirements-5XVko5Ju.js","assets/LpFdaPenTest-QawlyV--.js","assets/LpFdaPostmarket-9UZ-A703.js","assets/LpPostmarketVulnMgmt-DSqAJQDn.js","assets/LpFdaPremarket-DmtUVioS.js","assets/LpMedicalDeviceCyber-D7ZkhQmh.js","assets/LpFdaCyberConsulting-Cl9tFIVR.js","assets/LpIdeCybersecurity-DlWh-uv4.js","assets/LpVsMedcrypt-BCYDwIzC.js","assets/vs-shared-lxsU4pAr.js","assets/LpVsMedsec-BGvPvvvX.js","assets/LpVsVelentium-Byk48mp1.js","assets/About-CDh9Gqrv.js","assets/pmv-schema-CGyLEvvn.js","assets/PurposeMissionVision-sVE7Pfog.js","assets/GiveBack-DCfC5RCm.js","assets/arrow-up-right-CXP0QiV5.js","assets/CountUp-DLSzIbV9.js","assets/index-BymASqbH.js","assets/string-CFFdVFMV.js","assets/flag-YKLlwCKb.js","assets/Faqs-DNIJewry.js","assets/FdaCybersecurityFaq-B-NT539h.js","assets/Contact-D46p4fEo.js","assets/HubSpotForm-DOxDf-S2.js","assets/message-square-bT1F5WXH.js","assets/Blog-CyT0X8BV.js","assets/seo-truncate-BpIp-ndT.js","assets/post-images-Dt39L7yB.js","assets/PostImage--SCmL9YA.js","assets/responsive-images-5_c0b0bf.js","assets/slug-D72W92Ux.js","assets/BlogTopics-CxMqNmCz.js","assets/topic-hubs-CcDemXN1.js","assets/BlogDetail-5aggfNas.js","assets/ArticleView-DQKo3S8K.js","assets/index-CibJfDnv.js","assets/megaphone-CYSYZOj0.js","assets/SourcesAndReferences-I8zNNRsZ.js","assets/PrecedentWorkflowNav-h-ODVzBF.js","assets/content-body-parse-DTOI5axO.js","assets/og-images-FGLub-er.js","assets/inject-cluster-links-CBzrRLu_.js","assets/article-references-DpYhWF9g.js","assets/article-authors-C4QRX1V4.js","assets/article-jsonld-DXMW_psa.js","assets/Weekly-nuAWg_KP.js","assets/SubscribeForm-C5DdUx_Z.js","assets/rss-BNcIrJe_.js","assets/EditorialStandards-Dm7YkTPP.js","assets/WeeklyIssue-By2aj1j9.js","assets/landmark-BVZ27Z6U.js","assets/calendar-check-rmgmTOvO.js","assets/AdminSeoLogin-C6dvQ2yY.js","assets/label-DJ1_FcNU.js","assets/index-D9Wu8FEU.js","assets/pencil-CdElo4fR.js","assets/WeeklyFeed-SiA9jcA3.js","assets/TerminalToolbar-BwWdOlMO.js","assets/popover-KWq8UVWP.js","assets/weekly-periods-CfV_lRw-.js","assets/FeedItemCard-nRKYxbop.js","assets/feed-content-CAKVgue-.js","assets/purify.es-Csrj9YNg.js","assets/link-2-CYwhRO1E.js","assets/sliders-horizontal-BX8HeOPw.js","assets/LiveTicker-CtSCHNcR.js","assets/minus-S1wNrAod.js","assets/FeedDashboard-TBx2kbZw.js","assets/FeedAccount-Cb1ft746.js","assets/trash-2-D2gxY-Dn.js","assets/plus-Cx7Oq-9g.js","assets/WeeklyDigest-DsA7nAZJ.js","assets/WeeklyItem-D1AJGhKa.js","assets/badge-DOYLG4hE.js","assets/WeeklyTopic-kp07zI0p.js","assets/FeedVendor-BEgW6DWM.js","assets/Methodology-4mZ3Nuv1.js","assets/FeedRiskRubric-BramXtX4.js","assets/Guides-CDLWmXKr.js","assets/GuideDetail-Bkh92Cky.js","assets/section-524b-cross-ref-ld-auYi0uMp.js","assets/regulatory-tracker-wj9HbimU.js","assets/PccpCybersecurityCollection-Buq_G5m1.js","assets/Resources-vQyxLSFF.js","assets/resource-collections-DgFG9Fsy.js","assets/image-D_e3mUYj.js","assets/ResourceCollection-028Rl8p7.js","assets/GiveBackPage-CtILuy3c.js","assets/RelatedLinks-Coe6FqNi.js","assets/CompanyOverview-B9GeCSPJ.js","assets/CategoricalChart-23KbXEba.js","assets/AreaChart-KhZPqGht.js","assets/CartesianGrid-TeIXcoig.js","assets/send-Ddl3mkFt.js","assets/dollar-sign-CgLNhHAC.js","assets/repeat-jlt0xHgu.js","assets/CaseStudies--vCQD2G6.js","assets/Testimonials-B9-d-Vg3.js","assets/Webinars-BWMLuojF.js","assets/useWebinars-BEBQuN4B.js","assets/play-B0EEmp69.js","assets/WebinarDetail-CpzhVj1g.js","assets/podcast-topics-PdTf7Bw4.js","assets/Podcast-mUmlf0Uf.js","assets/use-podcast-episodes-DAW2GZNz.js","assets/all-podcast-episodes-DOxefppK.js","assets/site-bodies-ByEBnAV8.js","assets/podcast-episodes-DfMGI3up.js","assets/podcast-metadata-Cp6acSIn.js","assets/PodcastEpisode-hPJe4wsA.js","assets/podcast-jsonld-7UEcyO0M.js","assets/chevron-up-C6xST6Sr.js","assets/PodcastTopic-djmy6maq.js","assets/News-57IXIcx5.js","assets/useNewsItems-DgT2UCzP.js","assets/news-list-ld-D_Ts19PO.js","assets/useNewsMentions-whdYLB1C.js","assets/in-the-news-BsDItf4x.js","assets/NewsArticle-DWq11MSm.js","assets/keywords-from-text-CeZ-mU_l.js","assets/MedicalDeviceCybersecurityUpdates-DU4R35nw.js","assets/building-2-BKEBJMkA.js","assets/MentionDetail-CKiiZ3I8.js","assets/NewsMentions-BF8FaRFB.js","assets/RegulatoryTracker-Dam5Ead2.js","assets/RegulatoryTrackerEntry-DrvhcSML.js","assets/regulatory-tracker-agencies-DnZLdEY9.js","assets/RegulatoryTrackerAgency-BlXoeG8H.js","assets/Cvd-DXEq9Ac6.js","assets/ExecutiveBriefing--7e3KF2f.js","assets/PrivacyPolicy-AubhNfVE.js","assets/TermsOfService-BEhWma4V.js","assets/CookiePolicy-I_Xp2zY0.js","assets/Accessibility-DBVpslhl.js","assets/FormSubmissionConfirmation-CIJogCYR.js","assets/conversion-fire-CPkvLg0x.js","assets/MeetingConfirmation-Dcunpg3O.js","assets/Search-D2ZgpNXX.js","assets/20-medical-device-protocols-descriptions-purposes-security-flaws-fda-guidance-and-examples-BQAom6mP.js","assets/21-cfr-part-820-and-its-role-in-medical-device-cybersecurity-BGL7VD0V.js","assets/510k-cleared-no-postmarket-cybersecurity-am-i-breaking-the-law-D6gskvm3.js","assets/510k-cybersecurity-deficiencies-that-trigger-fda-holds-C4R4sCB-.js","assets/510k-cybersecurity-requirements-every-maker-must-meet-DrjaI7j3.js","assets/a-comprehe
1nsive-guide-to-risk-based-testing-for-medical-device-software-DWed7Zgt.js","assets/a-comprehensive-guide-to-software-testing-for-medical-devices-CPF4pwmA.js","assets/a-critical-alert-the-top-10-most-vulnerable-medical-devices-to-cyber-attacks-DjvB7JE3.js","assets/a-guide-to-conducting-a-medical-device-security-audit-for-manufacturers-BqG7oYyl.js","assets/a-guide-to-fdas-cybersecurity-documentation-requirements-B2P1whzJ.js","assets/a-new-era-for-quality-and-safety-what-the-fdas-qmsr-means-for-cybersecurity-0lWYkxgb.js","assets/a-step-by-step-guide-to-threat-modeling-connected-and-implantable-medical-devices-CeKd0pAK.js","assets/aami-tir57-vs-tir97-vs-sw96-medical-device-cybersecurity-BSx4bw5F.js","assets/abuse-and-misuse-cases-testing-medical-devices-with-malformed-and-unexpected-inputs-fI1RxvwK.js","assets/ai-overfitting-cybersecurity-threats-in-medical-devices-CK1omalq.js","assets/ai-penetration-testing-medical-devices-fda-limits-CRkcDTNq.js","assets/augmented-reality-ar-medical-device-cybersecurity-risks-D-HMpawz.js","assets/ble-rf-penetration-testing-medical-device-case-study-BfQOUFYn.js","assets/bluetooth-in-medical-devices-understanding-the-risks-and-protecting-patient-safety-DBJSnkVd.js","assets/brainjacking-cyber-physical-threat-neurotech-C-xaiZqn.js","assets/can-bus-canopen-medical-device-vulnerabilities-D1NeSw-X.js","assets/capa-medical-device-cybersecurity-Bt10-vVH.js","assets/cia-triad-vs-nsa-controls-in-medical-device-cybersecurity-D9P_XXk0.js","assets/cicd-security-gates-medical-devices-spdf-Bi9sOlWb.js","assets/cisa-kev-catalog-medical-devices-CTolViWm.js","assets/clia-high-complexity-lab-cybersecurity-hipaa-part-11-CgLJ8Xqq.js","assets/closed-box-testing-in-medical-device-cybersecurity-DRhTakNv.js","assets/code-data-and-execution-integrity-security-controls-and-medical-device-cybersecurity-B2e-D5RR.js","assets/comparing-dread-stride-and-pasta-threat-models-which-is-most-effective-BHj2Hq6N.js","assets/conducting-a-comprehensive-medical-device-inventory-for-enhanced-cybersecurity-CspBlPud.js","assets/corrective-and-preventive-actions-capa-in-medical-device-cybersecurity-BOyc_kg4.js","assets/cost-of-medical-device-penetration-testing-BCLpx242.js","assets/cracking-the-code-insider-cybersecurity-insights-for-medical-device-premarket-success-CzucKtjW.js","assets/cvss-3-1-vs-4-0-medical-devices-0tZWTaPo.js","assets/cvss-scoring-medical-devices-DKgqskxV.js","assets/cybersecurity-as-a-competitive-edge-in-medtech-CbuW_9x7.js","assets/cybersecurity-attack-entry-points-for-medical-devices-C6MDP4DP.js","assets/cybersecurity-before-mvp-vs-after-market-fit-cost-of-waiting-DnhwJ0cb.js","assets/cybersecurity-for-medical-devices-with-narrowband-iot-protocol-CnOZDCW3.js","assets/cybersecurity-in-the-coap-medical-device-protocol-Cg2CqmYF.js","assets/cybersecurity-measures-and-metrics-for-medical-devices-navigating-fda-compliance-BWmslv3k.js","assets/cybersecurity-practices-for-protecting-medical-devices-manufacturers-checklist-ZA6dcJsR.js","assets/cybersecurity-qms-documentation-medtech-Dyc5Dufg.js","assets/cybersecurity-risk-with-ivd-medical-devices-Ba0eKAyR.js","assets/cybersecurity-risks-of-legacy-medical-devices-in-hospitals-BJEuuanA.js","assets/cybersecurity-with-rtos-gIGnFWH6.js","assets/dast-vs-penetration-testing-fda-medical-devices-BERYJ3U5.js","assets/data-flow-diagrams-medical-device-cybersecurity-DmVZu9Pc.js","assets/de-identification-vs-anonymization-medical-devices-hipaa-gdpr-DsWqOW4k.js","assets/de-novo-cybersecurity-requirements-CW1Klpic.js","assets/de-novo-requests-for-medical-devices-explained-DbYradQ3.js","assets/debunking-the-top-5-medical-device-cybersecurity-myths-holding-back-innovation-DJG-L8Sp.js","assets/dfmea-medical-devices-iso-14971-cybersecurity-Cp0BRnKR.js","assets/did-aami-sw96-replace-tir57-fda-2026-B1gYTnTc.js","assets/docker-containers-medical-devices-fda-testing-D1_V6qO6.js","assets/documenting-update-cadence-fda-524b-submission-BYmJGEdd.js","assets/does-fda-section-524b-apply-to-legacy-medical-devices-C98zNaWG.js","assets/does-fda-section-524b-apply-to-my-auto-injector-BEwKXNQa.js","assets/ehr-emr-medical-device-integration-cybersecurity-risks-DYMUoUKm.js","assets/embedded-cybersecurity-challenges-DmFM4CVj.js","assets/emerging-technologies-and-their-impact-on-medical-device-cybersecurity-Tsilje-F.js","assets/enhancing-cybersecurity-for-ant-ant-medical-devices-60PDu2xb.js","assets/enhancing-medical-device-cybersecurity-robustness-and-fuzz-testing-explained-VMFrXk8R.js","assets/enhancing-medical-device-cybersecurity-the-role-of-sbom-and-sast-in-complying-with-fda-guidelines-P3DW06iI.js","assets/enhancing-medical-device-security-tamper-proof-seals-and-cybersecurity-labeling-ByplaUyg.js","assets/estar-cybersecurity-ivd-vs-nivd-submissions-C1fEqD2M.js","assets/examining-medradio-vulnerabilities-in-medical-devices-cybersecurity-C2VqjMdo.js","assets/examples-of-hacked-medical-devices-CdBlw_AP.js","assets/exploring-system-on-a-chip-soc-vulnerabilities-CcbAcgAR.js","assets/exploring-the-contrast-between-threat-trees-and-attack-trees-in-medical-device-fda-approval-and-cybersecurity-Dz17NY_2.js","assets/fda-483-cybersecurity-observations-qmsr-CGwNJKcj.js","assets/fda-ai-cybersecurity-threats-524b-medical-devices-BgWbPjan.js","assets/fda-breakthrough-device-designation-cybersecurity-DuySK7JC.js","assets/fda-cybersecurity-failure-consequences-medical-devices-DZqBNuaQ.js","assets/fda-cybersecurity-major-vs-minor-deficie
1ncy-CYb71HDl.js","assets/fda-cybersecurity-requirements-by-device-class-BVqsqFvH.js","assets/fda-deficiency-letter-vs-rta-vs-hold-letter-B06V4azj.js","assets/fda-ide-cybersecurity-requirements-O9VRY2vn.js","assets/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization-0rT742QV.js","assets/fda-medical-device-submission-costs-explained-510k-pma-and-more-2025-guide-BkbORfN_.js","assets/fda-pen-test-timing-submission-QQnQ0zNL.js","assets/fda-penetration-testing-requirements-medical-devices-DezbJ3J-.js","assets/fda-section-524b-subsections-explained-BPk98eAt.js","assets/fda-sir-submission-issue-request-cybersecurity-response-BQioyZTz.js","assets/fmea-vs-threat-modeling-medical-devices-BfrxKBJ2.js","assets/from-idea-to-fda-clearance-what-nobody-tells-medtech-founders-Cr3gDeOh.js","assets/fuzz-harness-generation-medical-device-protocols-bzcZyMv-.js","assets/good-manufacturing-practices-gmp-in-medical-devices-ensuring-cybersecurity-compliance-CDLqSfIF.js","assets/gsm-cybersecurity-vulnerabilities-medical-devices-B-wyEylG.js","assets/guide-to-medical-device-cybersecurity-standards-premarket-postmarket-lifecycle-BTGRCHwP.js","assets/h-isac-medical-device-threat-intelligence-sources-pT92LkkZ.js","assets/hacking-dicom-medical-images-DzYxBxd4.js","assets/hardware-hacking-tools-medical-device-cybersecurity-C_A7iuVr.js","assets/health-canada-medical-device-cybersecurity-D757h3x3.js","assets/healthcare-cybersecurity-companies-C6lg2Ql3.js","assets/hhs-405d-medical-device-cybersecurity-Dc-IXaNi.js","assets/hipaa-medical-device-manufacturers-cybersecurity-DOCxW7qb.js","assets/hl7-navigating-the-complexities-of-healthcare-data-exchange-M4EZ6aTH.js","assets/home-use-vs-hospital-device-cybersecurity-BNVsthYB.js","assets/how-can-medical-device-manufacturers-support-operational-cybersecurity-DPzC4F4y.js","assets/how-long-does-fda-cybersecurity-review-take-BOJ5KYNT.js","assets/how-medical-devices-are-designed-with-patient-safety-as-the-priority-DQRg5o7W.js","assets/how-spdf-maps-to-iec-81001-5-1-activities-i2VqXh3e.js","assets/how-to-choose-the-best-medical-device-cybersecurity-company-ykQkjhLx.js","assets/how-to-navigate-the-fda-510k-and-pma-databases-F-L74ZcO.js","assets/how-to-respond-to-an-fda-cybersecurity-ai-request-DeRennz6.js","assets/identifying-vulnerabilities-with-vxworks-DNo2XIPi.js","assets/iec-62304-classes-vs-fda-device-classes-cybersecurity-B3ph30oz.js","assets/iec-80001-1-enhancing-medical-device-cybersecurity-WBWB15SJ.js","assets/iec-81001-5-1-vs-aami-sw96-aF2emZ7_.js","assets/iec-81001-5-1-vs-iec-62304-medical-device-standards-Dhn2xVdp.js","assets/imdrf-for-medical-devices-harmonizing-global-regulations-CHfz8w-i.js","assets/implantable-device-cybersecurity-concerns-DnMJeipD.js","assets/implementing-ssdlc-for-enhanced-medical-device-cybersecurity-3CUnLYZ1.js","assets/indications-for-use-predicates-cybersecurity-510k-scope-BwJNTa7i.js","assets/infusion-pump-cybersecurity-fda-D_AN5OT3.js","assets/integrating-cybersecurity-assessments-into-the-medical-device-lifecycle-CHlCXFBW.js","assets/interoperability-labeling-medical-devices-fda-bkU7gR7m.js","assets/iot-vs-iomt-understanding-the-differences-in-the-internet-of-things-and-internet-of-medical-things-DYgaoPAa.js","assets/ipc-vulnerabilities-medical-devices-C8Kor4ZE.js","assets/iso-13485-and-its-relation-to-medical-device-cybersecurity-zT3u7b1P.js","assets/iso-14971-its-crucial-role-in-medical-device-security-and-connection-with-aami-tir57-DFwyh0BO.js","assets/iso-14971-risk-management-in-medical-device-security-CxjsHQ8z.js","assets/jsp2-vs-spdf-vs-iec-81001-medical-device-framework-choice-DvN-d3jf.js","assets/letter-to-file-vs-new-510k-cybersecurity-changes-DCBsyOCA.js","assets/leveraging-market-intelligence-and-cybersecurity-to-drive-medtech-growth-BqzgVTpE.js","assets/linux-vs-windows-a-security-comparison-CA1MAHwJ.js","assets/lorawan-vulnerabilities-on-medical-device-cybersecurity-8Q6I-BIY.js","assets/m2m-communication-vulnerabilities-in-medical-devices-a-cybersecurity-concern-Yk3S5Vt9.js","assets/managing-connected-medical-devices-a-strategic-approach-Ds2df-0r.js","assets/mdcg-2019-16-and-medical-device-security-CGc8SDn2.js","assets/mdsap-for-medical-devices-simplifying-international-compliance-DEHEGP1R.js","assets/medhacking-and-medjacking-DCZFo_xM.js","assets/medical-device-cybersecurity-a-complete-lifecycle-guide-D1wY3Umh.js","assets/medical-device-cybersecurity-best-practices-Cyr2LpTL.js","assets/medical-device-cybersecurity-cost-hulb6tN8.js","assets/medical-device-cybersecurity-interoperability-concerns-DtFXQ2dK.js","assets/medical-device-cybersecurity-labeling-DZ1x168I.js","assets/medical-device-cybersecurity-risk-analysis-the-fda-playbook-gescV3HY.js","assets/medical-device-cybersecurity-risk-profiles-BW_P41OO.js","assets/medical-device-cybersecurity-the-real-threat-isnt-genius-hackers-its-neglect-Dp3-LlGK.js","assets/medical-device-cybersecurity-traceability-CMuoiL3h.js","assets/medical-device-cybersecurity-with-interconnected-devices-D6pwnqd2.js","assets/medical-device-hazard-analysis-and-critical-control-points-BKvodqYP.js","assets/medical-device-incident-response-plan-fda-CAEMBdV3.js","assets/medical-device-key-exchange-cybersecurity-Bl_MhGNX.js","assets/medical-device-pen-testing-choosing-the-right-provider-DQlFtIxi.js","assets/medical-device-pen-testing-fda-vs-eu-mdr-2026-CFjtIJXi.js","assets/medical-device-safety-vs-security-risks-B0Ig1jjl.js","assets/medical-device-sbom-fda-requirements-and-submission-guide-ByvlG9rn.js","assets/medical-device-software-development-eMWU1CKI.js","assets/medical-device-software-functional-and-non-functional-aspects-explained-D2SkmkZJ.js","assets/medical-device-sql-injection-parameterized-queries-PCCn8GNt.js","assets/medtech-cyber-standards-every-device-team-must-know-CLf-yU_9.js","assets/microkernels-medical-device-cybersecurity-D9lC8--n.js","assets/mining-fda-databases-medical-device-cybersecurity-precedent-B2ZLzsVP.js","assets/mqtt-vulnerabilities-connected-medical-devices-fda-BAX66IQD.js","assets/navigating-the-fdas-18-cybersecurity-deliverables-for-medical-device-submissions-DQdn4SvM.js","assets/navigating-the-intersection-of-jtag-uart-debug-ports-and-fda-compliance-in-medical-device-cybersecurity-BGPRBvyD.js","assets/neurotech-cybersecurity-risks-neurostimulators-eeg-bci-BKXWFWUp.js","assets/nfc-and-medical-device-cybersecurity-26mGUTnB.js","assets/ota-update-vulnerabilities-CZeJrImk.js","assets/pacs-medical-device-vulnerabilities-CHb8uHiH.js","assets/patch-act-only-applies-to-new-medical-devices-leaves-legacy-systems-a-risk-TeRt3ekJ.js","assets/patch-update-mechanism-fda-section-524b-testing-CcOvCDdi.js","assets/pccp-beyond-ai-cybersecurity-firmware-hardware-_i5qqXlB.js","assets/pma-supplement-cybersecurity-changes-C5XPDHjj.js","assets/post-exploitation-frameworks-medical-device-cybersecurity-CkOcTCiD.js","assets/postmarket-cybersecurity-for-medical-devices-the-fda-roadmap-CBlW508-.js","assets/premarket-cybersecurity-deliverables-qms-integration-iso-13485-qmsr-DT4WV_x1.js","assets/preparing-your-estar-510k-cybersecurity-documentation-B-2q_aGf.js","assets/protecting-medical-devices-ai-model-evasion-and-cybersecurity-threats-CSOW1B2Q.js","assets/protecting-surgical-robots-the-importance-of-cybersecurity-b8pW34RJ.js","assets/q-day-medical-device-fda-compliance-gap-BgQ2h5sL.js","assets/q-sub-vs-pre-sub-fda-cybersecurity-DeFIK8tC.js","assets/qih-medical-device-vulnerabilities-what-you-need-to-know-Df0jq4O7.js","assets/qih-medical-devices-explained-Ba00x_Kr.js","assets/recalled-medical-devices-cybersecurity-failures-AjD_ngp_.js","assets/rfid-medical-devices-cybersecurity-B0XNb6vn.js","assets/safeguarding-medical-device-ai-combating-data-poisoning-cybersecurity-threats-BxLbePD_.js","assets/samd-vs-simd-what-medical-device-manufacturers-need-to-know-Gt8OVElD.js","assets/sbom-diffing-cve-correlation-postmarket-medical-devices-9j4stbw6.js","assets/sbom-end-of-support-eol-los-fda-section-524b-Cg-IIDMk.js","assets/sbom-third-party-chip-firmware-medical-devices-BpAA1PRV.js","assets/sbom-vs-vex-difference-BG4cqmSq.js","assets/scoping-a-medical-device-penetration-test-B7A2LdE1.js","assets/secure-software-development-for-medical-devices-ensuring-safety-and-compliance-DrTGIlkB.js","assets/secure-update-infrastru
1cture-medical-devices-l5hRItg1.js","assets/securing-communication-protocols-in-medical-devices-KlM1QudA.js","assets/securing-iot-devices-in-healthcare-the-frontline-of-patient-safety-DSTPaIZj.js","assets/securing-iot-enabled-medical-devices-5-essential-tips-BP7ni3-x.js","assets/securing-medical-devices-the-key-to-faster-fda-approval-and-investor-confidence-DuyVAV7y.js","assets/securing-the-total-product-lifecycle-protecting-medical-devices-from-concept-to-disposal-CElw0szc.js","assets/security-architecture-diagrams-medical-device-cybersecurity-DCqaYloC.js","assets/security-requirements-testing-vs-penetration-testing-DvhtMST3.js","assets/spdf-cybersecurity-documentation-what-fda-reviewers-expect-CSQp06tc.js","assets/spdf-iec-62304-mapping-medical-device-cybersecurity-DEcv9sUj.js","assets/spdf-vs-ssdlc-medical-device-cybersecurity-54JcUIHm.js","assets/spdf-vs-tplc-in-medical-device-cybersecurity-L6Y6D98h.js","assets/special-vs-traditional-510k-cybersecurity-changes-BTTzt9a6.js","assets/sweyntooth-exploring-the-bluetooth-vulnerability-CGFF7JYw.js","assets/tara-medical-device-cybersecurity-CSHmF7-y.js","assets/tga-australia-medical-device-cybersecurity-C3pNQKTQ.js","assets/the-dangers-of-pacemaker-hacks-what-you-need-to-know-dGoBp1wX.js","assets/the-fhir-medical-device-protocol-CEaX2Tap.js","assets/the-impact-of-524bb2-on-medical-device-cybersecurity-7v_-mjS3.js","assets/the-impact-of-cybersecurity-abuse-and-misuse-in-medical-devices-ACvGsboM.js","assets/the-importance-of-ble-in-medical-devices-cybersecurity-BPMibzjR.js","assets/the-importance-of-cybersecurity-in-the-medical-device-industry-xpc9gK49.js","assets/the-importance-of-implementing-a-medical-device-qms-CauZbqAM.js","assets/the-importance-of-medical-device-vulnerability-testing-nI2nEsSa.js","assets/the-importance-of-verification-and-validation-in-medical-device-software-C3Ef61_W.js","assets/the-overlooked-threat-in-medtech-innovation-cybersecurity-risks-every-founder-must-address-q4bxsNFW.js","assets/the-relationship-of-iec-81001-5-1-2021-with-medical-device-security-D7Ash4yw.js","assets/the-rising-tide-of-cyber-threats-in-medical-devices-understanding-the-risks-pL4z70zP.js","assets/the-role-of-mds2-in-medical-device-cybersecurity-C4o7LipU.js","assets/the-role-of-ul-2900-in-medical-device-security-D-UJT4AV.js","assets/the-therac-25-incident-a-critical-analysis-of-medical-device-failures-BqwarKUx.js","assets/the-top-50-cybersecurity-issues-with-medical-devices-Dw1z9PNr.js","assets/top-10-embedded-operating-systems-for-medical-devices-CQL834L3.js","assets/top-10-medical-device-vulnerabilities-revealed-protecting-patient-safety-B2NjYeH9.js","assets/top-ble-cybersecurity-vulnerabilities-Da2n_8rR.js","assets/traditional-cybersecurity-vs-medical-device-cybersecurity-B0V5tVFK.js","assets/types-of-510k-traditional-special-abbreviated-cybersecurity-CZxzlEQ8.js","assets/understanding-ai-performance-drift-ensuring-medical-device-safety-Cti3c16b.js","assets/understanding-and-mitigating-the-risks-of-interoperable-medical-devices-CJ6wSF28.js","assets/understanding-binary-software-composition-analysis-with-medical-device-testing-BFXpT6jB.js","assets/understanding-medical-device-ai-model-inversion-cybersecurity-threats-and-solutions-CtistbzP.js","assets/understanding-medical-device-attack-surface-analysis-CxJVRluk.js","assets/understanding-qnx-operating-system-vulnerabilities-risks-and-mitigation-strategies-BkUOcwuG.js","assets/understanding-relevant-threats-for-medical-devices-BVGPKKPP.js","assets/unresolved-anomalies-fda-cybersecurity-submission-CqzH9u-3.js","assets/vex-mistakes-fda-deficiencies-DhqTdqEA.js","assets/vm-escape-medical-device-cybersecurity-DGKEfq3x.js","assets/vulnerabilities-with-dicom-in-medtech-BJyMy4FC.js","assets/vv-regression-testing-medical-device-cybersecurity-ZgD1Jolo.js","assets/what-are-irt-medical-devices-Ch_TQlPV.js","assets/what-is-a-ce-marking-in-med-devices-CQ2lKMAL.js","assets/what-is-a-medical-cyber-device-unraveling-the-fdas-cyber-device-definition-CB5Ag7po.js","assets/what-is-a-modular-pma-submission-CuEw4X1l.js","assets/what-is-a-radiology-information-system-CY1sf5RS.js","assets/what-is-dicom-in-medical-devices-h8Byn8Wo.js","assets/what-is-medical-device-and-health-it-joint-security-plan-jsp-BXep9TW-.js","assets/what-is-pacs-in-medical-devices-rqFoLAxl.js","assets/what-is-software-as-a-medical-device-CF98JNXy.js","assets/what-is-the-center-for-devices-and-radiological-health-cdrh-BgknvMHz.
1js","assets/what-is-the-ivd-regulation-in-medical-device-cybersecurity-CakqN-OX.js","assets/what-triggers-fda-cybersecurity-deficiencies-for-devices-BsohNV3M.js","assets/when-cybersecurity-becomes-a-crime-what-the-illumina-case-signals-for-medical-device-makers-jBOfwjv0.js","assets/when-to-hire-device-security-consultant-vs-build-in-house-5q1Bkn2x.js","assets/when-to-start-medical-device-cybersecurity-CKhZEkOe.js","assets/who-is-center-for-biologics-evaluation-and-research-cber-Bnd0BYqp.js","assets/why-ids-ips-agents-dont-work-for-medical-devices-BIIjJFyC.js","assets/why-iso-27001-and-soc-2-are-not-enough-for-fda-medical-device-cybersecurity-0seCZWWa.js","assets/why-medical-device-cybersecurity-is-nothing-like-enterprise-it-EnxAwcd7.js","assets/windows-laps-for-medical-devices-manage-local-admin-passwords-safely-not-gpp-DemuWPZn.js","assets/wpa2-4-way-handshake-vulnerabilities-what-medical-device-teams-need-to-know-about-wi-fi-risk-CCHONhgC.js","assets/write-blocker-medical-device-cybersecurity-DEDmExiZ.js","assets/zigbee-in-medical-devices-cybersecurity-a-comprehensive-guide-7xCq0KIH.js","assets/unified-glossary-MiPlFvTA.js","assets/standards-glossary-data-WWVvmJXd.js","assets/Why-DTkSaCZA.js","assets/phone-call-DbYUe6ur.js","assets/Segments-DeFIdO7-.js","assets/SegmentDetail-Bv9sVcGn.js","assets/Readiness-BgoLpLjk.js","assets/StickyResultCta-DpTPeKP5.js","assets/RecentRegActivity-Cpf1hDb7.js","assets/progress-DxAorOqC.js","assets/download-DRYtNyt6.js","assets/ScopeEstimator-6qF8-inu.js","assets/FromReadinessBanner-2--eS6m_.js","assets/textarea-BlI22E8L.js","assets/select-DmTbHJXr.js","assets/index-BdQq_4o_.js","assets/index-jmwvnPfJ.js","assets/types-4og3oiYD.js","assets/TestDepthComparison-Cx0vUwf_.js","assets/ToolsHub-BTvX9SJh.js","assets/PccpBuilder-BIpJaqR8.js","assets/Citation-BtJR-WSb.js","assets/checkbox-J1_--hIj.js","assets/Infographics-DJweTjhn.js","assets/CyberDeviceApplicability-CDfNHjt3.js","assets/shareState-C7yInWVO.js","assets/SamdSimdClassifier-D2kOMRjG.js","assets/SbomReadiness-BMhjZB30.js","assets/PolarChart-eZlYnUz5.js","assets/ThreatModelStarter-fGQQSLae.js","assets/catalog-RSh5B_zQ.js","assets/CvdPolicyGenerator-Dz2ake1z.js","assets/copy-Cu4CySdz.js","assets/DeficiencyLetterTriage-DRe8CTyy.js","assets/PostmarketCadenceCalculator-B_7mNEDG.js","assets/EstarCyberChecklist-BG4XX-Mb.js","assets/SbomDiffVex-C-4JMDbF.js","assets/ComponentRiskScorecard-DhITjHb7.js","assets/LegacyComponentTriage-BRB_AXQ0.js","assets/WirelessInterfaceProfiler-BrBXKHU3.js","assets/ControlledRiskClassifier-DtBjPZB3.js","assets/index-De9As-IG.js","assets/circle-DeywPMYR.js","assets/Mds2Generator-Bibf4ybL.js","assets/SpdfGapChecker-BKhzFRVu.js","assets/SubmissionPathwaySelector-BhCwfIPA.js","assets/OtaUpdateQuestionnaire-w92-0AWc.js","assets/SirResponseBuilder-PZlzlYYt.js","assets/tool-pdf-BoFoGe8p.js","assets/PathwayCrosswalk-BMYKhsiz.js","assets/StandardsMapper-DyKweooR.js","assets/AiMlSubmissionTimeline-vhrr1THo.js","assets/cr515-crosswalk-utJiqXsi.js","assets/Cr515Crosswalk-CG948WKH.js","assets/CostOfDelay-gz8wnYBl.js","assets/HubSpotEmbeddedForm-BOM64ZAt.js","assets/Misconceptions-pZDiQrel.js","assets/Partners-DamFDnis.js","assets/SupplierQualification-B4BByvRQ.js","assets/PartnerDetail-CCuTZWR6.js","assets/Ecosystem-DsTxlciV.js","assets/Prep-BnmkWhRq.js","assets/Glossary-BO8sKmFB.js","assets/Leadership-CpZn0aoz.js","assets/ChristianEspinosa-1V6AWDl9.js","assets/podcast-appearances-5DtwVV2l.js","assets/AuthorPage-CvuQBQ1k.js","assets/Awards-Cijojul-.js","assets/awards-BxIWl7D1.js","assets/AboutCoreValues-D72uy9Wp.js","assets/AboutManifesto-TyJOj6OI.js","assets/Journey-CFnoYgeA.js","assets/JourneyHub-VBK-zz7X.js","assets/MonthlyPulse--kajpjF-.js","assets/monthly-pulse-BlfJkvZm.js","assets/MonthlyPulseEdition-Cwqz7XW4.js","assets/Events-DL5r_6zs.js","assets/event-jsonld-BURSjAe7.js","assets/EventsCalendar-CoVx1juw.js","assets/EventDetail-C9XVf3-V.js","assets/Media-CLltvlkR.js","assets/Press-DWUgKAg4.js","assets/Careers-C2ZsYuln.js","assets/careers-Cnt1eljN.js","assets/CareerDetail-BGpClMta.js","assets/CareerApply-Cr2WT22Q.js","assets/CareersFaq-BV3sKoC0.js","assets/Topics-guHagIAD.js","assets/Proof-DM9l66DW.js","assets/TopicHub-BIl1s6oy.js","assets/fda-deficiency-letters-DJqLLUDk.js","assets/AskTheGoat-Dz5D3HGy.js","assets/PlaybooksIndex-Dtt6L4wc.js","assets/playbooks-CH-ubu5O.js","assets/GlobalRegulatoryMap-BTdzU0bg.js","assets/PlaybookDetail-CEdoZ3R7.js","assets/InfographicsIndex-CpOOUDja.js","assets/infographics-8GbGMJZl.js","assets/InfographicDetail-s2C_5nIK.js","assets/RegulatoryStrategy-DLLKNZIk.js","assets/FundingCybersecurity-BJYiVk3V.js","assets/NotFoundLog-D9dIyhNh.js","assets/admin-data-Bp2YBQ9i.js","assets/table-BlzI5q71.js","assets/LinkOpportunities-BeJ5N-f-.js","assets/AdminSeo-Ciy2PIxw.js","assets/useQuery-C6RiDEiT.js","assets/tabs-DirkZzwh.js","assets/LineChart-Xuqv-cG8.js","assets/AdminCrawlHealth-BS1rEwwo.js","assets/AdminFeedHealth-BLWnw7As.js","assets/AdminPodcastTranscripts-PhpRcZUi.js","assets/AdminPodcastSeo-vyNf4C7F.js","assets/AdminRegulatoryTracker-DVgUDXqB.js","assets/AdminApplications-DRfLlqH7.js","assets/AdminHiringFunnel-D5ODsnb1.js","assets/AdminWeekly-bVr-SUlo.js","assets/WeeklyConfirm-D0hDTTuE.js","assets/Unsubscribe-C6Rc6Y7I.js","assets/FdaDeficie
vendor: 7,614 bytes, lines 1-10
1ncyLettersHub-D3xcffxi.js","assets/FdaDeficiencyLetterTopic-D3kQchzV.js","assets/Research-B1yn9HFG.js","assets/research-C7LgTWdW.js","assets/CompareSw96Tir57-ChqVh9Ci.js","assets/QuickAnswer-CDpgR2Bu.js","assets/ComparePathways-C6n6C3t3.js","assets/CompareSpdxCyclonedx-3ESORoG5.js","assets/ComparePage-CwlChnwR.js","assets/life-buoy-DAuuWTCi.js","assets/FdaCybersecurityTimeline-DpKKHoDt.js","assets/FdaCybersecurityAcronyms-BTOjHG1g.js","assets/DeviceClassesCyberRequirements-CTzUXPjI.js","assets/ResearchReport-CYuwj8xb.js","assets/ResearchChart-Cfnrw5wp.js","assets/ResearchPressKit-DN16dhBm.js","assets/ResearchData-BEDcDgJi.js","assets/Goatwatch-61zr7Bnk.js","assets/GoatwatchGuide-C544YZ0H.js","assets/MedicalDeviceCybersecurity-CD7TOQ7Y.js","assets/ThreatGoatPricing-DXDQtyfZ.js","assets/threat-goat-plans-BWpL6xca.js","assets/ThreatGoatSignup-D_L_I8qT.js","assets/SelectedPlanCard-HQmBU_SQ.js","assets/ThreatGoatLogin-pH9ombbx.js","assets/threat-goat-dev-bypass-B74EE8w9.js","assets/ThreatGoatCheckout-C5ndmwWy.js","assets/useThreatGoatSubscription-SfR1G4Mk.js","assets/useThreatGoatAuth-UVRa4K_5.js","assets/ThreatGoatDashboard-DOam8iCK.js","assets/ThreatGoatProjectWorkspace-5fbxwxES.js","assets/RequireThreatGoatAccess-BJryrJrl.js"])))=>i.map(i=>d[i]); 2var rx=Object.defineProperty;var lp=e=>{throw TypeError(e)};var sx=(e,t,i)=>t in e?rx(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i;var xi=(e,t,i)=>sx(e,typeof t!="symbol"?t+"":t,i),Xl=(e,t,i)=>t.has(e)||lp("Cannot "+i);var P=(e,t,i)=>(Xl(e,t,"read from private field"),i?i.call(e):t.get(e)),ce=(e,t,i)=>t.has(e)?lp("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,i),te=(e,t,i,r)=>(Xl(e,t,"write to private field"),r?r.call(e,i):t.set(e,i),i),Ve=(e,t,i)=>(Xl(e,t,"access private method"),i);var ho=(e,t,i,r)=>({set _(s){te(e,t,s,i)},get _(){return P(e,t,r)}});function nx(e,t){for(var i=0;i<t.length;i++){const r=t[i];if(typeof r!="string"&&!Array.isArray(r)){for(const s in r)if(s!=="default"&&!(s in e)){const n=Object.getOwnPropertyDescriptor(r,s);n&&Object.defineProperty(e,s,n.get?n:{enumerable:!0,get:()=>r[s]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const n of s)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function i(s){const n={};return s.integrity&&(n.integrity=s.integrity),s.referrerPolicy&&(n.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?n.credentials="include":s.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function r(s){if(s.ep)return;s.ep=!0;const n=i(s);fetch(s.href,n)}})();var w6=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Va(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var by={exports:{}},ol={},vy={exports:{}},ae={};/** 3 * @license React 4 * react.production.min.js 5 * 6 * Copyright (c) Facebook, Inc. and its affiliates. 7 * 8 * This source code is licensed under the MIT license found in the 9 * LICENSE file in the root directory of this source tree. 10 */var Ga=Symbol.for("react.element"),ax=Symbol.for("react.portal"),ox=Symbol.for("react.fragment"),cx=Symbol.for("react.strict_mode"),lx=Symbol.for("react.profiler"),dx=Symbol.for("react.provider"),ux=Symbol.for("react.context"),hx=Symbol.for("react.forward_ref"),mx=Symbol.for("react.suspense"),px=Symbol.for("react.memo"),gx=Symbol.for("react.lazy"),dp=Symbol.iterator;function fx(e){return e===null||typeof e!="object"?null:(e=dp&&e[dp]||e["@@iterator"],typeof e=="function"?e:null)}var wy={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ky=Object.assign,xy={};function yn(e,t,i){this.props=e,this.context=t,this.refs=xy,this.updater=i||wy}yn.prototype.isReactComponent={};yn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};yn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ay(){}Ay.prototype=yn.prototype;function Dh(e,t,i){this.props=e,this.context=t,this.refs=xy,this.updater=i||wy}var Th=Dh.prototype=new Ay;Th.constructor=Dh;ky(Th,yn.prototype);Th.isPureReactComponent=!0;var up=Array.isArray,Sy=Object.prototype.hasOwnProperty,Eh={current:null},Cy={key:!0,ref:!0,__self:!0,__source:!0};function Dy(e,t,i){var r,s={},n=null,o=null;if(t!=null)for(r in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(n=""+t.key),t)Sy.call(t,r)&&!Cy.hasOwnProperty(r)&&(s[r]=t[r]);var c=arguments.length-2;if(c===1)s.children=i;else if(1<c){for(var l=Array(c),d=0;d<c;d++)l[d]=arguments[d+2];s.children=l}if(e&&e.defaultProps)for(r in c=e.defaultProps,c)s[r]===void 0&&(s[r]=c[r]);return{$$typeof:Ga,type:e,key:n,ref:o,props:s,_owner:Eh.current}}function yx(e,t){return{$$typeof:Ga,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function Ph(e){return typeof e=="object"&&e!==null&&e.$$typeof===Ga}function bx(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(i){return t[i]})}var hp=/\/+/g;function Jl(e,t){return typeof e=="object"&&e!==null&&e.key!=null?bx(""+e.key):t.toString(36)}function Vo(e,t,i,r,s){var n=typeof e;(n==="undefined"||n==="boolean")&&(e=null);var o=!1;if(e===null)o=!0;else switch(n){case"string":case"number":o=!0;break;case"object":switch(e.$$typeof){case Ga:case ax:o=!0}}if(o)return o=e,s=s(o),e=r===""?"."+Jl(o,0):r,up(s)?(i="",e!=null&&(i=e.replace(hp,"$&/")+"/"),Vo(s,t,i,"",function(d){return d})):s!=null&&(Ph(s)&&(s=yx(s,i+(!s.key||o&&o.key===s.key?"":(""+s.key).replace(hp,"$&/")+"/")+e)),t.push(s)),1;if(o=0,r=r===""?".":r+":",up(e))for(var c=0;c<e.length;c++){n=e[c];var l=r+Jl(n,c);o+=Vo(n,t,i,l,s)}else if(l=fx(e),typeof l=="function")for(e=l.call(e),c=0;!(n=e.next()).done;)n=n.value,l=r+Jl(n,c++),o+=Vo(n,t,i,l,s);else if(n==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return o}function mo(e,t,i){if(e==null)return e;var r=[],s=0;return Vo(e,r,"","",function(n){return t.call(i,n,s++)}),r}function vx(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(i){(e._status===0||e._status===-1)&&(e._status=1,e._result=i)},function(i){(e._status===0||e._status===-1)&&(e._status=2,e._result=i)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var it={current:null},Go={transition:null},wx={ReactCurrentDispatcher:it,ReactCurrentBatchConfig:Go,ReactCurrentOwner:Eh};function Ty(){throw Error("act(...) is not supported in production builds of React.")}ae.Children={map:mo,forEach:function(e,t,i){mo(e,function(){t.apply(this,arguments)},i)},count:function(e){var t=0;return mo(e,function(){t++}),t},toArray:function(e){return mo(e,function(t){return t})||[]},only:function(e){if(!Ph(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};ae.Component=yn;ae.Fragment=ox;ae.Profiler=lx;
vendor: 9,063 bytes, lines 10-34
10ae.PureComponent=Dh;ae.StrictMode=cx;ae.Suspense=mx;ae.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=wx;ae.act=Ty;ae.cloneElement=function(e,t,i){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var r=ky({},e.props),s=e.key,n=e.ref,o=e._owner;if(t!=null){if(t.ref!==void 0&&(n=t.ref,o=Eh.current),t.key!==void 0&&(s=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)Sy.call(t,l)&&!Cy.hasOwnProperty(l)&&(r[l]=t[l]===void 0&&c!==void 0?c[l]:t[l])}var l=arguments.length-2;if(l===1)r.children=i;else if(1<l){c=Array(l);for(var d=0;d<l;d++)c[d]=arguments[d+2];r.children=c}return{$$typeof:Ga,type:e.type,key:s,ref:n,props:r,_owner:o}};ae.createContext=function(e){return e={$$typeof:ux,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:dx,_context:e},e.Consumer=e};ae.createElement=Dy;ae.createFactory=function(e){var t=Dy.bind(null,e);return t.type=e,t};ae.createRef=function(){return{current:null}};ae.forwardRef=function(e){return{$$typeof:hx,render:e}};ae.isValidElement=Ph;ae.lazy=function(e){return{$$typeof:gx,_payload:{_status:-1,_result:e},_init:vx}};ae.memo=function(e,t){return{$$typeof:px,type:e,compare:t===void 0?null:t}};ae.startTransition=function(e){var t=Go.transition;Go.transition={};try{e()}finally{Go.transition=t}};ae.unstable_act=Ty;ae.useCallback=function(e,t){return it.current.useCallback(e,t)};ae.useContext=function(e){return it.current.useContext(e)};ae.useDebugValue=function(){};ae.useDeferredValue=function(e){return it.current.useDeferredValue(e)};ae.useEffect=function(e,t){return it.current.useEffect(e,t)};ae.useId=function(){return it.current.useId()};ae.useImperativeHandle=function(e,t,i){return it.current.useImperativeHandle(e,t,i)};ae.useInsertionEffect=function(e,t){return it.current.useInsertionEffect(e,t)};ae.useLayoutEffect=function(e,t){return it.current.useLayoutEffect(e,t)};ae.useMemo=function(e,t){return it.current.useMemo(e,t)};ae.useReducer=function(e,t,i){return it.current.useReducer(e,t,i)};ae.useRef=function(e){return it.current.useRef(e)};ae.useState=function(e){return it.current.useState(e)};ae.useSyncExternalStore=function(e,t,i){return it.current.useSyncExternalStore(e,t,i)};ae.useTransition=function(){return it.current.useTransition()};ae.version="18.3.1";vy.exports=ae;var p=vy.exports;const E=Va(p),_h=nx({__proto__:null,default:E},[p]);/** 11 * @license React 12 * react-jsx-runtime.production.min.js 13 * 14 * Copyright (c) Facebook, Inc. and its affiliates. 15 * 16 * This source code is licensed under the MIT license found in the 17 * LICENSE file in the root directory of this source tree. 18 */var kx=p,xx=Symbol.for("react.element"),Ax=Symbol.for("react.fragment"),Sx=Object.prototype.hasOwnProperty,Cx=kx.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Dx={key:!0,ref:!0,__self:!0,__source:!0};function Ey(e,t,i){var r,s={},n=null,o=null;i!==void 0&&(n=""+i),t.key!==void 0&&(n=""+t.key),t.ref!==void 0&&(o=t.ref);for(r in t)Sx.call(t,r)&&!Dx.hasOwnProperty(r)&&(s[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)s[r]===void 0&&(s[r]=t[r]);return{$$typeof:xx,type:e,key:n,ref:o,props:s,_owner:Cx.current}}ol.Fragment=Ax;ol.jsx=Ey;ol.jsxs=Ey;by.exports=ol;var a=by.exports,Py={exports:{}},wt={},_y={exports:{}},Iy={};/** 19 * @license React 20 * scheduler.production.min.js 21 * 22 * Copyright (c) Facebook, Inc. and its affiliates. 23 * 24 * This source code is licensed under the MIT license found in the 25 * LICENSE file in the root directory of this source tree. 26 */(function(e){function t(_,j){var q=_.length;_.push(j);e:for(;0<q;){var Y=q-1>>>1,G=_[Y];if(0<s(G,j))_[Y]=j,_[q]=G,q=Y;else break e}}function i(_){return _.length===0?null:_[0]}function r(_){if(_.length===0)return null;var j=_[0],q=_.pop();if(q!==j){_[0]=q;e:for(var Y=0,G=_.length,re=G>>>1;Y<re;){var se=2*(Y+1)-1,we=_[se],z=se+1,V=_[z];if(0>s(we,q))z<G&&0>s(V,we)?(_[Y]=V,_[z]=q,Y=z):(_[Y]=we,_[se]=q,Y=se);else if(z<G&&0>s(V,q))_[Y]=V,_[z]=q,Y=z;else break e}}return j}function s(_,j){var q=_.sortIndex-j.sortIndex;return q!==0?q:_.id-j.id}if(typeof performance=="object"&&typeof performance.now=="function"){var n=performance;e.unstable_now=function(){return n.now()}}else{var o=Date,c=o.now();e.unstable_now=function(){return o.now()-c}}var l=[],d=[],u=1,h=null,g=3,m=!1,w=!1,v=!1,k=typeof setTimeout=="function"?setTimeout:null,y=typeof clearTimeout=="function"?clearTimeout:null,f=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function b(_){for(var j=i(d);j!==null;){if(j.callback===null)r(d);else if(j.startTime<=_)r(d),j.sortIndex=j.expirationTime,t(l,j);else break;j=i(d)}}function x(_){if(v=!1,b(_),!w)if(i(l)!==null)w=!0,Q(C);else{var j=i(d);j!==null&&Z(x,j.startTime-_)}}function C(_,j){w=!1,v&&(v=!1,y(I),I=-1),m=!0;var q=g;try{for(b(j),h=i(l);h!==null&&(!(h.expirationTime>j)||_&&!K());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,g=h.priorityLevel;var G=Y(h.expirationTime<=j);j=e.unstable_now(),typeof G=="function"?h.callback=G:h===i(l)&&r(l),b(j)}else r(l);h=i(l)}if(h!==null)var re=!0;else{var se=i(d);se!==null&&Z(x,se.startTime-j),re=!1}return re}finally{h=null,g=q,m=!1}}var D=!1,T=null,I=-1,R=5,F=-1;function K(){return!(e.unstable_now()-F<R)}function N(){if(T!==null){var _=e.unstable_now();F=_;var j=!0;try{j=T(!0,_)}finally{j?J():(D=!1,T=null)}}else D=!1}var J;if(typeof f=="function")J=function(){f(N)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,ne=B.port2;B.port1.onmessage=N,J=function(){ne.postMessage(null)}}else J=function(){k(N,0)};function Q(_){T=_,D||(D=!0,J())}function Z(_,j){I=k(function(){_(e.unstable_now())},j)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(_){_.callback=null},e.unstable_continueExecution=function(){w||m||(w=!0,Q(C))},e.unstable_forceFrameRate=function(_){0>_||125<_?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):R=0<_?Math.floor(1e3/_):5},e.unstable_getCurrentPriorityLevel=function(){return g},e.unstable_getFirstCallbackNode=function(){return i(l)},e.unstable_next=function(_){switch(g){case 1:case 2:case 3:var j=3;break;default:j=g}var q=g;g=j;try{return _()}finally{g=q}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(_,j){switch(_){case 1:case 2:case 3:case 4:case 5:break;default:_=3}var q=g;g=_;try{return j()}finally{g=q}},e.unstable_scheduleCallback=function(_,j,q){var Y=e.unstable_now();switch(typeof q=="object"&&q!==null?(q=q.delay,q=typeof q=="number"&&0<q?Y+q:Y):q=Y,_){case 1:var G=-1;break;case 2:G=250;break;case 5:G=1073741823;break;case 4:G=1e4;break;default:G=5e3}return G=q+G,_={id:u++,callback:j,priorityLevel:_,startTime:q,expirationTime:G,sortIndex:-1},q>Y?(_.sortIndex=q,t(d,_),i(l)===null&&_===i(d)&&(v?(y(I),I=-1):v=!0,Z(x,q-Y))):(_.sortIndex=G,t(l,_),w||m||(w=!0,Q(C))),_},e.unstable_shouldYield=K,e.unstable_wrapCallback=function(_){var j=g;return function(){var q=g;g=j;try{return _.apply(this,arguments)}finally{g=q}}}})(Iy);_y.exports=Iy;var Tx=_y.exports;/** 27 * @license React 28 * react-dom.production.min.js 29 * 30 * Copyright (c) Facebook, Inc. and its affiliates. 31 * 32 * This source code is licensed under the MIT license found in the 33 * LICENSE file in the root directory of this source tree. 34 */var Ex=p,bt=Tx;function O(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,i=1;i<arguments.length;i++)t+="&args[]="+encodeURIComponent(arguments[i]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var jy=new Set,ma={};function os(e,t){on(e,t),on(e+"Capture",t)}function on(e,t){for(ma[e]=t,e=0;e<t.length;e++)jy.add(t[e])}var Oi=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Kd=Object.prototype.hasOwnProperty,Px=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,mp={},pp={};function _x(e){return Kd.call(pp,e)?!0:Kd.call(mp,e)?!1:Px.test(e)?pp[e]=!0:(mp[e]=!0,!1)}function Ix(e,t,i,r){if(i!==null&&i.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:i!==null?!i.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function jx(e,t,i,r){if(t===null||typeof t>"u"||Ix(e,t,i,r))return!0;
vendor: 5,200 bytes, lines 34-35
34if(r)return!1;if(i!==null)switch(i.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function rt(e,t,i,r,s,n,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=s,this.mustUseProperty=i,this.propertyName=e,this.type=t,this.sanitizeURL=n,this.removeEmptyString=o}var $e={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){$e[e]=new rt(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];$e[t]=new rt(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){$e[e]=new rt(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){$e[e]=new rt(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){$e[e]=new rt(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){$e[e]=new rt(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){$e[e]=new rt(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){$e[e]=new rt(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){$e[e]=new rt(e,5,!1,e.toLowerCase(),null,!1,!1)});var Ih=/[\-:]([a-z])/g;function jh(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Ih,jh);$e[t]=new rt(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Ih,jh);$e[t]=new rt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Ih,jh);$e[t]=new rt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){$e[e]=new rt(e,1,!1,e.toLowerCase(),null,!1,!1)});$e.xlinkHref=new rt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){$e[e]=new rt(e,1,!1,e.toLowerCase(),null,!0,!0)});function Mh(e,t,i,r){var s=$e.hasOwnProperty(t)?$e[t]:null;(s!==null?s.type!==0:r||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(jx(t,i,s,r)&&(i=null),r||s===null?_x(t)&&(i===null?e.removeAttribute(t):e.setAttribute(t,""+i)):s.mustUseProperty?e[s.propertyName]=i===null?s.type===3?!1:"":i:(t=s.attributeName,r=s.attributeNamespace,i===null?e.removeAttribute(t):(s=s.type,i=s===3||s===4&&i===!0?"":""+i,r?e.setAttributeNS(r,t,i):e.setAttribute(t,i))))}var qi=Ex.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,po=Symbol.for("react.element"),Ds=Symbol.for("react.portal"),Ts=Symbol.for("react.fragment"),Rh=Symbol.for("react.strict_mode"),Qd=Symbol.for("react.profiler"),My=Symbol.for("react.provider"),Ry=Symbol.for("react.context"),Oh=Symbol.for("react.forward_ref"),Xd=Symbol.for("react.suspense"),Jd=Symbol.for("react.suspense_list"),Fh=Symbol.for("react.memo"),Zi=Symbol.for("react.lazy"),Oy=Symbol.for("react.offscreen"),gp=Symbol.iterator;function In(e){return e===null||typeof e!="object"?null:(e=gp&&e[gp]||e["@@iterator"],typeof e=="function"?e:null)}var Ce=Object.assign,Yl;function Vn(e){if(Yl===void 0)try{throw Error()}catch(i){var t=i.stack.trim().match(/\n( *(at )?)/);Yl=t&&t[1]||""}return` 35`+Yl+e}var Zl=!1;function ed(e,t){if(!e||Zl)return"";Zl=!0;var i=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(d){var r=d}Reflect.construct(e,[],t)}else{try{t.call()}catch(d){r=d}e.call(t.prototype)}else{try{throw Error()}catch(d){r=d}e()}}
vendor: 17,120 bytes, lines 35-38
35catch(d){if(d&&r&&typeof d.stack=="string"){for(var s=d.stack.split(` 36`),n=r.stack.split(` 37`),o=s.length-1,c=n.length-1;1<=o&&0<=c&&s[o]!==n[c];)c--;for(;1<=o&&0<=c;o--,c--)if(s[o]!==n[c]){if(o!==1||c!==1)do if(o--,c--,0>c||s[o]!==n[c]){var l=` 38`+s[o].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}while(1<=o&&0<=c);break}}}finally{Zl=!1,Error.prepareStackTrace=i}return(e=e?e.displayName||e.name:"")?Vn(e):""}function Mx(e){switch(e.tag){case 5:return Vn(e.type);case 16:return Vn("Lazy");case 13:return Vn("Suspense");case 19:return Vn("SuspenseList");case 0:case 2:case 15:return e=ed(e.type,!1),e;case 11:return e=ed(e.type.render,!1),e;case 1:return e=ed(e.type,!0),e;default:return""}}function Yd(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ts:return"Fragment";case Ds:return"Portal";case Qd:return"Profiler";case Rh:return"StrictMode";case Xd:return"Suspense";case Jd:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Ry:return(e.displayName||"Context")+".Consumer";case My:return(e._context.displayName||"Context")+".Provider";case Oh:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Fh:return t=e.displayName||null,t!==null?t:Yd(e.type)||"Memo";case Zi:t=e._payload,e=e._init;try{return Yd(e(t))}catch{}}return null}function Rx(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Yd(t);case 8:return t===Rh?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function xr(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Fy(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ox(e){var t=Fy(e)?"checked":"value",i=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof i<"u"&&typeof i.get=="function"&&typeof i.set=="function"){var s=i.get,n=i.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(o){r=""+o,n.call(this,o)}}),Object.defineProperty(e,t,{enumerable:i.enumerable}),{getValue:function(){return r},setValue:function(o){r=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function go(e){e._valueTracker||(e._valueTracker=Ox(e))}function Ny(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var i=t.getValue(),r="";return e&&(r=Fy(e)?e.checked?"true":"false":e.value),e=r,e!==i?(t.setValue(e),!0):!1}function pc(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Zd(e,t){var i=t.checked;return Ce({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:i??e._wrapperState.initialChecked})}function fp(e,t){var i=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;i=xr(t.value!=null?t.value:i),e._wrapperState={initialChecked:r,initialValue:i,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ly(e,t){t=t.checked,t!=null&&Mh(e,"checked",t,!1)}function eu(e,t){Ly(e,t);var i=xr(t.value),r=t.type;if(i!=null)r==="number"?(i===0&&e.value===""||e.value!=i)&&(e.value=""+i):e.value!==""+i&&(e.value=""+i);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?tu(e,t.type,i):t.hasOwnProperty("defaultValue")&&tu(e,t.type,xr(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function yp(e,t,i){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,i||t===e.value||(e.value=t),e.defaultValue=t}i=e.name,i!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,i!==""&&(e.name=i)}function tu(e,t,i){(t!=="number"||pc(e.ownerDocument)!==e)&&(i==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+i&&(e.defaultValue=""+i))}var Gn=Array.isArray;function Bs(e,t,i,r){if(e=e.options,t){t={};for(var s=0;s<i.length;s++)t["$"+i[s]]=!0;for(i=0;i<e.length;i++)s=t.hasOwnProperty("$"+e[i].value),e[i].selected!==s&&(e[i].selected=s),s&&r&&(e[i].defaultSelected=!0)}else{for(i=""+xr(i),t=null,s=0;s<e.length;s++){if(e[s].value===i){e[s].selected=!0,r&&(e[s].defaultSelected=!0);return}t!==null||e[s].disabled||(t=e[s])}t!==null&&(t.selected=!0)}}function iu(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(O(91));return Ce({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function bp(e,t){var i=t.value;if(i==null){if(i=t.children,t=t.defaultValue,i!=null){if(t!=null)throw Error(O(92));if(Gn(i)){if(1<i.length)throw Error(O(93));i=i[0]}t=i}t==null&&(t=""),i=t}e._wrapperState={initialValue:xr(i)}}function By(e,t){var i=xr(t.value),r=xr(t.defaultValue);i!=null&&(i=""+i,i!==e.value&&(e.value=i),t.defaultValue==null&&e.defaultValue!==i&&(e.defaultValue=i)),r!=null&&(e.defaultValue=""+r)}function vp(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function Uy(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function ru(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?Uy(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var fo,qy=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,i,r,s){MSApp.execUnsafeLocalFunction(function(){return e(t,i,r,s)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(fo=fo||document.createElement("div"),fo.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=fo.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function pa(e,t){if(t){var i=e.firstChild;if(i&&i===e.lastChild&&i.nodeType===3){i.nodeValue=t;return}}e.textContent=t}var Zn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Fx=["Webkit","ms","Moz","O"];Object.keys(Zn).forEach(function(e){Fx.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Zn[t]=Zn[e]})});function zy(e,t,i){return t==null||typeof t=="boolean"||t===""?"":i||typeof t!="number"||t===0||Zn.hasOwnProperty(e)&&Zn[e]?(""+t).trim():t+"px"}function Wy(e,t){e=e.style;for(var i in t)if(t.hasOwnProperty(i)){var r=i.indexOf("--")===0,s=zy(i,t[i],r);i==="float"&&(i="cssFloat"),r?e.setProperty(i,s):e[i]=s}}var Nx=Ce({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function su(e,t){if(t){if(Nx[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(O(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(O(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(O(61))}if(t.style!=null&&typeof t.style!="object")throw Error(O(62))}}function nu(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var au=null;function Nh(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ou=null,Us=null,qs=null;function wp(e){if(e=Xa(e)){if(typeof ou!="function")throw Error(O(280));var t=e.stateNode;t&&(t=hl(t),ou(e.stateNode,e.type,t))}}function $y(e){Us?qs?qs.push(e):qs=[e]:Us=e}function Hy(){if(Us){var e=Us,t=qs;if(qs=Us=null,wp(e),t)for(e=0;e<t.length;e++)wp(t[e])}}function Vy(e,t){return e(t)}function Gy(){}var td=!1;function Ky(e,t,i){if(td)return e(t,i);td=!0;try{return Vy(e,t,i)}finally{td=!1,(Us!==null||qs!==null)&&(Gy(),Hy())}}function ga(e,t){var i=e.stateNode;if(i===null)return null;var r=hl(i);if(r===null)return null;i=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(e=e.type,r=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!r;break e;default:e=!1}if(e)return null;if(i&&typeof i!="function")throw Error(O(231,t,typeof i));return i}var cu=!1;if(Oi)try{var jn={};Object.defineProperty(jn,"passive",{get:function(){cu=!0}}),window.addEventListener("test",jn,jn),window.removeEventListener("test",jn,jn)}catch{cu=!1}function Lx(e,t,i,r,s,n,o,c,l){var d=Array.prototype.slice.call(arguments,3);try{t.apply(i,d)}catch(u){this.onError(u)}}var ea=!1,gc=null,fc=!1,lu=null,Bx={onError:function(e){ea=!0,gc=e}};function Ux(e,t,i,r,s,n,o,c,l){ea=!1,gc=null,Lx.apply(Bx,arguments)}function qx(e,t,i,r,s,n,o,c,l){if(Ux.apply(this,arguments),ea){if(ea){var d=gc;ea=!1,gc=null}else throw Error(O(198));fc||(fc=!0,lu=d)}}function cs(e){var t=e,i=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(i=t.return),e=t.return;while(e)}return t.tag===3?i:null}function Qy(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function kp(e){if(cs(e)!==e)throw Error(O(188))}function zx(e){var t=e.alternate;if(!t){if(t=cs(e),t===null)throw Error(O(188));return t!==e?null:e}for(var i=e,r=t;;){var s=i.return;if(s===null)break;var n=s.alternate;if(n===null){if(r=s.return,r!==null){i=r;continue}break}if(s.child===n.child){for(n=s.child;n;){if(n===i)return kp(s),e;if(n===r)return kp(s),t;n=n.sibling}throw Error(O(188))}if(i.return!==r.return)i=s,r=n;else{for(var o=!1,c=s.child;c;){if(c===i){o=!0,i=s,r=n;break}if(c===r){o=!0,r=s,i=n;break}c=c.sibling}if(!o){for(c=n.child;c;){if(c===i){o=!0,i=n,r=s;break}if(c===r){o=!0,r=n,i=s;break}c=c.sibling}if(!o)throw Error(O(189))}}if(i.alternate!==r)throw Error(O(190))}if(i.tag!==3)throw Error(O(188));return i.stateNode.current===i?e:t}function Xy(e){return e=zx(e),e!==null?Jy(e):null}function Jy(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Jy(e);if(t!==null)return t;e=e.sibling}return null}var Yy=bt.unstable_scheduleCallback,xp=bt.unstable_cancelCallback,Wx=bt.unstable_shouldYield,$x=bt.unstable_requestPaint,Pe=bt.unstable_now,Hx=bt.unstable_getCurrentPriorityLevel,Lh=bt.unstable_ImmediatePriority,Zy=bt.unstable_UserBlockingPriority,yc=bt.unstable_NormalPriority,Vx=bt.unstable_LowPriority,eb=bt.unstable_IdlePriority,cl=null,yi=null;function Gx(e){if(yi&&typeof yi.onCommitFiberRoot=="function")try{yi.onCommitFiberRoot(cl,e,void 0,(e.current.flags&128)===128)}catch{}}var ti=Math.clz32?Math.clz32:Xx,Kx=Math.log,Qx=Math.LN2;function Xx(e){return e>>>=0,e===0?32:31-(Kx(e)/Qx|0)|0}var yo=64,bo=4194304;function Kn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function bc(e,t){var i=e.pendingLanes;if(i===0)return 0;var r=0,s=e.suspendedLanes,n=e.pingedLanes,o=i&268435455;if(o!==0){var c=o&~s;c!==0?r=Kn(c):(n&=o,n!==0&&(r=Kn(n)))}else o=i&~s,o!==0?r=Kn(o):n!==0&&(r=Kn(n));if(r===0)return 0;if(t!==0&&t!==r&&!(t&s)&&(s=r&-r,n=t&-t,s>=n||s===16&&(n&4194240)!==0))return t;if(r&4&&(r|=i&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0<t;)i=31-ti(t),s=1<<i,r|=e[i],t&=~s;return r}function Jx(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Yx(e,t){for(var i=e.suspendedLanes,r=e.pingedLanes,s=e.expirationTimes,n=e.pendingLanes;0<n;){var o=31-ti(n),c=1<<o,l=s[o];l===-1?(!(c&i)||c&r)&&(s[o]=Jx(c,t)):l<=t&&(e.expiredLanes|=c),n&=~c}}function du(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function tb(){var e=yo;return yo<<=1,!(yo&4194240)&&(yo=64),e}function id(e){for(var t=[],i=0;31>i;i++)t.push(e);return t}function Ka(e,t,i){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ti(t),e[t]=i}function Zx(e,t){var i=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<i;){var s=31-ti(i),n=1<<s;t[s]=0,r[s]=-1,e[s]=-1,i&=~n}}function Bh(e,t){var i=e.entangledLanes|=t;for(e=e.entanglements;i;){var r=31-ti(i),s=1<<r;s&t|e[r]&t&&(e[r]|=t),i&=~s}}var le=0;function ib(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}var rb,Uh,sb,nb,ab,uu=!1,vo=[],mr=null,pr=null,gr=null,fa=new Map,ya=new Map,tr=[],eA="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Ap(e,t){switch(e){case"focusin":case"focusout":mr=null;break;case"dragenter":case"dragleave":pr=null;break;case"mouseover":case"mouseout":gr=null;break;case"pointerover":case"pointerout":fa.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ya.delete(t.pointerId)}}function Mn(e,t,i,r,s,n){return e===null||e.nativeEvent!==n?(e={blockedOn:t,domEventName:i,eventSystemFlags:r,nativeEvent:n,targetContainers:[s]},t!==null&&(t=Xa(t),t!==null&&Uh(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,s!==null&&t.indexOf(s)===-1&&t.push(s),e)}function tA(e,t,i,r,s){switch(t){case"focusin":return mr=Mn(mr,e,t,i,r,s),!0;case"dragenter":return pr=Mn(pr,e,t,i,r,s),!0;case"mouseover":return gr=Mn(gr,e,t,i,r,s),!0;case"pointerover":var n=s.pointerId;return fa.set(n,Mn(fa.get(n)||null,e,t,i,r,s)),!0;case"gotpointercapture":return n=s.pointerId,ya.set(n,Mn(ya.get(n)||null,e,t,i,r,s)),!0}return!1}function ob(e){var t=qr(e.target);if(t!==null){var i=cs(t);if(i!==null){if(t=i.tag,t===13){if(t=Qy(i),t!==null){e.blockedOn=t,ab(e.priority,function(){sb(i)});return}}else if(t===3&&i.stateNode.current.memoizedState.isDehydrated){e.blockedOn=i.tag===3?i.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Ko(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var i=hu(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(i===null){i=e.nativeEvent;var r=new i.constructor(i.type,i);au=r,i.target.dispatchEvent(r),au=null}else return t=Xa(i),t!==null&&Uh(t),e.blockedOn=i,!1;t.shift()}return!0}function Sp(e,t,i){Ko(e)&&i.delete(t)}function iA(){uu=!1,mr!==null&&Ko(mr)&&(mr=null),pr!==null&&Ko(pr)&&(pr=null),gr!==null&&Ko(gr)&&(gr=null),fa.forEach(Sp),ya.forEach(Sp)}function Rn(e,t){e.blockedOn===t&&(e.blockedOn=null,uu||(uu=!0,bt.unstable_scheduleCallback(bt.unstable_NormalPriority,iA)))}function ba(e){function t(s){return Rn(s,e)}if(0<vo.length){Rn(vo[0],e);for(var i=1;i<vo.length;i++){var r=vo[i];r.blockedOn===e&&(r.blockedOn=null)}}for(mr!==null&&Rn(mr,e),pr!==null&&Rn(pr,e),gr!==null&&Rn(gr,e),fa.forEach(t),ya.forEac
vendor: 11,458 bytes, line 38
38h(t),i=0;i<tr.length;i++)r=tr[i],r.blockedOn===e&&(r.blockedOn=null);for(;0<tr.length&&(i=tr[0],i.blockedOn===null);)ob(i),i.blockedOn===null&&tr.shift()}var zs=qi.ReactCurrentBatchConfig,vc=!0;function rA(e,t,i,r){var s=le,n=zs.transition;zs.transition=null;try{le=1,qh(e,t,i,r)}finally{le=s,zs.transition=n}}function sA(e,t,i,r){var s=le,n=zs.transition;zs.transition=null;try{le=4,qh(e,t,i,r)}finally{le=s,zs.transition=n}}function qh(e,t,i,r){if(vc){var s=hu(e,t,i,r);if(s===null)hd(e,t,r,wc,i),Ap(e,r);else if(tA(s,e,t,i,r))r.stopPropagation();else if(Ap(e,r),t&4&&-1<eA.indexOf(e)){for(;s!==null;){var n=Xa(s);if(n!==null&&rb(n),n=hu(e,t,i,r),n===null&&hd(e,t,r,wc,i),n===s)break;s=n}s!==null&&r.stopPropagation()}else hd(e,t,r,null,i)}}var wc=null;function hu(e,t,i,r){if(wc=null,e=Nh(r),e=qr(e),e!==null)if(t=cs(e),t===null)e=null;else if(i=t.tag,i===13){if(e=Qy(t),e!==null)return e;e=null}else if(i===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return wc=e,null}function cb(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Hx()){case Lh:return 1;case Zy:return 4;case yc:case Vx:return 16;case eb:return 536870912;default:return 16}default:return 16}}var dr=null,zh=null,Qo=null;function lb(){if(Qo)return Qo;var e,t=zh,i=t.length,r,s="value"in dr?dr.value:dr.textContent,n=s.length;for(e=0;e<i&&t[e]===s[e];e++);var o=i-e;for(r=1;r<=o&&t[i-r]===s[n-r];r++);return Qo=s.slice(e,1<r?1-r:void 0)}function Xo(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function wo(){return!0}function Cp(){return!1}function kt(e){function t(i,r,s,n,o){this._reactName=i,this._targetInst=s,this.type=r,this.nativeEvent=n,this.target=o,this.currentTarget=null;for(var c in e)e.hasOwnProperty(c)&&(i=e[c],this[c]=i?i(n):n[c]);return this.isDefaultPrevented=(n.defaultPrevented!=null?n.defaultPrevented:n.returnValue===!1)?wo:Cp,this.isPropagationStopped=Cp,this}return Ce(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var i=this.nativeEvent;i&&(i.preventDefault?i.preventDefault():typeof i.returnValue!="unknown"&&(i.returnValue=!1),this.isDefaultPrevented=wo)},stopPropagation:function(){var i=this.nativeEvent;i&&(i.stopPropagation?i.stopPropagation():typeof i.cancelBubble!="unknown"&&(i.cancelBubble=!0),this.isPropagationStopped=wo)},persist:function(){},isPersistent:wo}),t}var bn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Wh=kt(bn),Qa=Ce({},bn,{view:0,detail:0}),nA=kt(Qa),rd,sd,On,ll=Ce({},Qa,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:$h,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==On&&(On&&e.type==="mousemove"?(rd=e.screenX-On.screenX,sd=e.screenY-On.screenY):sd=rd=0,On=e),rd)},movementY:function(e){return"movementY"in e?e.movementY:sd}}),Dp=kt(ll),aA=Ce({},ll,{dataTransfer:0}),oA=kt(aA),cA=Ce({},Qa,{relatedTarget:0}),nd=kt(cA),lA=Ce({},bn,{animationName:0,elapsedTime:0,pseudoElement:0}),dA=kt(lA),uA=Ce({},bn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),hA=kt(uA),mA=Ce({},bn,{data:0}),Tp=kt(mA),pA={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},gA={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},fA={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function yA(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=fA[e])?!!t[e]:!1}function $h(){return yA}var bA=Ce({},Qa,{key:function(e){if(e.key){var t=pA[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=Xo(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?gA[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:$h,charCode:function(e){return e.type==="keypress"?Xo(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Xo(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),vA=kt(bA),wA=Ce({},ll,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Ep=kt(wA),kA=Ce({},Qa,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:$h}),xA=kt(kA),AA=Ce({},bn,{propertyName:0,elapsedTime:0,pseudoElement:0}),SA=kt(AA),CA=Ce({},ll,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),DA=kt(CA),TA=[9,13,27,32],Hh=Oi&&"CompositionEvent"in window,ta=null;Oi&&"documentMode"in document&&(ta=document.documentMode);var EA=Oi&&"TextEvent"in window&&!ta,db=Oi&&(!Hh||ta&&8<ta&&11>=ta),Pp=" ",_p=!1;function ub(e,t){switch(e){case"keyup":return TA.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function hb(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Es=!1;function PA(e,t){switch(e){case"compositionend":return hb(t);case"keypress":return t.which!==32?null:(_p=!0,Pp);case"textInput":return e=t.data,e===Pp&&_p?null:e;default:return null}}function _A(e,t){if(Es)return e==="compositionend"||!Hh&&ub(e,t)?(e=lb(),Qo=zh=dr=null,Es=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return db&&t.locale!=="ko"?null:t.data;default:return null}}var IA={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Ip(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!IA[e.type]:t==="textarea"}function mb(e,t,i,r){$y(r),t=kc(t,"onChange"),0<t.length&&(i=new Wh("onChange","change",null,i,r),e.push({event:i,listeners:t}))}var ia=null,va=null;function jA(e){Sb(e,0)}function dl(e){var t=Is(e);if(Ny(t))return e}function MA(e,t){if(e==="change")return t}var pb=!1;if(Oi){var ad;if(Oi){var od="oninput"in document;if(!od){var jp=document.createElement("div");jp.setAttribute("oninput","return;"),od=typeof jp.oninput=="function"}ad=od}else ad=!1;pb=ad&&(!document.documentMode||9<document.documentMode)}function Mp(){ia&&(ia.detachEvent("onpropertychange",gb),va=ia=null)}function gb(e){if(e.propertyName==="value"&&dl(va)){var t=[];mb(t,va,e,Nh(e)),Ky(jA,t)}}function RA(e,t,i){e==="focusin"?(Mp(),ia=t,va=i,ia.attachEvent("onpropertychange",gb)):e==="focusout"&&Mp()}function OA(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return dl(va)}function FA(e,t){if(e==="click")return dl(t)}function NA(e,t){if(e==="input"||e==="change")return dl(t)}function LA(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var ri=typeof Object.is=="function"?Object.is:LA;function wa(e,t){if(ri(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var i=Object.keys(e),r=Object.keys(t);if(i.length!==r.length)return!1;for(r=0;r<i.length;r++){var s=i[r];if(!Kd.call(t,s)||!ri(e[s],t[s]))return!1}return!0}function Rp(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Op(e,t){var i=Rp(e);e=0;for(var r;i;){if(i.nodeType===3){if(r=e+i.textContent.length,e<=t&&r>=t)return{node:i,offset:t-e};e=r}e:{for(;i;){if(i.nextSibling){i=i.nextSibling;break e}i=i.parentNode}i=void 0}i=Rp(i)}}function fb(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?fb(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function yb(){for(var e=window,t=pc();t instanceof e.HTMLIFrameElement;){try{var i=typeof t.contentWindow.location.href=="string"}catch{i=!1}if(i)e=t.contentWindow;else break;t=pc(e.document)}return t}function Vh(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function BA(e){var t=yb(),i=e.focusedElem,r=e.selectionRange;if(t!==i&&i&&i.ownerDocument&&fb(i.ownerDocument.documentElement,i)){if(r!==null&&Vh(i)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in i)i.selectionStart=t,i.selectionEnd=Math.min(e,i.value.length);else if(e=(t=i.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var s=i.textContent.length,n=Math.min(r.start,s);r=r.end===void 0?n:Math.min(r.end,s),!e.extend&&n>r&&(s=r,r=n,n=s),s=Op(i,n);var o=Op(i,r);s&&o&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),n>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=i;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof i.focus=="function"&&i.focus(),i=0;i<t.length;i++)e=t[i],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var UA=Oi&&"documentMode"in document&&11>=document.documentMode,Ps=null,mu=null,ra=null,pu=!1;function Fp(e,t,i){var r=i.window===i?i.document:i.nodeType===9?i:i.ownerDocument;pu||Ps==null||Ps!==pc(r)||(r=Ps,"selectionStart"in r&&Vh(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focu
vendor: 4,501 bytes, line 38
38sNode:r.focusNode,focusOffset:r.focusOffset}),ra&&wa(ra,r)||(ra=r,r=kc(mu,"onSelect"),0<r.length&&(t=new Wh("onSelect","select",null,t,i),e.push({event:t,listeners:r}),t.target=Ps)))}function ko(e,t){var i={};return i[e.toLowerCase()]=t.toLowerCase(),i["Webkit"+e]="webkit"+t,i["Moz"+e]="moz"+t,i}var _s={animationend:ko("Animation","AnimationEnd"),animationiteration:ko("Animation","AnimationIteration"),animationstart:ko("Animation","AnimationStart"),transitionend:ko("Transition","TransitionEnd")},cd={},bb={};Oi&&(bb=document.createElement("div").style,"AnimationEvent"in window||(delete _s.animationend.animation,delete _s.animationiteration.animation,delete _s.animationstart.animation),"TransitionEvent"in window||delete _s.transitionend.transition);function ul(e){if(cd[e])return cd[e];if(!_s[e])return e;var t=_s[e],i;for(i in t)if(t.hasOwnProperty(i)&&i in bb)return cd[e]=t[i];return e}var vb=ul("animationend"),wb=ul("animationiteration"),kb=ul("animationstart"),xb=ul("transitionend"),Ab=new Map,Np="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Pr(e,t){Ab.set(e,t),os(t,[e])}for(var ld=0;ld<Np.length;ld++){var dd=Np[ld],qA=dd.toLowerCase(),zA=dd[0].toUpperCase()+dd.slice(1);Pr(qA,"on"+zA)}Pr(vb,"onAnimationEnd");Pr(wb,"onAnimationIteration");Pr(kb,"onAnimationStart");Pr("dblclick","onDoubleClick");Pr("focusin","onFocus");Pr("focusout","onBlur");Pr(xb,"onTransitionEnd");on("onMouseEnter",["mouseout","mouseover"]);on("onMouseLeave",["mouseout","mouseover"]);on("onPointerEnter",["pointerout","pointerover"]);on("onPointerLeave",["pointerout","pointerover"]);os("onChange","change click focusin focusout input keydown keyup selectionchange".split(" "));os("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));os("onBeforeInput",["compositionend","keypress","textInput","paste"]);os("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" "));os("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" "));os("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Qn="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),WA=new Set("cancel close invalid load scroll toggle".split(" ").concat(Qn));function Lp(e,t,i){var r=e.type||"unknown-event";e.currentTarget=i,qx(r,t,void 0,e),e.currentTarget=null}function Sb(e,t){t=(t&4)!==0;for(var i=0;i<e.length;i++){var r=e[i],s=r.event;r=r.listeners;e:{var n=void 0;if(t)for(var o=r.length-1;0<=o;o--){var c=r[o],l=c.instance,d=c.currentTarget;if(c=c.listener,l!==n&&s.isPropagationStopped())break e;Lp(s,c,d),n=l}else for(o=0;o<r.length;o++){if(c=r[o],l=c.instance,d=c.currentTarget,c=c.listener,l!==n&&s.isPropagationStopped())break e;Lp(s,c,d),n=l}}}if(fc)throw e=lu,fc=!1,lu=null,e}function pe(e,t){var i=t[vu];i===void 0&&(i=t[vu]=new Set);var r=e+"__bubble";i.has(r)||(Cb(t,e,2,!1),i.add(r))}function ud(e,t,i){var r=0;t&&(r|=4),Cb(i,e,r,t)}var xo="_reactListening"+Math.random().toString(36).slice(2);function ka(e){if(!e[xo]){e[xo]=!0,jy.forEach(function(i){i!=="selectionchange"&&(WA.has(i)||ud(i,!1,e),ud(i,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[xo]||(t[xo]=!0,ud("selectionchange",!1,t))}}function Cb(e,t,i,r){switch(cb(t)){case 1:var s=rA;break;case 4:s=sA;break;default:s=qh}i=s.bind(null,t,i,e),s=void 0,!cu||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(s=!0),r?s!==void 0?e.addEventListener(t,i,{capture:!0,passive:s}):e.addEventListener(t,i,!0):s!==void 0?e.addEventListener(t,i,{passive:s}):e.addEventListener(t,i,!1)}function hd(e,t,i,r,s){var n=r;if(!(t&1)&&!(t&2)&&r!==null)e:for(;;){if(r===null)return;var o=r.tag;if(o===3||o===4){var c=r.stateNode.containerInfo;
vendor: 24,101 bytes, lines 38-39
38if(c===s||c.nodeType===8&&c.parentNode===s)break;if(o===4)for(o=r.return;o!==null;){var l=o.tag;if((l===3||l===4)&&(l=o.stateNode.containerInfo,l===s||l.nodeType===8&&l.parentNode===s))return;o=o.return}for(;c!==null;){if(o=qr(c),o===null)return;if(l=o.tag,l===5||l===6){r=n=o;continue e}c=c.parentNode}}r=r.return}Ky(function(){var d=n,u=Nh(i),h=[];e:{var g=Ab.get(e);if(g!==void 0){var m=Wh,w=e;switch(e){case"keypress":if(Xo(i)===0)break e;case"keydown":case"keyup":m=vA;break;case"focusin":w="focus",m=nd;break;case"focusout":w="blur",m=nd;break;case"beforeblur":case"afterblur":m=nd;break;case"click":if(i.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":m=Dp;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":m=oA;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":m=xA;break;case vb:case wb:case kb:m=dA;break;case xb:m=SA;break;case"scroll":m=nA;break;case"wheel":m=DA;break;case"copy":case"cut":case"paste":m=hA;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":m=Ep}var v=(t&4)!==0,k=!v&&e==="scroll",y=v?g!==null?g+"Capture":null:g;v=[];for(var f=d,b;f!==null;){b=f;var x=b.stateNode;if(b.tag===5&&x!==null&&(b=x,y!==null&&(x=ga(f,y),x!=null&&v.push(xa(f,x,b)))),k)break;f=f.return}0<v.length&&(g=new m(g,w,null,i,u),h.push({event:g,listeners:v}))}}if(!(t&7)){e:{if(g=e==="mouseover"||e==="pointerover",m=e==="mouseout"||e==="pointerout",g&&i!==au&&(w=i.relatedTarget||i.fromElement)&&(qr(w)||w[Fi]))break e;if((m||g)&&(g=u.window===u?u:(g=u.ownerDocument)?g.defaultView||g.parentWindow:window,m?(w=i.relatedTarget||i.toElement,m=d,w=w?qr(w):null,w!==null&&(k=cs(w),w!==k||w.tag!==5&&w.tag!==6)&&(w=null)):(m=null,w=d),m!==w)){if(v=Dp,x="onMouseLeave",y="onMouseEnter",f="mouse",(e==="pointerout"||e==="pointerover")&&(v=Ep,x="onPointerLeave",y="onPointerEnter",f="pointer"),k=m==null?g:Is(m),b=w==null?g:Is(w),g=new v(x,f+"leave",m,i,u),g.target=k,g.relatedTarget=b,x=null,qr(u)===d&&(v=new v(y,f+"enter",w,i,u),v.target=b,v.relatedTarget=k,x=v),k=x,m&&w)t:{for(v=m,y=w,f=0,b=v;b;b=ps(b))f++;for(b=0,x=y;x;x=ps(x))b++;for(;0<f-b;)v=ps(v),f--;for(;0<b-f;)y=ps(y),b--;for(;f--;){if(v===y||y!==null&&v===y.alternate)break t;v=ps(v),y=ps(y)}v=null}else v=null;m!==null&&Bp(h,g,m,v,!1),w!==null&&k!==null&&Bp(h,k,w,v,!0)}}e:{if(g=d?Is(d):window,m=g.nodeName&&g.nodeName.toLowerCase(),m==="select"||m==="input"&&g.type==="file")var C=MA;else if(Ip(g))if(pb)C=NA;else{C=OA;var D=RA}else(m=g.nodeName)&&m.toLowerCase()==="input"&&(g.type==="checkbox"||g.type==="radio")&&(C=FA);if(C&&(C=C(e,d))){mb(h,C,i,u);break e}D&&D(e,g,d),e==="focusout"&&(D=g._wrapperState)&&D.controlled&&g.type==="number"&&tu(g,"number",g.value)}switch(D=d?Is(d):window,e){case"focusin":(Ip(D)||D.contentEditable==="true")&&(Ps=D,mu=d,ra=null);break;case"focusout":ra=mu=Ps=null;break;case"mousedown":pu=!0;break;case"contextmenu":case"mouseup":case"dragend":pu=!1,Fp(h,i,u);break;case"selectionchange":if(UA)break;case"keydown":case"keyup":Fp(h,i,u)}var T;if(Hh)e:{switch(e){case"compositionstart":var I="onCompositionStart";break e;case"compositionend":I="onCompositionEnd";break e;case"compositionupdate":I="onCompositionUpdate";break e}I=void 0}else Es?ub(e,i)&&(I="onCompositionEnd"):e==="keydown"&&i.keyCode===229&&(I="onCompositionStart");I&&(db&&i.locale!=="ko"&&(Es||I!=="onCompositionStart"?I==="onCompositionEnd"&&Es&&(T=lb()):(dr=u,zh="value"in dr?dr.value:dr.textContent,Es=!0)),D=kc(d,I),0<D.length&&(I=new Tp(I,e,null,i,u),h.push({event:I,listeners:D}),T?I.data=T:(T=hb(i),T!==null&&(I.data=T)))),(T=EA?PA(e,i):_A(e,i))&&(d=kc(d,"onBeforeInput"),0<d.length&&(u=new Tp("onBeforeInput","beforeinput",null,i,u),h.push({event:u,listeners:d}),u.data=T))}Sb(h,t)})}function xa(e,t,i){return{instance:e,listener:t,currentTarget:i}}function kc(e,t){for(var i=t+"Capture",r=[];e!==null;){var s=e,n=s.stateNode;s.tag===5&&n!==null&&(s=n,n=ga(e,i),n!=null&&r.unshift(xa(e,n,s)),n=ga(e,t),n!=null&&r.push(xa(e,n,s))),e=e.return}return r}function ps(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Bp(e,t,i,r,s){for(var n=t._reactName,o=[];i!==null&&i!==r;){var c=i,l=c.alternate,d=c.stateNode;if(l!==null&&l===r)break;c.tag===5&&d!==null&&(c=d,s?(l=ga(i,n),l!=null&&o.unshift(xa(i,l,c))):s||(l=ga(i,n),l!=null&&o.push(xa(i,l,c)))),i=i.return}o.length!==0&&e.push({event:t,listeners:o})}var $A=/\r\n?/g,HA=/\u0000|\uFFFD/g;function Up(e){return(typeof e=="string"?e:""+e).replace($A,` 39`).replace(HA,"")}function Ao(e,t,i){if(t=Up(t),Up(e)!==t&&i)throw Error(O(425))}function xc(){}var gu=null,fu=null;function yu(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var bu=typeof setTimeout=="function"?setTimeout:void 0,VA=typeof clearTimeout=="function"?clearTimeout:void 0,qp=typeof Promise=="function"?Promise:void 0,GA=typeof queueMicrotask=="function"?queueMicrotask:typeof qp<"u"?function(e){return qp.resolve(null).then(e).catch(KA)}:bu;function KA(e){setTimeout(function(){throw e})}function md(e,t){var i=t,r=0;do{var s=i.nextSibling;if(e.removeChild(i),s&&s.nodeType===8)if(i=s.data,i==="/$"){if(r===0){e.removeChild(s),ba(t);return}r--}else i!=="$"&&i!=="$?"&&i!=="$!"||r++;i=s}while(i);ba(t)}function fr(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function zp(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var i=e.data;if(i==="$"||i==="$!"||i==="$?"){if(t===0)return e;t--}else i==="/$"&&t++}e=e.previousSibling}return null}var vn=Math.random().toString(36).slice(2),fi="__reactFiber$"+vn,Aa="__reactProps$"+vn,Fi="__reactContainer$"+vn,vu="__reactEvents$"+vn,QA="__reactListeners$"+vn,XA="__reactHandles$"+vn;function qr(e){var t=e[fi];if(t)return t;for(var i=e.parentNode;i;){if(t=i[Fi]||i[fi]){if(i=t.alternate,t.child!==null||i!==null&&i.child!==null)for(e=zp(e);e!==null;){if(i=e[fi])return i;e=zp(e)}return t}e=i,i=e.parentNode}return null}function Xa(e){return e=e[fi]||e[Fi],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Is(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(O(33))}function hl(e){return e[Aa]||null}var wu=[],js=-1;function _r(e){return{current:e}}function fe(e){0>js||(e.current=wu[js],wu[js]=null,js--)}function he(e,t){js++,wu[js]=e.current,e.current=t}var Ar={},Je=_r(Ar),ct=_r(!1),ts=Ar;function cn(e,t){var i=e.type.contextTypes;if(!i)return Ar;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var s={},n;for(n in i)s[n]=t[n];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function lt(e){return e=e.childContextTypes,e!=null}function Ac(){fe(ct),fe(Je)}function Wp(e,t,i){if(Je.current!==Ar)throw Error(O(168));he(Je,t),he(ct,i)}function Db(e,t,i){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return i;r=r.getChildContext();for(var s in r)if(!(s in t))throw Error(O(108,Rx(e)||"Unknown",s));return Ce({},i,r)}function Sc(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ar,ts=Je.current,he(Je,e),he(ct,ct.current),!0}function $p(e,t,i){var r=e.stateNode;if(!r)throw Error(O(169));i?(e=Db(e,t,ts),r.__reactInternalMemoizedMergedChildContext=e,fe(ct),fe(Je),he(Je,e)):fe(ct),he(ct,i)}var _i=null,ml=!1,pd=!1;function Tb(e){_i===null?_i=[e]:_i.push(e)}function JA(e){ml=!0,Tb(e)}function Ir(){if(!pd&&_i!==null){pd=!0;var e=0,t=le;try{var i=_i;for(le=1;e<i.length;e++){var r=i[e];do r=r(!0);while(r!==null)}_i=null,ml=!1}catch(s){throw _i!==null&&(_i=_i.slice(e+1)),Yy(Lh,Ir),s}finally{le=t,pd=!1}}return null}var Ms=[],Rs=0,Cc=null,Dc=0,Tt=[],Et=0,is=null,ji=1,Mi="";function Lr(e,t){Ms[Rs++]=Dc,Ms[Rs++]=Cc,Cc=e,Dc=t}function Eb(e,t,i){Tt[Et++]=ji,Tt[Et++]=Mi,Tt[Et++]=is,is=e;var r=ji;e=Mi;var s=32-ti(r)-1;r&=~(1<<s),i+=1;var n=32-ti(t)+s;if(30<n){var o=s-s%5;n=(r&(1<<o)-1).toString(32),r>>=o,s-=o,ji=1<<32-ti(t)+s|i<<s|r,Mi=n+e}else ji=1<<n|i<<s|r,Mi=e}function Gh(e){e.return!==null&&(Lr(e,1),Eb(e,1,0))}function Kh(e){for(;e===Cc;)Cc=Ms[--Rs],Ms[Rs]=null,Dc=Ms[--Rs],Ms[Rs]=null;for(;e===is;)is=Tt[--Et],Tt[Et]=null,Mi=Tt[--Et],Tt[Et]=null,ji=Tt[--Et],Tt[Et]=null}var ft=null,gt=null,be=!1,Jt=null;function Pb(e,t){var i=Pt(5,null,null,0);i.elementType="DELETED",i.stateNode=t,i.return=e,t=e.deletions,t===null?(e.deletions=[i],e.flags|=16):t.push(i)}function Hp(e,t){switch(e.tag){case 5:var i=e.type;return t=t.nodeType!==1||i.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,ft=e,gt=fr(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,ft=e,gt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(i=is!==null?{id:ji,overflow:Mi}:null,e.memoizedState={dehydrated:t,treeContext:i,retryLane:1073741824},i=Pt(18,null,null,0),i.stateNode=t,i.return=e,e.child=i,ft=e,gt=null,!0):!1;default:return!1}}function ku(e){return(e.mode&1)!==0&&(e.flags&128)===0}function xu(e){if(be){var t=gt;if(t){var i=t;if(!Hp(e,t)){if(ku(e))throw Error(O(418));t=fr(i.nextSibling);var r=ft;t&&Hp(e,t)?Pb(r,i):(e.flags=e.flags&-4097|2,be=!1,ft=e)}}else{if(ku(e))throw Error(O(418));e.flags=e.flags&-4097|2,be=!1,ft=e}}}function Vp(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;ft=e}function So(e){if(e!==ft)return!1;if(!be)return Vp(e),be=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!yu(e.type,e.memoizedProps)),t&&(t=gt)){if(ku(e))throw _b(),Error(O(418));for(;t;)Pb(e,t),t=fr(t.nextSibling)}if(Vp(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(O(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var i=e.data;if(i==="/$"){if(t===0){gt=fr(e.nextSibling);break e}t--}else i!=="$"&&i!=="$!"&&i!=="$?"||t++}e=e.nextSibling}gt=null}}else gt=ft?fr(e.stateNode.nextSibling):null;return!0}function _b(){for(var e=gt;e;)e=fr(e.nextSibling)}function ln(){gt=ft=null,be=!1}function Qh(e){Jt===null?Jt=[e]:Jt.push(e)}var YA=qi.ReactCurrentBatchConfig;function Fn(e,t,i){if(e=i.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(i._owner){if(i=i._owner,i){if(i.tag!==1)throw Error(O(309));var r=i.stateNode}if(!r)throw Error(O(147,e));var s=r,n=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===n?t.ref:(t=function(o){var c=s.refs;o===null?delete c[n]:c[n]=o},t._stringRef=n,t)}if(typeof e!="string")throw Error(O(284));if(!i._owner)throw Error(O(290,e))}return e}function Co(e,t){throw e=Object.prototype.toString.call(t),Error(O(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Gp(e){var t=e._init;return t(e._payload)}function Ib(e){function t(y,f){if(e){var b=y.deletions;b===null?(y.deletions=[f],y.flags|=16):b.push(f)}}function i(y,f){if(!e)return null;for(;f!==null;)t(y,f),f=f.sibling;return null}function r(y,f){for(y=new Map;f!==null;)f.key!==null?y.set(f.key,f):y.set(f.index,f),f=f.sibling;return y}function s(y,f){return y=wr(y,f),y.index=0,y.sibling=null,y}function n(y,f,b){return y.index=b,e?(b=y.alternate,b!==null?(b=b.index,b<f?(y.flags|=2,f):b):(y.flags|=2,f)):(y.flags|=1048576,f)}function o(y){return e&&y.alternate===null&&(y.flags|=2),y}function c(y,f,b,x){return f===null||f.tag!==6?(f=kd(b,y.mode,x),f.return=y,f):(f=s(f,b),f.return=y,f)}function l(y,f,b,x){var C=b.type;return C===Ts?u(y,f,b.props.children,x,b.key):f!==null&&(f.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===Zi&&Gp(C)===f.type)?(x=s(f,b.props),x.ref=Fn(y,f,b),x.return=y,x):(x=rc(b.type,b.key,b.props,null,y.mode,x),x.ref=Fn(y,f,b),x.return=y,x)}function d(y,f,b,x){return f===null||f.tag!==4||f.stateNode.containerInfo!==b.containerInfo||f.stateNode.implementation!==b.implementation?(f=xd(b,y.mode,x),f.return=y,f):(f=s(f,b.children||[]),f.return=y,f)}function u(y,f,b,x,C){return f===null||f.tag!==7?(f=es(b,y.mode,x,C),f.return=y,f):(f=s(f,b),f.return=y,f)}function h(y,f,b){if(typeof f=="string"&&f!==""||typeof f=="number")return f=kd(""+f,y.mode,b),f.return=y,f;if(typeof f=="object"&&f!==null){switch(f.$$typeof){case po:return b=rc(f.type,f.key,f.props,null,y.mode,b),b.ref=Fn(y,null,f),b.return=y,b;case Ds:return f=xd(f,y.mode,b),f.return=y,f;case Zi:var x=f._init;return h(y,x(f._payload),b)}if(Gn(f)||In(f))return f=es(f,y.mode,b,null),f.return=y,f;Co(y,f)}return null}function g(y,f,b,x){var C=f!==null?f.key:null;if(typeof b=="string"&&b!==""||typeof b=="number")return C!==null?null:c(y,f,""+b,x);if(typeof b=="object"&&b!==null){switch(b.$$typeof){case po:return b.key===C?l(y,f,b,x):null;case Ds:return b.key===C?d(y,f,b,x):null;case Zi:return C=b._init,g(y,f,C(b._payload),x)}if(Gn(b)||In(b))return C!==null?null:u(y,f,b,x,null);Co(y,b)}return null}function m(y,f,b,x,C){if(typeof x=="string"&&x!==""||typeof x=="number")return y=y.get(b)||null,c(f,y,""+x,C);if(typeof x=="object"&&x!==null){switch(x.$$typeof){case po:return y=y.get(x.key===null?b:x.key)||null,l(f,y,x,C);case Ds:return y=y.get(x.key===null?b:x.key)||null,d(f,y,x,C);case Zi:var D=x._init;return m(y,f,b,D(x._payload),C)}if(Gn(x)||In(x))return y=y.get(b)||null,u(f,y,x,C,null);Co(f,x)}return null}function w(y,f,b,x){for(var C=null,D=null,T=f,I=f=0,R=null;T!==null&&I<b.length;I++){T.index>I?(R=T,T=null):R=T.sibling;var F=g(y,T,b[I],x);if(F===null){T===null&&(T=R);break}e&&T&&F.alternate===null&&t(y,T),f=n(F,f,I),D===null?C=F:D.sibling=F,D=F,T=R}if(I===b.length)return i(y,T),be&&Lr(y,I),C;if(T===null){for(;I<b.length;I++)T=h(y,b[I],x),T!==null&&(f=n(T,f,I),D===null?C=T:D.sibling=T,D=T);return be&&Lr(y,I),C}for(T=r(y,T);I<b.length;I++)R=m(T,y,I,b[I],x),R!==null&&(e&&R.alternate!==null&&T.delete(R.key===null?I:R.key),f=n(R,f,I),D===null?C=R:D.sibling=R,D=R);return e&&T.forEach(function(K){return t(y,K)}),be&&Lr(y,I),C}function v(y,f,b,x){var C=In(b);if(typeof C!="function")throw Error(O(150));if(b=C.call(b),b==null)throw Error(O(151));for(var D=C=null,T=f,I=f=0,R=null,F=b.next();T!==null&&!F.done;I++,F=b.next()){T.index>I?(R=T,T=null):R=T.sibling;var K=g(y,T,F.value,x);if(K===null){T===null&&(T=R);break}e&&T&&K.alternate===null&&t(y,T),f=n(K,f,I),D===null?C=K:D.sibling=K,D=K,T=R}if(F.done)return i(y,T),be&&Lr(y,I),C;if(T===null){for(;!F.done;I++,F=b.next())F=h(y,F.value,x),F!==null&&(f=n(F,f,I),D===null?C=F:D.sibling=F,D=F);return be&&Lr(y,I),C}for(T=r(y,T);!F.done;I++,F=b.next())F=m(T,y,I,F.value,x),F!==null&&(e&&F.alternate!==null&&T.delete(F.key===null?I:F.key),f=n(F,f,I),D===null?C=F:D.sibling=F,D=F);return e&&T.forEach(function(N){return t(y,N)}),be&&Lr(y,I),C}function k(y,f,b,x){if(typeof b=="object"&&b!==null&&b.type===Ts&&b.key===null&&(b=b.props.children),typeof b=="object"&&b!==null){switch(b.$$typeof){case po:e:{for(var C=b.key,D=f;D!==null;){if(D.key===C){if(C=b.type,C===Ts){if(D.tag===7){i(y,D.sibling),f=s(D,b.props.children),f.return=y,y=f;break e}}else if(D.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===Zi&&Gp(C)===D.type){i(y,D.sibling),f=s(D,b.props),f.ref=Fn(y,D,b),f.return=y,y=f;break e}i(y,D);break}else t(y,D);D=D.sibling}b.type===Ts?(f=es(b.props.children,y.mode,x,b.key),f.return=y,y=f):(x=rc(b.type,b.key,b.props,null,y.mode,x),x.ref=Fn(y,f,b),x.return=y,y=x)}return o(y);case Ds:e:{for(D=b.key;f!==null;){if(f.key===D)if(f.tag===4&&f.stateNode.containerInfo===b.containerInfo&&f.stateNode.implementation===b.implementation){i(y,f.sibling),f=s(f,b.children||[]),f.return=y,y=f;break e}else{i(y,f);break}else t(y,f);f=f.sibling}f=xd(b,y.mode,x),f.return=y,y=f}return o(y);case Zi:return D=b._init,k(y,f,D(b._payload),x)}if(Gn(b))return w(y,f,b,x);if(In(b))return v(y,f,b,x);Co(y,b)}return typeof b=="string"&&b!==""||typeof b=="number"?(b=""+b,f!==null&&f.tag===6?(i(y,f.sibling),f=s(f,b),f.return=y,y=f):(i(y,f),f=kd(b,y.mode,x),f.return=y,y=f),o(y)):i(y,f)}return k}var dn=Ib(!0),jb=Ib(!1),Tc=_r(null),Ec=null,Os=null,Xh=null;function Jh(){Xh=Os=Ec=null}function Yh(e){var t=Tc.current;fe(Tc),e._currentValue=t}function Au(e,t,i){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===i)break;e=e.return}}function Ws(e,t){Ec=e,Xh=Os=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ot=!0),e.firstContext=null)}function It(e){var t=e._currentValue;if(Xh!==e)if(e={context:e,memoizedValue:t,next:null},Os===null){if(Ec===null)throw Error(O(308));Os=e,Ec.dependencies={lanes:0,firstContext:e}}else Os=Os.next=e;return t}var zr=null;function Zh(e){zr===null?zr=[e]:zr.push(e)}function Mb(e,t,i,r){var s=t.interleaved;return s===null?(i.next=i,Zh(t)):(i.next=s.next,s.next=i),t.interleaved=i,Ni(e,r)}function Ni(e,t){e.lanes|=t;var i=e.alternate;for(i!==null&&(i.lanes|=t),i=e,e=e.return;e!==null;)e.childLanes|=t,i=e.alternate,i!==null&&(i.childLanes|=t),i=e,e=e.return;return i.tag===3?i.stateNode:null}var er=!1;function em(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Rb(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ri(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function yr(e,t,i){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,oe&2){var s=r.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),r.pending=t,Ni(e,i)}return s=r.interleaved,s===null?(t.next=t,Zh(r)):(t.next=s.next,s.next=t),r.interleaved=t,Ni(e,i)}function Jo(e,t,i){if(t=t.updateQueue,t!==null&&(t=t.shared,(i&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,i|=r,t.lanes=i,Bh(e,i)}}function Kp(e,t){var i=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,i===r)){var s=null,n=null;if(i=i.firstBaseUpdate,i!==null){do{var o={eventTime:i.eventTime,lane:i.lane,tag:i.tag,payload:i.payload,callback:i.callback,next:null};n===null?s=n=o:n=n.next=o,i=i.next}while(i!==null);n===null?s=n=t:n=n.next=t}else s=n=t;i={baseState:r.baseState,firstBaseUpdate:s,lastBaseUpdate:n,shared:r.shared,effects:r.effects},e.updateQueue=i;return}e=i.lastBaseUpdate,e===null?i.firstBaseUpdate=t:e.next=t,i.lastBaseUpdate=t}function Pc(e,t,i,r){var s=e.updateQueue;er=!1;var n=s.firstBaseUpdate,o=s.lastBaseUpdate,c=s.shared.pending;if(c!==null){s.shared.pending=null;var l=c,d=l.next;l.next=null,o===null?n=d:o.next=d,o=l;var u=e.alternate;u!==null&&(u=u.updateQueue,c=u.lastBaseUpdate,c!==o&&(c===null?u.firstBaseUpdate=d:c.next=d,u.lastBaseUpdate=l))}if(n!==null){var h=s.baseState;o=0,u=d=l=null,c=n;do{var g=c.lane,m=c.eventTime;if((r&g)===g){u!==null&&(u=u.next={eventTime:m,lane:0,tag:c.tag,payload:c.payload,callback:c.callback,next:null});e:{var w=e,v=c;switch(g=t,m=i,v.tag){case 1:if(w=v.payload,typeof w=="function"){h=w.call(m,h,g);break e}h=w;break e;case 3:w.flags=w.flags&-65537|128;case 0:if(w=v.payload,g=typeof w=="function"?w.call(m,h,g):w,g==null)break e;h=Ce({},h,g);break e;case 2:er=!0}}c.callback!==null&&c.lane!==0&&(e.flags|=64,g=s.effects,g===null?s.effects=[c]:g.push(c))}else m={eventTime:m,lane:g,tag:c.tag,payload:c.payload,callback:c.callback,next:null},u===null?(d=u=m,l=h):u=u.next=m,o|=g;if(c=c.next,c===null){if(c=s.shared.pending,c===null)break;g=c,c=g.next,g.next=null,s.lastBaseUpdate=g,s.shared.pending=null}}while(!0);if(u===null&&(l=h),s.baseState=l,s.firstBaseUpdate=d,s.lastBaseUpdate=u,t=s.shared.interleaved,t!==null){s=t;do o|=s.lane,s=s.next;while(s!==t)}else n===null&&(s.shared.lanes=0);ss|=o,e.lanes=o,e.memoizedState=h}}function Qp(e,t,i){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var r=e[t],s=r.callback;if(s!==null){if(r.callback=null,r=i,typeof s!="function")throw Error(O(191,s));s.call(r)}}}var Ja={},bi=_r(Ja),Sa=_r(Ja),Ca=_r(Ja);function Wr(e){if(e===Ja)throw Error(O(174));return e}function tm(e,t){switch(he(Ca,t),he(Sa,e),he(bi,Ja),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:ru(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=ru(t,e)}fe(bi),he(bi,t)}function un(){fe(bi),fe(Sa),fe(Ca)}function Ob(e){Wr(Ca.current);var t=Wr(bi.current),i=ru(t,e.type);t!==i&&(he(Sa,e),he(bi,i))}function im(e){Sa.current===e&&(fe(bi),fe(Sa))}var xe=_r(0);function _c(e){for(var t=e;t!==null;){if(t.tag===13){var i=t.memoizedState;if(i!==null&&(i=i.dehydrated,i===null||i.data==="$?"||i.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var gd=[];function rm(){for(var e=0;e<gd.length;e++)gd[e]._workInProgressVersionPrimary=null;gd.length=0}var Yo=qi.ReactCurrentDispatcher,fd=qi.ReactCurrentBatchConfig,rs=0,Ae=null,Re=null,Le=null,Ic=!1,sa=!1,Da=0,ZA=0;function Ge(){throw Error(O(321))}function sm(e,t){if(t===null)return!1;for(var i=0;i<t.length&&i<e.length;i++)if(!ri(e[i],t[i]))return!1;return!0}function nm(e,t,i,r,s,n){if(rs=n,Ae=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Yo.current=e===null||e.memoizedState===null?r1:s1,e=i(r,s),sa){n=0;do{if(sa=!1,Da=0,25<=n)throw Error(O(301));n+=1,Le=Re=null,t.updateQueue=null,Yo.current=n1,e=i(r,s)}while(sa)}if(Yo.current=jc,t=Re!==null&&Re.next!==null,rs=0,Le=Re=Ae=null,Ic=!1,t)throw Error(O(300));return e}function am(){var e=Da!==0;return Da=0,e}function di(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Le===null?Ae.memoizedState=Le=e:Le=Le.next=e,Le}function jt(){if(Re===null){var e=Ae.alternate;e=e!==null?e.memoizedState:null}else e=Re.next;var t=Le===null?Ae.memoizedState:Le.next;if(t!==null)Le=t,Re=e;else{if(e===null)throw Error(O(310));Re=e,e={memoizedState:Re.memoizedState,baseState:Re.baseState,baseQueue:Re.baseQueue,queue:Re.queue,next:null},Le===null?Ae.memoizedState=Le=e:Le=Le.next=e}return Le}function Ta(e,t){return typeof t=="function"?t(e):t}function yd(e){var t=jt(),i=t.queue;if(i===null)throw Error(O(311));i.lastRenderedReducer=e;var r=Re,s=r.baseQueue,n=i.pending;if(n!==null){if(s!==null){var o=s.next;s.next=n.next,n.next=o}r.baseQueue=s=n,i.pending=null}if(s!==null){n=s.next,r=r.baseState;var c=o=null,l=null,d=n;do{var u=d.lane;if((rs&u)===u)l!==null&&(l=l.next={lane:0,action:d.action,hasEagerState:d.hasEagerState,eagerState:d.eagerState,next:null}),r=d.hasEagerState?d.eagerState:e(r,d.action);else{var h={lane:u,action:d.action,hasEagerState:d.hasEagerState,eagerState:d.eagerState,next:null};l===null?(c=l=h,o=r):l=l.next=h,Ae.lanes|=u,ss|=u}d=d.next}while(d!==null&&d!==n);l===null?o=r:l.next=c,ri(r,t.memoizedState)||(ot=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=l,i.lastRenderedState=r}if(e=i.interleaved,e!==null){s=e;do n=s.lane,Ae.lanes|=n,ss|=n,s=s.next;while(s!==e)}else s===null&&(i.lanes=0);return[t.memoizedState,i.dispatch]}function bd(e){var t=jt(),i=t.queue;if(i===null)throw Error(O(311));i.lastRenderedReducer=e;var r=i.dispatch,s=i.pending,n=t.memoizedState;if(s!==null){i.pending=null;var o=s=s.next;do n=e(n,o.action),o=o.next;while(o!==s);ri(n,t.memoizedState)||(ot=!0),t.memoizedState=n,t.baseQueue===null&&(t.baseState=n),i.lastRenderedState=n}return[n,r]}function Fb(){}function Nb(e,t){var i=Ae,r=jt(),s=t(),n=!ri(r.memoizedState,s);if(n&&(r.memoizedState=s,ot=!0),r=r.queue,om(Ub.bind(null,i,r,e),[e]),r.getSnapshot!==t||n||Le!==null&&Le.memoizedState.tag&1){if(i.flags|=2048,Ea(9,Bb.bind(null,i,r,s,t),void 0,null),Be===null)throw Error(O(349));rs&30||Lb(i,t,s)}return s}
vendor: 4,204 bytes, line 39
39function Lb(e,t,i){e.flags|=16384,e={getSnapshot:t,value:i},t=Ae.updateQueue,t===null?(t={lastEffect:null,stores:null},Ae.updateQueue=t,t.stores=[e]):(i=t.stores,i===null?t.stores=[e]:i.push(e))}function Bb(e,t,i,r){t.value=i,t.getSnapshot=r,qb(t)&&zb(e)}function Ub(e,t,i){return i(function(){qb(t)&&zb(e)})}function qb(e){var t=e.getSnapshot;e=e.value;try{var i=t();return!ri(e,i)}catch{return!0}}function zb(e){var t=Ni(e,1);t!==null&&ii(t,e,1,-1)}function Xp(e){var t=di();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Ta,lastRenderedState:e},t.queue=e,e=e.dispatch=i1.bind(null,Ae,e),[t.memoizedState,e]}function Ea(e,t,i,r){return e={tag:e,create:t,destroy:i,deps:r,next:null},t=Ae.updateQueue,t===null?(t={lastEffect:null,stores:null},Ae.updateQueue=t,t.lastEffect=e.next=e):(i=t.lastEffect,i===null?t.lastEffect=e.next=e:(r=i.next,i.next=e,e.next=r,t.lastEffect=e)),e}function Wb(){return jt().memoizedState}function Zo(e,t,i,r){var s=di();Ae.flags|=e,s.memoizedState=Ea(1|t,i,void 0,r===void 0?null:r)}function pl(e,t,i,r){var s=jt();r=r===void 0?null:r;var n=void 0;if(Re!==null){var o=Re.memoizedState;if(n=o.destroy,r!==null&&sm(r,o.deps)){s.memoizedState=Ea(t,i,n,r);return}}Ae.flags|=e,s.memoizedState=Ea(1|t,i,n,r)}function Jp(e,t){return Zo(8390656,8,e,t)}function om(e,t){return pl(2048,8,e,t)}function $b(e,t){return pl(4,2,e,t)}function Hb(e,t){return pl(4,4,e,t)}function Vb(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Gb(e,t,i){return i=i!=null?i.concat([e]):null,pl(4,4,Vb.bind(null,t,e),i)}function cm(){}function Kb(e,t){var i=jt();t=t===void 0?null:t;var r=i.memoizedState;return r!==null&&t!==null&&sm(t,r[1])?r[0]:(i.memoizedState=[e,t],e)}function Qb(e,t){var i=jt();t=t===void 0?null:t;var r=i.memoizedState;return r!==null&&t!==null&&sm(t,r[1])?r[0]:(e=e(),i.memoizedState=[e,t],e)}function Xb(e,t,i){return rs&21?(ri(i,t)||(i=tb(),Ae.lanes|=i,ss|=i,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,ot=!0),e.memoizedState=i)}function e1(e,t){var i=le;le=i!==0&&4>i?i:4,e(!0);var r=fd.transition;fd.transition={};try{e(!1),t()}finally{le=i,fd.transition=r}}function Jb(){return jt().memoizedState}function t1(e,t,i){var r=vr(e);if(i={lane:r,action:i,hasEagerState:!1,eagerState:null,next:null},Yb(e))Zb(t,i);else if(i=Mb(e,t,i,r),i!==null){var s=tt();ii(i,e,r,s),ev(i,t,r)}}function i1(e,t,i){var r=vr(e),s={lane:r,action:i,hasEagerState:!1,eagerState:null,next:null};if(Yb(e))Zb(t,s);else{var n=e.alternate;if(e.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var o=t.lastRenderedState,c=n(o,i);if(s.hasEagerState=!0,s.eagerState=c,ri(c,o)){var l=t.interleaved;l===null?(s.next=s,Zh(t)):(s.next=l.next,l.next=s),t.interleaved=s;return}}catch{}finally{}i=Mb(e,t,s,r),i!==null&&(s=tt(),ii(i,e,r,s),ev(i,t,r))}}function Yb(e){var t=e.alternate;return e===Ae||t!==null&&t===Ae}function Zb(e,t){sa=Ic=!0;var i=e.pending;i===null?t.next=t:(t.next=i.next,i.next=t),e.pending=t}function ev(e,t,i){if(i&4194240){var r=t.lanes;r&=e.pendingLanes,i|=r,t.lanes=i,Bh(e,i)}}var jc={readContext:It,useCallback:Ge,useContext:Ge,useEffect:Ge,useImperativeHandle:Ge,useInsertionEffect:Ge,useLayoutEffect:Ge,useMemo:Ge,useReducer:Ge,useRef:Ge,useState:Ge,useDebugValue:Ge,useDeferredValue:Ge,useTransition:Ge,useMutableSource:Ge,useSyncExternalStore:Ge,useId:Ge,unstable_isNewReconciler:!1},r1={readContext:It,useCallback:function(e,t){return di().memoizedState=[e,t===void 0?null:t],e},useContext:It,useEffect:Jp,useImperativeHandle:function(e,t,i){return i=i!=null?i.concat([e]):null,Zo(4194308,4,Vb.bind(null,t,e),i)},useLayoutEffect:function(e,t){return Zo(4194308,4,e,t)},useInsertionEffect:function(e,t){return Zo(4,2,e,t)},useMemo:function(e,t){var i=di();return t=t===void 0?null:t,e=e(),i.memoizedState=[e,t],e},useReducer:function(e,t,i){var r=di();return t=i!==void 0?i(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=t1.bind(null,Ae,e),[r.memoizedState,e]}
vendor: 5,922 bytes, lines 39-41
39,useRef:function(e){var t=di();return e={current:e},t.memoizedState=e},useState:Xp,useDebugValue:cm,useDeferredValue:function(e){return di().memoizedState=e},useTransition:function(){var e=Xp(!1),t=e[0];return e=e1.bind(null,e[1]),di().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,i){var r=Ae,s=di();if(be){if(i===void 0)throw Error(O(407));i=i()}else{if(i=t(),Be===null)throw Error(O(349));rs&30||Lb(r,t,i)}s.memoizedState=i;var n={value:i,getSnapshot:t};return s.queue=n,Jp(Ub.bind(null,r,n,e),[e]),r.flags|=2048,Ea(9,Bb.bind(null,r,n,i,t),void 0,null),i},useId:function(){var e=di(),t=Be.identifierPrefix;if(be){var i=Mi,r=ji;i=(r&~(1<<32-ti(r)-1)).toString(32)+i,t=":"+t+"R"+i,i=Da++,0<i&&(t+="H"+i.toString(32)),t+=":"}else i=ZA++,t=":"+t+"r"+i.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},s1={readContext:It,useCallback:Kb,useContext:It,useEffect:om,useImperativeHandle:Gb,useInsertionEffect:$b,useLayoutEffect:Hb,useMemo:Qb,useReducer:yd,useRef:Wb,useState:function(){return yd(Ta)},useDebugValue:cm,useDeferredValue:function(e){var t=jt();return Xb(t,Re.memoizedState,e)},useTransition:function(){var e=yd(Ta)[0],t=jt().memoizedState;return[e,t]},useMutableSource:Fb,useSyncExternalStore:Nb,useId:Jb,unstable_isNewReconciler:!1},n1={readContext:It,useCallback:Kb,useContext:It,useEffect:om,useImperativeHandle:Gb,useInsertionEffect:$b,useLayoutEffect:Hb,useMemo:Qb,useReducer:bd,useRef:Wb,useState:function(){return bd(Ta)},useDebugValue:cm,useDeferredValue:function(e){var t=jt();return Re===null?t.memoizedState=e:Xb(t,Re.memoizedState,e)},useTransition:function(){var e=bd(Ta)[0],t=jt().memoizedState;return[e,t]},useMutableSource:Fb,useSyncExternalStore:Nb,useId:Jb,unstable_isNewReconciler:!1};function Ht(e,t){if(e&&e.defaultProps){t=Ce({},t),e=e.defaultProps;for(var i in e)t[i]===void 0&&(t[i]=e[i]);return t}return t}function Su(e,t,i,r){t=e.memoizedState,i=i(r,t),i=i==null?t:Ce({},t,i),e.memoizedState=i,e.lanes===0&&(e.updateQueue.baseState=i)}var gl={isMounted:function(e){return(e=e._reactInternals)?cs(e)===e:!1},enqueueSetState:function(e,t,i){e=e._reactInternals;var r=tt(),s=vr(e),n=Ri(r,s);n.payload=t,i!=null&&(n.callback=i),t=yr(e,n,s),t!==null&&(ii(t,e,s,r),Jo(t,e,s))},enqueueReplaceState:function(e,t,i){e=e._reactInternals;var r=tt(),s=vr(e),n=Ri(r,s);n.tag=1,n.payload=t,i!=null&&(n.callback=i),t=yr(e,n,s),t!==null&&(ii(t,e,s,r),Jo(t,e,s))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var i=tt(),r=vr(e),s=Ri(i,r);s.tag=2,t!=null&&(s.callback=t),t=yr(e,s,r),t!==null&&(ii(t,e,r,i),Jo(t,e,r))}};function Yp(e,t,i,r,s,n,o){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(r,n,o):t.prototype&&t.prototype.isPureReactComponent?!wa(i,r)||!wa(s,n):!0}function tv(e,t,i){var r=!1,s=Ar,n=t.contextType;return typeof n=="object"&&n!==null?n=It(n):(s=lt(t)?ts:Je.current,r=t.contextTypes,n=(r=r!=null)?cn(e,s):Ar),t=new t(i,n),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=gl,e.stateNode=t,t._reactInternals=e,r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=s,e.__reactInternalMemoizedMaskedChildContext=n),t}function Zp(e,t,i,r){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(i,r),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(i,r),t.state!==e&&gl.enqueueReplaceState(t,t.state,null)}function Cu(e,t,i,r){var s=e.stateNode;s.props=i,s.state=e.memoizedState,s.refs={},em(e);var n=t.contextType;typeof n=="object"&&n!==null?s.context=It(n):(n=lt(t)?ts:Je.current,s.context=cn(e,n)),s.state=e.memoizedState,n=t.getDerivedStateFromProps,typeof n=="function"&&(Su(e,t,n,i),s.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(t=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),t!==s.state&&gl.enqueueReplaceState(s,s.state,null),Pc(e,i,s,r),s.state=e.memoizedState),typeof s.componentDidMount=="function"&&(e.flags|=4194308)}function hn(e,t){try{var i="",r=t;do i+=Mx(r),r=r.return;while(r);var s=i}catch(n){s=` 40Error generating stack: `+n.message+` 41`+n.stack}return{value:e,source:t,stack:s,digest:null}}function vd(e,t,i){return{value:e,source:null,stack:i??null,digest:t??null}}function Du(e,t){try{console.error(t.value)}catch(i){setTimeout(function(){throw i})}}var a1=typeof WeakMap=="function"?WeakMap:Map;function iv(e,t,i){i=Ri(-1,i),i.tag=3,i.payload={element:null};var r=t.value;return i.callback=function(){Rc||(Rc=!0,Fu=r),Du(e,t)},i}function rv(e,t,i){i=Ri(-1,i),i.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var s=t.value;i.payload=function(){return r(s)},i.callback=function(){Du(e,t)}}var n=e.stateNode;return n!==null&&typeof n.componentDidCatch=="function"&&(i.callback=function(){Du(e,t),typeof r!="function"&&(br===null?br=new Set([this]):br.add(this));var o=t.stack;this.componentDidCatch(t.value,{componentStack:o!==null?o:""})}),i}function eg(e,t,i){var r=e.pingCache;if(r===null){r=e.pingCache=new a1;var s=new Set;r.set(t,s)}else s=r.get(t),s===void 0&&(s=new Set,r.set(t,s));s.has(i)||(s.add(i),e=w1.bind(null,e,t,i),t.then(e,e))}function tg(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function ig(e,t,i,r,s){return e.mode&1?(e.flags|=65536,e.lanes=s,e):(e===t?e.flags|=65536:(e.flags|=128,i.flags|=131072,i.flags&=-52805,i.tag===1&&(i.alternate===null?i.tag=17:(t=Ri(-1,1),t.tag=2,yr(i,t,1))),i.lanes|=1),e)}var o1=qi.ReactCurrentOwner,ot=!1;function Ze(e,t,i,r){t.child=e===null?jb(t,null,i,r):dn(t,e.child,i,r)}function rg(e,t,i,r,s){i=i.render;var n=t.ref;
vendor: 9,597 bytes, line 41
41return Ws(t,s),r=nm(e,t,i,r,n,s),i=am(),e!==null&&!ot?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Li(e,t,s)):(be&&i&&Gh(t),t.flags|=1,Ze(e,t,r,s),t.child)}function sg(e,t,i,r,s){if(e===null){var n=i.type;return typeof n=="function"&&!fm(n)&&n.defaultProps===void 0&&i.compare===null&&i.defaultProps===void 0?(t.tag=15,t.type=n,sv(e,t,n,r,s)):(e=rc(i.type,null,r,t,t.mode,s),e.ref=t.ref,e.return=t,t.child=e)}if(n=e.child,!(e.lanes&s)){var o=n.memoizedProps;if(i=i.compare,i=i!==null?i:wa,i(o,r)&&e.ref===t.ref)return Li(e,t,s)}return t.flags|=1,e=wr(n,r),e.ref=t.ref,e.return=t,t.child=e}function sv(e,t,i,r,s){if(e!==null){var n=e.memoizedProps;if(wa(n,r)&&e.ref===t.ref)if(ot=!1,t.pendingProps=r=n,(e.lanes&s)!==0)e.flags&131072&&(ot=!0);else return t.lanes=e.lanes,Li(e,t,s)}return Tu(e,t,i,r,s)}function nv(e,t,i){var r=t.pendingProps,s=r.children,n=e!==null?e.memoizedState:null;if(r.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},he(Ns,ut),ut|=i;else{if(!(i&1073741824))return e=n!==null?n.baseLanes|i:i,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,he(Ns,ut),ut|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=n!==null?n.baseLanes:i,he(Ns,ut),ut|=r}else n!==null?(r=n.baseLanes|i,t.memoizedState=null):r=i,he(Ns,ut),ut|=r;return Ze(e,t,s,i),t.child}function av(e,t){var i=t.ref;(e===null&&i!==null||e!==null&&e.ref!==i)&&(t.flags|=512,t.flags|=2097152)}function Tu(e,t,i,r,s){var n=lt(i)?ts:Je.current;return n=cn(t,n),Ws(t,s),i=nm(e,t,i,r,n,s),r=am(),e!==null&&!ot?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Li(e,t,s)):(be&&r&&Gh(t),t.flags|=1,Ze(e,t,i,s),t.child)}function ng(e,t,i,r,s){if(lt(i)){var n=!0;Sc(t)}else n=!1;if(Ws(t,s),t.stateNode===null)ec(e,t),tv(t,i,r),Cu(t,i,r,s),r=!0;else if(e===null){var o=t.stateNode,c=t.memoizedProps;o.props=c;var l=o.context,d=i.contextType;typeof d=="object"&&d!==null?d=It(d):(d=lt(i)?ts:Je.current,d=cn(t,d));var u=i.getDerivedStateFromProps,h=typeof u=="function"||typeof o.getSnapshotBeforeUpdate=="function";h||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(c!==r||l!==d)&&Zp(t,o,r,d),er=!1;var g=t.memoizedState;o.state=g,Pc(t,r,o,s),l=t.memoizedState,c!==r||g!==l||ct.current||er?(typeof u=="function"&&(Su(t,i,u,r),l=t.memoizedState),(c=er||Yp(t,i,c,r,g,l,d))?(h||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount()),typeof o.componentDidMount=="function"&&(t.flags|=4194308)):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),o.props=r,o.state=l,o.context=d,r=c):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{o=t.stateNode,Rb(e,t),c=t.memoizedProps,d=t.type===t.elementType?c:Ht(t.type,c),o.props=d,h=t.pendingProps,g=o.context,l=i.contextType,typeof l=="object"&&l!==null?l=It(l):(l=lt(i)?ts:Je.current,l=cn(t,l));var m=i.getDerivedStateFromProps;(u=typeof m=="function"||typeof o.getSnapshotBeforeUpdate=="function")||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(c!==h||g!==l)&&Zp(t,o,r,l),er=!1,g=t.memoizedState,o.state=g,Pc(t,r,o,s);var w=t.memoizedState;c!==h||g!==w||ct.current||er?(typeof m=="function"&&(Su(t,i,m,r),w=t.memoizedState),(d=er||Yp(t,i,d,r,g,w,l)||!1)?(u||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(r,w,l),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(r,w,l)),typeof o.componentDidUpdate=="function"&&(t.flags|=4),typeof o.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof o.componentDidUpdate!="function"||c===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||c===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=w),o.props=r,o.state=w,o.context=l,r=d):(typeof o.componentDidUpdate!="function"||c===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||c===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),r=!1)}return Eu(e,t,i,r,n,s)}function Eu(e,t,i,r,s,n){av(e,t);var o=(t.flags&128)!==0;if(!r&&!o)return s&&$p(t,i,!1),Li(e,t,n);r=t.stateNode,o1.current=t;var c=o&&typeof i.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&o?(t.child=dn(t,e.child,null,n),t.child=dn(t,null,c,n)):Ze(e,t,c,n),t.memoizedState=r.state,s&&$p(t,i,!0),t.child}function ov(e){var t=e.stateNode;t.pendingContext?Wp(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Wp(e,t.context,!1),tm(e,t.containerInfo)}function ag(e,t,i,r,s){return ln(),Qh(s),t.flags|=256,Ze(e,t,i,r),t.child}var Pu={dehydrated:null,treeContext:null,retryLane:0};function _u(e){return{baseLanes:e,cachePool:null,transitions:null}}function cv(e,t,i){var r=t.pendingProps,s=xe.current,n=!1,o=(t.flags&128)!==0,c;if((c=o)||(c=e!==null&&e.memoizedState===null?!1:(s&2)!==0),c?(n=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(s|=1),he(xe,s&1),e===null)return xu(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(o=r.children,e=r.fallback,n?(r=t.mode,n=t.child,o={mode:"hidden",children:o},!(r&1)&&n!==null?(n.childLanes=0,n.pendingProps=o):n=bl(o,r,0,null),e=es(e,r,i,null),n.return=t,e.return=t,n.sibling=e,t.child=n,t.child.memoizedState=_u(i),t.memoizedState=Pu,e):lm(t,o));if(s=e.memoizedState,s!==null&&(c=s.dehydrated,c!==null))return c1(e,t,o,r,c,s,i);if(n){n=r.fallback,o=t.mode,s=e.child,c=s.sibling;var l={mode:"hidden",children:r.children};return!(o&1)&&t.child!==s?(r=t.child,r.childLanes=0,r.pendingProps=l,t.deletions=null):(r=wr(s,l),r.subtreeFlags=s.subtreeFlags&14680064),c!==null?n=wr(c,n):(n=es(n,o,i,null),n.flags|=2),n.return=t,r.return=t,r.sibling=n,t.child=r,r=n,n=t.child,o=e.child.memoizedState,o=o===null?_u(i):{baseLanes:o.baseLanes|i,cachePool:null,transitions:o.transitions},n.memoizedState=o,n.childLanes=e.childLanes&~i,t.memoizedState=Pu,r}return n=e.child,e=n.sibling,r=wr(n,{mode:"visible",children:r.children}),!(t.mode&1)&&(r.lanes=i),r.return=t,r.sibling=null,e!==null&&(i=t.deletions,i===null?(t.deletions=[e],t.flags|=16):i.push(e)),t.child=r,t.memoizedState=null,r}function lm(e,t){return t=bl({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Do(e,t,i,r){return r!==null&&Qh(r),dn(t,e.child,null,i),e=lm(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function c1(e,t,i,r,s,n,o){if(i)return t.flags&256?(t.flags&=-257,r=vd(Error(O(422))),Do(e,t,o,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(n=r.fallback,s=t.mode,r=bl({mode:"visible",children:r.children},s,0,null),n=es(n,s,o,null),n.flags|=2,r.return=t,n.return=t,r.sibling=n,t.child=r,t.mode&1&&dn(t,e.child,null,o),t.child.memoizedState=_u(o),t.memoizedState=Pu,n);if(!(t.mode&1))return Do(e,t,o,null);if(s.data==="$!"){if(r=s.nextSibling&&s.nextSibling.dataset,r)var c=r.dgst;return r=c,n=Error(O(419)),r=vd(n,r,void 0),Do(e,t,o,r)}if(c=(o&e.childLanes)!==0,ot||c){if(r=Be,r!==null){switch(o&-o){case 4:s=2;break;case 16:s=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:s=32;break;case 536870912:s=268435456;break;default:s=0}s=s&(r.suspendedLanes|o)?0:s,s!==0&&s!==n.retryLane&&(n.retryLane=s,Ni(e,s),ii(r,e,s,-1))}return gm(),r=vd(Error(O(421))),Do(e,t,o,r)}return s.data==="$?"?(t.flags|=128,t.child=e.child,t=k1.bind(null,e),s._reactRetry=t,null):(e=n.treeContext,gt=fr(s.nextSibling),ft=t,be=!0,Jt=null,e!==null&&(Tt[Et++]=ji,Tt[Et++]=Mi,Tt[Et++]=is,ji=e.id,Mi=e.overflow,is=t),t=lm(t,r.children),t.flags|=4096,t)}function og(e,t,i){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Au(e.return,t,i)}function wd(e,t,i,r,s){var n=e.memoizedState;n===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:i,tailMode:s}:(n.isBackwards=t,n.rendering=null,n.renderingStartTime=0,n.last=r,n.tail=i,n.tailMode=s)}function lv(e,t,i){var r=t.pendingProps,s=r.revealOrder,n=r.tail;if(Ze(e,t,r.children,i),r=xe.current,r&2)r=r&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&og(e,i,t);else if(e.tag===19)og(e,i,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(he(xe,r),!(t.mode&1))t.memoizedState=null;else switch(s){case"forwards":for(i=t.child,s=null;i!==null;)e=i.alternate,e!==null&&_c(e)===null&&(s=i),i=i.sibling;i=s,i===null?(s=t.child,t.child=null):(s=i.sibling,i.sibling=null),wd(t,!1,s,i,n);break;case"backwards":for(i=null,s=t.child,t.child=null;s!==null;){if(e=s.alternate,e!==null&&_c(e)===null){t.child=s;break}e=s.sibling,s.sibling=i,i=s,s=e}wd(t,!0,i,null,n);break;case"together":wd(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function ec(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Li(e,t,i){if(e!==null&&(t.dependencies=e.dependencies),ss|
vendor: 4,264 bytes, line 41
41=t.lanes,!(i&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(O(153));if(t.child!==null){for(e=t.child,i=wr(e,e.pendingProps),t.child=i,i.return=t;e.sibling!==null;)e=e.sibling,i=i.sibling=wr(e,e.pendingProps),i.return=t;i.sibling=null}return t.child}function l1(e,t,i){switch(t.tag){case 3:ov(t),ln();break;case 5:Ob(t);break;case 1:lt(t.type)&&Sc(t);break;case 4:tm(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,s=t.memoizedProps.value;he(Tc,r._currentValue),r._currentValue=s;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(he(xe,xe.current&1),t.flags|=128,null):i&t.child.childLanes?cv(e,t,i):(he(xe,xe.current&1),e=Li(e,t,i),e!==null?e.sibling:null);he(xe,xe.current&1);break;case 19:if(r=(i&t.childLanes)!==0,e.flags&128){if(r)return lv(e,t,i);t.flags|=128}if(s=t.memoizedState,s!==null&&(s.rendering=null,s.tail=null,s.lastEffect=null),he(xe,xe.current),r)break;return null;case 22:case 23:return t.lanes=0,nv(e,t,i)}return Li(e,t,i)}var dv,Iu,uv,hv;dv=function(e,t){for(var i=t.child;i!==null;){if(i.tag===5||i.tag===6)e.appendChild(i.stateNode);else if(i.tag!==4&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break;for(;i.sibling===null;){if(i.return===null||i.return===t)return;i=i.return}i.sibling.return=i.return,i=i.sibling}};Iu=function(){};uv=function(e,t,i,r){var s=e.memoizedProps;if(s!==r){e=t.stateNode,Wr(bi.current);var n=null;switch(i){case"input":s=Zd(e,s),r=Zd(e,r),n=[];break;case"select":s=Ce({},s,{value:void 0}),r=Ce({},r,{value:void 0}),n=[];break;case"textarea":s=iu(e,s),r=iu(e,r),n=[];break;default:typeof s.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=xc)}su(i,r);var o;i=null;for(d in s)if(!r.hasOwnProperty(d)&&s.hasOwnProperty(d)&&s[d]!=null)if(d==="style"){var c=s[d];for(o in c)c.hasOwnProperty(o)&&(i||(i={}),i[o]="")}else d!=="dangerouslySetInnerHTML"&&d!=="children"&&d!=="suppressContentEditableWarning"&&d!=="suppressHydrationWarning"&&d!=="autoFocus"&&(ma.hasOwnProperty(d)?n||(n=[]):(n=n||[]).push(d,null));for(d in r){var l=r[d];if(c=s!=null?s[d]:void 0,r.hasOwnProperty(d)&&l!==c&&(l!=null||c!=null))if(d==="style")if(c){for(o in c)!c.hasOwnProperty(o)||l&&l.hasOwnProperty(o)||(i||(i={}),i[o]="");for(o in l)l.hasOwnProperty(o)&&c[o]!==l[o]&&(i||(i={}),i[o]=l[o])}else i||(n||(n=[]),n.push(d,i)),i=l;else d==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,c=c?c.__html:void 0,l!=null&&c!==l&&(n=n||[]).push(d,l)):d==="children"?typeof l!="string"&&typeof l!="number"||(n=n||[]).push(d,""+l):d!=="suppressContentEditableWarning"&&d!=="suppressHydrationWarning"&&(ma.hasOwnProperty(d)?(l!=null&&d==="onScroll"&&pe("scroll",e),n||c===l||(n=[])):(n=n||[]).push(d,l))}i&&(n=n||[]).push("style",i);var d=n;(t.updateQueue=d)&&(t.flags|=4)}};hv=function(e,t,i,r){i!==r&&(t.flags|=4)};function Nn(e,t){if(!be)switch(e.tailMode){case"hidden":t=e.tail;for(var i=null;t!==null;)t.alternate!==null&&(i=t),t=t.sibling;i===null?e.tail=null:i.sibling=null;break;case"collapsed":i=e.tail;for(var r=null;i!==null;)i.alternate!==null&&(r=i),i=i.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ke(e){var t=e.alternate!==null&&e.alternate.child===e.child,i=0,r=0;if(t)for(var s=e.child;s!==null;)i|=s.lanes|s.childLanes,r|=s.subtreeFlags&14680064,r|=s.flags&14680064,s.return=e,s=s.sibling;else for(s=e.child;s!==null;)i|=s.lanes|s.childLanes,r|=s.subtreeFlags,r|=s.flags,s.return=e,s=s.sibling;return e.subtreeFlags|=r,e.childLanes=i,t}function d1(e,t,i){var r=t.pendingProps;switch(Kh(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ke(t),null;case 1:return lt(t.type)&&Ac(),Ke(t),null;case 3:return r=t.stateNode,un(),fe(ct),fe(Je),rm(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(So(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Jt!==null&&(Bu(Jt),Jt=null))),Iu(e,t),Ke(t),null;case 5:im(t);var s=Wr(Ca.current);if(i=t.type,e!==null&&t.stateNode!=null)uv(e,t,i,r,s),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(O(166));return Ke(t),null}if(e=Wr(bi.current),So(t)){r=t.stateNode,i=t.type;var n=t.memoizedProps;
vendor: 33,008 bytes, line 41
41switch(r[fi]=t,r[Aa]=n,e=(t.mode&1)!==0,i){case"dialog":pe("cancel",r),pe("close",r);break;case"iframe":case"object":case"embed":pe("load",r);break;case"video":case"audio":for(s=0;s<Qn.length;s++)pe(Qn[s],r);break;case"source":pe("error",r);break;case"img":case"image":case"link":pe("error",r),pe("load",r);break;case"details":pe("toggle",r);break;case"input":fp(r,n),pe("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!n.multiple},pe("invalid",r);break;case"textarea":bp(r,n),pe("invalid",r)}su(i,n),s=null;for(var o in n)if(n.hasOwnProperty(o)){var c=n[o];o==="children"?typeof c=="string"?r.textContent!==c&&(n.suppressHydrationWarning!==!0&&Ao(r.textContent,c,e),s=["children",c]):typeof c=="number"&&r.textContent!==""+c&&(n.suppressHydrationWarning!==!0&&Ao(r.textContent,c,e),s=["children",""+c]):ma.hasOwnProperty(o)&&c!=null&&o==="onScroll"&&pe("scroll",r)}switch(i){case"input":go(r),yp(r,n,!0);break;case"textarea":go(r),vp(r);break;case"select":case"option":break;default:typeof n.onClick=="function"&&(r.onclick=xc)}r=s,t.updateQueue=r,r!==null&&(t.flags|=4)}else{o=s.nodeType===9?s:s.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=Uy(i)),e==="http://www.w3.org/1999/xhtml"?i==="script"?(e=o.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=o.createElement(i,{is:r.is}):(e=o.createElement(i),i==="select"&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,i),e[fi]=t,e[Aa]=r,dv(e,t,!1,!1),t.stateNode=e;e:{switch(o=nu(i,r),i){case"dialog":pe("cancel",e),pe("close",e),s=r;break;case"iframe":case"object":case"embed":pe("load",e),s=r;break;case"video":case"audio":for(s=0;s<Qn.length;s++)pe(Qn[s],e);s=r;break;case"source":pe("error",e),s=r;break;case"img":case"image":case"link":pe("error",e),pe("load",e),s=r;break;case"details":pe("toggle",e),s=r;break;case"input":fp(e,r),s=Zd(e,r),pe("invalid",e);break;case"option":s=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},s=Ce({},r,{value:void 0}),pe("invalid",e);break;case"textarea":bp(e,r),s=iu(e,r),pe("invalid",e);break;default:s=r}su(i,s),c=s;for(n in c)if(c.hasOwnProperty(n)){var l=c[n];n==="style"?Wy(e,l):n==="dangerouslySetInnerHTML"?(l=l?l.__html:void 0,l!=null&&qy(e,l)):n==="children"?typeof l=="string"?(i!=="textarea"||l!=="")&&pa(e,l):typeof l=="number"&&pa(e,""+l):n!=="suppressContentEditableWarning"&&n!=="suppressHydrationWarning"&&n!=="autoFocus"&&(ma.hasOwnProperty(n)?l!=null&&n==="onScroll"&&pe("scroll",e):l!=null&&Mh(e,n,l,o))}switch(i){case"input":go(e),yp(e,r,!1);break;case"textarea":go(e),vp(e);break;case"option":r.value!=null&&e.setAttribute("value",""+xr(r.value));break;case"select":e.multiple=!!r.multiple,n=r.value,n!=null?Bs(e,!!r.multiple,n,!1):r.defaultValue!=null&&Bs(e,!!r.multiple,r.defaultValue,!0);break;default:typeof s.onClick=="function"&&(e.onclick=xc)}switch(i){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return Ke(t),null;case 6:if(e&&t.stateNode!=null)hv(e,t,e.memoizedProps,r);else{if(typeof r!="string"&&t.stateNode===null)throw Error(O(166));if(i=Wr(Ca.current),Wr(bi.current),So(t)){if(r=t.stateNode,i=t.memoizedProps,r[fi]=t,(n=r.nodeValue!==i)&&(e=ft,e!==null))switch(e.tag){case 3:Ao(r.nodeValue,i,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Ao(r.nodeValue,i,(e.mode&1)!==0)}n&&(t.flags|=4)}else r=(i.nodeType===9?i:i.ownerDocument).createTextNode(r),r[fi]=t,t.stateNode=r}return Ke(t),null;case 13:if(fe(xe),r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(be&>!==null&&t.mode&1&&!(t.flags&128))_b(),ln(),t.flags|=98560,n=!1;else if(n=So(t),r!==null&&r.dehydrated!==null){if(e===null){if(!n)throw Error(O(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(O(317));n[fi]=t}else ln(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Ke(t),n=!1}else Jt!==null&&(Bu(Jt),Jt=null),n=!0;if(!n)return t.flags&65536?t:null}return t.flags&128?(t.lanes=i,t):(r=r!==null,r!==(e!==null&&e.memoizedState!==null)&&r&&(t.child.flags|=8192,t.mode&1&&(e===null||xe.current&1?Oe===0&&(Oe=3):gm())),t.updateQueue!==null&&(t.flags|=4),Ke(t),null);case 4:return un(),Iu(e,t),e===null&&ka(t.stateNode.containerInfo),Ke(t),null;case 10:return Yh(t.type._context),Ke(t),null;case 17:return lt(t.type)&&Ac(),Ke(t),null;case 19:if(fe(xe),n=t.memoizedState,n===null)return Ke(t),null;if(r=(t.flags&128)!==0,o=n.rendering,o===null)if(r)Nn(n,!1);else{if(Oe!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=_c(e),o!==null){for(t.flags|=128,Nn(n,!1),r=o.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=i,i=t.child;i!==null;)n=i,e=r,n.flags&=14680066,o=n.alternate,o===null?(n.childLanes=0,n.lanes=e,n.child=null,n.subtreeFlags=0,n.memoizedProps=null,n.memoizedState=null,n.updateQueue=null,n.dependencies=null,n.stateNode=null):(n.childLanes=o.childLanes,n.lanes=o.lanes,n.child=o.child,n.subtreeFlags=0,n.deletions=null,n.memoizedProps=o.memoizedProps,n.memoizedState=o.memoizedState,n.updateQueue=o.updateQueue,n.type=o.type,e=o.dependencies,n.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),i=i.sibling;return he(xe,xe.current&1|2),t.child}e=e.sibling}n.tail!==null&&Pe()>mn&&(t.flags|=128,r=!0,Nn(n,!1),t.lanes=4194304)}else{if(!r)if(e=_c(o),e!==null){if(t.flags|=128,r=!0,i=e.updateQueue,i!==null&&(t.updateQueue=i,t.flags|=4),Nn(n,!0),n.tail===null&&n.tailMode==="hidden"&&!o.alternate&&!be)return Ke(t),null}else 2*Pe()-n.renderingStartTime>mn&&i!==1073741824&&(t.flags|=128,r=!0,Nn(n,!1),t.lanes=4194304);n.isBackwards?(o.sibling=t.child,t.child=o):(i=n.last,i!==null?i.sibling=o:t.child=o,n.last=o)}return n.tail!==null?(t=n.tail,n.rendering=t,n.tail=t.sibling,n.renderingStartTime=Pe(),t.sibling=null,i=xe.current,he(xe,r?i&1|2:i&1),t):(Ke(t),null);case 22:case 23:return pm(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ut&1073741824&&(Ke(t),t.subtreeFlags&6&&(t.flags|=8192)):Ke(t),null;case 24:return null;case 25:return null}throw Error(O(156,t.tag))}function u1(e,t){switch(Kh(t),t.tag){case 1:return lt(t.type)&&Ac(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return un(),fe(ct),fe(Je),rm(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return im(t),null;case 13:if(fe(xe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(O(340));ln()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return fe(xe),null;case 4:return un(),null;case 10:return Yh(t.type._context),null;case 22:case 23:return pm(),null;case 24:return null;default:return null}}var To=!1,Xe=!1,h1=typeof WeakSet=="function"?WeakSet:Set,W=null;function Fs(e,t){var i=e.ref;if(i!==null)if(typeof i=="function")try{i(null)}catch(r){Ee(e,t,r)}else i.current=null}function ju(e,t,i){try{i()}catch(r){Ee(e,t,r)}}var cg=!1;function m1(e,t){if(gu=vc,e=yb(),Vh(e)){if("selectionStart"in e)var i={start:e.selectionStart,end:e.selectionEnd};else e:{i=(i=e.ownerDocument)&&i.defaultView||window;var r=i.getSelection&&i.getSelection();if(r&&r.rangeCount!==0){i=r.anchorNode;var s=r.anchorOffset,n=r.focusNode;r=r.focusOffset;try{i.nodeType,n.nodeType}catch{i=null;break e}var o=0,c=-1,l=-1,d=0,u=0,h=e,g=null;t:for(;;){for(var m;h!==i||s!==0&&h.nodeType!==3||(c=o+s),h!==n||r!==0&&h.nodeType!==3||(l=o+r),h.nodeType===3&&(o+=h.nodeValue.length),(m=h.firstChild)!==null;)g=h,h=m;for(;;){if(h===e)break t;if(g===i&&++d===s&&(c=o),g===n&&++u===r&&(l=o),(m=h.nextSibling)!==null)break;h=g,g=h.parentNode}h=m}i=c===-1||l===-1?null:{start:c,end:l}}else i=null}i=i||{start:0,end:0}}else i=null;for(fu={focusedElem:e,selectionRange:i},vc=!1,W=t;W!==null;)if(t=W,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,W=e;else for(;W!==null;){t=W;try{var w=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var v=w.memoizedProps,k=w.memoizedState,y=t.stateNode,f=y.getSnapshotBeforeUpdate(t.elementType===t.type?v:Ht(t.type,v),k);y.__reactInternalSnapshotBeforeUpdate=f}break;case 3:var b=t.stateNode.containerInfo;b.nodeType===1?b.textContent="":b.nodeType===9&&b.documentElement&&b.removeChild(b.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(O(163))}}catch(x){Ee(t,t.return,x)}if(e=t.sibling,e!==null){e.return=t.return,W=e;break}W=t.return}return w=cg,cg=!1,w}function na(e,t,i){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var s=r=r.next;do{if((s.tag&e)===e){var n=s.destroy;s.destroy=void 0,n!==void 0&&ju(t,i,n)}s=s.next}while(s!==r)}}function fl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var i=t=t.next;do{if((i.tag&e)===e){var r=i.create;i.destroy=r()}i=i.next}while(i!==t)}}function Mu(e){var t=e.ref;if(t!==null){var i=e.stateNode;switch(e.tag){case 5:e=i;break;default:e=i}typeof t=="function"?t(e):t.current=e}}function mv(e){var t=e.alternate;t!==null&&(e.alternate=null,mv(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[fi],delete t[Aa],delete t[vu],delete t[QA],delete t[XA])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function pv(e){return e.tag===5||e.tag===3||e.tag===4}function lg(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||pv(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ru(e,t,i){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?i.nodeType===8?i.parentNode.insertBefore(e,t):i.insertBefore(e,t):(i.nodeType===8?(t=i.parentNode,t.insertBefore(e,i)):(t=i,t.appendChild(e)),i=i._reactRootContainer,i!=null||t.onclick!==null||(t.onclick=xc));else if(r!==4&&(e=e.child,e!==null))for(Ru(e,t,i),e=e.sibling;e!==null;)Ru(e,t,i),e=e.sibling}function Ou(e,t,i){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?i.insertBefore(e,t):i.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Ou(e,t,i),e=e.sibling;e!==null;)Ou(e,t,i),e=e.sibling}var ze=null,Xt=!1;function Ki(e,t,i){for(i=i.child;i!==null;)gv(e,t,i),i=i.sibling}function gv(e,t,i){if(yi&&typeof yi.onCommitFiberUnmount=="function")try{yi.onCommitFiberUnmount(cl,i)}catch{}switch(i.tag){case 5:Xe||Fs(i,t);case 6:var r=ze,s=Xt;ze=null,Ki(e,t,i),ze=r,Xt=s,ze!==null&&(Xt?(e=ze,i=i.stateNode,e.nodeType===8?e.parentNode.removeChild(i):e.removeChild(i)):ze.removeChild(i.stateNode));break;case 18:ze!==null&&(Xt?(e=ze,i=i.stateNode,e.nodeType===8?md(e.parentNode,i):e.nodeType===1&&md(e,i),ba(e)):md(ze,i.stateNode));break;case 4:r=ze,s=Xt,ze=i.stateNode.containerInfo,Xt=!0,Ki(e,t,i),ze=r,Xt=s;break;case 0:case 11:case 14:case 15:if(!Xe&&(r=i.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){s=r=r.next;do{var n=s,o=n.destroy;n=n.tag,o!==void 0&&(n&2||n&4)&&ju(i,t,o),s=s.next}while(s!==r)}Ki(e,t,i);break;case 1:if(!Xe&&(Fs(i,t),r=i.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=i.memoizedProps,r.state=i.memoizedState,r.componentWillUnmount()}catch(c){Ee(i,t,c)}Ki(e,t,i);break;case 21:Ki(e,t,i);break;case 22:i.mode&1?(Xe=(r=Xe)||i.memoizedState!==null,Ki(e,t,i),Xe=r):Ki(e,t,i);break;default:Ki(e,t,i)}}function dg(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var i=e.stateNode;i===null&&(i=e.stateNode=new h1),t.forEach(function(r){var s=x1.bind(null,e,r);i.has(r)||(i.add(r),r.then(s,s))})}}function qt(e,t){var i=t.deletions;if(i!==null)for(var r=0;r<i.length;r++){var s=i[r];try{var n=e,o=t,c=o;e:for(;c!==null;){switch(c.tag){case 5:ze=c.stateNode,Xt=!1;break e;case 3:ze=c.stateNode.containerInfo,Xt=!0;break e;case 4:ze=c.stateNode.containerInfo,Xt=!0;break e}c=c.return}if(ze===null)throw Error(O(160));gv(n,o,s),ze=null,Xt=!1;var l=s.alternate;l!==null&&(l.return=null),s.return=null}catch(d){Ee(s,t,d)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)fv(t,e),t=t.sibling}function fv(e,t){var i=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(qt(t,e),ci(e),r&4){try{na(3,e,e.return),fl(3,e)}catch(v){Ee(e,e.return,v)}try{na(5,e,e.return)}catch(v){Ee(e,e.return,v)}}break;case 1:qt(t,e),ci(e),r&512&&i!==null&&Fs(i,i.return);break;case 5:if(qt(t,e),ci(e),r&512&&i!==null&&Fs(i,i.return),e.flags&32){var s=e.stateNode;try{pa(s,"")}catch(v){Ee(e,e.return,v)}}if(r&4&&(s=e.stateNode,s!=null)){var n=e.memoizedProps,o=i!==null?i.memoizedProps:n,c=e.type,l=e.updateQueue;if(e.updateQueue=null,l!==null)try{c==="input"&&n.type==="radio"&&n.name!=null&&Ly(s,n),nu(c,o);var d=nu(c,n);for(o=0;o<l.length;o+=2){var u=l[o],h=l[o+1];u==="style"?Wy(s,h):u==="dangerouslySetInnerHTML"?qy(s,h):u==="children"?pa(s,h):Mh(s,u,h,d)}switch(c){case"input":eu(s,n);break;case"textarea":By(s,n);break;case"select":var g=s._wrapperState.wasMultiple;s._wrapperState.wasMultiple=!!n.multiple;var m=n.value;m!=null?Bs(s,!!n.multiple,m,!1):g!==!!n.multiple&&(n.defaultValue!=null?Bs(s,!!n.multiple,n.defaultValue,!0):Bs(s,!!n.multiple,n.multiple?[]:"",!1))}s[Aa]=n}catch(v){Ee(e,e.return,v)}}break;case 6:if(qt(t,e),ci(e),r&4){if(e.stateNode===null)throw Error(O(162));s=e.stateNode,n=e.memoizedProps;try{s.nodeValue=n}catch(v){Ee(e,e.return,v)}}break;case 3:if(qt(t,e),ci(e),r&4&&i!==null&&i.memoizedState.isDehydrated)try{ba(t.containerInfo)}catch(v){Ee(e,e.return,v)}break;case 4:qt(t,e),ci(e);break;case 13:qt(t,e),ci(e),s=e.child,s.flags&8192&&(n=s.memoizedState!==null,s.stateNode.isHidden=n,!n||s.alternate!==null&&s.alternate.memoizedState!==null||(hm=Pe())),r&4&&dg(e);break;case 22:if(u=i!==null&&i.memoizedState!==null,e.mode&1?(Xe=(d=Xe)||u,qt(t,e),Xe=d):qt(t,e),ci(e),r&8192){if(d=e.memoizedState!==null,(e.stateNode.isHidden=d)&&!u&&e.mode&1)for(W=e,u=e.child;u!==null;){for(h=W=u;W!==null;){switch(g=W,m=g.child,g.tag){case 0:case 11:case 14:case 15:na(4,g,g.return);break;case 1:Fs(g,g.return);var w=g.stateNode;if(typeof w.componentWillUnmount=="function"){r=g,i=g.return;try{t=r,w.props=t.memoizedProps,w.state=t.memoizedState,w.componentWillUnmount()}catch(v){Ee(r,i,v)}}break;case 5:Fs(g,g.return);break;case 22:if(g.memoizedState!==null){hg(h);continue}}m!==null?(m.return=g,W=m):hg(h)}u=u.sibling}e:for(u=null,h=e;;){if(h.tag===5){if(u===null){u=h;try{s=h.stateNode,d?(n=s.style,typeof n.setProperty=="function"?n.setProperty("display","none","important"):n.display="none"):(c=h.stateNode,l=h.memoizedProps.style,o=l!=null&&l.hasOwnProperty("display")?l.display:null,c.style.display=zy("display",o))}catch(v){Ee(e,e.return,v)}}}else if(h.tag===6){if(u===null)try{h.stateNode.nodeValue=d?"":h.memoizedProps}catch(v){Ee(e,e.return,v)}}else if((h.tag!==22&&h.tag!==23||h.memoizedState===null||h===e)&&h.child!==null){h.child.return=h,h=h.child;continue}if(h===e)break e;for(;h.sibling===null;){if(h.return===null||h.return===e)break e;u===h&&(u=null),h=h.return}u===h&&(u=null),h.sibling.return=h.return,h=h.sibling}}break;case 19:qt(t,e),ci(e),r&4&&dg(e);break;case 21:break;default:qt(t,e),ci(e)}}function ci(e){var t=e.flags;if(t&2){try{e:{for(var i=e.return;i!==null;){if(pv(i)){var r=i;break e}i=i.return}throw Error(O(160))}switch(r.tag){case 5:var s=r.stateNode;r.flags&32&&(pa(s,""),r.flags&=-33);var n=lg(e);Ou(e,n,s);break;case 3:case 4:var o=r.stateNode.containerInfo,c=lg(e);Ru(e,c,o);break;default:throw Error(O(161))}}catch(l){Ee(e,e.return,l)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function p1(e,t,i){W=e,yv(e)}function yv(e,t,i){for(var r=(e.mode&1)!==0;W!==null;){var s=W,n=s.child;if(s.tag===22&&r){var o=s.memoizedState!==null||To;if(!o){var c=s.alternate,l=c!==null&&c.memoizedState!==null||Xe;c=To;var d=Xe;if(To=o,(Xe=l)&&!d)for(W=s;W!==null;)o=W,l=o.child,o.tag===22&&o.memoizedState!==null?mg(s):l!==null?(l.return=o,W=l):mg(s);for(;n!==null;)W=n,yv(n),n=n.sibling;W=s,To=c,Xe=d}ug(e)}else s.subtreeFlags&8772&&n!==null?(n.return=s,W=n):ug(e)}}function ug(e){for(;W!==null;){var t=W;if(t.flags&8772){var i=t.alternate;try{if(t.flags&8772)switch(t.tag){case 0:case 11:case 15:Xe||fl(5,t);break;case 1:var r=t.stateNode;if(t.flags&4&&!Xe)if(i===null)r.componentDidMount();else{var s=t.elementType===t.type?i.memoizedProps:Ht(t.type,i.memoizedProps);r.componentDidUpdate(s,i.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var n=t.updateQueue;n!==null&&Qp(t,n,r);break;case 3:var o=t.updateQueue;if(o!==null){if(i=null,t.child!==null)switch(t.child.tag){case 5:i=t.child.stateNode;break;case 1:i=t.child.stateNode}Qp(t,o,i)}break;case 5:var c=t.stateNode;if(i===null&&t.flags&4){i=c;var l=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":l.autoFocus&&i.focus();break;case"img":l.src&&(i.src=l.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var d=t.alternate;if(d!==null){var u=d.memoizedState;if(u!==null){var h=u.dehydrated;h!==null&&ba(h)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(O(163))}Xe||t.flags&512&&Mu(t)}catch(g){Ee(t,t.return,g)}}if(t===e){W=null;break}if(i=t.sibling,i!==null){i.return=t.return,W=i;break}W=t.return}}function hg(e){for(;W!==null;){var t=W;if(t===e){W=null;break}var i=t.sibling;if(i!==null){i.return=t.return,W=i;break}W=t.return}}function mg(e){for(;W!==null;){var t=W;try{switch(t.tag){case 0:case 11:case 15:var i=t.return;try{fl(4,t)}catch(l){Ee(t,i,l)}break;case 1:var r=t.stateNode;if(typeof r.componentDidMount=="function"){var s=t.return;try{r.componentDidMount()}catch(l){Ee(t,s,l)}}var n=t.return;try{Mu(t)}catch(l){Ee(t,n,l)}break;case 5:var o=t.return;try{Mu(t)}catch(l){Ee(t,o,l)}}}catch(l){Ee(t,t.return,l)}if(t===e){W=null;break}var c=t.sibling;if(c!==null){c.return=t.return,W=c;break}W=t.return}}var g1=Math.ceil,Mc=qi.ReactCurrentDispatcher,dm=qi.ReactCurrentOwner,_t=qi.ReactCurrentBatchConfig,oe=0,Be=null,je=null,We=0,ut=0,Ns=_r(0),Oe=0,Pa=null,ss=0,yl=0,um=0,aa=null,at=null,hm=0,mn=1/0,Ti=null,Rc=!1,Fu=null,br=null,Eo=!1,ur=null,Oc=0,oa=0,Nu=null,tc=-1,ic=0;function tt(){return oe&6?Pe():tc!==-1?tc:tc=Pe()}function vr(e){return e.mode&1?oe&2&&We!==0?We&-We:YA.transition!==null?(ic===0&&(ic=tb()),ic):(e=le,e!==0||(e=window.event,e=e===void 0?16:cb(e.type)),e):1}function ii(e,t,i,r){if(50<oa)throw oa=0,Nu=null,Error(O(185));Ka(e,i,r),(!(oe&2)||e!==Be)&&(e===Be&&(!(oe&2)&&(yl|=i),Oe===4&&ir(e,We)),dt(e,r),i===1&&oe===0&&!(t.mode&1)&&(mn=Pe()+500,ml&&Ir()))}function dt(e,t){var i=e.callbackNode;Yx(e,t);var r=bc(e,e===Be?We:0);if(r===0)i!==null&&xp(i),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(i!=null&&xp(i),t===1)e.tag===0?JA(pg.bind(null,e)):Tb(pg.bind(null,e)),GA(function(){!(oe&6)&&Ir()}),i=null;else{switch(ib(r)){case 1:i=Lh;break;case 4:i=Zy;break;case 16:i=yc;break;case 536870912:i=eb;break;default:i=yc}i=Cv(i,bv.bind(null,e))}e.callbackPriority=t,e.callbackNode=i}}function bv(e,t){if(tc=-1,ic=0,oe&6)throw Error(O(327));var i=e.callbackNode;if($s()&&e.callbackNode!==i)return null;var r=bc(e,e===Be?We:0);if(r===0)return null;if(r&30||r&e.expiredLanes||t)t=Fc(e,r);else{t=r;var s=oe;oe|=2;var n=wv();(Be!==e||We!==t)&&(Ti=null,mn=Pe()+500,Zr(e,t));do try{b1();break}catch(c){vv(e,c)}while(!0);Jh(),Mc.current=n,oe=s,je!==null?t=0:(Be=null,We=0,t=Oe)}if(t!==0){if(t===2&&(s=du(e),s!==0&&(r=s,t=Lu(e,s))),t===1)throw i=Pa,Zr(e,0),ir(e,r),dt(e,Pe()),i;if(t===6)ir(e,r);else{if(s=e.current.alternate,!(r&30)&&!f1(s)&&(t=Fc(e,r),t===2&&(n=du(e),n!==0&&(r=n,t=Lu(e,n))),t===1))throw i=Pa,Zr(e,0),ir(e,r),dt(e,Pe()),i;switch(e.finishedWork=s,e.finishedLanes=r,t){case 0:case 1:throw Error(O(345));case 2:Br(e,at,Ti);break;case 3:if(ir(e,r),(r&130023424)===r&&(t=hm+500-Pe(),10<t)){if(bc(e,0)!==0)break;if(s=e.suspendedLanes,(s&r)!==r){tt(),e.pingedLanes|=e.suspendedLanes&s;break}e.timeoutHandle=bu(Br.bind(null,e,at,Ti),t);break}Br(e,at,Ti);break;case 4:if(ir(e,r),(r&4194240)===r)break;for(t=e.eventTimes,s=-1;0<r;){var o=31-ti(r);n=1<<o,o=t[o],o>s&&(s=o),r&=~n}if(r=s,r=Pe()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*g1(r/1960))-r,10<r){e.timeoutHandle=bu(Br.bind(null,e,at,Ti),r);break}Br(e,at,Ti);break;case 5:Br(e,at,Ti);break;default:throw Error(O(329))}}}return dt(e,Pe()),e.callbackNode===i?bv.bind(null,e):null}function Lu(e,t){var i=aa;return e.current.memoizedState.isDehydrated&&(Zr(e,t).flags|=256),e=Fc(e,t),e!==2&&(t=at,at=i,t!==null&&Bu(t)),e}function Bu(e){at===null?at=e:at.push.apply(at,e)}function f1(e){for(var t=e;;){if(t.flags&16384){var i=t.updateQueue;if(i!==null&&(i=i.stores,i!==null))for(var r=0;r<i.length;r++){var s=i[r],n=s.getSnapshot;s=s.value;try{if(!ri(n(),s))return!1}catch{return!1}}}if(i=t.child,t.subtreeFlags&16384&&i!==null)i.return=t,t=i;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function ir(e,t){for(t&=~um,t&=~yl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var i=31-ti(t),r=1<<i;e[i]=-1,t&=~r}}function pg(e){if(oe&6)throw Error(O(327));$s();var t=bc(e,0);if(!(t&1))return dt(e,Pe()),null;var i=Fc(e,t);if(e.tag!==0&&i===2){var r=du(e);r!==0&&(t=r,i=Lu(e,r))}if(i===1)throw i=Pa,Zr(e,0),ir(e,t),dt(e,Pe()),i;if(i===6)throw Error(O(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Br(e,at,Ti),dt(e,Pe()),null}function mm(e,t){var i=oe;oe|=1;try{return e(t)}finally{oe=i,oe===0&&(mn=Pe()+500,ml&&Ir())}}function ns(e){ur!==null&&ur.tag===0&&!(oe&6)&&$s();var t=oe;oe|=1;var i=_t.transition,r=le;try{if(_t.transition=null,le=1,e)return e()}finally{le=r,_t.transition=i,oe=t,!(oe&6)&&Ir()}}function pm(){ut=Ns.current,fe(Ns)}function Zr(e,t){e.finishedWork=null,e.finishedLanes=0;var i=e.timeoutHandle;if(i!==-1&&(e.timeoutHandle=-1,VA(i)),je!==null)for(i=je.return;i!==null;){var r=i;switch(Kh(r),r.tag){case 1:r=r.type.childContextTypes,r!=null&&Ac();break;case 3:un(),fe(ct),fe(Je),rm();break;case 5:im(r);break;case 4:un();break;case 13:fe(xe);break;case 19:fe(xe);break;case 10:Yh(r.type._context);break;case 22:case 23:pm()}i=i.return}if(Be=e,je=e=wr(e.current,null),We=ut=t,Oe=0,Pa=null,um=yl=ss=0,at=aa=null,zr!==null){for(t=0;t<zr.length;t++)if(i=zr[t],r=i.interleaved,r!==null){i.interleaved=null;var s=r.next,n=i.pending;if(n!==null){var o=n.next;n.next=s,r.next=o}i.pending=r}zr=null}return e}function vv(e,t){do{var i=je;try{if(Jh(),Yo.current=jc,Ic){for(var r=Ae.memoizedState;r!==null;){var s=r.queue;s!==null&&(s.pending=null),r=r.next}Ic=!1}if(rs=0,Le=Re=Ae=null,sa=!1,Da=0,dm.current=null,i===null||i.return===null){Oe=1,Pa=t,je=null;break}e:{var n=e,o=i.return,c=i,l=t;if(t=We,c.flags|=32768,l!==null&&typeof l=="object"&&typeof l.then=="function"){var d=l,u=c,h=u.tag;if(!(u.mode&1)&&(h===0||h===11||h===15)){var g=u.alternate;g?(u.updateQueue=g.updateQueue,u.memoizedState=g.memoizedState,u.lanes=g.lanes):(u.updateQueue=null,u.memoizedState=null)}var m=tg(o);if(m!==null){m.flags&=-257,ig(m,o,c,n,t),m.mode&1&&eg(n,d,t),t=m,l=d;var w=t.updateQueue;if(w===null){var v=new Set;v.add(l),t.updateQueue=v}else w.add(l);break e}else{if(!(t&1)){eg(n,d,t),gm();break e}l=Error(O(426))}}else if(be&&c.mode&1){var k=tg(o);if(k!==null){!(k.flags&65536)&&(k.flags|=256),ig(k,o,c,n,t),Qh(hn(l,c));break e}}n=l=hn(l,c),Oe!==4&&(Oe=2),aa===null?aa=[n]:aa.push(n),n=o;do{switch(n.tag){case 3:n.flags|=65536,t&=-t,n.lanes|=t;var y=iv(n,l,t);Kp(n,y);break e;case 1:c=l;var f=n.type,b=n.stateNode;if(!(n.flags&128)&&(typeof f.getDerivedStateFromError=="function"||b!==null&&typeof b.componentDidCatch=="function"&&(br===null||!br.has(b)))){n.flags|=65536,t&=-t,n.lanes|=t;var x=rv(n,c,t);Kp(n,x);break e}}n=n.return}while(n!==null)}xv(i)}catch(C){t=C,je===i&&i!==null&&(je=i=i.return);continue}break}while(!0)}function wv(){var e=Mc.current;return Mc.current=jc,e===null?jc:e}function gm(){(Oe===0||Oe===3||Oe===2)&&(Oe=4),Be===null||!(ss&268435455)&&!(yl&268435455)||ir(Be,We)}function Fc(e,t){var i=oe;oe|=2;var r=wv();(Be!==e||We!==t)&&(Ti=null,Zr(e,t));do try{y1();break}catch(s){vv(e,s)}while(!0);if(Jh(),oe=i,Mc.current=r,je!==null)throw Error(O(261));return Be=null,We=0,Oe}function y1(){for(;je!==null;)kv(je)}function b1(){for(;je!==null&&!Wx();)kv(je)}function kv(e){var t=Sv(e.alternate,e,ut);e.memoizedProps=e.pendingProps,t===null?xv(e):je=t,dm.current=null}function xv(e){var t=e;do{var i=t.alternate;if(e=t.return,t.flags&32768){if(i=u1(i,t),i!==null){i.flags&=32767,je=i;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Oe=6,je=null;return}}else if(i=d1(i,t,ut),i!==null){je=i;return}if(t=t.sibling,t!==null){je=t;return}je=t=e}while(t!==null);Oe===0&&(Oe=5)}function Br(e,t,i){var r=le,s=_t.transition;try{_t.transition=null,le=1,v1(e,t,i,r)}finally{_t.transition=s,le=r}return null}function v1(e,t,i,r){do $s();while(ur!==null);if(oe&6)throw Error(O(327));i=e.finishedWork;var s=e.finishedLanes;if(i===null)return null;if(e.finishedWork=null,e.finishedLanes=0,i===e.current)throw Error(O(177));e.callbackNode=null,e.callbackPriority=0;var n=i.lanes|i.childLanes;if(Zx(e,n),e===Be&&(je=Be=null,We=0),!(i.subtreeFlags&2064)&&!(i.flags&2064)||Eo||(Eo=!0,Cv(yc,function(){return $s(),null})),n=(i.flags&15990)!==0,i.subtreeFlags&15990||n){n=_t.transition,_t.transition=null;var o=le;le=1;var c=oe;oe|=4,dm.current=null,m1(e,i),fv(i,e),BA(fu),vc=!!gu,fu=gu=null,e.current=i,p1(i),$x(),oe=c,le=o,_t.transition=n}else e.current=i;if(Eo&&(Eo=!1,ur=e,Oc=s),n=e.pendingLanes,n===0&&(br=null),Gx(i.stateNode),dt(e,Pe()),t!==null)for(r=e.onRecoverableError,i=0;i<t.length;i++)s=t[i],r(s.value,{componentStack:s.stack,digest:s.digest});if(Rc)throw Rc=!1,e=Fu,Fu=null,e;return Oc&1&&e.tag!==0&&$s(),n=e.pendingLanes,n&1?e===Nu?oa++:(oa=0,Nu=e):oa=0,Ir(),null}function $s(){if(ur!==null){var e=ib(Oc),t=_t.transition,i=le;try{if(_t.transition=null,le=16>e?16:e,ur===null)var r=!1;else{if(e=ur,ur=null,Oc=0,oe&6)throw Error(O(331));var s=oe;for(oe|=4,W=e.current;W!==null;){var n=W,o=n.child;if(W.flags&16){var c=n.deletions;if(c!==null){for(var l=0;l<c.length;l++){var d=c[l];for(W=d;W!==null;){var u=W;switch(u.tag){case 0:case 11:case 15:na(8,u,n)}var h=u.child;if(h!==null)h.return=u,W=h;else for(;W!==null;){u=W;var g=u.sibling,m=u.return;if(mv(u),u===d){W=null;break}if(g!==null){g.return=m,W=g;break}W=m}}}var w=n.alternate;if(w!==null){var v=w.child;if(v!==null){w.child=null;do{var k=v.sibling;v.sibling=null,v=k}while(v!==null)}}W=n}}if(n.subtreeFlags&2064&&o!==null)o.return=n,W=o;else e:for(;W!==null;){if(n=W,n.flags&2048)switch(n.tag){case 0:case 11:case 15:na(9,n,n.return)}var y=n.sibling;if(y!==null){y.return=n.return,W=y;break e}W=n.return}}var f=e.current;for(W=f;W!==null;){o=W;var b=o.child;if(o.subtreeFlags&2064&&b!==null)b.return=o,W=b;else e:for(o=f;W!==null;){if(c=W,c.flags&2048)try{switch(c.tag){case 0:case 11:case 15:fl(9,c)}}catch(C){Ee(c,c.return,C)}if(c===o){W=null;break e}var x=c.sibling;if(x!==null){x.return=c.return,W=x;break e}W=c.return}}if(oe=s,Ir(),yi&&typeof yi.onPostCommitFiberRoot=="function")try{yi.onPostCommitFiberRoot(cl,e)}catch{}r=!0}return r}finally{le=i,_t.transition=t}}return!1}function gg(e,t,i){t=hn(i,t),t=iv(e,t,1),e=yr(e,t,1),t=tt(),e!==null&&(Ka(e,1,t),dt(e,t))}function Ee(e,t,i){if(e.tag===3)gg(e,e,i);else for(;t!==null;){if(t.tag===3){gg(t,e,i);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(br===null||!br.has(r))){e=hn(i,e),e=rv(t,e,1),t=yr(t,e,1),e=tt(),t!==null&&(Ka(t,1,e),dt(t,e));break}}t=t.return}}function w1(e,t,i){var r=e.pingCache;r!==null&&r.delete(t),t=tt(),e.pingedLanes|=e.suspendedLanes&i,Be===e&&(We&i)===i&&(Oe===4||Oe===3&&(We&130023424)===We&&500>Pe()-hm?Zr(e,0):um|=i),dt(e,t)}function Av(e,t){t===0&&(e.mode&1?(t=bo,bo<<=1,!(bo&130023424)&&(bo=4194304)):t=1);var i=tt();e=Ni(e,t),e!==null&&(Ka(e,t,i),dt(e,i))}function k1(e){var t=e.memoizedState,i=0;t!==null&&(i=t.retryLane),Av(e,i)}function x1(e,t){var i=0;switch(e.tag){case 13:var r=e.stateNode,s=e.memoizedState;s!==null&&(i=s.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(O(314))}r!==null&&r.delete(t),Av(e,i)}var Sv;Sv=function(e,t,i){if(e!==null)if(e.memoizedProps!==t.pendingProps||ct.current)ot=!0;else{if(!(e.lanes&i)&&!(t.flags&128))return ot=!1,l1(e,t,i);ot=!!(e.flags&131072)}else ot=!1,be&&t.flags&1048576&&Eb(t,Dc,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ec(e,t),e=t.pendingProps;var s=cn(t,Je.current);Ws(t,i),s=nm(null,t,r,e,s,i);var n=am();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,lt(r)?(n=!0,Sc(t)):n=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,em(t),s.updater=gl,t.stateNode=s,s._reactInternals=t,Cu(t,r,e,i),t=Eu(null,t,r,!0,n,i)):(t.tag=0,be&&n&&Gh(t),Ze(null,t,s,i),t=t.child),t;case 16:r=t.elementType;e:{switch(ec(e,t),e=t.pendingProps,s=r._init,r=s(r._payload),t.type=r,s=t.tag=S1(r),e=Ht(r,e),s){case 0:t=Tu(null,t,r,e,i);break e;case 1:t=ng(null,t,r,e,i);break e;case 11:t=rg(null,t,r,e,i);break e;case 14:t=sg(null,t,r,Ht(r.type,e),i);break e}throw Error(O(306,r,""))}return t;case 0:return r=t.type,s=t.pendingProps,s=t.elementType===r?s:Ht(r,s),Tu(e,t,r,s,i);case 1:return r=t.type,s=t.pendingProps,s=t.elementType===r?s:Ht(r,s),ng(e,t,r,s,i);case 3:e:{if(ov(t),e===null)throw Error(O(387));r=t.pendingProps,n=t.memoizedState,s=n.element,Rb(e,t),Pc(t,r,null,i);var o=t.memoizedState;if(r=o.element,n.isDehydrated)if(n={element:r,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=n,t.memoizedState=n,t.flags&256){s=hn(Error(O(423)),t),t=ag(e,t,r,i,s);break e}else if(r!==s){s=hn(Error(O(424)),t),t=ag(e,t,r,i,s);break e}else for(gt=fr(t.stateNode.containerInfo.firstChild),ft=t,be=!0,Jt=null,i=jb(t,null,r,i),t.child=i;i;)i.flags=i.flags&-3|4096,i=i.sibling;else{if(ln(),r===s){t=Li(e,t,i);break e}Ze(e,t,r,i)}t=t.child}return t;case 5:return Ob(t),e===null&&xu(t),r=t.type,s=t.pendingProps,n=e!==null?e.memoizedProps:null,o=s.children,yu(r,s)?o=null:n!==null&&yu(r,n)&&(t.flags|=32),av(e,t),Ze(e,t,o,i),t.child;case 6:return e===null&&xu(t),null;case 13:return cv(e,t,i);case 4:return tm(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=dn(t,null,r,i):Ze(e,t,r,i),t.child;case 11:return r=t.type,s=t.pendingProps,s=t.elementType===r?s:Ht(r,s),rg(e,t,r,s,i);case 7:return Ze(e,t,t.pendingProps,i),t.child;case 8:return Ze(e,t,t.pendingProps.children,i),t.child;case 12:return Ze(e,t,t.pendingProps.children,i),t.child;case 10:e:{if(r=t.type._context,s=t.pendingProps,n=t.memoizedProps,o=s.value,he(Tc,r._currentValue),r._currentValue=o,n!==null)if(ri(n.value,o)){if(n.children===s.children&&!ct.current){t=Li(e,t,i);break e}}else for(n=t.child,n!==null&&(n.return=t);n!==null;){var c=n.dependencies;if(c!==null){o=n.child;for(var l=c.firstContext;l!==null;){if(l.context===r){if(n.tag===1){l=Ri(-1,i&-i),l.tag=2;var d=n.updateQueue;if(d!==null){d=d.shared;var u=d.pending;u===null?l.next=l:(l.next=u.next,u.next=l),d.pending=l}}n.lanes|=i,l=n.alternate,l!==null&&(l.lanes|=i),Au(n.return,i,t),c.lanes|=i;break}l=l.next}}else if(n.tag===10)o=n.type===t.type?null:n.child;else if(n.tag===18){if(o=n.return,o===null)throw Error(O(341));o.lanes|=i,c=o.alternate,c!==null&&(c.lanes|=i),Au(o,i,t),o=n.sibling}else o=n.child;if(o!==null)o.return=n;else for(o=n;o!==null;){if(o===t){o=null;break}if(n=o.sibling,n!==null){n.return=o.return,o=n;break}o=o.return}n=o}Ze(e,t,s.children,i),t=t.child}return t;case 9:return s=t.type,r=t.pendingProps.children,Ws(t,i),s=It(s),r=r(s),t.flags|=1,Ze(e,t,r,i),t.child;case 14:return r=t.type,s=Ht(r,t.pendingProps),s=Ht(r.type,s),sg(e,t,r,s,i);case 15:return sv(e,t,t.type,t.pendingProps,i);case 17:return r=t.type,s=t.pendingProps,s=t.elementType===r?s:Ht(r,s),ec(e,t),t.tag=1,lt(r)?(e=!0,Sc(t)):e=!1,Ws(t,i),tv(t,r,s),Cu(t,r,s,i),Eu(null,t,r,!0,e,i);case 19:return lv(e,t,i);case 22:return nv(e,t,i)}throw Error(O(156,t.tag))};function Cv(e,t){return Yy(e,t)}function A1(e,t,i,r){this.tag=e,this.key=i,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Pt(e,t,i,r){return new A1(e,t,i,r)}function fm(e){return e=e.prototype,!(!e||!e.isReactComponent)}function S1(e){if(typeof e=="function")return fm(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Oh)return 11;if(e===Fh)return 14}return 2}function wr(e,t){var i=e.alternate;return i===null?(i=Pt(e.tag,t,e.key,e.mode),i.elementType=e.elementType,i.type=e.type,i.stateNode=e.stateNode,i.alternate=e,e.alternate=i):(i.pendingProps=t,i.type=e.type,i.flags=0,i.subtreeFlags=0,i.deleti
vendor: 6,825 bytes, line 41
41ons=null),i.flags=e.flags&14680064,i.childLanes=e.childLanes,i.lanes=e.lanes,i.child=e.child,i.memoizedProps=e.memoizedProps,i.memoizedState=e.memoizedState,i.updateQueue=e.updateQueue,t=e.dependencies,i.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},i.sibling=e.sibling,i.index=e.index,i.ref=e.ref,i}function rc(e,t,i,r,s,n){var o=2;if(r=e,typeof e=="function")fm(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Ts:return es(i.children,s,n,t);case Rh:o=8,s|=8;break;case Qd:return e=Pt(12,i,t,s|2),e.elementType=Qd,e.lanes=n,e;case Xd:return e=Pt(13,i,t,s),e.elementType=Xd,e.lanes=n,e;case Jd:return e=Pt(19,i,t,s),e.elementType=Jd,e.lanes=n,e;case Oy:return bl(i,s,n,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case My:o=10;break e;case Ry:o=9;break e;case Oh:o=11;break e;case Fh:o=14;break e;case Zi:o=16,r=null;break e}throw Error(O(130,e==null?e:typeof e,""))}return t=Pt(o,i,t,s),t.elementType=e,t.type=r,t.lanes=n,t}function es(e,t,i,r){return e=Pt(7,e,r,t),e.lanes=i,e}function bl(e,t,i,r){return e=Pt(22,e,r,t),e.elementType=Oy,e.lanes=i,e.stateNode={isHidden:!1},e}function kd(e,t,i){return e=Pt(6,e,null,t),e.lanes=i,e}function xd(e,t,i){return t=Pt(4,e.children!==null?e.children:[],e.key,t),t.lanes=i,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function C1(e,t,i,r,s){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=id(0),this.expirationTimes=id(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=id(0),this.identifierPrefix=r,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function ym(e,t,i,r,s,n,o,c,l){return e=new C1(e,t,i,c,l),t===1?(t=1,n===!0&&(t|=8)):t=0,n=Pt(3,null,null,t),e.current=n,n.stateNode=e,n.memoizedState={element:r,isDehydrated:i,cache:null,transitions:null,pendingSuspenseBoundaries:null},em(n),e}function D1(e,t,i){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:Ds,key:r==null?null:""+r,children:e,containerInfo:t,implementation:i}}function Dv(e){if(!e)return Ar;e=e._reactInternals;e:{if(cs(e)!==e||e.tag!==1)throw Error(O(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(lt(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(O(171))}if(e.tag===1){var i=e.type;if(lt(i))return Db(e,i,t)}return t}function Tv(e,t,i,r,s,n,o,c,l){return e=ym(i,r,!0,e,s,n,o,c,l),e.context=Dv(null),i=e.current,r=tt(),s=vr(i),n=Ri(r,s),n.callback=t??null,yr(i,n,s),e.current.lanes=s,Ka(e,s,r),dt(e,r),e}function vl(e,t,i,r){var s=t.current,n=tt(),o=vr(s);return i=Dv(i),t.context===null?t.context=i:t.pendingContext=i,t=Ri(n,o),t.payload={element:e},r=r===void 0?null:r,r!==null&&(t.callback=r),e=yr(s,t,o),e!==null&&(ii(e,s,o,n),Jo(e,s,o)),o}function Nc(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function fg(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var i=e.retryLane;e.retryLane=i!==0&&i<t?i:t}}function bm(e,t){fg(e,t),(e=e.alternate)&&fg(e,t)}function T1(){return null}var Ev=typeof reportError=="function"?reportError:function(e){console.error(e)};function vm(e){this._internalRoot=e}wl.prototype.render=vm.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(O(409));vl(e,t,null,null)};wl.prototype.unmount=vm.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;ns(function(){vl(null,e,null,null)}),t[Fi]=null}};function wl(e){this._internalRoot=e}wl.prototype.unstable_scheduleHydration=function(e){if(e){var t=nb();e={blockedOn:null,target:e,priority:t};for(var i=0;i<tr.length&&t!==0&&t<tr[i].priority;i++);tr.splice(i,0,e),i===0&&ob(e)}};function wm(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function kl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function yg(){}function E1(e,t,i,r,s){if(s){if(typeof r=="function"){var n=r;r=function(){var d=Nc(o);n.call(d)}}var o=Tv(t,r,e,0,null,!1,!1,"",yg);return e._reactRootContainer=o,e[Fi]=o.current,ka(e.nodeType===8?e.parentNode:e),ns(),o}for(;s=e.lastChild;)e.removeChild(s);if(typeof r=="function"){var c=r;r=function(){var d=Nc(l);c.call(d)}}var l=ym(e,0,!1,null,null,!1,!1,"",yg);return e._reactRootContainer=l,e[Fi]=l.current,ka(e.nodeType===8?e.parentNode:e),ns(function(){vl(t,l,i,r)}),l}function xl(e,t,i,r,s){var n=i._reactRootContainer;if(n){var o=n;if(typeof s=="function"){var c=s;s=function(){var l=Nc(o);c.call(l)}}vl(t,o,e,s)}else o=E1(i,t,e,s,r);return Nc(o)}rb=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var i=Kn(t.pendingLanes);i!==0&&(Bh(t,i|1),dt(t,Pe()),!(oe&6)&&(mn=Pe()+500,Ir()))}break;case 13:ns(function(){var r=Ni(e,1);if(r!==null){var s=tt();ii(r,e,1,s)}}),bm(e,1)}};Uh=function(e){if(e.tag===13){var t=Ni(e,134217728);if(t!==null){var i=tt();ii(t,e,134217728,i)}bm(e,134217728)}};sb=function(e){if(e.tag===13){var t=vr(e),i=Ni(e,t);if(i!==null){var r=tt();ii(i,e,t,r)}bm(e,t)}};nb=function(){return le};ab=function(e,t){var i=le;try{return le=e,t()}finally{le=i}};ou=function(e,t,i){switch(t){case"input":if(eu(e,i),t=i.name,i.type==="radio"&&t!=null){for(i=e;i.parentNode;)i=i.parentNode;for(i=i.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<i.length;t++){var r=i[t];if(r!==e&&r.form===e.form){var s=hl(r);if(!s)throw Error(O(90));Ny(r),eu(r,s)}}}break;case"textarea":By(e,i);break;case"select":t=i.value,t!=null&&Bs(e,!!i.multiple,t,!1)}};Vy=mm;Gy=ns;var P1={usingClientEntryPoint:!1,Events:[Xa,Is,hl,$y,Hy,mm]},Ln={findFiberByHostInstance:qr,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},_1={bundleType:Ln.bundleType,version:Ln.version,rendererPackageName:Ln.rendererPackageName,rendererConfig:Ln.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:qi.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Xy(e),e===null?null:e.stateNode},findFiberByHostInstance:Ln.findFiberByHostInstance||T1,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};
41if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var Po=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Po.isDisabled&&Po.supportsFiber)try{cl=Po.inject(_1),yi=Po}catch{}}wt.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=P1;wt.createPortal=function(e,t){var i=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!wm(t))throw Error(O(200));return D1(e,t,null,i)};wt.createRoot=function(e,t){if(!wm(e))throw Error(O(299));var i=!1,r="",s=Ev;return t!=null&&(t.unstable_strictMode===!0&&(i=!0),t.identifierPrefix!==void 0&&(r=t.identifierPrefix),t.onRecoverableError!==void 0&&(s=t.onRecoverableError)),t=ym(e,1,!1,null,null,i,!1,r,s),e[Fi]=t.current,ka(e.nodeType===8?e.parentNode:e),new vm(t)};wt.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(O(188)):(e=Object.keys(e).join(","),Error(O(268,e)));return e=Xy(t),e=e===null?null:e.stateNode,e};wt.flushSync=function(e){return ns(e)};wt.hydrate=function(e,t,i){if(!kl(t))throw Error(O(200));return xl(null,e,t,!0,i)};wt.hydrateRoot=function(e,t,i){if(!wm(e))throw Error(O(405));var r=i!=null&&i.hydratedSources||null,s=!1,n="",o=Ev;if(i!=null&&(i.unstable_strictMode===!0&&(s=!0),i.identifierPrefix!==void 0&&(n=i.identifierPrefix),i.onRecoverableError!==void 0&&(o=i.onRecoverableError)),t=Tv(t,null,e,1,i??null,s,!1,n,o),e[Fi]=t.current,ka(e),r)for(e=0;e<r.length;e++)i=r[e],s=i._getVersion,s=s(i._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[i,s]:t.mutableSourceEagerHydrationData.push(i,s);return new wl(t)};wt.render=function(e,t,i){if(!kl(t))throw Error(O(200));return xl(null,e,t,!1,i)};wt.unmountComponentAtNode=function(e){if(!kl(e))throw Error(O(40));return e._reactRootContainer?(ns(function(){xl(null,null,e,!1,function(){e._reactRootContainer=null,e[Fi]=null})}),!0):!1};wt.unstable_batchedUpdates=mm;wt.unstable_renderSubtreeIntoContainer=function(e,t,i,r){if(!kl(i))throw Error(O(200));if(e==null||e._reactInternals===void 0)throw Error(O(38));return xl(e,t,i,!1,r)};wt.version="18.3.1-next-f1338f8080-20240426";function Pv(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Pv)}catch(e){console.error(e)}}Pv(),Py.exports=wt;var Ya=Py.exports;const _v=Va(Ya);var Iv,bg=Ya;Iv=bg.createRoot,bg.hydrateRoot;const I1="modulepreload",j1=function(e){return"/"+e},vg={},S=function(t,i,r){let s=Promise.resolve();if(i&&i.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),c=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));s=Promise.allSettled(i.map(l=>{if(l=j1(l),l in vg)return;vg[l]=!0;const d=l.endsWith(".css"),u=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const h=document.createElement("link");if(h.rel=d?"stylesheet":I1,d||(h.as="script"),h.crossOrigin="",h.href=l,c&&h.setAttribute("nonce",c),document.head.appendChild(h),d)return new Promise((g,m)=>{h.addEventListener("load",g),h.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${l}`)))})}))}function n(o){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=o,window.dispatchEvent(c),!c.defaultPrevented)throw o}return s.then(o=>{for(const c of o||[])c.status==="rejected"&&n(c.reason);return t().catch(n)})};var Al=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Sl=typeof window>"u"||"Deno"in globalThis;function Vt(){}function M1(e,t){return typeof e=="function"?e(t):e}function R1(e){return typeof e=="number"&&e>=0&&e!==1/0}function O1(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Uu(e,t){return typeof e=="function"?e(t):e}function F1(e,t){return typeof e=="function"?e(t):e}function wg(e,t){const{type:i="all",exact:r,fetchStatus:s,predicate:n,queryKey:o,stale:c}=e;if(o){if(r){if(t.queryHash!==km(o,t.options))return!1}else if(!Ia(t.queryKey,o))return!1}if(i!=="all"){const l=t.isActive();if(i==="active"&&!l||i==="inactive"&&l)return!1}return!(typeof c=="boolean"&&t.isStale()!==c||s&&s!==t.state.fetchStatus||n&&!n(t))}function kg(e,t){const{exact:i,status:r,predicate:s,mutationKey:n}=e;if(n){if(!t.options.mutationKey)return!1;if(i){if(_a(t.options.mutationKey)!==_a(n))return!1}else if(!Ia(t.options.mutationKey,n))return!1}return!(r&&t.state.status!==r||s&&!s(t))}function km(e,t){return((t==null?void 0:t.queryKeyHashFn)||_a)(e)}function _a(e){return JSON.stringify(e,(t,i)=>qu(i)?Object.keys(i).sort().reduce((r,s)=>(r[s]=i[s],r),{}):i)}function Ia(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(i=>
vendor: 13,055 bytes, line 41
41Ia(e[i],t[i])):!1}function jv(e,t){if(e===t)return e;const i=xg(e)&&xg(t);if(i||qu(e)&&qu(t)){const r=i?e:Object.keys(e),s=r.length,n=i?t:Object.keys(t),o=n.length,c=i?[]:{},l=new Set(r);let d=0;for(let u=0;u<o;u++){const h=i?u:n[u];(!i&&l.has(h)||i)&&e[h]===void 0&&t[h]===void 0?(c[h]=void 0,d++):(c[h]=jv(e[h],t[h]),c[h]===e[h]&&e[h]!==void 0&&d++)}return s===o&&d===s?e:c}return t}function k6(e,t){if(!t||Object.keys(e).length!==Object.keys(t).length)return!1;for(const i in e)if(e[i]!==t[i])return!1;return!0}function xg(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function qu(e){if(!Ag(e))return!1;const t=e.constructor;if(t===void 0)return!0;const i=t.prototype;return!(!Ag(i)||!i.hasOwnProperty("isPrototypeOf")||Object.getPrototypeOf(e)!==Object.prototype)}function Ag(e){return Object.prototype.toString.call(e)==="[object Object]"}function N1(e){return new Promise(t=>{setTimeout(t,e)})}function L1(e,t,i){return typeof i.structuralSharing=="function"?i.structuralSharing(e,t):i.structuralSharing!==!1?jv(e,t):t}function B1(e,t,i=0){const r=[...e,t];return i&&r.length>i?r.slice(1):r}function U1(e,t,i=0){const r=[t,...e];return i&&r.length>i?r.slice(0,-1):r}var xm=Symbol();function Mv(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===xm?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function x6(e,t){return typeof e=="function"?e(...t):!!e}var Vr,nr,Ys,ly,q1=(ly=class extends Al{constructor(){super();ce(this,Vr);ce(this,nr);ce(this,Ys);te(this,Ys,t=>{if(!Sl&&window.addEventListener){const i=()=>t();return window.addEventListener("visibilitychange",i,!1),()=>{window.removeEventListener("visibilitychange",i)}}})}onSubscribe(){P(this,nr)||this.setEventListener(P(this,Ys))}onUnsubscribe(){var t;this.hasListeners()||((t=P(this,nr))==null||t.call(this),te(this,nr,void 0))}setEventListener(t){var i;te(this,Ys,t),(i=P(this,nr))==null||i.call(this),te(this,nr,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){P(this,Vr)!==t&&(te(this,Vr,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(i=>{i(t)})}isFocused(){var t;return typeof P(this,Vr)=="boolean"?P(this,Vr):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Vr=new WeakMap,nr=new WeakMap,Ys=new WeakMap,ly),Rv=new q1,Zs,ar,en,dy,z1=(dy=class extends Al{constructor(){super();ce(this,Zs,!0);ce(this,ar);ce(this,en);te(this,en,t=>{if(!Sl&&window.addEventListener){const i=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",i,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",i),window.removeEventListener("offline",r)}}})}onSubscribe(){P(this,ar)||this.setEventListener(P(this,en))}onUnsubscribe(){var t;this.hasListeners()||((t=P(this,ar))==null||t.call(this),te(this,ar,void 0))}setEventListener(t){var i;te(this,en,t),(i=P(this,ar))==null||i.call(this),te(this,ar,t(this.setOnline.bind(this)))}setOnline(t){P(this,Zs)!==t&&(te(this,Zs,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return P(this,Zs)}},Zs=new WeakMap,ar=new WeakMap,en=new WeakMap,dy),Lc=new z1;function W1(){let e,t;const i=new Promise((s,n)=>{e=s,t=n});i.status="pending",i.catch(()=>{});function r(s){Object.assign(i,s),delete i.resolve,delete i.reject}return i.resolve=s=>{r({status:"fulfilled",value:s}),e(s)},i.reject=s=>{r({status:"rejected",reason:s}),t(s)},i}function $1(e){return Math.min(1e3*2**e,3e4)}function Ov(e){return(e??"online")==="online"?Lc.isOnline():!0}var Fv=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function Ad(e){return e instanceof Fv}function Nv(e){let t=!1,i=0,r=!1,s;const n=W1(),o=v=>{var k;r||(g(new Fv(v)),(k=e.abort)==null||k.call(e))},c=()=>{t=!0},l=()=>{t=!1},d=()=>Rv.isFocused()&&(e.networkMode==="always"||Lc.isOnline())&&e.canRun(),u=()=>Ov(e.networkMode)&&e.canRun(),h=v=>{var k;r||(r=!0,(k=e.onSuccess)==null||k.call(e,v),s==null||s(),n.resolve(v))},g=v=>{var k;r||(r=!0,(k=e.onError)==null||k.call(e,v),s==null||s(),n.reject(v))},m=()=>new Promise(v=>{var k;s=y=>{(r||d())&&v(y)},(k=e.onPause)==null||k.call(e)}).then(()=>{var v;s=void 0,r||(v=e.onContinue)==null||v.call(e)}),w=()=>{if(r)return;let v;const k=i===0?e.initialPromise:void 0;try{v=k??e.fn()}catch(y){v=Promise.reject(y)}Promise.resolve(v).then(h).catch(y=>{var D;if(r)return;const f=e.retry??(Sl?0:3),b=e.retryDelay??$1,x=typeof b=="function"?b(i,y):b,C=f===!0||typeof f=="number"&&i<f||typeof f=="function"&&f(i,y);if(t||!C){g(y);return}i++,(D=e.onFail)==null||D.call(e,i,y),N1(x).then(()=>d()?void 0:m()).then(()=>{t?g(y):w()})})};return{promise:n,cancel:o,continue:()=>(s==null||s(),n),cancelRetry:c,continueRetry:l,canStart:u,start:()=>(u()?w():m().then(w),n)}}var H1=e=>setTimeout(e,0);function V1(){let e=[],t=0,i=c=>{c()},r=c=>{c()},s=H1;const n=c=>{t?e.push(c):s(()=>{i(c)})},o=()=>{const c=e;e=[],c.length&&s(()=>{r(()=>{c.forEach(l=>{i(l)})})})};return{batch:c=>{let l;t++;try{l=c()}finally{t--,t||o()}return l},batchCalls:c=>(...l)=>{n(()=>{c(...l)})},schedule:n,setNotifyFunction:c=>{i=c},setBatchNotifyFunction:c=>{r=c},setScheduler:c=>{s=c}}}var et=V1(),Gr,uy,Lv=(uy=class{constructor(){ce(this,Gr)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),R1(this.gcTime)&&te(this,Gr,setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Sl?1/0:5*60*1e3))}clearGcTimeout(){P(this,Gr)&&(clearTimeout(P(this,Gr)),te(this,Gr,void 0))}},Gr=new WeakMap,uy),tn,Kr,Dt,Qr,Qe,$a,Xr,Kt,Ci,hy,G1=(hy=class extends Lv{constructor(t){super();ce(this,Kt);ce(this,tn);ce(this,Kr);ce(this,Dt);ce(this,Qr);ce(this,Qe);ce(this,$a);ce(this,Xr);te(this,Xr,!1),te(this,$a,t.defaultOptions),this.setOptions(t.options),this.observers=[],te(this,Qr,t.client),te(this,Dt,P(this,Qr).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,te(this,tn,Q1(this.options)),this.state=t.state??P(this,tn),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var t;return(t=P(this,Qe))==null?void 0:t.promise}setOptions(t){this.options={...P(this,$a),...t},this.updateGcTime(this.options.gcTime)}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&P(this,Dt).remove(this)}setData(t,i){const r=L1(this.state.data,t,this.options);return Ve(this,Kt,Ci).call(this,{data:r,type:"success",dataUpdatedAt:i==null?void 0:i.updatedAt,manual:i==null?void 0:i.manual}),r}setState(t,i){Ve(this,Kt,Ci).call(this,{type:"setState",state:t,setStateOptions:i})}cancel(t){var r,s;const i=(r=P(this,Qe))==null?void 0:r.promise;return(s=P(this,Qe))==null||s.cancel(t),i?i.then(Vt).catch(Vt):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(P(this,tn))}isActive(){return this.observers.some(t=>F1(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===xm||this.state.dataUpdateCount+this.state.errorUpdateCount===0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Uu(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!O1(this.state.dataUpdatedAt,t)}onFocus(){var i;const t=this.observers.find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(i=P(this,Qe))==null||i.continue()}onOnline(){var i;const t=this.observers.find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(i=P(this,Qe))==null||i.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),P(this,Dt).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(i=>i!==t),this.observers.length||(P(this,Qe)&&(P(this,Xr)?P(this,Qe).cancel({revert:!0}):P(this,Qe).cancelRetry()),this.scheduleGc()),P(this,Dt).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||Ve(this,Kt,Ci).call(this,{type:"invalidate"})}fetch(t,i){var d,u,h;if(this.state.fetchStatus!=="idle"){if(this.state.data!==void 0&&(i!=null&&i.cancelRefetch))this.cancel({silent:!0});else if(P(this,Qe))return P(this,Qe).continueRetry(),P(this,Qe).promise}if(t&&this.setOptions(t),!this.options.queryFn){const g=this.observers.find(m=>m.options.queryFn);g&&this.setOptions(g.options)}const r=new AbortController,s=g=>{Object.defineProperty(g,"signal",{enumerable:!0,get:()=>(te(this,Xr,!0),r.signal)})},n=()=>{const g=Mv(this.options,i),w=(()=>{const v={client:P(this,Qr),queryKey:this.queryKey,meta:this.meta};return s(v),v})();return te(this,Xr,!1),this.options.persister?this.options.persister(g,w,this):g(w)},c=(()=>{const g={fetchOptions:i,options:this.options,queryKey:this.queryKey,client:P(this,Qr),state:this.state,fetchFn:n};return s(g),g})();(d=this.options.behavior)==null||d.onFetch(c,this),te(this,Kr,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((u=c.fetchOptions)==null?void 0:u.meta))&&Ve(this,Kt,Ci).call(this,{type:"fetch",meta:(h=c.fetchOptions)==null?void 0:h.meta});const l=g=>{var m,w,v,k;Ad(g)&&g.silent||Ve(this,Kt,Ci).call(this,{type:"error",error:g}),Ad(g)||((w=(m=P(this,Dt).config).onError)==null||w.call(m,g,this),(k=(v=P(this,Dt).config).onSettled)==null||k.call(v,this.state.data,g,this)),this.scheduleGc()};return te(this,Qe,Nv({initialPromise:i==null?void 0:i.initialPromise,fn:c.fetchFn,abort:r.abort.bind(r),onSuccess:g=>{var m,w,v,k;if(g===void 0){l(new Error(`${this.queryHash} data is undefined`));return}try{this.setData(g)}catch(y){l(y);return}(w=(m=P(this,Dt).config).onSuccess)==null||w.call(m,g,this),(k=(v=P(this,Dt).config).onSettled)==null||k.call(v,g,this.state.error,this),this.scheduleGc()},onError:l,onFail:(g,m)=>{Ve(this,Kt,Ci).call(this,{type:"failed",failureCount:g,error:m})},onPause:()=>{Ve(this,Kt,Ci).call(this,{type:"pause"})},onContinue:()=>{Ve(this,Kt,Ci).call(this,{type:"continue"})},retry:c.options.retry,retryDelay:c.options.retryDelay,networkMode:c.options.networkMode,canRun:()=>!0})),P(this,Qe).start()}},tn=new WeakMap,Kr=new WeakMap,Dt=new WeakMap,Qr=new WeakMap,Qe=new WeakMap,$a=new WeakMap,Xr=new WeakMap,Kt=new WeakSet,Ci=function(t){const i=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,...K1(r.data,this.options),fetchMeta:t.meta??null};case"success":return te(this,Kr,void 0),{...r,data:t.data,dataUpdateCount:r.dataUpdateCount+1,dataUpdatedAt:t.dataUpdatedAt??Date.now(),error:null,isInvalidated:!1,status:"success",...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};case"error":const s=t.error;return Ad(s)&&s.revert&&P(this,Kr)?{...P(this,Kr),fetchStatus:"idle"}:{...r,error:s,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:s,fetchStatus:"idle",status:"error"};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=i(this.state),et.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),P(this,Dt).notify({query:this,type:"updated",action:t})})},hy);function K1(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ov(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Q1(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,i=t!==void 0,r=i?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:i?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:i?"success":"pending",fetchStatus:"idle"}}var hi,my,X1=(my=class extends Al{constructor(t={}){super();ce(this,hi);this.config=t,te(this,hi,new Map)}build(t,i,r){const s=i.queryKey,n=i.queryHash??km(s,i);let o=this.get(n);return o||(o=new G1({client:t,queryKey:s,queryHash:n,options:t.defaultQueryOptions(i),state:r,defaultOptions:t.getQueryDefaults(s)}),this.add(o)),o}add(t){P(this,hi).has(t.queryHash)||(P(this,hi).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const i=P(this,hi).get(t.queryHash);i&&(t.destroy(),i===t&&P(this,hi).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){et.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return P(this,hi).get(t)}getAll(){return[...P(this,hi).values()]}find(t){const i={exact:!0,...t};return this.getAll().find(r=>wg(i,r))}findAll(t={}){const i=this.getAll();return Object.keys(t).length>0?i.filter(r=>wg(t,r)):i}notify(t){et.batch(()=>
41{this.listeners.forEach(i=>{i(t)})})}onFocus(){et.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){et.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},hi=new WeakMap,my),mi,Ye,Jr,pi,Yi,py,J1=(py=class extends Lv{constructor(t){super();ce(this,pi);ce(this,mi);ce(this,Ye);ce(this,Jr);this.mutationId=t.mutationId,te(this,Ye,t.mutationCache),te(this,mi,[]),this.state=t.state||Y1(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){P(this,mi).includes(t)||(P(this,mi).push(t),this.clearGcTimeout(),P(this,Ye).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){te(this,mi,P(this,mi).filter(i=>i!==t)),this.scheduleGc(),P(this,Ye).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){P(this,mi).length||(this.state.status==="pending"?this.scheduleGc():P(this,Ye).remove(this))}continue(){var t;return((t=P(this,Jr))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var n,o,c,l,d,u,h,g,m,w,v,k,y,f,b,x,C,D,T,I;const i=()=>{Ve(this,pi,Yi).call(this,{type:"continue"})};te(this,Jr,Nv({fn:()=>this.options.mutationFn?this.options.mutationFn(t):Promise.reject(new Error("No mutationFn found")),onFail:(R,F)=>{Ve(this,pi,Yi).call(this,{type:"failed",failureCount:R,error:F})},onPause:()=>{Ve(this,pi,Yi).call(this,{type:"pause"})},onContinue:i,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>P(this,Ye).canRun(this)}));const r=this.state.status==="pending",s=!P(this,Jr).canStart();try{if(r)i();else{Ve(this,pi,Yi).call(this,{type:"pending",variables:t,isPaused:s}),await((o=(n=P(this,Ye).config).onMutate)==null?void 0:o.call(n,t,this));const F=await((l=(c=this.options).onMutate)==null?void 0:l.call(c,t));F!==this.state.context&&Ve(this,pi,Yi).call(this,{type:"pending",context:F,variables:t,isPaused:s})}const R=await P(this,Jr).start();return await((u=(d=P(this,Ye).config).onSuccess)==null?void 0:u.call(d,R,t,this.state.context,this)),await((g=(h=this.options).onSuccess)==null?void 0:g.call(h,R,t,this.state.context)),await((w=(m=P(this,Ye).config).onSettled)==null?void 0:w.call(m,R,null,this.state.variables,this.state.context,this)),await((k=(v=this.options).onSettled)==null?void 0:k.call(v,R,null,t,this.state.context)),Ve(this,pi,Yi).call(this,{type:"success",data:R}),R}catch(R){try{throw await((f=(y=P(this,Ye).config).onError)==null?void 0:f.call(y,R,t,this.state.context,this)),await((x=(b=this.options).onError)==null?void 0:x.call(b,R,t,this.state.context)),await((D=(C=P(this,Ye).config).onSettled)==null?void 0:D.call(C,void 0,R,this.state.variables,this.state.context,this)),await((I=(T=this.options).onSettled)==null?void 0:I.call(T,void 0,R,t,this.state.context)),R}finally{Ve(this,pi,Yi).call(this,{type:"error",error:R})}}finally{P(this,Ye).runNext(this)}}},mi=new WeakMap,Ye=new WeakMap,Jr=new WeakMap,pi=new WeakSet,Yi=function(t){const i=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=i(this.state),et.batch(()=>{P(this,mi).forEach(r=>{r.onMutationUpdate(t)}),P(this,Ye).notify({mutation:this,type:"updated",action:t})})},py);function Y1(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Ii,Qt,Ha,gy,Z1=(gy=class extends Al{constructor(t={}){super();ce(this,Ii);ce(this,Qt);ce(this,Ha);this.config=t,te(this,Ii,new Set),te(this,Qt,new Map),te(this,Ha,0)}build(t,i,r){const s=new J1({mutationCache:this,mutationId:++ho(this,Ha)._,options:t.defaultMutationOptions(i),state:r});return this.add(s),s}add(t){P(this,Ii).add(t);const i=_o(t);if(typeof i=="string"){const r=P(this,Qt).get(i);r?r.push(t):P(this,Qt).set(i,[t])}this.notify({type:"added",mutation:t})}remove(t){if(P(this,Ii).delete(t)){const i=_o(t);if(typeof i=="string"){const r=P(this,Qt).get(i);if(r)if(r.length>1){const s=r.indexOf(t);s!==-1&&r.splice(s,1)}else r[0]===t&&P(this,Qt).delete(i)}}this.notify({type:"removed",mutation:t})}canRun(t){const i=_o(t);if(typeof i=="string"){const r=P(this,Qt).get(i),s=r==null?void 0:r.find(n=>n.state.status==="pending");return!s||s===t}else return!0}runNext(t){var r;const i=_o(t);if(typeof i=="string"){const s=(r=P(this,Qt).get(i))==null?void 0:r.find(n=>
vendor: 4,094 bytes, line 41
41n!==t&&n.state.isPaused);return(s==null?void 0:s.continue())??Promise.resolve()}else return Promise.resolve()}clear(){et.batch(()=>{P(this,Ii).forEach(t=>{this.notify({type:"removed",mutation:t})}),P(this,Ii).clear(),P(this,Qt).clear()})}getAll(){return Array.from(P(this,Ii))}find(t){const i={exact:!0,...t};return this.getAll().find(r=>kg(i,r))}findAll(t={}){return this.getAll().filter(i=>kg(t,i))}notify(t){et.batch(()=>{this.listeners.forEach(i=>{i(t)})})}resumePausedMutations(){const t=this.getAll().filter(i=>i.state.isPaused);return et.batch(()=>Promise.all(t.map(i=>i.continue().catch(Vt))))}},Ii=new WeakMap,Qt=new WeakMap,Ha=new WeakMap,gy);function _o(e){var t;return(t=e.options.scope)==null?void 0:t.id}function Sg(e){return{onFetch:(t,i)=>{var u,h,g,m,w;const r=t.options,s=(g=(h=(u=t.fetchOptions)==null?void 0:u.meta)==null?void 0:h.fetchMore)==null?void 0:g.direction,n=((m=t.state.data)==null?void 0:m.pages)||[],o=((w=t.state.data)==null?void 0:w.pageParams)||[];let c={pages:[],pageParams:[]},l=0;const d=async()=>{let v=!1;const k=b=>{Object.defineProperty(b,"signal",{enumerable:!0,get:()=>(t.signal.aborted?v=!0:t.signal.addEventListener("abort",()=>{v=!0}),t.signal)})},y=Mv(t.options,t.fetchOptions),f=async(b,x,C)=>{if(v)return Promise.reject();if(x==null&&b.pages.length)return Promise.resolve(b);const T=(()=>{const K={client:t.client,queryKey:t.queryKey,pageParam:x,direction:C?"backward":"forward",meta:t.options.meta};return k(K),K})(),I=await y(T),{maxPages:R}=t.options,F=C?U1:B1;return{pages:F(b.pages,I,R),pageParams:F(b.pageParams,x,R)}};if(s&&n.length){const b=s==="backward",x=b?e2:Cg,C={pages:n,pageParams:o},D=x(r,C);c=await f(C,D,b)}else{const b=e??n.length;do{const x=l===0?o[0]??r.initialPageParam:Cg(r,c);if(l>0&&x==null)break;c=await f(c,x),l++}while(l<b)}return c};t.options.persister?t.fetchFn=()=>{var v,k;return(k=(v=t.options).persister)==null?void 0:k.call(v,d,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},i)}:t.fetchFn=d}}}function Cg(e,{pages:t,pageParams:i}){const r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,i[r],i):void 0}function e2(e,{pages:t,pageParams:i}){var r;return t.length>0?(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,i[0],i):void 0}var De,or,cr,rn,sn,lr,nn,an,fy,t2=(fy=class{constructor(e={}){ce(this,De);ce(this,or);ce(this,cr);ce(this,rn);ce(this,sn);ce(this,lr);ce(this,nn);ce(this,an);te(this,De,e.queryCache||new X1),te(this,or,e.mutationCache||new Z1),te(this,cr,e.defaultOptions||{}),te(this,rn,new Map),te(this,sn,new Map),te(this,lr,0)}mount(){ho(this,lr)._++,P(this,lr)===1&&(te(this,nn,Rv.subscribe(async e=>{e&&(await this.resumePausedMutations(),P(this,De).onFocus())})),te(this,an,Lc.subscribe(async e=>{e&&(await this.resumePausedMutations(),P(this,De).onOnline())})))}unmount(){var e,t;ho(this,lr)._--,P(this,lr)===0&&((e=P(this,nn))==null||e.call(this),te(this,nn,void 0),(t=P(this,an))==null||t.call(this),te(this,an,void 0))}isFetching(e){return P(this,De).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return P(this,or).findAll({...e,status:"pending"}).length}getQueryData(e){var i;const t=this.defaultQueryOptions({queryKey:e});return(i=P(this,De).get(t.queryHash))==null?void 0:i.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),i=P(this,De).build(this,t),r=i.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&i.isStaleByTime(Uu(t.staleTime,i))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return P(this,De).findAll(e).map(({queryKey:t,state:i})=>{const r=i.data;return[t,r]})}setQueryData(e,t,i){const r=this.defaultQueryOptions({queryKey:e}),s=P(this,De).get(r.queryHash),n=s==null?void 0:s.state.data,o=M1(t,n);if(o!==void 0)return P(this,De).build(this,r).setData(o,{...i,manual:!0})}setQueriesData(e,t,i){return et.batch(()=>P(this,De).findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,i)]))}getQueryState(e){var i;const t=this.defaultQueryOptions({queryKey:e});return(i=P(this,De).get(t.queryHash))==null?void 0:i.state}removeQueries(e){const t=P(this,De);et.batch(()=>
41{t.findAll(e).forEach(i=>{t.remove(i)})})}resetQueries(e,t){const i=P(this,De);return et.batch(()=>(i.findAll(e).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const i={revert:!0,...t},r=et.batch(()=>P(this,De).findAll(e).map(s=>s.cancel(i)));return Promise.all(r).then(Vt).catch(Vt)}invalidateQueries(e,t={}){return et.batch(()=>(P(this,De).findAll(e).forEach(i=>{i.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const i={...t,cancelRefetch:t.cancelRefetch??!0},r=et.batch(()=>P(this,De).findAll(e).filter(s=>!s.isDisabled()&&!s.isStatic()).map(s=>{let n=s.fetch(void 0,i);return i.throwOnError||(n=n.catch(Vt)),s.state.fetchStatus==="paused"?Promise.resolve():n}));return Promise.all(r).then(Vt)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const i=P(this,De).build(this,t);return i.isStaleByTime(Uu(t.staleTime,i))?i.fetch(t):Promise.resolve(i.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Vt).catch(Vt)}fetchInfiniteQuery(e){return e.behavior=Sg(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Vt).catch(Vt)}ensureInfiniteQueryData(e){return e.behavior=Sg(e.pages),this.ensureQueryData(e)}resumePausedMutations(){return Lc.isOnline()?P(this,or).resumePausedMutations():Promise.resolve()}getQueryCache(){return P(this,De)}getMutationCache(){return P(this,or)}getDefaultOptions(){return P(this,cr)}setDefaultOptions(e){te(this,cr,e)}setQueryDefaults(e,t){P(this,rn).set(_a(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...P(this,rn).values()],i={};return t.forEach(r=>{Ia(e,r.queryKey)&&Object.assign(i,r.defaultOptions)}),i}setMutationDefaults(e,t){P(this,sn).set(_a(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...P(this,sn).values()],i={};return t.forEach(r=>{Ia(e,r.mutationKey)&&Object.assign(i,r.defaultOptions)}),i}defaultQueryOptions(e){if(e._defaulted)return e;const t={...P(this,cr).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=km(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===xm&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...P(this,cr).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){P(this,De).clear(),P(this,or).clear()}},De=new WeakMap,or=new WeakMap,cr=new WeakMap,rn=new WeakMap,sn=new WeakMap,lr=new WeakMap,nn=new WeakMap,an=new WeakMap,fy),Bv=p.createContext(void 0),A6=e=>{const t=p.useContext(Bv);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},i2=({client:e,children:t})=>(p.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),a.jsx(Bv.Provider,{value:e,children:t}));/** 42 * @remix-run/router v1.23.3 43 * 44 * Copyright (c) Remix Software Inc. 45 * 46 * This source code is licensed under the MIT license found in the 47 * LICENSE.md file in the root directory of this source tree. 48 * 49 * @license MIT 50 */function ja(){return ja=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)({}).hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e},ja.apply(null,arguments)}var hr;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(hr||(hr={}));const Dg="popstate";function r2(e){e===void 0&&(e={});function t(r,s){let{pathname:n,search:o,hash:c}=r.location;return zu("",{pathname:n,search:o,hash:c},s.state&&s.state.usr||null,s.state&&s.state.key||"default")}function i(r,s){return typeof s=="string"?s:Bc(s)}return n2(t,i,null,e)}function Se(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function Am(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function s2(){return Math.random().toString(36).substr(2,8)}function Tg(e,t){return{usr:e.state,key:e.key,idx:t}}function zu(e,t,i,r){return i===void 0&&(i=null),ja({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?wn(t):t,{state:i,key:t&&t.key||r||s2()})}function Bc(e){let{pathname:t="/",search:i="",hash:r=""}=e;return i&&i!=="?"&&(t+=i.charAt(0)==="?"?i:"?"+i),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function wn(e){let t={};if(e){let i=e.indexOf("#");i>=0&&(t.hash=e.substr(i),e=e.substr(0,i));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function n2(e,t,i,r){r===void 0&&(r={});let{window:s=document.defaultView,v5Compat:n=!1}=r,o=s.history,c=hr.Pop,l=null,d=u();d==null&&(d=0,o.replaceState(ja({},o.state,{idx:d}),""));function u(){return(o.state||{idx:null}).idx}function h(){c=hr.Pop;let k=u(),y=k==null?null:k-d;d=k,l&&l({action:c,location:v.location,delta:y})}function g(k,y){c=hr.Push;let f=zu(v.location,k,y);d=u()+1;let b=Tg(f,d),x=v.createHref(f);try{o.pushState(b,"",x)}catch(C){if(C instanceof DOMException&&C.name==="DataCloneError")throw C;s.location.assign(x)}n&&l&&l({action:c,location:v.location,delta:1})}function m(k,y){c=hr.Replace;let f=zu(v.location,k,y);d=u();let b=Tg(f,d),x=v.createHref(f);o.replaceState(b,"",x),n&&l&&l({action:c,location:v.location,delta:0})}function w(k){let y=s.location.origin!=="null"?s.location.origin:s.location.href,f=typeof k=="string"?k:Bc(k);return f=f.replace(/ $/,"%20"),Se(y,"No window.location.(origin|href) available to create URL for href: "+f),new URL(f,y)}let v={get action(){return c},get location(){return e(s,o)},listen(k){if(l)throw new Error("A history only accepts one active listener");
50return s.addEventListener(Dg,h),l=k,()=>{s.removeEventListener(Dg,h),l=null}},createHref(k){return t(s,k)},createURL:w,encodeLocation(k){let y=w(k);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:g,replace:m,go(k){return o.go(k)}};return v}var Eg;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Eg||(Eg={}));function a2(e,t,i){return i===void 0&&(i="/"),o2(e,t,i,!1)}function o2(e,t,i,r){let s=typeof t=="string"?wn(t):t,n=pn(s.pathname||"/",i);if(n==null)return null;let o=Uv(e);c2(o);let c=null,l=v2(n);for(let d=0;c==null&&d<o.length;++d)c=y2(o[d],l,r);return c}function Uv(e,t,i,r){t===void 0&&(t=[]),i===void 0&&(i=[]),r===void 0&&(r="");let s=(n,o,c)=>{let l={relativePath:c===void 0?n.path||"":c,caseSensitive:n.caseSensitive===!0,childrenIndex:o,route:n};l.relativePath.startsWith("/")&&(Se(l.relativePath.startsWith(r),'Absolute route path "'+l.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),l.relativePath=l.relativePath.slice(r.length));let d=kr([r,l.relativePath]),u=i.concat(l);n.children&&n.children.length>0&&(Se(n.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+d+'".')),Uv(n.children,t,u,d)),!(n.path==null&&!n.index)&&t.push({path:d,score:g2(d,n.index),routesMeta:u})};return e.forEach((n,o)=>{var c;if(n.path===""||!((c=n.path)!=null&&c.includes("?")))s(n,o);else for(let l of qv(n.path))s(n,o,l)}),t}function qv(e){let t=e.split("/");if(t.length===0)return[];let[i,...r]=t,s=i.endsWith("?"),n=i.replace(/\?$/,"");if(r.length===0)return s?[n,""]:[n];let o=qv(r.join("/")),c=[];return c.push(...o.map(l=>l===""?n:[n,l].join("/"))),s&&c.push(...o),c.map(l=>e.startsWith("/")&&l===""?"/":l)}function c2(e){e.sort((t,i)=>t.score!==i.score?i.score-t.score:f2(t.routesMeta.map(r=>r.childrenIndex),i.routesMeta.map(r=>r.childrenIndex)))}const l2=/^:[\w-]+$/,d2=3,u2=2,h2=1,m2=10,p2=-2,Pg=e=>e==="*";function g2(e,t){let i=e.split("/"),r=i.length;return i.some(Pg)&&(r+=p2),t&&(r+=u2),i.filter(s=>!Pg(s)).reduce((s,n)=>s+(l2.test(n)?d2:n===""?h2:m2),r)}function f2(e,t){return e.length===t.length&&e.slice(0,-1).every((r,s)=>r===t[s])?e[e.length-1]-t[t.length-1]:0}function y2(e,t,i){let{routesMeta:r}=e,s={},n="/",o=[];for(let c=0;c<r.length;++c){let l=r[c],d=c===r.length-1,u=n==="/"?t:t.slice(n.length)||"/",h=Uc({path:l.relativePath,caseSensitive:l.caseSensitive,end:d},u),g=l.route;if(!h&&d&&i&&!r[r.length-1].route.index&&(h=Uc({path:l.relativePath,caseSensitive:l.caseSensitive,end:!1},u)),!h)return null;
vendor: 7,152 bytes, lines 50-59
50Object.assign(s,h.params),o.push({params:s,pathname:kr([n,h.pathname]),pathnameBase:S2(kr([n,h.pathnameBase])),route:g}),h.pathnameBase!=="/"&&(n=kr([n,h.pathnameBase]))}return o}function Uc(e,t){typeof e=="string"&&(e={path:e,caseSensitive:!1,end:!0});let[i,r]=b2(e.path,e.caseSensitive,e.end),s=t.match(i);if(!s)return null;let n=s[0],o=n.replace(/(.)\/+$/,"$1"),c=s.slice(1);return{params:r.reduce((d,u,h)=>{let{paramName:g,isOptional:m}=u;if(g==="*"){let v=c[h]||"";o=n.slice(0,n.length-v.length).replace(/(.)\/+$/,"$1")}const w=c[h];return m&&!w?d[g]=void 0:d[g]=(w||"").replace(/%2F/g,"/"),d},{}),pathname:n,pathnameBase:o,pattern:e}}function b2(e,t,i){t===void 0&&(t=!1),i===void 0&&(i=!0),Am(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],s="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,c,l)=>(r.push({paramName:c,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),s+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):i?s+="\\/*$":e!==""&&e!=="/"&&(s+="(?:(?=\\/|$))"),[new RegExp(s,t?void 0:"i"),r]}function v2(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Am(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function pn(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let i=t.endsWith("/")?t.length-1:t.length,r=e.charAt(i);return r&&r!=="/"?null:e.slice(i)||"/"}const w2=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,k2=e=>w2.test(e);function x2(e,t){t===void 0&&(t="/");let{pathname:i,search:r="",hash:s=""}=typeof e=="string"?wn(e):e,n;if(i)if(k2(i))n=i;else{if(i.includes("//")){let o=i;i=zv(i),Am(!1,"Pathnames cannot have embedded double slashes - normalizing "+(o+" -> "+i))}i.startsWith("/")?n=_g(i.substring(1),"/"):n=_g(i,t)}else n=t;return{pathname:n,search:C2(r),hash:D2(s)}}function _g(e,t){let i=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(s=>{s===".."?i.length>1&&i.pop():s!=="."&&i.push(s)}),i.length>1?i.join("/"):"/"}function Sd(e,t,i,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+i+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function A2(e){return e.filter((t,i)=>i===0||t.route.path&&t.route.path.length>0)}function Sm(e,t){let i=A2(e);return t?i.map((r,s)=>s===i.length-1?r.pathname:r.pathnameBase):i.map(r=>r.pathnameBase)}function Cm(e,t,i,r){r===void 0&&(r=!1);let s;typeof e=="string"?s=wn(e):(s=ja({},e),Se(!s.pathname||!s.pathname.includes("?"),Sd("?","pathname","search",s)),Se(!s.pathname||!s.pathname.includes("#"),Sd("#","pathname","hash",s)),Se(!s.search||!s.search.includes("#"),Sd("#","search","hash",s)));let n=e===""||s.pathname==="",o=n?"/":s.pathname,c;if(o==null)c=i;else{let h=t.length-1;if(!r&&o.startsWith("..")){let g=o.split("/");for(;g[0]==="..";)g.shift(),h-=1;s.pathname=g.join("/")}c=h>=0?t[h]:"/"}let l=x2(s,c),d=o&&o!=="/"&&o.endsWith("/"),u=(n||o===".")&&i.endsWith("/");return!l.pathname.endsWith("/")&&(d||u)&&(l.pathname+="/"),l}const zv=e=>e.replace(/\/\/+/g,"/"),kr=e=>zv(e.join("/")),S2=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),C2=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,D2=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function T2(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Wv=["post","put","patch","delete"];new Set(Wv);const E2=["get",...Wv];new Set(E2);/** 51 * React Router v6.30.4 52 * 53 * Copyright (c) Remix Software Inc. 54 * 55 * This source code is licensed under the MIT license found in the 56 * LICENSE.md file in the root directory of this source tree. 57 * 58 * @license MIT 59 */function Ma(){return Ma=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)({}).hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e},Ma.apply(null,arguments)}const Cl=p.createContext(null),$v=p.createContext(null),zi=p.createContext(null),Dl=p.createContext(null),Wi=p.createContext({outlet:null,matches:[],isDataRoute:!1}),Hv=p.createContext(null);function P2(e,t){let{relative:i}=t===void 0?{}:t;kn()||Se(!1);let{basename:r,navigator:s}=p.useContext(zi),{hash:n,pathname:o,search:c}=Tl(e,{relative:i}),l=o;return r!=="/"&&(l=o==="/"?r:kr([r,o])),s.createHref({pathname:l,search:c,hash:n})}function kn(){return p.useContext(Dl)!=null}function Mt(){return kn()||Se(!1),p.useContext(Dl).location}function Vv(e){p.useContext(zi).static||p.useLayoutEffect(e)}function Za(){let{isDataRoute:e}=p.useContext(Wi);return e?z2():_2()}function _2(){kn()||Se(!1);let e=p.useContext(Cl),{basename:t,future:i,navigator:r}=p.useContext(zi),{matches:s}=p.useContext(Wi),{pathname:n}=Mt(),o=JSON.stringify(Sm(s,i.v7_relativeSplatPath)),c=p.useRef(!1);return Vv(()=>{c.current=!0}),p.useCallback(function(d,u){if(u===void 0&&(u={}),!c.current)return;if(typeof d=="number"){r.go(d);return}let h=Cm(d,JSON.parse(o),n,u.relative==="path");e==null&&t!=="/"&&(h.pathname=h.pathname==="/"?t:kr([t,h.pathname])),(u.replace?r.replace:r.push)(h,u.state,u)},[t,r,o,n,e])}function Dm(){let{matches:e}=p.useContext(Wi),t=e[e.length-1];return t?t.params:{}}function Tl(e,t){let{relative:i}=t===void 0?{}:t,{future:r}=p.useContext(zi),{matches:s}=p.useContext(Wi),{pathname:n}=Mt(),o=JSON.stringify(Sm(s,r.v7_relativeSplatPath));return p.useMemo(()=>Cm(e,JSON.parse(o),n,i==="path"),[e,o,n,i])}function I2(e,t){return j2(e,t)}function j2(e,t,i,r){kn()||Se(!1);let{navigator:s}=p.useContext(zi),{matches:n}=p.useContext(Wi),o=n[n.length-1],c=o?o.params:{};o&&o.pathname;let l=o?o.pathnameBase:"/";o&&o.route;let d=Mt(),u;if(t){var h;let k=typeof t=="string"?wn(t):t;l==="/"||(h=k.pathname)!=null&&h.startsWith(l)||Se(!1),u=k}else u=d;let g=u.pathname||"/",m=g;if(l!=="/"){let k=l.replace(/^\//,"").split("/");m="/"+g.replace(/^\//,"").split("/").slice(k.length).join("/")}let w=a2(e,{pathname:m}),v=N2(w&&w.map(k=>Object.assign({},k,{params:Object.assign({},c,k.params),pathname:kr([l,s.encodeLocation?s.encodeLocation(k.pathname).pathname:k.pathname]),pathnameBase:k.pathnameBase==="/"?l:kr([l,s.encodeLocation?s.encodeLocation(k.pathnameBase).pathname:k.pathnameBase])})),n,i,r);return t&&v?p.createElement(Dl.Provider,{value:{location:Ma({pathname:"/",search:"",hash:"",state:null,key:"default"},u),navigationType:hr.Pop}},v):v}function M2(){let e=q2(),t=T2(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),i=e instanceof Error?e.stack:null,s={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return p.createElement(p.Fragment,null,p.createElement("h2",null,"Unexpected Application
59Error!"),p.createElement("h3",{style:{fontStyle:"italic"}},t),i?p.createElement("pre",{style:s},i):null,null)}const R2=p.createElement(M2,null);class O2 extends p.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,i){return i.location!==t.location||i.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:i.error,location:i.location,revalidation:t.revalidation||i.revalidation}}componentDidCatch(t,i){console.error("React Router caught the following error during render",t,i)}render(){return this.state.error!==void 0?p.createElement(Wi.Provider,{value:this.props.routeContext},p.createElement(Hv.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function F2(e){let{routeContext:t,match:i,children:r}=e,s=p.useContext(Cl);return s&&s.static&&s.staticContext&&(i.route.errorElement||i.route.ErrorBoundary)&&(s.staticContext._deepestRenderedBoundaryId=i.route.id),p.createElement(Wi.Provider,{value:t},r)}function N2(e,t,i,r){var s;if(t===void 0&&(t=[]),i===void 0&&(i=null),r===void 0&&(r=null),e==null){var n;if(!i)return null;if(i.errors)e=i.matches;else if((n=r)!=null&&n.v7_partialHydration&&t.length===0&&!i.initialized&&i.matches.length>0)e=i.matches;else return null}let o=e,c=(s=i)==null?void 0:s.errors;if(c!=null){let u=o.findIndex(h=>h.route.id&&(c==null?void 0:c[h.route.id])!==void 0);u>=0||Se(!1),o=o.slice(0,Math.min(o.length,u+1))}let l=!1,d=-1;if(i&&r&&r.v7_partialHydration)for(let u=0;u<o.length;u++){let h=o[u];if((h.route.HydrateFallback||h.route.hydrateFallbackElement)&&(d=u),h.route.id){let{loaderData:g,errors:m}=i,w=h.route.loader&&g[h.route.id]===void 0&&(!m||m[h.route.id]===void 0);if(h.route.lazy||w){l=!0,d>=0?o=o.slice(0,d+1):o=[o[0]];break}}}return o.reduceRight((u,h,g)=>{let m,w=!1,v=null,k=null;i&&(m=c&&h.route.id?c[h.route.id]:void 0,v=h.route.errorElement||R2,l&&(d<0&&g===0?(w=!0,k=null):d===g&&(w=!0,k=h.route.hydrateFallbackElement||null)));let y=t.concat(o.slice(0,g+1)),f=()=>{let b;return m?b=v:w?b=k:h.route.Component?b=p.createElement(h.route.Component,null):h.route.element?b=h.route.element:b=u,p.createElement(F2,{match:h,routeContext:{outlet:u,matches:y,isDataRoute:i!=null},children:b})};return i&&(h.route.ErrorBoundary||h.route.errorElement||g===0)?p.createElement(O2,{location:i.location,revalidation:i.revalidation,component:v,error:m,children:f(),routeContext:{outlet:null,matches:y,isDataRoute:!0}}):f()},null)}var Gv=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(Gv||{}),qc=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(qc||{});function L2(e){let t=p.useContext(Cl);return t||Se(!1),t}function B2(e){let t=p.useContext($v);return t||Se(!1),t}function U2(e){let t=p.useContext(Wi);return t||Se(!1),t}function Kv(e){let t=U2(),i=t.matches[t.matches.length-1];return i.route.id||Se(!1),i.route.id}function q2(){var e;let t=p.useContext(Hv),i=B2(qc.UseRouteError),r=Kv(qc.UseRouteError);return t!==void 0?t:(e=i.errors)==null?void 0:e[r]}function z2(){let{router:e}=L2(Gv.UseNavigateStable),t=Kv(qc.UseNavigateStable),i=p.useRef(!1);return Vv(()=>{i.current=!0}),p.useCallback(function(s,n){n===void 0&&(n={}),i.current&&(typeof s=="number"?e.navigate(s):e.navigate(s,Ma({fromRouteId:t},n)))},[e,t])}function W2(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function si(e){let{to:t,replace:i,state:r,relative:s}=e;kn()||Se(!1);let{future:n,static:o}=p.useContext(zi),{matches:c}=p.useContext(Wi),{pathname:l}=Mt(),d=Za(),u=Cm(t,Sm(c,n.v7_relativeSplatPath),l,s==="path"),h=JSON.stringify(u);return p.useEffect(()=>d(JSON.parse(h),{replace:i,state:r,relative:s}),[d,h,s,i,r]),null}function A(e){Se(!1)}function $2(e){let{basename:t="/",children:i=null,location:r,navigationType:s=hr.Pop,navigator:n,static:o=!1,future:c}=e;kn()&&Se(!1);let l=t.replace(/^\/*/,"/"),d=p.useMemo(()=>({basename:l,navigator:n,static:o,future:Ma({v7_relativeSplatPath:!1},c)}),[l,c,n,o]);typeof r=="string"&&(r=wn(r));
59let{pathname:u="/",search:h="",hash:g="",state:m=null,key:w="default"}=r,v=p.useMemo(()=>{let k=pn(u,l);return k==null?null:{location:{pathname:k,search:h,hash:g,state:m,key:w},navigationType:s}},[l,u,h,g,m,w,s]);return v==null?null:p.createElement(zi.Provider,{value:d},p.createElement(Dl.Provider,{children:i,value:v}))}function H2(e){let{children:t,location:i}=e;return I2(Wu(t),i)}new Promise(()=>{});function Wu(e,t){t===void 0&&(t=[]);let i=[];return p.Children.forEach(e,(r,s)=>{if(!p.isValidElement(r))return;let n=[...t,s];if(r.type===p.Fragment){i.push.apply(i,Wu(r.props.children,n));return}r.type!==A&&Se(!1),!r.props.index||!r.props.children||Se(!1);let o={id:r.props.id||n.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=Wu(r.props.children,n)),i.push(o)}),i}/** 60 * React Router DOM v6.30.4 61 * 62 * Copyright (c) Remix Software Inc. 63 * 64 * This source code is licensed under the MIT license found in the 65 * LICENSE.md file in the root directory of this source tree. 66 * 67 * @license MIT 68 */function zc(){return zc=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)({}).hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e},zc.apply(null,arguments)}function Qv(e,t){if(e==null)return{};var i={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;i[r]=e[r]}return i}function V2(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function G2(e,t){return e.button===0&&(!t||t==="_self")&&!V2(e)}function $u(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,i)=>{let r=e[i];return t.concat(Array.isArray(r)?r.map(s=>[i,s]):[[i,r]])},[]))}function K2(e,t){let i=$u(e);return t&&t.forEach((r,s)=>{i.has(s)||t.getAll(s).forEach(n=>{i.append(s,n)})}),i}const Q2=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],X2=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],J2="6";try{window.__reactRouterVersion=J2}catch{}const Y2=p.createContext({isTransitioning:!1}),Z2="startTransition",Ig=_h[Z2];function eS(e){let{basename:t,children:i,future:r,window:s}=e,n=p.useRef();n.current==null&&(n.current=r2({window:s,v5Compat:!0}));let o=n.current,[c,l]=p.useState({action:o.action,location:o.location}),{v7_startTransition:d}=r||{},u=p.useCallback(h=>{d&&Ig?Ig(()=>l(h)):l(h)},[l,d]);return p.useLayoutEffect(()=>o.listen(u),[o,u]),p.useEffect(()=>W2(r),[r]),p.createElement($2,{basename:t,children:i,location:c.location,navigationType:c.action,navigator:o,future:r})}const tS=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",iS=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,H=p.forwardRef(function(t,i){let{onClick:r,relative:s,reloadDocument:n,replace:o,state:c,target:l,to:d,preventScrollReset:u,viewTransition:h}=t,g=Qv(t,Q2),{basename:m}=p.useContext(zi),w,v=!1;if(typeof d=="string"&&iS.test(d)&&(w=d,tS))try{let b=new URL(window.location.href),x=d.startsWith("//")?new URL(b.protocol+d):new URL(d),C=pn(x.pathname,m);x.origin===b.origin&&C!=null?d=C+x.search+x.hash:v=!0}catch{}let k=P2(d,{relative:s}),y=sS(d,{replace:o,state:c,target:l,preventScrollReset:u,relative:s,viewTransition:h});function f(b){r&&r(b),b.defaultPrevented||y(b)}return p.createElement("a",zc({},g,{href:w||k,onClick:v||n?r:f,ref:i,target:l}))}),zt=p.forwardRef(function(t,i){let{"aria-current":r="page",caseSensitive:s=!1,className:n="",end:o=!1,style:c,to:l,viewTransition:d,children:u}=t,h=Qv(t,X2),g=Tl(l,{relative:h.relative}),m=Mt(),w=p.useContext($v),{navigator:v,basename:k}=p.useContext(zi),y=w!=null&&nS(g)&&d===!0,f=v.encodeLocation?v.encodeLocation(g).pathname:g.pathname,b=m.pathname,x=w&&w.navigation&&w.navigation.location?w.navigation.location.pathname:null;s||(b=b.toLowerCase(),x=x?x.toLowerCase():null,f=f.toLowerCase()),x&&k&&(x=pn(x,k)||x);const C=f!=="/"&&f.endsWith("/")?f.length-1:f.length;let D=b===f||!o&&b.startsWith(f)&&b.charAt(C)==="/",T=x!=null&&(x===f||!o&&x.startsWith(f)&&x.charAt(f.length)==="/"),I={isActive:D,isPending:T,isTransitioning:y},R=D?r:void 0,F;typeof n=="function"?F=n(I):F=[n,D?"active":null,T?"pending":null,y?"transitioning":null].filter(
68Boolean).join(" ");let K=typeof c=="function"?c(I):c;return p.createElement(H,zc({},h,{"aria-current":R,className:F,ref:i,style:K,to:l,viewTransition:d}),typeof u=="function"?u(I):u)});var Hu;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Hu||(Hu={}));var jg;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(jg||(jg={}));function rS(e){let t=p.useContext(Cl);return t||Se(!1),t}function sS(e,t){let{target:i,replace:r,state:s,preventScrollReset:n,relative:o,viewTransition:c}=t===void 0?{}:t,l=Za(),d=Mt(),u=Tl(e,{relative:o});return p.useCallback(h=>{if(G2(h,i)){h.preventDefault();let g=r!==void 0?r:Bc(d)===Bc(u);l(e,{replace:g,state:s,preventScrollReset:n,relative:o,viewTransition:c})}},[d,l,u,r,s,i,e,n,o,c])}function S6(e){let t=p.useRef($u(e)),i=p.useRef(!1),r=Mt(),s=p.useMemo(()=>K2(r.search,i.current?null:t.current),[r.search]),n=Za(),o=p.useCallback((c,l)=>{const d=$u(typeof c=="function"?c(s):c);i.current=!0,n("?"+d,l)},[n,s]);return[s,o]}function nS(e,t){t===void 0&&(t={});let i=p.useContext(Y2);i==null&&Se(!1);let{basename:r}=rS(Hu.useViewTransitionState),s=Tl(e,{relative:t.relative});if(!i.isTransitioning)return!1;let n=pn(i.currentLocation.pathname,r)||i.currentLocation.pathname,o=pn(i.nextLocation.pathname,r)||i.nextLocation.pathname;return Uc(s.pathname,o)!=null||Uc(s.pathname,n)!=null}const aS={"/glossary/fda-section-524b-fdc-act":"/guides/fda-524b-cybersecurity-requirements-explained","/guides/medical-device-incident-response-plan-fda":"/blog/medical-device-incident-response-plan-fda","/guides/fda-2026-final-premarket-cybersecurity-guidance":"/guides/fda-cybersecurity-guidance"};var oS=typeof Element<"u",cS=typeof Map=="function",lS=typeof Set=="function",dS=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function sc(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;var i,r,s;if(Array.isArray(e)){if(i=e.length,i!=t.length)return!1;for(r=i;r--!==0;)if(!sc(e[r],t[r]))return!1;return!0}var n;if(cS&&e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(n=e.entries();!(r=n.next()).done;)if(!t.has(r.value[0]))return!1;for(n=e.entries();!(r=n.next()).done;)if(!sc(r.value[1],t.get(r.value[0])))return!1;return!0}if(lS&&e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(n=e.entries();!(r=n.next()).done;)if(!t.has(r.value[0]))return!1;return!0}if(dS&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(i=e.length,i!=t.length)return!1;for(r=i;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf&&typeof e.valueOf=="function"&&typeof t.valueOf=="function")return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString&&typeof e.toString=="function"&&typeof t.toString=="function")return e.toString()===t.toString();if(s=Object.keys(e),i=s.length,i!==Object.keys(t).length)return!1;for(r=i;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,s[r]))return!1;if(oS&&e instanceof Element)return!1;for(r=i;r--!==0;)if(!((s[r]==="_owner"||s[r]==="__v"||s[r]==="__o")&&e.$$typeof)&&!sc(e[s[r]],t[s[r]]))return!1;return!0}return e!==e&&t!==t}var uS=function(t,i){try{return sc(t,i)}catch(r){if((r.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw r}};const hS=Va(uS);var mS=function(e,t,i,r,s,n,o,c){if(!e){var l;if(t===void 0)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var d=[i,r,s,n,o,c],u=0;l=new Error(t.replace(/%s/g,function(){return d[u++]})),l.name="Invariant Violation"}throw l.framesToPop=1,l}},pS=mS;const Mg=Va(pS);var gS=function(t,i,r,s){var n=r?r.call(s,t,i):void 0;if(n!==void 0)return!!n;if(t===i)return!0;if(typeof t!="object"||!t||typeof i!="object"||!i)return!1;var o=Object.keys(t),c=Object.keys(i);if(o.length!==c.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(i),d=0;d<o.length;d++){var u=o[d];if(!l(u))return!1;var h=t[u],g=i[u];if(n=r?r.call(s,h,g,u):void 0,n===!1||n===void 0&&h!==g)return!1}return!0};const fS=Va(gS);var Xv=(e=>(e.BASE="base",e.BODY="body",e.HEAD="head",e.HTML="html",e.LINK="link",e.META="meta",e.NOSCRIPT="noscript",e.SCRIPT="script",e.STYLE="style",e.TITLE="title",e.FRAGMENT="Symbol(react.fragment)",e))(Xv||{}),Cd={link:{rel:["amphtml","canonical","alternate"]},script:{type:["application/ld+json"]}
68,meta:{charset:"",name:["generator","robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]}},Rg=Object.values(Xv),El={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},Jv=Object.entries(El).reduce((e,[t,i])=>(e[i]=t,e),{}),ei="data-rh",Hs={DEFAULT_TITLE:"defaultTitle",DEFER:"defer",ENCODE_SPECIAL_CHARACTERS:"encodeSpecialCharacters",ON_CHANGE_CLIENT_STATE:"onChangeClientState",TITLE_TEMPLATE:"titleTemplate",PRIORITIZE_SEO_TAGS:"prioritizeSeoTags"},Vs=(e,t)=>{for(let i=e.length-1;i>=0;i-=1){const r=e[i];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},yS=e=>{let t=Vs(e,"title");const i=Vs(e,Hs.TITLE_TEMPLATE);if(Array.isArray(t)&&(t=t.join("")),i&&t)return i.replace(/%s/g,()=>t);const r=Vs(e,Hs.DEFAULT_TITLE);return t||r||void 0},bS=e=>Vs(e,Hs.ON_CHANGE_CLIENT_STATE)||(()=>{}),Dd=(e,t)=>t.filter(i=>typeof i[e]<"u").map(i=>i[e]).reduce((i,r)=>({...i,...r}),{}),vS=(e,t)=>t.filter(i=>typeof i.base<"u").map(i=>i.base).reverse().reduce((i,r)=>{if(!i.length){const s=Object.keys(r);for(let n=0;n<s.length;n+=1){const c=s[n].toLowerCase();if(e.indexOf(c)!==-1&&r[c])return i.concat(r)}}return i},[]),wS=e=>console&&typeof console.warn=="function"&&console.warn(e),Bn=(e,t,i)=>{const r={};return i.filter(s=>Array.isArray(s[e])?!0:(typeof s[e]<"u"&&wS(`Helmet: ${e} should be of type "Array". Instead found type "${typeof s[e]}"`),!1)).map(s=>s[e]).reverse().reduce((s,n)=>{const o={};n.filter(l=>{let d;const u=Object.keys(l);for(let g=0;g<u.length;g+=1){const m=u[g],w=m.toLowerCase();t.indexOf(w)!==-1&&!(d==="rel"&&l[d].toLowerCase()==="canonical")&&!(w==="rel"&&l[w].toLowerCase()==="stylesheet")&&(d=w),t.indexOf(m)!==-1&&(m==="innerHTML"||m==="cssText"||m==="itemprop")&&(d=m)}if(!d||!l[d])return!1;const h=l[d].toLowerCase();return r[d]||(r[d]={}),o[d]||(o[d]={}),r[d][h]?!1:(o[d][h]=!0,!0)}).reverse().forEach(l=>s.push(l));const c=Object.keys(o);for(let l=0;l<c.length;l+=1){const d=c[l],u={...r[d],...o[d]};r[d]=u}return s},[]).reverse()},kS=(e,t)=>{if(Array.isArray(e)&&e.length){for(let i=0;i<e.length;i+=1)if(e[i][t])return!0}return!1},xS=e=>({baseTag:vS(["href"],e),bodyAttributes:Dd("bodyAttributes",e),defer:Vs(e,Hs.DEFER),encode:Vs(e,Hs.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:Dd("htmlAttributes",e),linkTags:Bn("link",["rel","href"],e),metaTags:Bn("meta",["name","charset","http-equiv","property","itemprop"],e),noscriptTags:Bn("noscript",["innerHTML"],e),onChangeClientState:bS(e),scriptTags:Bn("script",["src","innerHTML"],e),styleTags:Bn("style",["cssText"],e),title:yS(e),titleAttributes:Dd("titleAttributes",e),prioritizeSeoTags:kS(e,Hs.PRIORITIZE_SEO_TAGS)}),Yv=e=>Array.isArray(e)?e.join(""):e,AS=(e,t)=>{const i=Object.keys(e);for(let r=0;r<i.length;r+=1)if(t[i[r]]&&t[i[r]].includes(e[i[r]]))return!0;return!1},Td=(e,t)=>Array.isArray(e)?e.reduce((i,r)=>(AS(r,t)?i.priority.push(r):i.default.push(r),i),{priority:[],default:[]}):{default:e,priority:[]},Og=(e,t)=>({...e,[t]:void 0}),SS=["noscript","script","style"],Vu=(e,t=!0)=>t===!1?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),Zv=e=>Object.keys(e).reduce((t,i)=>{const r=typeof e[i]<"u"?`${i}="${e[i]}"`:`${i}`;return t?`${t} ${r}`:r},""),CS=(e,t,i,r)=>{const s=Zv(i),n=Yv(t);return s?`<${e} ${ei}="true" ${s}>${Vu(n,r)}</${e}>`:`<${e} ${ei}="true">${Vu(n,r)}</${e}>`},DS=(e,t,i=!0)=>t.reduce((r,s)=>{const n=s,o=Object.keys(n).filter(d=>!(d==="innerHTML"||d==="cssText")).reduce((d,u)=>{const h=typeof n[u]>"u"?u:`${u}="${Vu(n[u],i)}"`;return d?`${d} ${h}`:h},""),c=n.innerHTML||n.cssText||"",l=SS.indexOf(e)===-1;return`${r}<${e} ${ei}="true" ${o}${l?"/>":`>${c}</${e}>`}`},""),e0=(e,t={})=>Object.keys(e).reduce((i,r)=>{const s=El[r];return i[s||r]=e[r],i},t),TS=(e,t,i)=>{const r={key:t,[ei]:!0},s=e0(i,r);return[E.createElement("title",s,t)]},nc=(e,t)=>t.map((i,r)=>{const s={key:r,[ei]:!0};
68return Object.keys(i).forEach(n=>{const c=El[n]||n;if(c==="innerHTML"||c==="cssText"){const l=i.innerHTML||i.cssText;s.dangerouslySetInnerHTML={__html:l}}else s[c]=i[n]}),E.createElement(e,s)}),Ct=(e,t,i=!0)=>{switch(e){case"title":return{toComponent:()=>TS(e,t.title,t.titleAttributes),toString:()=>CS(e,t.title,t.titleAttributes,i)};case"bodyAttributes":case"htmlAttributes":return{toComponent:()=>e0(t),toString:()=>Zv(t)};default:return{toComponent:()=>nc(e,t),toString:()=>DS(e,t,i)}}},ES=({metaTags:e,linkTags:t,scriptTags:i,encode:r})=>{const s=Td(e,Cd.meta),n=Td(t,Cd.link),o=Td(i,Cd.script);return{priorityMethods:{toComponent:()=>[...nc("meta",s.priority),...nc("link",n.priority),...nc("script",o.priority)],toString:()=>`${Ct("meta",s.priority,r)} ${Ct("link",n.priority,r)} ${Ct("script",o.priority,r)}`},metaTags:s.default,linkTags:n.default,scriptTags:o.default}},PS=e=>{const{baseTag:t,bodyAttributes:i,encode:r=!0,htmlAttributes:s,noscriptTags:n,styleTags:o,title:c="",titleAttributes:l,prioritizeSeoTags:d}=e;let{linkTags:u,metaTags:h,scriptTags:g}=e,m={toComponent:()=>[],toString:()=>""};return d&&({priorityMethods:m,linkTags:u,metaTags:h,scriptTags:g}=ES(e)),{priority:m,base:Ct("base",t,r),bodyAttributes:Ct("bodyAttributes",i,r),htmlAttributes:Ct("htmlAttributes",s,r),link:Ct("link",u,r),meta:Ct("meta",h,r),noscript:Ct("noscript",n,r),script:Ct("script",g,r),style:Ct("style",o,r),title:Ct("title",{title:c,titleAttributes:l},r)}},Gu=PS,Io=[],Tm=!!(typeof window<"u"&&window.document&&window.document.createElement),Ku=class{constructor(e,t){xi(this,"instances",[]);xi(this,"canUseDOM",Tm);xi(this,"context");xi(this,"value",{setHelmet:e=>{this.context.helmet=e},helmetInstances:{get:()=>this.canUseDOM?Io:this.instances,add:e=>{(this.canUseDOM?Io:this.instances).push(e)},remove:e=>{const t=(this.canUseDOM?Io:this.instances).indexOf(e);(this.canUseDOM?Io:this.instances).splice(t,1)}}});this.context=e,this.canUseDOM=t||!1,t||(e.helmet=Gu({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))}},_S=parseInt(E.version.split(".")[0],10),Qu=_S>=19,IS={},t0=E.createContext(IS),Yr,i0=(Yr=class extends p.Component{constructor(i){super(i);xi(this,"helmetData");Qu?this.helmetData=null:this.helmetData=new Ku(this.props.context||{},Yr.canUseDOM)}render(){return Qu?E.createElement(E.Fragment,null,this.props.children):E.createElement(t0.Provider,{value:this.helmetData.value},this.props.children)}},xi(Yr,"canUseDOM",Tm),Yr),gs=(e,t)=>{const i=document.head||document.querySelector("head"),r=i.querySelectorAll(`${e}[${ei}]`),s=[].slice.call(r),n=[];let o;return t&&t.length&&t.forEach(c=>{const l=document.createElement(e);for(const d in c)if(Object.prototype.hasOwnProperty.call(c,d))if(d==="innerHTML")l.innerHTML=c.innerHTML;else if(d==="cssText"){const u=c.cssText;l.appendChild(document.createTextNode(u))}else{const u=d,h=typeof c[u]>"u"?"":c[u];l.setAttribute(d,h)}l.setAttribute(ei,"true"),s.some((d,u)=>(o=u,l.isEqualNode(d)))?s.splice(o,1):n.push(l)}),s.forEach(c=>{var l;return(l=c.parentNode)==null?void 0:l.removeChild(c)}),n.forEach(c=>i.appendChild(c)),{oldTags:s,newTags:n}},Xu=(e,t)=>{const i=document.getElementsByTagName(e)[0];if(!i)return;const r=i.getAttribute(ei),s=r?r.split(","):[],n=[...s],o=Object.keys(t);for(const c of o){const l=t[c]||"";i.getAttribute(c)!==l&&i.setAttribute(c,l),s.indexOf(c)===-1&&s.push(c);const d=n.indexOf(c);d!==-1&&n.splice(d,1)}for(let c=n.length-1;c>=0;c-=1)i.removeAttribute(n[c]);s.length===n.length?i.removeAttribute(ei):i.getAttribute(ei)!==o.join(",")&&i.setAttribute(ei,o.join(","))},jS=(e,t)=>{typeof e<"u"&&document.title!==e&&(document.title=Yv(e)),Xu("title",t)},Fg=(e,t)=>
68{const{baseTag:i,bodyAttributes:r,htmlAttributes:s,linkTags:n,metaTags:o,noscriptTags:c,onChangeClientState:l,scriptTags:d,styleTags:u,title:h,titleAttributes:g}=e;Xu("body",r),Xu("html",s),jS(h,g);const m={baseTag:gs("base",i),linkTags:gs("link",n),metaTags:gs("meta",o),noscriptTags:gs("noscript",c),scriptTags:gs("script",d),styleTags:gs("style",u)},w={},v={};Object.keys(m).forEach(k=>{const{newTags:y,oldTags:f}=m[k];y.length&&(w[k]=y),f.length&&(v[k]=m[k].oldTags)}),t&&t(),l(e,w,v)},Un=null,MS=e=>{Un&&cancelAnimationFrame(Un),e.defer?Un=requestAnimationFrame(()=>{Fg(e,()=>{Un=null})}):(Fg(e),Un=null)},RS=MS,Ng=class extends p.Component{constructor(){super(...arguments);xi(this,"rendered",!1)}shouldComponentUpdate(t){return!fS(t,this.props)}componentDidUpdate(){this.emitChange()}componentWillUnmount(){const{helmetInstances:t}=this.props.context;t.remove(this),this.emitChange()}emitChange(){const{helmetInstances:t,setHelmet:i}=this.props.context;let r=null;const s=xS(t.get().map(n=>{const{context:o,...c}=n.props;return c}));i0.canUseDOM?RS(s):Gu&&(r=Gu(s)),i(r)}init(){if(this.rendered)return;this.rendered=!0;const{helmetInstances:t}=this.props.context;t.add(this),this.emitChange()}render(){return this.init(),null}},ac=[],Lg=e=>{const t={};for(const i of Object.keys(e))t[Jv[i]||i]=e[i];return t},Or=e=>{const t={};for(const i of Object.keys(e)){const r=El[i];t[r||i]=e[i]}return t},Bg=(e,t)=>{if(!Tm)return;const i=document.getElementsByTagName(e)[0];if(!i)return;const r="data-rh-managed",s=i.getAttribute(r),n=s?s.split(","):[],o=Object.keys(t);for(const c of n)o.includes(c)||i.removeAttribute(c);for(const c of o){const l=t[c];l==null||l===!1?i.removeAttribute(c):l===!0?i.setAttribute(c,""):i.setAttribute(c,String(l))}o.length>0?i.setAttribute(r,o.join(",")):i.removeAttribute(r)},Ed=()=>{const e={},t={};for(const i of ac){const{htmlAttributes:r,bodyAttributes:s}=i.props;r&&Object.assign(e,Lg(r)),s&&Object.assign(t,Lg(s))}Bg("html",e),Bg("body",t)},OS=class extends p.Component{componentDidMount(){ac.push(this),Ed()}componentDidUpdate(){Ed()}componentWillUnmount(){const e=ac.indexOf(this);e!==-1&&ac.splice(e,1),Ed()}resolveTitle(){const{title:e,titleTemplate:t,defaultTitle:i}=this.props;return e&&t?t.replace(/%s/g,()=>Array.isArray(e)?e.join(""):e):e||i||void 0}renderTitle(){const e=this.resolveTitle();if(e===void 0)return null;const t=this.props.titleAttributes||{};return E.createElement("title",Or(t),e)}renderBase(){const{base:e}=this.props;return e?E.createElement("base",Or(e)):null}renderMeta(){const{meta:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,i)=>E.createElement("meta",{key:i,...Or(t)}))}renderLink(){const{link:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,i)=>E.createElement("link",{key:i,...Or(t)}))}renderScript(){const{script:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,i)=>{const{innerHTML:r,...s}=t,n=Or(s);return r&&(n.dangerouslySetInnerHTML={__html:r}),E.createElement("script",{key:i,...n})})}renderStyle(){const{style:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,i)=>{const{cssText:r,...s}=t,n=Or(s);return r&&(n.dangerouslySetInnerHTML={__html:r}),E.createElement("style",{key:i,...n})})}renderNoscript(){const{noscript:e}=this.props;return!e||!Array.isArray(e)?null:e.map((t,i)=>{const{innerHTML:r,...s}=t,n=Or(s);return r&&(n.dangerouslySetInnerHTML={__html:r}),E.createElement("noscript",{key:i,...n})})}render(){return E.createElement(E.Fragment,null,this.renderTitle(),this.renderBase(),this.renderMeta(),this.renderLink(),this.renderScript(),this.renderStyle(),this.renderNoscript())}},Gd,eo=(Gd=class extends p.Component{shouldComponentUpdate(e){return!hS(Og(this.props,"helmetData"),Og(e,"helmetData"))}mapNestedChildrenToProps(e,t){if(!t)return null;switch(e.type){case"script":case"noscript":return{innerHTML:t};case"style":return{cssText:t};default:throw new Error(`<${e.type} /> elements are self-closing and can not contain children. Refer to our API for more information.`)}}flattenArrayTypeChildren(e,t,i,r){return{...t,[e.type]:[...t[e.type]||[],{...i,...this.mapNestedChildrenToProps(e,r)}]}}mapObjectTypeChildren(e,t,i,r){switch(e.type){case"title":return{...t,[e.type]:r,titleAttributes:{...i}};case"body":return{...t,bodyAttributes:{...i}};case"html":return{...t,htmlAttributes:{...i}};default:return{...t,[e.type]:{...i}}}}mapArrayTypeChildrenToProps(e,t){let i={...t};return Object.keys(e).forEach(r=>{i={...i,[r]:e[r]}}),i}
68warnOnInvalidChildren(e,t){return Mg(Rg.some(i=>e.type===i),typeof e.type=="function"?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":`Only elements types ${Rg.join(", ")} are allowed. Helmet does not support rendering <${e.type}> elements. Refer to our API for more information.`),Mg(!t||typeof t=="string"||Array.isArray(t)&&!t.some(i=>typeof i!="string"),`Helmet expects a string as a child of <${e.type}>. Did you forget to wrap your children in braces? ( <${e.type}>{\`\`}</${e.type}> ) Refer to our API for more information.`),!0}mapChildrenToProps(e,t){let i={};return E.Children.forEach(e,r=>{if(!r||!r.props)return;const{children:s,...n}=r.props,o=Object.keys(n).reduce((l,d)=>(l[Jv[d]||d]=n[d],l),{});let{type:c}=r;switch(typeof c=="symbol"?c=c.toString():this.warnOnInvalidChildren(r,s),c){case"Symbol(react.fragment)":t=this.mapChildrenToProps(s,t);break;case"link":case"meta":case"noscript":case"script":case"style":i=this.flattenArrayTypeChildren(r,i,o,s);break;default:t=this.mapObjectTypeChildren(r,t,o,s);break}}),this.mapArrayTypeChildrenToProps(i,t)}render(){const{children:e,...t}=this.props;let i={...t},{helmetData:r}=t;if(e&&(i=this.mapChildrenToProps(e,i)),r&&!(r instanceof Ku)){const s=r;r=new Ku(s.context,!0),delete i.helmetData}return Qu?E.createElement(OS,{...i}):r?E.createElement(Ng,{...i,context:r.value}):E.createElement(t0.Consumer,null,s=>E.createElement(Ng,{...i,context:s}))}},xi(Gd,"defaultProps",{defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1}),Gd),Ug=["light","dark"],FS="(prefers-color-scheme: dark)",NS=p.createContext(void 0),LS={setTheme:e=>{},themes:[]},BS=()=>{var e;return(e=p.useContext(NS))!=null?e:LS};p.memo(({forcedTheme:e,storageKey:t,attribute:i,enableSystem:r,enableColorScheme:s,defaultTheme:n,value:o,attrs:c,nonce:l})=>{let d=n==="system",u=i==="class"?`var d=document.documentElement,c=d.classList;${`c.remove(${c.map(w=>`'${w}'`).join(",")})`};`:`var d=document.documentElement,n='${i}',s='setAttribute';`,h=s?Ug.includes(n)&&n?`if(e==='light'||e==='dark'||!e)d.style.colorScheme=e||'${n}'`:"if(e==='light'||e==='dark')d.style.colorScheme=e":"",g=(w,v=!1,k=!0)=>{let y=o?o[w]:w,f=v?w+"|| ''":`'${y}'`,b="";return s&&k&&!v&&Ug.includes(w)&&(b+=`d.style.colorScheme = '${w}';`),i==="class"?v||y?b+=`c.add(${f})`:b+="null":y&&(b+=`d[s](n,${f})`),b},m=e?`!function(){${u}${g(e)}}()`:r?`!function(){try{${u}var e=localStorage.getItem('${t}');if('system'===e||(!e&&${d})){var t='${FS}',m=window.matchMedia(t);if(m.media!==t||m.matches){${g("dark")}}else{${g("light")}}}else if(e){${o?`var x=${JSON.stringify(o)};`:""}${g(o?"x[e]":"e",!0)}}${d?"":"else{"+g(n,!1,!1)+"}"}${h}}catch(e){}}()`:`!function(){try{${u}var e=localStorage.getItem('${t}');if(e){${o?`var x=${JSON.stringify(o)};`:""}${g(o?"x[e]":"e",!0)}}else{${g(n,!1,!1)};}${h}}catch(t){}}();`;return p.createElement("script",{nonce:l,dangerouslySetInnerHTML:{__html:m}})});var US=e=>{switch(e){case"success":return WS;case"info":return HS;case"warning":return $S;case"error":return VS;default:return null}},qS=Array(12).fill(0),zS=({visible:e,className:t})=>E.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},E.createElement("div",{className:"sonner-spinner"},qS.map((i,r)=>E.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${r}`})))),WS=E.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},E.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),$S=E.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},E.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),HS=E.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},E.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),VS=E.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},E.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),GS=E.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},E.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),E.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),KS=()=>{let[e,t]=E.useState(document.hidden);return E.useEffect(()=>{let i=()=>{t(document.hidden)};
68return document.addEventListener("visibilitychange",i),()=>window.removeEventListener("visibilitychange",i)},[]),e},Ju=1,QS=class{constructor(){this.subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]},this.create=e=>{var t;let{message:i,...r}=e,s=typeof(e==null?void 0:e.id)=="number"||((t=e.id)==null?void 0:t.length)>0?e.id:Ju++,n=this.toasts.find(c=>c.id===s),o=e.dismissible===void 0?!0:e.dismissible;return this.dismissedToasts.has(s)&&this.dismissedToasts.delete(s),n?this.toasts=this.toasts.map(c=>c.id===s?(this.publish({...c,...e,id:s,title:i}),{...c,...e,id:s,dismissible:o,title:i}):c):this.addToast({title:i,...r,dismissible:o,id:s}),s},this.dismiss=e=>(this.dismissedToasts.add(e),e||this.toasts.forEach(t=>{this.subscribers.forEach(i=>i({id:t.id,dismiss:!0}))}),this.subscribers.forEach(t=>t({id:e,dismiss:!0})),e),this.message=(e,t)=>this.create({...t,message:e}),this.error=(e,t)=>this.create({...t,message:e,type:"error"}),this.success=(e,t)=>this.create({...t,type:"success",message:e}),this.info=(e,t)=>this.create({...t,type:"info",message:e}),this.warning=(e,t)=>this.create({...t,type:"warning",message:e}),this.loading=(e,t)=>
68this.create({...t,type:"loading",message:e}),this.promise=(e,t)=>{if(!t)return;let i;t.loading!==void 0&&(i=this.create({...t,promise:e,type:"loading",message:t.loading,description:typeof t.description!="function"?t.description:void 0}));let r=e instanceof Promise?e:e(),s=i!==void 0,n,o=r.then(async l=>{if(n=["resolve",l],E.isValidElement(l))s=!1,this.create({id:i,type:"default",message:l});else if(JS(l)&&!l.ok){s=!1;let d=typeof t.error=="function"?await t.error(`HTTP error! status: ${l.status}`):t.error,u=typeof t.description=="function"?await t.description(`HTTP error! status: ${l.status}`):t.description;this.create({id:i,type:"error",message:d,description:u})}else if(t.success!==void 0){s=!1;let d=typeof t.success=="function"?await t.success(l):t.success,u=typeof t.description=="function"?await t.description(l):t.description;this.create({id:i,type:"success",message:d,description:u})}}).catch(async l=>{if(n=["reject",l],t.error!==void 0){s=!1;let d=typeof t.error=="function"?await t.error(l):t.error,u=typeof t.description=="function"?await t.description(l):t.description;this.create({id:i,type:"error",message:d,description:u})}}).finally(()=>{var l;s&&(this.dismiss(i),i=void 0),(l=t.finally)==null||l.call(t)}),c=()=>new Promise((l,d)=>o.then(()=>n[0]==="reject"?d(n[1]):l(n[1])).catch(d));return typeof i!="string"&&typeof i!="number"?{unwrap:c}:Object.assign(i,{unwrap:c})},this.custom=(e,t)=>{let i=(t==null?void 0:t.id)||Ju++;return this.create({jsx:e(i),id:i,...t}),i},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},nt=new QS,XS=(e,t)=>{let i=(t==null?void 0:t.id)||Ju++;return nt.addToast({title:e,...t,id:i}),i},JS=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",YS=XS,ZS=()=>nt.toasts,eC=()=>nt.getActiveToasts(),C6=Object.assign(YS,{success:nt.success,info:nt.info,warning:nt.warning,error:nt.error,custom:nt.custom,message:nt.message,promise:nt.promise,dismiss:nt.dismiss,loading:nt.loading},{getHistory:ZS,getToasts:eC});function tC(e,{insertAt:t}={}){if(typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t==="top"&&i.firstChild?i.insertBefore(r,i.firstChild):i.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}tC(`:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted="true"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted="true"]){transform:none}}:where([data-sonner-toaster][data-x-position="right"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position="left"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;
68left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}
68:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);
68--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)} 69`);function jo(e){return e.label!==void 0}var iC=3,rC="32px",sC="16px",qg=4e3,nC=356,aC=14,oC=20,cC=200;function Wt(...e){return e.filter(Boolean).join(" ")}function lC(e){let[t,i]=e.split("-"),r=[];return t&&r.push(t),i&&r.push(i),r}var dC=e=>{var t,i,r,s,n,o,c,l,d,u,h;let{invert:g,toast:m,unstyled:w,interacting:v,setHeights:k,visibleToasts:y,heights:f,index:b,toasts:x,expanded:C,removeToast:D,defaultRichColors:T,closeButton:I,style:R,cancelButtonStyle:F,actionButtonStyle:K,className:N="",descriptionClassName:J="",duration:B,position:ne,gap:Q,loadingIcon:Z,expandByDefault:_,classNames:j,icons:q,closeButtonAriaLabel:Y="Close toast",pauseWhenPageIsHidden:G}=e,[re,se]=E.useState(null),[we,z]=E.useState(null),[V,xt]=E.useState(!1),[He,Ot]=E.useState(!1),[Ft,jr]=E.useState(!1),[Nt,co]=E.useState(!1),[Vl,lo]=E.useState(!1),[Gl,Pn]=E.useState(0),[ds,rp]=E.useState(0),_n=E.useRef(m.duration||B||qg),sp=E.useRef(null),Mr=E.useRef(null),Kk=b===0,Qk=b+1<=y,At=m.type,us=m.dismissible!==!1,Xk=m.className||"",Jk=m.descriptionClassName||"",uo=E.useMemo(()=>f.findIndex(ee=>ee.toastId===m.id)||0,[f,m.id]),Yk=E.useMemo(()=>{var ee;return(ee=m.closeButton)!=null?ee:I},[m.closeButton,I]),np=E.useMemo(()=>m.duration||B||qg,[m.duration,B]),Kl=E.useRef(0),hs=E.useRef(0),ap=E.useRef(0),ms=E.useRef(null),[Zk,ex]=ne.split("-"),op=E.useMemo(()=>f.reduce((ee,de,ye)=>ye>=uo?ee:ee+de.height,0),[f,uo]),cp=KS(),tx=m.invert||g,Ql=At==="loading";hs.current=E.useMemo(()=>uo*Q+op,[uo,op]),E.useEffect(()=>{_n.current=np},[np]),E.useEffect(()=>{xt(!0)},[]),E.useEffect(()=>{let ee=Mr.current;if(ee){let de=ee.getBoundingClientRect().height;return rp(de),k(ye=>[{toastId:m.id,height:de,position:m.position},...ye]),()=>k(ye=>
69ye.filter(Lt=>Lt.toastId!==m.id))}},[k,m.id]),E.useLayoutEffect(()=>{if(!V)return;let ee=Mr.current,de=ee.style.height;ee.style.height="auto";let ye=ee.getBoundingClientRect().height;ee.style.height=de,rp(ye),k(Lt=>Lt.find(Bt=>Bt.toastId===m.id)?Lt.map(Bt=>Bt.toastId===m.id?{...Bt,height:ye}:Bt):[{toastId:m.id,height:ye,position:m.position},...Lt])},[V,m.title,m.description,k,m.id]);let Hi=E.useCallback(()=>{Ot(!0),Pn(hs.current),k(ee=>ee.filter(de=>de.toastId!==m.id)),setTimeout(()=>{D(m)},cC)},[m,D,k,hs]);E.useEffect(()=>{if(m.promise&&At==="loading"||m.duration===1/0||m.type==="loading")return;let ee;return C||v||G&&cp?(()=>{if(ap.current<Kl.current){let de=new Date().getTime()-Kl.current;_n.current=_n.current-de}ap.current=new Date().getTime()})():_n.current!==1/0&&(Kl.current=new Date().getTime(),ee=setTimeout(()=>{var de;(de=m.onAutoClose)==null||de.call(m,m),Hi()},_n.current)),()=>clearTimeout(ee)},[C,v,m,At,G,cp,Hi]),E.useEffect(()=>{m.delete&&Hi()},[Hi,m.delete]);function ix(){var ee,de,ye;return q!=null&&q.loading?E.createElement("div",{className:Wt(j==null?void 0:j.loader,(ee=m==null?void 0:m.classNames)==null?void 0:ee.loader,"sonner-loader"),"data-visible":At==="loading"},q.loading):Z?E.createElement("div",{className:Wt(j==null?void 0:j.loader,(de=m==null?void 0:m.classNames)==null?void 0:de.loader,"sonner-loader"),"data-visible":At==="loading"},Z):E.createElement(zS,{className:Wt(j==null?void 0:j.loader,(ye=m==null?void 0:m.classNames)==null?void 0:ye.loader),visible:At==="loading"})}return E.createElement("li",{tabIndex:0,ref:Mr,className:Wt(N,Xk,j==null?void 0:j.toast,(t=m==null?void 0:m.classNames)==null?void 0:t.toast,j==null?void 0:j.default,j==null?void 0:j[At],(i=m==null?void 0:m.classNames)==null?void 0:i[At]),"data-sonner-toast":"","data-rich-colors":(r=m.richColors)!=null?r:T,"data-styled":!(m.jsx||m.unstyled||w),"data-mounted":V,"data-promise":!!m.promise,"data-swiped":Vl,"data-removed":He,"data-visible":Qk,"data-y-position":Zk,"data-x-position":ex,"data-index":b,"data-front":Kk,"data-swiping":Ft,"data-dismissible":us,"data-type":At,"data-invert":tx,"data-swipe-out":Nt,"data-swipe-direction":we,"data-expanded":!!(C||_&&V),style:{"--index":b,"--toasts-before":b,"--z-index":x.length-b,"--offset":`${He?Gl:hs.current}px`,"--initial-height":_?"auto":`${ds}px`,...R,...m.style},onDragEnd:()=>{jr(!1),se(null),ms.current=null},onPointerDown:ee=>{Ql||!us||(sp.current=new Date,Pn(hs.current),ee.target.setPointerCapture(ee.pointerId),ee.target.tagName!=="BUTTON"&&(jr(!0),ms.current={x:ee.clientX,y:ee.clientY}))},onPointerUp:()=>{var ee,de,ye,Lt;if(Nt||!us)return;ms.current=null;let Bt=Number(((ee=Mr.current)==null?void 0:ee.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),Vi=Number(((de=Mr.current)==null?void 0:de.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),Rr=new Date().getTime()-((ye=sp.current)==null?void 0:ye.getTime()),Ut=re==="x"?Bt:Vi,Gi=Math.abs(Ut)/Rr;if(Math.abs(Ut)>=oC||Gi>.11){Pn(hs.current),(Lt=m.onDismiss)==null||Lt.call(m,m),z(re==="x"?Bt>0?"right":"left":Vi>0?"down":"up"),Hi(),co(!0),lo(!1);return}jr(!1),se(null)},onPointerMove:ee=>{var de,ye,Lt,Bt;if(!ms.current||!us||((de=window.getSelection())==null?void 0:de.toString().length)>0)return;let Vi=ee.clientY-ms.current.y,Rr=ee.clientX-ms.current.x,Ut=(ye=e.swipeDirections)!=null?ye:lC(ne);!re&&(Math.abs(Rr)>1||Math.abs(Vi)>1)&&se(Math.abs(Rr)>Math.abs(Vi)?"x":"y");let Gi={x:0,y:0};re==="y"?(Ut.includes("top")||Ut.includes("bottom"))&&(Ut.includes("top")&&Vi<0||Ut.includes("bottom")&&Vi>0)&&(Gi.y=Vi):re==="x"&&(Ut.includes("left")||Ut.includes("right"))&&(Ut.includes("left")&&Rr<0||Ut.includes("right")&&Rr>0)&&(Gi.x=Rr),(Math.abs(Gi.x)>0||Math.abs(Gi.y)>0)&&lo(!0),(Lt=Mr.current)==null||Lt.style.setProperty("--swipe-amount-x",`${Gi.x}px`),(Bt=Mr.current)==null||Bt.style.setProperty("--swipe-amount-y",`${Gi.y}px`)}},Yk&&!m.jsx?E.createElement("button",{"aria-label":Y,"data-disabled":Ql,"data-close-button":!0,onClick:Ql||!us?()=>{}:()=>{var ee;Hi(),(ee=m.onDismiss)==null||ee.call(m,m)},className:Wt(j==null?void 0:j.closeButton,(s=m==null?void 0:m.classNames)==null?void 0:s.closeButton)},(n=q==null?void 0:q.close)!=null?n:GS):null,m.jsx||p.isValidElement(m.title)?m.jsx?m.jsx:typeof m.title=="function"?m.title():m.title:E.createElement(E.Fragment,null,At||m.icon||m.promise?E.createElement("div",{"data-icon":"",className:Wt(j==null?void 0:j.icon,(o=m==null?void 0:m.classNames)==null?void 0:o.icon)},m.promise||m.type==="loading"&&!m.icon?m.icon||ix():null,m.type!=="loading"?m.
69icon||(q==null?void 0:q[At])||US(At):null):null,E.createElement("div",{"data-content":"",className:Wt(j==null?void 0:j.content,(c=m==null?void 0:m.classNames)==null?void 0:c.content)},E.createElement("div",{"data-title":"",className:Wt(j==null?void 0:j.title,(l=m==null?void 0:m.classNames)==null?void 0:l.title)},typeof m.title=="function"?m.title():m.title),m.description?E.createElement("div",{"data-description":"",className:Wt(J,Jk,j==null?void 0:j.description,(d=m==null?void 0:m.classNames)==null?void 0:d.description)},typeof m.description=="function"?m.description():m.description):null),p.isValidElement(m.cancel)?m.cancel:m.cancel&&jo(m.cancel)?E.createElement("button",{"data-button":!0,"data-cancel":!0,style:m.cancelButtonStyle||F,onClick:ee=>{var de,ye;jo(m.cancel)&&us&&((ye=(de=m.cancel).onClick)==null||ye.call(de,ee),Hi())},className:Wt(j==null?void 0:j.cancelButton,(u=m==null?void 0:m.classNames)==null?void 0:u.cancelButton)},m.cancel.label):null,p.isValidElement(m.action)?m.action:m.action&&jo(m.action)?E.createElement("button",{"data-button":!0,"data-action":!0,style:m.actionButtonStyle||K,onClick:ee=>{var de,ye;jo(m.action)&&((ye=(de=m.action).onClick)==null||ye.call(de,ee),!ee.defaultPrevented&&Hi())},className:Wt(j==null?void 0:j.actionButton,(h=m==null?void 0:m.classNames)==null?void 0:h.actionButton)},m.action.label):null))};function zg(){if(typeof window>"u"||typeof document>"u")return"ltr";let e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function uC(e,t){let i={};return[e,t].forEach((r,s)=>{let n=s===1,o=n?"--mobile-offset":"--offset",c=n?sC:rC;function l(d){["top","right","bottom","left"].forEach(u=>{i[`${o}-${u}`]=typeof d=="number"?`${d}px`:d})}typeof r=="number"||typeof r=="string"?l(r):typeof r=="object"?["top","right","bottom","left"].forEach(d=>{r[d]===void 0?i[`${o}-${d}`]=c:i[`${o}-${d}`]=typeof r[d]=="number"?`${r[d]}px`:r[d]}):l(c)}),i}var hC=p.forwardRef(function(e,t){let{invert:i,position:r="bottom-right",hotkey:s=["altKey","KeyT"],expand:n,closeButton:o,className:c,offset:l,mobileOffset:d,theme:u="light",richColors:h,duration:g,style:m,visibleToasts:w=iC,toastOptions:v,dir:k=zg(),gap:y=aC,loadingIcon:f,icons:b,containerAriaLabel:x="Notifications",pauseWhenPageIsHidden:C}=e,[D,T]=E.useState([]),I=E.useMemo(()=>Array.from(new Set([r].concat(D.filter(G=>G.position).map(G=>G.position)))),[D,r]),[R,F]=E.useState([]),[K,N]=E.useState(!1),[J,B]=E.useState(!1),[ne,Q]=E.useState(u!=="system"?u:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),Z=E.useRef(null),_=s.join("+").replace(/Key/g,"").replace(/Digit/g,""),j=E.useRef(null),q=E.useRef(!1),Y=E.useCallback(G=>{T(re=>{var se;return(se=re.find(we=>we.id===G.id))!=null&&se.delete||nt.dismiss(G.id),re.filter(({id:we})=>we!==G.id)})},[]);return E.useEffect(()=>nt.subscribe(G=>{if(G.dismiss){T(re=>re.map(se=>se.id===G.id?{...se,delete:!0}:se));return}setTimeout(()=>{_v.flushSync(()=>{T(re=>{let se=re.findIndex(we=>we.id===G.id);return se!==-1?[...re.slice(0,se),{...re[se],...G},...re.slice(se+1)]:[G,...re]})})})}),[]),E.useEffect(()=>{if(u!=="system"){Q(u);return}if(u==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?Q("dark"):Q("light")),typeof window>"u")return;let G=window.matchMedia("(prefers-color-scheme: dark)");try{G.addEventListener("change",({matches:re})=>{Q(re?"dark":"light")})}catch{G.addListener(({matches:se})=>{try{Q(se?"dark":"light")}catch(we){console.error(we)}})}},[u]),E.useEffect(()=>{D.length<=1&&N(!1)},[D]),E.useEffect(()=>{let G=re=>{var se,we;s.every(z=>re[z]||re.code===z)&&(N(!0),(se=Z.current)==null||se.focus()),re.code==="Escape"&&(document.activeElement===Z.current||(we=Z.current)!=null&&we.contains(document.activeElement))&&N(!1)};return document.addEventListener("keydown",G),()=>document.removeEventListener("keydown",G)},[s]),E.useEffect(()=>{if(Z.current)return()=>{j.current&&(j.current.focus({preventScroll:!0}),j.current=null,q.current=!1)}},[Z.current]),E.createElement("section",{ref:t,"aria-label":`${x} ${_}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},I.map((G,re)=>{var se;let[we,z]=G.split("-");return D.length?E.createElement("ol",{key:G,dir:k==="auto"?zg():k,tabIndex:-1,ref:Z,className:c,"data-sonner-toaster":!0,"data-theme":ne,"data-y-position":we,"data-lifted":K&&D.length>1&&!n,"data-x-position":z,style:{"--front-toast-height":`${((se=R[0])==null?void 0:se.height)||0}px`,"--width":`${nC}px`,"--gap":`${y}px`,...m,...uC(l,d)},onBlur:V=>{q.current&&!V.currentTarget.contains(V.relatedTarget)&&(q.current=!1,j.current&&(j.current.focus({preventScroll:!0}),j.current=null))},onFocus:V=>{V.target instanceof HTMLElement&&V.target.dataset.dismissible==="false"||q.current||(q.current=!0,j.current=V.relatedTarget)},onMouseEnter:()=>N(!0),onMouseMove:()=>N(!0),onMouseLeave:()=>{J||N(!1)},onDragEnd:()=>N(!1),onPointerDown:V=>{V.target instanceof HTMLElement&&V.target.dataset.dismissible==="false"||B(!0)},onPointerUp:()=>B(!1)},D.filter(V=>!V.position&&re===0||V.position===G).map((V,xt)=>{var He,Ot;return E.createElement(dC,{key:V.id,icons:b,index:xt,toast:V,defaultRichColors:h,duration:(He=v==null?void 0:v.duration)!=null?He:g,className:v==null?void 0:v.className,descriptionClassName:v==null?void 0:v.descriptionClassName,invert:i,visibleToasts:w,closeButton:(Ot=v==null?void 0:v.closeButton)!=null?Ot:o,interacting:J,position:G,style:v==null?void 0:v.style,unstyled:v==null?void 0:v.unstyled,classNames:v==null?void 0:v.classNames,cancelButtonStyle:v==null?void 0:v.cancelButtonStyle,actionButtonStyle:v==null?void 0:v.actionButtonStyle,removeToast:Y,toasts:D.filter(Ft=>Ft.position==V.position),heights:R.filter(Ft=>Ft.position==V.position),setHeights:F,expandByDefault:n,gap:y,loadingIcon:f,expanded:K,pauseWhenPageIsHidden:C,swipeDirections:e.swipeDirections})})):null}))});const mC=({...e})=>{const{theme:t="system"}=BS();return a.jsx(hC,{theme:t,className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e})},pC=1,gC=1e6;let Pd=0;function fC(){return Pd=(Pd+1)%Number.MAX_SAFE_INTEGER,Pd.toString()}const _d=new Map,Wg=e=>{if(_d.has(e))return;const t=setTimeout(()=>{_d.delete(e),ca({type:"REMOVE_TOAST",toastId:e})},gC);_d.set(e,t)},yC=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,pC)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(i=>i.id===t.toast.id?{...i,...t.toast}:i)};case"DISMISS_TOAST":{const{toastId:i}=t;
69return i?Wg(i):e.toasts.forEach(r=>{Wg(r.id)}),{...e,toasts:e.toasts.map(r=>r.id===i||i===void 0?{...r,open:!1}:r)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(i=>i.id!==t.toastId)}}},oc=[];let cc={toasts:[]};function ca(e){cc=yC(cc,e),oc.forEach(t=>{t(cc)})}function bC({...e}){const t=fC(),i=s=>ca({type:"UPDATE_TOAST",toast:{...s,id:t}}),r=()=>ca({type:"DISMISS_TOAST",toastId:t});return ca({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:s=>{s||r()}}}),{id:t,dismiss:r,update:i}}function vC(){const[e,t]=p.useState(cc);return p.useEffect(()=>(oc.push(t),()=>{const i=oc.indexOf(t);i>-1&&oc.splice(i,1)}),[e]),{...e,toast:bC,dismiss:i=>ca({type:"DISMISS_TOAST",toastId:i})}}function _e(e,t,{checkForDefaultPrevented:i=!0}={}){return function(s){if(e==null||e(s),i===!1||!s.defaultPrevented)return t==null?void 0:t(s)}}function $g(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function r0(...e){return t=>{let i=!1;const r=e.map(s=>{const n=$g(s,t);return!i&&typeof n=="function"&&(i=!0),n});if(i)return()=>{for(let s=0;s<r.length;s++){const n=r[s];typeof n=="function"?n():$g(e[s],null)}}}}function vt(...e){return p.useCallback(r0(...e),e)}function D6(e,t){const i=p.createContext(t),r=n=>{const{children:o,...c}=n,l=p.useMemo(()=>c,Object.values(c));return a.jsx(i.Provider,{value:l,children:o})};r.displayName=e+"Provider";function s(n){const o=p.useContext(i);if(o)return o;if(t!==void 0)return t;throw new Error(`\`${n}\` must be used within \`${e}\``)}return[r,s]}function xn(e,t=[]){let i=[];function r(n,o){const c=p.createContext(o),l=i.length;i=[...i,o];const d=h=>{var y;const{scope:g,children:m,...w}=h,v=((y=g==null?void 0:g[e])==null?void 0:y[l])||c,k=p.useMemo(()=>w,Object.values(w));return a.jsx(v.Provider,{value:k,children:m})};d.displayName=n+"Provider";function u(h,g){var v;const m=((v=g==null?void 0:g[e])==null?void 0:v[l])||c,w=p.useContext(m);if(w)return w;if(o!==void 0)return o;throw new Error(`\`${h}\` must be used within \`${n}\``)}return[d,u]}const s=()=>{const n=i.map(o=>p.createContext(o));return function(c){const l=(c==null?void 0:c[e])||n;return p.useMemo(()=>({[`__scope${e}`]:{...c,[e]:l}}),[c,l])}};return s.scopeName=e,[r,wC(s,...t)]}function wC(...e){const t=e[0];if(e.length===1)return t;const i=()=>{const r=e.map(s=>({useScope:s(),scopeName:s.scopeName}));return function(n){const o=r.reduce((c,{useScope:l,scopeName:d})=>{const h=l(n)[`__scope${d}`];return{...c,...h}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:o}),[o])}};return i.scopeName=t.scopeName,i}function Wc(e){const t=xC(e),i=p.forwardRef((r,s)=>{const{children:n,...o}=r,c=p.Children.toArray(n),l=c.find(SC);if(l){const d=l.props.children,u=c.map(h=>h===l?p.Children.count(d)>1?p.Children.only(null):p.isValidElement(d)?d.props.children:null:h);return a.jsx(t,{...o,ref:s,children:p.isValidElement(d)?p.cloneElement(d,void 0,u):null})}return a.jsx(t,{...o,ref:s,children:n})});return i.displayName=`${e}.Slot`,i}var kC=Wc("Slot");function xC(e){const t=p.forwardRef((i,r)=>{const{children:s,...n}=i;if(p.isValidElement(s)){const o=DC(s),c=CC(n,s.props);return s.type!==p.Fragment&&(c.ref=r?r0(r,o):o),p.cloneElement(s,c)}return p.Children.count(s)>1?p.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var s0=Symbol("radix.slottable");function AC(e){const t=({children:i})=>a.jsx(a.Fragment,{children:i});return t.displayName=`${e}.Slottable`,t.__radixId=s0,t}function SC(e){return p.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===s0}function CC(e,t){const i={...t};for(const r in t){const s=e[r],n=t[r];/^on[A-Z]/.test(r)?s&&n?i[r]=(...c)=>{const l=n(...c);return s(...c),l}:s&&(i[r]=s):r==="style"?i[r]={...s,...n}:r==="className"&&(i[r]=[s,n].filter(Boolean).join(" "))}return{...e,...i}}function DC(e){var r,s;let t=(r=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:r.get,i=t&&"isReactWarning"in t&&t.isReactWarning;return i?e.ref:(t=(s=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:s.get,i=t&&"isReactWarning"in t&&t.isReactWarning,i?e.props.ref:e.props.ref||e.ref)}function n0(e){const t=e+"CollectionProvider",[i,r]=xn(t),[s,n]=i(t,{collectionRef:{current:null},itemMap:new Map}),o=v=>{const{scope:k,children:y}=v,f=E.useRef(null),b=E.useRef(new Map).current;return a.jsx(s,{scope:k,itemMap:b,collectionRef:f,children:y})};o.displayName=t;const c=e+"CollectionSlot",l=Wc(c),d=E.forwardRef((v,k)=>{const{scope:y,children:f}=v,b=n(c,y),x=vt(k,b.collectionRef);return a.jsx(l,{ref:x,children:f})});d.displayName=c;const u=e+"CollectionItemSlot",h="data-radix-collection-item",g=Wc(u),m=E.forwardRef((v,k)=>{const{scope:y,children:f,...b}=v,x=E.useRef(null),C=vt(k,x),D=n(u,y);return E.useEffect(()=>(D.itemMap.set(x,{ref:x,...b}),()=>void D.itemMap.delete(x))),a.jsx(g,{[h]:"",ref:C,children:f})});m.displayName=u;function w(v){const k=n(e+"CollectionConsumer",v);return E.useCallback(()=>{const f=k.collectionRef.current;if(!f)return[];const b=Array.from(f.querySelectorAll(`[${h}]`));return Array.from(k.itemMap.values()).sort((D,T)=>b.indexOf(D.ref.current)-b.indexOf(T.ref.current))},[k.collectionRef,k.itemMap])}return[{Provider:o,Slot:d,ItemSlot:m},w,r]}var TC=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Fe=TC.reduce((e,t)=>
69{const i=Wc(`Primitive.${t}`),r=p.forwardRef((s,n)=>{const{asChild:o,...c}=s,l=o?i:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),a.jsx(l,{...c,ref:n})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function a0(e,t){e&&Ya.flushSync(()=>e.dispatchEvent(t))}function Sr(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...i)=>{var r;return(r=t.current)==null?void 0:r.call(t,...i)},[])}function EC(e,t=globalThis==null?void 0:globalThis.document){const i=Sr(e);p.useEffect(()=>{const r=s=>{s.key==="Escape"&&i(s)};return t.addEventListener("keydown",r,{capture:!0}),()=>t.removeEventListener("keydown",r,{capture:!0})},[i,t])}var PC="DismissableLayer",Yu="dismissableLayer.update",_C="dismissableLayer.pointerDownOutside",IC="dismissableLayer.focusOutside",Hg,o0=p.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Em=p.forwardRef((e,t)=>{const{disableOutsidePointerEvents:i=!1,onEscapeKeyDown:r,onPointerDownOutside:s,onFocusOutside:n,onInteractOutside:o,onDismiss:c,...l}=e,d=p.useContext(o0),[u,h]=p.useState(null),g=(u==null?void 0:u.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,m]=p.useState({}),w=vt(t,T=>h(T)),v=Array.from(d.layers),[k]=[...d.layersWithOutsidePointerEventsDisabled].slice(-1),y=v.indexOf(k),f=u?v.indexOf(u):-1,b=d.layersWithOutsidePointerEventsDisabled.size>0,x=f>=y,C=MC(T=>{const I=T.target,R=[...d.branches].some(F=>F.contains(I));!x||R||(s==null||s(T),o==null||o(T),T.defaultPrevented||c==null||c())},g),D=RC(T=>{const I=T.target;[...d.branches].some(F=>F.contains(I))||(n==null||n(T),o==null||o(T),T.defaultPrevented||c==null||c())},g);return EC(T=>{f===d.layers.size-1&&(r==null||r(T),!T.defaultPrevented&&c&&(T.preventDefault(),c()))},g),p.useEffect(()=>{if(u)return i&&(d.layersWithOutsidePointerEventsDisabled.size===0&&(Hg=g.body.style.pointerEvents,g.body.style.pointerEvents="none"),d.layersWithOutsidePointerEventsDisabled.add(u)),d.layers.add(u),Vg(),()=>{i&&d.layersWithOutsidePointerEventsDisabled.size===1&&(g.body.style.pointerEvents=Hg)}},[u,g,i,d]),p.useEffect(()=>()=>{u&&(d.layers.delete(u),d.layersWithOutsidePointerEventsDisabled.delete(u),Vg())},[u,d]),p.useEffect(()=>{const T=()=>m({});return document.addEventListener(Yu,T),()=>document.removeEventListener(Yu,T)},[]),a.jsx(Fe.div,{...l,ref:w,style:{pointerEvents:b?x?"auto":"none":void 0,...e.style},onFocusCapture:_e(e.onFocusCapture,D.onFocusCapture),onBlurCapture:_e(e.onBlurCapture,D.onBlurCapture),onPointerDownCapture:_e(e.onPointerDownCapture,C.onPointerDownCapture)})});Em.displayName=PC;var jC="DismissableLayerBranch",c0=p.forwardRef((e,t)=>{const i=p.useContext(o0),r=p.useRef(null),s=vt(t,r);return p.useEffect(()=>{const n=r.current;if(n)return i.branches.add(n),()=>{i.branches.delete(n)}},[i.branches]),a.jsx(Fe.div,{...e,ref:s})});c0.displayName=jC;function MC(e,t=globalThis==null?void 0:globalThis.document){const i=Sr(e),r=p.useRef(!1),s=p.useRef(()=>{});return p.useEffect(()=>{const n=c=>{if(c.target&&!r.current){let l=function(){l0(_C,i,d,{discrete:!0})};const d={originalEvent:c};c.pointerType==="touch"?(t.removeEventListener("click",s.current),s.current=l,t.addEventListener("click",s.current,{once:!0})):l()}else t.removeEventListener("click",s.current);r.current=!1},o=window.setTimeout(()=>{t.addEventListener("pointerdown",n)},0);return()=>{window.clearTimeout(o),t.removeEventListener("pointerdown",n),t.removeEventListener("click",s.current)}},[t,i]),{onPointerDownCapture:()=>r.current=!0}}function RC(e,t=globalThis==null?void 0:globalThis.document){const i=Sr(e),r=p.useRef(!1);return p.useEffect(()=>{const s=n=>{n.target&&!r.current&&l0(IC,i,{originalEvent:n},{discrete:!1})};return t.addEventListener("focusin",s),()=>t.removeEventListener("focusin",s)},[t,i]),{onFocusCapture:()=>r.current=!0,onBlurCapture:()=>r.current=!1}}function Vg(){const e=new CustomEvent(Yu);document.dispatchEvent(e)}function l0(e,t,i,{discrete:r}){const s=i.originalEvent.target,n=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:i});t&&s.addEventListener(e,t,{once:!0}),r?a0(s,n):s.dispatchEvent(n)}var OC=Em,FC=c0,vi=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{},NC="Portal",d0=p.forwardRef((e,t)=>
69{var c;const{container:i,...r}=e,[s,n]=p.useState(!1);vi(()=>n(!0),[]);const o=i||s&&((c=globalThis==null?void 0:globalThis.document)==null?void 0:c.body);return o?_v.createPortal(a.jsx(Fe.div,{...r,ref:t}),o):null});d0.displayName=NC;function LC(e,t){return p.useReducer((i,r)=>t[i][r]??i,e)}var Pl=e=>{const{present:t,children:i}=e,r=BC(t),s=typeof i=="function"?i({present:r.isPresent}):p.Children.only(i),n=vt(r.ref,UC(s));return typeof i=="function"||r.isPresent?p.cloneElement(s,{ref:n}):null};Pl.displayName="Presence";function BC(e){const[t,i]=p.useState(),r=p.useRef(null),s=p.useRef(e),n=p.useRef("none"),o=e?"mounted":"unmounted",[c,l]=LC(o,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const d=Mo(r.current);n.current=c==="mounted"?d:"none"},[c]),vi(()=>{const d=r.current,u=s.current;if(u!==e){const g=n.current,m=Mo(d);e?l("MOUNT"):m==="none"||(d==null?void 0:d.display)==="none"?l("UNMOUNT"):l(u&&g!==m?"ANIMATION_OUT":"UNMOUNT"),s.current=e}},[e,l]),vi(()=>{if(t){let d;const u=t.ownerDocument.defaultView??window,h=m=>{const v=Mo(r.current).includes(m.animationName);if(m.target===t&&v&&(l("ANIMATION_END"),!s.current)){const k=t.style.animationFillMode;t.style.animationFillMode="forwards",d=u.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=k)})}},g=m=>{m.target===t&&(n.current=Mo(r.current))};return t.addEventListener("animationstart",g),t.addEventListener("animationcancel",h),t.addEventListener("animationend",h),()=>{u.clearTimeout(d),t.removeEventListener("animationstart",g),t.removeEventListener("animationcancel",h),t.removeEventListener("animationend",h)}}else l("ANIMATION_END")},[t,l]),{isPresent:["mounted","unmountSuspended"].includes(c),ref:p.useCallback(d=>{r.current=d?getComputedStyle(d):null,i(d)},[])}}function Mo(e){return(e==null?void 0:e.animationName)||"none"}function UC(e){var r,s;let t=(r=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:r.get,i=t&&"isReactWarning"in t&&t.isReactWarning;return i?e.ref:(t=(s=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:s.get,i=t&&"isReactWarning"in t&&t.isReactWarning,i?e.props.ref:e.props.ref||e.ref)}var qC=_h[" useInsertionEffect ".trim().toString()]||vi;function to({prop:e,defaultProp:t,onChange:i=()=>{},caller:r}){const[s,n,o]=zC({defaultProp:t,onChange:i}),c=e!==void 0,l=c?e:s;{const u=p.useRef(e!==void 0);p.useEffect(()=>{const h=u.current;h!==c&&console.warn(`${r} is changing from ${h?"controlled":"uncontrolled"} to ${c?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),u.current=c},[c,r])}const d=p.useCallback(u=>{var h;if(c){const g=WC(u)?u(e):u;g!==e&&((h=o.current)==null||h.call(o,g))}else n(u)},[c,e,n,o]);return[l,d]}function zC({defaultProp:e,onChange:t}){const[i,r]=p.useState(e),s=p.useRef(i),n=p.useRef(t);return qC(()=>{n.current=t},[t]),p.useEffect(()=>{var o;s.current!==i&&((o=n.current)==null||o.call(n,i),s.current=i)},[i,s]),[i,r,n]}function WC(e){return typeof e=="function"}var $C=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),HC="VisuallyHidden",_l=p.forwardRef((e,t)=>a.jsx(Fe.span,{...e,ref:t,style:{...$C,...e.style}}));_l.displayName=HC;var VC=_l,Pm="ToastProvider",[_m,GC,KC]=n0("Toast"),[u0,T6]=xn("Toast",[KC]),[QC,Il]=u0(Pm),h0=e=>{const{__scopeToast:t,label:i="Notification",duration:r=5e3,swipeDirection:s="right",swipeThreshold:n=50,children:o}=e,[c,l]=p.useState(null),[d,u]=p.useState(0),h=p.useRef(!1),g=p.useRef(!1);return i.trim()||console.error(`Invalid prop \`label\` supplied to \`${Pm}\`. Expected non-empty \`string\`.`),a.jsx(_m.Provider,{scope:t,children:a.jsx(QC,{scope:t,label:i,duration:r,swipeDirection:s,swipeThreshold:n,toastCount:d,viewport:c,onViewportChange:l,onToastAdd:p.useCallback(()=>u(m=>m+1),[]),onToastRemove:p.useCallback(()=>u(m=>m-1),[]),isFocusedToastEscapeKeyDownRef:h,isClosePausedRef:g,children:o})})};h0.displayName=Pm;var m0="ToastViewport",XC=["F8"],Zu="toast.viewportPause",eh="toast.viewportResume",p0=p.forwardRef((e,t)=>
69{const{__scopeToast:i,hotkey:r=XC,label:s="Notifications ({hotkey})",...n}=e,o=Il(m0,i),c=GC(i),l=p.useRef(null),d=p.useRef(null),u=p.useRef(null),h=p.useRef(null),g=vt(t,h,o.onViewportChange),m=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),w=o.toastCount>0;p.useEffect(()=>{const k=y=>{var b;r.length!==0&&r.every(x=>y[x]||y.code===x)&&((b=h.current)==null||b.focus())};return document.addEventListener("keydown",k),()=>document.removeEventListener("keydown",k)},[r]),p.useEffect(()=>{const k=l.current,y=h.current;if(w&&k&&y){const f=()=>{if(!o.isClosePausedRef.current){const D=new CustomEvent(Zu);y.dispatchEvent(D),o.isClosePausedRef.current=!0}},b=()=>{if(o.isClosePausedRef.current){const D=new CustomEvent(eh);y.dispatchEvent(D),o.isClosePausedRef.current=!1}},x=D=>{!k.contains(D.relatedTarget)&&b()},C=()=>{k.contains(document.activeElement)||b()};return k.addEventListener("focusin",f),k.addEventListener("focusout",x),k.addEventListener("pointermove",f),k.addEventListener("pointerleave",C),window.addEventListener("blur",f),window.addEventListener("focus",b),()=>{k.removeEventListener("focusin",f),k.removeEventListener("focusout",x),k.removeEventListener("pointermove",f),k.removeEventListener("pointerleave",C),window.removeEventListener("blur",f),window.removeEventListener("focus",b)}}},[w,o.isClosePausedRef]);const v=p.useCallback(({tabbingDirection:k})=>{const f=c().map(b=>{const x=b.ref.current,C=[x,...lD(x)];return k==="forwards"?C:C.reverse()});return(k==="forwards"?f.reverse():f).flat()},[c]);return p.useEffect(()=>{const k=h.current;if(k){const y=f=>{var C,D,T;const b=f.altKey||f.ctrlKey||f.metaKey;if(f.key==="Tab"&&!b){const I=document.activeElement,R=f.shiftKey;if(f.target===k&&R){(C=d.current)==null||C.focus();return}const N=v({tabbingDirection:R?"backwards":"forwards"}),J=N.findIndex(B=>B===I);Id(N.slice(J+1))?f.preventDefault():R?(D=d.current)==null||D.focus():(T=u.current)==null||T.focus()}};return k.addEventListener("keydown",y),()=>k.removeEventListener("keydown",y)}},[c,v]),a.jsxs(FC,{ref:l,role:"region","aria-label":s.replace("{hotkey}",m),tabIndex:-1,style:{pointerEvents:w?void 0:"none"},children:[w&&a.jsx(th,{ref:d,onFocusFromOutsideViewport:()=>{const k=v({tabbingDirection:"forwards"});Id(k)}}),a.jsx(_m.Slot,{scope:i,children:a.jsx(Fe.ol,{tabIndex:-1,...n,ref:g})}),w&&a.jsx(th,{ref:u,onFocusFromOutsideViewport:()=>{const k=v({tabbingDirection:"backwards"});Id(k)}})]})});p0.displayName=m0;var g0="ToastFocusProxy",th=p.forwardRef((e,t)=>{const{__scopeToast:i,onFocusFromOutsideViewport:r,...s}=e,n=Il(g0,i);return a.jsx(_l,{"aria-hidden":!0,tabIndex:0,...s,ref:t,style:{position:"fixed"},onFocus:o=>{var d;const c=o.relatedTarget;!((d=n.viewport)!=null&&d.contains(c))&&r()}})});th.displayName=g0;var io="Toast",JC="toast.swipeStart",YC="toast.swipeMove",ZC="toast.swipeCancel",eD="toast.swipeEnd",f0=p.forwardRef((e,t)=>{const{forceMount:i,open:r,defaultOpen:s,onOpenChange:n,...o}=e,[c,l]=to({prop:r,defaultProp:s??!0,onChange:n,caller:io});return a.jsx(Pl,{present:i||c,children:a.jsx(rD,{open:c,...o,ref:t,onClose:()=>l(!1),onPause:Sr(e.onPause),onResume:Sr(e.onResume),onSwipeStart:_e(e.onSwipeStart,d=>{d.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:_e(e.onSwipeMove,d=>{const{x:u,y:h}=d.detail.delta;d.currentTarget.setAttribute("data-swipe","move"),d.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${u}px`),d.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${h}px`)}),onSwipeCancel:_e(e.onSwipeCancel,d=>{d.currentTarget.setAttribute("data-swipe","cancel"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),d.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),d.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:_e(e.onSwipeEnd,d=>{const{x:u,y:h}=d.detail.delta;d.currentTarget.setAttribute("data-swipe","end"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),d.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),d.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${u}px`),d.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${h}px`),l(!1)})})})});f0.displayName=io;
69var[tD,iD]=u0(io,{onClose(){}}),rD=p.forwardRef((e,t)=>{const{__scopeToast:i,type:r="foreground",duration:s,open:n,onClose:o,onEscapeKeyDown:c,onPause:l,onResume:d,onSwipeStart:u,onSwipeMove:h,onSwipeCancel:g,onSwipeEnd:m,...w}=e,v=Il(io,i),[k,y]=p.useState(null),f=vt(t,B=>y(B)),b=p.useRef(null),x=p.useRef(null),C=s||v.duration,D=p.useRef(0),T=p.useRef(C),I=p.useRef(0),{onToastAdd:R,onToastRemove:F}=v,K=Sr(()=>{var ne;(k==null?void 0:k.contains(document.activeElement))&&((ne=v.viewport)==null||ne.focus()),o()}),N=p.useCallback(B=>{!B||B===1/0||(window.clearTimeout(I.current),D.current=new Date().getTime(),I.current=window.setTimeout(K,B))},[K]);p.useEffect(()=>{const B=v.viewport;if(B){const ne=()=>{N(T.current),d==null||d()},Q=()=>{const Z=new Date().getTime()-D.current;T.current=T.current-Z,window.clearTimeout(I.current),l==null||l()};return B.addEventListener(Zu,Q),B.addEventListener(eh,ne),()=>{B.removeEventListener(Zu,Q),B.removeEventListener(eh,ne)}}},[v.viewport,C,l,d,N]),p.useEffect(()=>{n&&!v.isClosePausedRef.current&&N(C)},[n,C,v.isClosePausedRef,N]),p.useEffect(()=>(R(),()=>F()),[R,F]);const J=p.useMemo(()=>k?A0(k):null,[k]);return v.viewport?a.jsxs(a.Fragment,{children:[J&&a.jsx(sD,{__scopeToast:i,role:"status","aria-live":r==="foreground"?"assertive":"polite","aria-atomic":!0,children:J}),a.jsx(tD,{scope:i,onClose:K,children:Ya.createPortal(a.jsx(_m.ItemSlot,{scope:i,children:a.jsx(OC,{asChild:!0,onEscapeKeyDown:_e(c,()=>{v.isFocusedToastEscapeKeyDownRef.current||K(),v.isFocusedToastEscapeKeyDownRef.current=!1}),children:a.jsx(Fe.li,{role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":n?"open":"closed","data-swipe-direction":v.swipeDirection,...w,ref:f,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:_e(e.onKeyDown,B=>{B.key==="Escape"&&(c==null||c(B.nativeEvent),B.nativeEvent.defaultPrevented||(v.isFocusedToastEscapeKeyDownRef.current=!0,K()))}),onPointerDown:_e(e.onPointerDown,B=>{B.button===0&&(b.current={x:B.clientX,y:B.clientY})}),onPointerMove:_e(e.onPointerMove,B=>{if(!b.current)return;const ne=B.clientX-b.current.x,Q=B.clientY-b.current.y,Z=!!x.current,_=["left","right"].includes(v.swipeDirection),j=["left","up"].includes(v.swipeDirection)?Math.min:Math.max,q=_?j(0,ne):0,Y=_?0:j(0,Q),G=B.pointerType==="touch"?10:2,re={x:q,y:Y},se={originalEvent:B,delta:re};Z?(x.current=re,Ro(YC,h,se,{discrete:!1})):Gg(re,v.swipeDirection,G)?(x.current=re,Ro(JC,u,se,{discrete:!1}),B.target.setPointerCapture(B.pointerId)):(Math.abs(ne)>G||Math.abs(Q)>G)&&(b.current=null)}),onPointerUp:_e(e.onPointerUp,B=>{const ne=x.current,Q=B.target;if(Q.hasPointerCapture(B.pointerId)&&Q.releasePointerCapture(B.pointerId),x.current=null,b.current=null,ne){const Z=B.currentTarget,_={originalEvent:B,delta:ne};Gg(ne,v.swipeDirection,v.swipeThreshold)?Ro(eD,m,_,{discrete:!0}):Ro(ZC,g,_,{discrete:!0}),Z.addEventListener("click",j=>j.preventDefault(),{once:!0})}})})})}),v.viewport)})]}):null}),sD=e=>{const{__scopeToast:t,children:i,...r}=e,s=Il(io,t),[n,o]=p.useState(!1),[c,l]=p.useState(!1);return oD(()=>o(!0)),p.useEffect(()=>{const d=window.setTimeout(()=>l(!0),1e3);return()=>window.clearTimeout(d)},[]),c?null:a.jsx(d0,{asChild:!0,children:a.jsx(_l,{...r,children:n&&a.jsxs(a.Fragment,{children:[s.label," ",i]})})})},nD="ToastTitle",y0=p.forwardRef((e,t)=>{const{__scopeToast:i,...r}=e;return a.jsx(Fe.div,{...r,ref:t})});y0.displayName=nD;var aD="ToastDescription",b0=p.forwardRef((e,t)=>{const{__scopeToast:i,...r}=e;return a.jsx(Fe.div,{...r,ref:t})});b0.displayName=aD;var v0="ToastAction",w0=p.forwardRef((e,t)=>{const{altText:i,...r}=e;return i.trim()?a.jsx(x0,{altText:i,asChild:!0,children:a.jsx(Im,{...r,ref:t})}):(console.error(`Invalid prop \`altText\` supplied to \`${v0}\`. Expected non-empty \`string\`.`),null)});w0.displayName=v0;var k0="ToastClose",Im=p.forwardRef((e,t)=>{const{__scopeToast:i,...r}=e,s=iD(k0,i);return a.jsx(x0,{asChild:!0,children:a.jsx(Fe.button,{type:"button",...r,ref:t,onClick:_e(e.onClick,s.onClose)})})});Im.displayName=k0;var x0=p.forwardRef((e,t)=>{const{__scopeToast:i,altText:r,...s}=e;return a.jsx(Fe.div,{"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":r||void 0,...s,ref:t})});function A0(e){const t=[];
69return Array.from(e.childNodes).forEach(r=>{if(r.nodeType===r.TEXT_NODE&&r.textContent&&t.push(r.textContent),cD(r)){const s=r.ariaHidden||r.hidden||r.style.display==="none",n=r.dataset.radixToastAnnounceExclude==="";if(!s)if(n){const o=r.dataset.radixToastAnnounceAlt;o&&t.push(o)}else t.push(...A0(r))}}),t}function Ro(e,t,i,{discrete:r}){const s=i.originalEvent.currentTarget,n=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:i});t&&s.addEventListener(e,t,{once:!0}),r?a0(s,n):s.dispatchEvent(n)}var Gg=(e,t,i=0)=>{const r=Math.abs(e.x),s=Math.abs(e.y),n=r>s;return t==="left"||t==="right"?n&&r>i:!n&&s>i};function oD(e=()=>{}){const t=Sr(e);vi(()=>{let i=0,r=0;return i=window.requestAnimationFrame(()=>r=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(i),window.cancelAnimationFrame(r)}},[t])}function cD(e){return e.nodeType===e.ELEMENT_NODE}function lD(e){const t=[],i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const s=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||s?NodeFilter.FILTER_SKIP:r.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;i.nextNode();)t.push(i.currentNode);return t}function Id(e){const t=document.activeElement;return e.some(i=>i===t?!0:(i.focus(),document.activeElement!==t))}var dD=h0,S0=p0,C0=f0,D0=y0,T0=b0,E0=w0,P0=Im;function _0(e){var t,i,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(i=_0(e[t]))&&(r&&(r+=" "),r+=i)}else for(i in e)e[i]&&(r&&(r+=" "),r+=i);return r}function I0(){for(var e,t,i=0,r="",s=arguments.length;i<s;i++)(e=arguments[i])&&(t=_0(e))&&(r&&(r+=" "),r+=t);return r}const Kg=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Qg=I0,j0=(e,t)=>i=>{var r;if((t==null?void 0:t.variants)==null)return Qg(e,i==null?void 0:i.class,i==null?void 0:i.className);const{variants:s,defaultVariants:n}=t,o=Object.keys(s).map(d=>{const u=i==null?void 0:i[d],h=n==null?void 0:n[d];if(u===null)return null;const g=Kg(u)||Kg(h);return s[d][g]}),c=i&&Object.entries(i).reduce((d,u)=>{let[h,g]=u;return g===void 0||(d[h]=g),d},{}),l=t==null||(r=t.compoundVariants)===null||r===void 0?void 0:r.reduce((d,u)=>{let{class:h,className:g,...m}=u;return Object.entries(m).every(w=>{let[v,k]=w;return Array.isArray(k)?k.includes({...n,...c}[v]):{...n,...c}[v]===k})?[...d,h,g]:d},[]);return Qg(e,o,l,i==null?void 0:i.class,i==null?void 0:i.className)};/** 70 * @license lucide-react v0.462.0 - ISC 71 * 72 * This source code is licensed under the ISC license. 73 * See the LICENSE file in the root directory of this source tree. 74 */const uD=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),M0=(...e)=>e.filter((t,i,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===i).join(" ").trim();/** 75 * @license lucide-react v0.462.0 - ISC 76 * 77 * This source code is licensed under the ISC license. 78 * See the LICENSE file in the root directory of this source tree. 79 */var hD={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** 80 * @license lucide-react v0.462.0 - ISC 81 * 82 * This source code is licensed under the ISC license. 83 * See the LICENSE file in the root directory of this source tree. 84 */const mD=p.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:i=2,absoluteStrokeWidth:r,className:s="",children:n,iconNode:o,...c},l)=>p.createElement("svg",{ref:l,...hD,width:t,height:t,stroke:e,strokeWidth:r?Number(i)*24/Number(t):i,className:M0("lucide",s),...c},[...o.map(([d,u])=>p.createElement(d,u)),...Array.isArray(n)?n:[n]]));/** 85 * @license lucide-react v0.462.0 - ISC 86 * 87 * This source code is licensed under the ISC license. 88 * See the LICENSE file in the root directory of this source tree. 89 */const ve=(e,t)=>{const i=p.forwardRef(({className:r,...s},n)=>p.createElement(mD,{ref:n,iconNode:t,className:M0(`lucide-${uD(e)}`,r),...s}));return i.displayName=`${e}`,i};/** 90 * @license lucide-react v0.462.0 - ISC 91 * 92 * This source code is licensed under the ISC license. 93 * See the LICENSE file in the root directory of this source tree. 94 */const Me=ve("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** 95 * @license lucide-react v0.462.0 - ISC 96 * 97 * This source code is licensed under the ISC license. 98 * See the LICENSE file in the root directory of this source tree. 99 */const pD=ve("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** 100 * @license lucide-react v0.462.0 - ISC 101 * 102 * This source code is licensed under the ISC license. 103 * See the LICENSE file in the root directory of this source tree. 104 */const $c=ve("Calculator",[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["line",{x1:"8",x2:"16",y1:"6",y2:"6",key:"x4nwl0"}],["line",{x1:"16",x2:"16",y1:"14",y2:"18",key:"wjye3r"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M8 18h.01",key:"lrp35t"}]]);/** 105 * @license lucide-react v0.462.0 - ISC 106 * 107 * This source code is licensed under the ISC license. 108 * See the LICENSE file in the root directory of this source tree. 109 */const gD=ve("CalendarClock",[["path",{d:"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5",key:"1osxxc"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M3 10h5",key:"r794hk"}
109],["path",{d:"M17.5 17.5 16 16.3V14",key:"akvzfd"}],["circle",{cx:"16",cy:"16",r:"6",key:"qoo3c4"}]]);/** 110 * @license lucide-react v0.462.0 - ISC 111 * 112 * This source code is licensed under the ISC license. 113 * See the LICENSE file in the root directory of this source tree. 114 */const Hc=ve("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);/** 115 * @license lucide-react v0.462.0 - ISC 116 * 117 * This source code is licensed under the ISC license. 118 * See the LICENSE file in the root directory of this source tree. 119 */const Xn=ve("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** 120 * @license lucide-react v0.462.0 - ISC 121 * 122 * This source code is licensed under the ISC license. 123 * See the LICENSE file in the root directory of this source tree. 124 */const fD=ve("Cloud",[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]]);/** 125 * @license lucide-react v0.462.0 - ISC 126 * 127 * This source code is licensed under the ISC license. 128 * See the LICENSE file in the root directory of this source tree. 129 */const Xg=ve("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** 130 * @license lucide-react v0.462.0 - ISC 131 * 132 * This source code is licensed under the ISC license. 133 * See the LICENSE file in the root directory of this source tree. 134 */const yD=ve("Droplet",[["path",{d:"M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z",key:"c7niix"}]]);/** 135 * @license lucide-react v0.462.0 - ISC 136 * 137 * This source code is licensed under the ISC license. 138 * See the LICENSE file in the root directory of this source tree. 139 */const bD=ve("Droplets",[["path",{d:"M7 16.3c2.2 0 4-1.83 4-4.05 0-1.16-.57-2.26-1.71-3.19S7.29 6.75 7 5.3c-.29 1.45-1.14 2.84-2.29 3.76S3 11.1 3 12.25c0 2.22 1.8 4.05 4 4.05z",key:"1ptgy4"}],["path",{d:"M12.56 6.6A10.97 10.97 0 0 0 14 3.02c.5 2.5 2 4.9 4 6.5s3 3.5 3 5.5a6.98 6.98 0 0 1-11.91 4.97",key:"1sl1rz"}]]);/** 140 * @license lucide-react v0.462.0 - ISC 141 * 142 * This source code is licensed under the ISC license. 143 * See the LICENSE file in the root directory of this source tree. 144 */const vD=ve("Ear",[["path",{d:"M6 8.5a6.5 6.5 0 1 1 13 0c0 6-6 6-6 10a3.5 3.5 0 1 1-7 0",key:"1dfaln"}],["path",{d:"M15 8.5a2.5 2.5 0 0 0-5 0v1a2 2 0 1 1 0 4",key:"1qnva7"}]]);/** 145 * @license lucide-react v0.462.0 - ISC 146 * 147 * This source code is licensed under the ISC license. 148 * See the LICENSE file in the root directory of this source tree. 149 */const wD=ve("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** 150 * @license lucide-react v0.462.0 - ISC 151 * 152 * This source code is licensed under the ISC license. 153 * See the LICENSE file in the root directory of this source tree. 154 */const kD=ve("Map",[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]]);/** 155 * @license lucide-react v0.462.0 - ISC 156 * 157 * This source code is licensed under the ISC license. 158 * See the LICENSE file in the root directory of this source tree. 159 */const xD=ve("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** 160 * @license lucide-react v0.462.0 - ISC 161 * 162 * This source code is licensed under the ISC license. 163 * See the LICENSE file in the root directory of this source tree. 164 */const Jg=ve("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]);/** 165 * @license lucide-react v0.462.0 - ISC 166 * 167 * This source code is licensed under the ISC license. 168 * See the LICENSE file in the root directory of this source tree. 169 */const AD=ve("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** 170 * @license lucide-react v0.462.0 - ISC 171 * 172 * This source code is licensed under the ISC license. 173 * See the LICENSE file in the root directory of this source tree. 174 */const SD=ve("ScanLine",[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}],["path",{d:"M7 12h10",key:"b7w52i"}]]);/** 175 * @license lucide-react v0.462.0 - ISC 176 * 177 * This source code is licensed under the ISC license. 178 * See the LICENSE file in the root directory of this source tree. 179 */const R0=ve("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** 180 * @license lucide-react v0.462.0 - ISC 181 * 182 * This source code is licensed under the ISC license. 183 * See the LICENSE file in the root directory of this source tree. 184 */const O0=ve("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]]);/** 185 * @license lucide-react v0.462.0 - ISC 186 * 187 * This source code is licensed under the ISC license. 188 * See the LICENSE file in the root directory of this source tree. 189 */const CD=ve("Syringe",[["path",{d:"m18 2 4 4",key:"22kx64"}],["path",{d:"m17 7 3-3",key:"1w1zoj"}],["path",{d:"M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5",key:"1exhtz"}],["path",{d:"m9 11 4 4",key:"rovt3i"}],["path",{d:"m5 19-3 3",key:"59f2uf"}],["path",{d:"m14 4 6 6",key:"yqp9t2"}]]);/** 190 * @license lucide-react v0.462.0 - ISC 191 * 192 * This source code is licensed under the ISC license. 193 * See the LICENSE file in the root directory of this source tree. 194 */const DD=ve("Video",[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]]);/** 195 * @license lucide-react v0.462.0 - ISC 196 * 197 * This source code is licensed under the ISC license. 198 * See the LICENSE file in the root directory of this source tree. 199 */const TD=ve("Watch",[["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["polyline",{points:"12 10 12 12 13 13",key:"19dquz"}],["path",{d:"m16.13 7.66-.81-4.05a2 2 0 0 0-2-1.61h-2.68a2 2 0 0 0-2 1.61l-.78 4.05",key:"18k57s"}],["path",{d:"m7.88 16.36.8 4a2 2 0 0 0 2 1.61h2.72a2 2 0 0 0 2-1.61l.81-4.05",key:"16ny36"}]]);/** 200 * @license lucide-react v0.462.0 - ISC 201 * 202 * This source code is licensed under the ISC license. 203 * See the LICENSE file in the root directory of this source tree.
vendor: 6,332 bytes, lines 204-209
204 */const ED=ve("Wind",[["path",{d:"M12.8 19.6A2 2 0 1 0 14 16H2",key:"148xed"}],["path",{d:"M17.5 8a2.5 2.5 0 1 1 2 4H2",key:"1u4tom"}],["path",{d:"M9.8 4.4A2 2 0 1 1 11 8H2",key:"75valh"}]]);/** 205 * @license lucide-react v0.462.0 - ISC 206 * 207 * This source code is licensed under the ISC license. 208 * See the LICENSE file in the root directory of this source tree. 209 */const F0=ve("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),jm="-",PD=e=>{const t=ID(e),{conflictingClassGroups:i,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:o=>{const c=o.split(jm);return c[0]===""&&c.length!==1&&c.shift(),N0(c,t)||_D(o)},getConflictingClassGroupIds:(o,c)=>{const l=i[o]||[];return c&&r[o]?[...l,...r[o]]:l}}},N0=(e,t)=>{var o;if(e.length===0)return t.classGroupId;const i=e[0],r=t.nextPart.get(i),s=r?N0(e.slice(1),r):void 0;if(s)return s;if(t.validators.length===0)return;const n=e.join(jm);return(o=t.validators.find(({validator:c})=>c(n)))==null?void 0:o.classGroupId},Yg=/^\[(.+)\]$/,_D=e=>{if(Yg.test(e)){const t=Yg.exec(e)[1],i=t==null?void 0:t.substring(0,t.indexOf(":"));if(i)return"arbitrary.."+i}},ID=e=>{const{theme:t,prefix:i}=e,r={nextPart:new Map,validators:[]};return MD(Object.entries(e.classGroups),i).forEach(([n,o])=>{ih(o,r,n,t)}),r},ih=(e,t,i,r)=>{e.forEach(s=>{if(typeof s=="string"){const n=s===""?t:Zg(t,s);n.classGroupId=i;return}if(typeof s=="function"){if(jD(s)){ih(s(r),t,i,r);return}t.validators.push({validator:s,classGroupId:i});return}Object.entries(s).forEach(([n,o])=>{ih(o,Zg(t,n),i,r)})})},Zg=(e,t)=>{let i=e;return t.split(jm).forEach(r=>{i.nextPart.has(r)||i.nextPart.set(r,{nextPart:new Map,validators:[]}),i=i.nextPart.get(r)}),i},jD=e=>e.isThemeGetter,MD=(e,t)=>t?e.map(([i,r])=>{const s=r.map(n=>typeof n=="string"?t+n:typeof n=="object"?Object.fromEntries(Object.entries(n).map(([o,c])=>[t+o,c])):n);return[i,s]}):e,RD=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,i=new Map,r=new Map;const s=(n,o)=>{i.set(n,o),t++,t>e&&(t=0,r=i,i=new Map)};return{get(n){let o=i.get(n);if(o!==void 0)return o;if((o=r.get(n))!==void 0)return s(n,o),o},set(n,o){i.has(n)?i.set(n,o):s(n,o)}}},L0="!",OD=e=>{const{separator:t,experimentalParseClassName:i}=e,r=t.length===1,s=t[0],n=t.length,o=c=>{const l=[];let d=0,u=0,h;for(let k=0;k<c.length;k++){let y=c[k];if(d===0){if(y===s&&(r||c.slice(k,k+n)===t)){l.push(c.slice(u,k)),u=k+n;continue}if(y==="/"){h=k;continue}}y==="["?d++:y==="]"&&d--}const g=l.length===0?c:c.substring(u),m=g.startsWith(L0),w=m?g.substring(1):g,v=h&&h>u?h-u:void 0;return{modifiers:l,hasImportantModifier:m,baseClassName:w,maybePostfixModifierPosition:v}};return i?c=>i({className:c,parseClassName:o}):o},FD=e=>{if(e.length<=1)return e;const t=[];let i=[];return e.forEach(r=>{r[0]==="["?(t.push(...i.sort(),r),i=[]):i.push(r)}),t.push(...i.sort()),t},ND=e=>({cache:RD(e.cacheSize),parseClassName:OD(e),...PD(e)}),LD=/\s+/,BD=(e,t)=>{const{parseClassName:i,getClassGroupId:r,getConflictingClassGroupIds:s}=t,n=[],o=e.trim().split(LD);let c="";for(let l=o.length-1;l>=0;l-=1){const d=o[l],{modifiers:u,hasImportantModifier:h,baseClassName:g,maybePostfixModifierPosition:m}=i(d);let w=!!m,v=r(w?g.substring(0,m):g);if(!v){if(!w){c=d+(c.length>0?" "+c:c);continue}if(v=r(g),!v){c=d+(c.length>0?" "+c:c);continue}w=!1}const k=FD(u).join(":"),y=h?k+L0:k,f=y+v;if(n.includes(f))continue;n.push(f);const b=s(v,w);for(let x=0;x<b.length;++x){const C=b[x];n.push(y+C)}c=d+(c.length>0?" "+c:c)}return c};function UD(){let e=0,t,i,r="";for(;e<arguments.length;)(t=arguments[e++])&&(i=B0(t))&&(r&&(r+=" "),r+=i);return r}const B0=e=>{if(typeof e=="string")return e;let t,i="";for(let r=0;r<e.length;r++)e[r]&&(t=B0(e[r]))&&(i&&(i+=" "),i+=t);return i};function qD(e,...t){let i,r,s,n=o;function o(l){const d=t.reduce((u,h)=>h(u),e());return i=ND(d),r=i.cache.get,s=i.cache.set,n=c,c(l)}function c(l){const d=r(l);if(d)return d;const u=BD(l,i);return s(l,u),u}return function(){return n(UD.apply(null,arguments))}}const me=e=>{const t=i=>i[e]||[];return t.isThemeGetter=!0,t},U0=/^\[(?:([a-z-]+):)?(.+)\]$/i,zD=/^\d+\/\d+$/,WD=new Set(["px","full","screen"]),$D=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,HD=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,VD=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,GD=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,KD=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Ai=e=>Gs(e)||WD.has(e)||zD.test(e),Qi=e=>An(e,"length",iT),Gs=e=>!!e&&!Number.isNaN(Number(e)),jd=e=>An(e,"number",Gs),qn=e=>!!e&&Number.isInteger(Number(e)),QD=e=>e.endsWith("%")&&Gs(e.slice(0,-1)),ie=e=>U0.test(e),Xi=e=>$D.test(e),XD=new Set(["length","size","percentage"]),JD=e=>An(e,XD,q0),YD=e=>An(e,"position",q0),ZD=new Set(["image","url"]),eT=e=>An(e,ZD,sT),tT=e=>An(e,"",rT),zn=()=>!0,An=(e,t,i)=>{const r=U0.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):i(r[2]):!1},iT=e=>HD.test(e)&&!VD.test(e),q0=()=>!1,rT=e=>GD.test(e),sT=e=>KD.test(e),nT=()=>{const e=me("colors"),t=me("spacing"),i=me("blur"),r=me("brightness"),s=me("borderColor"),n=me("borderRadius"),o=me("borderSpacing"),c=me("borderWidth"),l=me("contrast"),d=me("grayscale"),u=me("hueRotate"),h=me("invert"),g=me("gap"),m=me("gradientColorStops"),w=me("gradientColorStopPositions"),v=me("inset"),k=me("margin"),y=me("opacity"),f=me("padding"),b=me("saturate"),x=me("scale"),C=me("sepia"),D=me("skew"),T=me("space"),I=me("translate"),R=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],K=()=>["auto",ie,t],N=()=>[ie,t],J=()=>["",Ai,Qi],B=()=>["auto",Gs,ie],ne=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Q=()=>["solid","dashed","dotted","double","none"],Z=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],_=()=>["start","end","center","between","around","evenly","stretch"],j=()=>["","0",ie],q=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Y=()=>[Gs,ie];return{cacheSize:500,separator:":",theme:{colors:[zn],spacing:[Ai,Qi],blur:["none","",Xi,ie],brightness:Y(),borderColor:[e],borderRadius:["n
209one","","full",Xi,ie],borderSpacing:N(),borderWidth:J(),contrast:Y(),grayscale:j(),hueRotate:Y(),invert:j(),gap:N(),gradientColorStops:[e],gradientColorStopPositions:[QD,Qi],inset:K(),margin:K(),opacity:Y(),padding:N(),saturate:Y(),scale:Y(),sepia:j(),skew:Y(),space:N(),translate:N()},classGroups:{aspect:[{aspect:["auto","square","video",ie]}],container:["container"],columns:[{columns:[Xi]}],"break-after":[{"break-after":q()}],"break-before":[{"break-before":q()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ne(),ie]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:R()}],"overscroll-x":[{"overscroll-x":R()}],"overscroll-y":[{"overscroll-y":R()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[v]}],"inset-x":[{"inset-x":[v]}],"inset-y":[{"inset-y":[v]}],start:[{start:[v]}],end:[{end:[v]}],top:[{top:[v]}],right:[{right:[v]}],bottom:[{bottom:[v]}],left:[{left:[v]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",qn,ie]}],basis:[{basis:K()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",ie]}],grow:[{grow:j()}],shrink:[{shrink:j()}],order:[{order:["first","last","none",qn,ie]}],"grid-cols":[{"grid-cols":[zn]}],"col-start-end":[{col:["auto",{span:["full",qn,ie]},ie]}],"col-start":[{"col-start":B()}],"col-end":[{"col-end":B()}],"grid-rows":[{"grid-rows":[zn]}],"row-start-end":[{row:["auto",{span:[qn,ie]},ie]}],"row-start":[{"row-start":B()}],"row-end":[{"row-end":B()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",ie]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",ie]}],gap:[{gap:[g]}],"gap-x":[{"gap-x":[g]}],"gap-y":[{"gap-y":[g]}],"justify-content":[{justify:["normal",..._()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",..._(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[..._(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[f]}],px:[{px:[f]}],py:[{py:[f]}],ps:[{ps:[f]}],pe:[{pe:[f]}],pt:[{pt:[f]}],pr:[{pr:[f]}],pb:[{pb:[f]}],pl:[{pl:[f]}],m:[{m:[k]}],mx:[{mx:[k]}],my:[{my:[k]}],ms:[{ms:[k]}],me:[{me:[k]}],mt:[{mt:[k]}],mr:[{mr:[k]}],mb:[{mb:[k]}],ml:[{ml:[k]}],"space-x":[{"space-x":[T]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[T]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",ie,t]}],"min-w":[{"min-w":[ie,t,"min","max","fit"]}],"max-w":[{"max-w":[ie,t,"none","full","min","max","fit","prose",{screen:[Xi]},Xi]}],h:[{h:[ie,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[ie,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[ie,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[ie,t,"auto","min","max","fit"]}],"font-size":[{text:["base",Xi,Qi]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",jd]}],"font-family":[{font:[zn]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",ie]}],"line-clamp":[{"line-clamp":["none",Gs,jd]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Ai,ie]}],"list-image":[{"list-image":["none",ie]}],"list-style-type":[{list:["none","disc","decimal",ie]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[y]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[y]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Q(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Ai,Qi]}],"underline-offset":[{"underline-offset":["auto",Ai,ie]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:N()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",ie]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",ie]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[y]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ne(),YD]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",JD]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},eT]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[w]}
209],"gradient-via-pos":[{via:[w]}],"gradient-to-pos":[{to:[w]}],"gradient-from":[{from:[m]}],"gradient-via":[{via:[m]}],"gradient-to":[{to:[m]}],rounded:[{rounded:[n]}],"rounded-s":[{"rounded-s":[n]}],"rounded-e":[{"rounded-e":[n]}],"rounded-t":[{"rounded-t":[n]}],"rounded-r":[{"rounded-r":[n]}],"rounded-b":[{"rounded-b":[n]}],"rounded-l":[{"rounded-l":[n]}],"rounded-ss":[{"rounded-ss":[n]}],"rounded-se":[{"rounded-se":[n]}],"rounded-ee":[{"rounded-ee":[n]}],"rounded-es":[{"rounded-es":[n]}],"rounded-tl":[{"rounded-tl":[n]}],"rounded-tr":[{"rounded-tr":[n]}],"rounded-br":[{"rounded-br":[n]}],"rounded-bl":[{"rounded-bl":[n]}],"border-w":[{border:[c]}],"border-w-x":[{"border-x":[c]}],"border-w-y":[{"border-y":[c]}],"border-w-s":[{"border-s":[c]}],"border-w-e":[{"border-e":[c]}],"border-w-t":[{"border-t":[c]}],"border-w-r":[{"border-r":[c]}],"border-w-b":[{"border-b":[c]}],"border-w-l":[{"border-l":[c]}],"border-opacity":[{"border-opacity":[y]}],"border-style":[{border:[...Q(),"hidden"]}],"divide-x":[{"divide-x":[c]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[c]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[y]}
vendor: 4,467 bytes, line 209
209],"divide-style":[{divide:Q()}],"border-color":[{border:[s]}],"border-color-x":[{"border-x":[s]}],"border-color-y":[{"border-y":[s]}],"border-color-s":[{"border-s":[s]}],"border-color-e":[{"border-e":[s]}],"border-color-t":[{"border-t":[s]}],"border-color-r":[{"border-r":[s]}],"border-color-b":[{"border-b":[s]}],"border-color-l":[{"border-l":[s]}],"divide-color":[{divide:[s]}],"outline-style":[{outline:["",...Q()]}],"outline-offset":[{"outline-offset":[Ai,ie]}],"outline-w":[{outline:[Ai,Qi]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:J()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[y]}],"ring-offset-w":[{"ring-offset":[Ai,Qi]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Xi,tT]}],"shadow-color":[{shadow:[zn]}],opacity:[{opacity:[y]}],"mix-blend":[{"mix-blend":[...Z(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":Z()}],filter:[{filter:["","none"]}],blur:[{blur:[i]}],brightness:[{brightness:[r]}],contrast:[{contrast:[l]}],"drop-shadow":[{"drop-shadow":["","none",Xi,ie]}],grayscale:[{grayscale:[d]}],"hue-rotate":[{"hue-rotate":[u]}],invert:[{invert:[h]}],saturate:[{saturate:[b]}],sepia:[{sepia:[C]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[i]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[l]}],"backdrop-grayscale":[{"backdrop-grayscale":[d]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[u]}],"backdrop-invert":[{"backdrop-invert":[h]}],"backdrop-opacity":[{"backdrop-opacity":[y]}],"backdrop-saturate":[{"backdrop-saturate":[b]}],"backdrop-sepia":[{"backdrop-sepia":[C]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[o]}],"border-spacing-x":[{"border-spacing-x":[o]}],"border-spacing-y":[{"border-spacing-y":[o]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",ie]}],duration:[{duration:Y()}],ease:[{ease:["linear","in","out","in-out",ie]}],delay:[{delay:Y()}],animate:[{animate:["none","spin","ping","pulse","bounce",ie]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[x]}],"scale-x":[{"scale-x":[x]}],"scale-y":[{"scale-y":[x]}],rotate:[{rotate:[qn,ie]}],"translate-x":[{"translate-x":[I]}],"translate-y":[{"translate-y":[I]}],"skew-x":[{"skew-x":[D]}],"skew-y":[{"skew-y":[D]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",ie]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",ie]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":N()}],"scroll-mx":[{"scroll-mx":N()}],"scroll-my":[{"scroll-my":N()}],"scroll-ms":[{"scroll-ms":N()}],"scroll-me":[{"scroll-me":N()}],"scroll-mt":[{"scroll-mt":N()}],"scroll-mr":[{"scroll-mr":N()}],"scroll-mb":[{"scroll-mb":N()}],"scroll-ml":[{"scroll-ml":N()}],"scroll-p":[{"scroll-p":N()}],"scroll-px":[{"scroll-px":N()}],"scroll-py":[{"scroll-py":N()}],"scroll-ps":[{"scroll-ps":N()}],"scroll-pe":[{"scroll-pe":N()}],"scroll-pt":[{"scroll-pt":N()}],"scroll-pr":[{"scroll-pr":N()}],"scroll-pb":[{"scroll-pb":N()}],"scroll-pl":[{"scroll-pl":N()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",ie]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[Ai,Qi,jd]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","
209none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},aT=qD(nT);function Rt(...e){return aT(I0(e))}const oT=dD,z0=p.forwardRef(({className:e,...t},i)=>a.jsx(S0,{ref:i,className:Rt("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));z0.displayName=S0.displayName;const cT=j0("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),W0=p.forwardRef(({className:e,variant:t,...i},r)=>a.jsx(C0,{ref:r,className:Rt(cT({variant:t}),e),...i}));W0.displayName=C0.displayName;const lT=p.forwardRef(({className:e,...t},i)=>a.jsx(E0,{ref:i,className:Rt("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",e),...t}));lT.displayName=E0.displayName;const $0=p.forwardRef(({className:e,...t},i)=>a.jsx(P0,{ref:i,className:Rt("absolute right-2 top-2 rounded-md p-1 text-foreground
209/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:a.jsx(F0,{className:"h-4 w-4"})}));$0.displayName=P0.displayName;const H0=p.forwardRef(({className:e,...t},i)=>a.jsx(D0,{ref:i,className:Rt("text-sm font-semibold",e),...t}));H0.displayName=D0.displayName;const V0=p.forwardRef(({className:e,...t},i)=>a.jsx(T0,{ref:i,className:Rt("text-sm opacity-90",e),...t}));V0.displayName=T0.displayName;function dT(){const{toasts:e}=vC();return a.jsxs(oT,{children:[e.map(function({id:t,title:i,description:r,action:s,...n}){return a.jsxs(W0,{...n,children:[a.jsxs("div",{className:"grid gap-1",children:[i&&a.jsx(H0,{children:i}),r&&a.jsx(V0,{children:r})]}),s,a.jsx($0,{})]},t)}),a.jsx(z0,{})]})}var uT=_h[" useId ".trim().toString()]||(()=>{}),hT=0;function Mm(e){const[t,i]=p.useState(uT());return vi(()=>{i(r=>r??String(hT++))},[e]),t?`radix-${t}`:""}const mT=["top","right","bottom","left"],Cr=Math.min,ht=Math.max,Vc=Math.round,Oo=Math.floor,Dr=e=>({x:e,y:e}),pT={left:"right",right:"left",bottom:"top",top:"bottom"},gT={start:"end",end:"start"};function rh(e,t,i){return ht(e,Cr(t,i))}function Bi(e,t){return typeof e=="function"?e(t):e}function Ui(e){return e.split("-")[0]}function Sn(e){return e.split("-")[1]}function Rm(e){return e==="x"?"y":"x"}function Om(e){return e==="y"?"height":"width"}function Tr(e){return["top","bottom"].includes(Ui(e))?"y":"x"}function Fm(e){return Rm(Tr(e))}function fT(e,t,i){i===void 0&&(i=!1);const r=Sn(e),s=Fm(e),n=Om(s);let o=s==="x"?r===(i?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[n]>t.floating[n]&&(o=Gc(o)),[o,Gc(o)]}function yT(e){const t=Gc(e);return[sh(e),t,sh(t)]}function sh(e){return e.replace(/start|end/g,t=>gT[t])}function bT(e,t,i){const r=["left","right"],s=["right","left"],n=["top","bottom"],o=["bottom","top"];switch(e){case"top":case"bottom":return i?t?s:r:t?r:s;case"left":case"right":return t?n:o;default:return[]}}function vT(e,t,i,r){const s=Sn(e);let n=bT(Ui(e),i==="start",r);return s&&(n=n.map(o=>o+"-"+s),t&&(n=n.concat(n.map(sh)))),n}function Gc(e){return e.replace(/left|right|bottom|top/g,t=>pT[t])}function wT(e){return{top:0,right:0,bottom:0,left:0,...e}}function G0(e){return typeof e!="number"?wT(e):{top:e,right:e,bottom:e,left:e}}function Kc(e){const{x:t,y:i,width:r,height:s}=e;return{width:r,height:s,top:i,left:t,right:t+r,bottom:i+s,x:t,y:i}}function ef(e,t,i){let{reference:r,floating:s}=e;const n=Tr(t),o=Fm(t),c=Om(o),l=Ui(t),d=n==="y",u=r.x+r.width/2-s.width/2,h=r.y+r.height/2-s.height/2,g=r[c]/2-s[c]/2;let m;switch(l){case"top":m={x:u,y:r.y-s.height};break;case"bottom":m={x:u,y:r.y+r.height};break;case"right":m={x:r.x+r.width,y:h};break;case"left":m={x:r.x-s.width,y:h};break;default:m={x:r.x,y:r.y}}switch(Sn(t)){case"start":m[o]-=g*(i&&d?-1:1);break;case"end":m[o]+=g*(i&&d?-1:1);break}return m}const kT=async(e,t,i)=>{const{placement:r="bottom",strategy:s="absolute",middleware:n=[],platform:o}=i,c=n.filter(Boolean),l=await(o.isRTL==null?void 0:o.isRTL(t));let d=await o.getElementRects({reference:e,floating:t,strategy:s}),{x:u,y:h}=ef(d,r,l),g=r,m={},w=0;for(let v=0;v<c.length;v++){const{name:k,fn:y}=c[v],{x:f,y:b,data:x,reset:C}=await y({x:u,y:h,initialPlacement:r,placement:g,strategy:s,middlewareData:m,rects:d,platform:o,elements:{reference:e,floating:t}});u=f??u,h=b??h,m={...m,[k]:{...m[k],...x}},C&&w<=50&&(w++,typeof C=="object"&&(C.placement&&(g=C.placement),C.rects&&(d=C.rects===!0?await o.getElementRects({reference:e,floating:t,strategy:s}):C.rects),{x:u,y:h}=ef(d,g,l)),v=-1)}return{x:u,y:h,placement:g,strategy:s,middlewareData:m}};async function Ra(e,t){var i;t===void 0&&(t={});const{x:r,y:s,platform:n,rects:o,elements:c,strategy:l}=e,{boundary:d="clippingAncestors",rootBoundary:u="viewport",elementContext:h="floating",altBoundary:g=!1,padding:m=0}=Bi(t,e),w=G0(m),k=c[g?h==="floating"?"reference":"floating":h],y=Kc(await n.getClippingRect
209({element:(i=await(n.isElement==null?void 0:n.isElement(k)))==null||i?k:k.contextElement||await(n.getDocumentElement==null?void 0:n.getDocumentElement(c.floating)),boundary:d,rootBoundary:u,strategy:l})),f=h==="floating"?{x:r,y:s,width:o.floating.width,height:o.floating.height}:o.reference,b=await(n.getOffsetParent==null?void 0:n.getOffsetParent(c.floating)),x=await(n.isElement==null?void 0:n.isElement(b))?await(n.getScale==null?void 0:n.getScale(b))||{x:1,y:1}:{x:1,y:1},C=Kc(n.convertOffsetParentRelativeRectToViewportRelativeRect?await n.convertOffsetParentRelativeRectToViewportRelativeRect({elements:c,rect:f,offsetParent:b,strategy:l}):f);return{top:(y.top-C.top+w.top)/x.y,bottom:(C.bottom-y.bottom+w.bottom)/x.y,left:(y.left-C.left+w.left)/x.x,right:(C.right-y.right+w.right)/x.x}}const xT=e=>({name:"arrow",options:e,async fn(t){const{x:i,y:r,placement:s,rects:n,platform:o,elements:c,middlewareData:l}=t,{element:d,padding:u=0}=Bi(e,t)||{};if(d==null)return{};const h=G0(u),g={x:i,y:r},m=Fm(s),w=Om(m),v=await o.getDimensions(d),k=m==="y",y=k?"top":"left",f=k?"bottom":"right",b=k?"clientHeight":"clientWidth",x=n.reference[w]+n.reference[m]-g[m]-n.floating[w],C=g[m]-n.reference[m],D=await(o.getOffsetParent==null?void 0:o.getOffsetParent(d));let T=D?D[b]:0;(!T||!await(o.isElement==null?void 0:o.isElement(D)))&&(T=c.floating[b]||n.floating[w]);const I=x/2-C/2,R=T/2-v[w]/2-1,F=Cr(h[y],R),K=Cr(h[f],R),N=F,J=T-v[w]-K,B=T/2-v[w]/2+I,ne=rh(N,B,J),Q=!l.arrow&&Sn(s)!=null&&B!==ne&&n.reference[w]/2-(B<N?F:K)-v[w]/2<0,Z=Q?B<N?B-N:B-J:0;return{[m]:g[m]+Z,data:{[m]:ne,centerOffset:B-ne-Z,...Q&&{alignmentOffset:Z}},reset:Q}}}),AT=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var i,r;const{placement:s,middlewareData:n,rects:o,initialPlacement:c,platform:l,elements:d}=t,{mainAxis:u=!0,crossAxis:h=!0,fallbackPlacements:g,fallbackStrategy:m="bestFit",fallbackAxisSideDirection:w="none",flipAlignment:v=!0,...k}=Bi(e,t);if((i=n.arrow)!=null&&i.alignmentOffset)return{};const y=Ui(s),f=Tr(c),b=Ui(c)===c,x=await(l.isRTL==null?void 0:l.isRTL(d.floating)),C=g||(b||!v?[Gc(c)]:yT(c)),D=w!=="none";!g&&D&&C.push(...vT(c,v,w,x));const T=[c,...C],I=await Ra(t,k),R=[];let F=((r=n.flip)==null?void 0:r.overflows)||[];if(u&&R.push(I[y]),h){const B=fT(s,o,x);R.push(I[B[0]],I[B[1]])}if(F=[...F,{placement:s,overflows:R}],!R.every(B=>B<=0)){var K,N;const B=(((K=n.flip)==null?void 0:K.index)||0)+1,ne=T[B];if(ne)return{data:{index:B,overflows:F},reset:{placement:ne}};let Q=(N=F.filter(Z=>Z.overflows[0]<=0).sort((Z,_)=>Z.overflows[1]-_.overflows[1])[0])==null?void 0:N.placement;if(!Q)switch(m){case"bestFit":{var J;const Z=(J=F.filter(_=>{if(D){const j=Tr(_.placement);return j===f||j==="y"}return!0}).map(_=>[_.placement,_.overflows.filter(j=>j>0).reduce((j,q)=>j+q,0)]).sort((_,j)=>_[1]-j[1])[0])==null?void 0:J[0];Z&&(Q=Z);break}case"initialPlacement":Q=c;break}if(s!==Q)return{reset:{placement:Q}}}return{}}}};function tf(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function rf(e){return mT.some(t=>e[t]>=0)}const ST=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:i}=t,{strategy:r="referenceHidden",...s}=Bi(e,t);switch(r){case"referenceHidden":{const n=await Ra(t,{...s,elementContext:"reference"}),o=tf(n,i.reference);return{data:{referenceHiddenOffsets:o,referenceHidden:rf(o)}}}case"escaped":{const n=await Ra(t,{...s,altBoundary:!0}),o=tf(n,i.floating);return{data:{escapedOffsets:o,escaped:rf(o)}}}default:return{}}}}};async function CT(e,t){const{placement:i,platform:r,elements:s}=e,n=await(r.isRTL==null?void 0:r.isRTL(s.floating)),o=Ui(i),c=Sn(i),l=Tr(i)==="y",d=["left","top"].includes(o)?-1:1,u=n&&l?-1:1,h=Bi(t,e);let{mainAxis:g,crossAxis:m,alignmentAxis:w}=typeof h=="number"?{mainAxis:h,crossAxis:0,alignmentAxis:null}:{mainAxis:h.mainAxis||0,crossAxis:h.crossAxis||0,alignmentAxis:h.alignmentAxis};return c&&typeof w=="number"&&(m=c==="end"?w*-1:w),l?{x:m*u,y:g*d}:{x:g*d,y:m*u}}const DT=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var i,r;const{x:s,y:n,placement:o,middlewareData:c}=t,l=await CT(t,e);return o===((i=c.offset)==null?void 0:i.placement)&&(r=c.arrow)!=null&&r.alignmentOffset?{}:{x:s+l.x,y:n+l.y,data:{...l,placement:o}}}}},TT=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:i,y:r,placement:s}=t,{mainAxis:n=!0,crossAxis:o=!1,limiter:c={fn:k=>{let{x:y,y:f}=k;return{x:y,y:f}}},...l}=Bi(e,t),d={x:i,y:r},u=await Ra(t,l),h=Tr(Ui(s)),g=Rm(h);let m=d[g],w=d[h];if(n){const k=g==="y"?"top":"left",y=g==="y"?"bottom":"right",f=m+u[k],b=m-u[y];m=rh(f,m,b)}if(o){const k=h==="y"?"top":"left",y=h==="y"?"bottom":"right",f=w+u[k],b=w-u[y];w=rh(f,w,b)}const v=c.fn({...t,[g]:m,[h]:w});return{...v,data:{x:v.x-i,y:v.y-r,enabled:{[g]:n,[h]:o}}}}}},ET=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:i,y:r,placement:s,rects:n,middlewareData:o}=t,{offset:c=0,mainAxis:l=!0,crossAxis:d=!0}=Bi(e,t),u={x:i,y:r},h=Tr(s),g=Rm(h);let m=u[g],w=u[h];const v=Bi(c,t),k=typeof v=="number"?{mainAxis:v,crossAxis:0}:{mainAxis:0,crossAxis:0,...v};if(l){const b=g==="y"?"height":"width",x=n.reference[g]-n.floating[b]+k.mainAxis,C=n.reference[g]+n.reference[b]-k.mainAxis;m<x?m=x:m>C&&(m=C)}if(d){var y,f;const b=g==="y"?"width":"height",x=["top","left"].includes(Ui(s)),C=n.reference[h]-n.floating[b]+(x&&((y=o.offset)==null?void 0:y[h])||0)+(x?0:k.crossAxis),D=n.reference[h]+n.reference[b]+(x?0:((f=o.offset)==null?void 0:f[h])||0)-(x?k.crossAxis:0);w<C?w=C:w>D&&(w=D)}return{[g]:m,[h]:w}}}},PT=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){var i,r;const{placement:s,rects:n,platform:o,elements:c}=t,{apply:l=()=>{},...d}=Bi(e,t),u=await Ra(t,d),h=Ui(s),g=Sn(s),m=Tr(s)==="y",{width:w,height:v}=n.floating;let k,y;h==="top"||h==="bottom"?(k=h,y=g===(await(o.isRTL==null?void 0:o.isRTL(c.floating))?"start":"end")?"left":"right"):(y=h,k=g==="end"?"top":"bottom");const f=v-u.top-u.bottom,b=w-u.left-u.right,x=Cr(v-u[k],f),C=Cr(w-u[y],b),D=!t.middlewareData.shift;let T=x,I=C;if((i=t.middlewareData.shift)!=null&&i.enabled.x&&(I=b),(r=t.middlewareData.shift)!=null&&r.enabled.y&&(T=f),D&&!g){const F=ht(u.left,0),K=ht(u.right,0),N=ht(u.top,0),J=ht(u.bottom,0);m?I=w-2*(F!==0||K!==0?F+K:ht(u.left,u.right)):T=v-2*(N!==0||J!==0?N+J:ht(u.top,u.bottom))}await l({...t,availableWidth:I,availableHeight:T});const R=await o.getDimensions(c.floating);return w!==R.width||v!==R.height?{reset:{rects:!0}}:{}}}};function jl(){return typeof window<"u"}function Cn(e){return K0(e)?(e.nodeName||"").toLowerCase():"#document"}function yt(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function ki(e){var t;return(t=(K0(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function K0(e){return jl()?e instanceof Node||e instanceof yt(e).Node:!1}function ni(e){return jl()?e instanceof Element||e instanceof yt(e).Element:!1}function wi(e){return jl()?e instanceof HTMLElement||e instanceof yt(e).HTMLElement:!1}function sf(e){return!jl()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof yt(e).ShadowRoot}function ro(e){const{overflow:t,overflowX:i,overflowY:r,display:s}=ai(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+i)&&!["inline","contents"].includes(s)}function _T(e){return["table","td","th"].includes(Cn(e))}function Ml(e){return[":popover-open",":modal"].some(t=>{try{return e.matches(t)}catch{return!1}})}function Nm(e){const t=Lm(),i=ni(e)?ai(e):e;return i.transform!=="none"||i.perspective!=="none"||(i.containerType?i.containerType!=="normal":!1)||!t&&(i.backdropFilter?i.backdropFilter!=="none":!1)||!t&&(i.filter?i.filter!=="none":!1)||["transform","perspective","filter"].some(r=>(i.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(i.contain||"").includes(r))}function IT(e){let t=Er(e);for(;wi(t)&&!gn(t);){if(Nm(t))return t;if(Ml(t))return null;t=Er(t)}return null}function Lm(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function gn(e){return["html","body","#document"].includes(Cn(e))}function ai(e){return yt(e).getComputedStyle(e)}function Rl(e){return ni(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Er(e){if(Cn(e)==="html")return e;const t=e.assignedSlot||e.parentNode||sf(e)&&e.host||ki(e);return sf(t)?t.host:t}function Q0(e){const t=Er(e);return gn(t)?e.ownerDocument?e.ownerDocument.body:e.body:wi(t)&&ro(t)?t:Q0(t)}function Oa(e,t,i){var r;t===void 0&&(t=[]),i===void 0&&(i=!0);const s=Q0(e),n=s===((r=e.ownerDocument)==null?void 0:r.body),o=yt(s);if(n){const c=nh(o);
209return t.concat(o,o.visualViewport||[],ro(s)?s:[],c&&i?Oa(c):[])}return t.concat(s,Oa(s,[],i))}function nh(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function X0(e){const t=ai(e);let i=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const s=wi(e),n=s?e.offsetWidth:i,o=s?e.offsetHeight:r,c=Vc(i)!==n||Vc(r)!==o;return c&&(i=n,r=o),{width:i,height:r,$:c}}function Bm(e){return ni(e)?e:e.contextElement}function Ks(e){const t=Bm(e);if(!wi(t))return Dr(1);const i=t.getBoundingClientRect(),{width:r,height:s,$:n}=X0(t);let o=(n?Vc(i.width):i.width)/r,c=(n?Vc(i.height):i.height)/s;return(!o||!Number.isFinite(o))&&(o=1),(!c||!Number.isFinite(c))&&(c=1),{x:o,y:c}}const jT=Dr(0);function J0(e){const t=yt(e);return!Lm()||!t.visualViewport?jT:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function MT(e,t,i){return t===void 0&&(t=!1),!i||t&&i!==yt(e)?!1:t}function as(e,t,i,r){t===void 0&&(t=!1),i===void 0&&(i=!1);const s=e.getBoundingClientRect(),n=Bm(e);let o=Dr(1);t&&(r?ni(r)&&(o=Ks(r)):o=Ks(e));const c=MT(n,i,r)?J0(n):Dr(0);let l=(s.left+c.x)/o.x,d=(s.top+c.y)/o.y,u=s.width/o.x,h=s.height/o.y;if(n){const g=yt(n),m=r&&ni(r)?yt(r):r;let w=g,v=nh(w);for(;v&&r&&m!==w;){const k=Ks(v),y=v.getBoundingClientRect(),f=ai(v),b=y.left+(v.clientLeft+parseFloat(f.paddingLeft))*k.x,x=y.top+(v.clientTop+parseFloat(f.paddingTop))*k.y;l*=k.x,d*=k.y,u*=k.x,h*=k.y,l+=b,d+=x,w=yt(v),v=nh(w)}}return Kc({width:u,height:h,x:l,y:d})}function RT(e){let{elements:t,rect:i,offsetParent:r,strategy:s}=e;const n=s==="fixed",o=ki(r),c=t?Ml(t.floating):!1;if(r===o||c&&n)return i;let l={scrollLeft:0,scrollTop:0},d=Dr(1);const u=Dr(0),h=wi(r);if((h||!h&&!n)&&((Cn(r)!=="body"||ro(o))&&(l=Rl(r)),wi(r))){const g=as(r);d=Ks(r),u.x=g.x+r.clientLeft,u.y=g.y+r.clientTop}return{width:i.width*d.x,height:i.height*d.y,x:i.x*d.x-l.scrollLeft*d.x+u.x,y:i.y*d.y-l.scrollTop*d.y+u.y}}function OT(e){return Array.from(e.getClientRects())}function ah(e,t){const i=Rl(e).scrollLeft;return t?t.left+i:as(ki(e)).left+i}function FT(e){const t=ki(e),i=Rl(e),r=e.ownerDocument.body,s=ht(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),n=ht(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let o=-i.scrollLeft+ah(e);const c=-i.scrollTop;return ai(r).direction==="rtl"&&(o+=ht(t.clientWidth,r.clientWidth)-s),{width:s,height:n,x:o,y:c}}function NT(e,t){const i=yt(e),r=ki(e),s=i.visualViewport;let n=r.clientWidth,o=r.clientHeight,c=0,l=0;if(s){n=s.width,o=s.height;const d=Lm();(!d||d&&t==="fixed")&&(c=s.offsetLeft,l=s.offsetTop)}return{width:n,height:o,x:c,y:l}}function LT(e,t){const i=as(e,!0,t==="fixed"),r=i.top+e.clientTop,s=i.left+e.clientLeft,n=wi(e)?Ks(e):Dr(1),o=e.clientWidth*n.x,c=e.clientHeight*n.y,l=s*n.x,d=r*n.y;return{width:o,height:c,x:l,y:d}}function nf(e,t,i){let r;if(t==="viewport")r=NT(e,i);else if(t==="document")r=FT(ki(e));else if(ni(t))r=LT(t,i);else{const s=J0(e);r={...t,x:t.x-s.x,y:t.y-s.y}}return Kc(r)}function Y0(e,t){const i=Er(e);return i===t||!ni(i)||gn(i)?!1:ai(i).position==="fixed"||Y0(i,t)}function BT(e,t){const i=t.get(e);if(i)return i;let r=Oa(e,[],!1).filter(c=>ni(c)&&Cn(c)!=="body"),s=null;const n=ai(e).position==="fixed";let o=n?Er(e):e;for(;ni(o)&&!gn(o);){const c=ai(o),l=Nm(o);!l&&c.position==="fixed"&&(s=null),(n?!l&&!s:!l&&c.position==="static"&&!!s&&["absolute","fixed"].includes(s.position)||ro(o)&&!l&&Y0(e,o))?r=r.filter(u=>u!==o):s=c,o=Er(o)}return t.set(e,r),r}function UT(e){let{element:t,boundary:i,rootBoundary:r,strategy:s}=e;const o=[...i==="clippingAncestors"?Ml(t)?[]:BT(t,this._c):[].concat(i),r],c=o[0],l=o.reduce((d,u)=>{const h=nf(t,u,s);return d.top=ht(h.top,d.top),d.right=Cr(h.right,d.right),d.bottom=Cr(h.bottom,d.bottom),d.left=ht(h.left,d.left),d},nf(t,c,s));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function qT(e){const{width:t,height:i}=X0(e);return{width:t,height:i}}function zT(e,t,i){const r=wi(t),s=ki(t),n=i==="fixed",o=as(e,!0,n,t);let c={scrollLeft:0,scrollTop:0};const l=Dr(0);if(r||!r&&!n)if((Cn(t)!=="body"||ro(s))&&(c=Rl(t)),r){const m=as(t,!0,n,t);l.x=m.x+t.clientLeft,l.y=m.y+t.clientTop}else s&&(l.x=ah(s));let d=0,u=0;if(s&&!r&&!n){const m=s.getBoundingClientRect();u=m.top+c.scrollTop,d=m.left+c.scrollLeft-ah(s,m)}const h=o.left+c.scrollLeft-l.x-d,g=o.top+c.scrollTop-l.y-u;return{x:h,y:g,width:o.width,height:o.height}}function Md(e){return ai(e).position==="static"}function af(e,t){if(!wi(e)||ai(e).position==="fixed")return null;if(t)return t(e);let i=e.offsetParent;return ki(e)===i&&(i=i.ownerDocument.body),i}function Z0(e,t){const i=yt(e);if(Ml(e))return i;
209if(!wi(e)){let s=Er(e);for(;s&&!gn(s);){if(ni(s)&&!Md(s))return s;s=Er(s)}return i}let r=af(e,t);for(;r&&_T(r)&&Md(r);)r=af(r,t);return r&&gn(r)&&Md(r)&&!Nm(r)?i:r||IT(e)||i}const WT=async function(e){const t=this.getOffsetParent||Z0,i=this.getDimensions,r=await i(e.floating);return{reference:zT(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function $T(e){return ai(e).direction==="rtl"}const HT={convertOffsetParentRelativeRectToViewportRelativeRect:RT,getDocumentElement:ki,getClippingRect:UT,getOffsetParent:Z0,getElementRects:WT,getClientRects:OT,getDimensions:qT,getScale:Ks,isElement:ni,isRTL:$T};function VT(e,t){let i=null,r;const s=ki(e);function n(){var c;clearTimeout(r),(c=i)==null||c.disconnect(),i=null}function o(c,l){c===void 0&&(c=!1),l===void 0&&(l=1),n();const{left:d,top:u,width:h,height:g}=e.getBoundingClientRect();if(c||t(),!h||!g)return;const m=Oo(u),w=Oo(s.clientWidth-(d+h)),v=Oo(s.clientHeight-(u+g)),k=Oo(d),f={rootMargin:-m+"px "+-w+"px "+-v+"px "+-k+"px",threshold:ht(0,Cr(1,l))||1};let b=!0;function x(C){const D=C[0].intersectionRatio;if(D!==l){if(!b)return o();D?o(!1,D):r=setTimeout(()=>{o(!1,1e-7)},1e3)}b=!1}try{i=new IntersectionObserver(x,{...f,root:s.ownerDocument})}catch{i=new IntersectionObserver(x,f)}i.observe(e)}return o(!0),n}function GT(e,t,i,r){r===void 0&&(r={});const{ancestorScroll:s=!0,ancestorResize:n=!0,elementResize:o=typeof ResizeObserver=="function",layoutShift:c=typeof IntersectionObserver=="function",animationFrame:l=!1}=r,d=Bm(e),u=s||n?[...d?Oa(d):[],...Oa(t)]:[];u.forEach(y=>{s&&y.addEventListener("scroll",i,{passive:!0}),n&&y.addEventListener("resize",i)});const h=d&&c?VT(d,i):null;let g=-1,m=null;o&&(m=new ResizeObserver(y=>{let[f]=y;f&&f.target===d&&m&&(m.unobserve(t),cancelAnimationFrame(g),g=requestAnimationFrame(()=>{var b;(b=m)==null||b.observe(t)})),i()}),d&&!l&&m.observe(d),m.observe(t));let w,v=l?as(e):null;l&&k();function k(){const y=as(e);v&&(y.x!==v.x||y.y!==v.y||y.width!==v.width||y.height!==v.height)&&i(),v=y,w=requestAnimationFrame(k)}return i(),()=>{var y;u.forEach(f=>{s&&f.removeEventListener("scroll",i),n&&f.removeEventListener("resize",i)}),h==null||h(),(y=m)==null||y.disconnect(),m=null,l&&cancelAnimationFrame(w)}}const KT=DT,QT=TT,XT=AT,JT=PT,YT=ST,of=xT,ZT=ET,eE=(e,t,i)=>{const r=new Map,s={platform:HT,...i},n={...s.platform,_c:r};return kT(e,t,{...s,platform:n})};var lc=typeof document<"u"?p.useLayoutEffect:p.useEffect;function Qc(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let i,r,s;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(i=e.length,i!==t.length)return!1;for(r=i;r--!==0;)if(!Qc(e[r],t[r]))return!1;return!0}if(s=Object.keys(e),i=s.length,i!==Object.keys(t).length)return!1;for(r=i;r--!==0;)if(!{}.hasOwnProperty.call(t,s[r]))return!1;for(r=i;r--!==0;){const n=s[r];if(!(n==="_owner"&&e.$$typeof)&&!Qc(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function ew(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function cf(e,t){const i=ew(e);return Math.round(t*i)/i}function Rd(e){const t=p.useRef(e);return lc(()=>{t.current=e}),t}function tE(e){e===void 0&&(e={});const{placement:t="bottom",strategy:i="absolute",middleware:r=[],platform:s,elements:{reference:n,floating:o}={},transform:c=!0,whileElementsMounted:l,open:d}=e,[u,h]=p.useState({x:0,y:0,strategy:i,placement:t,middlewareData:{},isPositioned:!1}),[g,m]=p.useState(r);Qc(g,r)||m(r);const[w,v]=p.useState(null),[k,y]=p.useState(null),f=p.useCallback(_=>{_!==D.current&&(D.current=_,v(_))},[]),b=p.useCallback(_=>{_!==T.current&&(T.current=_,y(_))},[]),x=n||w,C=o||k,D=p.useRef(null),T=p.useRef(null),I=p.useRef(u),R=l!=null,F=Rd(l),K=Rd(s),N=Rd(d),J=p.useCallback(()=>{if(!D.current||!T.current)return;const _={placement:t,strategy:i,middleware:g};K.current&&(_.platform=K.current),eE(D.current,T.current,_).then(j=>{const q={...j,isPositioned:N.current!==!1};B.current&&!Qc(I.current,q)&&(I.current=q,Ya.flushSync(()=>{h(q)}))})},[g,t,i,K,N]);lc(()=>{d===!1&&I.current.isPositioned&&(I.current.isPositioned=!1,h(_=>({..._,isPositioned:!1})))},[d]);const B=p.useRef(!1);lc(()=>(B.current=!0,()=>
209{B.current=!1}),[]),lc(()=>{if(x&&(D.current=x),C&&(T.current=C),x&&C){if(F.current)return F.current(x,C,J);J()}},[x,C,J,F,R]);const ne=p.useMemo(()=>({reference:D,floating:T,setReference:f,setFloating:b}),[f,b]),Q=p.useMemo(()=>({reference:x,floating:C}),[x,C]),Z=p.useMemo(()=>{const _={position:i,left:0,top:0};if(!Q.floating)return _;const j=cf(Q.floating,u.x),q=cf(Q.floating,u.y);return c?{..._,transform:"translate("+j+"px, "+q+"px)",...ew(Q.floating)>=1.5&&{willChange:"transform"}}:{position:i,left:j,top:q}},[i,c,Q.floating,u.x,u.y]);return p.useMemo(()=>({...u,update:J,refs:ne,elements:Q,floatingStyles:Z}),[u,J,ne,Q,Z])}const iE=e=>{function t(i){return{}.hasOwnProperty.call(i,"current")}return{name:"arrow",options:e,fn(i){const{element:r,padding:s}=typeof e=="function"?e(i):e;return r&&t(r)?r.current!=null?of({element:r.current,padding:s}).fn(i):{}:r?of({element:r,padding:s}).fn(i):{}}}},rE=(e,t)=>({...KT(e),options:[e,t]}),sE=(e,t)=>({...QT(e),options:[e,t]}),nE=(e,t)=>({...ZT(e),options:[e,t]}),aE=(e,t)=>({...XT(e),options:[e,t]}),oE=(e,t)=>({...JT(e),options:[e,t]}),cE=(e,t)=>({...YT(e),options:[e,t]}),lE=(e,t)=>({...iE(e),options:[e,t]});var dE="Arrow",tw=p.forwardRef((e,t)=>{const{children:i,width:r=10,height:s=5,...n}=e;return a.jsx(Fe.svg,{...n,ref:t,width:r,height:s,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?i:a.jsx("polygon",{points:"0,0 30,0 15,10"})})});tw.displayName=dE;var uE=tw;function hE(e){const[t,i]=p.useState(void 0);return vi(()=>{if(e){i({width:e.offsetWidth,height:e.offsetHeight});const r=new ResizeObserver(s=>{if(!Array.isArray(s)||!s.length)return;const n=s[0];let o,c;if("borderBoxSize"in n){const l=n.borderBoxSize,d=Array.isArray(l)?l[0]:l;o=d.inlineSize,c=d.blockSize}else o=e.offsetWidth,c=e.offsetHeight;i({width:o,height:c})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}else i(void 0)},[e]),t}var Um="Popper",[iw,rw]=xn(Um),[mE,sw]=iw(Um),nw=e=>{const{__scopePopper:t,children:i}=e,[r,s]=p.useState(null);return a.jsx(mE,{scope:t,anchor:r,onAnchorChange:s,children:i})};nw.displayName=Um;var aw="PopperAnchor",ow=p.forwardRef((e,t)=>{const{__scopePopper:i,virtualRef:r,...s}=e,n=sw(aw,i),o=p.useRef(null),c=vt(t,o);return p.useEffect(()=>{n.onAnchorChange((r==null?void 0:r.current)||o.current)}),r?null:a.jsx(Fe.div,{...s,ref:c})});ow.displayName=aw;var qm="PopperContent",[pE,gE]=iw(qm),cw=p.forwardRef((e,t)=>{var V,xt,He,Ot,Ft,jr;const{__scopePopper:i,side:r="bottom",sideOffset:s=0,align:n="center",alignOffset:o=0,arrowPadding:c=0,avoidCollisions:l=!0,collisionBoundary:d=[],collisionPadding:u=0,sticky:h="partial",hideWhenDetached:g=!1,updatePositionStrategy:m="optimized",onPlaced:w,...v}=e,k=sw(qm,i),[y,f]=p.useState(null),b=vt(t,Nt=>f(Nt)),[x,C]=p.useState(null),D=hE(x),T=(D==null?void 0:D.width)??0,I=(D==null?void 0:D.height)??0,R=r+(n!=="center"?"-"+n:""),F=typeof u=="number"?u:{top:0,right:0,bottom:0,left:0,...u},K=Array.isArray(d)?d:[d],N=K.length>0,J={padding:F,boundary:K.filter(yE),altBoundary:N},{refs:B,floatingStyles:ne,placement:Q,isPositioned:Z,middlewareData:_}=tE({strategy:"fixed",placement:R,whileElementsMounted:(...Nt)=>GT(...Nt,{animationFrame:m==="always"}),elements:{reference:k.anchor},middleware:[rE({mainAxis:s+I,alignmentAxis:o}),l&&sE({mainAxis:!0,crossAxis:!1,limiter:h==="partial"?nE():void 0,...J}),l&&aE({...J}),oE({...J,apply:({elements:Nt,rects:co,availableWidth:Vl,availableHeight:lo})=>{const{width:Gl,height:Pn}=co.reference,ds=Nt.floating.style;ds.setProperty("--radix-popper-available-width",`${Vl}px`),ds.setProperty("--radix-popper-available-height",`${lo}px`),ds.setProperty("--radix-popper-anchor-width",`${Gl}px`),ds.setProperty("--radix-popper-anchor-height",`${Pn}px`)}}),x&&lE({element:x,padding:c}),bE({arrowWidth:T,arrowHeight:I}),g&&cE({strategy:"referenceHidden",...J})]}),[j,q]=uw(Q),Y=Sr(w);vi(()=>{Z&&(Y==null||Y())},[Z,Y]);const G=(V=_.arrow)==null?void 0:V.x,re=(xt=_.arrow)==null?void 0:xt.y,se=((He=_.arrow)==null?void 0:He.centerOffset)!==0,[we,z]=p.useState();return vi(()=>{y&&z(window.getComputedStyle(y).zIndex)},[y]),a.jsx("div",{ref:B.setFloating,"data-radix-popper-content-wrapper":"",style:{...ne,transform:Z?ne.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:we,"--radix-popper-transform-origin":[(Ot=_.transformOrigin)==null?void 0:Ot.x,(Ft=_.transformOrigin)==null?void 0:Ft.y].join(" "),...((jr=_.hide)==null?void 0:jr.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:a.jsx(pE,{scope:i,placedSide:j,onArrowChange:C,arrowX:G,arrowY:re,shouldHideArrow:se,children:a.jsx(Fe.div,{"data-side":j,"data-align":q,...v,ref:b,style:{...v.style,animation:Z?void 0:"none"}})})})});cw.displayName=qm;var lw="PopperArrow",fE={top:"bottom",right:"left",bottom:"top",left:"r
209ight"},dw=p.forwardRef(function(t,i){const{__scopePopper:r,...s}=t,n=gE(lw,r),o=fE[n.placedSide];return a.jsx("span",{ref:n.onArrowChange,style:{position:"absolute",left:n.arrowX,top:n.arrowY,[o]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[n.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[n.placedSide],visibility:n.shouldHideArrow?"hidden":void 0},children:a.jsx(uE,{...s,ref:i,style:{...s.style,display:"block"}})})});dw.displayName=lw;function yE(e){return e!==null}var bE=e=>({name:"transformOrigin",options:e,fn(t){var k,y,f;const{placement:i,rects:r,middlewareData:s}=t,o=((k=s.arrow)==null?void 0:k.centerOffset)!==0,c=o?0:e.arrowWidth,l=o?0:e.arrowHeight,[d,u]=uw(i),h={start:"0%",center:"50%",end:"100%"}[u],g=(((y=s.arrow)==null?void 0:y.x)??0)+c/2,m=(((f=s.arrow)==null?void 0:f.y)??0)+l/2;let w="",v="";return d==="bottom"?(w=o?h:`${g}px`,v=`${-l}px`):d==="top"?(w=o?h:`${g}px`,v=`${r.floating.height+l}px`):d==="right"?(w=`${-l}px`,v=o?h:`${m}px`):d==="left"&&(w=`${r.floating.width+l}px`,v=o?h:`${m}px`),{data:{x:w,y:v}}}});function uw(e){const[t,i="center"]=e.split("-");return[t,i]}var vE=nw,wE=ow,kE=cw,xE=dw,[Ol,E6]=xn("Tooltip",[rw]),Fl=rw(),hw="TooltipProvider",AE=700,oh="tooltip.open",[SE,zm]=Ol(hw),mw=e=>{const{__scopeTooltip:t,delayDuration:i=AE,skipDelayDuration:r=300,disableHoverableContent:s=!1,children:n}=e,o=p.useRef(!0),c=p.useRef(!1),l=p.useRef(0);return p.useEffect(()=>{const d=l.current;return()=>window.clearTimeout(d)},[]),a.jsx(SE,{scope:t,isOpenDelayedRef:o,delayDuration:i,onOpen:p.useCallback(()=>{window.clearTimeout(l.current),o.current=!1},[]),onClose:p.useCallback(()=>{window.clearTimeout(l.current),l.current=window.setTimeout(()=>o.current=!0,r)},[r]),isPointerInTransitRef:c,onPointerInTransitChange:p.useCallback(d=>{c.current=d},[]),disableHoverableContent:s,children:n})};mw.displayName=hw;var Fa="Tooltip",[CE,Nl]=Ol(Fa),pw=e=>{const{__scopeTooltip:t,children:i,open:r,defaultOpen:s,onOpenChange:n,disableHoverableContent:o,delayDuration:c}=e,l=zm(Fa,e.__scopeTooltip),d=Fl(t),[u,h]=p.useState(null),g=Mm(),m=p.useRef(0),w=o??l.disableHoverableContent,v=c??l.delayDuration,k=p.useRef(!1),[y,f]=to({prop:r,defaultProp:s??!1,onChange:T=>{T?(l.onOpen(),document.dispatchEvent(new CustomEvent(oh))):l.onClose(),n==null||n(T)},caller:Fa}),b=p.useMemo(()=>y?k.current?"delayed-open":"instant-open":"closed",[y]),x=p.useCallback(()=>{window.clearTimeout(m.current),m.current=0,k.current=!1,f(!0)},[f]),C=p.useCallback(()=>{window.clearTimeout(m.current),m.current=0,f(!1)},[f]),D=p.useCallback(()=>{window.clearTimeout(m.current),m.current=window.setTimeout(()=>{k.current=!0,f(!0),m.current=0},v)},[v,f]);return p.useEffect(()=>()=>{m.current&&(window.clearTimeout(m.current),m.current=0)},[]),a.jsx(vE,{...d,children:a.jsx(CE,{scope:t,contentId:g,open:y,stateAttribute:b,trigger:u,onTriggerChange:h,onTriggerEnter:p.useCallback(()=>{l.isOpenDelayedRef.current?D():x()},[l.isOpenDelayedRef,D,x]),onTriggerLeave:p.useCallback(()=>{w?C():(window.clearTimeout(m.current),m.current=0)},[C,w]),onOpen:x,onClose:C,disableHoverableContent:w,children:i})})};pw.displayName=Fa;var ch="TooltipTrigger",gw=p.forwardRef((e,t)=>{const{__scopeTooltip:i,...r}=e,s=Nl(ch,i),n=zm(ch,i),o=Fl(i),c=p.useRef(null),l=vt(t,c,s.onTriggerChange),d=p.useRef(!1),u=p.useRef(!1),h=p.useCallback(()=>d.current=!1,[]);return p.useEffect(()=>()=>document.removeEventListener("pointerup",h),[h]),a.jsx(wE,{asChild:!0,...o,children:a.jsx(Fe.button,{"aria-describedby":s.open?s.contentId:void 0,"data-state":s.stateAttribute,...r,ref:l,onPointerMove:_e(e.onPointerMove,g=>{g.pointerType!=="touch"&&!u.current&&!n.isPointerInTransitRef.current&&(s.onTriggerEnter(),u.current=!0)}),onPointerLeave:_e(e.onPointerLeave,()=>{s.onTriggerLeave(),u.current=!1}),onPointerDown:_e(e.onPointerDown,()=>{s.open&&s.onClose(),d.current=!0,document.addEventListener("pointerup",h,{once:!0})}),onFocus:_e(e.onFocus,()=>{d.current||s.onOpen()}),onBlur:_e(e.onBlur,s.onClose),onClick:_e(e.onClick,s.onClose)})})});gw.displayName=ch;var DE="TooltipPortal",[P6,TE]=Ol(DE,{forceMount:void 0}),fn="TooltipContent",fw=p.forwardRef((e,t)=>
209{const i=TE(fn,e.__scopeTooltip),{forceMount:r=i.forceMount,side:s="top",...n}=e,o=Nl(fn,e.__scopeTooltip);return a.jsx(Pl,{present:r||o.open,children:o.disableHoverableContent?a.jsx(yw,{side:s,...n,ref:t}):a.jsx(EE,{side:s,...n,ref:t})})}),EE=p.forwardRef((e,t)=>{const i=Nl(fn,e.__scopeTooltip),r=zm(fn,e.__scopeTooltip),s=p.useRef(null),n=vt(t,s),[o,c]=p.useState(null),{trigger:l,onClose:d}=i,u=s.current,{onPointerInTransitChange:h}=r,g=p.useCallback(()=>{c(null),h(!1)},[h]),m=p.useCallback((w,v)=>{const k=w.currentTarget,y={x:w.clientX,y:w.clientY},f=ME(y,k.getBoundingClientRect()),b=RE(y,f),x=OE(v.getBoundingClientRect()),C=NE([...b,...x]);c(C),h(!0)},[h]);return p.useEffect(()=>()=>g(),[g]),p.useEffect(()=>{if(l&&u){const w=k=>m(k,u),v=k=>m(k,l);return l.addEventListener("pointerleave",w),u.addEventListener("pointerleave",v),()=>{l.removeEventListener("pointerleave",w),u.removeEventListener("pointerleave",v)}}},[l,u,m,g]),p.useEffect(()=>{if(o){const w=v=>{const k=v.target,y={x:v.clientX,y:v.clientY},f=(l==null?void 0:l.contains(k))||(u==null?void 0:u.contains(k)),b=!FE(y,o);f?g():b&&(g(),d())};return document.addEventListener("pointermove",w),()=>document.removeEventListener("pointermove",w)}},[l,u,o,d,g]),a.jsx(yw,{...e,ref:n})}),[PE,_E]=Ol(Fa,{isInside:!1}),IE=AC("TooltipContent"),yw=p.forwardRef((e,t)=>{const{__scopeTooltip:i,children:r,"aria-label":s,onEscapeKeyDown:n,onPointerDownOutside:o,...c}=e,l=Nl(fn,i),d=Fl(i),{onClose:u}=l;return p.useEffect(()=>(document.addEventListener(oh,u),()=>document.removeEventListener(oh,u)),[u]),p.useEffect(()=>{if(l.trigger){const h=g=>{const m=g.target;m!=null&&m.contains(l.trigger)&&u()};return window.addEventListener("scroll",h,{capture:!0}),()=>window.removeEventListener("scroll",h,{capture:!0})}},[l.trigger,u]),a.jsx(Em,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:n,onPointerDownOutside:o,onFocusOutside:h=>h.preventDefault(),onDismiss:u,children:a.jsxs(kE,{"data-state":l.stateAttribute,...d,...c,ref:t,style:{...c.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[a.jsx(IE,{children:r}),a.jsx(PE,{scope:i,isInside:!0,children:a.jsx(VC,{id:l.contentId,role:"tooltip",children:s||r})})]})})});fw.displayName=fn;var bw="TooltipArrow",jE=p.forwardRef((e,t)=>{const{__scopeTooltip:i,...r}=e,s=Fl(i);return _E(bw,i).isInside?null:a.jsx(xE,{...s,...r,ref:t})});jE.displayName=bw;function ME(e,t){const i=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),s=Math.abs(t.right-e.x),n=Math.abs(t.left-e.x);switch(Math.min(i,r,s,n)){case n:return"left";case s:return"right";case i:return"top";case r:return"bottom";default:throw new Error("unreachable")}}function RE(e,t,i=5){const r=[];switch(t){case"top":r.push({x:e.x-i,y:e.y+i},{x:e.x+i,y:e.y+i});break;case"bottom":r.push({x:e.x-i,y:e.y-i},{x:e.x+i,y:e.y-i});break;case"left":r.push({x:e.x+i,y:e.y-i},{x:e.x+i,y:e.y+i});break;case"right":r.push({x:e.x-i,y:e.y-i},{x:e.x-i,y:e.y+i});break}return r}function OE(e){const{top:t,right:i,bottom:r,left:s}=e;return[{x:s,y:t},{x:i,y:t},{x:i,y:r},{x:s,y:r}]}function FE(e,t){const{x:i,y:r}=e;let s=!1;for(let n=0,o=t.length-1;n<t.length;o=n++){const c=t[n],l=t[o],d=c.x,u=c.y,h=l.x,g=l.y;u>r!=g>r&&i<(h-d)*(r-u)/(g-u)+d&&(s=!s)}return s}function NE(e){const t=e.slice();return t.sort((i,r)=>i.x<r.x?-1:i.x>r.x?1:i.y<r.y?-1:i.y>r.y?1:0),LE(t)}function LE(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r<e.length;r++){const s=e[r];for(;t.length>=2;){const n=t[t.length-1],o=t[t.length-2];if((n.x-o.x)*(s.y-o.y)>=(n.y-o.y)*(s.x-o.x))t.pop();else break}t.push(s)}t.pop();const i=[];for(let r=e.length-1;r>=0;r--){const s=e[r];for(;i.length>=2;){const n=i[i.length-1],o=i[i.length-2];if((n.x-o.x)*(s.y-o.y)>=(n.y-o.y)*(s.x-o.x))i.pop();else break}i.push(s)}return i.pop(),t.length===1&&i.length===1&&t[0].x===i[0].x&&t[0].y===i[0].y?t:t.concat(i)}var BE=mw,UE=pw,qE=gw,vw=fw;const zE=BE,_6=UE,I6=qE,WE=p.forwardRef(({className:e,sideOffset:t=4,...i},r)=>a.jsx(vw,{ref:r,sideOffset:t,className:Rt("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
209de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...i}));WE.displayName=vw.displayName;const $E=j0("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline",cta:"bg-accent text-accent-foreground shadow-[var(--shadow-glow)] hover:bg-accent/90 hover:-translate-y-0.5 transition-all duration-200",hero:"bg-white text-primary hover:bg-white/90 hover:-translate-y-0.5 transition-all duration-200 shadow-lg",outlineLight:"border border-white/30 bg-white/5 text-white backdrop-blur hover:bg-white/10"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-12 rounded-md px-8 text-base",xl:"h-14 roun
209ded-md px-10 text-base",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),ge=p.forwardRef(({className:e,variant:t,size:i,asChild:r=!1,...s},n)=>{const o=r?kC:"button";return a.jsx(o,{className:Rt($E({variant:t,size:i,className:e})),ref:n,...s})});ge.displayName="Button";const Wm="bgc_consent_v1",HE=new Set(["AT","BE","BG","HR","CY","CZ","DK","EE","FI","FR","DE","GR","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","RO","SK","SI","ES","SE","IS","LI","NO","GB","GG","JE","IM","CH"]),lf=(...e)=>{if(typeof window>"u")return;const t=window;t.dataLayer=t.dataLayer||[],t.dataLayer.push(e)},dc=e=>{var t;lf("consent","update",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:e,functionality_storage:e,personalization_storage:e}),lf("set","ads_data_redaction",e!=="granted"),typeof window<"u"&&((t=window.dataLayer)==null||t.push({event:"consent_resolved",consent_state:e}))},VE=()=>{var e;if(typeof window>"u")return null;try{const t=(e=window.localStorage)==null?void 0:e.getItem(Wm);return t==="granted"||t==="denied"?t:null}catch{return null}},df=e=>{var t;if(!(typeof window>"u"))try{(t=window.localStorage)==null||t.setItem(Wm,e)}catch{}},GE=async()=>{if(typeof fetch>"u")return!0;try{const e=new AbortController,t=setTimeout(()=>e.abort(),2e3),i=await fetch("/cdn-cgi/trace",{signal:e.signal,cache:"no-store"});if(clearTimeout(t),!i.ok)return!0;const r=await i.text(),s=/^loc=([A-Z0-9]{2})$/m.exec(r.trim()),n=s==null?void 0:s[1];return!n||n==="XX"||n==="T1"?!0:HE.has(n)}catch{return!0}},lh="bgc:consent-reopen",j6=()=>{var e;if(!(typeof window>"u")){try{(e=window.localStorage)==null||e.removeItem(Wm)}catch{}dc("denied"),window.dispatchEvent(new CustomEvent(lh))}},KE=()=>{const[e,t]=p.useState(!1);p.useEffect(()=>{let r=!1;const s=VE();if(s){dc(s);return}return GE().then(n=>{r||(n?t(!0):(dc("granted"),df("granted")))}),()=>{r=!0}},[]),p.useEffect(()=>{const r=()=>t(!0);return window.addEventListener(lh,r),()=>window.removeEventListener(lh,r)},[]);const i=p.useCallback(r=>{dc(r),df(r),t(!1)},[]);return e?a.jsx("div",{role:"dialog","aria-modal":"false","aria-label":"Cookie and measurement consent",className:"fixed inset-x-0 bottom-0 z-50 border-t border-border bg-card px-4 py-4 shadow-[0_-4px_24px_rgba(0,0,0,0.12)]",style:{paddingBottom:"calc(env(safe-area-inset-bottom, 0px) + 1rem)"},children:a.jsxs("div",{className:"container-x flex flex-col gap-4 md:flex-row md:items-center md:justify-between",children:[a.jsxs("p",{className:"max-w-3xl text-sm text-muted-foreground",children:["We use cookies and similar technologies to measure how our site and advertising perform. You can accept or decline. Declining keeps the site fully usable and only turns off measurement. See our"," ",a.jsx(H,{to:"/privacy-policy",className:"font-medium text-foreground underline underline-offset-4",children:"privacy policy"}),"."]}),a.jsxs("div",{className:"flex shrink-0 gap-3",children:[a.jsx(ge,{variant:"outline",size:"sm",className:"min-w-28",onClick:()=>i("denied"),children:"Decline"}),a.jsx(ge,{size:"sm",className:"min-w-28",onClick:()=>i("granted"),children:"Accept"})]})]})}):null},U=e=>t=>a.jsx("svg",{viewBox:"0 0 24 24",width:t.width??24,height:t.height??24,fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",xmlns:"http://www.w3.org/2000/svg",...t,children:e}),so="M12 2.75 4.5 5.5v6.2c0 4.2 3 7.5 7.5 9.55 4.5-2.05 7.5-5.35 7.5-9.55V5.5L12 2.75Z",QE=U(a.jsx("path",{d:so})),XE=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:so}),a.jsx("path",{d:"M8.6 12.1 11 14.5l4.4-4.6"})]})),JE=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:so}),a.jsx("path",{d:"M12 8v4.6"}),a.jsx("path",{d:"M12 16.1h.01"})]})),YE=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:so}),a.jsx("path",{d:"M9.6 9.8 14.4 14.6M14.4 9.8 9.6 14.6"})]})),ww=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:so}),a.jsx("path",{d:"M10.2 10.1a1.9 1.9 0 1 1 2.6 1.8c-.5.2-.8.7-.8 1.3v.4"}),a.jsx("path",{d:"M12 16.3h.01"})]})),ls="M12 2.9 20 7.4v9.2L12 21.1 4 16.6V7.4l8-4.5Z",Ll=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:ls}),a.jsx("path",{d:"M8.4 12.1 10.9 14.6l4.7-5"})]})),ZE=Ll,eP=Ll,tP=Ll,kw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:ls}),a.jsx("path",{d:"M9.5 9.5 14.5 14.5M14.5 9.5 9.5 14.5"})]})),iP=kw,xw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M10.4 3.7 2.9 17.1a1.85 1.85 0 0 0 1.6 2.8h15a1.85 1.85 0 0 0 1.6-2.8L13.6 3.7a1.85 1.85 0 0 0-3.2 0Z"}),a.jsx("path",{d:"M12 9.3v4.1"}),a.jsx("path",{d:"M12 16.7h.01"})]})),Aw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:ls}),a.jsx("path",{d:"M12 7.9v4.4"}),a.jsx("path",{d:"M12 15.8h.01"})]})),rP=Aw,sP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:ls}),a.jsx("path",{d:"M12 16.1v-4.4"}),a.jsx("path",{d:"M12 8.3h.01"})]})),nP=ww,Dn=a.jsx("path",{d:"M5.5 3.25h8L18.5 8v12.75H5.5V3.25Z"}),Tn=a.jsx("path",{d:"M13.5 3.25V8h5"}),aP=U(a.jsxs(a.Fragment,{children:[Dn,Tn,a.jsx("path",{d:"M8.4 12h7.2M8.4 15h7.2M8.4 18h4.6"})]})),$m=U(a.jsxs(a.Fragment,{children:[Dn,Tn,a.jsx("path",{d:"M8.4 12h4"}),a.jsx("path",{d:"M8.4 16.4 10.3 18.3l4-4.2"})]})),oP=$m,cP=$m,lP=U(a.jsxs(a.Fragment,{children:[Dn,Tn,a.jsx("path",{d:"M8.4 12h5"}),a.jsx("path",{d:"M8.4 18.1c1.6-2.6 2.6-2.6 3.5 0 .9-2.6 2-2.6 3.7 0"})]})),Hm=U(a.jsxs(a.Fragment,{children:[Dn,Tn,a.jsx("circle",{cx:"11.4",cy:"15.1",r:"2.6"}),a.jsx("path",{d:"M13.4 17.2 15.8 19.4"})]})),dP=Hm,uP=Hm,hP=U(a.jsxs(a.Fragment,{children:[Dn,Tn,a.jsx("path",{d:"M12 12.2v3.1"}),a.jsx("path",{d:"M12 18h.01"})]})),mP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M6 3.5h11a1.5 1.5 0 0 1 1.5 1.5v13a2.5 2.5 0 0 1-2.5 2.5H7.5A2.5 2.5 0 0 1 5 18V6.6"}),a.jsx("path",{d:"M5 6.6H2.9A1.4 1.4 0 0 1 4.3 3.5H6"}),a.jsx("path",{d:"M8.8 8.5h6.4M8.8 12h6.4M8.8 15.5h4"})]})),pP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M9 4.2H6.7A1.7 1.7 0 0 0 5 5.9v13.2a1.7 1.7 0 0 0 1.7 1.7h10.6a1.7 1.7 0 0 0 1.7-1.7V5.9a1.7 1.7 0 0 0-1.7-1.7H15"}),a.jsx("path",{d:"M9 2.9h6v2.9H9V2.9Z"}),a.jsx("path",{d:"M8.6 10.6h6.8M8.6 13.8h6.8M8.6 17h4"})]})),gP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M9 4.2H6.7A1.7 1.7 0 0 0 5 5.9v13.2a1.7 1.7 0 0 0 1.7 1.7h10.6a1.7 1.7 0 0 0 1.7-1.7V5.9a1.7 1.7 0 0 0-1.7-1.7H15"}),a.jsx("path",{d:"M9 2.9h6v2.9H9V2.9Z"}),a.jsx("path",{d:"M8.6 14.2 10.7 16.3l4.7-5"})]})),Sw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M3.2 6.4 4.8 8l3-3.2"}),a.jsx("path",{d:"M3.2 12.4 4.8 14l3-3.2"}),a.jsx("path",{d:"M3.2 18.4 4.8 20l3-3.2"}),a.jsx("path",{d:"M11.4 6.6h9.4M11.4 12.6h9.4M11.4 18.6h6.4"})]})),fP=Sw,Vm=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 6.6C10.3 5.1 8.2 4.4 5.4 4.4A1.4 1.4 0 0 0 4 5.8v11.4a1.4 1.4 0 0 0 1.4 1.4c2.8 0 4.9.7 6.6 2.2 1.7-1.5 3.8-2.2 6.6-2.2a1.4 1.4 0 0 0 1.4-1.4V5.8a1.4 1.4 0 0 0-1.4-1.4c-2.8 0-4.9.7-6.6 2.2Z"}),a.jsx("path",{d:"M12 6.6v14.2"})]})),yP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 6.6C10.3 5.1 8.2 4.4 5.4 4.4A1.4 1.4 0 0 0 4 5.8v11.4a1.4 1.4 0 0 0 1.4 1.4c2.8 0 4.9.7 6.6 2.2 1.7-1.5 3.8-2.2 6.6-2.2a1.4 1.4 0 0 0 1.4-1.4v-4.1"}),a.jsx("path",{d:"M12 6.6v14.2"}),a.jsx("path",{d:"M15.4 7.6 17.3 9.5l3.5-3.7"})]})),bP=Vm,vP=Vm,wP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M9.4 5.6C6.3 6.9 4.6 9.4 4.6 13v5.4h5.9V12H7.7c0-2.2.9-3.7 2.7-4.6l-1-1.8Z"}),a.jsx("path",{d:"M18.2 5.6c-3.1 1.3-4.8 3.8-4.8 7.4v5.4h5.9V12h-2.8c0-2.2.9-3.7 2.7-4.6l-1-1.8Z"})]})),kP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M3.4 5.8h13.2v13.4H5.4a2 2 0 0 1-2-2V5.8Z"}),a.jsx("path",{d:"M16.6 8.6h2.6a1.4 1.4 0 0 1 1.4 1.4v7.2a2 2 0 0 1-2 2h-1.9"}),a.jsx("path",{d:"M6.2 8.8h7.2v3.4H6.2V8.8Z"}),a.jsx("path",{d:"M6.2 15h7.2M6.2 17.2h4.4"})]})),xP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M2.8 8.6 12 4.4l9.2 4.2L12 12.8 2.8 8.6Z"}),a.jsx("path",{d:"M6.6 10.5v4.8c0 1.5 2.4 2.8 5.4 2.8s5.4-1.3 5.4-2.8v-4.8"}),a.jsx("path",{d:"M21.2 8.6v5.2"})]})),AP=U(a.jsx(a.Fragment,{children:a.jsx("path",{d:"M2.6 12.4h3.6l2-5.4 3.2 10.4 2.4-7 1.6 3.4h6"})})),SP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 20.4S3.6 15.7 3.6 9.6a4.6 4.6 0 0 1 8.4-2.6 4.6 4.6 0 0 1 8.4 2.6c0 6.1-8.4 10.8-8.4
20910.8Z"}),a.jsx("path",{d:"M4.4 12.2h3.2l1.6-3 2.4 5.4 1.8-3.6 1 1.2h4.8"})]})),CP=U(a.jsx("path",{d:"M12 20.4S3.6 15.7 3.6 9.6a4.6 4.6 0 0 1 8.4-2.6 4.6 4.6 0 0 1 8.4 2.6c0 6.1-8.4 10.8-8.4 10.8Z"})),DP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M5 3.2v5.1a4.1 4.1 0 0 0 8.2 0V3.2"}),a.jsx("path",{d:"M3.4 3.2h3.2M11.6 3.2h3.2"}),a.jsx("path",{d:"M9.1 12.4v2.2a5 5 0 0 0 10 0v-1.4"}),a.jsx("circle",{cx:"19.1",cy:"10.6",r:"2.4"})]})),TP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M10.4 3.4h3.2l1.4 7.4h-6l1.4-7.4Z"}),a.jsx("path",{d:"M8.6 10.8h6.8"}),a.jsx("path",{d:"M15.4 6.6a5.8 5.8 0 0 1 1.4 11"}),a.jsx("path",{d:"M4.6 20.6h15"}),a.jsx("path",{d:"M7.4 20.6c0-3 2.2-5.2 5-5.2"})]})),EP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M9.6 3.2v6.1L4.4 18a1.7 1.7 0 0 0 1.5 2.6h12.2a1.7 1.7 0 0 0 1.5-2.6l-5.2-8.7V3.2"}),a.jsx("path",{d:"M8.2 3.2h7.6"}),a.jsx("path",{d:"M6.9 14.6h10.2"})]})),PP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M6.9 17.1 17.1 6.9a3.6 3.6 0 1 0-5.1-5.1v0L1.8 12a3.6 3.6 0 0 0 5.1 5.1Z",transform:"translate(2.5 2.5) scale(0.86)"}),a.jsx("path",{d:"M9.4 9.4 14.6 14.6"})]})),Cw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 2.9 14.6 5l3.3-.3-.3 3.3 2.1 2.6-2.1 2.6.3 3.3-3.3-.3L12 18.3 9.4 16.2l-3.3.3.3-3.3L4.3 10.6 6.4 8l-.3-3.3L9.4 5 12 2.9Z"}),a.jsx("path",{d:"M8.6 18.1 7.2 22.3l4.8-2 4.8 2-1.4-4.2"})]})),_P=Cw,IP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M7 4h10v5.2a5 5 0 0 1-10 0V4Z"}),a.jsx("path",{d:"M7 5.6H4.4v1.6A3.2 3.2 0 0 0 7.6 10.4M17 5.6h2.6v1.6a3.2 3.2 0 0 1-3.2 3.2"}),a.jsx("path",{d:"M12 14.4v3.4M8.6 20.6h6.8l-.8-2.8H9.4l-.8 2.8Z"})]})),jP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 3.2 13.5 8 18.4 9.5 13.5 11 12 15.8 10.5 11 5.6 9.5 10.5 8 12 3.2Z"}),a.jsx("path",{d:"M18.4 15.2l.7 2 2 .7-2 .7-.7 2-.7-2-2-.7 2-.7.7-2Z"})]})),MP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:ls}),a.jsx("path",{d:"M12 7.2v2M12 15v1.8M7.2 12h2M14.8 12h2"}),a.jsx("circle",{cx:"12",cy:"12",r:"2.4"})]})),RP=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"12",cy:"12",r:"7.6"}),a.jsx("path",{d:"M12 1.9v4.6M12 17.5v4.6M1.9 12h4.6M17.5 12h4.6"}),a.jsx("circle",{cx:"12",cy:"12",r:"1.4"})]})),OP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M20 12a8 8 0 1 1-4.6-7.2"}),a.jsx("path",{d:"M16.4 12a4.4 4.4 0 1 1-2.6-4"}),a.jsx("path",{d:"M12 12 20.4 4.4"}),a.jsx("circle",{cx:"12",cy:"12",r:"1.1"})]})),FP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:ls}),a.jsx("path",{d:"M15.1 8.9 13.4 13.4 8.9 15.1 10.6 10.6 15.1 8.9Z"})]})),NP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M3.6 18.4a9.4 9.4 0 1 1 16.8 0"}),a.jsx("path",{d:"M12 18.4 16.2 10.6"}),a.jsx("circle",{cx:"12",cy:"18.4",r:"1.3"})]})),LP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M3 18.2 9.2 12l3.4 3.4L21 7"}),a.jsx("path",{d:"M15.6 7H21v5.4"})]})),BP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M3 7 9.2 13.2l3.4-3.4L21 18.2"}),a.jsx("path",{d:"M15.6 18.2H21v-5.4"})]})),UP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 3.4v17.2M7.4 20.6h9.2"}),a.jsx("path",{d:"M6.2 7.4h11.6"}),a.jsx("path",{d:"M6.2 7.4 3 14.2h6.4L6.2 7.4Z"}),a.jsx("path",{d:"M17.8 7.4 14.6 14.2H21l-3.2-6.8Z"})]})),qP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M13.6 3.6 20.4 10.4l-2.4 2.4-6.8-6.8 2.4-2.4Z"}),a.jsx("path",{d:"M10.4 8.2 4.2 14.4a2.2 2.2 0 0 0 3.1 3.1l6.2-6.2"}),a.jsx("path",{d:"M11.6 20.6h9.2"})]})),zP=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"9.2",cy:"8",r:"3.4"}),a.jsx("path",{d:"M3.2 20.4c0-3.4 2.7-5.8 6-5.8s6 2.4 6 5.8"}),a.jsx("path",{d:"M15.4 5.1a3.4 3.4 0 0 1 0 6.5"}),a.jsx("path",{d:"M17.2 15.2c2.2.7 3.6 2.6 3.6 5.2"})]})),WP=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"12",cy:"8",r:"3.6"}),a.jsx("path",{d:"M5.2 20.6c0-3.7 3-6.4 6.8-6.4s6.8 2.7 6.8 6.4"})]})),$P=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"10",cy:"8",r:"3.6"}),a.jsx("path",{d:"M3.4 20.6c0-3.7 3-6.4 6.6-6.4 1.1 0 2.1.2 3 .6"}),a.jsx("path",{d:"M14.6 17.6 16.9 19.9l4-4.4"})]})),Dw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M2.8 10.2 6.4 7h4.2l2.2 2-2 1.7a1.7 1.7 0 0 1-2.3-.1L7.4 9.4"}),a.jsx("path",{d:"M12.8 9 15 7h2.6l3.6 3.2"}),a.jsx("path",{d:"M21.2 10.2v4.2l-3.4 2.9-2.4-2.1"}),a.jsx("path",{d:"M2.8 10.2v4.2L6.2 17.3l6.4.1 2.8-2.2"})]})),HP=Dw,Tw=U(a.jsxs(a.Fragment,{children:[a.jsx("rect",{x:"6.4",y:"6.4",width:"11.2",height:"11.2",rx:"1.4"}),a.jsx("rect",{x:"9.8",y:"9.8",width:"4.4",height:"4.4",rx:"0.8"}),a.jsx("path",{d:"M9.4 3.2v3.2M14.6 3.2v3.2M9.4 17.6v3.2M14.6 17.6v3.2"}),a.jsx("path",{d:"M3.2 9.4h3.2M3.2 14.6h3.2M17.6 9.4h3.2M17.6 14.6h3.2"})]})),VP=Tw,GP=U(a.jsxs(a.Fragment,{children:[Dn,Tn,a.jsx("path",{d:"M10.4 13.2 8.6 15.4l1.8 2.2M13.6 13.2l1.8 2.2-1.8 2.2"})]})),KP=U(a.jsxs(a.Fragment,{children:[a.jsx("rect",{x:"9.4",y:"2.8",width:"5.2",height:"4.4",rx:"1"}),a.jsx("rect",{x:"2.6",y:"16.8",width:"5.2",height:"4.4",rx:"1"}),a.jsx("rect",{x:"16.2",y:"16.8",width:"5.2",height:"4.4",rx:"1"}),a.jsx("path",{d:"M12 7.2v4.4M5.2 16.8v-3a1.4 1.4 0 0 1 1.4-1.4h10.8a1.4 1.4 0 0 1 1.4 1.4v3"})]})),Ew=U(a.jsxs(a.Fragment,{children:[a.jsx("rect",{x:"2.8",y:"3.2",width:"6.6",height:"5.2",rx:"1.2"}),a.jsx("rect",{x:"14.6",y:"15.6",width:"6.6",height:"5.2",rx:"1.2"}),a.jsx("path",{d:"M6.1 8.4v6.4a2 2 0 0 0 2 2h6.5"}),a.jsx("path",{d:"M12.6 14.4 14.9 16.8 12.6 19.2"})]})),QP=Ew,Pw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M6.6 4.6v14.8"}),a.jsx("circle",{cx:"6.6",cy:"19.4",r:"2"}),a.jsx("circle",{cx:"6.6",cy:"4.6",r:"2"}),a.jsx("circle",{cx:"17.4",cy:"8.4",r:"2"}),a.jsx("path",{d:"M15.4 8.4H11a4.4 4.4 0 0 0-4.4 4.4"})]})),XP=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"6.4",cy:"17.6",r:"2"}),a.jsx("circle",{cx:"17.6",cy:"6.4",r:"2"}),a.jsx("path",{d:"M6.4 15.6V9.4a3 3 0 0 1 3-3h6.2"}),a.jsx("path",{d:"M13.4 4.2 15.8 6.4 13.4 8.6"}),a.jsx("path",{d:"M17.6 8.4v6.2a3 3 0 0 1-3 3H8.4"}),a.jsx("path",{d:"M10.6 15.4 8.2 17.6l2.4 2.2"})]})),JP=Pw,YP=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M4.4 6c0-1.6 3.4-2.9 7.6-2.9S19.6 4.4 19.6 6s-3.4 2.9-7.6 2.9S4.4 7.6 4.4 6Z"}),a.jsx("path",{d:"M4.4 6v12c0 1.6 3.4 2.9 7.6 2.9s7.6-1.3 7.6-2.9V6"}),a.jsx("path",{d:"M4.4 12c0 1.6 3.4 2.9 7.6 2.9s7.6-1.3 7.6-2.9"})]})),ZP=U(a.jsxs(a.Fragment,{children:[a.jsx("rect",{x:"3.2",y:"3.6",width:"17.6",height:"6.2",rx:"1.4"}),a.jsx("rect",{x:"3.2",y:"14.2",width:"17.6",height:"6.2",rx:"1.4"}),a.jsx("path",{d:"M6.8 6.7h.01M6.8 17.3h.01"}),a.jsx("path",{d:"M10.4 6.7h6.8M10.4 17.3h6.8"})]})),_w=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 2.8 21.2 7.4 12 12 2.8 7.4 12 2.8Z"}),a.jsx("path",{d:"M2.8 12.2 12 16.8l9.2-4.6"}),a.jsx("path",{d:"M2.8 16.8 12 21.4l9.2-4.6"})]})),e_=_w,t_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 2.9 20.4 7v10L12 21.1 3.6 17V7L12 2.9Z"}),a.jsx("path",{d:"M3.6 7 12 11.2 20.4 7"}),a.jsx("path",{d:"M12 11.2v9.9"}),a.jsx("path",{d:"M7.8 4.9 16.2 9.1"})]})),i_=U(a.jsxs(a.Fragment,{children:[a.jsx("rect",{x:"4.4",y:"10.2",width:"15.2",height:"10.4",rx:"1.6"}),a.jsx("path",{d:"M8 10.2V7.6a4 4 0 0 1 8 0v2.6"}),a.jsx("path",{d:"M12 14v3"})]})),r_=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"8",cy:"8",r:"4.4"}),a.jsx("path",{d:"M11.1 11.1 20.6 20.6"}),a.jsx("path",{d:"M17.4 17.4 19.4 15.4M14.6 14.6 16.6 12.6"})]})),s_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M1.9 12S5.6 5.6 12 5.6 22.1 12 22.1 12 18.4 18.4 12 18.4 1.9 12 1.9 12Z"}),a.jsx("circle",{cx:"12",cy:"12",r:"2.9"})]})),n_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M4.2 8.2C2.7 9.7 1.9 12 1.9 12s3.7 6.4 10.1 6.4c1.6 0 3-.4 4.2-1"}),a.jsx("path",{d:"M9.4 6C10.2 5.7 11.1 5.6 12 5.6c6.4 0 10.1 6.4 10.1 6.4s-1.1 1.9-3.1 3.6"}),a.jsx("path",{d:"M9.9 9.9a2.9 2.9 0 0 0 4.2 4.2"}),a.jsx("path",{d:"M3.2 3.2 20.8 20.8"})]})),a_=U(a.jsxs(a.Fragment,{children:[a.jsx("rect",{x:"7.6",y:"7.4",width:"8.8",height:"12",rx:"4.4"}),a.jsx("path",{d:"M9.4 7.4a2.6 2.6 0 0 1 5.2 0"}),a.jsx("path",{d:"M7.6 11.4H4.2M7.6 15.4H4.4M16.4 11.4h3.4M16.4 15.4h3.2"}),a.jsx("path",{d:"M8.4 8.2 6.2 5.6M15.6 8.2l2.2-2.6"}),a.jsx("path",{d:"M12 11.4v6"})]})),o_=xw,c_=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"12",cy:"12",r:"9"}),a.jsx("circle",{cx:"12",cy:"12",r:"2.2"}),a.jsx("path",{d:"M12 9.8 9.6 5.4a7.6 7.6 0 0 1 4.8 0L12 9.8Z"}),a.jsx("path",{d:"M13.9 13.1l4.9.6a7.6 7.6 0 0 1-2.4 4.1l-2.5-4.7Z"}
209),a.jsx("path",{d:"M10.1 13.1 7.6 17.8a7.6 7.6 0 0 1-2.4-4.1l4.9-.6Z"})]})),Iw=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:ls}),a.jsx("path",{d:"M12 7.6V12l3 1.9"})]})),l_=Iw,d_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M3.4 12a8.6 8.6 0 1 0 2.7-6.3"}),a.jsx("path",{d:"M3.2 3.6v4.4h4.4"}),a.jsx("path",{d:"M12 7.8V12l3 1.8"})]})),u_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M8.6 16.4a5.9 5.9 0 1 1 6.8 0v1.9H8.6v-1.9Z"}),a.jsx("path",{d:"M9.8 20.6h4.4"}),a.jsx("path",{d:"M12 8.6v4.6"})]})),h_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M11.2 4.2a3 3 0 0 0-5.5 1.6 3 3 0 0 0-1.5 5.1 3.1 3.1 0 0 0 .7 5 3 3 0 0 0 5.5 2.1"}),a.jsx("path",{d:"M12.8 4.2a3 3 0 0 1 5.5 1.6 3 3 0 0 1 1.5 5.1 3.1 3.1 0 0 1-.7 5 3 3 0 0 1-5.5 2.1"}),a.jsx("path",{d:"M12 4v16.4"})]})),m_=U(a.jsx("path",{d:"M13.6 2.4 4.8 13.4h5.6l-.6 8.2 9-11.2h-5.8l.6-8Z"})),p_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 2.6c3.2 2.4 5 6 5 10.2l-2.2 3.4H9.2L7 12.8C7 8.6 8.8 5 12 2.6Z"}),a.jsx("circle",{cx:"12",cy:"10",r:"1.9"}),a.jsx("path",{d:"M9.2 16.2 6.4 18.6l.6 3 3.2-1.4M14.8 16.2l2.8 2.4-.6 3-3.2-1.4"})]})),g_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M12 20.6v-7.2"}),a.jsx("path",{d:"M12 13.4C12 9.8 9.2 7 5.6 7c0 3.6 2.8 6.4 6.4 6.4Z"}),a.jsx("path",{d:"M12.6 13.4c0-3 2.4-5.4 5.4-5.4 0 3-2.4 5.4-5.4 5.4Z"})]})),jw=U(a.jsx(a.Fragment,{children:a.jsx("path",{d:"M20.1 5.1a5.5 5.5 0 0 1-7.3 7.3l-7.1 7.1a2 2 0 0 1-2.9-2.9l7.1-7.1a5.5 5.5 0 0 1 7.3-7.3l-3 3 2.9 2.9 3-3Z"})})),f_=jw,y_=U(a.jsxs(a.Fragment,{children:[a.jsx("circle",{cx:"12",cy:"12",r:"2.1"}),a.jsx("path",{d:"M8.4 8.4a5 5 0 0 0 0 7.2M15.6 15.6a5 5 0 0 0 0-7.2"}),a.jsx("path",{d:"M5.6 5.6a9 9 0 0 0 0 12.8M18.4 18.4a9 9 0 0 0 0-12.8"})]})),b_=U(a.jsxs(a.Fragment,{children:[a.jsx("path",{d:"M3.2 9.2a13 13 0 0 1 17.6 0"}
209),a.jsx("path",{d:"M6.4 12.6a8.4 8.4 0 0 1 11.2 0"}),a.jsx("path",{d:"M9.6 16a3.8 3.8 0 0 1 4.8 0"}),a.jsx("path",{d:"M12 19.4h.01"})]})),v_=U(a.jsx("path",{d:"M7.4 7.4 16.6 16.6 12 20.4V3.6l4.6 3.8L7.4 16.6"})),M=e=>e,M6=M(QE),Yt=M(XE),uf=M(JE),R6=M(YE),w_=M(ww),Wn=M(Ll),O6=M(ZE),F6=M(eP),N6=M(tP),L6=M(kw),B6=M(iP),k_=M(xw),U6=M(Aw),q6=M(rP),z6=M(sP),W6=M(nP),$6=M(o_),x_=M(aP),H6=M(oP),Xc=M($m),A_=M(cP),S_=M(lP),hf=M(Hm),Mw=M(hP),C_=M(GP),V6=M(dP),G6=M(uP),K6=M(mP),D_=M(pP),Jc=M(gP),Q6=M(Sw),X6=M(fP),Od=M(Vm),J6=M(yP),Y6=M(vP),Z6=M(bP),eN=M(wP),tN=M(kP),iN=M(xP),Rw=M(AP),T_=M(CP),E_=M(SP),Gm=M(DP),Ow=M(TP),P_=M(EP),__=M(PP),I_=M(c_),j_=M(Cw),rN=M(_P),Fd=M(IP),sN=M(jP),M_=M(MP),R_=M(RP),nN=M(OP),O_=M(FP),F_=M(NP),aN=M(LP),oN=M(BP),cN=M(UP),lN=M(qP),dN=M(zP),uN=M(WP),hN=M($P),mN=M(Dw),pN=M(HP),gN=M(Tw),N_=M(VP),L_=M(KP),Km=M(Ew),B_=M(QP),U_=M(Pw),q_=M(XP),fN=M(JP),yN=M(YP),Nd=M(ZP),z_=M(_w),Fw=M(e_),W_=M(t_),bN=M(i_),$_=M(r_),H_=M(s_),vN=M(n_),V_=M(a_),mf=M(Iw),wN=M(l_),Nw=M(d_),kN=M(u_),Yc=M(h_),xN=M(m_),AN=M(p_),SN=M(g_),G_=M(jw),CN=M(f_),K_=M(y_),pf=M(b_),Q_=M(v_),X_="/assets/logo-goat-DcrVnfuO.png",J_="data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='256'%20cy='256'%20r='200'%20fill='none'%20stroke='%2317365D'%20stroke-width='16'%20stroke-linecap='round'%20stroke-dasharray='268.78%2045.38'%20stroke-dashoffset='-22.69'/%3e%3cline%20x1='452.0'%20y1='256.0'%20x2='490.0'%20y2='256.0'%20stroke='%2317365D'%20stroke-width='14'%20stroke-linecap='round'/%3e%3cline%20x1='256.0'%20y1='452.0'%20x2='256.0'%20y2='490.0'%20stroke='%2317365D'%20stroke-width='14'%20stroke-linecap='round'/%3e%3cline%20x1='60.0'%20y1='256.0'%20x2='22.0'%20y2='256.0'%20stroke='%2317365D'%20stroke-width='14'%20stroke-linecap='round'/%3e%3cline%20x1='256.0'%20y1='60.0'%20x2='256.0'%20y2='22.0'%20stroke='%2317365D'%20stroke-width='14'%20stroke-linecap='round'/%3e%3ccircle%20cx='256'%20cy='256'%20r='140'%20fill='%2317365D'/%3e%3crect%20x='151'%20y='224'%20width='210'%20height='64'%20rx='30'%20fill='%232993FD'/%3e%3crect%20x='108'%20y='108'%20width='26'%20height='26'%20fill='%232993FD'%20opacity='1.0'/%3e%3crect%20x='78'%20y='142'%20width='20'%20height='20'%20fill='%232993FD'%20opacity='0.75'/%3e%3crect%20x='140'%20y='78'%20width='20'%20height='20'%20fill='%232993FD'%20opacity='0.75'/%3e%3crect%20x='52'%20y='176'%20width='14'%20height='14'%20fill='%232993FD'%20opacity='0.5'/%3e%3crect%20x='176'%20y='52'%20width='14'%20height='14'%20fill='%232993FD'%20opacity='0.5'/%3e%3crect%20x='96'%20y='62'%20width='12'%20height='12'%20fill='%232993FD'%20opacity='0.4'/%3e%3crect%20x='62'%20y='96'%20width='12'%20height='12'%20fill='%232993FD'%20opacity='0.4'/%3e%3c/svg%3e",Fo=[{name:"Intuitive Surgical",src:"/clients/intuitive-logo.png",scale:1},{name:"bioMérieux",src:"/clients/biomerieux-logo.png",scale:1.5},{name:"Inogen",src:"/clients/inogen-logo.png",scale:1.4},{name:"Natera",src:"/clients/natera-logo.png",scale:.95},{name:"Velico Medical",src:"/clients/velico-logo.png",scale:1},{name:"Medivis",src:"/clients/medivis-logo.svg",scale:1},{name:"Spiro Robotics",src:"/clients/spiro-logo.png",scale:1.15},{name:"Nova Biomedical",src:"/clients/nova-biomedical-logo.svg",scale:1.1},{name:"VitalConnect",src:"/clients/vitalconnect-logo.png",scale:1.05}],Y_="/assets/scott-odland-pgVCvQEn.jpg",Z_="/assets/tim-sandberg-BhQF4aJw.jpg",Qs={name:"Blue Goat Cyber",tagline:"Medical Device Cybersecurity",meetingUrl:"https://go.bluegoatcyber.com/meetings/blue-goat-cyber/discovery-session",email:"[email protected]",phone:"+1 (844) 939-4628",founded:2014},gf=[{label:"Services",to:"/services"},{label:"Products",to:"/products/goatwatch"},{label:"Journey",to:"/journey"},{label:"About",to:"/about"},{label:"Resources",to:"/resources"}],eI=[{value:"275+",label:"FDA submissions cleared",sublabel:"Premarket and postmarket - across 510(k), De Novo, and PMA pathways.",icon:"FileCheck"},{value:"0",label:"Cyber rejections",sublabel:"Not one FDA cybersecurity rejection in the firm's history.",icon:"ShieldCheck"},{value:"100%",label:"Deficiency commitment",sublabel:"Every submission we've owned has cleared FDA
209cybersecurity review.",icon:"Trophy"},{value:"24/7",label:"Named-team support",sublabel:"Continuous monitoring for cleared devices - not a help desk, a named team.",icon:"Clock"}],tI=["FDA 2026 Premarket Guidance","ANSI/AAMI SW96","ISO 13485","ISO 14971","FDA Section 524B","AAMI TIR57","AAMI TIR97","IEC 81001-5-1","IEC 62443-4-1","IEC 62304","NIST 800-115","ISO 27001","UL 2900"],uc=[{slug:"fda-premarket-cybersecurity-services",title:"Full-Service FDA Premarket Cybersecurity",short:"Full-service: we own 100% of SPDF, SBOMs, threat modeling, pen testing, and eSTAR documentation.",icon:Xc,category:"Premarket",group:"FDA Submissions",description:"Full-service, end-to-end: we deliver 100% of the artifacts FDA reviewers expect for 510(k), De Novo, PMA, PDP, and HDE submissions under §524B, plus IDE applications under 21 CFR 812 and the FDA's February 3, 2026 premarket guidance - traceable, complete, and current.",bullets:["Secure Product Development Framework (SPDF)","SBOM generation and vulnerability triage","Threat modeling aligned to ANSI/AAMI SW96 + ISO 14971","eSTAR-ready cybersecurity documentation"]},{slug:"fda-cybersecurity-deficiency-response",title:"FDA Deficiency Response",short:"Got an FDA hold or AI letter? We close cybersecurity deficiencies fast.",icon:Mw,category:"Premarket",group:"FDA Submissions",description:"Rapid-response team that resolves FDA cybersecurity deficiencies on the first resubmission - across 510(k), De Novo, PMA, and HDE.",bullets:["24-hour gap analysis: We map every item in the deficiency letter against the specific FDA guidance section it references - so the response addresses what reviewers actually want, not what the letter superficially says.","Remediation package: Every artifact identified in the gap analysis is rebuilt or updated - SPDF sections, SBOM, test evidence, or threat model - formatted for the eSTAR template and traceable to the deficiency items.","Reviewer-ready response: The final package is structured for the FDA reviewer who issued the letter - changes are flagged, justified, and cross-referenced so they can close the deficiency without a second round.","Post-submission support: We stay on the engagement until the deficiency is resolved - if FDA responds with a second round, we address it at no additional cost."]},{slug:"fda-compliant-sbom-services-for-medtech",title:"FDA-Compliant SBOM Services",short:"Create, validate, and maintain SBOMs for premarket and postmarket.",icon:Fw,category:"Premarket",group:"FDA Submissions",description:"Machine- and human-readable SBOMs with NTIA minimum elements (superseded by CISA's 2026 Minimum Elements for an SBOM, published July 29, 2026), vulnerability mapping, and end-of-support tracking - built for FDA review.",bullets:["SPDX and CycloneDX generation","Component vulnerability mapping (CVE / KEV)","End-of-life and replacement planning","Build-system and binary SCA validation"]},{slug:"secure-medtech-product-design-consulting",title:"Secure MedTech Product Design",short:"Bake cybersecurity into your device from day one.",icon:Km,category:"Premarket",group:"Secure Design & Documentation",description:"Architecture review, control selection, and secure development guidance from concept through V&V - aligned with FDA's Secure Product Development Framework.",bullets:["Security architecture and trust boundaries","Cryptography and key management","Secure boot and update strategy","Developer training for medical teams"]},{slug:"medical-device-threat-modeling",title:"Medical Device Threat Modeling",short:"FDA-aligned threat models that identify risks early and speed approvals.",icon:kD,category:"Premarket",group:"Secure Design & Documentation",description:"Comprehensive threat modeling per FDA Section V.A.1 - covering supply chain, deployment, environment of use, and decommission risks for the full device system.",bullets:["ANSI/AAMI SW96 + ISO 14971 alignment","End-to-end medical device system coverage","Threat-to-mitigation traceability","Justified methodology and assumptions"]},{slug:"ai-ml-medical-device-security",title:"AI/ML Medical Device Security",short:"Defend AI/ML SaMD against adversarial attacks - and meet FDA's PCCP, GMLP, and 2025 AI-enabled device guidance.",icon:Yc,category:"Premarket",group:"Secure Design & Documentation",description:"AI/ML-specific threat modeling, adversarial robustness testing, and submission documentation for AI-enabled medical devices - aligned with FDA's PCCP framework, GMLP, the 2025 AI-Enabled Device Software Functions draft guidance, and AAMI CR34971.",bullets:["Adversarial ML testing (evasion, poisoning, model inversion, prompt injection)","PCCP authoring and FDA AI/ML transparency artifacts","Model lifecycle, monitoring, and drift controls","GMLP + AAMI CR34971 alignment"]},{slug:"samd-cybersecurity",title:"SaMD Cybersecurity",short:"End-to-end FDA premarket cybersecurity package for Software as a Medical Device - cloud, mobile, and web SaMD.",icon:fD,category:"Premarket",group:"Secure Design & Documentation",description:"Full-service premarket cybersecurity package for Software as a Medical Device (SaMD) - cloud-hosted clinical software, mobile diagnostic apps, web-based image analysis, digital therapeutics, and CDS. We own 100% of the FDA Section 524B submission package and align it to IEC 82304-1, IEC 81001-5-1, and EU MDR Rule 11 for software-only medical devices.",bullets:["Entire FDA Section 524B premarket cybersecurity package, owned end-to-e
209nd","Threat model, secure design docs, architecture views, and labeling","Cloud + mobile + API pen testing (OWASP ASVS / MASVS) and IAM/tenancy review","SBOM (app + container) with VEX, vulnerability mgmt plan, and patchability narrative"]},{slug:"medical-device-penetration-testing",title:"Medical Device Penetration Testing",short:"FDA-compliant device, firmware, app, and cloud testing.",icon:Gm,category:"Premarket",group:"Penetration Testing",description:"Hardware, firmware, mobile, and cloud - tested by operators with both red-team and medical-device experience. Reports built for FDA reviewers.",bullets:["Device, firmware, and embedded testing - hardware teardown, JTAG/UART/SPI bus access, firmware extraction and reverse engineering, and exploitation of the secure boot, debug, and update paths. Done by operators who have tested infusion pumps, monitors, surgical robots, and implantables.","Companion app and cloud API coverage - iOS/Android binary analysis, BLE pairing/GATT attacks, REST/MQTT/gRPC fuzzing, authentication and authorization testing, and tenant-isolation checks. We test the device as patients and clinicians actually use it, not in isolation.","FDA-ready penetration test reports - executive summary, methodology, CVSS-scored findings tied to your threat model, reproduction steps, and a Letter of Attestation formatted to the FDA's 2026 premarket guidance. Reviewer-ready, not a generic IT security PDF.","Remediation guidance and re-test included - written fix recommendations per finding, engineer-to-engineer support during remediation, and unlimited re-tests of fixed issues inside the fixed fee. You leave with a clean report, not a list of open items."]},{slug:"ble-rf-penetration-testing",title:"BLE & RF Penetration Testing",short:"Wireless interface testing for BLE, Wi-Fi, Zigbee, NFC, and proprietary RF.",icon:pf,category:"Premarket",group:"Penetration Testing",description:"Ã la carte wireless interface testing for medical devices - BLE pairing, GATT enumeration, Wi-Fi association, NFC/RFID, and proprietary RF protocol fuzzing. Reviewer-ready evidence for FDA premarket and EU MDR submissions.",bullets:["BLE pairing, bonding, and GATT attribute testing","Wi-Fi association, EAP, and rogue-AP scenarios","Proprietary RF protocol fuzzing (sub-GHz, 2.4 GHz)","NFC/RFID replay, relay, and clone attempts","SDR-based capture, demod, and replay","Findings mapped to threat model + AAMI TIR57 risk file"]},{slug:"firmware-penetration-testing",title:"Firmware Penetration Testing",short:"Embedded firmware extraction, reverse engineering, and exploitation.",icon:N_,category:"Premarket",group:"Penetration Testing",description:"Ã la carte firmware testing for embedded medical devices - extraction via JTAG/SWD/UART or chip-off, binary analysis, secure boot validation, and OTA update path testing. Findings traceable to your SBOM and threat model.",bullets:["JTAG / SWD / UART debug interface testing","Flash extraction (in-circuit and chip-off)","Binary reverse engineering and crypto review","Secure boot, signing, and rollback validation","OTA update path and integrity testing","SBOM correlation and CVE exploit verification"]},{slug:"phi-cloud-backend-penetration-testing",title:"PHI Cloud Backend Penetration Testing",short:"Cloud backend testing for connected devices that store or transmit PHI.",icon:Nd,category:"Premarket",group:"Penetration Testing",description:"Ã la carte cloud backend testing for connected medical devices - AWS/Azure/GCP infrastru
209cture, device-to-cloud APIs, IAM and tenant isolation, PHI data flows, and HIPAA-aligned controls. Reviewer-ready for FDA submissions and SOC 2 evidence.",bullets:["Device-to-cloud API authentication and authZ","Tenant isolation and multi-org boundary testing","AWS/Azure/GCP IAM, KMS, and storage misconfig review","PHI data-flow tracing and exposure analysis","HIPAA technical safeguard validation","MQTT, AMQP, and IoT broker abuse cases"]},{slug:"web-application-penetration-testing",title:"Web Application Penetration Testing",short:"Front-end, back-end, API, and mobile coverage in one engagement.",icon:wD,category:"Premarket",group:"Application Security",description:"OWASP-aligned web application testing covering authentication, session management, business logic, and API integrations.",bullets:["OWASP Top 10 and ASVS coverage","Authentication and session testing","Business-logic abuse cases","Linked API and mobile coverage"]},{slug:"api-penetration-testing",title:"API Penetration Testing",short:"REST and GraphQL API testing with fuzzing and auth analysis.",icon:Nd,category:"Premarket",group:"Application Security",description:"We review API documentation, intercept traffic to map the attack surface, and probe authentication, authorization, and parameter handling with manual and fuzzing techniques.",bullets:["Attack-surface mapping from docs and traffic","Auth and authorization testing","Parameter fuzzing and injection","Data-format and serialization abuse"]},{slug:"mobile-application-penetration-testing",title:"Mobile Application Penetration Testing",short:"iOS and Android testing covering storage, network, and platform.",icon:O0,category:"Premarket",group:"Application Security",description:"OWASP MASVS-aligned mobile testing - local data storage, network communication, platform interaction, and binary protections.",bullets:["Local data storage analysis","Network and API communication","Platform and IPC interaction","Binary hardening and reverse engineering"]},{slug:"network-penetration-testing",title:"Network Penetration Testing",short:"External and internal testing of your network systems.",icon:L_,category:"Premarket",group:"Network & Infrastructure Testing",description:"External and internal network penetration testing to measure exposure, validate controls, and prioritize hardening.",bullets:["External perimeter testing","Internal lateral-movement scenarios","Active Directory abuse paths","Risk-prioritized remediation plan"]},{slug:"internal-penetration-testing",title:"Internal Penetration Testing",short:"Insider-threat simulation against your enterprise environment.",icon:Nd,category:"Premarket",group:"Network & Infrastructure Testing",description:"Simulates a malicious or compromised insider to test segmentation, monitoring, and privileged access controls inside your environment.",bullets:["Assumed-breach scenarios","Privilege escalation and persistence","Segmentation validation","Detection and response evaluation"]},{slug:"wireless-penetration-testing",title:"Wireless Penetration Testing",short:"Secure your Wi-Fi and wireless attack surface.",icon:pf,category:"Premarket",group:"Network & Infrastructure Testing",description:"Wireless access points are often the easiest path into a network. We test corporate Wi-Fi, guest networks, and device-to-device wireless protocols.",bullets:["Wi-Fi authentication and segmentation","Rogue AP and evil-twin testing","Wireless client attacks","Bluetooth and short-range protocol testing"]},{slug:"hipaa-penetration-testing",title:"HIPAA Penetration Testing",short:"Penetration testing scoped to HIPAA Security Rule expectations.",icon:hf,category:"Premarket",group:"Network & Infrastructure Testing",description:"HIPAA-aligned penetration testing for covered entities, business associates, and MedTech companies handling ePHI.",bullets:["ePHI data-flow mapping","Administrative, physical, and technical safeguards","Risk analysis support","Documentation for OCR audits"]},{slug:"soc-2-penetration-testing",title:"SOC 2 Penetration Testing",short:"AICPA-aligned penetration testing scoped to your SOC 2 system boundary - auditor-ready report, free retest.",icon:hf,category:"Premarket",group:"Network & Infrastru
209cture Testing",description:"SOC 2 penetration testing mapped to CC4.1, CC7.1, and CC7.2. NIST SP 800-115 and OWASP methodology, CVSS-scored findings, retest letter for the CPA, and one report that also serves HIPAA, HITRUST, and FDA workstreams.",bullets:["Scope aligned to your SOC 2 system boundary","Test cases mapped to AICPA Trust Services Criteria","External network, web app, API, and cloud configuration","CVSS-scored findings with reproduction steps","Free retest of criticals and highs within 90 days","Audit-ready report and attestation letter for your CPA"]},{slug:"fda-postmarket-cybersecurity-services",title:"FDA Postmarket Cybersecurity",short:"Continuous compliance, monitoring, and vulnerability response.",icon:Jg,category:"Postmarket",group:"Postmarket & Legacy",description:"Once cleared, your device still needs eyes on it. We handle SBOM monitoring, coordinated vulnerability disclosure, patching, and FDA-aligned reporting - delivered as one-off projects or as an annual TPLC Partnership covering an entire product line.",bullets:["TPLC Partnership: Annual retainer covering one product line through Total Product Lifecycle - SBOM monitoring, CISA-KEV tracking, full CVD process operation, quarterly penetration tests, and ongoing FDA/EU regulatory updates. One predictable fee, one accountable team, zero gaps between cleared release and end-of-support.","SBOM monitoring: Section 524B requires manufacturers to maintain and update SBOMs continuously. We track every component for newly disclosed CVEs and flag them before they become reportable vulnerabilities.","CVD program (Coordinated Vulnerability Disclosure): We manage the full CVD process - researcher intake, triage, fix timeline, and FDA notification - so your team doesn't face a public disclosure event without a prepared response. FDA's 30-day notification requirement is built into every engagement.","Threat monitoring: We proactively monitor your device's ecosystem 24/7 - not alert-driven, team-driven.","Incident response: Response plans aligned with FDA's 30-day vulnerability notification requirement - with audit-ready documentation from day one.","Patch validation: Every patch goes through validation testing before deployment - so you can demonstrate to FDA that the fix didn't introduce new risk."]},{slug:"legacy-medical-device-cybersecurity-services",title:"Legacy Device Protection",short:"Reduce risk on fielded devices - no redesign, no new submission, no downtime.",icon:Nw,category:"Postmarket",group:"Postmarket & Legacy",description:"Compensating controls, network isolation, and monitoring for fielded devices that can't be easily updated - keeping clinical operations running without touching the cleared design.",bullets:["No redesign required - every deliverable below is built to reduce risk on a device already in the field, with no hardware changes, no new FDA submission, and no removal from service.","Risk assessment of fielded devices - current-state cybersecurity posture against FDA's 2026 guidance and Section 524B postmarket obligations, with documented findings ready for an inspector.","Compensating control design - when the device's cleared software can't be changed, we design the surrounding controls (access, segmentation, monitoring) that bring residual risk into an acceptable range.","Network segmentation guidance - practical, hospital-deployable segmentation patterns that isolate legacy devices from the broader clinical network without breaking integrations.","Lifecycle extension planning - a documented path that keeps the device commercially viable and audit-defensible until end-of-support, including SBOM reconstruction where the original is missing."]},{slug:"medtech-compliance-bundle",title:"MedTech Compliance Bundle",short:"One program covering FDA Clearance, SOC 2, HIPAA, HITRUST, and GDPR - run in parallel for hospital-ready and EU-ready launch.",icon:Yt,category:"Premarket",group:"Go-To-Market Compliance",description:"A single, parallel-track program that delivers FDA cybersecurity clearance plus the SOC 2, HIPAA, HITRUST, and GDPR evidence Hospital & Health-System (HDO) procurement teams and EU regulators require - so your commercialization isn't blocked after FDA approval.",bullets:["FDA 510(k) / De Novo / PMA cybersecurity submission","SOC 2 Type II readiness and audit support","HIPAA Security Rule risk analysis and BA agreements","HITRUST CSF e1 / i1 / r2 readiness for HDO procurement","GDPR Art. 30 / 32 / 35 readiness, DPIAs, and DPA templates","Single crosswalk - one set of controls, five attestations"]},{slug:"soc-2-type-ii-medtech",title:"SOC 2 Type II for MedTech",short:"SOC 2 Type II readiness, control build, and audit support so HDO procurement stops blocking your contracts.",icon:Yt,category:"Premarket",group:"Go-To-Market Compliance",description:"SOC 2 Type II readiness, control build, and audit support for MedTech SaaS, SaMD, and connected-device back-ends - aligned with your FDA cybersecurity program so one control set produces evidence for both.",bullets:["Trust Services Criteria scoping (Security plus Availability, Confidentiality, Processing Integrity, Privacy)","Gap assessment against AICPA TSC, mapped to your FDA SPDF","Control build sized for a MedTech engineering team","Evidence collection runbook across cloud, IdP, GitHub, ticketing","3-6 month observation period with monthly evidence reviews","Audit coordination with a partner CPA firm"]},{slug:"hitrust-medtech",title:"HITRUST Readiness (e1 / i1 / r2)",short:"HITRUST CSF readiness and certification support for MedTech selling into IDNs, AMCs, and large health systems.",icon:Yt,category:"Premarket",group:"Go-To-Market Compliance",description:"HITRUST CSF readiness at the right level (e1, i1, or r2) for medical device and digital health companies - with MyCSF scoping, control build, and validated assessment support through an authorized External Assessor.",bullets:["Honest level selection (e1 / i1 / r2) based on your customer pipeline","MyCSF scoping with factors set correctly the first time","Gap assessment crosswalked to FDA, SOC 2, HIPAA, GDPR","Control implementation and policy stack","Continuous evidence pipelines, not last-week-of-audit fire drills","External Assessor coordination and CAP management"]},{slug:"gdpr-medical-device-compliance",title:"GDPR for Connected Medical Devices",short:"GDPR readiness aligned to MDR/IVDR: RoPA, Article 32 controls, DPIAs, breach response, SCCs, and DPAs.",icon:Yt,category:"Premarket",group:"Go-To-Market Compliance",description:"End-to-end GDPR program for MedTech and digital health: Article 30 records, Article 32 technical and organisational measures, Article 35 DPIAs, breach notification workflows, data-subject rights, SCCs, DPAs, and EU Representative guidance - aligned to MDR/IVDR.",bullets:["Records of Processing Activities (Art. 30) for controller and processor activities","Article 32 technical measures mapped to your existing controls","DPIA for the device and its connected services","72-hour breach response runbook and notification templates","Data-subject rights workflows with SLAs","DPA / SCC pack and Transfer Impact Assessments"]},{slug:"hipaa-compliance-program-medtech",title:"HIPAA Compliance Program for MedTech",short:"End-to-end HIPAA Security Rule program for MedTech, SaMD, and digital health Business Associates.",icon:Yt,category:"Premarket",group:"Go-To-Market Compliance",description:"Full HIPAA program for MedTech Business Associates - Security Rule risk analysis, policies, training, BAAs, breach response, and OCR-ready evidence - aligned with your FDA cybersecurity work and SOC 2 / HITRUST controls.",bullets:["OCR-aligned Security Risk Analysis
209sized for MedTech engineering teams","Risk management plan with owners and dates, not a 200-page PDF","Policy & procedure stack covering all required Security Rule standards","Workforce training content and tracking","BAA templates for customers, signed BAAs with sub-processors","60-day breach response runbook and OCR notification templates"]},{slug:"eu-cyber-resilience-act-medical-devices",title:"EU Cyber Resilience Act (CRA) for Medical Devices",short:"CRA readiness for connected medical devices: essential cybersecurity requirements, vulnerability handling, and CE-mark conformity before December 11, 2027.",icon:Yt,category:"Premarket",group:"Go-To-Market Compliance",description:"End-to-end EU Cyber Resilience Act (Regulation 2024/2847) readiness for medical device manufacturers - essential cybersecurity requirements, vulnerability handling, conformity assessment, and ENISA reporting workflow - aligned with MDR/IVDR and your FDA cybersecurity program so one control set produces evidence for both.",bullets:["CRA scoping: products with digital elements, important/critical class determination","Annex I Part I essential cybersecurity requirements gap assessment","Annex I Part II vulnerability handling process (24-hour ENISA notification)","Conformity assessment route selection (self-assessment, EU-type, full QA)","MDR/IVDR + CRA dual-track documentation crosswalk","Technical documentation, EU declaration of conformity, and CE-mark file"]},{slug:"mds2-hscc-procurement-disclosure",title:"MDS2 & HSCC Procurement Disclosure Service",short:"We complete your MDS2 (Manufacturer Disclosure Statement for Medical Device Security) and HSCC procurement responses so hospital security reviews stop blocking deals.",icon:Xc,category:"Premarket",group:"Go-To-Market Compliance",description:"We respond to the security questionnaires every US hospital procurement team requires - MDS2 v2025, HSCC MC2 (Medical Device and Health IT Joint Security Plan), HSCC HIC-MISO, and IDN-specific questionnaires (HCA, Ascension, Kaiser, Mayo, Cleveland Clinic) - using your existing FDA, SOC 2, HIPAA, and HITRUST evidence so your sales cycle compresses from quarters to weeks.",bullets:["Completed MDS2 v2025 (every line item, with reviewer rationale)","HSCC MC2 / Joint Security Plan attestation","HSCC HIC-MISO health-IT manufacturer disclosure","IDN-specific procurement questionnaires (HCA, Ascension, Kaiser, Cleveland Clinic, Mayo)","Reusable evidence vault: one source, every form auto-populated","Procurement-call coverage: we attend HDO security review calls with your team"]},{slug:"postmarket-sbom-vex-monitoring",title:"Postmarket SBOM Monitoring & VEX Automation",short:"Continuous SBOM monitoring, automated VEX triage, and CAPA-ready evidence for cleared devices - so postmarket cybersecurity stops being a quarterly fire drill.",icon:Jg,category:"Postmarket",group:"Postmarket & Legacy",description:"Operational postmarket cybersecurity for cleared medical devices: continuous SBOM diffing against NVD/CISA-KEV/OSV, automated VEX triage, CVE-to-patient-harm risk scoring, and CAPA-ready evidence packs - aligned with FDA postmarket guidance, ANSI/AAMI SW96, and ISO 14971 risk management.",bullets:["Continuous SBOM ingestion (SPDX 2.3 / CycloneDX 1.5+) and diff-on-build","Automated VEX (Vulnerability Exploitability eXchange) statements per CVE","CVE-to-patient-harm risk scoring traced into ISO 14971 risk file","CISA-KEV, NVD, OSV, GitHub Advisory feed monitoring","CAPA-ready evidence packs with auditor-grade traceability","FDA postmarket cybersecurity report draft for material changes"]}],iI=[{icon:k_,title:"A 3-6 month delay on a $30M/year device",body:"An FDA cybersecurity deficiency letter starts a 180-day response clock. Miss it and the submission is withdrawn. On a $30M/year device, a 3-month slip is $7.5M of lost revenue, plus $50K-$250K in remediation work, plus the next review queue. We have seen teams ship a year late on a single SPDF traceability gap."},{icon:Mw,title:"An AI letter on documentation, not technology",body:"Most FDA cybersecurity deficiencies are not 'your device is insecure.' They are 'we cannot trace your threats to your controls to your test evidence.' Reviewers issue Major Deficiency or Refuse to Accept on missing VEX statements, threat models without ISO 14971 hazard links, and SBOMs that don't match the shipping firmware. A clean technical posture still fails if the package does not read in reviewer order."},{icon:Gm,title:"A Class I recall and a CISA advisory with your name on it",body:"Postmarket cybersecurity events are public. A single uncontrolled vulnerability in a cleared device can trigger a CISA ICSMA advisory, an FDA safety communication, a coordinated disclosure window, and, if patient harm is plausible, a Class I recall. The remediation cost is the small line item. The Bloomberg headline, the customer phone calls, and the IRB freezes are not."}],rI=[{icon:Ow,title:"Discovery call",when:"Day 0",body:"30 minutes with a senior cybersecurity expert (not a sales rep) to scope your device, regulatory path, and timeline."},{icon:Km,title:"Tailored scope & fixed-fee quote",when:"Within 24 hrs",body:"A clear scope of work and a fixed-fee quote built around your engagement. No T&M surprises, no scope creep."},{icon:Fw,title:"Senior experts execute",when:"4-6 weeks",body:"Pen testing, threat modeling, SBOMs, and documentation led by senior practitioners. Junior engineers contribute under that senior's direction; every FDA-facing artifact is senior-reviewed."},{icon:Yt,title:"Reviewer-ready package",when:"FDA-ready",body:"A clean, eSTAR-ready evidence package with unlimited retests included. Backed by our FDA Cybersecurity Deficiency Commitment."},{icon:Rw,title:"Postmarket operate",when:"After clearance",body:"Postmarket monitoring, SBOM maintenance, and coordinated disclosure, so your cleared device stays compliant with FDA's Section 524B ongoing obligations."}],ff=[{code:"FDA 2026 Guidance",title:"Premarket Cybersecurity Guid
209ance",body:"FDA's final premarket cybersecurity guidance, issued February 3, 2026. Defines the SPDF, threat modeling, SBOM, security architecture views, and testing every cyber device submission must include."},{code:"ANSI/AAMI SW96",title:"Medical Device Security Risk Management",body:"The consensus standard for medical device security risk management. Replaces the older TIR57 approach and is what FDA reviewers increasingly expect to see referenced."},{code:"ISO 13485",title:"Medical Device Quality Management System",body:"The international QMS standard for medical devices. Our cybersecurity deliverables are designed to slot into your existing 13485 system without parallel paperwork."},{code:"ISO 14971",title:"Medical Device Risk Management",body:"Foundational risk management standard. Cybersecurity risk is tied directly to patient-safety risk in the 14971 file - a connection FDA reviewers verify explicitly."},{code:"Section 524B",title:"FD&C Act Cyber Device Requirements",body:"Statutory cybersecurity requirement for cyber devices in 510(k), De Novo, PMA, PDP, and HDE submissions. IDE applications sit outside the statute but are still covered by the FDA's premarket cybersecurity guidance."},{code:"eSTAR",title:"Electronic Submission Template",body:"Required electronic submission format. We deliver eSTAR-ready cybersecurity documentation."},{code:"SPDF",title:"Secure Product Development Framework",body:"End-to-end secure development lifecycle aligned with FDA premarket expectations."},{code:"AAMI TIR57",title:"Principles for Medical Device Security",body:"Earlier security risk management technical report - still referenced where SW96 has not yet been adopted."},{code:"IEC 81001-5-1",title:"Health Software Security Activities",body:"International standard for security activities across the health software product lifecycle."},{code:"IEC 62304",title:"Medical Device Software Lifecycle",body:"Software lifecycle requirements that intersect with secure development practices."}],DN=[{quote:"Blue Goat Cyber's depth of expertise was impressive. We had no in-house cybersecurity experience, and their team guided us through every step of the FDA process. The penetration testing and SBOM testing were thorough and gave us complete confidence.",name:"Hank Tucker",title:"CEO",company:"MedTech Manufacturer"},{quote:"Blue Goat's niche expertise in FDA-facing cybersecurity made all the difference. Their reports were built with the FDA's expectations in mind; it gave us confidence that we were submitting exactly what reviewers want to see.",name:"Scott Odland",title:"Solutions Architect",company:"Rhaeos",avatarUrl:Y_},{quote:"The timeliness of this project exceeded my expectations - this was not my experience with other vendors. Blue Goat Cyber delivered a thorough, detailed report and complete testing faster than I anticipated, without compromising quality.",name:"Tim Sandberg",title:"VP of IT Operations",company:"Matrix One",avatarUrl:Z_}],TN=[{section:"About Blue Goat Cyber",items:[{q:"What does Blue Goat Cyber specialize in?",a:"Blue Goat Cyber is a medical device cybersecurity firm. That is the only thing we do. Every engineer, every report template, every piece of internal training is built around getting connected medical devices through FDA review and keeping them safe in the field. On the premarket side that means threat models, security risk assessments, SBOMs with VEX, architecture views, SAST and SCA, and manual penetration testing, all formatted to drop straight into an eSTAR 510(k), De Novo, or PMA submission. On the postmarket side it means continuous SBOM/CVE monitoring, coordinated vulnerability disclosure programs, patch validation cadence, and incident response playbooks aligned to the FDA's reporting expectations. We also handle global expansion (EU MDR, Health Canada, TGA, PMDA) and the unglamorous work of remediating legacy devices that were cleared before cybersecurity was a serious review topic. We do not do general IT cybersecurity, SOC 2, or enterprise red teaming. That focus is the entire point, when a reviewer challenges a claim in your submission, the engineer who wrote it has answered that exact question on dozens of prior devices in the same product class. The narrowness is intentional, it is what allows our deliverables to land cleanly with FDA reviewers, EU notified bodies, and your own internal quality team without needing translation, rewriting, or escalation. It also means the engineer who answers your questions on a Tuesday call has personally produced the same artifact, on a similar device, multiple times before, so the answer you get is calibrated by reality, not theory."},{q:"Why is the company called Blue Goat Cyber?",a:"Founder Christian Espinosa named the company after his experience as an avid mountain climber, including climbing the Seven Summits. Mountain goats are the animal he watched move calmly across terrain that defeats almost everything else, sheer rock faces, exposed ridgelines, weather that turns in minutes. They represent resilience, focus, and a refusal to take shortcuts. Blue is the color of trust, clarity, and limitless potential, and it shows up in the alpine sky at the moments when you most want to keep climbing. The name is meant as a reminder of how we want to engage with clients. Medical device cybersecurity is genuinely difficult terrain: the regulatory expectations change, the technology stack spans firmware to cloud, and a missed deficiency can delay a clearance by months and cost a company a launch window. We promise to move across that terrain calmly, deliberately, and with the kind of footing that comes from having done it many times before. The name is also a small filter, companies looking for the cheapest possible compliance checkbox tend to self-select out, and we end up working with teams that care about getting it right the first time. Customers tell us the name sticks for the same reason it appealed to our founder, it sets a clear expectation about how the work will be done. Less swagger, more steady footing. We would rather be the firm a regulatory affairs leader recommends quietly to a peer than the one whose marketing arrives faster than its deliverables."},{q:"Who are your services designed for?",a:"We exclusively serve medical device manufacturers, startups preparing their first 510(k), mid-sized companies expanding a product family, and global market leaders managing portfolios of dozens of cleared devices. Within those companies our typical points of contact are VPs of Engineering, Heads of Regulatory Affairs, Heads of Quality, CISOs, and product cybersecurity leads. We do not work with hospitals, payers, generic SaaS companies, or non-medical IoT manufacturers, even when their technical stack looks similar, the regulatory context is different enough that a generalist firm will produce documentation a reviewer can spot from across the room. Within MedTech we cover the full product lifecycle: pre-design strategy, design-phase threat modeling, verification-phase pen testing, submission support, FDA deficiency response, and postmarket monitoring. Device categories include Class II and Class III implantables, wearables, in-vitro diagnostics, robotic surgical systems, infusion and drug delivery, NeuroTech, imaging and AI-enabled SaMD, digital therapeutics, and connected diagnostic platforms. If your product touches a patient (directly or through a clinical decision) and connects to anything, another device, a phone, a cloud, or a hospital network, you are in our wheelhouse. Across all of those device categories the common thread is regulated, patient-impacting connectivity. If your product is being prepared for an FDA submission, an EU MDR conformity assessment, or postmarket monitoring under the 2025 FDA postmarket guidance, you are exactly the customer we are built for, and our deliverables will read as native rather than retrofitted."},{q:"What is your commitment?",a:"We back every premarket cybersecurity engagement with a no-cost deficiency resolution commitment. The promise is concrete: if your FDA submission is held up by a cybersecurity-related deficiency on work that we delivered, we resolve it at no additional cost until the submission is approved. That includes rewriting documentation, re-running tests, generating new evidence, drafting the deficiency response, and supporting any follow-up reviewer questions, for as many rounds as it takes. The reason we
209can offer this is that we own the entire cybersecurity package end to end and we calibrate it against the bar real reviewers are applying right now, not the bar from two years ago. We also stay in close touch with how FDA review divisions are interpreting the 2026 guidance, ANSI/AAMI SW96, and the eSTAR cybersecurity sections, and we update internal templates the moment we see a new deficiency pattern. The commitment is not legal sleight of hand. It is the natural consequence of a focused practice: we have seen the patterns, we know what triggers an information request, and we would rather absorb the cost of a re-test than ship work we are not confident will clear review. The practical effect is that risk transfers from your regulatory budget to ours, which is the right place for it: we are the experts being paid for the outcome, not just the activity. Customers tell us this single contractual line is one of the main reasons they choose us over generalist firms that charge less but offer no equivalent commitment."},{q:"What sets you apart?",a:"Three things. First, exclusive focus on medical device cybersecurity, every engineer in the practice has spent years on this regulatory context, not just generic application security or enterprise red teaming. That shows up in tiny details a generalist will miss: how a threat model traces back to ISO 14971 risk controls, how an SBOM is structured so a reviewer can ingest it, how a pen test report distinguishes intended-use risk from theoretical exposure. Second, a real understanding of the FDA's 2026 premarket cybersecurity final guidance, ANSI/AAMI SW96, AAMI TIR57, AAMI TIR97, IEC 81001-5-1, ISO 13485, and ISO 14971, not as a reading-list, but as the operational basis for how we structure deliverables. Third, a track record. Our team has supported 275+ FDA submissions across 510(k), De Novo, PMA, and IDE pathways. Every report we produce is calibrated by the patterns of what reviewers actually challenge, not by what a textbook says they should. The combination is what allows us to back our work with a no-cost deficiency resolution commitment. A generalist firm cannot make that promise honestly. We can, because we have already encountered most of the failure modes. The honest test is to compare a sample chapter side by side with a generalist's deliverable. The structure, the citations, the level of regulatory specificity, and the way findings trace into ISO 14971 risk controls all read differently. We are happy to share redacted samples during scoping so the comparison is concrete rather than abstract."},{q:"What types of devices do you work with?",a:"We work across the full range of connected medical devices, including in-vitro diagnostics (IVD) and lab platforms, wearables and remote patient monitoring (RPM) devices, implantables such as cardiac implantable electronic devices (CIEDs) and neurostimulators, robotic surgical systems and computer-assisted surgical platforms, Software as a Medical Device (SaMD) including AI/ML-enabled imaging and decision support, digital therapeutics (DTx), infusion pumps, drug-delivery devices and combination products, continuous glucose monitors and insulin pumps, dental and orthopedic devices with digital components, and legacy devices being modernized to current FDA cybersecurity expectations. Each of these categories has its own engineering reality. Surgical robotics centers on real-time control loops and ROS-based stacks. Implantables center on telemetry security and battery-aware crypto. CGMs center on BLE pairing and the mobile app boundary. Imaging AI centers on DICOM, model integrity, and cloud APIs. Because we have seen these patterns repeatedly, we calibrate threat models, pen test scope, and SBOM coverage to what actually matters for that product class, instead of running a one-size-fits-all checklist that wastes engineering time and still fails to address the risks reviewers care about. If your device is not in the list above but fits the broader pattern of regulated, patient-impacting, connected technology, ask anyway. Roughly a third of our engagements involve a product class slightly outside the obvious list, and the underlying engineering disciplines transfer cleanly. The Discovery Session is where we confirm fit before any commitment is made on either side."},{q:"What certifications does your team hold?",a:"Our engineers hold a combination of offensive security, secure-development, and assurance certifications, including CISSP (Certified Information Systems Security Professional), CSSLP (Certified Secure Software Lifecycle Professional), OSWE (Offensive Security Web Expert), CRTE (Certified Red Team Expert), CARTP (Certified Azure Red Team Professional), OSCP, GPEN, and others. Several team members are former US military and government red team operators with active background investigations, which matters when devices are reviewed in the context of national-security-adjacent supply chains. Beyond paper credentials, the more useful qualification is direct experience. Our pen testers have personally extracted firmware from RTOS-based pumps, defeated secure-boot implementations on imaging devices, found SQL injection in cloud APIs serving CGM data, and demonstrated denial-of-service against teleoperation channels in surgical robotic prototypes. Our regulatory writers have personally drafted threat models, security risk assessments, and SBOM/VEX packages that have been accepted by FDA reviewers without follow-up questions. Certifications are a useful filter; production work history is the real one. We disclose lead engineer profiles on request when scoping engagements so you can verify the people who will actually do your work, not just the firm's brochure. We also publish lead-engineer biographies on request and are comfortable with customers interviewing the specific engineers who will work the engagement before signing the SOW. Asking that question is healthy, and a useful filter against firms whose senior credentials sit in a brochure while the actual work is delivered by someone you never meet."},{q:"How many FDA submissions has your team supported?",a:"Our team has contributed cybersecurity documentation, threat models, SBOMs, VEX statements, security risk assessments, architecture views, and penetration test reports to 275+ FDA submissions across the 510(k), De Novo, PMA, and IDE pathways. That includes original submissions, special and abbreviated 510(k)s, real-world evidence supplements, and a substantial volume of FDA deficiency response packages. The breakdown by pathway, device class, and review division is published on our /proof page so prospects can verify the depth of experience in the specific product family they are working in. The number is meaningful for two reasons. First, it represents thousands of reviewer comments, deficiencies, and follow-up questions across many devices and many review divisions, which is what calibrates our internal templates and our sense of where the bar actually is at any given moment. Second, it represents recurring engagements with the same manufacturers across multiple devices and product generations, meaning the work survives the only test that matters, which is whether the customer comes back the next time. We are happy to share anonymized examples of cybersecurity sections from cleared submissions during scoping calls, subject to the confidentiality terms of our prior engagements. The volume also matters at a practical level for capacity: we can usually start a premarket pen test within one to two weeks of contract signature without juggling other work, because the team is sized for steady throughput on this specific kind of engagement rather than scrambling to repurpose generalist consultants for a niche regulatory context."},{q:"Do you sign NDAs and BAAs before engaging?",a:"Yes. We routinely sign mutual non-disclosure agreements, master services agreements, and Business Associate Agreements (BAAs) before receiving any device, source code, firmware, design documentation, or protected health information (PHI). For most prospects we can return a signed mutual NDA within 24 hours, often the same business day if the language is standard. We also accept client-paper NDAs and have reviewed enough variants to negotiate quickly without a long legal back-and-forth. For engagements that involve PHI, for example pen testing of a connected device that processes patient data in a clinical setting, we sign a HIPAA-compliant BAA prior to any data transfer and route all PHI through encrypted, access-controlled environments segregated from our other engagements. We are equally comfortable operating under client-supplied data processing addenda for international engagements (GDPR-aligned DPAs, UK addenda, etc.). Source code and firmware are handled in isolated build/test environments with access limited to the named engineers on your engagement; on close-out, we destroy or return all artifacts per your data handling requirements and provide a written attestation of destruction. None of this is unusual for medical device work, but it is worth confirming early so legal review does not block the engineering schedule. Customers occasionally ask whether we can review legal language faster than 24 hours. Usually yes, for standard mutual NDAs we can turn around inside a single business day when needed. The legal step has never been the bottleneck on a Blue Goat engagement, and we work hard to make sure it stays that way."}]},{section:"FDA Section 524B & 2026 Premarket Guidance",items:[{q:"What is FDA Section 524B and who does it apply to?",a:"Section 524B of the Federal Food, Drug, and Cosmetic Act, added by the C
209onsolidated Appropriations Act of 2023 (the omnibus 2023 act), gives the FDA explicit statutory authority to require cybersecurity information in premarket submissions for 'cyber devices.' A cyber device is defined as a device that (1) includes software validated, installed, or authorized by the sponsor, (2) has the ability to connect to the internet, and (3) contains technological characteristics that could be vulnerable to cybersecurity threats. In practice that captures the overwhelming majority of connected medical devices on the market today, including any device that exposes a wireless interface, any companion mobile or web app, and any device that pushes data to a cloud back-end. Submissions for cyber devices must include a Secure Product Development Framework (SPDF), a Software Bill of Materials (SBOM) in machine-readable form, evidence of vulnerability monitoring and patching, and design and architecture documentation that lets a reviewer assess the device's security posture. Section 524B is what gives the FDA the authority to refuse to accept a submission that does not include these artifacts, making cybersecurity a true gating item rather than a nice-to-have. The statute also gives the FDA the operational hook it had previously lacked: prior to Section 524B, cybersecurity was guidance-only and reviewers had to argue that a deficiency was material to safety and effectiveness. Now reviewers can reject submissions that do not include the required cybersecurity content outright, which has changed how seriously sponsors prepare for review."},{q:"What changed with the FDA's February 3, 2026 final guidance?",a:"The FDA's February 3, 2026 final guidance, 'Cybersecurity in Medical Devices: Quality Management System Considerations and Content of Premarket Submissions,' supersedes the June 2025 final guidance (which had superseded the September 2023 final) and represents the FDA's current thinking on what a cyber device cybersecurity submission must contain. The major changes from the 2023 version include: tighter expectations around SPDF artifacts (reviewers want to see evidence the framework is actually followed, not just documented); more rigor in threat modeling, with explicit expectations around STRIDE-style decomposition, attack trees for high-risk flows, and traceability into ISO 14971 risk controls; explicit endorsement of machine-readable SBOM formats (SPDX 2.3+ and CycloneDX 1.4+) with VEX statements for known CVEs; clearer expectations for security architecture views (global system view, multi-patient harm view, updateability/patchability view, and security use case views); and stronger language around postmarket commitments including coordinated vulnerability disclosure and a defined patch cadence. Submissions filed after February 3, 2026 are reviewed against this new bar. We re-baselined our internal templates within weeks of the guidance release, and have already supported submissions cleared under the new expectations. The most important practical implication for sponsors is that older internal templates need to be re-baselined: a cybersecurity section that cleared review in 2023 may not clear review in 2026 even if nothing about the device has changed, simply because the bar has moved. We routinely run a one-week pre-submission readiness check against the 2026 expectations, which catches the gaps that would otherwise come back as deficiencies. Catching them ahead of submission is dramatically faster than fixing them under the clock of an information request."},{q:"What is a Secure Product Development Framework (SPDF)?",a:"A Secure Product Development Framework (SPDF) is a documented set of processes that integrates cybersecurity activities across the entire product lifecycle, from concept through design, development, verification, release, deployment, and postmarket. The FDA's expectation is not just that you have an SPDF, but that the SPDF produces objective evidence at each lifecycle stage: design inputs that include security requirements, threat models that are updated as the architecture evolves, secure-coding standards with enforcement mechanisms (SAST, co
209de review), verification activities that include both automated scanning and manual penetration testing, release processes that include cryptographic signing and SBOM generation, and postmarket processes that include continuous SBOM/CVE monitoring, coordinated vulnerability disclosure, and a patch cadence. The SPDF is typically anchored in your existing ISO 13485 quality management system so that cybersecurity activities produce records under design controls (21 CFR §820.30 / ISO 13485 7.3) and risk management (ISO 14971). For premarket submissions we deliver an SPDF summary describing the framework, plus the artifacts that demonstrate the framework was followed for the specific device under review. Reviewers care more about the artifacts than the framework document itself, they want evidence, not promises. A useful sanity check on your SPDF is whether you can hand a reviewer the document and the corresponding artifacts side by side and have the artifacts visibly support the framework's claims. If the SPDF claims threat modeling on every release but the threat model in the design history file is two years old, that gap is exactly what reviewers find. We help close those gaps and produce evidence trails that hold up."},{q:"Do I need a separate cybersecurity submission for an eSTAR 510(k)?",a:"No, there is no separate cybersecurity submission. Cybersecurity artifacts are embedded directly inside the eSTAR template, which has dedicated sections that map to the 2026 guidance expectations. Specifically, the eSTAR cybersecurity section asks for a security risk assessment, threat model, SBOM, vulnerability assessment, architecture views, security testing summary (including penetration testing), interoperability considerations, and labeling content (cybersecurity bill of materials disclosed in user documentation). We deliver every premarket cybersecurity package in formats that drop directly into those eSTAR sections, properly labeled PDF artifacts for the threat model and architecture views, machine-readable SBOM in SPDX 2.3 or CycloneDX 1.4+ JSON, a structured security risk assessment that traces into your ISO 14971 risk file, and a pen test report formatted to the FDA's expectations for evidence of manual exploit-driven testing. We can also provide a pre-submission readiness check where we map your existing artifacts directly to the eSTAR cybersecurity sections and identify gaps before you upload. That pre-check is included free for clients we are engaged with on the underlying work, it tends to save weeks of back-and-forth during the actual submission. The other practical implication is that file naming, section labeling, and document metadata all matter, eSTAR is automation, and reviewers see exactly what the template surfaces. Sloppy organization shows up immediately. Our deliverables ship with the conventions that drop into eSTAR cleanly, which is a small detail with an outsized effect on how a submission reads on the reviewer's screen."},{q:"Does Section 524B apply to my device if it does not connect to the internet?",a:"Maybe. The Section 524B definition of 'cyber device' has three prongs: the device includes sponsor-validated software, it has the ability to connect to the internet, and it contains technological characteristics that could be vulnerable to cybersecurity threats. All three must be true. The trap is the second prong, which is broader than it sounds. A device that does not itself reach the internet but pairs with a phone app that does, or that connects to a hospital gateway that does, or that exposes a USB or BLE interface used to upload data to an internet-connected workstation, is typically captured. The FDA reads 'ability to connect' functionally, not strictly. The practical rule of thumb we use in scoping: if any data path from your device eventually reaches an internet-connected system in normal clinical use, treat the device as a cyber device and prepare a full Section 524B package. The cost of preparing one and being wrong is far smaller than the cost of skipping one and being wrong, the latter is a Refuse to Accept hold before the review clock starts. For genuinely standalone devices with no connectivity in any form, no wireless, no wired data export, no companion app, no clinician
209workstation interface, Section 524B does not apply and a much lighter cybersecurity rationale is acceptable. We document that determination explicitly in the submission so reviewers do not have to ask."}]},{section:"SBOMs & Supply Chain",items:[{q:"What SBOM format does the FDA accept?",a:"The FDA accepts Software Bills of Materials (SBOMs) in machine-readable formats, specifically SPDX 2.3 or later (ISO/IEC 5962) and CycloneDX 1.4 or later. Both formats are explicitly endorsed in the 2026 final guidance and in ANSI/AAMI SW96. We typically deliver CycloneDX 1.5 in JSON because it has first-class support for VEX (Vulnerability Exploitability eXchange) statements, component pedigree, and cryptographic hashes, and is the format we have seen reviewers most comfortable ingesting. Each SBOM we deliver includes the device's first-party application code, third-party libraries with version and license metadata, embedded operating system and bootloader components, and, for connected ecosystems, companion mobile app and cloud back-end SBOMs as separate documents tied together by a top-level assembly SBOM. We also deliver human-readable views (PDF and HTML) for the regulatory file, but the machine-readable SBOM is what satisfies the Section 524B statutory requirement. Critically, we deliver the SBOM with VEX statements for every known CVE affecting any listed component, so reviewers can immediately see which vulnerabilities are exploitable in your device's intended use context and which are not, saving substantial back-and-forth during review. For customers whose downstream consumers (hospitals, IDNs, government buyers) require additional formats, for example SPDX 3.0, SWID tags, or CSAF for vulnerability disclosures, we generate those alongside the FDA-targeted CycloneDX without re-running the underlying analysis. One SBOM pipeline, multiple presentation formats, all reconciled to the same source-of-truth component inventory."},{q:"Do you generate SBOMs for firmware and embedded devices?",a:"Yes, and this is one of the harder problems in medical device SBOM work, because most build-time SCA tools were designed for cloud applications and miss large portions of an embedded stack. For firmware and RTOS-based devices we combine three techniques. First, build-time SCA against the source tree, package manifests (CMake, Conan, vcpkg, Yocto recipes, Buildroot manifests), and dependency lockfiles to capture first-class dependencies with full version metadata. Second, binary analysis, Binwalk for filesystem extraction, Ghidra-assisted reverse engineering, and signature-based identification of statically linked libraries (zlib, OpenSSL, mbedTLS, lwIP, FreeRTOS, etc.), to capture components that the build system did not declare. Third, OS image analysis for embedded Linux devices, including kernel modules, device-tree blobs, and bootloader components (U-Boot, GRUB, vendor-specific secure-boot loaders). The combined output is a single CycloneDX SBOM that distinguishes declared vs discovered components and includes cryptographic hashes for tamper-evidence. For complex devices we also generate a dependency-of-dependencies (transitive) graph so reviewers can answer 'where does this CVE actually live?' without re-running the analysis themselves. The output is reviewable by humans and ingestible by tools. We deliver the CycloneDX JSON with cryptographic hashes, a human-readable PDF for the regulatory file, and a CSV for engineering teams that prefer to work in spreadsheets. We also sign the SBOM with our engagement key so any downstream consumer can verify it has not been altered after delivery, which is increasingly required by hospital procurement teams under recent FDA and federal guidance."},{q:"How do you handle CVEs that show up after submission?",a:"We use VEX (Vulnerability Exploitability eXchange) statements, which are the FDA-preferred way to manage the noise generated by continuous CVE scanning against any non-trivial SBOM. A VEX statement, attached to the SBOM, declares for each known CVE one of four statuses: 'not affected' (the vulnerable code path is not present, not configured, or not reachable in the device's intended use), 'affected' (the device is vulnerable and the issue is being remediated), 'fixed' (a patch has been applied and validated), or 'under investigation' (analysis in progress with a target date). For each CVE we also document the technical justification, for example, that an OpenSSL vulnerability in TLS renegotiation does not apply because the device pins TLS 1.3 with renegotiation disabled, or that a zlib heap overflow is not reachable because the device's only consumer of compressed data is a signed firmware update with bounded inputs. This turns a continuous scan from an unbounded list of red flags into a small list of items that genuinely need engineering attention. We deliver VEX in CycloneDX format embedded in the SBOM and also as standalone CSAF documents when the customer's downstream consumers prefer that. Operationally we deliver this as a continuous service: the SBOM is loaded into a vulnerability intelligence platform, scanned daily, triaged weekly, and surfaced to your engineering team in your existing issue tracker. Quarterly we produce a summary report suitable for sharing with the FDA, your notified body, or your customers, whichever audience needs evidence that the postmarket program is real."},{q:"Should I choose SPDX or CycloneDX for my SBOM?",a:"Either is accepted by the FDA, but for most medical device submissions we recommend CycloneDX 1.5+ in JSON. The reason is operational rather than regulatory. CycloneDX has first-class native support for VEX statements embedded inside the SBOM itself, which means your vulnerability triage travels with the component inventory in a single document. SPDX 2.3 supports VEX through external references and is fully valid, but the tooling ecosystem around CycloneDX for medical device use cases (vulnerability intelligence platforms, hospital procurement portals, FDA-facing automation) tends to be a step ahead. CycloneDX also has cleaner support for cryptographic component hashes, pedigree (where a component came from and how it was modified), and service inventories for cloud back-ends, all of which matter for connected ecosystems. Choose SPDX when a specific downstream consumer requires it, for example, a hospital procurement office or government buyer with SPDX-only ingestion, or when your organization has already standardized on SPDX for non-medical product lines and the operational cost of maintaining two formats is real. We can generate either, or both, from the same source-of-truth analysis pipeline, so the format choice is reversible. The thing not to do is hand the FDA a human-readable PDF only. Section 524B requires a machine-readable SBOM, and a PDF table of components does not satisfy that requirement even if every component is correctly listed."}]},{section:"Threat Modeling & Pen Testing",items:[{q:"What threat modeling methodology do you use?",a:"Our default methodology is STRIDE-per-element, applied to a data flow diagram (DFD) of the device's architecture, and supplemented by attack trees for the highest-risk flows and use cases. STRIDE, Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege, gives us a systematic way to enumerate threats against every element (process, data store, data flow, external entity) in the architecture, which is exactly the kind of decomposition reviewers under the 2026 FDA guidance want to see. We align the methodology to AAMI TIR57 (Principles for medical device security, risk management) and trace every identified threat into ISO 14971 risk controls so the threat model is not a separate artifact disconnected from your safety risk file. For complex SaMD or connected ecosystems we layer in PASTA (Process for Attack Simulation and Threat Analysis) to cover business-impact analysis, or LINDDUN where privacy threats are first-class concerns (for example, devices that handle special categories of personal data under GDPR). For AI/ML-enabled devices we add MITRE ATLAS-aligned analysis covering model-specific threats. The methodology is documented, repeatable, and produces a threat model artifact that survives reviewer scrutiny. The threat model is delivered as a versioned document under your design controls, with the underlying DFD and attack trees in editable form so your team can update them as the architecture evolves. We also provide a one-day handover workshop so internal engineers understand how the model was built and can extend it on subsequent releases without re-engaging us for every minor change."},{q:"What does a medical device penetration test actually cover?",a:"A real medical device pen test covers every realistic attack surface, exercised by humans, against the device in its intended-use configuration. Hardware: USB, serial (UART, JTAG, SWD), debug headers, BLE/Bluetooth Classic, Wi-Fi, cellular (LTE/NB-IoT), NFC, optical and inductive interfaces. Firmware: extraction (chip-off, JTAG, bootloader exploitation, glitching), reverse engineering, secure-boot bypass attempts, OTA update integrity, and binary analysis for hardcoded credentials or weak crypto. Companion apps: iOS and Android binary and runtime analysis (Frida, Objection, MobSF), insecure storage, certificate pinning bypass, IPC abuse, deep-link injection, and authentication weaknesses. Cloud and back-end: API authentication and authorization (OAuth, JWT, mTLS), tenant isolation, IDOR, injection classes, and infrastru
209cture mis-configuration. Surrounding infrastructure: gateways, hubs, hospital-network integrations, EHR connectors. We map every test we run back to the threats in your threat model and to your intended-use environment, so the report tells you not just what we found, but which findings change the device's residual safety risk. Findings are tracked in a CVSS-scored issue tracker, retest is included, and the final report is formatted for the FDA submission. The other thing a real pen test covers is the assumption layer in your threat model. We deliberately probe the assumptions you have written down (for example, 'the user will not have physical access to the device' or 'the wireless link is only used in a hospital network') and report where reality differs. That is often where the most consequential findings live, and exactly the kind of analysis automated tooling cannot perform."},{q:"Is automated scanning enough for FDA submissions?",a:"No. The FDA's 2026 guidance is explicit that vulnerability scanning alone, Nessus, Qualys, Burp Active Scan, OWASP ZAP, npm audit, does not satisfy the expectation for security testing. Reviewers want evidence of manual, exploit-driven testing performed by qualified humans with access to the device, source code, and design documentation. The reason is that automated scanners are very good at finding known patterns (outdated library versions, default credentials, common web vulnerabilities) and very bad at finding the things that actually matter on medical devices: business-logic flaws, authorization bypasses specific to the device's roles, race conditions in firmware update flows, hardware-mediated attacks, and threats that require chaining several individually-low-severity findings into a clinically-significant exploit. We do use automated tooling, extensively, because it is the right tool for the bulk-coverage layer, but the deliverable is a manual penetration test report. Tools augment the testers; they do not replace them. Submissions that rely on scan output alone are routinely held up with deficiency letters asking for evidence of manual testing, which is a significantly more expensive way to discover the requirement than just doing it correctly the first time. A practical way to think about the difference: scanners answer 'are there any known patterns of vulnerability?' while pen testers answer 'can someone actually compromise this device in its intended use?' Reviewers care about the second question, because that is the one that maps to patient safety. Submissions structured to answer it explicitly clear review faster than submissions that try to substitute scanner output for the real analysis."},{q:"Do you offer free retesting after we fix findings?",a:"Yes. Every premarket penetration test we deliver includes one round of remediation retest at no additional cost. After your engineering team fixes the findings from the original test, our testers re-execute the relevant attack scenarios against the patched device or build, validate that each fix actually closes the vulnerability (and does not just hide it from a scanner), and update the report so the version delivered to the FDA shows resolved findings rather than open ones. That is exactly what reviewers want to see, a final report with no open Critical or High findings, or with explicit, well-justified risk acceptances for any remaining items. Retest is included because incentives matter: if retest were billable, there would be a quiet pressure to grade ambiguous findings as exploitable so they generate retest revenue, and to resist closing them. We would rather take that pressure off the relationship entirely. If you need additional retests beyond the included one, for example because a major architecture change between rounds materially expanded the attack surface, those are billed at a transparent fixed fee disclosed in the original SOW, with no surprises. The retest is also useful to your engineering team because it validates that fixes work in the assembled device, not just in a unit test. Several times a year we find that a fix closes the original vulnerability but introduces a new one, or fails to close it under a slightly different attack path. Catching that before submission is much cheaper than catching it after."}]},{section:"Postmarket, Legacy & Global",items:[{q:"What does an FDA-aligned postmarket program look like?",a:"An FDA-aligned postmarket cybersecurity program has five core components, each producing objective evidence the FDA can review under the FDA's postmarket cybersecurity guidance. First, continuous SBOM and CVE monitoring, your SBOM is loaded into a vulnerability intelligence platform, scanned daily against NVD, GitHub Security Advisories, and vendor PSIRT feeds, with VEX triage performed weekly so the working set is real and not theoretical. Second, a coordinated vulnerability disclosure (CVD) policy published on your website with a security.txt file, a disclosure email, a defined acknowledgement and response timeline, and (for many manufacturers) a safe-harbor commitment for good-faith researchers. Third, a defined patch validation cadence, typically time-bound by severity (e.g., critical vulnerabilities patched and shipped within X days), with regression and security testing integrated into the release pipeline. Fourth, FDA reportable event templates and decision trees so when an event occurs, the timeline does not start with 'how do we file this?' Fifth, customer advisory templates so customers (hospitals, IDNs, distributors) get clear, consistent communications. We help build the program, train your internal team, and can also operate parts of it as a managed service for smaller manufacturers without a dedicated PSIRT. The program is documented under your QMS so audits, FDA inspections, and notified body asse
209ssments find a coherent trail of policy, evidence, and continuous improvement. We produce the artifacts in formats that integrate cleanly into your existing document control system rather than living in a separate vendor portal that your auditors cannot easily reach."},{q:"Can you bring a legacy device into compliance?",a:"Yes, legacy device modernization is a substantial portion of our postmarket practice, because many devices currently on the market were cleared under earlier guidance and lack the artifacts the FDA now expects when supplements, software changes, or significant updates are filed. Our process starts with a gap assessment against current FDA expectations (2026 premarket guidance, 2025 postmarket guidance, ANSI/AAMI SW96, AAMI TIR57/97), benchmarked against the artifacts you currently have. We then build a remediation roadmap that prioritizes work by both regulatory exposure and clinical risk: typically generating an SBOM (often via binary analysis where source is unavailable for older modules), a security risk assessment, a threat model, architecture views, and the supporting test evidence. Where the original device design cannot reasonably be modified, for example, an implantable cleared a decade ago that cannot accept new firmware, we document compensating controls and residual risk justifications that align with ISO 14971 and have survived FDA review on similar devices. The roadmap is designed to produce a defensible cybersecurity package without forcing a redesign, and to give you a clear plan when reviewers ask 'what is your trajectory toward current expectations?' on the next supplement. The most common surprise during legacy modernization is that source code or build artifacts for older modules are no longer available, the original developers have left, the build server has been retired, or the third-party vendor is out of business. We have well-established workflows for that scenario (binary analysis, decapping, vendor outreach, controlled re-baselining) and have completed many engagements where the device shipped years before the team that originally built it dispersed."},{q:"How do you handle EU MDR and the Cyber Resilience Act?",a:"Our deliverables are designed so a single engagement satisfies FDA, EU MDR, Health Canada, TGA, PMDA, and IMDRF expectations rather than requiring parallel cybersecurity workstreams for each market. For EU MDR specifically, our threat models, security risk assessments, and architecture documentation map directly to Annex I GSPR 17.2 (IT security and minimum requirements) and the supporting expectations in MDCG 2019-16 'Guidance on Cybersecurity for Medical Devices.' We align lifecycle process documentation to IEC 81001-5-1 (health software lifecycle security) and IEC TR 60601-4-5 where applicable. For the EU Cyber Resilience Act (CRA), which applies to products with digital elements being placed on the EU market, we map deliverables to the essential cybersecurity requirements in Annex I and the conformity assessment expectations, recognizing that for most medical devices the MDR pathway will provide the relevant CE marking but the CRA's transparency, vulnerability handling, and update obligations may still apply to non-medical components or services. We also support EU Authorized Representative coordination on cybersecurity content so your EC REP has what they need for incident reporting under both MDR Article 87 and the CRA's vulnerability disclosure obligations. The interaction between MDR, CRA, the NIS2 Directive, and sector-specific regulations is genuinely intricate, and is being clarified by EU bodies on a continuing basis. We track the guidance updates and adjust deliverables accordingly so customers do not have to follow every working paper from MDCG, ENISA, and the European Commission to stay compliant. When a position is genuinely unsettled we flag the uncertainty in the deliverable rather than pretend the regulatory text is more definitive than it is."},{q:"What patch cadence does the FDA actually expect for deployed devices?",a:"The FDA's postmarket cybersecurity guidance does not prescribe a single calendar, but reviewers and field investigators expect a documented, severity-tiered cadence that you actually meet. In practice the cadences we recommend and have seen accepted are: critical vulnerabilities (active exploitation or direct path to patient harm) patched and shipped within 30 days of confirmation, high-severity within 60-90 days, medium within the next regular release cycle (typically 6 months), and low handled as documentation-only or rolled into rout
209ine maintenance. The exact thresholds vary by device class and update mechanism, an OTA-updatable wearable can credibly commit to faster cycles than a Class III implantable that requires a clinic visit, and the FDA expects the cadence to reflect that reality rather than aspire to numbers you cannot hit. The artifact that matters is the postmarket plan filed at premarket and revisited annually: it has to state the cadence, name the responsible function, and describe the regression and security testing each patch will pass through before release. Cadence claims you miss are worse than cadence claims you set conservatively, missed commitments show up directly in FDA inspection findings and in notified body audits. We help customers calibrate the cadence to what their release pipeline can actually sustain, then build the validation evidence that proves the cadence is real on every shipped patch."},{q:"When does the EU Cyber Resilience Act start applying to my medical device?",a:"The Cyber Resilience Act entered into force in December 2024, with the core obligations on manufacturers (vulnerability handling, incident reporting, essential cybersecurity requirements, conformity assessment, CE marking for digital elements) becoming applicable in stages culminating in full applicability on December 11, 2027. The vulnerability and incident reporting obligations to ENISA become applicable earlier, in September 2026. For most medical devices the MDR pathway will provide the relevant CE marking and the CRA largely steps back where MDR already covers the device's cybersecurity, but the CRA's transparency, vulnerability handling, and ENISA reporting obligations can still apply to non-medical components (companion apps that are not classified as MDR software, cloud services, accessories) and to manufacturers placing those components on the EU market in their own right. The practical near-term work is straightforward: register your product with an ENISA-aligned coordinated vulnerability disclosure capability, confirm your incident reporting workflow can hit the CRA's tight notification windows, and confirm your SBOM and update obligations are documented in a form ENISA-aligned national authorities can review. Customers planning multi-year EU strategies should treat CRA readiness as a 2026-2027 program, not a 2027 scramble. The interaction with NIS2 and sector-specific regulations is still being clarified by the European Commission and ENISA, and we update internal templates and customer guidance as those positions firm up."},{q:"Do you support AI/ML-enabled SaMD specifically?",a:"Yes, AI/ML-enabled SaMD is one of our fastest-growing service areas, because the threat surface differs meaningfully from traditional rule-based software and the FDA's PCCP (Predetermined Change Control Plan) framework, AI/ML-enabled device guidance, and the 2026 premarket cybersecurity guidance interact in ways that catch teams off-guard. We address model-specific risks: data poisoning during training, model inversion and membership inference attacks against trained models, adversarial examples designed to flip a clinically-meaningful classification, prompt injection for LLM-based clinical features, jailbreaks that bypass safety guardrails, and supply-chain risks against pre-trained foundation models. We also address the more conventional risks specific to ML deployments: model artifact integrity (cryptographic signing of model files, verification at load time), inference API authentication and rate limiting, training-data confidentiality (PHI in training corpora), and observability for drift and degradation. Threat models are built using STRIDE plus MITRE ATLAS coverage, and PCCPs are written so the change-control envelope is cleanly demarcated and operationally enforceable. We also produce labeling content describing model provenance and update behavior in a form that satisfies both the FDA's transparency expectations and clinical end-user needs. For customers building genuinely n
209ovel AI-enabled devices, for example, generative AI clinical decision support or large multimodal models embedded in diagnostic workflows, we also support pre-submission strategy with the FDA, including Q-Sub preparation focused on the cybersecurity dimensions of the proposed device. Engaging early with the agency on novel architectures tends to dramatically reduce the number of deficiencies during formal review."}]},{section:"Premarket Services",items:[{q:"What premarket services do you offer?",a:"Our premarket portfolio covers the full set of cybersecurity artifacts a Section 524B cyber device submission requires under the 2026 FDA final guidance. That includes: penetration testing (manual, exploit-driven, against device hardware, firmware, companion apps, cloud back-ends, and surrounding infrastructure); SBOM generation and management (SPDX 2.3 or CycloneDX 1.4+ machine-readable, with VEX triage); threat modeling (STRIDE-per-element with attack trees, traced into ISO 14971 risk controls); security risk assessment (a structured analysis of cybersecurity-related risks to safety and effectiveness); SAST and SCA (static application security testing and software composition analysis with finding triage); secure design and architecture consulting (security architecture views including global system, multi-patient harm, updateability/patchability, and security use case views); secure coding standards rollout; FDA deficiency response (rapid remediation and resubmission of cybersecurity items in FDA information requests); and pre-submission readiness reviews (calibrating your full cybersecurity package against current reviewer expectations before you file). Engagements can be scoped as fixed-fee single deliverables or as full-package premarket programs that produce every cybersecurity artifact your eSTAR submission requires. The latter is what the majority of our customers choose because it eliminates the integration risk between artifacts produced by different vendors. Engagements are scoped from a Discovery Session against your specific device, target submission date, and existing artifacts. We do not pre-package a one-size-fits-all bundle, because device class, connectivity model, and regulatory pathway all shift the right scope. The SOW you receive is calibrated to what your submission actually requires, not to what is convenient for us to deliver."},{q:"Why is penetration testing critical?",a:"Penetration testing is critical for two reasons, one regulatory and one operational. Regulatory: the FDA's 2026 final guidance explicitly expects evidence of manual, exploit-driven security testing against connected medical devices, and reviewers will issue deficiency letters when a submission's security testing section consists only of automated scanner output. A real pen test produces the kind of evidence reviewers can rely on: a documented methodology, a defined scope tied to your threat model, manual exploitation against the device's actual attack surface, CVSS-scored findings with exploitability evidence, and a remediation/retest record. Operational: a real pen test finds vulnerabilities that scanners cannot, business-logic flaws specific to your device, authorization weaknesses across your roles and tenants, hardware-mediated attacks (debug ports, glitching, side channels), update-flow exploits, and chained vulnerabilities where several individually low-severity issues combine into a clinically-significant compromise. The cost of finding these in pen testing is small compared to the cost of finding them in postmarket, through a coordinated vulnerability disclosure, a security researcher's blog post, or worse, a real incident. For Class II and Class III devices the FDA's intended-use safety analysis often hinges on cybersecurity assumptions that only a pen test can validate. The economics also favor doing it well. A pen test scoped properly during the verification phase typically costs a small fraction of what it costs to remediate a postmarket cybersecurity incident, deal with an FDA Class I recall, or respond to a public coordinated vulnerability disclosure. Treating cybersecurity testing as an investment rather than a checkbox is one of the most reliable predictors of which manufacturers stay out of avoidable trouble in the field."},{q:"What is SBOM management?",a:"SBOM management is the lifecycle process of generating, maintaining, distributing, and acting on Software Bills of Materials across your product. Generation produces a complete, accurate, machine-readable inventory of every software component in your device, first-party code, third-party libraries, OS components, bootloader, and (for connected ecosystems) companion app and cloud back-end SBOMs. Maintenance means the SBOM regenerates automatically on every build so it stays synchronized with shipped firmware versions, with cryptographic hashes that allow tamper-evidence. Distribution means delivering the SBOM in the formats your downstream consumers need, to the FDA in CycloneDX or SPDX as part of the submission, to hospital customers in their preferred format, and to your internal vulnerability monitoring platform. Action means continuously scanning the SBOM against vulnerability intelligence (NVD, GHSA, vendor PSIRTs), triaging hits with VEX statements, and feeding genuinely-applicable vulnerabilities into your engineering backlog with appropriate severity. Done well, SBOM management aligns with the FDA's 2026 premarket guidance, the FDA's postmarket cybersecurity guidance, ANSI/AAMI SW96 supply chain expectations, and the EU CRA's vulnerability-handling obligations. Done poorly, it generates an unbounded list of CVEs that nobody has time to triage and that ultimately undermines the postmarket program. For most manufacturers the bottleneck is not generating the SBOM, it is operating the program around it: triage, VEX authoring, integration with the engineering backlog, and audit-ready reporting. That is exactly the part we run as a managed service for customers without a dedicated PSIRT, so the SBOM stops being a one-time submission artifact and becomes the living document the regulations actually expect."},{q:"How do you handle FDA deficiencies?",a:"FDA cybersecurity deficiencies are time-sensitive, every week a submission sits in deficiency status is a week off your launch, so our process is built for speed without losing technical defensibility. Step one is a rapid analysis of the deficiency letter, typically within 24-hours of receipt: we map every reviewer comment to a specific cybersecurity artifact, identify whether the issue is a documentation gap, a real technical gap, or a misinterpretation of evidence already submitted, and produce a response strategy with a defensible position on each item. Step two is targeted remediation, generating new artifacts, re-running tests, updating the SBOM and VEX, expanding the threat model, or producing the supporting architecture views the reviewer asked for. Step three is updated documentation, written in language that directly addresses each reviewer comment with cross-references to the new evidence. Step four is the resubmission package, formatted to drop straight back into the eSTAR. Most cybersecurity deficiencies are closed on first resubmission when handled this way. The work is fixed-fee, scoped from the deficiency letter, and includes follow-up reviewer questions if any arise from the resubmission, so you have one number, one team, and a clear path back to clearance. We also keep a running anonymized library of deficiency patterns we have seen across submissions, so when a new letter arrives we can usually identify the underlying reviewer concern quickly and respond to the actual issue rather than the surface wording."},{q:"How fast can you respond to an FDA deficiency letter?",a:"We typically deliver a complete cybersecurity deficiency response package within 2-4 weeks of receiving the deficiency letter and the underlying source materials (current submission artifacts, device or firmware build, source code if needed, and prior threat model and SBOM). The exact timeline depends on the scope of the deficiencies, a small set of documentation clarifications can close in under a week, while a request for a full new threat model plus additional pen testing on a complex device may run the upper end of the range. For genuinely urgent situations, for example, a launch window threatened by an unexpected hold, we offer rush engagements with a target turnaround under two weeks, including weekend and after-hours work, scoped at a transparent rush rate disclosed in the SOW. The other thing that affects timeline is internal
209coordination on your side: if your engineering team is responsive on technical questions about the device, we move fast; if access to the device, source code, or subject matter experts is delayed, the schedule moves with it. We make that dependency explicit at engagement start and provide a daily status during deficiency response so there are never surprises about where time is being spent. For especially compressed timelines we can also stand up a daily standup with your regulatory affairs lead and engineering points of contact so the response is built collaboratively rather than handed over at the end."}]},{section:"Postmarket Services",items:[{q:"What postmarket services do you provide?",a:"Our postmarket services keep cleared devices compliant and patients safe through the entire deployed lifecycle. Continuous SBOM and CVE monitoring with weekly VEX triage so your working list of vulnerabilities is real and not theoretical. Coordinated vulnerability disclosure (CVD) program design and operation, published policy, security.txt, intake email, researcher acknowledgment workflow, and (for managed-service customers) handling of incoming reports on your behalf. Patch management and validation, defining your patch cadence by severity, integrating security regression testing into release pipelines, and producing the validation evidence the FDA expects when a software update is filed. Incident response, playbooks, tabletop exercises, on-call retainer for active incidents, and FDA reportable event support including timelines, communications, and root-cause documentation. Legacy device security, gap assessments, compensating controls, and remediation roadmaps for devices that pre-date current expectations. Customer advisory communications, templated, calibrated for hospital and IDN consumers. Annual cybersecurity reviews mapped to the FDA's postmarket cybersecurity guidance and your QMS. The portfolio is built so a single retained partner covers everything FDA, EU MDR, Health Canada, TGA, and PMDA expect from a connected device manufacturer in the field, without you needing to staff a full internal PSIRT. Postmarket engagements are typically structured as annual retainers with monthly working sessions and quarterly reporting suitable for executive leadership and external auditors. The reporting cadence is designed to give your leadership a clear, defensible view of cybersecurity posture across the deployed fleet without forcing them to reconstruct it from raw scan data."},{q:"Why is postmarket cybersecurity important?",a:"Postmarket cybersecurity is important because the threat environment evolves continuously after FDA clearance, and the regulatory framework explicitly holds you responsible for that evolution. New vulnerabilities are disclosed against the libraries and OS components in your device every week (NVD alone publishes thousands of CVEs annually). Threat actors continually develop new techniques, including those targeting healthcare specifically. Hospital networks change. Companion apps update. Cloud back-ends migrate. Your device, fixed at the moment of clearance, sits in the middle of all of that. The FDA's postmarket cybersecurity guidance, EU MDR Article 87 incident reporting, the EU Cyber Resilience Act's vulnerability handling obligations, and IMDRF guidance all create explicit obligations to monitor, triage, patch, and disclose. Beyond regulation, the operational reality is simpler: a real cybersecurity incident on a deployed medical device can cause clinical harm, trigger Class I recalls, and consume engineering resources for many months. A well-run postmarket program, continuous SBOM monitoring, a real CVD policy, a defined patch cadence, and rehearsed incident response, turns a potential corporate-existential event into a managed engineering process. The cost of building it is small relative to the cost of not having it when you need it. There is also a competitive dimension: hospital procurement teams increasingly require evidence of an active postmarket cybersecurity program before purchasing connected devices, and many issue questionnaires modeled on the MDS2 form. Manufacturers who can answer those questions cleanly win deals; manufacturers who cannot, lose them or are forced into long, expensive procurement-cycle remediation."},{q:"Can you secure devices used globally?",a:"Yes, global market deployment is the norm rather than the exception for our customers, so our deliverables are designed to satisfy multiple regulatory regimes from a single engagement. We align to ISO 13485 (quality management systems for medical devices), ISO 14971 (risk management for medical devices, the foundation that cybersecurity risk plugs into), ANSI/AAMI SW96 (medical device security risk management), AAMI TIR57 and TIR97 (security risk management principles and postmarket security), IEC 81001-5-1 (health software lifecycle security), IEC TR 60601-4-5 (medical electrical equipment security capabilities), IEC 62304 (medical device softw
209are lifecycle), EU MDR Annex I GSPR 17.2 with MDCG 2019-16, the EU Cyber Resilience Act essential requirements, Health Canada cybersecurity guidance, TGA medical device cybersecurity guidance, PMDA pre/post-market expectations, and IMDRF principles and practices. The same threat model, SBOM, VEX, security risk assessment, architecture views, and pen test report, properly structured, satisfy the cybersecurity content requirements across all these regimes, what changes is the wrapper documentation and the regulatory-affairs framing for each filing. We coordinate with your EU Authorized Representative, UK Responsible Person, and other in-country agents so cybersecurity artifacts plug into each regional submission cleanly. For multi-region launches we also produce a regulatory crosswalk document, a single matrix mapping each cybersecurity artifact to each region's specific clause or guidance section, so your regulatory affairs team can demonstrate coverage to internal stakeholders, notified bodies, and auditors without rebuilding the analysis for every jurisdiction."}]},{section:"Working with Us",items:[{q:"How do I get started?",a:"Getting started is a single step: schedule a free 30-minute Discovery Session with our team. The session is a working call, not a sales pitch, we use the time to understand your device (intended use, connectivity model, regulatory pathway, where you are in the development lifecycle), identify the specific cybersecurity artifacts your submission will require, surface the highest-risk gaps in your current plan, and recommend a path forward whether or not it involves us doing the work. You will leave the call with a clear picture of what the FDA's 2026 final guidance expects for your specific device class, where your existing artifacts stand against that bar, and a realistic timeline and budget range for closing the gaps. If we are a good fit, the next steps are an NDA (typically signed within 24 hours), a scoping conversation that produces a fixed-fee SOW, and engagement kickoff within 1-2 weeks of contract signature. If we are not the right fit, for example because your timeline requires onsite work in a region we do not cover, or because your device is outside our specialization, we will say so and where possible refer you to someone better suited. Honest scoping calls produce better engagements than aspirational ones. Most prospects book a Discovery Session within a week of first contact and have a scoped, fixed-fee SOW within ten business days of that call. If you have a hard deadline driving the engagement, mention it on the booking form so we can prioritize accordingly."},{q:"How much do your services cost?",a:"We use transparent, fixed-fee pricing scoped to device complexity and specific deliverables, not hourly billing. The fixed-fee model exists because cybersecurity engagements with hourly meters create the wrong incentives: they reward extensive scope creep, they make budgeting impossible for the customer, and they put the financial risk of mis-scoping on the customer instead of the vendor. Pricing is calibrated by deliverable: a premarket pen test on a single connected device with companion app and cloud back-end falls in a defined range; a complete premarket cybersecurity package (threat model, SBOM, security risk assessment, architecture views, pen test, all formatted for eSTAR) falls in a different defined range; a postmarket retained program is priced annually with deliverable-level commitments. Discovery calls produce indicative ranges immediately and a precise SOW within a week of receiving enough information to scope accurately. Pricing includes one round of remediation retest on pen tests, follow-up reviewer questions on deficiency response engagements, and reasonable revision cycles on documentation deliverables. We publish a typical-engagement cost calculator on the site and discuss exact numbers candidly during scoping, surprises are bad for everyone, especially us. We also publish indicative ranges for our most common engagement types on the site, so you can build internal budget estimates before a formal scoping call. The numbers shift modestly with device complexity, but they are accurate enough to use for board-level planning without surprise during contract."},{q:"How long do projects take?",a:"Most premarket projects complete within 4-8 weeks from kickoff to final deliverable. A standalone penetration test on a single connected device with companion app and cloud back-end typically runs 3-5 weeks (kickoff and scoping, 2-3 weeks of active testing, draft report, remediation retest, final report). A complete premarket cybersecurity documentation package, threat model, security risk assessment, SBOM, architecture views, formatted for eSTAR, runs 4-6 weeks depending on the maturity of the underlying design documentation. A combined premarket program that produces every cybersecurity artifact your submission requires runs 6-10 weeks and is the most efficient way to engage if you are filing a 510(k), De Novo, or PMA in the next quarter. FDA deficiency response packages run 2-4 weeks (with rush options under 2 weeks). Postmarket programs are continuous engagements with deliverable cadences defined annually. Timelines depen
209d most on three things: scope (clear and bounded vs evolving), responsiveness (engineering team availability for technical questions), and access (device, source code, build artifacts ready at kickoff vs trickling in). We confirm timeline at SOW and provide weekly status throughout. For multi-quarter programs, full premarket portfolios across several devices, or annual postmarket retainers, we run a quarterly planning cadence so the work integrates with your overall regulatory calendar rather than competing with it. Predictable delivery is one of the things customers cite most often when they renew, and we treat schedule reliability as a deliverable in its own right."},{q:"How quickly can you start?",a:"We typically begin engagements within 1-2 weeks of contract signature, and faster when the situation requires it. The week-of-kickoff sequence is straightforward: NDA executed (often before the SOW is signed); SOW finalized; data-handling and access plan agreed (where source code lives, how the device gets to us, who the engineering points of contact are); kickoff call to align on scope, deliverables, schedule, and communication cadence; and active work begins. For genuinely urgent engagements, most often FDA deficiency response with a tight resubmission window, but sometimes pre-launch pen tests where a target submission date is non-negotiable, we can compress kickoff to days rather than weeks, including weekend mobilization, scoped at a transparent rush rate disclosed in the SOW. The factors that move the schedule are usually on the customer side rather than ours: legal review of the SOW, internal procurement, and getting the device or build artifacts physically and digitally available to our team. We flag those dependencies explicitly during scoping so the timeline is realistic from day one rather than slipping after kickoff. If you have an immediate need, the Discovery Session is the fastest way to get a real answer about start date. For customers who anticipate an upcoming submission but have not yet finalized the device, we also offer a soft hold on calendar capacity, no commitment, no fee, so when you are ready to engage the team is available without a queueing delay. That option is most useful for sponsors with a known submission window months ahead but uncertain final scope today."},{q:"Who actually does the work - employees or subcontractors?",a:"All testing, threat modeling, SBOM generation, security risk assessment, and documentation work is performed by Blue Goat Cyber W-2 employees and a small number of vetted long-term partners under our direct supervision and on our infrastructure. We do not offshore deliverables to anonymous contractors and we do not use marketplace platforms (Upwork, Toptal-style) for any client-facing work. The reason is operational, not philosophical: medical device cybersecurity is a small, technical specialty where the quality of the deliverable depends entirely on the specific person doing the work, and our reputation cannot survive a generic pen test report sliding past quality control because the actual author was unaccountable. Lead engineers on engagements are named in the SOW and disclosed in the final report. Our long-term partners, used for capacity smoothing on specialized hardware engagements (chip-off firmware extraction, RF lab work, specific FPGA reverse engineering), are individuals we have worked with for years, on our paper, under our quality system, and under the same NDA and BAA terms as our employees. If you need to verify the team that will work your engagement before signing, we share lead engineer profiles on request during scoping. The W-2 model also has a quality and continuity benefit: the engineer who runs your initial pen test is typically still available for the retest, the deficiency response, and the next product in your portfolio. That continuity compounds over time and is one of the main reasons customers return for subsequent engagements rather than restarting the procurement process for every new device."},{q:"How do you protect our IP and source code?",a:"Source code, firmware images, design documentation, and physical devices are handled in isolated, encrypted environments with access strictly limited to the named engineers on your engagement. Specifically: source code is stored in a per-engagement encrypted repository with role-based access control; analysis is performed on per-engagement virtual workstations that cannot exfiltrate data to general-purpose internet endpoints; physical devices are stored in access-logged secure rooms when not under active test; and any PHI handled during testing flows through a HIPAA-compliant pipeline under an executed BAA. Internal access is governed by least-privilege, engineers on one engagement do not have visibility into another engagement's repository, devices, or artifacts. Multi-factor authentication is enforced on every system that touches client data. At engagement close, all source code, firmware, and analysis artifacts are destroyed (or returned, per your data-handling preference) within an agreed period, typically 30 days unless you require shorter, and we provide a written attestation of destruction. We are happy to complete supplier security questionnaires, share our information security policies, and accept additional contractual protections (specific encryption standards, data residency commitments, audit rights) when your customers' procurement processes require them. We also undergo periodic third-party security assessments of our own infrastru
209cture and are happy to share the executive summary on request. Asking your cybersecurity vendor about their own security posture is a healthy practice that we encourage, the firms that take their own security seriously are the ones most likely to take yours seriously."},{q:"Can you work under our quality management system?",a:"Yes. We routinely operate as an external supplier under ISO 13485 quality management system arrangements and are comfortable working under your QMS rather than imposing ours. Practically that means: completing your supplier qualification questionnaire and onboarding process; signing a quality agreement that defines deliverable acceptance criteria, change control, and complaint handling; producing deliverables under your document control conventions (template, numbering, review/approval routing); supporting your design controls and design history file (DHF) requirements by producing artifacts in forms that integrate cleanly into the DHF; supporting your risk management file by tracing cybersecurity threats and controls into your ISO 14971 file with the right identifiers; and providing objective evidence (qualifications, training records, methodology documentation, work product) for internal audits and notified body audits. We have been audited by FDA, notified bodies (BSI, TÃV SÃD, BSI BV), and customer quality teams as an outsourced cybersecurity supplier and are familiar with the depth and form of evidence those audits expect. If your QMS includes specific requirements we have not encountered before, for example novel data-handling controls or unusual document templates, we will accommodate them rather than push back. Operating cleanly under client QMS arrangements is part of the work. For first-time engagements with a customer's QMS we typically allow an extra week at engagement start for QMS onboarding, completing the supplier qualification, signing the quality agreement, and aligning on document control conventions. Building that buffer in once means the rest of the engagement runs cleanly under your QMS without rework, which is usually faster overall than trying to retrofit compliance after the deliverables are drafted."}]}],dh=[{slug:"concept-design",navLabel:"Concept & Design",eyebrow:"Stage 1 · 2-7 years out",when:"While you're still designing the device",headline:"Build cybersecurity into the architecture before you lock the design",intro:"The cheapest place to fix a security issue in a medical device is on a whiteboard. Once silicon, firmware, BLE stacks, and cloud topology are committed, every change becomes a redesign. We help concept- and design-stage teams bake threat modeling, control selection, SBOM strategy, and a Secure Product Development Framework into the device from the first architecture review.",outcomes:["Architecture-level threat models aligned with AAMI TIR57 and SW96","Security control selection mapped to your intended FDA pathway","SBOM strategy and toolchain set up before first commit","Secure Product Development Framework (SPDF) ready for Section 524B"],recommendedServiceSlugs:["secure-medtech-product-design-consulting","medical-device-threat-modeling","fda-compliant-sbom-services-for-medtech"],ctaLabel:"Design securely from day one",seoTitle:"Concept & Design Cybersecurity for MedTech",seoDescription:"Build FDA-aligned cybersecurity into your medical device at concept and design. SPDF setup, threat modeling, SBOM strategy, and Section 524B planning before the design locks.",seoKeywords:["medical device design cybersecurity","secure product development framework","early stage threat modeling MedTech","concept stage medical device security","SPDF FDA"]},{slug:"pre-submission",navLabel:"Premarket Submission",eyebrow:"Stage 2 · ~9 months out",when:"Submission is on the calendar - you have time to get it right",headline:"Manual penetration testing and the premarket evidence package",intro:"Pre-submission is when reviewers' future questions are answered or buried. Start ~9 months before your 510(k), De Novo, or PMA goes in so manual pen testing, the threat model, the S
209BOM, security architecture views, and the Section 524B narrative all land in eSTAR together - coherent, traceable, and reviewer-tested.",outcomes:["Manual penetration testing across hardware, firmware, BLE/RF, mobile, and cloud","Reviewer-ready threat model, SBOM, and security architecture views","Section 524B evidence package mapped to FDA's Feb 2026 guidance","Findings remediated and re-tested before the package ships"],recommendedServiceSlugs:["medical-device-penetration-testing","ble-rf-penetration-testing","firmware-penetration-testing","phi-cloud-backend-penetration-testing"],ctaLabel:"Scope my pre-submission work",seoTitle:"Premarket Submission Cybersecurity | 510(k)/PMA",seoDescription:"Manual pen testing and the FDA premarket evidence package - threat model, SBOM, security architecture, and Section 524B narrative - delivered ~9 months before submission.",seoKeywords:["pre-submission cybersecurity medical device","510(k) cybersecurity prep","PMA cybersecurity testing","FDA premarket evidence package","Section 524B preparation"]},{slug:"fda-submission",navLabel:"FDA Submission",eyebrow:"Stage 3 · Submission day",when:"510(k), De Novo, or PMA goes to FDA",headline:"End-to-end premarket cybersecurity package, eSTAR-ready",intro:"When the package goes to FDA, every cybersecurity artifact is connected: SPDF, threat model, SBOM, pen test report, and the Section 524B narrative trace cleanly back to your design controls and risk file. We deliver the full evidence set in the format reviewers expect - so the cybersecurity portion of your submission isn't what holds it up.",outcomes:["Complete Section 524B documentation packaged for eSTAR","SPDF, threat model, SBOM, and pen test report cross-traceable","Submission narrative written to the FDA Feb 2026 guidance","275+ FDA submissions supported, no cybersecurity-related rejections to date"],recommendedServiceSlugs:["fda-premarket-cybersecurity-services","fda-compliant-sbom-services-for-medtech","medical-device-penetration-testing"],ctaLabel:"Get a fixed-fee submission package",seoTitle:"FDA Submission Cybersecurity | 510(k)/PMA",seoDescription:"Submission-day cybersecurity for medical devices: complete Section 524B package, SPDF, threat model, SBOM, and pen test report - eSTAR-ready and reviewer-tested.",seoKeywords:["FDA submission cybersecurity package","510(k) cybersecurity submission","De Novo cybersecurity","PMA cybersecurity submission","Section 524B documentation","eSTAR cybersecurity"]},{slug:"fda-response",navLabel:"FDA Response",eyebrow:"Stage 4 · Inside the 180-day clock",when:"You received an FDA cybersecurity deficiency or AI letter",headline:"Rapid, reviewer-ready response to FDA cybersecurity deficiencies",intro:"An FDA cybersecurity deficiency letter is not a rejection - it's a 180-day clock. We diagnose what reviewers actually want behind the language of the letter, remediate the underlying gaps, and rebuild the package fast. Senior MedTech experts only, fixed-fee, delivered in days not months.",outcomes:["Reviewer-intent analysis of every deficiency raised","Targeted remediation: threat model, SBOM, pen testing, or SPDF gaps","Reissued evidence package mapped line-by-line to FDA's questions","Delivered inside your 180-day response window"],recommendedServiceSlugs:["fda-cybersecurity-deficiency-response","fda-premarket-cybersecurity-services","medical-device-threat-modeling"],ctaLabel:"Respond to my deficiency letter",seoTitle:"FDA Deficiency Response - Lifecycle Stage 4",seoDescription:"Stage 4 of the medical device cybersecurity lifecycle: what to do when an FDA cybersecurity or AI deficiency letter lands inside your 180-day response window.",seoKeywords:["FDA cybersecurity deficiency response","FDA AI letter response","additional information needed FDA cybersecurity","510(k) deficiency remediation","180-day FDA response window"],canonicalUrl:"https://bluegoatcyber.com/services/fda-cybersecurity-deficiency-response"},{slug:"postmarket",navLabel:"Postmarket",eyebrow:"Stage 5 · Before first device ships",when:"Cleared and prepping to launch - or already in the field",headline:"Postmarket cybersecurity that keeps your cleared device compliant",intro:"FDA's postmarket expectations are not optional. Vulnerability monitoring, SBOM upkeep, coordinated vulnerability disclosure, and patch validation have to be live before the first device ships - and stay live for the device's lifetime. We stand up the program, run it with you, or take it over entirely.",outcomes:["Continuous SBOM monitoring with VEX evidence and CVE matching","Coordinated Vulnerability Disclosure (CVD) program aligned to AAMI TIR97","Patch validation and re-testing on each material release","Postmarket reporting reviewers and customers actually trust"],recommendedServiceSlugs:["fda-postmarket-cybersecurity-services","fda-compliant-sbom-services-for-medtech","legacy-medical-device-cybersecurity-services"],ctaLabel:"Stand up my postmarket program",seoTitle:"Postmarket Cybersecurity for MedTech",seoDescription:"FDA-aligned postmarket cybersecurity: SBOM monitoring, CVD program, patch management, and AAMI TIR97 incident response for cleared medical devices.",seoKeywords:["postmarket medical device cybersecurity","AAMI TIR97","medical device CVD program","SBOM monitoring postmarket","Section 524B postmarket","medical device patch management"]}],EN=e=>dh.find(t=>t.slug===e),yf=["FDA Submissions","Secure Design & Documentation","Penetration Testing","Application Security","Network & Infrastru
209cture Testing","Postmarket & Legacy"],sI=["fda-cybersecurity-deficiency-response","fda-premarket-cybersecurity-services","samd-cybersecurity","medical-device-penetration-testing","medtech-compliance-bundle","fda-postmarket-cybersecurity-services"],bf=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-"),nI=()=>{const[e,t]=p.useState(!1);return a.jsxs("header",{className:"sticky top-0 z-50 border-b border-border/60 bg-background/85 backdrop-blur supports-[backdrop-filter]:bg-background/70",children:[a.jsxs("div",{className:"container-x flex h-20 items-center justify-between gap-3 sm:h-24 lg:h-28 lg:gap-4",children:[a.jsxs(H,{to:"/",className:"flex min-w-0 flex-1 items-center gap-2 sm:gap-3 lg:flex-none lg:shrink-0",children:[a.jsx("img",{src:X_,alt:"Blue Goat Cyber",width:114,height:96,className:"h-14 w-auto shrink-0 sm:h-20 lg:h-24"}),a.jsxs("span",{className:"flex min-w-0 flex-col leading-tight",children:[a.jsxs("span",{className:"truncate text-sm font-semibold tracking-tight text-foreground sm:text-base",children:["Blue Goat Cyber",a.jsx("sup",{className:"ml-0.5 text-[0.55em] font-medium text-muted-foreground",children:"SM"})]}),a.jsx("span",{className:"truncate text-[10px] uppercase tracking-wider text-muted-foreground sm:text-[11px]",children:"Medical Device Cybersecurity"})]})]}),a.jsx("nav",{className:"hidden xl:flex items-center gap-7",children:gf.map(i=>i.to==="/services"?a.jsxs("div",{className:"group relative",children:[a.jsxs(zt,{to:i.to,className:({isActive:r})=>`inline-flex items-center gap-1 text-sm font-medium transition-colors ${r?"text-accent":"text-foreground/70 hover:text-foreground"}`,children:[i.label,a.jsx(Xn,{className:"h-3.5 w-3.5 transition-transform group-hover:rotate-180"})]}),a.jsx("div",{className:"invisible absolute left-1/2 top-full z-50 -translate-x-1/2 pt-3 opacity-0 transition-all group-hover:visible group-hover:opacity-100",children:a.jsxs("div",{className:"w-[720px] overflow-hidden rounded-2xl border border-border bg-background shadow-[var(--shadow-lg)]",children:[a.jsxs("div",{className:"grid grid-cols-[0.95fr_1.05fr]",children:[a.jsxs("div",{className:"border-r border-border bg-muted/30 p-6",children:[a.jsx("p",{className:"mb-3 font-mono text-[10px] uppercase tracking-widest text-accent",children:"Most requested"}),a.jsx("ul",{className:"space-y-1",children:sI.map(r=>{const s=uc.find(n=>n.slug===r);return s?a.jsx("li",{children:a.jsx(H,{to:`/services/${s.slug}`,className:"group/link block rounded-md px-2 py-1.5 text-sm font-medium text-foreground/85 hover:bg-background hover:text-accent",children:s.title})},r):null})}),a.jsxs(H,{to:"/services",className:"mt-4 inline-flex items-center gap-1 text-xs font-medium text-accent hover:underline",children:["View all 25 services ",a.jsx(Me,{className:"h-3 w-3"})]})]}),a.jsxs("div",{className:"p-6",children:[a.jsx("p",{className:"mb-3 font-mono text-[10px] uppercase tracking-widest text-accent",children:"Browse by category"}),a.jsx("ul",{className:"space-y-0.5",children:yf.map(r=>{const s=uc.filter(n=>n.group===r).length;return s?a.jsx("li",{children:a.jsxs(H,{to:`/services#${bf(r)}`,className:"flex items-center justify-between rounded-md px-2 py-1.5 text-sm text-foreground/80 hover:bg-muted hover:text-accent",children:[a.jsx("span",{children:r}),a.jsx("span",{className:"font-mono text-[10px] text-foreground/40",children:s})]})},r):null})})]})]}),a.jsx("div",{className:"grid grid-cols-3 gap-2 border-t border-border bg-muted/40 p-3",children:[{to:"/readiness",icon:Jc,label:"Readiness quiz",sub:"2-min score"},{to:"/scope-estimator",icon:M_,label:"Scope estimator",sub:"Test-day range"},{to:"/cost-of-delay",icon:$c,label:"Cost of delay",sub:"ROI calc"}].map(r=>a.jsxs(H,{to:r.to,className:"group/tool flex items-center gap-2.5 rounded-lg p-2 hover:bg-background",children:[a.jsx("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-accent/10 text-accent",children:a.jsx(r.icon,{className:"h-4 w-4"})}),a.jsxs("span",{className:"min-w-0",children:[a.jsx("span",{className:"block text-xs font-semibold text-foreground",children:r.label}
209),a.jsx("span",{className:"block text-[10px] text-foreground/50",children:r.sub})]})]},r.to))})]})})]},i.to):i.to.startsWith("/products")?a.jsxs("div",{className:"group relative",children:[a.jsxs(zt,{to:i.to,className:({isActive:r})=>`inline-flex items-center gap-1 text-sm font-medium transition-colors ${r?"text-accent":"text-foreground/70 hover:text-foreground"}`,children:[i.label,a.jsx(Xn,{className:"h-3.5 w-3.5 transition-transform group-hover:rotate-180"})]}),a.jsx("div",{className:"invisible absolute left-1/2 top-full z-50 -translate-x-1/2 pt-3 opacity-0 transition-all group-hover:visible group-hover:opacity-100",children:a.jsxs("div",{className:"w-[360px] rounded-2xl border border-border bg-background p-3 shadow-[var(--shadow-lg)]",children:[a.jsx("p",{className:"px-3 pb-2 pt-1 font-mono text-[10px] uppercase tracking-widest text-accent",children:"Blue Goat products"}),a.jsx("ul",{className:"space-y-0.5",children:a.jsx("li",{children:a.jsxs(H,{to:"/products/goatwatch",className:"flex items-start gap-3 rounded-md px-3 py-2 hover:bg-muted",children:[a.jsx("span",{className:"mt-0.5 inline-flex h-6 w-6 shrink-0 items-center justify-center overflow-hidden rounded-full",children:a.jsx("img",{src:J_,alt:"",width:24,height:24,className:"h-6 w-6"})}),a.jsxs("span",{className:"min-w-0",children:[a.jsx("span",{className:"block text-sm font-medium text-foreground",children:"GoatWatch"}),a.jsx("span",{className:"block text-xs text-foreground/55",children:"SBOM risk management for medical devices"})]})]})})})]})})]},i.to):i.to.startsWith("/journey")?a.jsxs("div",{className:"group relative",children:[a.jsxs(zt,{to:i.to,className:({isActive:r})=>`inline-flex items-center gap-1 text-sm font-medium transition-colors ${r?"text-accent":"text-foreground/70 hover:text-foreground"}`,children:[i.label,a.jsx(Xn,{className:"h-3.5 w-3.5 transition-transform group-hover:rotate-180"})]}),a.jsx("div",{className:"invisible absolute left-1/2 top-full z-50 -translate-x-1/2 pt-3 opacity-0 transition-all group-hover:visible group-hover:opacity-100",children:a.jsxs("div",{className:"w-[420px] rounded-2xl border border-border bg-background p-3 shadow-[var(--shadow-lg)]",children:[a.jsx("p",{className:"px-3 pb-2 pt-1 font-mono text-[10px] uppercase tracking-widest text-accent",children:"Where are you in the lifecycle?"}),a.jsx(H,{to:"/journey",className:"mx-1 mb-2 block rounded-md border border-accent/30 bg-accent/10 px-3 py-2 text-sm font-semibold text-accent hover:bg-accent/15",children:"Not sure? Find your path"}),a.jsx("ul",{className:"space-y-0.5",children:dh.map((r,s)=>a.jsx("li",{children:a.jsxs(H,{to:`/journey/${r.slug}`,className:"flex items-start gap-3 rounded-md px-3 py-2 hover:bg-muted",children:[a.jsx("span",{className:"mt-0.5 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-accent/30 bg-accent/10 font-mono text-[11px] font-bold text-accent",children:s+1}),a.jsxs("span",{className:"min-w-0",children:[a.jsx("span",{className:"block text-sm font-medium text-foreground",children:r.navLabel}),a.jsx("span",{className:"block text-xs text-foreground/55",children:r.when})]})]})},r.slug))})]})})]},i.to):i.to==="/resources"?a.jsxs("div",{className:"group relative",children:[a.jsxs(zt,{to:i.to,className:({isActive:r})=>`inline-flex items-center gap-1 text-sm font-medium transition-colors ${r?"text-accent":"text-foreground/70 hover:text-foreground"}`,children:[i.label,a.jsx(Xn,{className:"h-3.5 w-3.5 transition-transform group-hover:rotate-180"})]}),a.jsx("div",{className:"invisible absolute left-1/2 top-full z-50 -translate-x-1/2 pt-3 opacity-0 transition-all group-hover:visible group-hover:opacity-100",children:a.jsxs("div",{className:"w-[680px] rounded-2xl border border-border bg-background p-6 shadow-[var(--shadow-lg)]",children:[a.jsxs("div",{className:"grid grid-cols-3 gap-x-8 gap-y-2",children:[a.jsxs("div",{children:[a.jsx("p",{className:"mb-2 font-mono text-[10px] uppercase tracking-widest text-accent",children:"Learn"}),a.jsxs("ul",{className:"space-y-1.5",children:[a.jsx("li",{children:a.jsx(H,{to:"/blog",className:"block text-sm text-foreground
209/80 hover:text-accent",children:"Blog"})}),a.jsx("li",{children:a.jsx(H,{to:"/podcast",className:"block text-sm text-foreground/80 hover:text-accent",children:"Podcast"})}),a.jsx("li",{children:a.jsx(H,{to:"/webinars",className:"block text-sm text-foreground/80 hover:text-accent",children:"Webinars"})}),a.jsx("li",{children:a.jsx(H,{to:"/glossary",className:"block text-sm text-foreground/80 hover:text-accent",children:"Glossary"})}),a.jsx("li",{children:a.jsx(H,{to:"/faqs",className:"block text-sm text-foreground/80 hover:text-accent",children:"FAQs"})})]})]}),a.jsxs("div",{children:[a.jsx("p",{className:"mb-2 font-mono text-[10px] uppercase tracking-widest text-accent",children:"Playbooks & Tools"}),a.jsxs("ul",{className:"space-y-1.5",children:[a.jsx("li",{children:a.jsx(H,{to:"/guides",className:"block text-sm text-foreground/80 hover:text-accent",children:"Guides"})}),a.jsx("li",{children:a.jsx(H,{to:"/resources/playbooks",className:"block text-sm text-foreground/80 hover:text-accent",children:"Playbooks (PDF)"})}),a.jsx("li",{children:a.jsx(H,{to:"/resources/infographics",className:"block text-sm text-foreground/80 hover:text-accent",children:"Infographics"})}),a.jsx("li",{children:a.jsx(H,{to:"/tools",className:"block text-sm text-foreground/80 hover:text-accent",children:"Interactive Tools"})}),a.jsx("li",{children:a.jsx(H,{to:"/ask-the-goat",className:"block text-sm text-foreground/80 hover:text-accent",children:"Ask The Goat"})})]})]}),a.jsxs("div",{children:[a.jsx("p",{className:"mb-2 font-mono text-[10px] uppercase tracking-widest text-accent",children:"Signals & Proof"}),a.jsxs("ul",{className:"space-y-1.5",children:[a.jsx("li",{children:a.jsxs(H,{to:"/goatfeed",className:"flex items-center gap-2 text-sm font-semibold text-foreground hover:text-accent",children:["Goat Feed",a.jsx("span",{className:"rounded bg-accent/15 px-1.5 py-0.5 font-mono text-[9px] uppercase tracking-wider text-accent",children:"New"})]})}),a.jsx("li",{children:a.jsx(H,{to:"/news",className:"block text-sm text-foreground/80 hover:text-accent",children:"News"})}),a.jsx("li",{children:a.jsx(H,{to:"/case-studies",className:"block text-sm text-foreground/80 hover:text-accent",children:"Case Studies"})}),a.jsx("li",{children:a.jsx(H,{to:"/proof",className:"block text-sm text-foreground/80 hover:text-accent",children:"Proof / Receipts"})})]})]})]}),a.jsx("div",{className:"mt-5 border-t border-border pt-4 text-sm",children:a.jsx(H,{to:"/resources",className:"font-medium text-accent hover:underline",children:"All resources, topic hubs & collections â"})})]})})]},i.to):a.jsx(zt,{to:i.to,className:({isActive:r})=>`text-sm font-medium transition-colors ${r?"text-accent":"text-foreground/70 hover:text-foreground"}`,children:i.label},i.to))}),a.jsxs("div",{className:"hidden xl:flex items-center gap-2",children:[a.jsxs(H,{to:"/search","aria-label":"Search (Cmd+K)",title:"Search - âK / Ctrl+K",className:"group inline-flex h-9 items-center gap-2 rounded-md border border-border/60 bg-muted/40 px-2.5 text-foreground/70 hover:border-border hover:bg-muted hover:text-foreground",children:[a.jsx(R0,{className:"h-4 w-4"}),a.jsxs("kbd",{className:"hidden xl:inline-flex items-center gap-1 rounded border border-border/70 bg-background/70 px-1.5 py-0.5 font-mono text-[10px] font-medium text-muted-foreground",children:[a.jsx("span",{className:"text-xs leading-none",children:"â"}),"K"]})]}),a.jsxs("div",{className:"flex flex-col items-end gap-1",children:[a.jsx(ge,{asChild:!0,variant:"cta",size:"sm",children:a.jsx("a",{href:Qs.meetingUrl,target:"_blank",rel:"noreferrer",children:"Book Strategy Session"})}),a.jsx(H,{to:"/prep",className:"font-mono text-[10px] uppercase tracking-widest text-foreground/75 underline decoration-dotted underline-offset-4 hover:text-accent",children:"How to prepare â"})]})]}),a.jsx("button",{className:"shrink-0 rounded-md border border-border p-2 xl:hidden",onClick:()=>t(i=>!i),"aria-label":"Toggle menu",children:e?a.jsx(F0,{className:"h-5 w-5"}):a.jsx(xD,{className:"h-5 w-5"})})]}),e&&a.jsx("div",{className:"xl:hidden max-h-[calc(100dvh-5rem)] overflow-y-auto overscroll-contain border-t border-border bg-background sm:max-h-[calc(100dvh-6rem)] lg:max-h-[calc(100dvh-7rem)]",children:a.jsxs("div",{className:"container-x flex flex-col gap-1 py-4",children:[gf.map(i=>a.jsxs("div",{children:[a.jsx(zt,{to:i.to,onClick:()=>t(!1),className:({isActive:r})=>`block rounded-md px-3 py-2 text-sm font-medium ${r?"bg-accent/10 text-accent":"text-foreground
209/80 hover:bg-muted"}`,children:i.label}),i.to==="/services"&&a.jsx("ul",{className:"mt-1 mb-2 ml-3 border-l border-border pl-3 space-y-1",children:yf.map(r=>{const s=uc.filter(n=>n.group===r).length;return s?a.jsx("li",{children:a.jsxs(H,{to:`/services#${bf(r)}`,onClick:()=>t(!1),className:"flex items-center justify-between rounded-md px-3 py-1.5 text-xs text-foreground/70 hover:bg-muted hover:text-foreground",children:[a.jsx("span",{children:r}),a.jsx("span",{className:"font-mono text-[10px] text-foreground/40",children:s})]})},r):null})}),i.to.startsWith("/products")&&a.jsx("ul",{className:"mt-1 mb-2 ml-3 border-l border-border pl-3 space-y-1",children:[{label:"GoatWatch",to:"/products/goatwatch"}].map(r=>a.jsx("li",{children:a.jsx(H,{to:r.to,onClick:()=>t(!1),className:"block rounded-md px-3 py-1.5 text-xs text-foreground/70 hover:bg-muted hover:text-foreground",children:r.label})},r.to))}),i.to.startsWith("/journey")&&a.jsx("ul",{className:"mt-1 mb-2 ml-3 border-l border-border pl-3 space-y-1",children:dh.map((r,s)=>a.jsx("li",{children:a.jsxs(H,{to:`/journey/${r.slug}`,onClick:()=>t(!1),className:"flex items-center justify-between rounded-md px-3 py-1.5 text-xs text-foreground/70 hover:bg-muted hover:text-foreground",children:[a.jsx("span",{children:r.navLabel}),a.jsx("span",{className:"font-mono text-[10px] text-foreground/40",children:s+1})]})},r.slug))}),i.to==="/resources"&&a.jsx("ul",{className:"mt-1 mb-2 ml-3 border-l border-border pl-3 space-y-1",children:[{label:"Goat Feed",to:"/goatfeed"},{label:"Blog",to:"/blog"},{label:"Podcast",to:"/podcast"},{label:"Webinars",to:"/webinars"},{label:"Guides",to:"/guides"},{label:"Playbooks (PDF)",to:"/resources/playbooks"},{label:"Infographics",to:"/resources/infographics"},{label:"Interactive Tools",to:"/tools"},{label:"Ask The Goat",to:"/ask-the-goat"},{label:"News",to:"/news"},{label:"Case Studies",to:"/case-studies"},{label:"Proof / Receipts",to:"/proof"},{label:"Glossary",to:"/glossary"},{label:"FAQs",to:"/faqs"},{label:"All resources â",to:"/resources"}].map(r=>a.jsx("li",{children:"external"in r&&r.external?a.jsx("a",{href:r.to,target:"_blank",rel:"noreferrer",onClick:()=>t(!1),className:"block rounded-md px-3 py-1.5 text-xs text-foreground/70 hover:bg-muted hover:text-foreground",children:r.label}):a.jsx(H,{to:r.to,onClick:()=>t(!1),className:"block rounded-md px-3 py-1.5 text-xs text-foreground/70 hover:bg-muted hover:text-foreground",children:r.label})},r.to))})]},i.to)),a.jsx(zt,{to:"/medtech-segments",onClick:()=>t(!1),className:"rounded-md px-3 py-2 text-sm font-medium text-foreground/80 hover:bg-muted",children:"Segments"}),a.jsx(zt,{to:"/why",onClick:()=>t(!1),className:"rounded-md px-3 py-2 text-sm font-medium text-foreground/80 hover:bg-muted",children:"Why Us"}),a.jsx(zt,{to:"/contact",onClick:()=>t(!1),className:"rounded-md px-3 py-2 text-sm font-medium text-foreground/80 hover:bg-muted",children:"Contact"}),a.jsx(zt,{to:"/search",onClick:()=>t(!1),className:"rounded-md px-3 py-2 text-sm font-medium text-foreground/80 hover:bg-muted",children:"Search"}),a.jsx(ge,{asChild:!0,variant:"cta",className:"mt-2",children:a.jsx("a",{href:Qs.meetingUrl,target:"_blank",rel:"noreferrer",children:"Book Strategy Session"})}),a.jsx(zt,{to:"/prep",onClick:()=>t(!1),className:"px-3 py-1 text-center font-mono text-[10px] uppercase tracking-widest text-foreground/60 hover:text-accent",children:"How to prepare â"})]})})]})},aI={about:"About",awards:"Awards",leadership:"Leadership",services:"Services","medtech-segments":"MedTech Segments",segments:"Segments",journey:"Journey",blog:"Blog",guides:"Guides",tools:"Tools",resources:"Resources",playbooks:"Playbooks",pulse:"Monthly Pulse","case-studies":"Case Studies",testimonials:"Testimonials",webinars:"Webinars",podcast:"Podcast","the-med-device-cyber-podcast":"The Med Device Cyber Podcast",news:"News",mentions:"Mentions",faqs:"FAQs",faq:"FAQ","ask-the-goat":"Ask the Goat",contact:"Contact",partners:"Partners",ecosystem:"Ecosystem",events:"Events",topics:"Topics",why:"Why Blue Goat Cyber",prep:"Prep",cvd:"Coordinated Vulnerability Disclosure","privacy-policy":"Privacy Policy","terms-of-service":"Terms of Service","cookie-policy":"Cookie Policy",accessibility:"Accessibility",search:"Search",readiness:"Readiness","scope-estimator":"Scope Estimator","cost-of-delay":"Cost of Delay",misconceptions:"Misconceptions","standards-glossary":"Standards Glossary",glossary:"Glossary",proof:"Proof",media:"Media","give-back":"Give Back","regulatory-strategy":"Regulatory
209Strategy","funding-cybersecurity":"Funding Cybersecurity","christian-espinosa":"Christian Espinosa",category:"Category",tag:"Tag",for:"for",lp:"Landing",goatfeed:"Goat Feed",weekly:"Weekly",compare:"Compare"},Lw=new Set(["/about","/services","/medtech-segments","/segments","/journey","/blog","/guides","/tools","/resources","/resources/playbooks","/resources/infographics","/resources/pulse","/case-studies","/testimonials","/webinars","/podcast","/news","/news/mentions","/faqs","/contact","/partners","/ecosystem","/events","/topics","/leadership","/glossary","/media","/press","/give-back","/regulatory-strategy","/goatfeed","/weekly","/compare"]),oI=/\b(fda|sbom|hipaa|cvd|faq|faqs|api|ai|ml|iot|iomt|samd|saas|sso|mfa|mdr|ivd|pma|hde|pdp|cdrh|sql|html|css|js|ui|ux|usb|usa|us|eu|uk|ssd|cve|cwe|ble|nfc|rfid|spdf|vex|soc|gdpr|hitrust|mds2|rtos|dast|sast)\b/gi,cI=e=>e.replace(/[-_]+/g," ").replace(/\b\w/g,t=>t.toUpperCase()).replace(oI,t=>t.toUpperCase()),Bw=e=>aI[e]??cI(decodeURIComponent(e)),$r="https://bluegoatcyber.com",PN={"@context":"https://schema.org","@type":"Person","@id":`${$r}/team/christian-espinosa#person`,name:"Christian Espinosa",jobTitle:"Founder & CEO",worksFor:{"@id":`${$r}/#organization`},url:`${$r}/team/christian-espinosa`,image:`${$r}/assets/christian-espinosa-DDuqE202.jpg`,sameAs:["https://www.linkedin.com/in/christianespinosa"],knowsAbout:["Medical Device Cybersecurity","FDA Regulatory Compliance","Penetration Testing","Secure Product Development Framework"],author:{"@type":"Book",name:"The Smartest Person in the Room"}},lI=e=>e.replace(/\s*[-|·-]\s*Blue Goat Cyber.*$/i,"").replace(/\s+/g," ").trim();function dI(){var r;if(typeof document>"u")return null;const e=document.querySelector("h1"),t=(r=e==null?void 0:e.textContent)==null?void 0:r.replace(/\s+/g," ").trim();if(t)return t;const i=document.title;return i&&lI(i)||null}function uI(e,t){if(!e||e==="/")return null;const i=e.replace(/\/+$/,"").split("/").filter(Boolean);if(!i.length)return null;const r=i.map((o,c)=>{const l="/"+i.slice(0,c+1).join("/"),d=c===i.length-1;return{path:l,name:d&&t?t:Bw(o),clickable:d||Lw.has(l)}}),s=[];for(const o of r){const c=s[s.length-1];(!c||c.name.toLowerCase()!==o.name.toLowerCase())&&s.push(o)}return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:`${$r}/`},...s.map((o,c)=>{const l={"@type":"ListItem",position:c+2,name:o.name},d=c===s.length-1;return l.item=d?`${$r}${e.replace(/\/+$/,"")||"/"}`:`${$r}${o.path}`,l})]}}function hI(){if(typeof document>"u")return!1;const e=document.querySelectorAll('script[type="application/ld+json"]:not([data-schema="breadcrumb"])');for(const t of e)if((t.textContent||"").includes('"BreadcrumbList"'))return!0;return!1}const mI=[/^\/blog\/[^/]+$/,/^\/guides\/[^/]+$/,/^\/news\/[^/]+$/,/^\/podcast\/[^/]+$/,/^\/reference\/[^/]+$/,/^\/services\/[^/]+\/for\/[^/]+$/],vf=e=>mI.some(t=>t.test(e.replace(/\/+$/,""))),wf=()=>{const{pathname:e}=Mt(),[t,i]=p.useState(null),[r,s]=p.useState(()=>vf(e));p.useEffect(()=>{if(vf(e)){s(!0);return}s(!1);let o=!1,c=0;const l=()=>{if(o)return;const u=dI(),h=hI();i(u),s(h),c+=1,(!u||!h)&&c<10&&setTimeout(l,80)},d=requestAnimationFrame(()=>setTimeout(l,0));return()=>{o=!0,cancelAnimationFrame(d)}},[e]);const n=r?null:uI(e,t);return a.jsx(eo,{children:n&&a.jsx("script",{type:"application/ld+json","data-schema":"breadcrumb",children:JSON.stringify(n)})})},pI={"fda-premarket":[{url:"/guides/de-novo-cybersecurity-submission-guide",title:"De Novo Cybersecurity Submission Guide",type:"guide"},{url:"/guides/samd-cybersecurity-requirements",title:"SaMD Cybersecurity FDA Requirements: 2024 Compliance Guide",type:"guide"},{url:"/guides/fda-premarket-cybersecurity-submission-checklist",title:"FDA Premarket Cybersecurity Submission Checklist Guide",type:"guide"},{url:"/guides/fda-pma-cybersecurity-requirements",title:"FDA PMA Cybersecurity Requirements: Expert Guide (2024)",type:"guide"},{url:"/guides/security-risk-assessment-iec-81001-5-1",title:"IEC 81001-5-1 Security Risk Assessment Guide",type:"guide"},{url:"/blog/how-long-does-fda-cybersecurity-review-take",title:"FDA Cybersecurity Review Timeline: 510(k) & De Novo Guide",type:"blog"},{url:"/guides/fda-524b-cybersecurity-requirements-explained",title:"FDA 524B Cybersecurity Requirements: Full Compliance Guide",type:"guide"}],"deficiency-response":[{url:"/guides/fda-cybersecurity-deficiency-letter-examples",title:"FDA Cybersecurity Deficiency Letter Examples: Real Reviewer Wording",type:"guide"}],postmarket:[{url:"/guides/postmarket-cybersecurity-monitoring-program",title:"Postmarket Cybersecurity Monitoring Guide for MedTech",type:"guide"},{url:"/guides/aami-tir57-vs-tir97-comparison",title:"AAMI TIR57 vs TIR97: Medical Device Risk Management Guide",type:"guide"},{url:"/guides/coordinated-vulnerability-disclosure-medical-devices",title:"Medical Device CVD Guide: FDA Compliance & Best Practices",type:"guide"}],"pen-testing":[{url:"/blog/cost-of-medical-device-penetration-testing",title:"Medical Device Penetration Testing Cost: 2024 Guide",type:"blog"}],sbom:[{url:"/guides/sbom-vulnerability-management-medical-devices",title:"SBOM Vulnerability Management for Medical Devices Guide",type:"guide"},{url:"/guides/vex-document-medical-device-fda",title:"VEX Document Guide for FDA Medical Device Compliance",type:"guide"},{url:"/guides/cyclonedx-vs-spdx-medical-devices",title:"CycloneDX vs SPDX: Medical Device SBOM Compliance Guide",type:"guide"}],"threat-modeling":[{url:"/guides/stride-threat-modeling-medical-devices",title:"STRIDE Threat Modeling for Medical Devices",type:"guide"}]},no=[{id:"medical-device-cybersecurity",pillar:"/medical-device-cybersecurity",label:"Medical Device Cybersecurity",triggers:["medical device cybersecurity","medical-device cybersecurity","medical device security"],anchors:["medical device cybersecurity","medical device cybersecurity overview","medical device cybersecurity guide","medical device cybersecurity program","MedTech cybersecurity pillar"],supports:[{url:"/services/fda-premarket-cybersecurity-services",title:"FDA Premarket Cybersecurity",type:"guide"},{url:"/services/fda-postmarket-cybersecurity-services",title:"FDA Postmarket Cybersecurity",type:"guide"},{url:"/services/fda-compliant-sbom-services-for-medtech",title:"SBOM Services",type:"guide"},{url:"/services/medical-device-threat-modeling",title:"Threat Modeling",type:"guide"},{url:"/services/medical-device-penetration-testing",title:"Penetration Testing",type:"guide"},{url:"/services/services",title:"Cybersecurity for Medical Devices",type:"guide"},{url:"/medical-device-cybersecurity",title:"Medical Device Cybersecurity Hub",type:"guide"},{url:"/case-studies",title:"Medical Device Cybersecurity Case Studies",type:"case-study"},{url:"/news",title:"Blue Goat Cyber News",type:"blog"},{url:"/news/blue-goat-cyber-reaches-milestone-21-episodes-of-the-med-device-cyber-podcast-now-available",title:"21 Episodes of the Med Device Cyber Podcast",type:"blog"},{url:"/blog/the-role-of-mds2-in-medical-device-cybersecurity",title:"MDS² and Medical Device Cybersecurity",type:"blog"},{url:"/blog/health-canada-medical-device-cybersecurity",title:"Health Canada Medical Device Cybersecurity (2026)",type:"blog"},{url:"/blog/tga-australia-medical-device-cybersecurity",title:"TGA Australia Medical Device Cybersecurity (2026)",type:"blog"},{url:"/blog/hipaa-medical-device-manufacturers-cybersecurity",title:"HIPAA Obligations for Medical Device Manufacturers",type:"blog"},{url:"/blog/hhs-405d-medical-device-cybersecurity",title:"HHS 405(d) and Medical Device Manufacturers",type:"blog"},{url:"/blog/de-identification-vs-anonymization-medical-devices-hipaa-gdpr",title:"De-Identification vs Anonymization for Medical Devices",type:"blog"},{url:"/blog/ehr-emr-medical-device-integration-cybersecurity-risks",title:"EHR/EMR Integration Cybersecurity Risks",type:"blog"}
209,{url:"/blog/secure-update-infrastructure-medical-devices",title:"Secure Update Infrastructure for Medical Devices",type:"blog"},{url:"/blog/code-integrity-with-secure-boot",title:"Code Integrity with Secure Boot",type:"blog"},{url:"/blog/rtos-a-comprehensive-guide",title:"RTOS in Medical Devices: A Complete Guide",type:"blog"},{url:"/blog/exploring-common-embedded-operating-systems",title:"Common Embedded Operating Systems",type:"blog"},{url:"/blog/what-is-code-signing",title:"What Is Code Signing?",type:"blog"},{url:"/blog/fda-cybersecurity-pma-deficiencies-complete-response-letters",title:"PMA Cybersecurity Deficiencies and Complete Response Letters",type:"blog"},{url:"/blog/rfid-hacking-protection-strategies",title:"RFID Hacking Protection Strategies",type:"blog"},{url:"/blog/what-is-rfid-cloning",title:"What Is RFID Cloning?",type:"blog"},{url:"/blog/medical-device-cybersecurity-cost",title:"How Much Does Medical Device Cybersecurity Cost (2026)",type:"blog"},{url:"/blog/when-to-hire-device-security-consultant-vs-build-in-house",title:"Hire a Device Security Consultant vs Build In-House",type:"blog"},{url:"/blog/cybersecurity-before-mvp-vs-after-market-fit-cost-of-waiting",title:"Cybersecurity Before MVP vs After Market Fit",type:"blog"},{url:"/blog/medtech-cyber-standards-every-device-team-must-know",title:"MedTech Cyber Standards Every Device Team Must Know",type:"blog"},{url:"/guides/hhs-hph-cpgs-medical-device-manufacturers",title:"HHS HPH CPGs for Medical Device Manufacturers",type:"guide"}]},{id:"fda-premarket",pillar:"/services/fda-premarket-cybersecurity-services",label:"FDA Premarket Cybersecurity",triggers:["510(k) submission","510(k) cybersecurity","510(k)","de novo submission","de novo","PMA submission","premarket submission","premarket cybersecurity","Section 524B","section 524b","FDA premarket","eSTAR","PCCP"],anchors:["FDA premarket cybersecurity","510(k) cybersecurity submission","FDA cybersecurity submission strategy","premarket cybersecurity services","FDA cybersecurity package"],supports:[{url:"/guides/510k-cybersecurity-requirements-every-maker-must-meet",title:"510(k) Cybersecurity Requirements",type:"guide"},{url:"/guides/fda-cybersecurity-deficiency-response-checklist",title:"FDA Deficiency Response Checklist",type:"guide"},{url:"/guides/medical-device-cybersecurity-spdf-playbook",title:"FDA Premarket Cybersecurity Guidance Overview",type:"guide"},{url:"/blog/the-impact-of-524bb2-on-medical-device-cybersecurity",title:"Section 524B Explained",type:"blog"},{url:"/case-studies",title:"FDA Submission Case Studies",type:"case-study"},{url:"/guides/fda-cybersecurity-technical-screening-checklist",title:"FDA Cybersecurity Technical Screening Checklist (2026)",type:"guide"},{url:"/guides/fda-pccp-change-control-plans",title:"FDA PCCP: Predetermined Change Control Plans for AI/ML Devices",type:"guide"},{url:"/blog/cvss-3-1-vs-4-0-medical-devices",title:"CVSS 3.1 vs 4.0 for Medical Devices",type:"blog"},{url:"/blog/docker-containers-medical-devices-fda-testing",title:"Docker Containers in Medical Devices: FDA Testing",type:"blog"},{url:"/blog/documenting-update-cadence-fda-524b-submission",title:"Documenting Update Cadence for an FDA §524B Submission",type:"blog"},{url:"/blog/estar-cybersecurity-ivd-vs-nivd-submissions",title:"eSTAR v7.0 Cybersecurity for IVD vs nIVD Submissions",type:"blog"},{url:"/blog/fda-cybersecurity-failure-consequences-medical-devices",title:"FDA Cybersecurity Failure Consequences",type:"blog"},{url:"/blog/fda-cybersecurity-requirements-by-device-class",title:"Does Device Class Decide FDA Cybersecurity Requirements?",type:"blog"},{url:"/blog/fda-pen-test-timing-submission",title:"FDA Pen Test Timing for Submissions",type:"blog"},{url:"/blog/iec-62304-classes-vs-fda-device-classes-cybersecurity",title:"IEC 62304 Classes vs FDA Device Classes",type:"blog"},{url:"/blog/infusion-pump-cybersecurity-fda",title:"Infusion Pump Cybersecurity: FDA Expectations (2026)",type:"blog"},{url:"/blog/unresolved-anomalies-fda-cybersecurity-submission",title:"Unresolved Anomalies in FDA Cybersecurity Submissions",type:"blog"},{url:"/blog/how-to-navigate-the-fda-510k-and-pma-databases",title:"How to Navigate the FDA 510(k), De Novo, and PMA Databases for Cybersecurity",type:"blog"},{url:"/blog/mining-fda-databases-medical-device-cybersecurity-precedent",title:"Mining FDA Databases for Medical Device Cybersecurity Pre
209cedent",type:"blog"},{url:"/blog/fda-cybersecurity-pma-deficiencies-complete-response-letters",title:"PMA Cybersecurity Deficiencies and Complete Response Letters",type:"blog"}]},{id:"pen-testing",pillar:"/services/medical-device-penetration-testing",label:"Medical Device Penetration Testing",triggers:["medical device penetration testing","medical device pen test","medical device pentest","device penetration testing","fuzzing","BLE testing","BLE security testing","RF testing","firmware testing","firmware security testing","penetration testing","pen testing"],anchors:["medical device penetration testing","device security testing services","FDA-aligned penetration testing","MedTech pen testing program","medical device pen test methodology"],supports:[{url:"/services/medical-device-penetration-testing#methodology",title:"Pen Testing Methodology (Black/Gray/White-Box)",type:"guide"},{url:"/services/wireless-penetration-testing",title:"Wireless Penetration Testing",type:"guide"},{url:"/services/internal-penetration-testing",title:"Internal Penetration Testing",type:"guide"},{url:"/services/network-penetration-testing",title:"Network Penetration Testing",type:"guide"},{url:"/services/web-application-penetration-testing",title:"Web Application Penetration Testing",type:"guide"},{url:"/services/soc-2-penetration-testing",title:"SOC 2 Penetration Testing for MedTech & SaaS",type:"guide"},{url:"/blog/fda-pen-test-timing-submission",title:"FDA Pen Test Timing for Submissions",type:"blog"},{url:"/blog/security-requirements-testing-vs-penetration-testing",title:"Security Requirements Testing vs Penetration Testing",type:"blog"},{url:"/blog/rfid-hacking-protection-strategies",title:"RFID Hacking Protection Strategies",type:"blog"},{url:"/blog/what-is-rfid-cloning",title:"What Is RFID Cloning?",type:"blog"},{url:"/blog/exploring-common-embedded-operating-systems",title:"Common Embedded Operating Systems",type:"blog"},{url:"/blog/rtos-a-comprehensive-guide",title:"RTOS in Medical Devices: A Complete Guide",type:"blog"},{url:"/blog/the-role-of-non-executable-stacks-in-preventing-buffer-overflows",title:"Non-Executable Stacks and Buffer Overflows",type:"blog"},{url:"/blog/the-overlooked-danger-of-firmware-attacks",title:"The Overlooked Danger of Firmware Attacks",type:"blog"}]},{id:"sbom",pillar:"/services/fda-compliant-sbom-services-for-medtech",label:"SBOM",triggers:["SBOM","software bill of materials","SPDX","CycloneDX","vulnerability management","component inventory"],anchors:["FDA-compliant SBOM services","SBOM generation and management","SBOM for medical devices","MedTech SBOM program","SPDX/CycloneDX SBOM services"],supports:[{url:"/blog/medical-device-sbom-fda-requirements-and-submission-guide",title:"SBOM FDA Requirements",type:"blog"},{url:"/compare/spdx-vs-cyclonedx",title:"SPDX vs CycloneDX",type:"guide"},{url:"/topics/sbom",title:"SBOM-driven Vulnerability Management",type:"guide"},{url:"/blog/cisa-kev-catalog-medical-devices",title:"CISA KEV Catalog for Medical Devices",type:"blog"},{url:"/blog/docker-containers-medical-devices-fda-testing",title:"Docker Containers in Medical Devices",type:"blog"},{url:"/blog/h-isac-medical-device-threat-intelligence-sources",title:"H-ISAC and Medical Device Threat Intelligence",type:"blog"},{url:"/blog/what-is-code-signing",title:"What Is Code Signing?",type:"blog"},{url:"/blog/verification-vs-validation-in-software-development",title:"Verification vs Validation in Software Development",type:"blog"}]},{id:"threat-modeling",pillar:"/services/medical-device-threat-modeling",label:"Threat Modeling",triggers:["threat modeling","threat model","STRIDE","attack surface","AAMI SW96","AAMI TIR57","attack tree"],anchors:["medical device threat modeling","FDA-aligned threat modeling services","STRIDE threat modeling for MedTech","AAMI SW96 threat modeling","threat modeling program"],supports:[{url:"/guides/stride-threat-modeling-medical-devices",title:"STRIDE for Medical Devices",type:"guide"},{url:"/guides/12-critical-threat-modeling-gaps-medical-device-submissions",title:"12 Critical Threat Modeling Gaps",type:"guide"},{url:"/guides/aami-tir57-vs-tir97-comparison",title:"AAMI TIR57 / SW96 Overview",type:"blog"},{url:"/blog/tara-medical-device-cybersecurity",title:"TARA for Medical Devices",type:"blog"},{url:"/blog/fmea-vs-threat-modeling-medical-devices",title:"FMEA vs Threat Modeling for Medical Devices",type:"blog"},{url:"/blog/capa-medical-device-cybersecurity",title:"CAPA and Medical Device Cybersecurity",type:"blog"},{url:"/blog/aami-tir57-risk-management-for-medical-device-security",title:"AAMI TIR57 Risk Management for Device Security",type:"blog"},{url:"/blog/verification-vs-validation-in-software-development",title:"Verification vs Validation in Software Development",type:"blog"}]},{id:"deficiency-response",pillar:"/services/fda-cybersecurity-deficiency-response",label:"FDA Deficiency Response",triggers:["FDA deficiency letter","deficiency letter","AI letter","additional information letter","RTA hold","refuse to accept","deficiency response"],anchors:["FDA cybersecurity deficiency response","deficiency-letter response service","AI-letter response support","FDA AI / deficiency rescue","cybersecurity deficiency rescue"],supports:[{url:"/guides/fda-cybersecurity-deficiency-response-checklist",title:"Deficiency Response Checklist",type:"guide"},{url:"/fda-cybersecurity-deficiency-letters",title:"Deficiency Letters Hub",type:"guide"},{url:"/blog/unresolved-anomalies-fda-cybersecurity-submission",title:"Unresolved Anomalies in FDA Cybersecurity Submissions",type:"blog"},{url:"/blog/fda-cybersecurity-failure-consequences-medical-devices",title:"FDA Cybersecurity Failure Consequences",type:"blog"},{url:"/blog/how-to-navigate-the-fda-510k-and-pma-databases",title:"How to Navigate the FDA 510(k), De Novo, and PMA Databases for Cybersecurity",type:"blog"},{url:"/blog/mining-fda-databases-medical-device-cybersecurity-precedent",title:"Mining FDA Databases for Medical Device Cybersecurity Pre
209cedent",type:"blog"}]},{id:"postmarket",pillar:"/services/fda-postmarket-cybersecurity-services",label:"Postmarket Cybersecurity",triggers:["postmarket cybersecurity","post-market cybersecurity","coordinated vulnerability disclosure","CVD program","patch validation","legacy device cybersecurity","legacy medical device"],anchors:["FDA postmarket cybersecurity services","postmarket cybersecurity program","coordinated vulnerability disclosure (CVD) program","legacy device cybersecurity remediation","patch validation for medical devices"],supports:[{url:"/services/legacy-medical-device-cybersecurity-services",title:"Legacy Medical Device Cybersecurity",type:"guide"},{url:"/cvd",title:"Coordinated Vulnerability Disclosure",type:"guide"},{url:"/blog/does-fda-section-524b-apply-to-legacy-medical-devices",title:"Does FDA §524B Apply to Legacy Devices?",type:"blog"},{url:"/blog/cisa-kev-catalog-medical-devices",title:"CISA KEV Catalog for Medical Devices",type:"blog"},{url:"/blog/h-isac-medical-device-threat-intelligence-sources",title:"H-ISAC and Medical Device Threat Intelligence (2026)",type:"blog"},{url:"/blog/secure-update-infrastructure-medical-devices",title:"Secure Update Infrastructure for Medical Devices",type:"blog"},{url:"/blog/code-integrity-with-secure-boot",title:"Code Integrity with Secure Boot",type:"blog"},{url:"/blog/what-is-code-signing",title:"What Is Code Signing?",type:"blog"},{url:"/blog/the-overlooked-danger-of-firmware-attacks",title:"The Overlooked Danger of Firmware Attacks",type:"blog"}]}];for(const e of no){const t=pI[e.id];if(!t||!t.length)continue;const i=new Set(e.supports.map(r=>r.url));for(const r of t)i.has(r.url)||e.supports.push(r)}const gI=new Map(no.map(e=>[e.pillar,e]));new Map(no.map(e=>[e.id,e]));const fI=e=>gI.get(e),_N=e=>{const t=[];for(const i of no)(i.pillar===e||i.supports.some(r=>r.url===e))&&t.push(i);return t};(()=>{const e=new Set;for(const t of no){e.add(t.pillar);for(const i of t.supports)e.add(i.url)}return Array.from(e)})();const Ld="https://bluegoatcyber.com",kf=()=>{const{pathname:e}=Mt(),t=e.replace(/\/+$/,"")||"/",i=fI(t);if(!i)return null;const r=`${Ld}${i.pillar}`,s=new Set([i.pillar]),n=i.supports.filter(l=>s.has(l.url)?!1:(s.add(l.url),!0)),o={"@type":"ItemList","@id":`${r}#cluster-items`,name:`${i.label}. Related resources`,itemListOrder:"https://schema.org/ItemListOrderAscending",numberOfItems:n.length,itemListElement:n.map((l,d)=>{const u=`${Ld}${l.url}`;return{"@type":"ListItem",position:d+1,url:u,name:l.title,item:{"@id":`${u}#article`,"@type":"WebPage",url:u,name:l.title}}})},c={"@context":"https://schema.org","@type":"CollectionPage","@id":`${r}#cluster`,url:r,name:`${i.label}. Topic cluster`,isPartOf:{"@id":`${Ld}/#website`},about:i.label,mainEntity:o};return a.jsx(eo,{children:a.jsx("script",{type:"application/ld+json","data-schema":"cluster-collection",children:JSON.stringify(c)})})},yI=p.lazy(()=>S(()=>import("./SiteFooter-DLo4eAan.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(e=>({default:e.SiteFooter}))),bI=p.lazy(()=>S(()=>import("./StickyCta-C3rn5VVU.js"),__vite__mapDeps([11,12])).then(e=>({default:e.StickyCta}))),vI=({children:e})=>{const{pathname:t,search:i,hash:r}=Mt(),s=Za();p.useEffect(()=>{if(r){const c=decodeURIComponent(r.slice(1)),l=(d=0)=>{const u=document.getElementById(c);u?u.scrollIntoView({behavior:"smooth",block:"start"}):d<10&&setTimeout(()=>l(d+1),80)};requestAnimationFrame(()=>l());return}window.scrollTo(0,0)},[t,i,r]),p.useEffect(()=>{const c=l=>{if((l.metaKey||l.ctrlKey)&&l.key.toLowerCase()==="k"){const d=l.target,u=d==null?void 0:d.tagName,h=d==null?void 0:d.isContentEditable;if(u==="INPUT"||u==="TEXTAREA"||u==="SELECT"||h)return;l.preventDefault(),s("/search"),requestAnimationFrame(()=>{const g=document.querySelector('input[type="search"], input[name="q"], input[aria-label="Search"]');g==null||g.focus()})}};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[s]);const n=t.startsWith("/tools");return t.startsWith("/lp/")?a.jsxs("div",{className:"flex min-h-screen flex-col",children:[a.jsx(wf,{}),a.jsx(kf,{}),a.jsx("main",{className:"flex-1",children:e})]}):a.jsxs("div",{className:"flex min-h-screen flex-col",children:[a.jsx(wf,{}),a.jsx(kf,{}),!1,a.jsx(nI,{}),a.jsx("main",{className:`flex-1 ${n?"":"pb-24 sm:pb-20"}`,children:e}),a.jsx(p.Suspense,{fallback:null,children:a.jsx(yI,{})}),n?null:a.jsx(p.Suspense,{fallback:null,children:a.jsx(bI,{})})]})},wI=e=>"fromPrefix"in e,kI=e=>"fromPattern"in e,Uw=e=>"from"in e&&"to"in e,qw=[{from:"/blog/best-practices-for-implementing-cybersecurity-in-medical-device-design",to:"/blog/medical-device-cybersecurity-best-practices"},{from:"/blog/cryptographic-attacks-in-medical-devices",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/cybersecurity-labeling-the-key-to-transparency-and-accountability-in-medical-device-security",to:"/blog/medical-device-cybersecurity-labeling"},{from:"/blog/heap-spraying-medical-device-cybersecurity",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/how-medical-device-manufacturers-can-create-a-cyber-first-culture",to:"/blog/the-importance-of-cybersecurity-in-the-medical-device-industry"},{from:"/blog/iec-62304-and-medical-device-cybersecurity",to:"/blog/iec-81001-5-1-vs-iec-62304-medical-device-standards"},{from:"/blog/javascript-rce-medical-device-cybersecurity",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/key-escrow-medical-device-cybersecurity",to:"/blog/medical-device-cybersecurity-best-practices"},{from:"/blog/mastering-cybersecurity-in-medtech-the-key-to-accelerating-innovation-and-ensuring-patient-safety",to:"/blog/the-importance-of-cybersecurity-in-the-medical-device-industry"},{from:"/blog/navigating-cybersecurity-challenges-for-medtech-legacy-devices",to:"/guides/legacy-medical-device-cybersecurity"},{from:"/blog/navigating-the-cybersecurity-landscape-for-medtech-innovators-key-insights-from-the-experts",to:"/blog/the-importance-of-cybersecurity-in-the-medical-device-industry"},{from:"/blog/powershell-medical-device-cybersecurity-attacks-defense",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/premarket-fda-cybersecurity-submission-checklist",to:"/guides/fda-premarket-cybersecurity-submission-checklist"},{from:"/blog/return-to-libc-medical-device-cybersecurity-defense",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/secure-updates-for-medical-devices",to:"/blog/patch-update-mechanism-fda-section-524b-testing"},{from:"/blog/the-impact-of-openssf-on-medical-device-cybersecurity",to:"/blog/medical-device-cybersecurity-best-practices"},{from:"/guides/fda-sbom-requirements",to:"/blog/medical-device-sbom-fda-requirements-and-submission-guide"},{from:"/guides/premarket-fda-cybersecurity-submission-checklist",to:"/guides/fda-premarket-cybersecurity-submission-checklist"},{from:"/guides/fda-cybersecurity-guidance-summary-2026",to:"/guides/fda-cybersecurity-guidance"},{from:"/guides/fda-medical-device-sbom-requirements-checklist",to:"/blog/medical-device-sbom-fda-requirements-and-submission-guide"},{from:"/guides/tag/fda",to:"/guides#premarket-submission"},{from:"/guides/tag/standards",to:"/guides#standards-cross-regulatory"},{from:"/guides/tag/threat-modeling",to:"/guides#threat-modeling-risk"},{from:"/guides/tag/pen-testing",to:"/guides#testing-evidence"},{from:"/guides/tag/spdf",to:"/guides#start-here"},{from:"/guides/tag/postmarket",to:"/guides#postmarket"},{from:"/guides/tag/vendor-selection",to:"/guides#start-here"},{from:"/guides/tag/risk",to:"/guides#threat-modeling-risk"},{from:"/guides/tag/ai-ml",to:"/guides#standards-cross-regulatory"},{from:"/guides/tag/aiml",to:"/guides#standards-cross-regulatory"},{from:"/guides/tag/sbom",to:"/guides#sbom-supply-chain"},{from:"/guides/tag/supply-chain",to:"/guides#sbom-supply-chain"},{from:"/guides/tag/testing",to:"/guides#testing-evidence"},{from:"/guides/tag/threat-modelling",to:"/guides#threat-modeling-risk"},{from:"/guides/fda-2026-final-premarket-cybersecurity-guidance",to:"/guides/fda-cybersecurity-guidance"},{from:"/guides/section-524b-compliance-checklist",to:"/guides/fda-524b-cybersecurity-requirements-explained"},{from:"/guides/fda-524b-subsections-index",to:"/guides/fda-524b-cybersecurity-requirements-explained"},{from:"/guides/fda-section-524b-estar-walkthrough",to:"/guides/estar-v7-cybersecurity-mapping-fda-2026-guidance"},{from:"/guides/estar-v6-vs-v7-cybersecurity-comparison",to:"/guides/estar-v7-cybersecurity-mapping-fda-2026-guidance"},{from:"/guides/estar-cybersecurity-readiness-checklist",to:"/guides/estar-v7-cybersecurity-mapping-fda-2026-guidance"},{from:"/blog/different-classes-of-medical-devices-according-to-the-fda",to:"/blog/fda-cybersecurity-requirements-by-device-class"},{from:"/blog/de-identification-vs-anonymization-medical-devices",to:"/blog/de-identification-vs-anonymization-medical-devices-hipaa-gdpr"},{from:"/webinars/webinar-modern-fda-requirements-for-effective-sbom-implementation-9Ev8tm",to:"/webinars"},{from:"/news/news",to:"/news"},{fromPattern:"^(/blog/[^/]+)/$",to:"$1"},{from:"/blog/covert-vs-overt-channels-in-cybersecurity-understanding-the-difference",to:"/blog"},{from:"/blog/creating-effective-password-wordlists",to:"/blog"},{from:"/blog/what-is-imei-the-unique-identifier-for-your-mobile-device",to:"/blog"},{from:"/blog/what-is-uefi-secure-boot",to:"/blog"},{from:"/blog/medcrypt-vs-finite-state-vs-blue-goat-cyber",to:"/blog"},{from:"/podcast/trevor-slattery-answers-tough-medical-device-cyber-questions",to:"/podcast"},{from:"/news/blue-goat-cyber-launches-the-med-device-cyber-podcast-your-go-to-resource-for-medical-device-security",to:"/podcast"},{from:"/news/blue-goat-cyber-reaches-milestone-21-episodes-of-the-med-device-cyber-podcast-now-available",to:"/podcast"},{from:"/news/blue-goat-cyber-launches-milestone-25th-podcast-episode-cybersecurity-labeling-and-medtech-transparency",to:"/podcast"},{from:"/blog/best-practices-for-medical-device-cybersecurity-ensuring-safety-and-protection",to:"/blog/medical-device-cybersecurity-best-practices"},{fromPattern:"^/blog/the-goats-weekly-([0-9]{4}-[0-9]{2}-[0-9]{2})$",to:"/news/the-goats-weekly/$1"},{fromPattern:"^/news/the-goats-weekly/the-goats-weekly-([0-9]{4}-[0-9]{2}-[0-9]{2})$",to:"/news/the-goats-weekly/$1"},{from:"/services/gtm-compliance-bundle",to:"/services/medtech-compliance-bundle"},{from:"/sitemap",to:"/"},{from:"/site-index",to:"/"},{from:"/faq",to:"/faqs"},{from:"/journey/fda-response",to:"/services/fda-premarket-cybersecurity-services"},{from:"/topics/fda-premarket-cybersecurity",to:"/services/fda-premarket-cybersecurity-services"},{from:"/topics/medical-device-penetration-testing",to:"/services/medical-device-penetration-testing"},{from:"/webinars/5-common-medical-device-cybersecurity-misconceptions-raps-webcast-feb-2026-JVLMVY",to:"/webinars"},{from:"/webinars/5-common-medical-device-cybersecurity-misconceptions-raps-webcast-feb-2026",to:"/webinars"},{from:"/segments",to:"/medtech-segments"},{fromPrefix:"/segments",toPrefix:"/medtech-segments"},{from:"/services/fda-premarket-cybersecurity",to:"/services/fda-premarket-cybersecurity-services"},{from:"/services/blue-goat-cyber-penetration-testing-methodology",to:"/services/medical-device-penetration-testing#methodology"},{from:"/services/penetration-testing/blue-goat-cyber-penetration-testing-methodology",to:"/services/medical-device-penetration-testing#methodology"},{from:"/services/fda-postmarket-cybersecurity",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/services/legacy-medical-device-cybersecurity",to:"/services/legacy-medical-device-cybersecurity-services"},{from:"/services/secure-product-development-framework-spdf",to:"/guides/medical-device-cybersecurity-spdf-playbook"},{from:"/services/spdf",to:"/guides/medical-device-cybersecurity-spdf-playbook"},{from:"/services/medical-device-cybersecurity",to:"/services"},{from:"/services/fda-medical-device-cybersecurity",to:"/services/fda-cybersecurity"},{from:"/services/fda-medical-device-cybersecurity-services",to:"/services/fda-cybersecurity"},{from:"/services/sbom-software-bill-of-materials-services",to:"/services/fda-compliant-sbom-services-for-medtech"},{from:"/services/penetration-testing-services",to:"/services/medical-device-penetration-testing"},{from:"/services/hipaa-security-risk-analysis",to:"/services/hipaa-penetration-testing"},{from:"/services/vulnerability-assessment-services",to:"/services/medical-device-penetration-testing"},{from:"/services/ciso-as-a-service",to:"/services"},{from:"/services/black-box-penetration-testing",to:"/services/medical-device-penetration-testing#methodology"},{from:"/services/gray-box-penetration-testing",to:"/services/medical-device-penetration-testing#methodology"},{from:"/services/white-box-penetration-testing",to:"/services/medical-device-penetration-testing#methodology"},{from:"/services/application-penetration-testing",to:"/services/web-application-penetration-testing"},{from:"/services/penetration-testing",to:"/services/medical-device-penetration-testing"},{from:"/services/static-application-security-testing-sast",to:"/services/medical-device-penetration-testing#sast-dast"},{from:"/services/dynamic-application-security-testing-dast",to:"/services/medical-device-penetration-testing#sast-dast"},{fromPrefix:"/services/penetration-testing",toPrefix:"/services"},{from:"/fda-compliant-sbom-services-for-medtech",to:"/services/fda-compliant-sbom-services-for-medtech"},{from:"/fda-postmarket-cybersecurity-services",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/fda-premarket-cybersecurity-services",to:"/services/fda-premarket-cybersecurity-services"},{from:"/medical-device-penetration-testing",to:"/services/medical-device-penetration-testing"},{from:"/medical-device-premarket-cybersecurity-solutions",to:"/services/fda-premarket-cybersecurity-services"},{from:"/medical-device-postmarket-cybersecurity-solutions",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/cybersecurity-packages",to:"/services"},{from:"/cybersecurity-packages/fda-compliance-package",to:"/services/fda-premarket-cybersecurity-services"},{from:"/cybersecurity-packages/medical-device-cybersecurity-premarket-submission",to:"/services/fda-premarket-cybersecurity-services"},{from:"/cybersecurity-packages/medical-device-cybersecurity-postmarket-management",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/cybersecurity-packages/vulnerability-assessment-as-a-service-vaaas-package",to:"/services/medical-device-penetration-testing"},{from:"/industries/cybersecurity-for-financial-service-providers",to:"/services"},{from:"/industries/cybersecurity-for-healthcare-providers",to:"/services"},{from:"/industries/cybersecurity-for-saas-providers",to:"/services"},{from:"/services/services",to:"/services"},{from:"/services/fda-cybersecurity-submission-support",to:"/services/fda-premarket-cybersecurity-services"},{from:"/services/medical-device-sbom-management",to:"/services/fda-compliant-sbom-services-for-medtech"},{from:"/services/threat-modeling-services",to:"/services/medical-device-threat-modeling"},{fromPrefix:"/blog/tag",toPrefix:"/blog"},{from:"/blog/twofish-vs-blowfish-a-comparison-of-two-popular-encryption-algorithms",to:"/services/fda-premarket-cybersecurity-services"},{from:"/blog/unveiling-the-meaning-of-1337",to:"/blog"},{from:"/blog/the-origins-of-pwned-a-look-into-hacker-slang-and-its-impact",to:"/blog"}
209,{from:"/blog/what-is-leetspeak-a-comprehensive-guide",to:"/blog"},{from:"/blog/who-is-albert-gonzalez",to:"/blog"},{from:"/blog/a-guide-to-cryptographically-secure-pseudo-random-number-generators-csprng",to:"/services/fda-compliant-sbom-services-for-medtech"},{from:"/blog/message-authentication-codes-in-cybersecurity",to:"/services/medical-device-penetration-testing#methodology"},{from:"/blog/touchscreen-vulnerabilities-addressing-hidden-risks",to:"/services/medical-device-penetration-testing"},{from:"/blog/what-is-a-cybersecurity-fault-tree-analysis",to:"/services/medical-device-threat-modeling"},{from:"/blog/what-are-hardcoded-passwords-in-software",to:"/services/medical-device-penetration-testing"},{from:"/blog/defining-residual-risk",to:"/services/medical-device-threat-modeling"},{from:"/blog/risk-registers-explained",to:"/services/medical-device-threat-modeling"},{from:"/blog/a-guide-to-hardware-security-modules-hsms",to:"/services/fda-premarket-cybersecurity-services"},{from:"/blog/exploring-common-embedded-operating-systems",to:"/services/medical-device-penetration-testing"},{from:"/blog/network-segmentation-as-a-security-strategy",to:"/services/medical-device-penetration-testing"},{from:"/blog/what-is-code-signing",to:"/services/fda-premarket-cybersecurity-services"},{from:"/blog/code-integrity-with-secure-boot",to:"/services/fda-premarket-cybersecurity-services"},{from:"/blog/what-is-the-kev",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/blog/defense-in-depth-layered-security-strategies",to:"/services/medical-device-penetration-testing"},{from:"/blog/cybersecurity-risk-matrices-explained",to:"/services/medical-device-threat-modeling"},{from:"/blog/the-overlooked-danger-of-firmware-attacks",to:"/services/medical-device-penetration-testing"},{from:"/blog/verification-vs-validation-in-software-development",to:"/guides/medical-device-cybersecurity-spdf-playbook"},{from:"/blog/rfid-hacking-protection-strategies",to:"/services/wireless-penetration-testing"},{from:"/blog/the-capa-and-fmea-relationship",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/blog/constrained-interfaces-and-cybersecurity-effects",to:"/services/medical-device-penetration-testing"},{from:"/blog/exploitability-vs-likelihood-in-cybersecurity-risk",to:"/services/medical-device-threat-modeling"},{from:"/blog/exploring-the-cybersecurity-and-infrastructure-security-agency-cisa-known-exploited-vulnerabilities-catalog",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/blog/what-is-rfid-cloning",to:"/services/wireless-penetration-testing"},{from:"/blog/what-is-the-mitre-attck-framework",to:"/services/medical-device-threat-modeling"},{from:"/blog/rtos-a-comprehensive-guide",to:"/services/medical-device-penetration-testing"},{from:"/blog/fda-medical-device-cybersecurity-guidance-2026",to:"/guides/fda-cybersecurity-guidance"},{from:"/blog/how-to-meet-fda-524b-cybersecurity-requirements",to:"/guides/fda-cybersecurity-guidance"},{from:"/blog/fda-estar-cybersecurity-documentation-a-510k-field-guide",to:"/blog/510k-cybersecurity-requirements-every-maker-must-meet"},{from:"/blog/pma-de-novo-510k-cybersecurity-fda-submissions",to:"/blog/510k-cybersecurity-requirements-every-maker-must-meet"},{from:"/blog/what-is-a-risk-management-file-for-fda-medical-device-cybersecurity",to:"/blog/medical-device-cybersecurity-risk-analysis-the-fda-playbook"},{from:"/blog/buffer-overflow-attacks-prevention-tips",to:"/services/medical-device-penetration-testing"},{from:"/blog/quantum-key-distribution-explained",to:"/services/fda-premarket-cybersecurity-services"},{from:"/blog/cybersecurity-traceability-matrices-explained",to:"/blog/medical-device-cybersecurity-traceability"},{from:"/blog/what-is-a-cyber-device-understanding-fdas-latest-definition",to:"/blog/what-is-a-medical-cyber-device-unraveling-the-fdas-cyber-device-definition"},{from:"/blog/25-use-cases-for-white-box-penetration-testing",to:"/services/medical-device-penetration-testing"},{from:"/blog/understanding-replay-attacks-in-cybersecurity",to:"/blog/medical-device-key-exchange-cybersecurity"},{from:"/blog/understanding-vapt-more-than-just-penetration-testing",to:"/services/medical-device-penetration-testing"},{from:"/blog/authenticator-apps-vs-sms-for-two-factor-authentication-which-is-safer",to:"/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization"},{from:"/blog/differences-between-obfuscation-and-encryption",to:"/blog/medical-device-key-exchange-cybersecurity"},{from:"/blog/nonce-understanding-the-concept-and-its-importance",to:"/blog/medical-device-key-exchange-cybersecurity"},{from:"/blog/how-is-xor-used-in-encryption",to:"/blog/medical-device-key-exchange-cybersecurity"},{from:"/blog/the-role-of-non-executable-stacks-in-preventing-buffer-overflows",to:"/blog/embedded-cybersecurity-challenges"},{from:"/blog/covert-channels-using-lan-turtles",to:"/blog/cybersecurity-attack-entry-points-for-medical-devices"},{from:"/blog/homeland-episode-with-pacemaker-attack-assessing-the-realism",to:"/blog/the-dangers-of-pacemaker-hacks-what-you-need-to-know"},{from:"/blog/dns-exfiltration-with-base64-encoding-a-stealthy-data-theft-technique",to:"/blog/cybersecurity-attack-entry-points-for-medical-devices"},{from:"/blog/why-is-insecure-used-instead-of-unsecure-in-cybersecurity",to:"/blog"},{from:"/blog/the-role-of-input-validation-in-preventing-attacks",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/debunking-cell-phone-cloning-myths",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/understanding-aslr-and-buffer-overflow-attacks",to:"/blog/embedded-cybersecurity-challenges"},{from:"/blog/understanding-suid-attacks-and-how-to-protect-against-them",to:"/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization"},{from:"/blog/tlsv1-3-an-introduction-and-overview",to:"/blog/securing-communication-protocols-in-medical-devices"},{from:"/blog/sqlmap-tutorial-mastering-sql-injection-detection-and-exploitation",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/command-shell-via-sql-injection-on-login-page",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/what-is-an-xxe-attack-in-cybersecurity",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/comparing-wafs-and-reverse-proxies",to:"/blog/why-ids-ips-agents-dont-work-for-medical-devices"}
209,{from:"/blog/3-ways-to-break-encryption",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/shodan-io-the-search-engine-for-hackers",to:"/blog/cybersecurity-attack-entry-points-for-medical-devices"},{from:"/blog/what-is-a-software-defined-radio",to:"/blog/examining-medradio-vulnerabilities-in-medical-devices-cybersecurity"},{from:"/blog/the-role-of-mds%C2%B2-in-medical-device-cybersecurity",to:"/blog/the-role-of-mds2-in-medical-device-cybersecurity"},{from:"/blog/the-role-of-mds²-in-medical-device-cybersecurity",to:"/blog/the-role-of-mds2-in-medical-device-cybersecurity"},{from:"/blog%C2%B2-in-medical-device-cybersecurity",to:"/blog/the-role-of-mds2-in-medical-device-cybersecurity"},{from:"/blog²-in-medical-device-cybersecurity",to:"/blog/the-role-of-mds2-in-medical-device-cybersecurity"},{from:"/blog/saMD-vs-siMD-what-medical-device-manufacturers-need-to-know",to:"/blog/samd-vs-simd-what-medical-device-manufacturers-need-to-know"},{from:"/blog/iatf-16949-and-medical-device-cybersecurity",to:"/blog/iso-13485-and-its-relation-to-medical-device-cybersecurity"},{from:"/blog/how-does-medical-device-cybersecurity-relate-to-iso-9001",to:"/blog/iso-13485-and-its-relation-to-medical-device-cybersecurity"},{from:"/blog/iso-27001-and-medical-device-cybersecurity",to:"/blog/why-iso-27001-and-soc-2-are-not-enough-for-fda-medical-device-cybersecurity"},{from:"/blog/where-did-2600-come-from",to:"/leadership"},{from:"/blog/what-is-electronic-frontier-foundation-eff",to:"/cvd"},{from:"/blog/the-clipper-chip-controversy-encryption-privacy-and-government-surveillance",to:"/blog/medical-device-key-exchange-cybersecurity"},{from:"/blog/alternatives-to-tor-accessing-the-dark-web-safely",to:"/services/medical-device-penetration-testing"},{from:"/blog/a-guide-to-hacker-hat-colors",to:"/services/medical-device-penetration-testing"},{from:"/blog/what-is-a-salami-attack",to:"/blog/cybersecurity-attack-entry-points-for-medical-devices"},{from:"/blog/discovering-the-google-hacking-database",to:"/services/medical-device-penetration-testing"},{from:"/blog/what-is-self-aware-ai",to:"/blog/ai-overfitting-cybersecurity-threats-in-medical-devices"},{from:"/blog/unsigned-vs-signed-integer",to:"/blog/embedded-cybersecurity-challenges"},{from:"/blog/what-is-an-interpreted-programming-language",to:"/blog"},{from:"/blog/top-nfc-vulnerabilities",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/nfc-vs-rfid-which-is-more-secure",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/top-rfid-cybersecurity-vulnerabilities",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/protecting-against-rfid-attacks-what-you-need-to-know",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/the-relationship-between-verification-validation-and-cybersecurity-testing",to:"/blog/vv-regression-testing-medical-device-cybersecurity"},{from:"/blog/the-importance-of-regression-testing-in-cybersecurity",to:"/blog/vv-regression-testing-medical-device-cybersecurity"},{from:"/infographics",to:"/resources/infographics"},{from:"/about-us",to:"/about"},{from:"/team",to:"/leadership"},{from:"/our-team",to:"/leadership"},{from:"/story",to:"/about"},{from:"/our-story",to:"/about"},{from:"/founder",to:"/team/christian-espinosa"},{from:"/about-us/awards",to:"/about/awards"},{from:"/about-us/leadership",to:"/leadership"},{from:"/about/leadership",to:"/leadership"},{from:"/awards",to:"/about/awards"},{from:"/company",to:"/about"},{from:"/values",to:"/about"},{from:"/giveback",to:"/give-back"},{from:"/why-blue-goat",to:"/why"},{from:"/why-blue-goat-cyber",to:"/why"},{from:"/ask",to:"/ask-the-goat"},{from:"/guide",to:"/guides"},{from:"/fda-cybersecurity-deficiency-response-checklist",to:"/guides/fda-cybersecurity-deficiency-response-checklist"},{from:"/the-medtech-cybersecurity-standards-decoder",to:"/guides/the-medtech-cybersecurity-standards-decoder"},{from:"/10-reasons-medical-device-cybersecurity-vendors-fail-you",to:"/guides"},{from:"/12-critical-findings-from-medical-device-penetration-tests",to:"/guides/12-critical-findings-from-medical-device-penetration-tests"},{from:"/12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions",to:"/guides/12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions"},{from:"/postmarket-cybersecurity-readiness-plan",to:"/guides/postmarket-cybersecurity-readiness-plan"},{from:"/medical-device-cybersecurity-spdf-playbook",to:"/guides/medical-device-cybersecurity-spdf-playbook"},{from:"/12-critical-threat-modeling-gaps-medical-device-submissions",to:"/guides/12-critical-threat-modeling-gaps-medical-device-submissions"},{from:"/guides/medical-device-incident-response-plan-fda",to:"/blog/medical-device-incident-response-plan-fda"},{from:"/playbooks",to:"/resources/playbooks"},{from:"/resources/regulatory-strategy",to:"/regulatory-strategy"},{from:"/fda-pathways",to:"/regulatory-strategy"},{from:"/funding",to:"/funding-cybersecurity"},{from:"/cybersecurity-budget",to:"/funding-cybersecurity"},{from:"/resources/webinars",to:"/webinars"},{from:"/resources/checklists",to:"/guides?format=Checklist"},{from:"/blog/category/audits",to:"/blog"},{from:"/meet-us",to:"/events"},{from:"/events/lsi-europe-2026",to:"/events"},{from:"/customer-stories",to:"/testimonials"},{fromPrefix:"/testimonials",toPrefix:"/testimonials"},{from:"/case-study",to:"/case-studies"},{fromPrefix:"/case-study",toPrefix:"/case-studies"},{fromPrefix:"/the-med-device-cyber-podcast",toPrefix:"/podcast"},{from:"/resources/podcasts",to:"/podcast"},{from:"/podcast/episode-9-fda-ai-guidance-explained-what-it-means-for-medical-device-cybersecurity",to:"/podcast/fda-ai-guidance-explained-what-it-means-for-medical-device-cybersecurity"},{from:"/podcast/ai-in-healthcare-why-humans-still-matter-with-brandon-fertig-senior-manager-at-p",to:"/podcast/edge-cases-alarm-fatigue-and-why-ai-cannot-replace-clinical-judgment-with-brando"},{from:"/podcast/cybersecurity-challenges-trends-in-us-medtech-with-paul-lukas-
209hoffschmidt",to:"/podcast/cybersecurity-challenges-trends-in-us-healthcare-with-paul-lukas-hoffschmidt"},{from:"/podcast/fda-cybersecurity-gets-real-with-monica-monta-ez-of-namsa",to:"/podcast"},{from:"/podcast/how-to-design-devices-that-integrate-into-clinical-workflow-without-disruption",to:"/podcast/edge-cases-alarm-fatigue-and-why-ai-cannot-replace-clinical-judgment-with-brando"},{from:"/podcast/how-trump-rfk-jr-affect-ai-and-medical-device-cybersecurity-guidelines",to:"/podcast"},{from:"/podcast/medical-device-cyber-failures-become-fatal",to:"/podcast"},{from:"/podcast/start-qms-early-to-avoid-reverse-documentation-with-dr-basant-bajpai",to:"/podcast"},{from:"/podcast/startups-regulations-risk-insights-from-medtech-guru-etienne-nichols",to:"/podcast"},{from:"/podcast/the-differences-between-black-gray-and-white-penetration-testing",to:"/podcast"},{from:"/podcast/the-hidden-cybersecurity-risks-when-doctors-use-ai-diagnostics",to:"/podcast"},{from:"/podcast/the-hidden-reason-medtech-products-get-recalled-it-s-not-quality-issues-with-wil",to:"/podcast"},{from:"/podcast/the-med-device-cyber-podcast-trailer",to:"/podcast"},{from:"/podcast/vibe-coding-security-risks-malicious-injection-with-jake-rodriguez-of-triangle-t",to:"/podcast/vibe-coding-security-risks-and-malicious-code-injection-with-jake-rodriguez-of-t"},{from:"/podcast/vulnerability-penetration-other-cybersecurity-testing-types-explained",to:"/podcast"},{from:"/podcast/what-15-years-in-medtech-taught-this-ceo-about-cybersecurity-with-marc-zemel",to:"/podcast/what-medtech-startups-get-wrong-about-cybersecurity-documentation-with-marc-zeme"},{from:"/podcast/what-is-a-medical-cyber-device",to:"/podcast"},{from:"/podcast/what-is-required-for-an-fda-premarket-cyber-submission",to:"/podcast"},{from:"/podcast/when-medical-device-cybersecurity-becomes-a-crime",to:"/podcast"},{from:"/podcast/who-owns-patient-data-security-in-trials-with-rob-bedford-ceo-of-franklyn-health",to:"/podcast/why-clinical-trials-are-the-most-expensive-capital-outlay-for-startups-with-rob-"},{from:"/podcast/why-medtech-is-the-future-of-entrepreneurship-with-omar-khateeb",to:"/podcast/what-it-takes-to-succeed-in-the-medtech-industry-with-omar-khateeb"},{from:"/referral-partners",to:"/partners"},{from:"/partner-program",to:"/partners"},{from:"/network",to:"/ecosystem"},{from:"/prepare",to:"/prep"},{from:"/podcast-appearances",to:"/media"},{from:"/industries",to:"/medtech-segments"},{fromPrefix:"/industries",toPrefix:"/medtech-segments"},{from:"/privacy",to:"/privacy-policy"},{from:"/terms",to:"/terms-of-service"},{from:"/cookies",to:"/cookie-policy"},{from:"/accessibility-statement",to:"/accessibility"},{from:"/readiness-quiz",to:"/readiness"},{from:"/pen-test-scope",to:"/scope-estimator"},{from:"/scope",to:"/scope-estimator"},{from:"/quote",to:"/contact"},{from:"/instant-quote",to:"/contact"},{from:"/roi-calculator",to:"/cost-of-delay"},{from:"/myths",to:"/misconceptions"},{from:"/hubs",to:"/topics"},{from:"/receipts",to:"/proof"},{fromPrefix:"/category",toPrefix:"/blog"},{fromPrefix:"/tag",toPrefix:"/blog"},{fromPrefix:"/author",toPrefix:"/about"},{fromPrefix:"/page",toPrefix:"/blog"},{from:"/comments/feed",to:"/blog"},{fromPrefix:"/feed",toPrefix:"/goatfeed"},{from:"/wp-login.php",to:"/"},{fromPattern:"^/wp-content/.*$",to:"/"},{fromPattern:"^/wp-admin/.*$",to:"/"},{fromPattern:"^/wp-includes/.*$",to:"/"},{from:"/blog/blog",to:"/blog"},{fromPrefix:"/meetings",toPrefix:"/contact"},{from:"/resources/12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions",to:"/guides/12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions"},{from:"/blog/stride-threat-modeling-for-connected-medical-devices",to:"/guides/stride-threat-modeling-medical-devices"},{from:"/blog/what-is-a-coordinated-vulnerability-disclosure-process",to:"/cvd"},{from:"/blog/penetration-testing-for-medical-devices-what-fda-expects",to:"/services/medical-device-penetration-testing"},{from:"/blog/how-to-respond-to-a-510k-cybersecurity-deficiency-letter",to:"/guides/fda-cybersecurity-deficiency-response-checklist"},{from:"/blog/what-are-fda-deficiency-letters-for-medical-devices",to:"/guides/fda-cybersecurity-deficiency-letter-examples"},{from:"/blog/the-importance-of-in-depth-attack-surface-analysis-for-medical-device-testing",to:"/blog/understanding-medical-device-attack-surface-analysis"},{from:"/blog/enhancing-cybersecurity-a-guide-to-fault-tree-analysis-fta",to:"/services/medical-device-threat-modeling"},{from:"/blog/the-importance-of-open-box-testing-in-medical-device-cybersecurity",to:"/blog/closed-box-testing-in-medical-device-cybersecurity"},{from:"/services/medical-device-penetration-testing-services",to:"/services/medical-device-penetration-testing"},{from:"/services/medical-device-cybersecurity-penetration-testing",to:"/services/medical-device-penetration-testing"},{from:"/blog/fda-cybersecurity-guidance-what-device-makers-must-know",to:"/guides/fda-cybersecurity-guidance"},{from:"/blog/fda-cybersecurity-requirements-medical-devices-2026",to:"/guides/fda-cybersecurity-guidance"},{from:"/blog/fda-cybersecurity-pma-deficiencies-complete-response-letters",to:"/guides/fda-pma-cybersecurity-requirements"},{from:"/blog/aami-tir57-risk-management-for-medical-device-security",to:"/guides/aami-tir57-vs-tir97-comparison"},{from:"/blog/aami-tir57-explained",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/aami-tir57-overview",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/what-is-aami-tir57",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/aami-tir57-medical-device-cybersecurity",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/aami-tir57-security-risk-management",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/tir57-vs-sw96",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/aami-sw96-vs-tir57",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/did-sw96-replace-tir57",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/did-aami-sw96-replace-tir57",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/blog/sw96-replaces-tir57",to:"/blog/did-aami-sw96-replace-tir57-fda-2026"},{from:"/compare/tir57-vs-sw96",to:"/compare/aami-sw96-vs-tir57"},{from:"/resources/white-papers",to:"/guides"},{from:"/resources/infographics/fda-premarket-flow",to:"/resources/infographics"},{from:"/resources/infographics/sbom-anatomy",to:"/resources/infographics"},{from:"/resources/infographics/stride-connected-device",to:"/resources/infographics"},{from:"/resources/infographics/spdf-lifecycle",to:"/resources/infographics"},{from:"/resources/infographics/attack-surface-map",to:"/resources/infographics"}
209,{from:"/resources/infographics/deficiency-decision-tree",to:"/resources/infographics"},{from:"/resources/infographics/deficiency-letter-decision-tree",to:"/resources/infographics"},{from:"/resources/infographics/fda-premarket-submission-flow",to:"/resources/infographics"},{from:"/eu",to:"/"},{from:"/eu/about",to:"/about"},{from:"/eu/contact",to:"/contact"},{from:"/eu/glossary",to:"/glossary"},{from:"/eu/regulatory-strategy",to:"/regulatory-strategy"},{from:"/eu/services/eu-mdr-premarket-cybersecurity",to:"/services/fda-premarket-cybersecurity-services"},{from:"/eu/services/eu-mdr-postmarket-cybersecurity",to:"/services/fda-postmarket-cybersecurity-services"},{from:"/eu/services/medical-device-penetration-testing",to:"/services/medical-device-penetration-testing"},{from:"/eu/services/sbom-services-medical-devices-eu",to:"/services/fda-compliant-sbom-services-for-medtech"},{from:"/eu/services/threat-modeling-eu-mdr",to:"/services/medical-device-threat-modeling"},{from:"/blog/a-guide-to-fmea-failure-mode-and-effects-analysis",to:"/guides/security-risk-assessment-iec-81001-5-1"},{from:"/blog/a-guide-to-rfcs",to:"/blog"},{from:"/blog/a-guide-to-symmetric-key-encryption",to:"/guides/fda-security-control-categories-medical-devices"},{from:"/blog/acls-in-cybersecurity-managing-access-control-effectively",to:"/guides/fda-security-control-categories-medical-devices"},{from:"/blog/biometric-security-and-the-gummy-bear-attack",to:"/blog"},{from:"/blog/leveraging-the-owasp-top-10-framework-for-secure-applications",to:"/services/medical-device-penetration-testing"},{from:"/blog/ot-vs-it-security-differences-that-matter",to:"/guides/medical-device-cybersecurity-spdf-playbook"},{from:"/blog/the-challenge-of-attribution-in-cyber-attacks",to:"/blog"},{from:"/blog/the-seven-principles-of-software-testing",to:"/guides/fda-cybersecurity-testing-requirements-taxonomy"},{from:"/blog/the-rise-of-nfc-attacks-how-to-protect-your-devices",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/medical-device-software-testing",to:"/blog/a-comprehensive-guide-to-software-testing-for-medical-devices"},{from:"/blog/automated-testing-for-medical-device-software-ensuring-efficiency-and-reliability",to:"/blog/a-comprehensive-guide-to-software-testing-for-medical-devices"},{from:"/blog/navigating-the-evolving-cybersecurity-landscape-for-medical-devices",to:"/blog/the-importance-of-cybersecurity-in-the-medical-device-industry"},{from:"/blog/medical-device-security-testing-complete-taxonomy",to:"/guides/fda-cybersecurity-testing-requirements-taxonomy"},{from:"/guides/champion-toolkit-checklist",to:"/guides"},{from:"/guides/champion-toolkit",to:"/guides"},{from:"/guides/classification-decision-tree-checklist",to:"/guides/fda-pathway-cybersecurity-differences"},{from:"/guides/classification-decision-tree",to:"/guides/fda-pathway-cybersecurity-differences"},{from:"/guides/cost-of-delay-comparison-checklist",to:"/guides"},{from:"/guides/cost-of-delay-comparison",to:"/guides"},{from:"/guides/fda-cyber-requirements",to:"/guides/fda-premarket-cybersecurity-submission-checklist"},{from:"/guides/fda-cyber-requirements-checklist",to:"/guides/fda-premarket-cybersecurity-submission-checklist"},{from:"/guides/fixed-fee-vs-tm-checklist",to:"/guides"},{from:"/guides/fixed-fee-vs-tm",to:"/guides"},{from:"/guides/insurance-limits-checklist",to:"/guides"},{from:"/guides/insurance-limits",to:"/guides"},{from:"/guides/ip-data-ownership-checklist",to:"/guides"},{from:"/guides/ip-data-ownership",to:"/guides"},{from:"/guides/msa-redlines-playbook-checklist",to:"/services"},{from:"/guides/msa-redlines-playbook",to:"/services"},{from:"/guides/readiness-diagnostic-outline-checklist",to:"/guides"},{from:"/guides/readiness-diagnostic-outline",to:"/guides"},{from:"/guides/security-questionnaire-pack-checklist",to:"/guides"},{from:"/guides/security-questionnaire-pack",to:"/guides"},{from:"/guides/sow-line-item-map-checklist",to:"/guides"},{from:"/guides/sow-line-item-map",to:"/guides"},{from:"/guides/submission-track-record-checklist",to:"/guides"},{from:"/guides/submission-track-record",to:"/guides"},{from:"/guides/vendor-comparison-sheet-checklist",to:"/guides"},{from:"/guides/vendor-comparison-sheet",to:"/guides"},{from:"/guides/vendor-evaluation-grid-checklist",to:"/guides"},{from:"/guides/vendor-evaluation-grid",to:"/guides"},{from:"/guides/board-pack",to:"/guides"},{from:"/guides/budget-aware-engagements",to:"/guides"},{from:"/news/blue-goat-cyber-highlights-fda-cybersecurity-at-devicetalks-west-2025-cto-trevor-slattery-to-present",to:"/news"},{from:"/news/blue-goat-cyber-sponsors-lsi-asia-2025-cto-trevor-slattery-to-lead-high-impact-medtech-cybersecurity-panel",to:"/news"},{from:"/blog/nfc-rfid-security-medical-devices",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/nfc-ble-security-risks-medical-devices",to:"/blog/nfc-and-medical-device-cybersecurity"},{from:"/blog/what-is-the-fdas-quality-system-regulation-qsr-for-medical-device-cybersecurity",to:"/blog/21-cfr-part-820-and-its-role-in-medical-device-cybersecurity"},{from:"/blog/fda-medical-device-cybersecurity-standards-interoperability-considerations",to:"/blog/medical-device-cybersecurity-interoperability-concerns"},{from:"/blog/hooded-hacker-myth-medical-device-cybersecurity",to:"/blog/medical-device-cybersecurity-the-real-threat-isnt-genius-hackers-its-neglect"},{from:"/blog/ajax-vulnerabilities-medical-device-cybersecurity",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/url-encoding-medical-device-web-security",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/curl-medical-device-cybersecurity-testing",to:"/blog/scoping-a-medical-device-penetration-test"},{from:"/blog/top-10-ways-cybercriminals-monetize-medical-device-cybersecurity-breaches",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/iris-scan-spoofing-medical-device-cybersecurity",to:"/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization"},{from:"/blog/permissions-vs-rights-access-control-for-medical-device-security",to:"/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization"},{from:"/blog/offline-vs-online-password-attacks-medtech",to:"/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization"},{from:"/blog/medical-device-cybersecurity-the-role-of-nonrepudiation",to:"/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization"},{from:"/blog/the-essential-checklist-for-medical-device-cybersecurity-assessments",to:"/blog/cybersecurity-practices-for-protecting-medical-devices-manufacturers-checklist"},{from:"/blog/5-essential-steps-to-secure-your-medical-devices-from-cyber-threats",to:"/blog/cybersecurity-practices-for-protecting-medical-devices-manufacturers-checklist"},{from:"/blog/mds2-hscc-disclosure-medical-devices",to:"/blog/the-role-of-mds2-in-medical-device-cybersecurity"},{from:"/blog/how-jsp2-and-mds2-fit-together-medical-device-cybersecurity",to:"/blog/the-role-of-mds2-in-medical-device-cybersecurity"},{from:"/blog/penetration-test-case-design-medical-devices",to:"/blog/scoping-a-medical-device-penetration-test"},{from:"/blog/what-are-the-most-concerning-medical-device-cyber-threats",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/former-cybersecurity-employees-indicted-in-medical-device-company-hack",to:"/blog/when-cybersecurity-becomes-a-crime-what-the-illumina-case-signals-for-medical-device-makers"},{from:"/blog/medical-device-cybersecurity-protecting-against-cross-site-scripting-xss-attacks",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/get-vs-post-medical-device-api-security",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/secure-file-upload-validation-web-security-medtech",to:"/blog/medical-device-sql-injection-parameterized-queries"},{from:"/blog/ventilator-recalled-for-cybersecurity-risk-was-a-lack-of-secure-by-design-the-cause",to:"/blog/recalled-medical-devices-cybersecurity-failures"},{from:"/blog/reports-fda-to-scrutinize-medical-device-cybersecurity-significantly-more-in-2026",to:"/blog/fda-section-524b-subsections-explained"},{from:"/blog/the-fdas-new-medical-device-cybersecurity-rules-are-more-than-red-tape",to:"/blog/the-importance-of-cybersecurity-in-the-medical-device-industry"},{from:"/blog/why-your-medical-device-go-to-market-strategy-should-include-cybersecurity",to:"/blog/cybersecurity-before-mvp-vs-after-market-fit-cost-of-waiting"},{from:"/blog/two-medical-device-cybersecurity-gaps-dispersed-responsibility-and-a-scarcity-of-asset-inventory",to:"/blog/how-can-medical-device-manufacturers-support-operational-cybersecurity"},{from:"/blog/birthday-attack-hashing-medtech-collision-risk",to:"/blog/code-data-and-execution-integrity-security-controls-and-medical-device-cybersecurity"},{from:"/blog/ephemeral-ports-medical-device-cybersecurity",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/blog/steganography-in-medical-devices",to:"/blog/understanding-relevant-threats-for-medical-devices"},{from:"/careers/regulatory-affairs-documentation-analyst",to:"/careers/regulatory-affairs-technical-writer"},{from:"/careers/project-manager",to:"/careers/project-manager-medical-device-cybersecurity"},{from:"/careers/business-development-executive",to:"/careers/business-development-manager-medical-device-cybersecurity"},{from:"/careers/sales-engineer",to:"/careers/sales-engineer-medical-device-cybersecurity"}],xI=new Set(["/testimonials","/case-study","/category","/tag","/author","/page"]),AI=(e,t,i)=>xI.has(e)?t:`${t}/${i}`,SI=({rule:e})=>{const{slug:t=""}=Dm(),i=AI(e.fromPrefix,e.toPrefix,t);return a.jsx(si,{to:i,replace:!0})},CI=({rule:e})=>{const{pathname:t,search:i}=Mt(),r=new RegExp(e.fromPattern),s=t.match(r);if(!s)return a.jsx(si,{to:"/",replace:!0});const n=e.to.replace(/\$(\d+)/g,(o,c)=>s[Number(c)]??"");return a.jsx(si,{to:n+i,replace:!0})},DI=()=>a.jsx(a.Fragment,{children:qw.map((e,t)=>Uw(e)?e.from.toLowerCase()===e.to.toLowerCase()?null:a.jsx(A,{path:e.from,element:a.jsx(si,{to:e.to,replace:!0})},`exact-${t}-${e.from}`):wI(e)?a.jsxs(p.Fragment,{children:[a.jsx(A,{path:e.fromPrefix,element:a.jsx(si,{to:e.toPrefix,replace:!0})}),a.jsx(A,{path:`${e.fromPrefix}/:slug`,element:a.jsx(SI,{rule:e})})]},`prefix-${t}-${e.fromPrefix}`):kI(e)?a.jsx(A,{path:e.fromPattern,element:a.jsx(CI,{rule:e})},`pattern-${t}-${e.fromPattern}`):null)}),TI="https://bluegoatcyber.com";function ke({to:e}){const t=`${TI}${e}`;return a.jsxs(a.Fragment,{children:[a.jsxs(eo,{children:[a.jsx("meta",{name:"robots",content:"noindex,follow"}),a.jsx("link",{rel:"canonical",href:t}),a.jsx("meta",{httpEquiv:"refresh",content:`0; url=${e}`}),a.jsx("title",{children:"Redirectingâ¦"})]}),a.jsx(si,{to:e,replace:!0})]})}const EI=({src:e,alt:t="",width:i=200,height:r=56,loading:s="lazy",decoding:n="async",className:o,style:c,...l})=>{const u=/\.png(\?|$)/i.test(e)?e.replace(/\.png(\?|$)/i,".webp$1"):null;return u?a.jsxs("picture",{children:[a.jsx("source",{srcSet:u,type:"image/webp"}),a.jsx("img",{src:e,alt:t,width:i,height:r,loading:s,decoding:n,className:o,style:c,...l})]}):a.jsx("img",{src:e,alt:t,width:i,height:r,loading:s,decoding:n,className:o,style:c,...l})}
209,PI=[{slug:"home-use-vs-hospital-device-cybersecurity",path:"blog/home-use-vs-hospital-device-cybersecurity",title:"Home Use vs Hospital Device Cybersecurity Requirements",description:"Home use vs hospital device cybersecurity: which controls the HDO environment provides, which the device must carry itself, and how the FDA reviews each case.",sourceUrl:"https://bluegoatcyber.com/blog/home-use-vs-hospital-device-cybersecurity",image:"/post-heroes/home-use-vs-hospital-device-cybersecurity.jpg",imageAlt:"Flat navy and cyan illustration contrasting a managed network of connected nodes with a single isolated device in open space",publishedAt:"2026-09-17T16:00:00.000Z",category:"FDA",tags:["FDA","Intended Use","Home Use Devices","Threat Modeling","Section 524B"]},{slug:"cvss-scoring-medical-devices",path:"blog/cvss-scoring-medical-devices",title:"CVSS Scoring for Medical Devices: A Complete Walkthrough",description:"How CVSS scoring works for medical devices, a worked scoring example, and why a raw score is not a patient risk score under FDA guidance.",image:"/imported-images/hero-cvss-scoring-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cvss-scoring-medical-devices",publishedAt:"2026-09-17T00:00:00.000Z"},{slug:"healthcare-cybersecurity-companies",path:"blog/healthcare-cybersecurity-companies",title:"Healthcare Cybersecurity Companies: A Buyer's Selection Guide",description:"How to evaluate healthcare cybersecurity companies by category, the questions to ask, and the evidence an FDA submission actually requires from a vendor.",image:"/imported-images/hero-healthcare-cybersecurity-companies.jpg",sourceUrl:"https://bluegoatcyber.com/blog/healthcare-cybersecurity-companies",publishedAt:"2026-09-17T00:00:00.000Z"},{slug:"medical-device-software-development",path:"blog/medical-device-software-development",title:"Medical Device Software Development: A Compliance Guide",description:"Medical device software development explained: design controls, IEC 62304 safety classes, SOUP management, verification, validation, and FDA documentation.",image:"/imported-images/hero-medical-device-software-development.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-software-development",publishedAt:"2026-09-17T00:00:00.000Z"},{slug:"security-requirements-testing-vs-penetration-testing",path:"blog/security-requirements-testing-vs-penetration-testing",title:"Security Requirements Testing vs Penetration Testing",description:"Security requirements testing verifies your design inputs; penetration testing attacks the built device. What the FDA's Feb 2026 guidance expects for each.",image:"/imported-images/security-requirements-testing-vs-penetration-testing.jpg",sourceUrl:"https://bluegoatcyber.com/blog/security-requirements-testing-vs-penetration-testing",publishedAt:"2026-09-04T14:00:00+00:00"},{slug:"linux-vs-windows-a-security-comparison",path:"blog/linux-vs-windows-a-security-comparison",title:"Linux vs Windows for Medical Devices: Security Comparison",description:"Embedded Linux vs Windows IoT Enterprise LTSC for medical devices: attack surface, isolation, secure boot, patching, SBOM, and what FDA reviewers actually look at.",sourceUrl:"https://bluegoatcyber.com/blog/linux-vs-windows-a-security-comparison",image:"/post-heroes/linux-vs-windows-a-security-comparison.jpg",imageAlt:"Two mirrored navy and cyan circuit panels joined by a central hexagonal shield, representing an operating system security comparison",publishedAt:"2026-08-01T15:00:00.000Z",category:"Medical Device Security",tags:["Operating Systems","Embedded Linux","Windows IoT","Secure Boot","SBOM"]},{slug:"indications-for-use-predicates-cybersecurity-510k-scope",path:"blog/indications-for-use-predicates-cybersecurity-510k-scope",title:"Indications for Use, Predicates, and Cybersecurity Scope",description:"How your Indications for Use statement and predicate choice change the cybersecurity scope of a 510(k): use environment, harm ceiling, pen test scope, and Special 510(k) eligibility.",sourceUrl:"https://bluegoatcyber.com/blog/indications-for-use-predicates-cybersecurity-510k-scope",image:"/post-heroes/indications-for-use
209-predicates-cybersecurity-510k-scope.jpg",imageAlt:"Abstract concentric navy and cyan rings narrowing toward a central shield, representing regulatory scope converging on device security",publishedAt:"2026-07-30T16:00:00.000Z",category:"FDA",tags:["FDA","510(k)","Indications for Use","Predicates","Section 524B"]},{slug:"fda-breakthrough-device-designation-cybersecurity",path:"blog/fda-breakthrough-device-designation-cybersecurity",title:"Breakthrough Device Designation and Cybersecurity",description:"Breakthrough Device designation speeds FDA interaction but waives no cybersecurity requirement. Here is how Section 524B applies to Breakthrough devices in 2026.",sourceUrl:"https://bluegoatcyber.com/blog/fda-breakthrough-device-designation-cybersecurity",image:"/post-heroes/fda-breakthrough-device-designation-cybersecurity.jpg",publishedAt:"2026-07-30T15:00:00.000Z",category:"FDA",tags:["FDA","Breakthrough Devices","Section 524B","Cybersecurity","Premarket"],imageAlt:"Abstract arrow of layered navy and cyan panels accelerating through regulatory gate frames around a shield silhouette"},{slug:"510k-cleared-no-postmarket-cybersecurity-am-i-breaking-the-law",path:"blog/510k-cleared-no-postmarket-cybersecurity-am-i-breaking-the-law",title:"510(k) Cleared, No Postmarket Cybersecurity: Legal?",description:"Cleared under Section 524B but skipping postmarket cybersecurity? Here's what statute, regs, and FDA enforcement actually say - across 510(k), De Novo, PMA, PDP, and HDE.",image:"/imported-images/hero-510k-cleared-no-postmarket-cybersecurity-am-i-breaking-the-law.jpg",sourceUrl:"https://bluegoatcyber.com/blog/510k-cleared-no-postmarket-cybersecurity-am-i-breaking-the-law",publishedAt:"2026-07-25T00:00:00.000Z",tags:["FDA","Postmarket","Section 524B","Compliance"],imageAlt:"Abstract navy and electric-blue shield motif with circuit lines, representing postmarket cybersecurity vigilance for cleared medical devices"},{slug:"premarket-cybersecurity-deliverables-qms-integration-iso-13485-qmsr",path:"blog/premarket-cybersecurity-deliverables-qms-integration-iso-13485-qmsr",title:"Premarket Cybersecurity in Your QMS: ISO 13485 & QMSR",description:"Where FDA premarket cybersecurity artifacts live in an ISO 13485 / QMSR quality system: DHF, risk management file, DMR, and postmarket - clause-by-clause map.",sourceUrl:"https://bluegoatcyber.com/blog/premarket-cybersecurity-deliverables-qms-integration-iso-13485-qmsr",image:"/post-heroes/qms-integration-premarket-cybersecurity.jpg",imageAlt:"Abstract illustration of layered document silhouettes flowing into a central shield, representing cybersecurity deliverables integrated into a medical device quality management system",publishedAt:"2026-07-23T20:30:00.000Z",category:"Compliance",tags:["QMSR","ISO 13485","FDA","SPDF","Design Controls","Risk Management","524B","Cybersecurity"]},{slug:"clia-high-complexity-lab-cybersecurity-hipaa-part-11",path:"blog/clia-high-complexity-lab-cybersecurity-hipaa-part-11",title:"CLIA Lab Cybersecurity: HIPAA & 21 CFR Part 11 (2026)",description:"Cybersecurity for CLIA high-complexity labs: HIPAA, 21 CFR Part 11 data integrity, LIMS hardening, vendor patching, AI/cloud analytics, and CMS/CAP inspection readiness.",sourceUrl:"https://bluegoatcyber.com/blog/clia-high-complexity-lab-cybersecurity-hipaa-part-11",image:"/post-heroes/clia-high-complexity-lab-cybersecurity.jpg",imageAlt:"Abstract illustration of connected laboratory analyzers with layered shield motifs and flowing data streams representing lab cybersecurity",publishedAt:"2026-07-23T18:00:00.000Z",category:"Compliance",tags:["CLIA","HIPAA","21 CFR Part 11","LIMS","Laboratory","CMS","CAP","Cybersecurity","AI/ML","Cloud"]},{slug:"de-identification-vs-anonymization-medical-devices-hipaa-gdpr",path:"blog/de-identification-vs-anonymization-medical-devices-hipaa-gdpr",title:"De-identification vs Anonymization: HIPAA & GDPR",description:"De-identification vs anonymization for medical devices: HIPAA Safe Harbor, GDPR Recital 26, and what the FDA expects for AI/ML training data and postmarket telemetry.",sourceUrl:"https://bluegoatcyber.com/blog/de-identification-vs-anonymization-medical-devices-hipaa-gdpr",image:"/post-heroes/de-identification-vs-anonymization-medical-devices.jpg",imageAlt:"Abstract overlapping shield silhouettes representing layered data privacy protections for medical device data",publishedAt:"2026-07-23T16:00:00.000Z",category:"Privacy",tags:["HIPAA","GDPR","De-identification","Anonymization","AI/ML","Medical Device","Privacy"]},{slug:"types-of-510k-traditional-special-abbreviated-cybersecurity",path:"blog/types-of-510k-traditional-special-abbreviated-cybersecurity",title:"Types of 510(k): Traditional, Special, Abbreviated",description:"The three types of 510(k) - Traditional, Special, and Abbreviated - explained side by side, with the cybersecurity implications of each under Section 524B.",s
209ourceUrl:"https://bluegoatcyber.com/blog/types-of-510k-traditional-special-abbreviated-cybersecurity",image:"/post-heroes/types-of-510k-traditional-special-abbreviated-cybersecurity.jpg",publishedAt:"2026-07-23T14:00:00.000Z",category:"FDA",tags:["FDA","510(k)","Traditional 510(k)","Special 510(k)","Abbreviated 510(k)","Cybersecurity","Section 524B"],imageAlt:"Three parallel document stacks representing Traditional, Special, and Abbreviated 510(k) submission pathways"},{slug:"q-sub-vs-pre-sub-fda-cybersecurity",path:"blog/q-sub-vs-pre-sub-fda-cybersecurity",title:"Q-Sub vs Pre-Sub: FDA Cybersecurity Guide",description:"Q-Sub vs Pre-Sub for FDA cybersecurity: what they are, how they differ, and when to use a Pre-Submission to de-risk Section 524B threat models, SBOMs, and pen tests.",sourceUrl:"https://bluegoatcyber.com/blog/q-sub-vs-pre-sub-fda-cybersecurity",image:"/post-heroes/q-sub-vs-pre-sub-fda-cybersecurity.jpg",publishedAt:"2026-07-22T14:00:00.000Z",category:"FDA",tags:["FDA","Pre-Sub","Q-Sub","Cybersecurity","Section 524B"],imageAlt:"Two overlapping regulatory document silhouettes representing FDA Q-Submission and Pre-Submission pathways"},{slug:"did-aami-sw96-replace-tir57-fda-2026",path:"blog/did-aami-sw96-replace-tir57-fda-2026",title:"AAMI SW96 vs TIR57: Did SW96 Replace It?",description:"AAMI SW96 didn't formally replace TIR57, but SW96 is now the FDA-recognized normative standard. Here's what changed and what the FDA expects in 2026.",sourceUrl:"https://bluegoatcyber.com/blog/did-aami-sw96-replace-tir57-fda-2026",image:"/post-heroes/aami-sw96-replace-tir57.jpg",publishedAt:"2026-07-21T15:00:00.000Z",category:"Standards",tags:["AAMI SW96","AAMI TIR57","FDA","Section 524B","Standards"],imageAlt:"Two overlapping document silhouettes representing AAMI SW96 and TIR57 medical device cybersecurity standards"},{slug:"fda-sir-submission-issue-request-cybersecurity-response",path:"blog/fda-sir-submission-issue-request-cybersecurity-response",title:"FDA SIR Cybersecurity Response: eSTAR Prep Guide",description:"FDA Submission Issue Request (SIR) response strategy for cybersecurity: eSTAR prep checklist, common 524B gaps, and how to answer without restarting review.",sourceUrl:"https://bluegoatcyber.com/blog/fda-sir-submission-issue-request-cybersecurity-response",image:"/post-heroes/fda-sir-submission-issue-request-cybersecurity-response.jpg",publishedAt:"2026-07-21T12:00:00.000Z",category:"FDA",tags:["FDA","eSTAR","Cybersecurity","Section 524B"],imageAlt:"Abstract inbox with a highlighted regulatory message beside a secure medical device schematic"},{slug:"medical-device-pen-testing-fda-vs-eu-mdr-2026",path:"blog/medical-device-pen-testing-fda-vs-eu-mdr-2026",title:"Medical Device Pen Testing: FDA vs EU MDR 2026",description:"Medical device pen testing under FDA vs EU MDR: the 5 FDA report elements, MDR Annex I §17.2/17.4, and how one report serves both submissions.",image:"/post-heroes/eu-mdr-vs-fda-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-pen-testing-fda-vs-eu-mdr-2026",publishedAt:"2026-07-10T15:00:00+00:00",category:"FDA",tags:["FDA","EU MDR","Penetration Testing","Section 524B"],imageAlt:"Cybersecurity pen test report overlaying FDA and EU MDR regulatory documents, illustrating device security compliance"},{slug:"mining-fda-databases-medical-device-cybersecurity-precedent",path:"blog/mining-fda-databases-medical-device-cybersecurity-precedent",title:"Mining FDA Databases for Cyber Precedent",description:"A five-source workflow (510(k), De Novo, PMA, MAUDE, FOIA) for mining FDA cybersecurity precedent by product code before a Section 524B filing.",image:"/post-heroes/mining-fda-databases-medical-device-cybersecurity-precedent.jpg",sourceUrl:"https://bluegoatcyber.com/blog/mining-fda-databases-medical-device-cybersecurity-precedent",publishedAt:"2026-07-10T00:00:00+00:00",category:"FDA",tags:["FDA","510(k)","De Novo","PMA","Section 524B","Precedent Research"],imageAlt:"Abstract data streams flow into a secure vault, representing FDA database mining for medical device cybersecurity precedent"},{slug:"pccp-beyond-ai-cybersecurity-firmware-hardware",path:"blog/pccp-beyond-ai-cybersecurity-firmware-hardware",title:"FDA PCCP Beyond AI: Cybersecurity & Firmware Uses",description:"The FDA PCCP guidance isn't AI-only. Use a predetermined change control plan for cybersecurity patches, firmware updates, and SBOM component swaps.",image:"/post-heroes/pccp-beyond-ai-cybersecurity-firmware-hardware.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/pccp-beyond-ai-cybersecurity-firmware-hardware",publishedAt:"2026-07-10T00:00:00.000Z",category:"Compliance",tags:["PCCP","Section 524B","Firmware","SBOM","Postmarket"],imageAlt:"Cybersecurity lock icon intertwined with a circuit board, representing secure medical device firmware and software updates"},{slug:"when-to-start-medical-device-cybersecurity",path:"blog/when-to-start-medical-device-cybersecurity",title:"When to Start Medical Device Cybersecurity",description:`You're two years into product development and still "not ready" for cybersecurity? You're already late.`,image:"/post-heroes/when-to-start-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/when-to-start-medical-device-cybersecurity",publishedAt:"2026-07-07T16:00:00+00:00",imageAlt:"A blue goat wearing a hard hat stands on a clock face, symbolizing early cybersecurity implementation for medical devices"},{slug:"how-spdf-maps-to-iec-81001-5-1-activities",path:"blog/how-spdf-maps-to-iec-81001-5-1-activities",title:"How SPDF Maps to IEC 81001-5-1 Activities",description:"A phase-by-phase mapping of the FDA's SPDF onto IEC 81001-5-1 activities, so dual FDA + EU submissions produce one artifact set instead of two.",image:"/post-heroes/spdf-to-iec-81001-5-1-activity-mapping.jpg",sourceUrl:"https://bluegoatcyber.com/blog/how-spdf-maps-to-iec-81001-5-1-activities",publishedAt:"2026-07-07T15:00:00+00:00",imageAlt:"Abstract network diagram visually connecting FDA SPDF phases to IEC 81001-5-1 activities for streamlined submissions"},{slug:"iec-81001-5-1-vs-iec-62304-medical-device-standards",path:"blog/iec-81001-5-1-vs-iec-62304-medical-device-standards",title:"IEC 81001-5-1 vs IEC 62304 for Medical Devices",description:"IEC 62304 governs the software lifecycle. IEC 81001-5-1 adds security activities on top.",image:"/post-heroes/iec-81001-5-1-vs-iec-62304-medical-device-standards.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iec-81001-5-1-vs-iec-62304-medical-device-standards",publishedAt:"2026-07-07T14:00:00+00:00",imageAlt:"Abstract network nodes and code snippets represent cybersecurity standards for medical device software development"},{slug:"jsp2-vs-spdf-vs-iec-81001-medical-device-framework-choice",path:"blog/jsp2-vs-spdf-vs-iec-81001-medical-device-framework-choice",title:"JSP2 vs SPDF vs IEC 81001-5-1: Framework Pick",description:"The FDA lists JSP2, SPDF, IEC 81001-5-1, and ISA/IEC 62443-4-1 as acceptable cybersecurity frameworks. Here's how to actually pick one for your submission.",image:"/post-heroes/jsp2-vs-spdf-vs-iec-81001-medical-device-framework-choice.jpg",sourceUrl:"https://bluegoatcyber.com/blog/jsp2-vs-spdf-vs-iec-81001-medical-device-framework-choice",publishedAt:"2026-07-07T12:00:00+00:00",imageAlt:"Abstract network nodes and lines connect to form a framework, illustrating cybersecurity framework selection for medical devices"},{slug:"fda-ai-cybersecurity-threats-524b-medical-devices",path:"blog/fda-ai-cybersecurity-threats-524b-medical-devices",title:"FDA AI Cybersecurity Threats: 7 Attacks",description:"The FDA's Feb 3, 2026 guidance names 7 AI cyber threats, data poisoning, model inversion, evasion, leakage, overfitting, bias, drift, as 524B obligations.",image:"/imported-images/hero-fda-ai-cybersecurity-threats-524b.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-ai-cybersecurity-threats-524b-medical-devices",publishedAt:"2026-06-29T13:00:00+00:00",category:"AI & ML",tags:["AI & ML","FDA","Section 524B","Threat Modeling"],imageAlt:"Abstract digital network with glowing nodes and lines, representing AI cybersecurity threats and FDA guidance"},{slug:"does-fda-section-524b-apply-to-my-auto-injector",path:"blog/does-fda-section-524b-apply-to-my-auto-injector",title:"Does FDA 524B Apply to Auto-Injectors?",description:"FDA Section 524B applies to connected auto-injectors when the device constituent has software and any electronic interface, whether CDER or CDRH leads review.",image:"/post-heroes/does-fda-section-524b-apply-to-my-auto-injector.jpg",sourceUrl:"https://bluegoatcyber.com/blog/does-fda-section-524b-apply-to-my-auto-injector",publishedAt:"2026-06-26T12:00:00+00:00",category:"Compliance",tags:["Section 524B","Combination Products","Auto-Injector","CDER","FDA Premarket"],imageAlt:"Abstract medical device circuitry and data streams symbolize cybersecurity compliance for connected auto-injectors"},{slug:"tara-medical-device-cybersecurity",path:"blog/tara-medical-device-cybersecurity",title:"TARA Threat Analysis and Risk Assessment | Blue Goat Cyber",description:"TARA threat analysis and risk assessment explained for medical devices, from its automotive ISO/SAE 21434 roots to mapping onto AAMI SW96 and ISO 14971.",image:"/imported-images/hero-tara-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/tara-medical-device-cybersecurity",publishedAt:"2026-06-25T12:00:00+00:00",category:"Threat Modeling",tags:["Threat Modeling","FDA Premarket","Risk Management"],imageAlt:"Abstract network nodes and data streams represent medical device cybersecurity threat analysis and risk assessment"},{slug:"dfmea-medical-devices-iso-14971-cybersecurity",path:"blog/dfmea-medical-devices-iso-14971-cybersecurity",title:"Design FMEA for Medical Devices: dFMEA",description:"How to run a design FMEA (dFMEA) for a connected medical device, link it to the ISO 14971 risk file, and hand cyber failure modes to the threat model.",image:"/post-heroes/dfmea-medical-devices-iso-14971-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/dfmea-medical-devices-iso-14971-cybersecurity",publishedAt:"2026-06-25T00:00:00.000Z",category:"Risk Management",tags:["dFMEA","FMEA","ISO 14971","AAMI TIR57","Threat Modeling","FDA"],imageAlt:"Networked medical device with a shield icon, representing cybersecurity risk assessment and design FMEA"},{slug:"cicd-security-gates-medical-devices-spdf",path:"blog/cicd-security-gates-medical-devices-spdf",title:"CI/CD Security Gates for Medical Devices",description:"How to wire SAST, SBOM, secrets, container, and signature gates into a medical-device CI/CD pipeline so the SPDF produces the evidence FDA reviewers.",image:"/post-heroes/cicd-security-gates-medical-devices-spdf.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/cicd-security-gates-medical-devices-spdf",publishedAt:"2026-06-25T00:00:00.000Z",category:"SPDF",tags:["SPDF","CI/CD","DevSecOps","SAST","SBOM","IEC 62304","AAMI SW96","FDA"],imageAlt:"Abstract network lines connect to a stylized goat icon, illustrating secure medical device software development pipelines"},{slug:"fda-cybersecurity-failure-consequences-medical-devices",path:"blog/fda-cybersecurity-failure-consequences-medical-devices",title:"FDA Cybersecurity Failure Consequences",description:"What happens if you fail an FDA cybersecurity inspection: the 483-to-consent-decree enforcement ladder and the commercial fallout for device makers.",image:"/post-heroes/fda-cybersecurity-failure-consequences-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-cybersecurity-failure-consequences-medical-devices",publishedAt:"2026-06-23T19:00:00+00:00",category:"Compliance",tags:["FDA","Postmarket","Enforcement","Warning Letter","Recall"],imageAlt:"Digital lock and key on a medical device, symbolizing FDA cybersecurity compliance and enforcement consequences"},{slug:"documenting-update-cadence-fda-524b-submission",path:"blog/documenting-update-cadence-fda-524b-submission",title:"Documenting Update Cadence for an FDA Submission",description:"How to document update cadence for an FDA §524B submission: the regular cycle and the out-of-cycle expedited path reviewers expect under §524B(b)(2)(B).",image:"/post-heroes/documenting-update-cadence-fda-524b-submission.jpg",sourceUrl:"https://bluegoatcyber.com/blog/documenting-update-cadence-fda-524b-submission",publishedAt:"2026-06-23T18:00:00+00:00",category:"Compliance",tags:["Section 524B","Premarket","Patching","Postmarket","SPDF"],imageAlt:"Digital document with checklist and calendar icons, representing FDA regulatory compliance and update schedules"},{slug:"does-fda-section-524b-apply-to-legacy-medical-devices",path:"blog/does-fda-section-524b-apply-to-legacy-medical-devices",title:"Does FDA 524B Apply to Legacy Medical Devices?",description:"FDA Section 524B applies to any new premarket submission for a cyber device, including legacy platforms.",image:"/post-heroes/does-fda-section-524b-apply-to-legacy-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/does-fda-section-524b-apply-to-legacy-medical-devices",publishedAt:"2026-06-23T16:00:00+00:00",category:"Compliance",tags:["Section 524B","Legacy Devices","Postmarket","FDA","Premarket"],imageAlt:"Digital network connecting medical devices, illustrating cybersecurity compliance for legacy systems"},{slug:"spdf-vs-ssdlc-medical-device-cybersecurity",path:"blog/spdf-vs-ssdlc-medical-device-cybersecurity",title:"SPDF vs SSDLC: What Medtech Teams Get",description:"SPDF vs SSDLC for medical devices. Why the FDA's Secure Product Development Framework demands more than a standard Secure SDLC, and what to add.",image:"/post-heroes/spdf-vs-ssdlc-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/spdf-vs-ssdlc-medical-device-cybersecurity",publishedAt:"2026-06-23T12:00:00+00:00",imageAlt:"Abstract network nodes and gears represent secure product development frameworks for medical devices"},{slug:"medical-device-cybersecurity-cost",path:"blog/medical-device-cybersecurity-cost",title:"Medical Device Cybersecurity Cost (2026)",description:"What medical device cybersecurity actually costs in 2026: four cost drivers, fixed-fee vs hourly pricing, and premarket vs postmarket budget lines.",image:"/post-heroes/medical-device-cybersecurity-cost.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-cost",publishedAt:"2026-06-20T08:00:00+00:00",category:"Pricing",tags:["Pricing","Budget","FDA","Premarket","Postmarket"],imageAlt:"Abstract network nodes connect to a medical device, representing cybersecurity costs and budgeting"},{slug:"spdf-iec-62304-mapping-medical-device-cybersecurity",path:"blog/spdf-iec-62304-mapping-medical-device-cybersecurity",title:"SPDF and IEC 62304 Mapping: FDA Cyber",description:"How SPDF activities map to IEC 62304 software lifecycle processes - the exact crosswalk FDA reviewers expect, where they overlap, and where 62304 falls.",image:"/post-heroes/spdf-iec-62304-mapping-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/spdf-iec-62304-mapping-medical-device-cybersecurity",publishedAt:"2026-06-18T18:00:00+00:00",category:"FDA",tags:["SPDF","IEC 62304","FDA","Software Lifecycle","Section 524B"],imageAlt:"Abstract network diagram with glowing nodes and lines, illustrating cybersecurity compliance mapping"},{slug:"h-isac-medical-device-threat-intelligence-sources",path:"blog/h-isac-medical-device-threat-intelligence-sources",t
209itle:"H-ISAC and Medical Device Threat",description:"The threat intelligence sources medical device manufacturers should monitor to satisfy FDA Section 524B postmarket obligations: H-ISAC, CISA KEV, ICS.",image:"/post-heroes/h-isac-medical-device-threat-intelligence-sources.jpg",sourceUrl:"https://bluegoatcyber.com/blog/h-isac-medical-device-threat-intelligence-sources",publishedAt:"2026-06-18T17:00:00+00:00",category:"Postmarket",tags:["H-ISAC","Threat Intelligence","CISA KEV","Postmarket","Section 524B"],imageAlt:"Abstract network nodes connect to a central hub, illustrating medical device cybersecurity threat intelligence sources"},{slug:"fda-section-524b-subsections-explained",path:"blog/fda-section-524b-subsections-explained",title:"FDA Section 524B Subsections Explained",description:"A subsection-by-subsection walkthrough of FDA Section 524B for cyber medical devices: what §524B(a), (b)(1), (b)(2), (b)(3), (b)(4), and (c) require.",image:"/post-heroes/fda-section-524b-subsections-explained.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-section-524b-subsections-explained",publishedAt:"2026-06-18T16:30:00+00:00",category:"Compliance",tags:["Section 524B","FDA","Premarket","Postmarket","SBOM"],imageAlt:"Abstract digital network connections overlaying a stylized medical device, illustrating FDA cybersecurity compliance requirements"},{slug:"capa-medical-device-cybersecurity",path:"blog/capa-medical-device-cybersecurity",title:"CAPA and Medical Device Cybersecurity",description:"How to run CAPA for medical device cybersecurity findings: when a vulnerability or FDA deficiency triggers a CAPA, and what evidence closes it out.",image:"/post-heroes/capa-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/capa-medical-device-cybersecurity",publishedAt:"2026-06-18T16:00:00+00:00",category:"Compliance",tags:["CAPA","QMSR","FDA","Section 524B","Postmarket"],imageAlt:"Cybersecurity shield protecting a medical device, illustrating CAPA compliance for device vulnerabilities"},{slug:"fmea-vs-threat-modeling-medical-devices",path:"blog/fmea-vs-threat-modeling-medical-devices",title:"FMEA vs Threat Modeling for Medical Devices",description:"FMEA covers random and systematic failure modes; threat modeling covers adversarial action.",image:"/post-heroes/fmea-vs-threat-modeling-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fmea-vs-threat-modeling-medical-devices",publishedAt:"2026-06-18T15:30:00+00:00",category:"Risk Management",tags:["FMEA","Threat Modeling","ISO 14971","AAMI TIR57","FDA"],imageAlt:"Abstract network diagram with interlocking gears representing FMEA and threat modeling for medical device cybersecurity"},{slug:"hhs-405d-medical-device-cybersecurity",path:"blog/hhs-405d-medical-device-cybersecurity",title:"HHS 405(d) HICP Practice #9 for 524B",de
209scription:"How HHS 405(d) and the Health Industry Cybersecurity Practices (HICP) Medical Device Security practice maps to FDA Section 524B artifacts, and how.",image:"/post-heroes/hhs-405d-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/hhs-405d-medical-device-cybersecurity",publishedAt:"2026-06-18T15:00:00+00:00",category:"Compliance",tags:["HHS 405(d)","HICP","FDA","Section 524B","Procurement"],imageAlt:"Abstract medical devices connect to a digital network, illustrating cybersecurity compliance for healthcare technology"},{slug:"fda-pen-test-timing-submission",path:"blog/fda-pen-test-timing-submission",title:"FDA Pen Test Timing: How Recent Must Your Test Be?",description:"What the FDA's Feb 3, 2026 guidance expects for penetration test recency, version match, re-testing after changes, and remediation before you file.",image:"/post-heroes/fda-pen-test-timing-submission.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-pen-test-timing-submission",publishedAt:"2026-06-15T15:00:00+00:00",category:"Pen Testing",tags:["Penetration Testing","FDA","Section 524B","Submission","Remediation"],imageAlt:"Digital lock and key over medical device schematics, illustrating FDA pen test timing requirements"},{slug:"hipaa-medical-device-manufacturers-cybersecurity",path:"blog/hipaa-medical-device-manufacturers-cybersecurity",title:"HIPAA and Medical Device Manufacturers",description:"When HIPAA applies to medical device manufacturers, how the 2025 Security Rule NPRM raises the bar, and how HIPAA obligations intersect with the FDA's.",image:"/post-heroes/hipaa-medical-device-manufacturers-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/hipaa-medical-device-manufacturers-cybersecurity",publishedAt:"2026-06-14T15:00:00+00:00",category:"Compliance",tags:["HIPAA","Business Associate","Compliance","FDA","Privacy"],imageAlt:"Digital medical device data secured by a lock, illustrating HIPAA compliance for manufacturers"},{slug:"ehr-emr-medical-device-integration-cybersecurity-risks",path:"blog/ehr-emr-medical-device-integration-cybersecurity-risks",title:"EHR/EMR Medical Device Integration",description:"Which EHR and EMR systems medical devices connect to (Epic, Oracle Health, MEDITECH, Allscripts, athenahealth), the integration protocols (HL7, FHIR.",image:"/post-heroes/ehr-emr-medical-device-integration-cybersecurity-risks.jpg",sourceUrl:"https://bluegoatcyber.com/blog/ehr-emr-medical-device-integration-cybersecurity-risks",publishedAt:"2026-06-13T15:00:00+00:00",category:"Interoperability",tags:["EHR","EMR","Interoperability","HL7","FHIR","FDA"],imageAlt:"Networked medical devices connect to electronic health record systems, illustrating secure interoperability"},{slug:"cisa-kev-catalog-medical-devices",path:"blog/cisa-kev-catalog-medical-devices",title:"CISA KEV Catalog: Prioritize Device Risk | Blue Goat Cyber",description:"The CISA KEV catalog explained: who must act on it, how it drives SBOM and VEX triage, and how it fits postmarket obligations under the FDA's guidance.",image:"/post-heroes/cisa-kev-catalog-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cisa-kev-catalog-medical-devices",publishedAt:"2026-06-13T00:00:00.000Z",category:"Postmarket",tags:["CISA","KEV","SBOM","VEX","Vulnerability Management"],imageAlt:"Cybersecurity shield protecting medical devices from digital threats, illustrating CISA KEV catalog importance"},{slug:"health-canada-medical-device-cybersecurity",path:"blog/health-canada-medical-device-cybersecurity",title:"Health Canada Cybersecurity Requirements",description:"How Health Canada regulates medical device cybersecurity in 2026: device and IVDD classification, licence evidence routes, MDSAP reliance, and Section 59 reporting.",image:"/post-heroes/health-canada-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/health-canada-medical-device-cybersecurity",publishedAt:"2026-06-13T00:00:00.000Z",category:"International",tags:["Health Canada","International","SBOM","Postmarket"],imageAlt:"Digital lock protecting medical devices, symbolizing Health Canada's 2026 cybersecurity regulations"},{slug:"infusion-pump-cybersecurity-fda",path:"blog/infusion-pump-cybersecurity-fda",title:"Infusion Pump Cybersecurity: FDA Expectations",description:"What the FDA expects from infusion pump cybersecurity submissions in 2026: threat model focus areas, Section 524B evidence, and the deficiencies reviewers cite.",image:"/post-heroes/infusion-pump-cybersecurity-fda.jpg",sourceUrl:"https://bluegoatcyber.com/blog/infusion-pump-cybersecurity-fda",publishedAt:"2026-06-13T00:00:00.000Z",category:"Device Class",tags:["Infusion Pumps","FDA","Section 524B","Threat Modeling","Pen Testing"],imageAlt:"Digital lock securing an infusion pump, representing FDA's 2026 cybersecurity expectations"},{slug:"medical-device-incident-response-plan-fda",path:"blog/medical-device-incident-response-plan-fda",title:"Medical Device Incident Response Plan",description:"What the FDA's Feb 3, 2026 final premarket cybersecurity guidance expects from a medical device incident response plan, who owns it, and the documents.",image:"/post-heroes/medical-device-incident-response-plan-fda.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-incident-response-plan-fda",publishedAt:"2026-06-13T00:00:00.000Z",category:"Postmarket",tags:["Incident Response","FDA","Section 524B","Postmarket","SPDF"],imageAlt:"Cybersecurity blueprint for medical device incident response, reflecting FDA guidance and postmarket requirements"},{slug:"tga-australia-medical-device-cybersecurity",path:"blog/tga-australia-medical-device-cybersecurity",title:"TGA Medical Device Cybersecurity",description:"How the TGA regulates medical device cybersecurity in 2026: Essential Principles 12 and 12A, the TGA cyber security guidance v1.2, and reusing an FDA 524B package.",image:"/post-heroes/tga-australia-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/tga-australia-medical-device-cybersecurity",publishedAt:"2026-06-13T00:00:00.000Z",category:"International",tags:["TGA","Australia","International","SBOM"],imageAlt:"Digital medical device data streams flow through a secure network, illustrating Australian TGA cybersecurity regulations"},{slug:"iec-62304-classes-vs-fda-device-classes-cybersecurity",path:"blog/iec-62304-classes-vs-fda-device-classes-cybersecurity",title:"IEC 62304 Classes vs FDA Device Classes",description:"IEC 62304 software safety classes (A/B/C) and FDA device classes (I/II/III) are not equivalent.",image:"/post-heroes/iec-62304-classes-vs-fda-device-classes-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iec-62304-classes-vs-fda-device-classes-cybersecurity",publishedAt:"2026-06-12T15:00:00+00:00",category:"Compliance",tags:["IEC 62304","FDA","Section 524B","Software Lifecycle","AAMI SW96"],imageAlt:"Abstract network diagram with overlapping circles representing IEC and FDA medical device classification systems"},{slug:"data-flow-diagrams-medical-device-cybersecurity",path:"blog/data-flow-diagrams-medical-device-cybersecurity",title:"Data Flow Diagrams for Medical Device Security",description:"What a DFD is, the five DFD elements, and how data flow diagrams feed STRIDE threat modeling and the FDA's Security Architecture Views in a 2026.",image:"/post-heroes/data-flow-diagrams-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/data-flow-diagrams-medical-device-cybersecurity",publishedAt:"2026-06-12T15:00:00+00:00",category:"Threat Modeling",tags:["DFD","Threat Modeling","STRIDE","Architecture Views","FDA"],imageAlt:"Abstract network diagram with interconnected nodes representing data flow and cybersecurity concepts"},{slug:"docker-containers-medical-devices-fda-testing",path:"blog/docker-containers-medical-devices-fda-testing",title:"Docker Containers in Medical Devices: FDA Testing",description:"Where containers appear in medical devices, the testing the FDA expects under the Feb 3, 2026 guidance, and how container evidence maps to eSTAR v7.0.",image:"/post-heroes/docker-containers-medical-devices-fda-testing.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/docker-containers-medical-devices-fda-testing",publishedAt:"2026-06-11T23:30:00+00:00",category:"Testing",tags:["Containers","Docker","SBOM","Section 524B","eSTAR","FDA"],imageAlt:"Abstract digital network with interconnected containers representing secure medical device data and FDA cybersecurity compliance"},{slug:"estar-cybersecurity-ivd-vs-nivd-submissions",path:"blog/estar-cybersecurity-ivd-vs-nivd-submissions",title:"eSTAR v7.0 Cybersecurity for IVDs vs nIVD Submissions",description:"eSTAR v7.0 cybersecurity attachments are identical for IVD and nIVD submissions, but the content reviewers expect is not. Here's how to fill each section correctly.",image:"/post-heroes/estar-cybersecurity-ivd-vs-nivd-submissions.jpg",sourceUrl:"https://bluegoatcyber.com/blog/estar-cybersecurity-ivd-vs-nivd-submissions",publishedAt:"2026-06-11T23:00:00+00:00",category:"FDA Compliance",tags:["IVD","eSTAR","FDA","510(k)","De Novo"],imageAlt:"Digital lock and key securing medical device data, representing cybersecurity for in vitro diagnostic devices"},{slug:"sbom-third-party-chip-firmware-medical-devices",path:"blog/sbom-third-party-chip-firmware-medical-devices",title:"SBOM for Third-Party Chip Firmware",description:"When a chip vendor's SBOM is enough, when it isn't, and what changes the moment a MedTech team modifies modem, radio, or SoC firmware in the device.",image:"/post-heroes/sbom-end-of-support-eol-los-fda-section-524b.jpg",sourceUrl:"https://bluegoatcyber.com/blog/sbom-third-party-chip-firmware-medical-devices",publishedAt:"2026-06-11T22:00:00+00:00",category:"SBOM",tags:["SBOM","Firmware","Section 524B","Supply Chain","FDA"],imageAlt:"Abstract network diagram with interconnected nodes representing firmware components and cybersecurity threats"},{slug:"interoperability-labeling-medical-devices-fda",path:"blog/interoperability-labeling-medical-devices-fda",title:"Interoperability Labeling for Devices",description:"What the FDA's Feb 2026 guidance expects in interoperability labeling for connected medical devices, and where each element sits in the eSTAR package.",image:"/post-heroes/interoperability-labeling-medical-devices-fda.jpg",sourceUrl:"https://bluegoatcyber.com/blog/interoperability-labeling-medical-devices-fda",publishedAt:"2026-06-11T21:00:00+00:00",category:"FDA Compliance",tags:["Interoperability","Labeling","HL7 FHIR","DICOM","eSTAR"],imageAlt:"Digital medical device data streams connect to a compliance document, illustrating FDA interoperability labeling guidance"},{slug:"unresolved-anomalies-fda-cybersecurity-submission",path:"blog/unresolved-anomalies-fda-cybersecurity-submission",title:"Unresolved Anomalies in FDA Cybersecurity Filings",description:"What the FDA's Feb 2026 guidance expects in the unresolved cybersecurity anomalies assessment, how to document residual risk, and the deficiency pattern.",image:"/post-heroes/how-to-respond-to-an-fda-cybersecurity-ai-request.jpg",sourceUrl:"https://bluegoatcyber.com/blog/unresolved-anomalies-fda-cybersecurity-submission",publishedAt:"2026-06-11T19:30:00+00:00",category:"FDA Compliance",tags:["FDA","Residual Risk","Deficiency Response","eSTAR"],imageAlt:"Abstract digital network with a magnifying glass highlighting a red anomaly, representing FDA cybersecurity oversight"},{slug:"patch-update-mechanism-fda-section-524b-testing",path:"blog/patch-update-mechanism-fda-section-524b-testing",title:"Patch and Update Mechanism Testing",description:"Section 524B(b)(1) makes patchability statutory. What the FDA's Feb 2026 guidance expects in the patch and update mechanism test evidence, the test cases.",image:"/post-heroes/letter-to-file-vs-new-510k-cybersecurity-changes.jpg",sourceUrl:"https://bluegoatcyber.com/blog/patch-update-mechanism-fda-section-524b-testing",publishedAt:"2026-06-11T19:00:00+00:00",category:"FDA Compliance",tags:["FDA","Section 524B","Patchability","eSTAR"],imageAlt:"Digital lock with a keyhole, representing secure software updates and FDA compliance for medical devices"},{slug:"dast-vs-penetration-testing-fda-medical-devices",path:"blog/dast-vs-penetration-testing-fda-medical-devices",title:"DAST vs Penetration Testing for FDA Submissions",de
209scription:"DAST is a subset of FDA-required penetration testing. What the Feb 2026 guidance expects in eSTAR Slot 7, and why a Burp scan alone will fail review.",image:"/post-heroes/dast-vs-penetration-testing-fda-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/dast-vs-penetration-testing-fda-medical-devices",publishedAt:"2026-06-11T16:00:00+00:00",category:"Penetration Testing",tags:["Penetration Testing","DAST","FDA","Section 524B","eSTAR"],imageAlt:"Cybersecurity concept with lock and shield icons, illustrating FDA-compliant penetration testing and DAST"},{slug:"fda-ide-cybersecurity-requirements",path:"blog/fda-ide-cybersecurity-requirements",title:"FDA IDE Cybersecurity Requirements: 2026",description:"What the FDA's Feb 2026 guidance recommends for IDE cybersecurity: informed consent, architecture views, SBOM, labeling, and what's not required yet.",image:"/post-heroes/fda-ide-cybersecurity-requirements.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-ide-cybersecurity-requirements",publishedAt:"2026-06-10T15:00:00+00:00",imageAlt:"Digital lock and key securing medical device data, representing FDA cybersecurity requirements"},{slug:"cybersecurity-before-mvp-vs-after-market-fit-cost-of-waiting",path:"blog/cybersecurity-before-mvp-vs-after-market-fit-cost-of-waiting",title:"Cybersecurity Before MVP vs After Market",description:"The real dollar and timeline cost of bolting cybersecurity onto a MedTech device after MVP.",image:"/post-heroes/cybersecurity-before-mvp-vs-after-market-fit-cost-of-waiting.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-before-mvp-vs-after-market-fit-cost-of-waiting",publishedAt:"2026-06-10T08:00:00+00:00",category:"Strategy",tags:["Strategy","FDA"],imageAlt:"Abstract network lines connect to a medical device, illustrating cybersecurity integration challenges"},{slug:"secure-update-infrastructure-medical-devices",path:"blog/secure-update-infrastructure-medical-devices",title:"Secure Update Infrastructure for Medical Devices",description:"How to design, isolate, and defend the update channel for connected medical devices - signed manifests, dual-bank A/B, rollback protection, HSM-backed.",image:"/post-heroes/secure-update-infrastructure-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/secure-update-infrastructure-medical-devices",publishedAt:"2026-06-05T17:00:00+00:00",category:"Secure Architecture",tags:["FDA","Section 524B","Secure Updates","Firmware","Postmarket"],imageAlt:"Digital lock securing a medical device's software update process with layered security elements"},{slug:"mqtt-vulnerabilities-connected-medical-devices-fda",path:"blog/mqtt-vulnerabilities-connected-medical-devices-fda",title:"MQTT Vulnerabilities in Connected",description:"MQTT is one of the most common protocols in IoMT and one of the most commonly misconfigured.",image:"/imported-images/hero-mqtt-vulnerabilities-connected-medical-devices-fda.jpg",sourceUrl:"https://bluegoatcyber.com/blog/mqtt-vulnerabilities-connected-medical-devices-fda",publishedAt:"2026-06-05T12:00:00+00:00",imageAlt:"Networked medical devices connected by a digital thread, highlighting MQTT protocol vulnerabilities"},{slug:"fda-cybersecurity-requirements-by-device-class",path:"blog/fda-cybersecurity-requirements-by-device-class",title:"Does Device Class Decide FDA Cybersecurity Scope?",description:"Class I, II, III doesn't decide your FDA cybersecurity burden. Section 524B's cyber-device test and whether you file a premarket submission do.",image:"/post-heroes/fda-cybersecurity-requirements-by-device-class.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-cybersecurity-requirements-by-device-class",publishedAt:"2026-06-04T15:00:00+00:00",category:"FDA Compliance",tags:["FDA","Section 524B","Device Classification","Premarket"],imageAlt:"Abstract network nodes connect to a stylized FDA logo, illustrating FDA cybersecurity compliance factors beyond device class"},{slug:"fuzz-harness-generation-medical-device-protocols",path:"blog/fuzz-harness-generation-medical-device-protocols",title:"Fuzz Harness Generation for Medical Device Protocols",description:"How to build FDA-defensible fuzz harnesses for the protocols medical devices actually speak.",image:"/imported-images/hero-fuzz-harness-generation-medical-device-protocols.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fuzz-harness-generation-medical-device-protocols",publishedAt:"2026-06-03T18:00:00+00:00",imageAlt:"Abstract digital network connections and a stylized goat head illustrate fuzz harness generation for medical device cybersecurity"},{slug:"sbom-diffing-cve-correlation-postmarket-medical-devices",path:"blog/sbom-diffing-cve-correlation-postmarket-medical-devices",title:"SBOM Diffing & CVE Correlation Postmarket",description:"How to operationalize SBOM diffing and CVE correlation across releases so postmarket vulnerability monitoring holds up under FDA Section 524B and the Feb.",image:"/imported-images/sbom-diffing-cve-correlation-postmarket-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/sbom-diffing-cve-correlation-postmarket-medical-devices",publishedAt:"2026-06-03T18:00:00+00:00",imageAlt:"Abstract digital network with connected nodes representing software components and security vulnerabilities"},{slug:"ai-penetration-testing-medical-devices-fda-limits",path:"blog/ai-penetration-testing-medical-devices-fda-limits",title:"FDA & AI Pen Testing for Medical Devices",description:"What the FDA's Feb 2026 premarket cybersecurity guidance says (and doesn't say) about AI-run penetration testing, where AI helps, where it fails a 524B.",image:"/post-heroes/ai-penetration-testing-medical-devices-fda-limits.jpg",sourceUrl:"https://bluegoatcyber.com/blog/ai-penetration-testing-medical-devices-fda-limits",publishedAt:"2026-06-03T16:00:00+00:00",category:"Penetration Testing",tags:["Penetration Testing","AI","FDA","Section 524B"],imageAlt:"Abstract digital network with a goat silhouette, representing AI pen testing for medical device cybersecurity"}
209,{slug:"fda-cybersecurity-major-vs-minor-deficiency",path:"blog/fda-cybersecurity-major-vs-minor-deficiency",title:"FDA Cybersecurity Major vs Minor",description:"How the FDA distinguishes Major from Minor cybersecurity deficiencies in 510(k) and PMA reviews, the response-window difference, and how to keep findings.",image:"/post-heroes/fda-cybersecurity-major-vs-minor-deficiency.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-cybersecurity-major-vs-minor-deficiency",publishedAt:"2026-06-03T15:00:00.000Z",imageAlt:"Abstract digital network with a magnified magnifying glass over a medical device, illustrating FDA cybersecurity review"},{slug:"pma-supplement-cybersecurity-changes",path:"blog/pma-supplement-cybersecurity-changes",title:"PMA Supplement Cybersecurity Changes",description:"Which PMA submission type a cybersecurity change requires - 180-day supplement, Real-Time, Special, 30-day notice, or annual report - and the decision.",image:"/post-heroes/pma-supplement-cybersecurity-changes.jpg",sourceUrl:"https://bluegoatcyber.com/blog/pma-supplement-cybersecurity-changes",publishedAt:"2026-06-03T14:00:00.000Z",imageAlt:"Digital network connections overlaying a medical device, illustrating cybersecurity regulatory pathways"},{slug:"de-novo-cybersecurity-requirements",path:"blog/de-novo-cybersecurity-requirements",title:"De Novo Cybersecurity Requirements: What the FDA Expects",description:"De Novo cybersecurity requirements under Section 524B: the documentation set, why no predicate raises the bar, and how special controls affect your evidence.",image:"/post-heroes/de-novo-cybersecurity-requirements.jpg",sourceUrl:"https://bluegoatcyber.com/blog/de-novo-cybersecurity-requirements",publishedAt:"2026-06-03",imageAlt:"Abstract medical device schematic with glowing data streams, symbolizing de novo cybersecurity compliance"},{slug:"iec-81001-5-1-vs-aami-sw96",path:"blog/iec-81001-5-1-vs-aami-sw96",title:"IEC 81001-5-1: Secure Lifecycle Rules | Blue Goat Cyber",description:"IEC 81001-5-1 explained: scope, mapping to AAMI SW96 and TIR57, what the FDA recognizes, and what evidence each standard produces for submissions.",image:"/post-heroes/iec-81001-5-1-vs-aami-sw96.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iec-81001-5-1-vs-aami-sw96",publishedAt:"2026-06-03",imageAlt:"Abstract network diagram with interconnected nodes representing medical devices and cybersecurity threats"},{slug:"fda-penetration-testing-requirements-medical-devices",path:"blog/fda-penetration-testing-requirements-medical-devices",title:"FDA Penetration Testing Requirements",description:"What the FDA's Feb 2026 premarket guidance actually requires for medical device penetration testing - what's inside a real pen test, what's separate.",image:"/imported-images/preparing-your-estar-510k-cybersecurity-documentation.webp",sourceUrl:"https://bluegoatcyber.com/blog/fda-penetration-testing-requirements-medical-devices",publishedAt:"2026-06-02T18:00:00+00:00",category:"FDA",tags:["FDA","Penetration Testing","Section 524B","Premarket"],imageAlt:"Abstract network nodes and circuits represent medical device cybersecurity and FDA penetration testing requirements"},{slug:"letter-to-file-vs-new-510k-cybersecurity-changes",path:"blog/letter-to-file-vs-new-510k-cybersecurity-changes",title:"Letter to File vs New 510(k)",description:"When a cybersecurity change to a cleared device stays as a letter to file in the DHF, and when it forces a new 510(k). Decision framework and examples.",image:"/post-heroes/letter-to-file-vs-new-510k-cybersecurity-changes-v2.jpg",sourceUrl:"https://bluegoatcyber.com/blog/letter-to-file-vs-new-510k-cybersecurity-changes",publishedAt:"2026-06-02T15:00:00+00:00",category:"FDA",tags:["FDA","510(k)","Section 524B","Premarket"],imageAlt:"Digital lock and key securing medical device data, illustrating FDA cybersecurity regulatory pathways"},{slug:"special-vs-traditional-510k-cybersecurity-changes",path:"blog/special-vs-traditional-510k-cybersecurity-changes",title:"Special vs Traditional 510(k)",description:"When the FDA accepts a Special 510(k) for cybersecurity changes - BLE, firmware signing, Secure Boot, SBOM swaps - and when it pushes you to Traditional.",image:"/post-heroes/special-vs-traditional-510k-cybersecurity-changes-v2.jpg",sourceUrl:"https://bluegoatcyber.com/blog/special-vs-traditional-510k-cybersecurity-changes",publishedAt:"2026-06-02T12:00:00+00:00",category:"FDA",tags:["FDA","510(k)","Section 524B","Premarket"],imageAlt:"Digital lock and key securing medical device data, representing FDA cybersecurity clearance processes"},{slug:"sbom-end-of-support-eol-los-fda-section-524b",path:"blog/sbom-end-of-support-eol-los-fda-section-524b",title:"SBOM EOS, EOL & LoS for FDA 524B",de
209scription:"EOS vs EOL vs Level of Support in your medical device SBOM: what Section 524B requires, how to express it in CycloneDX and SPDX, and how to defend it.",image:"/imported-images/sbom-end-of-support-eol-los-fda-section-524b.jpg",sourceUrl:"https://bluegoatcyber.com/blog/sbom-end-of-support-eol-los-fda-section-524b",publishedAt:"2026-06-01T12:00:00+00:00",category:"SBOM",tags:["SBOM","FDA","Section 524B","Postmarket"],imageAlt:"Cybersecurity concept with a padlock and circuit board elements, illustrating SBOM data security and compliance"},{slug:"ble-rf-penetration-testing-medical-device-case-study",path:"blog/ble-rf-penetration-testing-medical-device-case-study",title:"BLE & RF Penetration Testing",description:"What a real BLE/RF penetration test on a Class II connected medical device actually finds. Aligned with the FDA's Feb 3, 2026 premarket cybersecurity.",image:"/imported-images/hero-ble-rf-penetration-testing-medical-device-case-study.jpg",sourceUrl:"https://bluegoatcyber.com/blog/ble-rf-penetration-testing-medical-device-case-study",publishedAt:"2026-06-01T00:00:00.000Z",imageAlt:"Abstract network nodes and signals represent wireless medical device penetration testing and cybersecurity risks"},{slug:"can-bus-canopen-medical-device-vulnerabilities",path:"blog/can-bus-canopen-medical-device-vulnerabilities",title:"CAN Bus Vulnerabilities in Medical Devices",description:"Where CAN/CANopen shows up inside medical devices, the attack paths reviewers want modeled, and the controls that actually hold up under pen test.",image:"/imported-images/hero-can-bus-canopen-medical-device-vulnerabilities.jpg",sourceUrl:"https://bluegoatcyber.com/blog/can-bus-canopen-medical-device-vulnerabilities",publishedAt:"2026-06-01T00:00:00.000Z",imageAlt:"Networked medical devices connected by a digital bus, illustrating CAN bus vulnerabilities"},{slug:"cvss-3-1-vs-4-0-medical-devices",path:"blog/cvss-3-1-vs-4-0-medical-devices",title:"CVSS 3.1 vs 4.0 for Medical Devices: Safety & Automatable Metrics",description:"Why CVSS 4.0's Safety and Automatable metrics matter for patient harm, and how to handle the transition in FDA submissions and postmarket VEX statements.",image:"/imported-images/hero-cvss-3-1-vs-4-0-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cvss-3-1-vs-4-0-medical-devices",publishedAt:"2026-06-01T00:00:00.000Z",imageAlt:"Abstract network nodes connect to a medical device, illustrating CVSS scoring for cybersecurity risk"},{slug:"aami-tir57-vs-tir97-vs-sw96-medical-device-cybersecurity",path:"blog/aami-tir57-vs-tir97-vs-sw96-medical-device-cybersecurity",title:"AAMI TIR57 vs TIR97 vs SW96",description:"Medical device cybersecurity relies on AAMI TIR57, TIR97, and SW96. Understand their applications, FDA recognition, and how to use them for compliance.",image:"/imported-images/hero-aami-tir57-standards-decoder.jpg",sourceUrl:"https://bluegoatcyber.com/blog/aami-tir57-vs-tir97-vs-sw96-medical-device-cybersecurity",publishedAt:"2026-05-27T12:00:00+00:00",imageAlt:"Abstract network diagram with interconnected nodes representing medical device cybersecurity standards and their relationships"},{slug:"cost-of-medical-device-penetration-testing",path:"blog/cost-of-medical-device-penetration-testing",title:"Medical Device Penetration Testing Cost: 2026 Guide",description:"Understand the factors influencing medical device penetration testing cost, from FDA requirements to device complexity. Get a transparent pricing breakdown.",image:"/post-heroes/cost-of-medical-device-penetration-testing.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cost-of-medical-device-penetration-testing",publishedAt:"2026-05-27T00:00:00.000Z",imageAlt:"Abstract digital network connections overlaying a stylized medical device, illustrating cybersecurity testing costs"},{slug:"how-long-does-fda-cybersecurity-review-take",path:"blog/how-long-does-fda-cybersecurity-review-take",title:"FDA Cybersecurity Review Timeline: 510(k) & De Novo Guide",description:"Learn the actual timelines for FDA cybersecurity review. Understand 510(k) and De Novo clock stops, RTA hold periods, and how to avoid costly delays.",image:"/post-heroes/how-long-does-fda-cybersecurity-review-take.jpg",sourceUrl:"https://bluegoatcyber.com/blog/how-long-does-fda-cybersecurity-review-take",publishedAt:"2026-05-27T00:00:00.000Z",imageAlt:"Abstract illustration of a regulatory review timeline with clock and document motifs representing FDA cybersecurity review milestones"},{slug:"510k-cybersecurity-deficiencies-that-trigger-fda-holds",path:"blog/510k-cybersecurity-deficiencies-that-trigger-fda-holds",title:"510(k) Deficiencies That Trigger FDA Holds",description:"The four cybersecurity deficiency patterns the FDA flags most often in 510(k) submissions - incomplete SBOMs, thin threat models, scoped-down pen tests.",image:"/imported-images/hero-510k-cybersecurity-deficiencies-that-trigger-fda-holds.jpg",sourceUrl:"https://bluegoatcyber.com/blog/510k-cybersecurity-deficiencies-that-trigger-fda-holds",publishedAt:"2026-05-23T00:00:00.000Z",imageAlt:"Abstract network diagram with glowing nodes and lines, representing interconnected medical devices and data security"},{slug:"medtech-cyber-standards-every-device-team-must-know",path:"blog/medtech-cyber-standards-every-device-team-must-know",title:"MedTech Cyber Standards Every Device Team Must Know",description:"Navigate the medical device cybersecurity standards that FDA reviewers expect: Section 524B, the FDA's February 2026 guidance, and key consensus standards.",image:"/imported-images/hero-medtech-cyber-standards-every-device-team-must-know.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medtech-cyber-standards-every-device-team-must-know",publishedAt:"2026-05-23T00:00:00.000Z",imageAlt:"Digital lock and key protecting medical devices, symbolizing cybersecurity standards and compliance"},{slug:"when-to-hire-device-security-consultant-vs-build-in-house",path:"blog/when-to-hire-device-security-consultant-vs-build-in-house",title:"Hire Cybersecurity Consultant vs. In-
209House",description:"Understand whether to hire a medical device security consultant or build an in-house team. Evaluate costs, FDA expertise, and submission timelines.",image:"/imported-images/hero-when-to-hire-device-security-consultant-vs-build-in-house.jpg",sourceUrl:"https://bluegoatcyber.com/blog/when-to-hire-device-security-consultant-vs-build-in-house",publishedAt:"2026-05-23T00:00:00.000Z",imageAlt:"A blue goat wearing a hard hat stands between two paths, symbolizing cybersecurity consultant versus in-house hiring choices"},{slug:"cybersecurity-qms-documentation-medtech",path:"blog/cybersecurity-qms-documentation-medtech",title:"Cybersecurity Is Now a QMS Requirement",description:"Cybersecurity documentation belongs in the QMS, not a side folder. What MedTech teams must create, control, and maintain across the full device lifecycle.",image:"/imported-images/hero-cybersecurity-qms-documentation-medtech.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-qms-documentation-medtech",publishedAt:"2026-05-22T14:00:00+00:00",imageAlt:"Digital lock securing medical device schematics, representing cybersecurity integrated into quality management systems"},{slug:"fda-483-cybersecurity-observations-qmsr",path:"blog/fda-483-cybersecurity-observations-qmsr",title:"FDA 483 Cybersecurity Observations on QMSR",description:"How the FDA is using Form 483 observations to cite cybersecurity gaps under QMSR and 21 CFR 820, with recent examples and how manufacturers should respond.",image:"/post-heroes/fda-483-cybersecurity-observations-qmsr.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-483-cybersecurity-observations-qmsr",publishedAt:"2026-05-22T12:00:00.000Z",imageAlt:"Digital padlock on a medical device circuit board represents FDA cybersecurity observations under QMSR"},{slug:"q-day-medical-device-fda-compliance-gap",path:"blog/q-day-medical-device-fda-compliance-gap",title:"Q-Day: A Present-Day FDA Compliance Gap",description:"The FDA's February 2026 premarket guidance requires cryptography that stays strong throughout a device's service life. Q-Day exposes a real compliance gap.",image:"/imported-images/hero-q-day-medical-device-fda-compliance-gap.jpg",sourceUrl:"https://bluegoatcyber.com/blog/q-day-medical-device-fda-compliance-gap",publishedAt:"2026-05-22T12:00:00+00:00",imageAlt:"Abstract digital lock and key symbolizing FDA compliance and robust medical device cybersecurity"},{slug:"sbom-vs-vex-difference",path:"blog/sbom-vs-vex-difference",title:"SBOM vs VEX: What's the Difference?",description:"SBOM vs VEX explained for medical device submissions. What each document does, how they pair, and what the FDA actually expects in your 510(k) package.",image:"/post-heroes/sbom-vs-vex-difference.jpg",sourceUrl:"https://bluegoatcyber.com/blog/sbom-vs-vex-difference",publishedAt:"2026-05-17T13:00:00.000Z",imageAlt:"Abstract network diagram with interconnected nodes representing software components and security vulnerabilities"},{slug:"vex-mistakes-fda-deficiencies",path:"blog/vex-mistakes-fda-deficiencies",title:"5 VEX Mistakes That Trigger FDA Findings",description:"Avoid common VEX mistakes that trigger FDA cybersecurity deficiencies. Learn to properly prepare your VEX for medical device premarket submissions.",image:"/post-heroes/vex-mistakes-fda-deficiencies.jpg",sourceUrl:"https://bluegoatcyber.com/blog/vex-mistakes-fda-deficiencies",publishedAt:"2026-05-17T12:30:00.000Z",imageAlt:"Abstract digital lock with a red X overlay, symbolizing cybersecurity errors and FDA scrutiny"},{slug:"fda-deficiency-letter-vs-rta-vs-hold-letter",path:"blog/fda-deficiency-letter-vs-rta-vs-hold-letter",title:"FDA Deficiency Letter vs RTA vs Hold",description:"FDA Deficiency Letter, RTA, and Hold Letter explained side-by-side. What each one means, the clock impact, and how to respond without losing months.",image:"/post-heroes/fda-deficiency-letter-vs-rta-vs-hold-letter.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-deficiency-letter-vs-rta-vs-hold-letter",publishedAt:"2026-05-17T12:00:00.000Z",imageAlt:"Abstract digital network overlaying a medical device, symbolizing cybersecurity and regulatory oversight"},{slug:"preparing-your-estar-510k-cybersecurity-documentation",path:"blog/preparing-your-estar-510k-cybersecurity-documentation",title:"eSTAR 510(k) Cybersecurity Documentation",description:"Every cybersecurity artifact the FDA expects in an eSTAR 510(k): Cybersecurity attachment mapping, SBOM, threat model, SPDF evidence, and traceability matrix.",image:"/post-heroes/preparing-your-estar-510k-cybersecurity-documentation.jpg",sourceUrl:"https://bluegoatcyber.com/blog/preparing-your-estar-510k-cybersecurity-documentation",publishedAt:"2026-05-10T15:00:00+00:00",category:"FDA",tags:["FDA","eSTAR","510(k)"],imageAlt:"Abstract digital network with glowing nodes and lines, illustrating medical device cybersecurity compliance"},{slug:"brainjacking-cyber-physical-threat-neurotech",path:"blog/brainjacking-cyber-physical-threat-neurotech",title:"Brainjacking: Cyber Threat to NeuroTech",description:"Brainjacking is unauthorized control of an implanted neurostimulator. We unpack attack vectors, clinical consequences, and what FDA reviewers expect.",image:"/imported-images/hero-brainjacking-cyber-physical-threat-neurotech.jpg",sourceUrl:"https://bluegoatcyber.com/blog/brainjacking-cyber-physical-threat-neurotech",publishedAt:"2026-05-08T12:00:00+00:00",category:"Threat Modeling",tags:["Threat Modeling"],imageAlt:"Abstract brain circuitry with digital overlay, symbolizing neurotechnology and cybersecurity threats"},{slug:"postmarket-cybersecurity-for-medical-devices-the-fda-roadmap",path:"blog/postmarket-cybersecurity-for-medical-devices-the-fda-roadmap",title:"FDA Postmarket Cybersecurity for Cleared",description:"FDA postmarket cybersecurity guidance for cleared medical devices: SBOM monitoring, validated patches, CVD, and 21 CFR Part 806 reporting under Section 524B.",image:"/imported-images/hero-postmarket-cybersecurity-for-medical-devices-the-fda-roadmap.jpg",sourceUrl:"https://bluegoatcyber.com/blog/postmarket-cybersecurity-for-medical-devices-the-fda-roadmap",publishedAt:"2026-04-10T04:07:52+00:00",category:"FDA",tags:["FDA","Postmarket"],imageAlt:"Digital lock icon on a medical device circuit board, representing FDA postmarket cybersecurity compliance"},{slug:"medical-device-pen-testing-choosing-the-right-provider",path:"blog/medical-device-pen-testing-choosing-the-right-provider",title:"Medical Device Pen Testing Providers",description:"When penetration test reports are vague, incomplete, or written to enterprise IT standards rather than medical device requirements, FDA reviewers issue.",image:"/imported-images/hero-medical-device-pen-testing-choosing-the-right-provider.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-pen-testing-choosing-the-right-provider",publishedAt:"2026-04-10T04:02:51+00:00",category:"Pen Testing",tags:["Pen Testing"],imageAlt:"Digital lock and key overlaying a medical device, symbolizing secure penetration testing for healthcare technology"},{slug:"how-to-respond-to-an-fda-cybersecurity-ai-request",path:"blog/how-to-respond-to-an-fda-cybersecurity-ai-request",title:"How to Respond to an FDA Cybersecurity AI Request",description:"Receiving an FDA cybersecurity Additional Information Request (AIR) doesn't mean your submission is dead. Aligned with the FDA's Feb 3, 2026 premarket.",image:"/imported-images/hero-how-to-respond-to-an-fda-cybersecurity-ai-request.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/how-to-respond-to-an-fda-cybersecurity-ai-request",publishedAt:"2026-04-10T03:52:20+00:00",category:"FDA",tags:["FDA","AI"],imageAlt:"Digital lock and key on a medical device, symbolizing FDA cybersecurity response and compliance"},{slug:"why-iso-27001-and-soc-2-are-not-enough-for-fda-medical-device-cybersecurity",path:"blog/why-iso-27001-and-soc-2-are-not-enough-for-fda-medical-device-cybersecurity",title:"ISO 27001 & SOC 2 vs FDA Medical Device Rules",description:"Why ISO 27001 and SOC 2 don't satisfy FDA medical device cybersecurity: the gaps in Section 524B evidence and what reviewers require instead.",image:"/imported-images/hero-why-iso-27001-and-soc-2-are-not-enough-for-fda-medical-devic.jpg",sourceUrl:"https://bluegoatcyber.com/blog/why-iso-27001-and-soc-2-are-not-enough-for-fda-medical-device-cybersecurity",publishedAt:"2026-04-10T03:48:26+00:00",category:"FDA",tags:["FDA","Standards"],imageAlt:"Abstract network of interconnected gears and circuits symbolizing complex medical device cybersecurity compliance"},{slug:"what-triggers-fda-cybersecurity-deficiencies-for-devices",path:"blog/what-triggers-fda-cybersecurity-deficiencies-for-devices",title:"FDA Cybersecurity Deficiencies Triggers",description:"Understanding what causes the FDA to issue a cybersecurity deficiency for medical devices starts with one uncomfortable truth: most deficiencies have.",image:"/imported-images/hero-what-triggers-fda-cybersecurity-deficiencies-for-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-triggers-fda-cybersecurity-deficiencies-for-devices",publishedAt:"2026-04-09T22:17:30+00:00",category:"FDA",tags:["FDA"],imageAlt:"Abstract network lines connect to a medical device, symbolizing FDA cybersecurity deficiency triggers"},{slug:"510k-cybersecurity-requirements-every-maker-must-meet",path:"blog/510k-cybersecurity-requirements-every-maker-must-meet",title:"510(k) Cybersecurity Requirements: Threat Model, SBOM & Testing",description:"FDA 510(k) cybersecurity requirements - threat model, SBOM, testing, postmarket plan - scaled across 510(k), De Novo, and PMA pathways under Section 524B.",image:"/imported-images/hero-510k-cybersecurity-requirements.jpg",sourceUrl:"https://bluegoatcyber.com/blog/510k-cybersecurity-requirements-every-maker-must-meet",publishedAt:"2026-04-09T22:01:44+00:00",category:"FDA",tags:["FDA","510(k)"],imageAlt:"Digital lock securing medical device data, representing FDA 510(k) cybersecurity compliance requirements"},{slug:"a-guide-to-fdas-cybersecurity-documentation-requirements",path:"blog/a-guide-to-fdas-cybersecurity-documentation-requirements",title:"FDA Cybersecurity Documentation",description:"FDA cybersecurity documentation requirements (2026): SPDF artifacts, Section 524B evidence, SBOM, threat model, testing, and labeling reviewers expect.",image:"/imported-images/hero-a-guide-to-fdas-cybersecurity-documentation-requirements.jpg",sourceUrl:"https://bluegoatcyber.com/blog/a-guide-to-fdas-cybersecurity-documentation-requirements",publishedAt:"2026-04-09T22:00:00+00:00",dateModified:"2026-06-19T00:00:00+00:00",category:"FDA",tags:["FDA","Documentation","SPDF","Section 524B"],imageAlt:"Digital blueprint with medical device components and cybersecurity icons, illustrating FDA documentation requirements"},{slug:"spdf-cybersecurity-documentation-what-fda-reviewers-expect",path:"blog/spdf-cybersecurity-documentation-what-fda-reviewers-expect",title:"SPDF Cybersecurity Documentation",description:"What FDA reviewers actually look for in SPDF cybersecurity documentation: the artifacts, structure, and traceability that pass RTA screening on the first try.",image:"/imported-images/hero-spdf-cybersecurity-documentation-what-fda-reviewers-expect.jpg",sourceUrl:"https://bluegoatcyber.com/blog/spdf-cybersecurity-documentation-what-fda-reviewers-expect",publishedAt:"2026-04-09T21:40:57+00:00",category:"FDA",tags:["FDA","SDLC"],imageAlt:"Digital blueprint with cybersecurity lock icon, symbolizing secure medical device development documentation"},{slug:"medical-device-cybersecurity-risk-analysis-the-fda-playbook",path:"blog/medical-device-cybersecurity-risk-analysis-the-fda-playbook",title:"Medical Device Cybersecurity Risk Analysis",description:"Performing a thorough cybersecurity risk analysis for a medical device isn't optional once your product qualifies under Section 524B of the FD&C Act.",image:"/imported-images/hero-medical-device-cybersecurity-risk-analysis-the-fda-playbook.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-risk-analysis-the-fda-playbook",publishedAt:"2026-04-09T21:19:26+00:00",category:"FDA",tags:["FDA","Risk"],imageAlt:"Abstract network diagram with medical icons, symbolizing medical device cybersecurity risk analysis"},{slug:"medical-device-sbom-fda-requirements-and-submission-guide",path:"blog/medical-device-sbom-fda-requirements-and-submission-guide",title:"Medical Device SBOM: FDA Requirements Guide (2026)",description:"The four SBOM elements FDA reviewers verify at RTA screening under Section 524B: format (CycloneDX/SPDX), identifiers (PURL/CPE), vuln disposition, update process.",image:"/imported-images/hero-medical-device-sbom-fda-requirements-and-submission-guide.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-sbom-fda-requirements-and-submission-guide",publishedAt:"2026-04-09T21:10:14+00:00",category:"FDA",tags:["FDA","Premarket","SBOM"],imageAlt:"Digital blueprint of a medical device with highlighted sections representing SBOM data points for FDA review"},{slug:"cybersecurity-risks-of-legacy-medical-devices-in-hospitals",path:"blog/cybersecurity-risks-of-legacy-medical-devices-in-hospitals",title:"Legacy Medical Device Cybersecurity Risks in Hospitals",description:"Legacy medical devices - Windows XP infusion pumps, unpatched imaging, flat VLANs - are the #1 hospital attack surface. Scoring, segmentation, and a 90-day fix plan.",image:"/imported-images/hero-cybersecurity-risks-of-legacy-medical-devices-in-hospitals.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-risks-of-legacy-medical-devices-in-hospitals",publishedAt:"2026-04-09T20:23:46+00:00",category:"Lifecycle",tags:["Lifecycle","Postmarket","Risk"],imageAlt:"Networked medical devices with outdated security vulnerabilities, highlighting hospital cybersecurity risks"},{slug:"why-medical-device-cybersecurity-is-nothing-like-enterprise-it",path:"blog/why-medical-device-cybersecurity-is-nothing-like-enterprise-it",title:"Why Medical Device Cybersecurity Is Not Enterprise IT",description:"Medical device cybersecurity fundamentally differs from enterprise IT due to patient safety, FDA regulations, and unique technical constraints. Learn why.",image:"/imported-images/hero-why-medical-device-cybersecurity-is-nothing-like-enterprise-.jpg",sourceUrl:"https://bluegoatcyber.com/blog/why-medical-device-cybersecurity-is-nothing-like-enterprise-it",publishedAt:"2026-04-09T18:00:49+00:00",category:"Primer",tags:["Primer"],imageAlt:"Networked medical devices and a concerned cybersecurity professional overseeing them"},{slug:"how-to-choose-the-best-medical-device-cybersecurity-company",path:"blog/how-to-choose-the-best-medical-device-cybersecurity-company",title:"How to Choose a Medical Device Cybersecurity Firm",description:"Medical device cybersecurity company selection: 5 criteria that separate FDA-fluent specialists from generalists, with the questions that surface real depth.",image:"/imported-images/hero-how-to-choose-the-best-medical-device-cybersecurity-company.jpg",sourceUrl:"https://bluegoatcyber.com/blog/how-to-choose-the-best-medical-device-cybersecurity-company",publishedAt:"2026-04-09T07:21:35+00:00",category:"Best Practices",tags:["Best Practices"],imageAlt:"Abstract network nodes connect to a central, glowing medical device, symbolizing secure medical technology integration"},{slug:"medical-device-cybersecurity-a-complete-lifecycle-guide",path:"blog/medical-device-cybersecurity-a-complete-lifecycle-guide",title:"Medical Device Cybersecurity Lifecycle",description:"Medical device cybersecurity is not a documentation exercise you complete before submission. Aligned with the FDA's Feb 3, 2026 premarket cybersecurity.",image:"/imported-images/hero-medical-device-cybersecurity-a-complete-lifecycle-guide.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-a-complete-lifecycle-guide",publishedAt:"2026-04-08T09:37:43+00:00",category:"Lifecycle",tags:["Lifecycle"],imageAlt:"Abstract network nodes and gears represent the continuous medical device cybersecurity lifecycle"},{slug:"a-step-by-step-guide-to-threat-modeling-connected-and-implantable-medical-devices",path:"blog/a-step-by-step-guide-to-threat-modeling-connected-and-implantable-medical-devices",title:"Medical Device Threat Modeling: FDA Guide | Blue Goat Cyber",description:"Medical device threat modeling steps: scoping, data flow diagrams, STRIDE, ISO 14971 harm scoring, and what FDA reviewers expect in a submission package.",image:"/imported-images/hero-a-step-by-step-guide-to-threat-modeling-connected-and-implantable-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/a-step-by-step-guide-to-threat-modeling-connected-and-implantable-medical-devices",publishedAt:"2026-04-01T00:00:00+00:00",imageAlt:"Abstract network graph of trust boundaries around a connected implantable device"},{slug:"from-idea-to-fda-clearance-what-nobody-tells-medtech-fou
209nders",path:"blog/from-idea-to-fda-clearance-what-nobody-tells-medtech-founders",title:"From Idea to FDA Clearance for MedTech",description:"The biggest MedTech startup mistake isn't the tech. See why clarity, FDA planning, quality systems, and cybersecurity decide whether you clear review.",image:"/imported-images/hero-from-idea-to-fda-clearance-what-nobody-tells-medtech-founder.jpg",sourceUrl:"https://bluegoatcyber.com/blog/from-idea-to-fda-clearance-what-nobody-tells-medtech-founders",publishedAt:"2026-02-16T08:00:05+00:00",category:"FDA",tags:["FDA"],imageAlt:"Abstract blue goat head morphing into a medical device circuit board, symbolizing cybersecurity in FDA-cleared medical technology"},{slug:"how-can-medical-device-manufacturers-support-operational-cybersecurity",path:"blog/how-can-medical-device-manufacturers-support-operational-cybersecurity",title:"How Can Medical Device Manufacturers",description:"Postmarket device cybersecurity is a shared job. See how manufacturers and healthcare organizations collaborate to reduce risk once a device is deployed.",image:"/imported-images/hero-how-can-medical-device-manufacturers-support-operational-cyb.jpg",sourceUrl:"https://bluegoatcyber.com/blog/how-can-medical-device-manufacturers-support-operational-cybersecurity",publishedAt:"2026-02-16T07:42:09+00:00",category:"Primer",tags:["Primer"],imageAlt:"Connected medical devices with a digital lock symbolizing shared cybersecurity responsibility"},{slug:"a-new-era-for-quality-and-safety-what-the-fdas-qmsr-means-for-cybersecurity",path:"blog/a-new-era-for-quality-and-safety-what-the-fdas-qmsr-means-for-cybersecurity",title:"What the FDA's QMSR Means for Medical Device Cybersecurity",description:"The QMSR replaced the Quality System Regulation with ISO 13485:2016. Learn what changed, what did not, and how cybersecurity work fits the new structure.",image:"/imported-images/hero-fda-qmsr.jpg",sourceUrl:"https://bluegoatcyber.com/blog/a-new-era-for-quality-and-safety-what-the-fdas-qmsr-means-for-cybersecurity",publishedAt:"2026-02-08T15:16:43+00:00",category:"FDA",tags:["FDA","Risk"],imageAlt:"Digital network connections overlaying a stylized goat, symbolizing connected medical devices and cybersecurity"},{slug:"neurotech-cybersecurity-risks-neurostimulators-eeg-bci",path:"blog/neurotech-cybersecurity-risks-neurostimulators-eeg-bci",title:"NeuroTech Cybersecurity Risks",description:"NeuroTech cybersecurity risks affect therapy and neural data. Learn threats, controls, and FDA-ready documentation for neurostimulators, EEG, and BCI.",image:"/post-heroes/neurotech-cybersecurity-risks-neurostimulators-eeg-bci-v2.jpg",sourceUrl:"https://bluegoatcyber.com/blog/neurotech-cybersecurity-risks-neurostimulators-eeg-bci",publishedAt:"2026-01-25T04:13:21+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Abstract brain network with glowing nodes and cyber threat icons illustrates neurotech cybersecurity risks"},{slug:"securing-the-total-product-lifecycle-protecting-medical-devices-from-concept-to-disposal",path:"blog/securing-the-total-product-lifecycle-protecting-medical-devices-from-concept-to-disposal",title:"Total Product Lifecycle Security for Devices",description:"Total Product Lifecycle (TPLC) security and a Secure Product Development Framework (SPDF) to protect medical devices, patient data, and reduce cyber risk.",image:"/imported-images/hero-securing-the-total-product-lifecycle-protecting-medical-devi.jpg",sourceUrl:"https://bluegoatcyber.com/blog/securing-the-total-product-lifecycle-protecting-medical-devices-from-concept-to-disposal",publishedAt:"2025-12-04T14:45:41+00:00",category:"Lifecycle",tags:["Lifecycle"],imageAlt:"Abstract digital network connecting medical devices and data, symbolizing secure product lifecycle management"},{slug:"cybersecurity-measures-and-metrics-for-medical-devices-navigating-fda-compliance",path:"blog/cybersecurity-measures-and-metrics-for-medical-devices-navigating-fda-compliance",title:"Cybersecurity Metrics for FDA Compliance (2026)",description:"Cybersecurity Metrics for FDA Compliance for medical devices: step-by-step practices, FDA-aligned documentation, and pitfalls to avoid in 2026 submissions.",image:"/imported-images/4b25bb9c330b06db.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-measures-and-metrics-for-medical-devices-navigating-fda-compliance",publishedAt:"2025-12-04T14:30:57+00:00",category:"FDA",tags:["FDA"],imageAlt:"Abstract network nodes and data streams represent cybersecurity measures and metrics for medical devices"},{slug:"leveraging-market-intelligence-and-cybersecurity-to-drive-medtech-growth",path:"blog/leveraging-market-intelligence-and-cybersecurity-to-drive-medtech-growth",title:"Market Intelligence & Cybersecurity for MedTech",description:"How MedTech teams combine market intelligence and cybersecurity to accelerate growth, de-risk FDA submissions, and win enterprise health-system deals.",image:"/imported-images/hero-leveraging-market-intelligence-and-cybersecurity-to-drive-me.jpg",sourceUrl:"https://bluegoatcyber.com/blog/leveraging-market-intelligence-and-cybersecurity-to-drive-medtech-growth",publishedAt:"2025-12-03T10:18:14+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network connections overlaying a stylized blue goat head, symbolizing cyber threat intelligence"},{slug:"navigating-the-fdas-18-cybersecurity-deliverables-for-medical-device-submissions",path:"blog/navigating-the-fdas-18-cybersecurity-deliverables-for-medical-device-submissions",title:"FDAâs 18 Cybersecurity Deliverables",description:"Learn how to organize FDA medical device cybersecurity requirements into 18 key deliverables, from threat modeling and SBOMs to testing and labeling.",image:"/imported-images/hero-navigating-the-fdas-18-cybersecurity-deliverables-for-medica.jpg",sourceUrl:"https://bluegoatcyber.com/blog/navigating-the-fdas-18-cybersecurity-deliverables-for-medical-device-submissions",publishedAt:"2025-11-30T19:11:53+00:00",category:"FDA",tags:["FDA","Premarket"],imageAlt:"Abstract network nodes and gears represent FDA cybersecurity deliverables for medical device security"},{slug:"samd-vs-simd-what-medical-device-manufacturers-need-to-know",path:"blog/samd-vs-simd-what-medical-device-manufacturers-need-to-know",title:"SaMD vs SiMD: What Manufacturers Need to Know",description:"Learn the difference between SaMD and SiMD, why it matters for FDA strategy, and how to build secure-by-design medical devices across your product.",image:"/imported-images/hero-samd-vs-simd-what-medical-device-manufacturers-need-to-know.jpg",sourceUrl:"https://bluegoatcyber.com/blog/samd-vs-simd-what-medical-device-manufacturers-need-to-know",publishedAt:"2025-11-30T18:19:06+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital medical device icons and a lock symbolize the cybersecurity of software as a medical device"},{slug:"what-is-a-medical-cyber-device-unraveling-the-fdas-cyber-device-definition",path:"blog/what-is-a-medical-cyber-device-unraveling-the-fdas-cyber-device-definition",title:"What Is a Medical Cyber Device? FDA Definition",description:"FDA cyber-device definition: how software, USB/HDMI/Bluetooth ports, and third-party tools pull a medical device into Section 524B cybersecurity rules.",image:"/imported-images/fda-cyber-2026-hero.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-a-medical-cyber-device-unraveling-the-fdas-cyber-device-definition",publishedAt:"2025-11-05T12:46:20+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network lines connect to a stylized medical device, representing connected healthcare cybersecurity"},{slug:"debunking-the-top-5-medical-device-cybersecurity-myths-holding-back-innovation",path:"blog/debunking-the-top-5-medical-device-cybersecurity-myths-holding-back-innovation",title:"5 Medical Device Cybersecurity Myths, Debunked",description:"Discover the truth behind the top 5 medical device cybersecurity myths and how debunking them drives innovation, safety, and FDA compliance today.",image:"/imported-images/hero-debunking-the-top-5-medical-device-cybersecurity-myths-holdi.jpg",sourceUrl:"https://bluegoatcyber.com/blog/debunking-the-top-5-medical-device-cybersecurity-myths-holding-back-innovation",publishedAt:"2025-11-05T12:31:17+00:00",category:"Primer",tags:["Primer"],imageAlt:"A stylized blue goat head with a shield and lock symbolizes protection for medical devices and cybersecurity"},{slug:"cybersecurity-as-a-competitive-edge-in-medtech",path:"blog/cybersecurity-as-a-competitive-edge-in-medtech",title:"Cybersecurity as a MedTech Differentiator (2026)",description:"Discover how MedTech innovators use cybersecurity as a strategic advantage to gain investor trust, meet FDA expectations, and drive market success.",image:"/imported-images/hero-cybersecurity-as-a-competitive-edge-in-medtech.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-as-a-competitive-edge-in-medtech",publishedAt:"2025-11-05T12:17:59+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network lines and a glowing medical device symbol represent MedTech cybersecurity as a competitive advantage"},{slug:"the-overlooked-threat-in-medtech-innovation-cybersecurity-risks-every-founder-must-address",path:"blog/the-overlooked-threat-in-medtech-innovation-cybersecurity-risks-every-founder-must-address",title:"Founder Guide to MedTech Cyber Risk (2026)",description:"Cybersecurity is the overlooked threat in MedTech. Discover how Blue Goat Cyber helps founders avoid FDA delays, protect patients, and win investor trust.",image:"/imported-images/hero-the-overlooked-threat-in-medtech-innovation-cybersecurity-ri.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-overlooked-threat-in-medtech-innovation-cybersecurity-risks-every-founder-must-address",publishedAt:"2025-09-29T08:43:45+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Abstract blue goat silhouette integrated
209with digital circuit board patterns, symbolizing cybersecurity in medical technology"},{slug:"securing-medical-devices-the-key-to-faster-fda-approval-and-investor-confidence",path:"blog/securing-medical-devices-the-key-to-faster-fda-approval-and-investor-confidence",title:"Cybersecurity for Faster FDA Clearance (2026)",description:"Cybersecurity for Faster FDA Approval: a practical 2026 playbook for MedTech leaders, what to prioritize, how the FDA expects it framed, and where teams stumble.",image:"/imported-images/hero-securing-medical-devices-the-key-to-faster-fda-approval-and-.jpg",sourceUrl:"https://bluegoatcyber.com/blog/securing-medical-devices-the-key-to-faster-fda-approval-and-investor-confidence",publishedAt:"2025-09-29T07:04:00+00:00",category:"FDA",tags:["FDA"],imageAlt:"Abstract digital network connecting medical devices, symbolizing secure FDA clearance and patient safety"},{slug:"top-10-medical-device-vulnerabilities-revealed-protecting-patient-safety",path:"blog/top-10-medical-device-vulnerabilities-revealed-protecting-patient-safety",title:"Top 10 Medical Device Vulnerabilities",description:"Discover the top 10 medical device cybersecurity vulnerabilities from real-world penetration testing & learn how to protect patients and meet FDA.",image:"/imported-images/hero-top-10-medical-device-vulnerabilities-revealed-protecting-pa.jpg",sourceUrl:"https://bluegoatcyber.com/blog/top-10-medical-device-vulnerabilities-revealed-protecting-patient-safety",publishedAt:"2025-09-28T03:01:41+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and glowing lines connect to a stylized medical device, illustrating cybersecurity vulnerabilities"},{slug:"when-cybersecurity-becomes-a-crime-what-the-illumina-case-signals-for-medical-device-makers",path:"blog/when-cybersecurity-becomes-a-crime-what-the-illumina-case-signals-for-medical-device-makers",title:"Illumina FDA Cybersecurity Case: What It Signals",description:"Illumina FDA Cybersecurity Case: a practical 2026 playbook for MedTech leaders, what to prioritize, how the FDA expects it framed, and where teams stumble.",image:"/imported-images/hero-when-cybersecurity-becomes-a-crime-what-the-illumina-case-si.jpg",sourceUrl:"https://bluegoatcyber.com/blog/when-cybersecurity-becomes-a-crime-what-the-illumina-case-signals-for-medical-device-makers",publishedAt:"2025-08-07T20:06:12+00:00",imageAlt:"Digital lock protecting medical device data, illustrating cybersecurity risks and legal consequences"},{slug:"patch-act-only-applies-to-new-medical-devices-leaves-legacy-systems-a-risk",path:"blog/patch-act-only-applies-to-new-medical-devices-leaves-legacy-systems-a-risk",title:"PATCH Act: Legacy Device Cyber Gaps | Blue Goat Cyber",description:"The PATCH Act became section 524B and covers new cyber devices only. See what it requires, who is exempt, and how to secure legacy medical devices.",image:"/imported-images/hero-patch-act-only-applies-to-new-medical-devices-leaves-legacy-.jpg",sourceUrl:"https://bluegoatcyber.com/blog/patch-act-only-applies-to-new-medical-devices-leaves-legacy-systems-a-risk",publishedAt:"2025-07-13T02:38:39+00:00",category:"Risk",tags:["Risk","Postmarket"],imageAlt:"Cybersecurity shield protecting legacy medical devices from digital threats and regulatory risks"},{slug:"medical-device-cybersecurity-traceability",path:"blog/medical-device-cybersecurity-traceability",title:"Medical Device Traceability Matrix: Guide | Blue Goat Cyber",description:"A medical device traceability matrix links threats to security risks, requirements, controls, and verification evidence for FDA premarket review.",image:"/imported-images/hero-medical-device-cybersecurity-traceability.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-traceability",publishedAt:"2025-04-17T16:13:29+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network of interconnected gears representing traceability for medical device cybersecurity compliance"},{slug:"guide-to-medical-device-cybersecurity-standards-premarket-postmarket-lifecycle",path:"blog/guide-to-medical-device-cybersecurity-standards-premarket-postmarket-lifecycle",title:"Medical Device Cybersecurity Standards",de
209scription:"The 14 medical device cybersecurity standards FDA reviewers expect - ISO 14971, IEC 62304/81001-5-1, AAMI TIR57/TIR97, UL 2900 - mapped to SPDF artifacts.",image:"/imported-images/hero-guide-to-medical-device-cybersecurity-standards-premarket-po.jpg",sourceUrl:"https://bluegoatcyber.com/blog/guide-to-medical-device-cybersecurity-standards-premarket-postmarket-lifecycle",publishedAt:"2025-04-13T13:29:22+00:00",category:"FDA",tags:["FDA","Premarket","Postmarket"],imageAlt:"Abstract digital network connecting medical devices, representing cybersecurity in healthcare technology"},{slug:"fda-medical-device-submission-costs-explained-510k-pma-and-more-2025-guide",path:"blog/fda-medical-device-submission-costs-explained-510k-pma-and-more-2025-guide",title:"510(k) Cost: Plan FDA Fees With Confidence | Blue Goat Cyber",description:"Understand what drives 510(k) cost, plus De Novo and PMA fees: user fees, small business status, testing, cybersecurity work, and consultant spend.",image:"/imported-images/hero-fda-medical-device-submission-costs-explained-510k-pma-and-m.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-medical-device-submission-costs-explained-510k-pma-and-more-2025-guide",publishedAt:"2025-04-12T22:40:16+00:00",category:"FDA",tags:["FDA","510(k)","Premarket"],imageAlt:"Digital lock and key securing a medical device, representing FDA cybersecurity submission costs"},{slug:"how-to-navigate-the-fda-510k-and-pma-databases",path:"blog/how-to-navigate-the-fda-510k-and-pma-databases",title:"FDA 510(k) & PMA Cybersecurity Guide",description:"Search the FDA 510(k), De Novo, and PMA databases for cybersecurity precedent, product codes, and predicate devices before a Section 524B premarket filing.",image:"/imported-images/hero-how-to-navigate-the-fda-510k-and-pma-databases.jpg",sourceUrl:"https://bluegoatcyber.com/blog/how-to-navigate-the-fda-510k-and-pma-databases",publishedAt:"2025-04-12T22:24:05+00:00",category:"FDA",tags:["FDA","510(k)","De Novo","PMA","Section 524B","Premarket"],imageAlt:"Digital lock icon superimposed on a flow chart of FDA medical device approval pathways"},{slug:"safeguarding-medical-device-ai-combating-data-poisoning-cybersecurity-threats",path:"blog/safeguarding-medical-device-ai-combating-data-poisoning-cybersecurity-threats",title:"Training Data Poisoning in Medical AI: Controls and Evidence",description:"How training data poisoning corrupts AI-enabled medical devices, and the provenance, monitoring, and rollback evidence reviewers expect under 524B.",image:"/imported-images/hero-safeguarding-medical-device-ai-combating-data-poisoning-cybe.jpg",sourceUrl:"https://bluegoatcyber.com/blog/safeguarding-medical-device-ai-combating-data-poisoning-cybersecurity-threats",publishedAt:"2025-01-21T01:50:49+00:00",category:"AI & ML",tags:["AI & ML","AI"],imageAlt:"Abstract digital network with a stylized goat silhouette, representing AI security threats"},{slug:"protecting-medical-devices-ai-model-evasion-and-cybersecurity-threats",path:"blog/protecting-medical-devices-ai-model-evasion-and-cybersecurity-threats",title:"Medical Device AI Evasion & Cybersecurity",description:"Explore the evolving landscape of cybersecurity in healthcare as we delve into the challenges of AI model evasion and the protection of medical devices.",image:"/imported-images/hero-protecting-medical-devices-ai-model-evasion-and-cybersecurit.jpg",sourceUrl:"https://bluegoatcyber.com/blog/protecting-medical-devices-ai-model-evasion-and-cybersecurity-threats",publishedAt:"2025-01-21T01:21:14+00:00",category:"AI & ML",tags:["AI & ML","AI"],imageAlt:"Abstract digital network connecting medical devices, symbolizing AI cybersecurity threats and protection"},{slug:"understanding-medical-device-ai-model-inversion-cybersecurity-threats-and-solutions",path:"blog/understanding-medical-device-ai-model-inversion-cybersecurity-threats-and-solutions",title:"AI Model Inversion Attacks on Medical Devices",description:"How aI Model Inversion Attacks target medical devices, real-world examples, and the controls FDA expects manufacturers to implement in 2026.",image:"/imported-images/hero-understanding-medical-device-ai-model-inversion-cybersecurit.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/understanding-medical-device-ai-model-inversion-cybersecurity-threats-and-solutions",publishedAt:"2025-01-20T21:12:10+00:00",category:"AI & ML",tags:["AI & ML","AI"],imageAlt:"Abstract network nodes and data streams illustrate the cybersecurity risks of AI model inversion in medical devices"},{slug:"understanding-ai-performance-drift-ensuring-medical-device-safety",path:"blog/understanding-ai-performance-drift-ensuring-medical-device-safety",title:"Medical Device AI Performance Drift",description:"AI performance drift degrades medical device accuracy over time. Learn its impacts, causes, and mitigation strategies to maintain safety and efficacy.",image:"/imported-images/hero-understanding-ai-performance-drift-ensuring-medical-device-s.jpg",sourceUrl:"https://bluegoatcyber.com/blog/understanding-ai-performance-drift-ensuring-medical-device-safety",publishedAt:"2025-01-20T16:11:25+00:00",category:"AI & ML",tags:["AI & ML","AI"],imageAlt:"Abstract network of glowing nodes and lines, representing AI and data flow in medical devices"},{slug:"ai-overfitting-cybersecurity-threats-in-medical-devices",path:"blog/ai-overfitting-cybersecurity-threats-in-medical-devices",title:"AI Overfitting in Medical Devices",description:"AI overfitting in medical devices poses cybersecurity threats, leading to misdiagnosis and exploitable vulnerabilities. Learn how to mitigate these risks.",image:"/imported-images/hero-ai-overfitting-cybersecurity-threats-in-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/ai-overfitting-cybersecurity-threats-in-medical-devices",publishedAt:"2025-01-19T19:53:09+00:00",category:"AI & ML",tags:["AI & ML","AI"],imageAlt:"Abstract network connections and data points illustrate the risks of AI overfitting in medical device cybersecurity"},{slug:"medical-device-software-functional-and-non-functional-aspects-explained",path:"blog/medical-device-software-functional-and-non-functional-aspects-explained",title:"Functional vs Non-Functional Device Requirements",description:"Functional vs non-functional requirements in medical device software: what each covers, how FDA reviewers evaluate them, and how cybersecurity fits in.",image:"/imported-images/hero-medical-device-software-functional-and-non-functional-aspect.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-software-functional-and-non-functional-aspects-explained",publishedAt:"2024-11-17T16:53:45+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connecting medical devices, illustrating software security and connectivity"},{slug:"vv-regression-testing-medical-device-cybersecurity",path:"blog/vv-regression-testing-medical-device-cybersecurity",title:"V&V and Regression Testing for Medical Devices",description:"How verification, validation, and regression testing work together to produce defensible FDA premarket cybersecurity evidence under Section 524B, IEC.",image:"/imported-images/hero-vv-regression-testing-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/vv-regression-testing-medical-device-cybersecurity",publishedAt:"2024-11-17T16:47:32+00:00",category:"FDA",tags:["FDA"],imageAlt:"Digital medical device circuit board with a magnifying glass highlighting cybersecurity testing protocols"},{slug:"enhancing-medical-device-security-tamper-proof-seals-and-cybersecurity-labeling",path:"blog/enhancing-medical-device-security-tamper-proof-seals-and-cybersecurity-labeling",title:"Enhancing Medical Device Security: Tamper",description:"Learn how tamper-proof seals and cybersecurity labeling secure medical devices, protect patient data, and support FDA compliance with Blue Goat Cyber.",image:"/imported-images/hero-enhancing-medical-device-security-tamper-proof-seals-and-cyb.jpg",sourceUrl:"https://bluegoatcyber.com/blog/enhancing-medical-device-security-tamper-proof-seals-and-cybersecurity-labeling",publishedAt:"2024-11-17T16:39:58+00:00",category:"Primer",tags:["Primer"],imageAlt:"Tamper-evident seals on medical devices represent cybersecurity and patient data protection"},{slug:"medical-device-safety-vs-security-risks",path:"blog/medical-device-safety-vs-security-risks",title:"Medical Device Safety vs Security Risks",description:"Explore the critical distinctions between safety and security risks in medical devices. Aligned with the FDA's Feb 3, 2026 premarket cybersecurity guidance.",image:"/imported-images/hero-medical-device-safety-vs-security-risks.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-safety-vs-security-risks",publishedAt:"2024-11-17T16:25:32+00:00",category:"Risk",tags:["Risk"],imageAlt:"Abstract digital network overlaying a medical device, illustrating safety and security risks"},{slug:"traditional-cybersecurity-vs-medical-device-cybersecurity",path:"blog/traditional-cybersecurity-vs-medical-device-cybersecurity",title:"Traditional vs Medical Device Cybersecurity (2026)",description:"Traditional vs Medical Device Cybersecurity: a practical 2026 playbook for MedTech leaders, what to prioritize, how the FDA expects it framed, and where teams stumble.",image:"/imported-images/hero-traditional-cybersecurity-vs-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/traditional-cybersecurity-vs-medical-device-cybersecurity",publishedAt:"2024-11-17T16:15:33+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital lock and key protecting medical devices, illustrating unique cybersecurity needs"},{slug:"ota-update-vulnerabilities",path:"blog/ota-update-vulnerabilities",t
209itle:"Medical Device OTA Update Vulnerabilities",description:"Explore the hidden dangers of OTA update vulnerabilities in this insightful article. Aligned with the FDA's Feb 3, 2026 premarket cybersecurity guidance.",image:"/imported-images/hero-ota-update-vulnerabilities.jpg",sourceUrl:"https://bluegoatcyber.com/blog/ota-update-vulnerabilities",publishedAt:"2024-11-17T16:07:04+00:00",category:"Primer",tags:["Primer"],imageAlt:"Cybersecurity padlock protecting a medical device with wireless signals indicating over-the-air updates"},{slug:"iec-80001-1-enhancing-medical-device-cybersecurity",path:"blog/iec-80001-1-enhancing-medical-device-cybersecurity",title:"IEC 80001-1: Hospital Network Risk Management Explained",description:"IEC 80001-1 defines how hospitals manage risk when medical devices join IT networks: roles, key properties, and what manufacturers must supply for compliance.",image:"/imported-images/hero-iec-80001-1-enhancing-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iec-80001-1-enhancing-medical-device-cybersecurity",publishedAt:"2024-11-17T16:01:12+00:00",category:"Standards",tags:["Standards"],imageAlt:"Abstract network of interconnected medical devices and data streams representing cybersecurity standards"},{slug:"embedded-cybersecurity-challenges",path:"blog/embedded-cybersecurity-challenges",title:"Embedded Cybersecurity Challenges MedTech",description:"The embedded-systems cybersecurity challenges that derail FDA premarket submissions - from constrained crypto to firmware update integrity - and how to fix.",image:"/imported-images/hero-embedded-cybersecurity-challenges.jpg",sourceUrl:"https://bluegoatcyber.com/blog/embedded-cybersecurity-challenges",publishedAt:"2024-11-16T00:30:56+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and gears represent embedded system cybersecurity challenges in medical devices"},{slug:"cybersecurity-practices-for-protecting-medical-devices-manufacturers-checklist",path:"blog/cybersecurity-practices-for-protecting-medical-devices-manufacturers-checklist",title:"Medical Device Cybersecurity Checklist: Design to Postmarket | Blue Goat Cyber",description:"Medical device cybersecurity checklist covering design, development, testing, submission, and postmarket phases, with the evidence FDA reviewers expect.",image:"/imported-images/hero-cybersecurity-practices-for-protecting-medical-devices-manuf.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-practices-for-protecting-medical-devices-manufacturers-checklist",publishedAt:"2024-11-16T00:25:51+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and glowing lines connect medical devices, illustrating cybersecurity for healthcare technology"},{slug:"cybersecurity-with-rtos",path:"blog/cybersecurity-with-rtos",title:"RTOS Security for Medical Devices: A Practical Guide",description:"RTOS security explained for medical devices: attack surface, isolation controls, secure boot, SBOM, and what the FDA expects documented.",image:"/imported-images/hero-cybersecurity-with-rtos.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-with-rtos",publishedAt:"2024-11-13T16:55:03+00:00",category:"FDA",tags:["FDA"],imageAlt:"Abstract network nodes and circuitry represent secure real-time operating systems within medical devices"},{slug:"what-is-a-modular-pma-submission",path:"blog/what-is-a-modular-pma-submission",title:"Modular PMA Submission: What MedTech Teams Need to Know (2026)",description:"Modular PMA Submission explained for medical device manufacturers, definition, FDA context, and what teams must document for 2026 submissions.",image:"/imported-images/hero-what-is-a-modular-pma-submission.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-a-modular-pma-submission",publishedAt:"2024-11-10T17:31:03+00:00",category:"FDA",tags:["FDA","Premarket"],imageAlt:"Abstract network of interconnected medical device components symbolizing modular PMA submission and FDA clearance"},{slug:"augmented-reality-ar-medical-device-cybersecurity-risks",path:"blog/augmented-reality-ar-medical-device-cybersecurity-risks",title:"AR Medical Device Cybersecurity Risks (2026)",description:"AR Medical Device Cybersecurity in medical devices: attack scenarios, patient-safety impact, and mitigations FDA reviewers expect in 2026 submissions.",image:"/imported-images/hero-augmented-reality-ar-medical-device-cybersecurity-risks.jpg",sourceUrl:"https://bluegoatcyber.com/blog/augmented-reality-ar-medical-device-cybersecurity-risks",publishedAt:"2024-11-02T18:03:28+00:00",category:"Primer",tags:["Primer"],imageAlt:"Holographic medical data overlayed with a digital lock, illustrating AR device cybersecurity risks"},{slug:"understanding-qnx-operating-system-vulnerabilities-risks-and-mitigation-strategies",path:"blog/understanding-qnx-operating-system-vulnerabilities-risks-and-mitigation-strategies",title:"QNX Vulnerabilities in Medical Devices",description:"Explore QNX operating system vulnerabilities, risks, and mitigation strategies crucial for medical devices. Understand how to secure QNX-based systems.",image:"/imported-images/hero-understanding-qnx-operating-system-vulnerabilities-risks-and.jpg",sourceUrl:"https://bluegoatcyber.com/blog/understanding-qnx-operating-system-vulnerabilities-risks-and-mitigation-strategies",publishedAt:"2024-11-02T17:56:34+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Abstract digital network connecting medical devices, representing QNX vulnerabilities and cybersecurity threats"},{slug:"the-therac-25-incident-a-critical-analysis-of-medical-device-failures",path:"blog/the-therac-25-incident-a-critical-analysis-of-medical-device-failures",title:"Therac-25: The Root
209Cause Behind Six Radiation Overdoses",description:"The Therac-25 caused six radiation overdoses and three deaths from 1985-1987. Timeline, root causes, and the software safety lessons for MedTech today.",image:"/imported-images/hero-the-therac-25-incident-a-critical-analysis-of-medical-device.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-therac-25-incident-a-critical-analysis-of-medical-device-failures",publishedAt:"2024-11-02T17:37:01+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital representation of a radiation therapy machine's internal circuitry, symbolizing software failure and medical device risk"},{slug:"enhancing-medical-device-cybersecurity-robustness-and-fuzz-testing-explained",path:"blog/enhancing-medical-device-cybersecurity-robustness-and-fuzz-testing-explained",title:"Medical Device Robustnesss & Fuzz Testing",description:"Ensure medical device safety with robustness and fuzz testing. Uncover critical vulnerabilities and maintain performance under diverse conditions.",image:"/imported-images/hero-enhancing-medical-device-cybersecurity-robustness-and-fuzz-t.jpg",sourceUrl:"https://bluegoatcyber.com/blog/enhancing-medical-device-cybersecurity-robustness-and-fuzz-testing-explained",publishedAt:"2024-11-02T17:29:15+00:00",category:"Pen Testing",tags:["Pen Testing"],imageAlt:"Abstract digital network with a stylized goat head, representing medical device cybersecurity testing"},{slug:"abuse-and-misuse-cases-testing-medical-devices-with-malformed-and-unexpected-inputs",path:"blog/abuse-and-misuse-cases-testing-medical-devices-with-malformed-and-unexpected-inputs",title:"Medical Device Abuse & Misuse Testing",description:"Abuse and misuse case testing for medical devices: how to design malformed and unexpected input tests that surface real safety risks before FDA submission.",image:"/imported-images/hero-abuse-and-misuse-cases-testing-medical-devices-with-malforme.jpg",sourceUrl:"https://bluegoatcyber.com/blog/abuse-and-misuse-cases-testing-medical-devices-with-malformed-and-unexpected-inputs",publishedAt:"2024-11-02T17:19:40+00:00",category:"Testing",tags:["Testing"],imageAlt:"Cybersecurity goat gnawing on a medical device, symbolizing testing against abuse and misuse"},{slug:"mdcg-2019-16-and-medical-device-security",path:"blog/mdcg-2019-16-and-medical-device-security",title:"MDCG 2019-16 & MedTech Cybersecurity",description:"Explore the implications of MDCG 2019-16 on medical device cybersecurity, highlighting key guidelines, industry challenges, and strategies for ensuring.",image:"/imported-images/hero-mdcg-2019-16-and-medical-device-security.jpg",sourceUrl:"https://bluegoatcyber.com/blog/mdcg-2019-16-and-medical-device-security",publishedAt:"2024-10-28T05:10:40+00:00",category:"Standards",tags:["Standards"],imageAlt:"Abstract network of glowing medical devices connected by digital lines, illustrating cybersecurity in healthcare technology"},{slug:"what-is-a-radiology-information-system",path:"blog/what-is-a-radiology-information-system",title:"Radiology Information System: What It Is and How It Works",description:"A radiology information system manages imaging workflow, orders, and reporting. Learn RIS modules, RIS vs PACS vs EHR, integration, and security.",image:"/imported-images/hero-what-is-a-radiology-information-system.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-a-radiology-information-system",publishedAt:"2024-10-27T18:29:31+00:00",category:"Primer",tags:["Primer"],imageAlt:"Networked medical devices and data streams illustrate the integration and cybersecurity of radiology information systems"},{slug:"medical-device-cybersecurity-risk-profiles",path:"blog/medical-device-cybersecurity-risk-profiles",title:"Medical Device Cybersecurity Risk Profiles (2026 Guide)",description:"Medical Device Cybersecurity Risk Profiles for medical devices: step-by-step practices, FDA-aligned documentation, and pitfalls to avoid in 2026 submissions.",image:"/imported-images/hero-medical-device-cybersecurity-risk-profiles.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-risk-profiles",publishedAt:"2024-10-24T00:58:40+00:00",category:"Risk",tags:["Risk"],imageAlt:"Abstract network of interconnected medical devices symbolizing cybersecurity risks and vulnerabilities"},{slug:"cracking-the-code-insider-cybersecurity-insights-for-medical-device-premarket-success",path:"blog/cracking-the-code-insider-cybersecurity-insights-for-medical-device-premarket-success",title:"Premarket Cybersecurity Insider Tips (2026)",description:"Premarket Cybersecurity Insider Tips: a practical 2026 playbook for MedTech leaders, what to prioritize, how the FDA expects it framed, and where teams stumble.",image:"/imported-images/hero-cracking-the-code-insider-cybersecurity-insights-for-medical.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cracking-the-code-insider-cybersecurity-insights-for-medical-device-premarket-success",publishedAt:"2024-10-23T22:35:28+00:00",category:"FDA",tags:["FDA"],imageAlt:"Abstract network nodes and medical symbols represent the intersection of healthcare technology and cybersecurity"},{slug:"gsm-cybersecurity-vulnerabilities-medical-devices",path:"blog/gsm-cybersecurity-vulnerabilities-medical-devices",title:"Cellular Connectivity Device Security | Blue Goat Cyber",description:"Cellular connectivity medical device security: 2G/3G downgrade risk, IMSI catchers, eSIM provisioning, LTE/5G, modem data at rest, and FDA documentation.",image:"/imported-images/hero-gsm-cybersecurity-vulnerabilities-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/gsm-cybersecurity-vulnerabilities-medical-devices",publishedAt:"2024-10-22T15:44:42+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Abstract network nodes and a stylized goat represent GSM risks to medical device cybersecurity"},{slug:"cybersecurity-in-the-coap-medical-device-protocol",path:"blog/cybersecurity-in-the-coap-medical-device-protocol",title:"CoAP Protocol Security in Medical Devices (2026)",description:"CoAP Protocol security in medical devices: known weaknesses, FDA-aligned mitigations, and test evidence to include in 2026 submissions.",image:"/imported-images/hero-cybersecurity-in-the-coap-medical-device-protocol.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-in-the-coap-medical-device-protocol",publishedAt:"2024-10-22T15:28:52+00:00",imageAlt:"Abstract network nodes and glowing lines representing secure CoAP protocol connections for medical devices"}
209,{slug:"nfc-and-medical-device-cybersecurity",path:"blog/nfc-and-medical-device-cybersecurity",title:"NFC and Medical Device Cybersecurity",description:"Discover the critical role of Near Field Communication (NFC) in safeguarding medical devices from cyber threats. Aligned with the FDA's Feb 3, 2026 premarket.",image:"/imported-images/hero-nfc-and-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/nfc-and-medical-device-cybersecurity",publishedAt:"2024-10-22T15:19:12+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes connect to a medical device, illustrating NFC's role in device cybersecurity"},{slug:"cybersecurity-for-medical-devices-with-narrowband-iot-protocol",path:"blog/cybersecurity-for-medical-devices-with-narrowband-iot-protocol",title:"Narrowband IoT Protocol Cybersecurity",description:"Discover how the Narrowband IoT protocol is revolutionizing cybersecurity for medical devices. Aligned with the FDA's Feb 3, 2026 premarket cybersecurity.",image:"/imported-images/hero-cybersecurity-for-medical-devices-with-narrowband-iot-protoc.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-for-medical-devices-with-narrowband-iot-protocol",publishedAt:"2024-10-22T15:10:43+00:00",imageAlt:"Abstract network grid with glowing nodes symbolizing secure medical device connectivity via Narrowband IoT"},{slug:"m2m-communication-vulnerabilities-in-medical-devices-a-cybersecurity-concern",path:"blog/m2m-communication-vulnerabilities-in-medical-devices-a-cybersecurity-concern",title:"M2M Communication Vulnerabilities in Medical Devices",description:"The risks and vulnerabilities in M2M communication between connected medical devices, and the cybersecurity controls the FDA expects at premarket review.",image:"/imported-images/hero-m2m-communication-vulnerabilities-in-medical-devices-a-cyber.jpg",sourceUrl:"https://bluegoatcyber.com/blog/m2m-communication-vulnerabilities-in-medical-devices-a-cybersecurity-concern",publishedAt:"2024-10-22T00:32:54+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes connect to a medical device, illustrating M2M vulnerabilities in healthcare technology"},{slug:"what-is-the-ivd-regulation-in-medical-device-cybersecurity",path:"blog/what-is-the-ivd-regulation-in-medical-device-cybersecurity",title:"IVD Regulation and Device Cybersecurity (2026)",description:"IVD Regulation Cybersecurity for medical device manufacturers: what the FDA expects in 2026, gaps that trigger deficiencies, and evidence to prepare.",image:"/imported-images/hero-what-is-the-ivd-regulation-in-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-the-ivd-regulation-in-medical-device-cybersecurity",publishedAt:"2024-10-22T00:12:56+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connecting medical devices, illustrating IVD regulation cybersecurity"},{slug:"implementing-ssdlc-for-enhanced-medical-device-cybersecurity",path:"blog/implementing-ssdlc-for-enhanced-medical-device-cybersecurity",title:"SSDLC for Medical Device Cybersecurity",description:"Discover how implementing a Secure Software Development Life Cycle (SSDLC) can significantly bolster cybersecurity measures for medical devices.",image:"/imported-images/hero-implementing-ssdlc-for-enhanced-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/implementing-ssdlc-for-enhanced-medical-device-cybersecurity",publishedAt:"2024-10-20T21:36:13+00:00",category:"SDLC",tags:["SDLC"],imageAlt:"Abstract network nodes and medical symbols represent secure development for medical device cybersecurity"},{slug:"corrective-and-preventive-actions-capa-in-medical-device-cybersecurity",path:"blog/corrective-and-preventive-actions-capa-in-medical-device-cybersecurity",title:"CAPA in Medical Device Cybersecurity: Regulatory Guide",description:"CAPA for medical devices explained: root cause analysis, corrective actions, QMSR corrective action alignment, and how cybersecurity findings feed CAPA under the Feb 3, 2026 guidance.",image:"/imported-images/hero-corrective-and-preventive-actions-capa-in-medical-device-cyb.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/corrective-and-preventive-actions-capa-in-medical-device-cybersecurity",publishedAt:"2024-10-20T18:47:55+00:00",category:"Quality",tags:["Quality"],imageAlt:"Abstract network lines and gears symbolize interconnected medical devices and quality management systems"},{slug:"21-cfr-part-820-and-its-role-in-medical-device-cybersecurity",path:"blog/21-cfr-part-820-and-its-role-in-medical-device-cybersecurity",title:"21 CFR Part 820: Cybersecurity in the QMSR Era",description:"21 CFR Part 820 explained: the 2026 QMSR shift to ISO 13485, what changed, and how design controls, CAPA, and Section 524B evidence connect.",image:"/imported-images/hero-21-cfr-part-820.jpg",sourceUrl:"https://bluegoatcyber.com/blog/21-cfr-part-820-and-its-role-in-medical-device-cybersecurity",publishedAt:"2024-10-20T18:37:48+00:00",category:"Quality",tags:["Quality"],imageAlt:"Abstract network nodes and gears symbolize interconnected medical device quality and cybersecurity compliance"},{slug:"good-manufacturing-practices-gmp-in-medical-devices-ensuring-cybersecurity-compliance",path:"blog/good-manufacturing-practices-gmp-in-medical-devices-ensuring-cybersecurity-compliance",title:"GMP and Medical Device Cybersecurity Compliance",description:"GMP Cybersecurity Compliance for medical device manufacturers: what the FDA expects in 2026, gaps that trigger deficiencies, and evidence to prepare.",image:"/imported-images/hero-good-manufacturing-practices-gmp-in-medical-devices-ensuring.jpg",sourceUrl:"https://bluegoatcyber.com/blog/good-manufacturing-practices-gmp-in-medical-devices-ensuring-cybersecurity-compliance",publishedAt:"2024-10-20T18:04:21+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network of interconnected medical devices and data streams symbolizing cybersecurity in manufacturing"},{slug:"iso-13485-and-its-relation-to-medical-device-cybersecurity",path:"blog/iso-13485-and-its-relation-to-medical-device-cybersecurity",title:"ISO 13485 and Medical Device Cybersecurity",description:"How ISO 13485 quality management underpins medical device cybersecurity, and what FDA reviewers expect to see linked to your QMS in a 524B submission.",image:"/imported-images/hero-iso-13485-and-its-relation-to-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iso-13485-and-its-relation-to-medical-device-cybersecurity",publishedAt:"2024-10-20T17:20:52+00:00",category:"Standards",tags:["Standards"],imageAlt:"Abstract network of interconnected medical devices and gears symbolizing ISO 13485 cybersecurity compliance"},{slug:"code-data-and-execution-integrity-security-controls-and-medical-device-cybersecurity",path:"blog/code-data-and-execution-integrity-security-controls-and-medical-device-cybersecurity",title:"Code and Data Integrity Controls for Medical Devices | Blue Goat Cyber",description:"Code and data integrity controls explained: signed firmware, secure boot, anti-rollback, and the evidence the FDA expects for each in premarket review.",image:"/imported-images/hero-code-data-and-execution-integrity-security-controls-and-medi.jpg",sourceUrl:"https://bluegoatcyber.com/blog/code-data-and-execution-integrity-security-controls-and-medical-device-cybersecurity",publishedAt:"2024-09-18T21:06:14+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connecting medical device icons, illustrating cybersecurity for healthcare technology"},{slug:"fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization",path:"blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization",title:"Medical Device Authentication and Access Control | Blue Goat",description:"Medical device authentication and access control: what the FDA's Feb 2026 guidance expects for credentials, privilege levels, biometrics, and audit logs.",image:"/imported-images/hero-fda-medical-device-cybersecurity-requirements-security-contr.jpg",sourceUrl:"https://bluegoatcyber.com/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization",publishedAt:"2024-06-25T05:08:01+00:00",category:"FDA",tags:["FDA","Identity & Access"],imageAlt:"Digital lock securing medical devices, representing FDA cybersecurity recommendations for manufacturers"},{slug:"scoping-a-medical-device-penetration-test",path:"blog/scoping-a-medical-device-penetration-test",title:"Scoping a Medical Device Penetration Test: A Practical Guide",description:"How to scope a medical device penetration test the FDA will accept: interfaces to include, what to provide the tester, and why a narrow scope costs review time.",image:"/imported-images/hero-scoping-a-medical-device-penetration-test.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/scoping-a-medical-device-penetration-test",publishedAt:"2024-05-30T13:58:35+00:00",category:"Pen Testing",tags:["Pen Testing"],imageAlt:"Cybersecurity expert examining a complex network diagram representing medical device penetration testing scope"},{slug:"medical-device-cybersecurity-interoperability-concerns",path:"blog/medical-device-cybersecurity-interoperability-concerns",title:"Medical Device Interoperability: Cybersecurity Risks Explained",description:"Medical device interoperability creates shared risk across vendors. Learn where trust breaks down, what the FDA expects in labeling, and how to document it.",image:"/imported-images/hero-medical-device-cybersecurity-interoperability-concerns.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-interoperability-concerns",publishedAt:"2024-05-30T13:44:09+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Networked medical devices connected by glowing lines, illustrating interoperability risks in healthcare technology"},{slug:"spdf-vs-tplc-in-medical-device-cybersecurity",path:"blog/spdf-vs-tplc-in-medical-device-cybersecurity",title:"Medical Device Cybersecurity SPDF vs TPLC",description:"SPDF vs TPLC in medical device cybersecurity: how the Secure Product Development Framework maps to Total Product Life Cycle expectations from the FDA.",image:"/imported-images/hero-spdf-vs-tplc-in-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/spdf-vs-tplc-in-medical-device-cybersecurity",publishedAt:"2024-05-05T16:03:05+00:00",category:"SDLC",tags:["SDLC"],imageAlt:"Abstract network diagram with interconnected nodes illustrating medical device cybersecurity frameworks"},{slug:"medical-device-cybersecurity-labeling",path:"blog/medical-device-cybersecurity-labeling",title:"FDA Medical Device Cybersecurity Labeling",description:"FDA 2026 medical device cybersecurity labeling requirements: interfaces, SBOM, secure configuration, update/patch steps - and mistakes that cause review.",image:"/imported-images/hero-medical-device-cybersecurity-labeling.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-labeling",publishedAt:"2024-04-29T14:29:37+00:00",category:"FDA",tags:["FDA"],imageAlt:"Digital medical device interface with cybersecurity lock icon, illustrating FDA labeling requirements"},{slug:"examining-medradio-vulnerabilities-in-medical-devices-cybersecurity",path:"blog/examining-medradio-vulnerabilities-in-medical-devices-cybersecurity",title:"Medical Device MedRadio Vulnerabilities",description:"Explore the potential vulnerabilities in MedRadio and delve into the crucial aspects of medical device cybersecurity in this insightful article.",image:"/imported-images/hero-examining-medradio-vulnerabilities-in-medical-devices-cybers.jpg",sourceUrl:"https://bluegoatcyber.com/blog/examining-medradio-vulnerabilities-in-medical-devices-cybersecurity",publishedAt:"2024-04-23T00:51:26+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and glowing data streams represent MedRadio vulnerabilities and medical device cybersecurity"},{slug:"zigbee-in-medical-devices-cybersecurity-a-comprehensive-guide",path:"blog/zigbee-in-medical-devices-cybersecurity-a-comprehensive-guide",title:"Zigbee in Medical Devices Cybersecurity",description:"How Zigbee is used in medical devices, the cybersecurity risks it introduces, and controls manufacturers should build in to satisfy FDA reviewer expectations.",image:"/imported-images/hero-zigbee-in-medical-devices-cybersecurity-a-comprehensive-guid.jpg",sourceUrl:"https://bluegoatcyber.com/blog/zigbee-in-medical-devices-cybersecurity-a-comprehensive-guide",publishedAt:"2024-04-23T00:43:17+00:00",category:"Primer",tags:["Primer"],imageAlt:"Networked medical devices secured by a digital shield, illustrating Zigbee cybersecurity in healthcare"},{slug:"enhancing-cybersecurity-for-ant-ant-medical-devices",path:"blog/enhancing-cybersecurity-for-ant-ant-medical-devices",title:"ANT/ANT+ Protocol Security Security in Medical Devices (2026)",description:"ANT/ANT+ Protocol Security security in medical devices: known weaknesses, FDA-aligned mitigations, and test evidence to include in 2026 submissions.",image:"/imported-images/hero-enhancing-cybersecurity-for-ant-ant-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/enhancing-cybersecurity-for-ant-ant-medical-devices",publishedAt:"2024-04-21T23:59:32+00:00",imageAlt:"Networked medical devices with a shield icon symbolizing cybersecurity protection against threats"},{slug:"the-importance-of-ble-in-medical-devices-cybersecurity",path:"blog/the-importance-of-ble-in-medical-devices-cybersecurity",title:"BLE Security in Medical Devices: What to Get Right",description:"BLE security for medical devices explained: pairing methods, attack classes, and what the February 3, 2026 FDA guidance expects documented.",image:"/imported-images/hero-the-importance-of-ble-in-medical-devices-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-importance-of-ble-in-medical-devices-cybersecurity",publishedAt:"2024-04-21T23:56:28+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract blue and white network nodes connect to a stylized medical device, illustrating BLE security"},{slug:"the-impact-of-524bb2-on-medical-device-cybersecurity",path:"blog/the-impact-of-524bb2-on-medical-device-cybersecurity",title:"Section 524B(b)(2): Medical Device Cyber Duties",description:"Section 524B(b)(2) makes cybersecurity statutory for FDA cyber devices: SPDF design controls, vulnerability management, and a working patch/update mechanism.",image:"/imported-images/hero-the-impact-of-524bb2-on-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-impact-of-524bb2-on-medical-device-cybersecurity",publishedAt:"2024-04-21T23:52:48+00:00",category:"FDA",tags:["FDA"],imageAlt:"Digital lock icon superimposed on a medical device, symbolizing cybersecurity compliance and patient safety"},{slug:"qih-medical-device-vulnerabilities-what-you-need-to-know",path:"blog/qih-medical-device-vulnerabilities-what-you-need-to-know",title:"QIH Medical Device Vulnerabilities: What to Know (2026)",description:"QIH Medical Device Vulnerabilities in medical devices: attack scenarios, patient-safety impact, and mitigations FDA reviewers expect in 2026 submissions.",image:"/imported-images/hero-qih-medical-device-vulnerabilities-what-you-need-to-know.jpg",sourceUrl:"https://bluegoatcyber.com/blog/qih-medical-device-vulnerabilities-what-you-need-to-know",publishedAt:"2024-04-21T23:43:22+00:00",category:"Primer",tags:["Primer"],imageAlt:"A blue goat head with a circuit board pattern illustrates the concept of medical device cybersecurity vulnerabilities"},{slug:"cybersecurity-attack-entry-points-for-medical-devices",path:"blog/cybersecurity-attack-entry-points-for-medical-devices",title:"Medical Device Attack Entry Points (2026 Guide)",de
209scription:"Medical Device Attack Entry Points in medical devices: attack scenarios, patient-safety impact, and mitigations FDA reviewers expect in 2026 submissions.",image:"/imported-images/hero-cybersecurity-attack-entry-points-for-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-attack-entry-points-for-medical-devices",publishedAt:"2024-04-07T18:36:22+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital pathways leading to a medical device, illustrating cybersecurity entry points"},{slug:"closed-box-testing-in-medical-device-cybersecurity",path:"blog/closed-box-testing-in-medical-device-cybersecurity",title:"Medical Device Closed Box Testing",description:"Evaluate medical device security with closed box testing. Simulate real-world attack scenarios to identify vulnerabilities and bolster device resilience.",image:"/imported-images/hero-closed-box-testing-in-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/closed-box-testing-in-medical-device-cybersecurity",publishedAt:"2024-04-07T18:24:13+00:00",category:"Testing",tags:["Testing"],imageAlt:"Abstract network diagram with interconnected nodes and a padlock icon, representing secure medical device testing"},{slug:"exploring-system-on-a-chip-soc-vulnerabilities",path:"blog/exploring-system-on-a-chip-soc-vulnerabilities",title:"SoC Security Medical Devices: Reduce Attack Surface | Blue Goat Cyber",description:"SoC security medical devices guidance: secure boot, debug interfaces, SBOM coverage, and FDA documentation for silicon-level cybersecurity risk.",image:"/imported-images/hero-exploring-system-on-a-chip-soc-vulnerabilities.jpg",sourceUrl:"https://bluegoatcyber.com/blog/exploring-system-on-a-chip-soc-vulnerabilities",publishedAt:"2024-04-07T17:22:16+00:00",category:"Primer",tags:["Primer"],imageAlt:"Networked medical devices with glowing circuit board patterns illustrate the threat of SoC vulnerabilities"},{slug:"the-role-of-mds2-in-medical-device-cybersecurity",path:"blog/the-role-of-mds2-in-medical-device-cybersecurity",title:"MDS2 Form: Hospital Guide to Disclosures | Blue Goat Cyber",description:"MDS2 form explained: what HIMSS/NEMA HN 1-2019 requires, who completes it, how hospitals use it, common mistakes, and how it relates to SBOM and FDA rules.",image:"/imported-images/hero-the-role-of-mds-in-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog²-in-medical-device-cybersecurity",publishedAt:"2024-04-07T00:13:45+00:00",category:"Standards",tags:["Standards"],imageAlt:"Abstract digital network connections overlaying a stylized medical device, representing medical device cybersecurity standards"},{slug:"ipc-vulnerabilities-medical-devices",path:"blog/ipc-vulnerabilities-medical-devices",title:"IPC Vulnerabilities in Medical Devices (2026)",description:"IPC (Inter-Process Communication) Vulnerabilities in medical devices: attack scenarios, patient-safety impact, and mitigations FDA reviewers expect in 2026 submissions.",image:"/imported-images/hero-ipc-vulnerabilities-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/ipc-vulnerabilities-medical-devices",publishedAt:"2024-03-31T16:28:32+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Cybersecurity concept of a goat with a blue glow, representing a threat to interconnected medical devices"},{slug:"medical-device-hazard-analysis-and-critical-control-points",path:"blog/medical-device-hazard-analysis-and-critical-control-points",title:"Medical Device Hazard Analysis",description:"Why hazard analysis and critical control points matter for medical devices, and how they keep safety and effectiveness defensible through FDA review.",image:"/imported-images/hero-medical-device-hazard-analysis-and-critical-control-points.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-hazard-analysis-and-critical-control-points",publishedAt:"2024-03-31T16:22:11+00:00",category:"Risk",tags:["Risk"],imageAlt:"Abstract network nodes and gears represent the interconnectedness and complexity of medical device risk analysis"},{slug:"implantable-device-cybersecurity-concerns",path:"blog/implantable-device-cybersecurity-concerns",title:"Implantable Device Cybersecurity: Risks, Controls, Evidence",description:"Implantable device cybersecurity has constraints no other device shares: no patch window, limited power, and harm measured in physiology. Here is what to do.",image:"/imported-images/hero-implantable-device-cybersecurity-concerns.jpg",sourceUrl:"https://bluegoatcyber.com/blog/implantable-device-cybersecurity-concerns",publishedAt:"2024-03-31T16:16:13+00:00",category:"IoT",tags:["IoT"],imageAlt:"Abstract digital network connecting to a stylized medical implant, illustrating implantable device cybersecurity"},{slug:"top-ble-cybersecurity-vulnerabilities",path:"blog/top-ble-cybersecurity-vulnerabilities",t
209itle:"BLE Vulnerabilities in Medical Devices",description:"The Bluetooth Low Energy (BLE) vulnerabilities that matter most for FDA-regulated medical devices, and how to evidence them in a §524B premarket.",image:"/post-heroes/top-ble-cybersecurity-vulnerabilities-v2.jpg",sourceUrl:"https://bluegoatcyber.com/blog/top-ble-cybersecurity-vulnerabilities",publishedAt:"2024-03-31T15:09:37+00:00",category:"FDA",tags:["FDA","510(k)"],imageAlt:"Abstract network nodes connect to a central medical device, illustrating BLE vulnerabilities in healthcare technology"},{slug:"the-importance-of-implementing-a-medical-device-qms",path:"blog/the-importance-of-implementing-a-medical-device-qms",title:"The Importance of a Medical Device QMS",description:"Learn why implementing a robust Medical Device Quality Management System (QMS) is crucial for ensuring product safety, regulatory compliance, and overall.",image:"/imported-images/hero-the-importance-of-implementing-a-medical-device-qms.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-importance-of-implementing-a-medical-device-qms",publishedAt:"2024-03-30T16:14:16+00:00",category:"Quality",tags:["Quality"],imageAlt:"Abstract network lines connect medical device icons, symbolizing a secure quality management system"},{slug:"protecting-surgical-robots-the-importance-of-cybersecurity",path:"blog/protecting-surgical-robots-the-importance-of-cybersecurity",title:"Surgical Robot Cybersecurity: Protecting",description:"Surgical robot cybersecurity ensures the safety and integrity of these advanced medical devices against cyber threats. Learn how to protect robotic surgery.",image:"/imported-images/hero-protecting-surgical-robots-the-importance-of-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/protecting-surgical-robots-the-importance-of-cybersecurity",publishedAt:"2024-03-30T15:58:27+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connections overlaying a surgical robot arm, symbolizing medical device cybersecurity"},{slug:"top-10-embedded-operating-systems-for-medical-devices",path:"blog/top-10-embedded-operating-systems-for-medical-devices",title:"Top 10 Embedded OS for Medical Devices (2026)",description:"Compare the top 10 embedded operating systems used in FDA-cleared medical devices in 2026: Linux, VxWorks, QNX, INTEGRITY, Zephyr, FreeRTOS, ThreadX & more. LTS, secure boot, SBOM, IEC 62304 fit.",image:"/imported-images/hero-top-10-embedded-operating-systems-for-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/top-10-embedded-operating-systems-for-medical-devices",publishedAt:"2024-03-30T01:40:06+00:00",category:"Primer",tags:["Primer"],imageAlt:"Secure embedded operating systems for medical devices, highlighting cybersecurity and support"},{slug:"cybersecurity-risk-with-ivd-medical-devices",path:"blog/cybersecurity-risk-with-ivd-medical-devices",title:"IVD Cybersecurity: Result Integrity Risk and FDA Evidence",description:"How IVD cybersecurity differs from therapeutic devices: LIS/HL7 interfaces, analyzer OS risk, service access, QC data integrity, and submission evidence.",image:"/imported-images/hero-cybersecurity-risk-with-ivd-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cybersecurity-risk-with-ivd-medical-devices",publishedAt:"2024-03-30T00:39:14+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Abstract medical network connecting IVD devices, symbolizing cybersecurity risks and solutions"},{slug:"the-fhir-medical-device-protocol",path:"blog/the-fhir-medical-device-protocol",title:"FHIR Protocol Security in Medical Devices (2026)",description:"FHIR Protocol security in medical devices: known weaknesses, FDA-aligned mitigations, and test evidence to include in 2026 submissions.",image:"/imported-images/hero-the-fhir-medical-device-protocol.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-fhir-medical-device-protocol",publishedAt:"2024-03-24T22:14:42+00:00",category:"Networking",tags:["Networking"],imageAlt:"Abstract network nodes and glowing lines connecting them, representing secure medical device data flow"},{slug:"hacking-dicom-medical-images",path:"blog/hacking-dicom-medical-images",title:"Hacking DICOM: Medical Imaging Security Risks",description:"Digital Imaging and Communications in Medicine, or DICOM, is the industry standard for medical imaging formats. Aligned with the FDA's Feb 3, 2026 premarket.",image:"/imported-images/hero-hacking-dicom-medical-images.jpg",sourceUrl:"https://bluegoatcyber.com/blog/hacking-dicom-medical-images",publishedAt:"2024-03-24T22:02:01+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital medical scan data with cybersecurity lock icon, illustrating DICOM security risks"},{slug:"vulnerabilities-with-dicom-in-medtech",path:"blog/vulnerabilities-with-dicom-in-medtech",title:"DICOM Protocol Vulnerabilities in Medical Devices",description:"DICOM Protocol Vulnerabilities in medical devices: attack scenarios, patient-safety impact, and mitigations FDA reviewers expect in 2026 submissions.",image:"/imported-images/hero-vulnerabilities-with-dicom-in-medtech.jpg",sourceUrl:"https://bluegoatcyber.com/blog/vulnerabilities-with-dicom-in-medtech",publishedAt:"2024-03-23T21:41:34+00:00",category:"Primer",tags:["Primer"],imageAlt:"Networked medical imaging devices with glowing data streams representing cybersecurity vulnerabilities"},{slug:"comparing-dread-stride-and-pasta-threat-models-which-is-most-effective",path:"blog/comparing-dread-stride-and-pasta-threat-models-which-is-most-effective",title:"DREAD vs STRIDE vs PASTA Threat Modeling",description:"Compare STRIDE, DREAD, and PASTA threat modeling for medical devices. Learn which method is most effective and FDA-aligned for securing MedTech products.",image:"/imported-images/hero-comparing-dread-stride-and-pasta-threat-models-which-is-most.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/comparing-dread-stride-and-pasta-threat-models-which-is-most-effective",publishedAt:"2024-03-22T18:57:25+00:00",category:"Threat Modeling",tags:["Threat Modeling"],imageAlt:"Abstract network diagram with interconnected nodes representing threat modeling concepts and their relationships"},{slug:"pacs-medical-device-vulnerabilities",path:"blog/pacs-medical-device-vulnerabilities",title:"PACS Vulnerabilities in Medical Devices (2026)",description:"PACS Vulnerabilities in medical devices: attack scenarios, patient-safety impact, and mitigations FDA reviewers expect in 2026 submissions.",image:"/imported-images/hero-pacs-medical-device-vulnerabilities.jpg",sourceUrl:"https://bluegoatcyber.com/blog/pacs-medical-device-vulnerabilities",publishedAt:"2024-03-21T02:40:18+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital network of medical imaging devices with a prominent blue goat icon symbolizing cybersecurity threats"},{slug:"medical-device-cybersecurity-the-real-threat-isnt-genius-hackers-its-neglect",path:"blog/medical-device-cybersecurity-the-real-threat-isnt-genius-hackers-its-neglect",title:"Cybersecurity Neglect in MedTech: The Real Threat",description:"Cybersecurity Neglect in MedTech: a practical 2026 playbook for MedTech leaders, what to prioritize, how the FDA expects it framed, and where teams stumble.",image:"/imported-images/hero-medical-device-cybersecurity-the-real-threat-isnt-genius-hac.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-the-real-threat-isnt-genius-hackers-its-neglect",publishedAt:"2024-03-21T02:01:32+00:00",category:"Primer",tags:["Primer"],imageAlt:"A digital goat with glowing blue eyes stands guard over interconnected medical devices, symbolizing cybersecurity"},{slug:"lorawan-vulnerabilities-on-medical-device-cybersecurity",path:"blog/lorawan-vulnerabilities-on-medical-device-cybersecurity",title:"LoRaWAN Vulnerabilities in Medical Devices",description:"Discover the potential risks and implications of LoRaWan vulnerabilities on the cybersecurity of medical devices. Aligned with the FDA's Feb 3, 2026.",image:"/imported-images/hero-lorawan-vulnerabilities-on-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/lorawan-vulnerabilities-on-medical-device-cybersecurity",publishedAt:"2024-03-10T02:31:16+00:00",category:"Primer",tags:["Primer"],imageAlt:"Networked medical devices connected by a glowing blue goat symbol, illustrating LoRaWan cybersecurity risks"},{slug:"rfid-medical-devices-cybersecurity",path:"blog/rfid-medical-devices-cybersecurity",title:"RFID and Medical Device Cybersecurity",description:"RFID in medical devices enhances cybersecurity through authentication, real-time monitoring, and inventory management. Learn how this tech secures healthcare.",image:"/imported-images/hero-rfid-medical-devices-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/rfid-medical-devices-cybersecurity",publishedAt:"2024-03-10T02:23:55+00:00",category:"Primer",tags:["Primer"],imageAlt:"Secure RFID tag on a medical device, symbolizing protection against cyber threats"},{slug:"cia-triad-vs-nsa-controls-in-medical-device-cybersecurity",path:"blog/cia-triad-vs-nsa-controls-in-medical-device-cybersecurity",title:"CIA Triad vs NSA Controls in Medical Devices",description:"Explore how the CIA Triad and NSA cybersecurity controls strengthen medical device security and support FDA compliance from design to postmarket.",image:"/imported-images/hero-cia-triad-vs-nsa-controls-in-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/cia-triad-vs-nsa-controls-in-medical-device-cybersecurity",publishedAt:"2024-03-03T02:20:22+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and a lock icon represent medical device cybersecurity and data protection concepts"},{slug:"identifying-vulnerabilities-with-vxworks",path:"blog/identifying-vulnerabilities-with-vxworks",title:"VxWorks Vulnerabilities in Medical Devices",description:"How MedTech teams should identify, triage, and document VxWorks RTOS vulnerabilities (URGENT/11 and beyond) for FDA Section 524B premarket and postmarket.",image:"/imported-images/hero-identifying-vulnerabilities-with-vxworks.jpg",sourceUrl:"https://bluegoatcyber.com/blog/identifying-vulnerabilities-with-vxworks",publishedAt:"2024-03-03T01:09:36+00:00",category:"FDA",tags:["FDA","SBOM"],imageAlt:"Abstract network of interconnected medical devices with a highlighted vulnerability, illustrating VxWorks risks"},{slug:"the-importance-of-medical-device-vulnerability-testing",path:"blog/the-importance-of-medical-device-vulnerability-testing",title:"Medical Device Vulnerability Testing",description:"Medical device vulnerability testing identifies security weaknesses in devices. Protect patients, data, and operations. Learn more from Blue Goat Cyber.",image:"/imported-images/hero-the-importance-of-medical-device-vulnerability-testing.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/the-importance-of-medical-device-vulnerability-testing",publishedAt:"2024-03-02T02:30:45+00:00",category:"Testing",tags:["Testing"],imageAlt:"Cybersecurity concept with a stylized goat head and digital network lines, illustrating medical device vulnerability testing"},{slug:"microkernels-medical-device-cybersecurity",path:"blog/microkernels-medical-device-cybersecurity",title:"Microkernel Architectures for Medical Devices",description:"Microkernels can improve isolation and reduce trusted code in medical devices. Learn real tradeoffs, design patterns, and FDA-friendly evidence ideas.",image:"/imported-images/hero-microkernels-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/microkernels-medical-device-cybersecurity",publishedAt:"2024-03-01T03:28:01+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and glowing circuit board elements symbolizing secure medical device architecture"},{slug:"the-impact-of-cybersecurity-abuse-and-misuse-in-medical-devices",path:"blog/the-impact-of-cybersecurity-abuse-and-misuse-in-medical-devices",title:"Medical Device Cybersecurity Abuse &",description:"Medical device cybersecurity abuse and misuse leads to patient harm, operational disruption, and financial consequences. Learn how to mitigate risks.",image:"/imported-images/hero-the-impact-of-cybersecurity-abuse-and-misuse-in-medical-devi.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-impact-of-cybersecurity-abuse-and-misuse-in-medical-devices",publishedAt:"2024-03-01T02:44:42+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network lines and medical symbols connect to represent the interconnectedness of medical device cybersecurity"},{slug:"iot-vs-iomt-understanding-the-differences-in-the-internet-of-things-and-internet-of-medical-things",path:"blog/iot-vs-iomt-understanding-the-differences-in-the-internet-of-things-and-internet-of-medical-things",title:"Differences in the IoT and the IoMT",description:"IoT vs IoMT explained: how the Internet of Medical Things differs from consumer IoT in regulation, patient safety impact, and FDA cybersecurity expectations.",image:"/imported-images/hero-iot-vs-iomt-understanding-the-differences-in-the-internet-of.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iot-vs-iomt-understanding-the-differences-in-the-internet-of-things-and-internet-of-medical-things",publishedAt:"2024-03-01T02:38:22+00:00",category:"IoT",tags:["IoT"],imageAlt:"Networked devices, some medical, connected to a central hub, illustrating IoT and IoMT differences"},{slug:"the-dangers-of-pacemaker-hacks-what-you-need-to-know",path:"blog/the-dangers-of-pacemaker-hacks-what-you-need-to-know",title:"The Dangers of Pacemaker Hacks",description:"Pacemaker hacks pose serious risks, potentially altering heart rhythms or causing malfunction. Learn about pacemaker security and protective measures.",image:"/imported-images/hero-the-dangers-of-pacemaker-hacks-what-you-need-to-know.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-dangers-of-pacemaker-hacks-what-you-need-to-know",publishedAt:"2024-02-29T02:18:02+00:00",category:"IoT",tags:["IoT"],imageAlt:"Abstract medical circuitry and a stylized heart symbol represent the risks of pacemaker hacking"},{slug:"bluetooth-in-medical-devices-understanding-the-risks-and-protecting-patient-safety",path:"blog/bluetooth-in-medical-devices-understanding-the-risks-and-protecting-patient-safety",title:"Bluetooth in Medical Devices: Security Risks and Controls",description:"Bluetooth in medical devices brings pairing, encryption and spoofing risks. Learn BLE pairing modes, known attack classes, and what the FDA expects you to test.",image:"/imported-images/hero-bluetooth-in-medical-devices-understanding-the-risks-and-pro.jpg",sourceUrl:"https://bluegoatcyber.com/blog/bluetooth-in-medical-devices-understanding-the-risks-and-protecting-patient-safety",publishedAt:"2024-02-28T01:42:30+00:00",category:"Risk",tags:["Risk","Networking"],imageAlt:"Abstract blue and white network graphic illustrating secure connections and potential vulnerabilities in medical device communication"},{slug:"what-is-medical-device-and-health-it-joint-security-plan-jsp",path:"blog/what-is-medical-device-and-health-it-joint-security-plan-jsp",title:"Joint Security Plan (JSP): What MedTech Teams Need to Know (2026)",description:"Joint Security Plan (JSP) explained for medical device manufacturers, definition, FDA context, and what teams must document for 2026 submissions.",image:"/imported-images/hero-what-is-medical-device-and-health-it-joint-security-plan-jsp.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-medical-device-and-health-it-joint-security-plan-jsp",publishedAt:"2024-02-28T01:21:55+00:00",category:"Primer",tags:["Primer"],imageAlt:"Cybersecurity shield protecting medical devices and health IT systems, illustrating the Joint Security Plan"},{slug:"medical-device-key-exchange-cybersecurity",path:"blog/medical-device-key-exchange-cybersecurity",title:"Key Exchange in Medical Device Cybersecurity",description:"Learn how secure key exchange protects connected medical devices. Covers TLS, PKI, MitM/replay risks, key provisioning, rotation, and FDA-ready evidence.",image:"/imported-images/hero-medical-device-key-exchange-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-key-exchange-cybersecurity",publishedAt:"2024-02-27T02:33:05+00:00",category:"Networking",tags:["Networking","Cryptography"],imageAlt:"Abstract network nodes and glowing keys represent secure medical device data exchange and encryption"},{slug:"understanding-medical-device-attack-surface-analysis",path:"blog/understanding-medical-device-attack-surface-analysis",title:"Medical Device Attack Surface Analysis: A Practitioner Method",description:"A working method for enumerating a medical device attack surface by interface class, mapping it to threat models and test scope, and the interfaces teams forget.",image:"/imported-images/hero-understanding-medical-device-attack-surface-analysis.jpg",sourceUrl:"https://bluegoatcyber.com/blog/understanding-medical-device-attack-surface-analysis",publishedAt:"2024-02-27T02:29:10+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network diagram with interconnected nodes representing medical devices and potential cyber threats"},{slug:"who-is-center-for-biologics-evaluation-and-research-cber",path:"blog/who-is-center-for-biologics-evaluation-and-research-cber",title:"CBER: What MedTech Teams Need to Know About FDA Biologics (2026)",description:"CBER (Center for Biologics Evaluation and Research) explained for medical device manufacturers, definition, FDA context, and what teams must document for 2026 submissions.",image:"/imported-images/hero-who-is-center-for-biologics-evaluation-and-research-cber.jpg",sourceUrl:"https://bluegoatcyber.com/blog/who-is-center-for-biologics-evaluation-and-research-cber",publishedAt:"2024-02-25T23:01:41+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract blue and white graphic with interlocking shapes, representing data security and regulatory oversight in biologics"},{slug:"what-is-the-center-for-devices-and-radiological-health-cdrh",path:"blog/what-is-the-center-for-devices-and-radiological-health-cdrh",title:"What is CDRH? FDA's Device Center Explained",description:"The essential role of the Center for Devices and Radiological Health (CDRH) in ensuring the safety, effectiveness, and cybersecurity of medical devices.",image:"/imported-images/hero-what-is-the-center-for-devices-and-radiological-health-cdrh.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-the-center-for-devices-and-radiological-health-cdrh",publishedAt:"2024-02-25T18:40:43+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract blue and white network graphic symbolizing medical device data security and regulatory oversight"},{slug:"the-role-of-ul-2900-in-medical-device-security",path:"blog/the-role-of-ul-2900-in-medical-device-security",title:"UL 2900 and Medical Device Cybersecurity",description:"UL 2900 is a critical cybersecurity standard for medical devices, recognized by the FDA. Learn how it safeguards patient data and ensures device security.",image:"/imported-images/hero-the-role-of-ul-2900-in-medical-device-security.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-role-of-ul-2900-in-medical-device-security",publishedAt:"2024-02-25T16:13:26+00:00",category:"Primer",tags:["Primer"],imageAlt:"Cybersecurity shield protecting a medical device, illustrating UL 2900 compliance for medical device security"},{slug:"sweyntooth-exploring-the-bluetooth-vulnerability",path:"blog/sweyntooth-exploring-the-bluetooth-vulnerability",title:"SweynTooth BLE Vulnerability in Medical Devices",description:"SweynTooth BLE Vulnerability in medical devices: attack scenarios, patient-safety impact, and mitigations FDA reviewers expect in 2026 submissions.",image:"/imported-images/hero-sweyntooth-exploring-the-bluetooth-vulnerability.jpg",sourceUrl:"https://bluegoatcyber.com/blog/sweyntooth-exploring-the-bluetooth-vulnerability",publishedAt:"2024-02-25T15:31:33+00:00",category:"FDA",tags:["FDA","Premarket","Identity & Access"],imageAlt:"Abstract network nodes connect to a stylized medical device, illustrating cybersecurity risks"},{slug:"de-novo-requests-for-medical-devices-explained",path:"blog/de-novo-requests-for-medical-devices-explained",title:"What are Medical Device De Novo Requests?",description:"De Novo Requests establish classifications for novel medical devices without predicates. Blue Goat Cyber helps manufacturers navigate this FDA pathway.",image:"/imported-images/hero-de-novo-requests-for-medical-devices-explained.jpg",sourceUrl:"https://bluegoatcyber.com/blog/de-novo-requests-for-medical-devices-explained",publishedAt:"2024-02-25T15:27:53+00:00",category:"FDA",tags:["FDA","Premarket"],imageAlt:"Abstract network of glowing lines connecting medical device icons, illustrating regulatory pathways"},{slug:"security-architecture-diagrams-medical-device-cybersecurity",path:"blog/security-architecture-diagrams-medical-device-cybersecurity",title:"Security Architecture Views: The FDA'
209s Four Required Diagrams",description:"The FDA expects four security architecture views in a premarket submission. Learn what each one shows, how they differ, and the mistakes that draw questions.",image:"/imported-images/hero-security-architecture-diagrams-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/security-architecture-diagrams-medical-device-cybersecurity",publishedAt:"2024-02-25T15:18:45+00:00",category:"FDA",tags:["FDA","Architecture Views","Threat Modeling"],imageAlt:"Abstract network diagram illustrating FDA's four security architecture views for medical device cybersecurity"},{slug:"qih-medical-devices-explained",path:"blog/qih-medical-devices-explained",title:"QIH Medical Devices Explained",description:"Discover the innovative world of QIH devices in medical technology. Learn about their unique features, applications, and the potential impact on patient.",image:"/imported-images/hero-qih-medical-devices-explained.jpg",sourceUrl:"https://bluegoatcyber.com/blog/qih-medical-devices-explained",publishedAt:"2024-02-25T14:48:07+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connecting medical devices, symbolizing cybersecurity in healthcare technology"},{slug:"the-relationship-of-iec-81001-5-1-2021-with-medical-device-security",path:"blog/the-relationship-of-iec-81001-5-1-2021-with-medical-device-security",title:"IEC 81001-5-1 & Medical Device Security",description:"IEC 81001-5-1 defines requirements for integrating security into medical device software development. Learn how this standard ensures secure products.",image:"/imported-images/hero-the-relationship-of-iec-81001-5-1-2021-with-medical-device-s.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-relationship-of-iec-81001-5-1-2021-with-medical-device-security",publishedAt:"2024-02-25T14:33:20+00:00",category:"Standards",tags:["Standards"],imageAlt:"Abstract network nodes connect to a central medical device, illustrating cybersecurity standards"},{slug:"understanding-binary-software-composition-analysis-with-medical-device-testing",path:"blog/understanding-binary-software-composition-analysis-with-medical-device-testing",title:"Med Device Software Composition Analysis",description:"Delve into the world of binary software composition analysis and its crucial role in medical device testing. Aligned with the FDA's Feb 3, 2026 premarket.",image:"/imported-images/hero-understanding-binary-software-composition-analysis-with-medi.jpg",sourceUrl:"https://bluegoatcyber.com/blog/understanding-binary-software-composition-analysis-with-medical-device-testing",publishedAt:"2024-02-25T01:32:37+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and code snippets represent the complexity of medical device software composition analysis"},{slug:"what-are-irt-medical-devices",path:"blog/what-are-irt-medical-devices",title:"What Are IRT Medical Devices? Explained",description:"IRT medical devices use infrared thermography to map body temperature. Learn how these devices work, their benefits, risks, and cybersecurity needs.",image:"/imported-images/hero-what-are-irt-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-are-irt-medical-devices",publishedAt:"2024-02-25T01:15:26+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connecting medical devices, symbolizing interconnected healthcare technology and cybersecurity"},{slug:"what-is-a-ce-marking-in-med-devices",path:"blog/what-is-a-ce-marking-in-med-devices",title:"CE Marking Medical Devices: What EU MDR Actually Requires",description:"CE marking medical devices under EU MDR 2017/745 and IVDR 2017/746: classification, conformity routes, technical documentation, and cybersecurity evidence.",image:"/imported-images/hero-what-is-a-ce-marking-in-med-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-a-ce-marking-in-med-devices",publishedAt:"2024-02-25T01:00:00+00:00",category:"Primer",tags:["Primer"],imageAlt:"Blue circular CE mark with a white background, representing medical device regulatory compliance"},{slug:"what-is-dicom-in-medical-devices",path:"blog/what-is-dicom-in-medical-devices",title:"What Is DICOM in Medical Devices?",description:"DICOM is the medical imaging standard for medical devices. Learn how it impacts interoperability, data integrity, and cybersecurity in healthcare.",image:"/imported-images/hero-what-is-dicom-in-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-dicom-in-medical-devices",publishedAt:"2024-02-24T23:33:11+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connecting medical imaging devices and data for secure healthcare information exchange"},{slug:"what-is-pacs-in-medical-devices",path:"blog/what-is-pacs-in-medical-devices",title:"PACS in Medical Devices: What It Is and How to Secure It",description:"PACS is the imaging archive that stores and moves DICOM studies. Learn how PACS is regulated, where it is exposed, and what the FDA expects you to document.",image:"/imported-images/hero-what-is-pacs-in-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-pacs-in-medical-devices",publishedAt:"2024-02-24T19:10:27+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connections representing medical imaging data flow and cybersecurity protection"},{slug:"write-blocker-medical-device-cybersecurity",path:"blog/write-blocker-medical-device-cybersecurity",title:"What Is a Write Blocker? Hardware vs Software",description:"What a write blocker is, how hardware and software blockers differ, and when MedTech incident response teams need one for defensible device forensics.",image:"/imported-images/hero-write-blocker-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/write-blocker-medical-device-cybersecurity",publishedAt:"2024-02-24T19:06:01+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital forensics write blocker device on a desk, symbolizing secure evidence collection for medical device cybersecurity"},{slug:"what-is-software-as-a-medical-device",path:"blog/what-is-software-as-a-medical-device",title:"Software as a Medical Device: Definition, Risk, and Rules",description:"Softw
209are as a medical device explained: the IMDRF definition, risk categories, FDA pathways, IEC 62304, and cybersecurity obligations under Section 524B.",image:"/imported-images/hero-what-is-software-as-a-medical-device.jpg",sourceUrl:"https://bluegoatcyber.com/blog/what-is-software-as-a-medical-device",publishedAt:"2024-02-24T01:31:32+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network connecting medical devices and data, illustrating software as a medical device concepts"},{slug:"hardware-hacking-tools-medical-device-cybersecurity",path:"blog/hardware-hacking-tools-medical-device-cybersecurity",title:"Hardware Hacking Tools for Medical Device Security Testing",description:"The hardware hacking tools used in authorized medical device testing: logic analyzers, SDRs, JTAG adapters, flash readers, and what each one proves.",image:"/imported-images/hero-hardware-hacking-tools-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/hardware-hacking-tools-medical-device-cybersecurity",publishedAt:"2024-02-23T03:42:53+00:00",category:"Testing",tags:["Testing"],imageAlt:"Cybersecurity tools for medical device hardware testing, including RFID and SDR, illustrate security assessment"},{slug:"understanding-relevant-threats-for-medical-devices",path:"blog/understanding-relevant-threats-for-medical-devices",title:"Deciding Which Threats Are Relevant to Your Medical Device",description:"How to decide whether a threat is relevant to your specific device using intended use, STRIDE per element, and documented reasoning a reviewer can check.",image:"/imported-images/hero-understanding-relevant-threats-for-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/understanding-relevant-threats-for-medical-devices",publishedAt:"2024-02-23T03:09:06+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital network nodes and abstract threat icons represent vulnerabilities in medical device cybersecurity"},{slug:"wpa2-4-way-handshake-vulnerabilities-what-medical-device-teams-need-to-know-about-wi-fi-risk",path:"blog/wpa2-4-way-handshake-vulnerabilities-what-medical-device-teams-need-to-know-about-wi-fi-risk",title:"Medical Device Wi-Fi Security Guide | Blue Goat Cyber",description:"Medical device Wi-Fi security guide covering WPA2/WPA3, the 4-way handshake, 802.1X vs PSK, certificate rotation, and FDA documentation expectations.",image:"/imported-images/hero-wpa2-4-way-handshake-vulnerabilities-what-medical-device-tea.jpg",sourceUrl:"https://bluegoatcyber.com/blog/wpa2-4-way-handshake-vulnerabilities-what-medical-device-teams-need-to-know-about-wi-fi-risk",publishedAt:"2024-02-22T01:38:26+00:00",category:"Risk",tags:["Risk","Networking"],imageAlt:"Network handshake graphic with a shield symbolizing cybersecurity for medical devices"},{slug:"mdsap-for-medical-devices-simplifying-international-compliance",path:"blog/mdsap-for-medical-devices-simplifying-international-compliance",title:"MDSAP for Medical Device Compliance",description:"How MDSAP works in 2026: the five participating regulators, the audit model, jurisdiction-specific requirements, and where cybersecurity evidence gets audited.",image:"/imported-images/hero-mdsap-for-medical-devices-simplifying-international-complian.jpg",sourceUrl:"https://bluegoatcyber.com/blog/mdsap-for-medical-devices-simplifying-international-compliance",publishedAt:"2024-02-16T01:26:25+00:00",category:"International",tags:["MDSAP","International","QMS","Postmarket"],imageAlt:"Global medical device compliance audit process visualized with interconnected nodes and circuits"},{slug:"imdrf-for-medical-devices-harmonizing-global-regulations",path:"blog/imdrf-for-medical-devices-harmonizing-global-regulations",title:"IMDRF Cybersecurity Guidance Explained",description:"How IMDRF N60, N70, and N73 shape medical device cybersecurity expectations at the FDA, TGA, and Health Canada, and how to build one package that travels.",image:"/imported-images/hero-imdrf-for-medical-devices-harmonizing-global-regulations.jpg",sourceUrl:"https://bluegoatcyber.com/blog/imdrf-for-medical-devices-harmonizing-global-regulations",publishedAt:"2024-02-16T01:22:40+00:00",category:"International",tags:["IMDRF","International","SBOM","Postmarket"],imageAlt:"Global regulatory harmonization for medical devices represented by interconnected gears and a world map"},{slug:"vm-escape-medical-device-cybersecurity",path:"blog/vm-escape-medical-device-cybersecurity",title:"VM Escape Attacks: How They Work",description:"VM escape lets attackers break out of a guest VM and compromise the hypervisor. Real-world examples, attack vectors, and mitigations for medical devices.",image:"/imported-images/hero-vm-escape-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/vm-escape-medical-device-cybersecurity",publishedAt:"2024-02-15T23:16:4
2090+00:00",category:"Risk",tags:["Risk"],imageAlt:"Digital network nodes with a broken barrier, symbolizing VM escape and MedTech cybersecurity risks"},{slug:"post-exploitation-frameworks-medical-device-cybersecurity",path:"blog/post-exploitation-frameworks-medical-device-cybersecurity",title:"Medical Device Penetration Testing Post Exploitation | Blue Goat Cyber",description:"Medical device penetration testing post exploitation covers pivoting, persistence, exfiltration paths, safety controls, and report evidence reviewers expect.",image:"/imported-images/hero-post-exploitation-frameworks-medical-device-cybersecurity.jpg",sourceUrl:"https://bluegoatcyber.com/blog/post-exploitation-frameworks-medical-device-cybersecurity",publishedAt:"2024-02-15T20:18:37+00:00",category:"Pen Testing",tags:["Pen Testing"],imageAlt:"Abstract network nodes and glowing data streams symbolize the interconnectedness and vulnerability of medical devices"},{slug:"windows-laps-for-medical-devices-manage-local-admin-passwords-safely-not-gpp",path:"blog/windows-laps-for-medical-devices-manage-local-admin-passwords-safely-not-gpp",title:"Windows LAPS for Medical Devices",description:"Manage local admin passwords on Windows-based medical devices safely. Why GPP is risky, and how Windows LAPS supports rotation, control, and audits.",image:"/imported-images/hero-windows-laps-for-medical-devices-manage-local-admin-password.jpg",sourceUrl:"https://bluegoatcyber.com/blog/windows-laps-for-medical-devices-manage-local-admin-passwords-safely-not-gpp",publishedAt:"2024-02-15T02:13:13+00:00",category:"Identity & Access",tags:["Identity & Access"],imageAlt:"Cybersecurity concept showing a digital lock on a Windows logo, illustrating secure password management for medical devices"},{slug:"recalled-medical-devices-cybersecurity-failures",path:"blog/recalled-medical-devices-cybersecurity-failures",title:"Recalled Medical Devices: Cyber Failures",description:"Discover how cybersecurity failures in medical devices have led to recalls and potential risks for patients. Aligned with the FDA's Feb 3, 2026 premarket.",image:"/imported-images/hero-recalled-medical-devices-cybersecurity-failures.jpg",sourceUrl:"https://bluegoatcyber.com/blog/recalled-medical-devices-cybersecurity-failures",publishedAt:"2024-02-14T23:24:41+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract digital network graphic overlaid on a medical device, symbolizing cybersecurity risks and recalls"},{slug:"understanding-and-mitigating-the-risks-of-interoperable-medical-devices",path:"blog/understanding-and-mitigating-the-risks-of-interoperable-medical-devices",title:"Interoperable Medical Device Risk",description:"Discover how to navigate the complexities of interoperable medical devices and effectively manage associated risks. Aligned with the FDA's Feb 3, 2026.",image:"/imported-images/hero-understanding-and-mitigating-the-risks-of-interoperable-medi.jpg",sourceUrl:"https://bluegoatcyber.com/blog/understanding-and-mitigating-the-risks-of-interoperable-medical-devices",publishedAt:"2024-02-11T14:36:29+00:00",category:"Risk",tags:["Risk"],imageAlt:"Abstract network nodes connect to a central, glowing medical device, symbolizing interoperable medical device risk management"},{slug:"emerging-technologies-and-their-impact-on-medical-device-cybersecurity",path:"blog/emerging-technologies-and-their-impact-on-medical-device-cybersecurity",title:"Emerging Tech and Cybersecurity Impact",description:"Emerging technologies significantly expand the attack surface for medical devices. Learn how digital health, AI, ML, and IoT introduce vulnerabilities.",image:"/imported-images/hero-emerging-technologies-and-their-impact-on-medical-device-cyb.jpg",sourceUrl:"https://bluegoatcyber.com/blog/emerging-technologies-and-their-impact-on-medical-device-cybersecurity",publishedAt:"2024-02-11T14:34:40+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes and medical symbols illustrate emerging technology's impact on medical device cybersecurity"},{slug:"medical-device-cybersecurity-best-practices",path:"blog/medical-device-cybersecurity-best-practices",title:"Medical Device Cybersecurity Best Practices: 2026 Build Plan",description:"A practitioner build plan for medical device cybersecurity: what FDA reviewers ask for, what evidence satisfies SW96, SBOM, and testing, and what it costs.",image:"/post-heroes/medical-device-cybersecurity-best-practices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-best-practices",publishedAt:"2024-02-11T02:48:37+00:00",category:"Best Practices",tags:["Best Practices"],imageAlt:"Cybersecurity shield protecting medical devices, representing threat modeling and secure update best practices"},{slug:"how-medical-devices-are-designed-with-patient-safety-as-the-priority",path:"blog/how-medical-devices-are-designed-with-patient-safety-as-the-priority",title:"Medical Devices Are Designed",de
209scription:"Discover how medical devices are meticulously designed with patient safety as the top priority. Aligned with the FDA's Feb 3, 2026 premarket cybersecurity.",image:"/imported-images/hero-how-medical-devices-are-designed-with-patient-safety-as-the-.jpg",sourceUrl:"https://bluegoatcyber.com/blog/how-medical-devices-are-designed-with-patient-safety-as-the-priority",publishedAt:"2024-02-11T02:38:46+00:00",category:"Risk",tags:["Risk"],imageAlt:"Abstract blue and white medical device circuitry symbolizes secure patient care design"},{slug:"integrating-cybersecurity-assessments-into-the-medical-device-lifecycle",path:"blog/integrating-cybersecurity-assessments-into-the-medical-device-lifecycle",title:"Lifecycle Cybersecurity Assessments for Devices (2026)",description:"Lifecycle Cybersecurity Assessments for medical devices: step-by-step practices, FDA-aligned documentation, and pitfalls to avoid in 2026 submissions.",image:"/imported-images/hero-integrating-cybersecurity-assessments-into-the-medical-devic.jpg",sourceUrl:"https://bluegoatcyber.com/blog/integrating-cybersecurity-assessments-into-the-medical-device-lifecycle",publishedAt:"2024-02-10T17:04:46+00:00",category:"Lifecycle",tags:["Lifecycle"],imageAlt:"Abstract network nodes and gears represent the integration of cybersecurity into the medical device lifecycle"},{slug:"medical-device-sql-injection-parameterized-queries",path:"blog/medical-device-sql-injection-parameterized-queries",title:"SQL Injection Prevention: MedTech Security | Blue Goat Cyber",description:"SQL injection prevention, XSS defense, API method design, and file upload validation for medical device web software, mapped to FDA verification evidence.",image:"/imported-images/hero-medical-device-sql-injection-parameterized-queries.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-sql-injection-parameterized-queries",publishedAt:"2024-02-09T22:59:53+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes connect to a central medical device, illustrating secure query protection"},{slug:"secure-software-development-for-medical-devices-ensuring-safety-and-compliance",path:"blog/secure-software-development-for-medical-devices-ensuring-safety-and-compliance",title:"Secure Software Dev for Medical Devices",description:"Secure software development for medical devices protects patients, ensures data privacy, and maintains device functionality against cyber threats.",image:"/imported-images/hero-secure-software-development-for-medical-devices-ensuring-saf.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/secure-software-development-for-medical-devices-ensuring-safety-and-compliance",publishedAt:"2024-02-09T21:32:40+00:00",category:"SDLC",tags:["SDLC"],imageAlt:"Abstract digital network with a stylized goat icon, representing secure medical device software development"},{slug:"the-importance-of-verification-and-validation-in-medical-device-software",path:"blog/the-importance-of-verification-and-validation-in-medical-device-software",title:"Medical Device Software Verification and Validation: What FDA Expects",description:"Medical device software verification and validation explained: IEC 62304, QMSR design controls, safety classes, traceability, and the FDA submission evidence.",image:"/imported-images/hero-the-importance-of-verification-and-validation-in-medical-dev.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-importance-of-verification-and-validation-in-medical-device-software",publishedAt:"2024-02-09T01:59:25+00:00",category:"Testing",tags:["Testing"],imageAlt:"Abstract digital network connecting medical devices, symbolizing software verification and validation in cybersecurity"},{slug:"a-comprehensive-guide-to-software-testing-for-medical-devices",path:"blog/a-comprehensive-guide-to-software-testing-for-medical-devices",title:"Medical Device Software Testing Guide",description:"Medical device software testing ensures safety, reliability, and regulatory compliance. Learn fundamental principles, types of testing, and standards.",image:"/imported-images/hero-medical-device-software-testing.jpg",sourceUrl:"https://bluegoatcyber.com/blog/a-comprehensive-guide-to-software-testing-for-medical-devices",publishedAt:"2024-02-09T01:52:52+00:00",category:"Testing",tags:["Testing"],imageAlt:"Abstract digital network connecting medical devices, illustrating medical device software testing and cybersecurity"},{slug:"a-comprehensive-guide-to-risk-based-testing-for-medical-device-software",path:"blog/a-comprehensive-guide-to-risk-based-testing-for-medical-device-software",title:"Risk-Based Testing for Med Device Software",description:"Risk-based testing for medical device software: prioritize cases by patient harm severity, threat model coverage, and FDA cybersecurity expectations.",image:"/imported-images/hero-risk-based-testing.jpg",sourceUrl:"https://bluegoatcyber.com/blog/a-comprehensive-guide-to-risk-based-testing-for-medical-device-software",publishedAt:"2024-02-07T19:20:04+00:00",category:"Testing",tags:["Testing","Risk"],imageAlt:"Abstract digital network patterns overlaying a stylized goat's head, representing risk assessment in medical device cybersecurity"},{slug:"conducting-a-comprehensive-medical-device-inventory-for-enhanced-cybersecurity",path:"blog/conducting-a-comprehensive-medical-device-inventory-for-enhanced-cybersecurity",title:"Medical Device Cybersecurity Inventory (2026 Guide)",description:"Medical Device Cybersecurity Inventory for medical devices: step-by-step practices, FDA-aligned documentation, and pitfalls to avoid in 2026 submissions.",image:"/imported-images/hero-conducting-a-comprehensive-medical-device-inventory-for-enha.jpg",sourceUrl:"https://bluegoatcyber.com/blog/conducting-a-comprehensive-medical-device-inventory-for-enhanced-cybersecurity",publishedAt:"2024-02-02T20:16:13+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital network of medical devices with a cybersecurity shield protecting them"},{slug:"managing-connected-medical-devices-a-strategic-approach",path:"blog/managing-connected-medical-devices-a-strategic-approach",title:"Managing Interconnected Medical Devices",description:"Practical strategies for managing connected medical devices across their lifecycle, aligned with the FDA's Feb 3, 2026 premarket cybersecurity guidance.",image:"/imported-images/hero-managing-connected-medical-devices-a-strategic-approach.jpg",sourceUrl:"https://bluegoatcyber.com/blog/managing-connected-medical-devices-a-strategic-approach",publishedAt:"2024-02-02T18:32:05+00:00",category:"Strategy",tags:["Strategy"],imageAlt:"Networked medical devices connected by glowing lines, illustrating cybersecurity strategy for interconnected systems"},{slug:"securing-iot-enabled-medical-devices-5-essential-tips",path:"blog/securing-iot-enabled-medical-devices-5-essential-tips",title:"Securing IoT-Enabled Medical Devices: 5",description:"Strengthen IoT-enabled medical device security with 5 essential tips. Protect patient data, ensure clinical operations, and meet regulatory needs.",image:"/imported-images/hero-securing-iot-enabled-medical-devices-5-essential-tips.jpg",sourceUrl:"https://bluegoatcyber.com/blog/securing-iot-enabled-medical-devices-5-essential-tips",publishedAt:"2024-02-02T18:26:25+00:00",category:"IoT",tags:["IoT"],imageAlt:"Networked medical devices connected by a digital lock, illustrating IoT medical device security"},{slug:"medical-device-cybersecurity-with-interconnected-devices",path:"blog/medical-device-cybersecurity-with-interconnected-devices",title:"Interconnected Medical Device Cybersecurity: Network Risks",description:"Discover the crucial steps to safeguarding network security for connected medical devices in the healthcare industry. Aligned with the FDA's Feb 3, 2026.",image:"/imported-images/hero-medical-device-cybersecurity-with-interconnected-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medical-device-cybersecurity-with-interconnected-devices",publishedAt:"2024-02-02T18:24:18+00:00",category:"IoT",tags:["IoT"],imageAlt:"Networked medical devices secured by a digital shield, illustrating medical device cybersecurity"},{slug:"why-ids-ips-agents-dont-work-for-medical-devices",path:"blog/why-ids-ips-agents-dont-work-for-medical-devices",title:"Why IDS/IPS Agents Fail on Medical Devices",description:"Why IDS/IPS agents donât work for medical devices and what FDA-aligned alternatives like segmentation, gateways, and monitoring mean for patient safety.",image:"/imported-images/hero-why-ids-ips-agents-dont-work-for-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/why-ids-ips-agents-dont-work-for-medical-devices",publishedAt:"2024-02-02T04:56:51+00:00",category:"Primer",tags:["Primer"],imageAlt:"Network diagram with medical devices and security icons, illustrating cybersecurity challenges for connected healthcare technology"},{slug:"securing-iot-devices-in-healthcare-the-frontline-of-patient-safety",path:"blog/securing-iot-devices-in-healthcare-the-frontline-of-patient-safety",title:"Securing a Fleet of Connected Devices in Hospitals",description:"Onboarding, certificate management, network segmentation, MDS2, and patch delivery for hospital IoT device fleets, and what the hospital owns versus you.",image:"/imported-images/hero-securing-iot-devices-in-healthcare-the-frontline-of-patient-.jpg",sourceUrl:"https://bluegoatcyber.com/blog/securing-iot-devices-in-healthcare-the-frontline-of-patient-safety",publishedAt:"2024-01-28T20:58:05+00:00",category:"Primer",tags:["Primer"],imageAlt:"Networked medical devices connect to a secure digital shield, illustrating IoMT cybersecurity importance"},{slug:"the-importance-of-cybersecurity-in-the-medical-device-industry",path:"blog/the-importance-of-cybersecurity-in-the-medical-device-industry",t
209itle:"Medical Device Cybersecurity: A 2026 Executive Playbook",description:"Medical device cybersecurity for MedTech executives: what it costs, when to fund it, what Section 524B exposes you to, and what a missed postmarket plan costs.",image:"/imported-images/hero-the-importance-of-cybersecurity-in-the-medical-device-indust.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-importance-of-cybersecurity-in-the-medical-device-industry",publishedAt:"2024-01-25T14:56:22+00:00",category:"Primer",tags:["Primer"],imageAlt:"Digital padlock securing interconnected medical devices, representing the critical need for medical device cybersecurity"},{slug:"securing-communication-protocols-in-medical-devices",path:"blog/securing-communication-protocols-in-medical-devices",title:"Medical Device Protocol Cybersecurity",description:"This guide emphasizes securing communication protocols in medical devices and provides actionable insights for manufacturers to enhance safety and privacy.",image:"/imported-images/hero-securing-communication-protocols-in-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/securing-communication-protocols-in-medical-devices",publishedAt:"2024-01-21T20:33:55+00:00",category:"Networking",tags:["Networking"],imageAlt:"Networked medical devices with a digital shield protecting sensitive data, illustrating protocol cybersecurity"},{slug:"medhacking-and-medjacking",path:"blog/medhacking-and-medjacking",title:"MedJacking Explained: What the Term Covers and What Doesn't",description:"What MedJacking and MedHacking actually describe, which cases are verified, and the controls that break the attack chain on fielded devices.",image:"/imported-images/hero-medhacking-and-medjacking.jpg",sourceUrl:"https://bluegoatcyber.com/blog/medhacking-and-medjacking",publishedAt:"2024-01-21T03:44:46+00:00",category:"Primer",tags:["Primer"],imageAlt:"Medical devices like pacemakers and infusion pumps are secured by a digital shield against cyber threats"},{slug:"a-guide-to-conducting-a-medical-device-security-audit-for-manufacturers",path:"blog/a-guide-to-conducting-a-medical-device-security-audit-for-manufacturers",title:"Conducting a Medical Device Security Audit",description:"Step-by-step guide for medical device manufacturers to run a cybersecurity audit: scope, threat modeling, SBOM review, testing, and FDA-aligned documentation.",image:"/imported-images/hero-security-audit-manufacturers.jpg",sourceUrl:"https://bluegoatcyber.com/blog/a-guide-to-conducting-a-medical-device-security-audit-for-manufacturers",publishedAt:"2024-01-19T02:15:04+00:00",category:"Audits",tags:["Audits","Quality"],imageAlt:"Cybersecurity audit of medical devices, represented by a digital lock integrated into a stethoscope"},{slug:"the-rising-tide-of-cyber-threats-in-medical-devices-understanding-the-risks",path:"blog/the-rising-tide-of-cyber-threats-in-medical-devices-understanding-the-risks",title:"Rising Medical Device Cyber Threats: Risks and Mitigations",description:"In this post, we unravel this complex issue of cyber threats in medical devices and discuss what manufacturers can do to make their devices more secure.",image:"/imported-images/hero-the-rising-tide-of-cyber-threats-in-medical-devices-understa.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-rising-tide-of-cyber-threats-in-medical-devices-understanding-the-risks",publishedAt:"2024-01-19T01:36:20+00:00",category:"Primer",tags:["Primer","Risk"],imageAlt:"Cybersecurity lock icon superimposed on a medical device, illustrating the risks of cyber threats to healthcare technology"},{slug:"iso-14971-risk-management-in-medical-device-security",path:"blog/iso-14971-risk-management-in-medical-device-security",title:"ISO 14971: Medical Device Risk Management",description:"How ISO 14971 risk management applies to device cybersecurity: identify cyber hazards, control residual risk, and align the file with FDA expectations.",image:"/imported-images/hero-iso-14971-risk-management-in-medical-device-security.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iso-14971-risk-management-in-medical-device-security",publishedAt:"2024-01-18T21:49:57+00:00",category:"Risk",tags:["Risk","Standards"],imageAlt:"Abstract network nodes connect to a medical device, illustrating cybersecurity risk management for medical devices"},{slug:"iso-14971-its-crucial-role-in-medical-device-security-and-connection-with-aami-tir57",path:"blog/iso-14971-its-crucial-role-in-medical-device-security-and-connection-with-aami-tir57",title:"AAMI TIR57: Security Risk Management and ISO 14971 Fit",description:"AAMI TIR57 adapts ISO 14971 to security risk management. Learn what the TIR covers, how ANSI/AAMI SW96 extends it, and what the FDA expects in 2026.",image:"/imported-images/hero-iso-14971-its-crucial-role-in-medical-device-security-and-co.jpg",sourceUrl:"https://bluegoatcyber.com/blog/iso-14971-its-crucial-role-in-medical-device-security-and-connection-with-aami-tir57",publishedAt:"2024-01-18T02:25:27+00:00",category:"Standards",tags:["Standards"],imageAlt:"Abstract network of interconnected medical devices and risk assessment icons, symbolizing cybersecurity standards"},{slug:"hl7-navigating-the-complexities-of-healthcare-data-exchange",path:"blog/hl7-navigating-the-complexities-of-healthcare-data-exchange",title:"HL7 Cybersecurity Concerns for Medical Devices",description:"Updated July 24, 2026 Health Level 7 (HL7) is a vital cog in the machinery of healthcare information technology. Aligned with the FDA's Feb 3, 2026.",image:"/imported-images/hero-hl7-navigating-the-complexities-of-healthcare-data-exchange.jpg",s
209ourceUrl:"https://bluegoatcyber.com/blog/hl7-navigating-the-complexities-of-healthcare-data-exchange",publishedAt:"2024-01-15T21:29:20+00:00",category:"Primer",tags:["Primer"],imageAlt:"Abstract network nodes connect to a central, glowing medical cross, illustrating HL7 data security"},{slug:"20-medical-device-protocols-descriptions-purposes-security-flaws-fda-guidance-and-examples",path:"blog/20-medical-device-protocols-descriptions-purposes-security-flaws-fda-guidance-and-examples",title:"20 Common Medical Device Protocols",description:"This post covers the purposes, security risks, & regulatory guidance for medical device protocols for manufacturers, healthcare providers, & regulatory.",image:"/imported-images/hero-medical-device-protocols.jpg",sourceUrl:"https://bluegoatcyber.com/blog/20-medical-device-protocols-descriptions-purposes-security-flaws-fda-guidance-and-examples",publishedAt:"2024-01-15T21:07:50+00:00",category:"FDA",tags:["FDA"],imageAlt:"Networked medical devices connected by digital pathways, illustrating cybersecurity protocols"},{slug:"enhancing-medical-device-cybersecurity-the-role-of-sbom-and-sast-in-complying-with-fda-guidelines",path:"blog/enhancing-medical-device-cybersecurity-the-role-of-sbom-and-sast-in-complying-with-fda-guidelines",title:"SBOM + SAST for FDA Compliance",description:"SBOM + SAST explained: how component transparency and static code scanning strengthen medical device cybersecurity and align with FDA guidance.",image:"/imported-images/hero-enhancing-medical-device-cybersecurity-the-role-of-sbom-and-.jpg",sourceUrl:"https://bluegoatcyber.com/blog/enhancing-medical-device-cybersecurity-the-role-of-sbom-and-sast-in-complying-with-fda-guidelines",publishedAt:"2024-01-11T02:53:11+00:00",category:"FDA",tags:["FDA","SBOM"],imageAlt:"Abstract network nodes connect to a medical device, symbolizing SBOM and SAST for FDA compliance"},{slug:"the-top-50-cybersecurity-issues-with-medical-devices",path:"blog/the-top-50-cybersecurity-issues-with-medical-devices",title:"Top 50 Medical Device Cybersecurity Issues",description:"The 50 most common cybersecurity issues in medical devices, why each matters for patient safety, and how penetration testing catches them pre-submission.",image:"/imported-images/hero-the-top-50-cybersecurity-issues-with-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/the-top-50-cybersecurity-issues-with-medical-devices",publishedAt:"2024-01-10T22:05:13+00:00",category:"Risk",tags:["Risk"],imageAlt:"Digital network graphic with a stylized goat icon, symbolizing medical device cybersecurity risks and vulnerabilities"},{slug:"exploring-the-contrast-between-threat-trees-and-attack-trees-in-medical-device-fda-approval-and-cybersecurity",path:"blog/exploring-the-contrast-between-threat-trees-and-attack-trees-in-medical-device-fda-approval-and-cybersecurity",title:"Attack Tree Threat Modeling for Med Devices | Blue Goat",description:"Attack tree threat modeling explained: how it differs from STRIDE and FMEA, when to build one, and how output feeds ISO 14971 risk analysis and FDA files.",image:"/imported-images/hero-exploring-the-contrast-between-threat-trees-and-attack-trees.jpg",sourceUrl:"https://bluegoatcyber.com/blog/exploring-the-contrast-between-threat-trees-and-attack-trees-in-medical-device-fda-approval-and-cybersecurity",publishedAt:"2024-01-09T02:30:01+00:00",category:"FDA",tags:["FDA","Threat Modeling"],imageAlt:"Abstract network diagram with interconnected nodes representing medical device cybersecurity threats and attack vectors"},{slug:"navigating-the-intersection-of-jtag-uart-debug-ports-and-fda-compliance-in-medical-device-cybersecurity",path:"blog/navigating-the-intersection-of-jtag-uart-debug-ports-and-fda-compliance-in-medical-device-cybersecurity",title:"JTAG UART Debug Port Security: FDA Compliance | Blue Goat Cyber",description:"JTAG UART debug port security guidance for medical devices: what testers find, how to lock or authenticate ports, and how to document it for the FDA.",image:"/imported-images/hero-navigating-the-intersection-of-jtag-uart-debug-ports-and-fda.jpg",sourceUrl:"https://bluegoatcyber.com/blog/navigating-the-intersection-of-jtag-uart-debug-ports-and-fda-compliance-in-medical-device-cybersecurity",publishedAt:"2024-01-07T20:40:12+00:00",category:"FDA",tags:["FDA"],imageAlt:"Circuit board
209with glowing JTAG and UART ports symbolizing medical device cybersecurity vulnerabilities"},{slug:"a-critical-alert-the-top-10-most-vulnerable-medical-devices-to-cyber-attacks",path:"blog/a-critical-alert-the-top-10-most-vulnerable-medical-devices-to-cyber-attacks",title:"The Top 10 Most Vulnerable Medical Devices",description:"The top 10 medical devices most exposed to cyber attacks, why each is vulnerable, and the cybersecurity controls manufacturers should apply before submission.",image:"/imported-images/hero-top-10-vulnerable-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/a-critical-alert-the-top-10-most-vulnerable-medical-devices-to-cyber-attacks",publishedAt:"2024-01-07T18:55:22+00:00",category:"Primer",tags:["Primer"],imageAlt:"A blue goat with a padlock on its head, symbolizing vulnerable medical devices and cybersecurity"},{slug:"examples-of-hacked-medical-devices",path:"blog/examples-of-hacked-medical-devices",title:"Examples of Hacked Medical Devices",description:"Explore real-world examples of hacked medical devices, understanding the patient risks and critical need for enhanced cybersecurity controls in healthcare.",image:"/imported-images/hero-examples-of-hacked-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/blog/examples-of-hacked-medical-devices",publishedAt:"2024-01-06T18:46:05+00:00",category:"Primer",tags:["Primer"],imageAlt:"Cybersecurity concept of a goat in a blue helmet protecting medical devices from digital threats"}],_I=[{slug:"post-quantum-cryptography-medical-devices",path:"guides/post-quantum-cryptography-medical-devices",title:"Post-Quantum Cryptography for Medical Devices (2026)",description:"The quantum-resistant algorithms that matter for medical devices, what they cost in flash and bandwidth, the published migration deadlines, and what the FDA expects in your submission today.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/post-quantum-cryptography-medical-devices",publishedAt:"2026-09-17T00:00:00.000Z"},{slug:"fda-security-requirements-testing-guide",path:"guides/fda-security-requirements-testing-guide",title:"FDA Security Requirements Testing: The 2026 Verification Guide",description:"What security requirements testing means in the FDA's Feb 2026 guidance, how boundary analysis works, and why it is verification you own rather than a test a lab can run for you.",image:"/guides/fda-security-requirements-testing-guide.jpg",sourceUrl:"https://bluegoatcyber.com/guides/fda-security-requirements-testing-guide",publishedAt:"2026-09-04T00:00:00.000Z"},{slug:"aami-cr515-ml-medical-device-cybersecurity",path:"guides/aami-cr515-ml-medical-device-cybersecurity",title:"AAMI CR515:2025: ML Medical Device Cybersecurity (2026)",description:"What AAMI CR515:2025 covers for machine learning-enabled medical devices, the ML-specific threats it adds to your threat model, and how it interlocks with GMLP, PCCP, AIBOM, and Section 524B.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/aami-cr515-ml-medical-device-cybersecurity",publishedAt:"2026-09-02T00:00:00.000Z"},{slug:"validating-cybersecurity-tools-iso-tr-80002-2",path:"guides/validating-cybersecurity-tools-iso-tr-80002-2",title:"ISO/TR 80002-2 and Validating Cybersecurity Tools (2026)",description:"ISO/TR 80002-2:2017 governs validation of non-device software used in the quality system. How it applies to SBOM generators, SCA scanners, threat modeling tools, and signing pipelines.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/validating-cybersecurity-tools-iso-tr-80002-2",publishedAt:"2026-09-01T00:00:00.000Z"},{slug:"iec-60601-medical-device-cybersecurity",path:"guides/iec-60601-medical-device-cybersecurity",title:"IEC 60601 and Cybersecurity: What It Covers (2026)",description:"IEC 60601 is an electrical safety and EMC family, not a cybersecurity standard. What each sub-part covers, where it touches security, and the standards that actually apply.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/iec-60601-medical-device-cybersecurity",publishedAt:"2026-08-05T00:00:00.000Z"},{slug:"aibom-medical-devices",path:"guides/aibom-medical-devices",title:"AIBOM for Medical Devices: AI Bill of Materials (2026)",description:"What an AIBOM (AI bill of materials) is, how it differs from an SBOM, the fields the FDA expects for AI-enabled devices, and how to generate one in CycloneDX or SPDX.",image:"/guides/aibom-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/guides/aibom-medical-devices",publishedAt:"2026-08-02T00:00:00.000Z"},{slug:"fda-sbom-format-requirements",path:"guides/fda-sbom-format-requirements",title:"What SBOM Format Does the FDA Require? (2026)",description:"The FDA accepts CycloneDX and SPDX SBOMs in machine-readable form. Version floors, file types, required fields, and the format mistakes that trigger deficiencies.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-sbom-format-requirements",publishedAt:"2026-08-02T00:00:00.000Z"},{slug:"sbom-510k-submission",path:"guides/sbom-510k-submission",title:"SBOM in a 510(k) Submission: Where It Goes (2026)",description:"Where the SBOM belongs in a 510(k) eSTAR submission, what has to accompany it, how
209it ties to the vulnerability assessment, and the placement errors that trigger deficiencies.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/sbom-510k-submission",publishedAt:"2026-08-02T00:00:00.000Z"},{slug:"supplier-sbom-responsibility-medical-devices",path:"guides/supplier-sbom-responsibility-medical-devices",title:"Who Is Responsible for Supplier SBOMs? (2026)",description:"Supplier SBOM responsibility under FDA Section 524B: the manufacturer owns the device SBOM, what to require in supplier contracts, and how to document gaps reviewers will accept.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/supplier-sbom-responsibility-medical-devices",publishedAt:"2026-08-02T00:00:00.000Z"},{slug:"ide-cybersecurity-requirements-guide",path:"guides/ide-cybersecurity-requirements-guide",title:"IDE Cybersecurity Requirements: The Investigational Device Guide (2026)",description:"What cybersecurity documentation an IDE application needs under 21 CFR 812 and the FDA February 3, 2026 premarket guidance, and why Section 524B does not apply.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/ide-cybersecurity-requirements-guide",publishedAt:"2026-07-31T00:00:00.000Z"},{slug:"ide-cybersecurity-submission-guide",path:"guides/ide-cybersecurity-submission-guide",title:"IDE Cybersecurity Submission Guide",description:"Assemble the cybersecurity content of an IDE application: Appendix 3's five elements, the binding 21 CFR 812.25 requirements behind them, and risk-scaled documentation breadth.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/ide-cybersecurity-submission-guide",publishedAt:"2026-07-31T00:00:00.000Z"},{slug:"cybersecurity-for-ivd-devices",path:"guides/cybersecurity-for-ivd-devices",title:"Cybersecurity for IVD Devices: The FDA & Section 524B Guide",description:"How Section 524B and AAMI SW96 apply to clinical analyzers, point-of-care, and connected IVD platforms, plus the pitfalls IVD teams hit.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/cybersecurity-for-ivd-devices",publishedAt:"2026-07-11T00:00:00.000Z"},{slug:"combination-product-cybersecurity-fda",path:"guides/combination-product-cybersecurity-fda",title:"Combination Product Cybersecurity: When CDER Meets CDRH §524B",description:"How Section 524B and the Feb 2026 guidance apply to drug-device combination products, including the CDER/CDRH lead-center split.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/combination-product-cybersecurity-fda",publishedAt:"2026-06-25T00:00:00.000Z"},{slug:"iso-14971-vs-aami-tir57-hazard-analysis",path:"guides/iso-14971-vs-aami-tir57-hazard-analysis",title:"ISO 14971 vs AAMI TIR57: Hazard Analysis Meets Cybersecurity Risk",description:"How safety hazard analysis and security risk analysis run in parallel and converge at the patient-harm column, with a side-by-side mapping table.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/iso-14971-vs-aami-tir57-hazard-analysis",publishedAt:"2026-06-25T00:00:00.000Z"},{slug:"coordinated-vulnerability-disclosure-medical-devices",path:"guides/coordinated-vulnerability-disclosure-medical-devices",title:"Medical Device CVD Guide: FDA Compliance & Best Practices",description:"How to run a CVD program that satisfies FDA expectations and aligns to ISO/IEC 29147 and 30111, including researcher handling.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/coordinated-vulnerability-disclosure-medical-devices",publishedAt:"2026-06-20T01:07:51.853Z"},{slug:"de-novo-cybersecurity-submission-guide",path:"guides/de-novo-cybersecurity-submission-guide",title:"De Novo Cybersecurity Submission Guide",description:"Learn the specific cybersecurity requirements for a successful De Novo submission. Ensure FDA compliance with threat modeling, SBOM, and pen testing.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/de-novo-cybersecurity-submission-guide",publishedAt:"2026-06-20T01:07:51.853Z"},{slug:"postmarket-cybersecurity-monitoring-program",path:"guides/postmarket-cybersecurity-monitoring-program",title:"Postmarket Cybersecurity Monitoring Guide for MedTech",description:"How to stand up vulnerability intake, risk assessment, and disclosure workflows that meet FDA postmarket expectations.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/postmarket-cybersecurity-monitoring-program",publishedAt:"2026-06-20T01:07:51.853Z"},{slug:"hhs-hph-cpgs-medical-device-manufacturers",path:"guides/hhs-hph-cpgs-medical-device-manufacturers",title:"HHS HPH CPGs for Medical Device Manufacturers",description:"How the HHS HPH Cybersecurity Performance Goals map to manufacturer obligations, MDS2 disclosures, and Section 524B evidence.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/hhs-hph-cpgs-medical-device-manufacturers",publishedAt:"2026-06-18T00:00:00.000Z"},{slug:"fda-security-control-categories-medical-devices",path:"guides/fda-security-control-categories-medical-devices",title:"FDA Security Control Categories: What Reviewers Expect Per Category",description:"The 8 security control categories every cyber device must cover, and the evidence FDA expects for each one.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-security-control-categories-medical-devices",publishedAt:"2026-06-11T18:30:00.000Z"},{slug:"cybersecurity-management-plan-fda-medical-devices",path:"guides/cybersecurity-management-plan-fda-medical-devices",title:"Cybersecurity Management Plan for FDA Submissions: A 2026 Guide",description:"What goes in the Cybersecurity Management Plan reviewers expect in eSTAR v7.0 Slot 1: scope, governance, QMS integration, postmarket commitments, and the most common deficiency patterns under the FDA's February 2026 final guidance.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/cybersecurity-management-plan-fda-medical-devices",publishedAt:"2026-06-11T18:00:00.000Z"},{slug:"fda-cybersecurity-testing-requirements-taxonomy",path:"guides/fda-cybersecurity-testing-requirements-taxonomy",title:"FDA Cybersecurity Testing Requirements: The Complete 2026 Taxonomy",description:"Ten families of cybersecurity testing the Feb 2026 guidance expects, mapped to eSTAR v7.0 slots and recognized standards.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-testing-requirements-taxonomy",publishedAt:"2026-06-11T17:00:00.000Z"},{slug:"estar-v7-cybersecurity-mapping-fda-2026-guidance",path:"guides/estar-v7-cybersecurity-mapping-fda-2026-guidance",title:"eSTAR v7.0 Cybersecurity Attachments: How the 8 Slots Map to the FDA's 2026 Guidance",description:"A side-by-side mapping of the 8 Cybersecurity attachment slots in eSTAR v7.0 to the 15 deliverables in the FDA's February 2026 final premarket cybersecurity guidance, with the most common RTA trigger for each slot.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/estar-v7-cybersecurity-mapping-fda-2026-guidance",publishedAt:"2026-06-11T00:00:00.000Z"},{slug:"fda-cybersecurity-technical-screening-checklist",path:"guides/fda-cybersecurity-technical-screening-checklist",title:"FDA Cybersecurity Technical Screening Checklist (2026)",description:"A reviewer's-eye technical screening checklist for FDA cyber-device submissions: artifacts, formats, traceability, and the failure modes that turn a soft deficiency into a hold.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-technical-screening-checklist",publishedAt:"2026-06-07T00:00:00.000Z"},{slug:"fda-cybersecurity-rta-prevention-checklist",path:"guides/fda-cybersecurity-rta-prevention-checklist",title:"FDA Cybersecurity RTA Prevention Checklist: Avoid Refuse-to-Accept Holds",description:"A practitioner's checklist of the cybersecurity triggers that cause FDA Refuse-to-Accept (RTA) holds under Section 524B, and how to clear each one before you submit.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-rta-prevention-checklist",publishedAt:"2026-06-07T00:00:00.000Z"},{slug:"fda-cybersecurity-guidance",path:"guides/fda-cybersecurity-guidance",title:"FDA Cybersecurity Guid
209ance 2026: Transition Guide and Summary",description:"A plain-language summary of the FDA's Feb 3, 2026 final premarket cybersecurity guidance: what changed, the 8-slot eSTAR v7.0 checklist, and how to transition.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-guidance",publishedAt:"2026-05-27T12:00:00.000Z"},{slug:"fda-524b-cybersecurity-requirements-explained",path:"guides/fda-524b-cybersecurity-requirements-explained",title:"FDA Section 524B Cybersecurity Requirements: Compliance Guide",description:"Master FDA Section 524B cybersecurity requirements for cyber devices: SBOM, vulnerability disclosure, patchability, and premarket evidence.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-524b-cybersecurity-requirements-explained",publishedAt:"2026-05-27T00:00:00.000Z"},{slug:"fda-premarket-cybersecurity-submission-checklist",path:"guides/fda-premarket-cybersecurity-submission-checklist",title:"FDA Premarket Cybersecurity Submission Checklist (2026)",description:"A 15-section checklist for a 510(k), De Novo, or PMA cybersecurity submission under Section 524B and the FDA's February 2026 final guidance.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-premarket-cybersecurity-submission-checklist",publishedAt:"2026-05-27T00:00:00.000Z"},{slug:"sbom-vulnerability-management-medical-devices",path:"guides/sbom-vulnerability-management-medical-devices",title:"SBOM Vulnerability Management for Medical Devices (2026)",description:"How to track, triage, and mitigate SBOM component risk across premarket submission and postmarket monitoring.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/sbom-vulnerability-management-medical-devices",publishedAt:"2026-05-27T00:00:00.000Z"},{slug:"medical-device-vdp-cvd-workflows-guide",path:"guides/medical-device-vdp-cvd-workflows-guide",title:"VDP and CVD Workflows for Medical Devices",description:"How to build a Vulnerability Disclosure Program (VDP) and Coordinated Vulnerability Disclosure (CVD) workflow for medical devices. ISO/IEC 29147 / 30111, FDA expectations, and a reference SLA model.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/medical-device-vdp-cvd-workflows-guide",publishedAt:"2026-05-23T00:00:00.000Z"},{slug:"aami-tir57-vs-tir97-comparison",path:"guides/aami-tir57-vs-tir97-comparison",title:"AAMI TIR57 vs TIR97: Cybersecurity Risk Management for Medical Devices",description:"AAMI TIR57 (R2023) is the FDA-recognized standard for medical device cybersecurity risk management. Compare it with TIR97 (postmarket) and apply both across the device lifecycle.",image:"/imported-images/hero-aami-tir57-risk-management-for-medical-device-security.jpg",sourceUrl:"https://bluegoatcyber.com/guides/aami-tir57-vs-tir97-comparison",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"cyclonedx-vs-spdx-medical-devices",path:"guides/cyclonedx-vs-spdx-medical-devices",title:"CycloneDX vs. SPDX: Choosing an SBOM Format for the FDA",description:"Does the FDA prefer CycloneDX or SPDX? Compare SBOM formats for medical device cybersecurity compliance and premarket 510(k) submissions.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/cyclonedx-vs-spdx-medical-devices",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"fda-cybersecurity-deficiency-letter-examples",path:"guides/fda-cybersecurity-deficiency-letter-examples",title:"FDA Cybersecurity Deficiency Letter Examples: Real Reviewer Wording",description:"Real FDA cybersecurity deficiency letter examples by category, with the reviewer wording used in each and the artifact gap it points to. Diagnosis, not response mechanics.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-deficiency-letter-examples",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"fda-pma-cybersecurity-requirements",path:"guides/fda-pma-cybersecurity-requirements",title:"FDA PMA Cybersecurity Requirements: A Regulatory Guide",description:"The technical documentation, risk management, and SPDF evidence a Class III PMA cybersecurity package needs to clear FDA review.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-pma-cybersecurity-requirements",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"samd-cybersecurity-requirements",path:"guides/samd-cybersecurity-requirements",title:"SaMD Cybersecurity Requirements: FDA, IEC 82304-1 & EU MDR",description:"What makes Software as a Medical Device different: premarket deliverables, cloud SBOM scope, and postmarket monitoring under Section 524B.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/samd-cybersecurity-requirements",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"security-risk-assessment-iec-81001-5-1",path:"guides/security-risk-assessment-iec-81001-5-1",title:"Guide to IEC 8
2091001-5-1 Security Risk Assessments",description:"How to run an IEC 81001-5-1 security risk assessment and map lifecycle activities to what FDA reviewers expect to see.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/security-risk-assessment-iec-81001-5-1",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"stride-threat-modeling-medical-devices",path:"guides/stride-threat-modeling-medical-devices",title:"STRIDE Threat Modeling for Medical Devices: Definitive Guide",description:"How to apply STRIDE to a medical device architecture, from data flow diagrams to a threat table FDA reviewers accept.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/stride-threat-modeling-medical-devices",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"vex-document-medical-device-fda",path:"guides/vex-document-medical-device-fda",title:"VEX Document Guide: FDA Medical Device Compliance",description:"What a VEX document is, how it complements your SBOM, and how to use exploitability statements in FDA submissions.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/vex-document-medical-device-fda",publishedAt:"2026-05-08T14:59:34.475Z"},{slug:"fda-cybersecurity-deficiency-letter-response-playbook",path:"guides/fda-cybersecurity-deficiency-letter-response-playbook",title:"FDA Cybersecurity Deficiency Response Timeline and Sequencing",description:"How long each FDA cybersecurity deficiency fix takes and what order to run them in, inside the 180-day clock. Triage windows, rebuild durations, and parallel work streams.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-deficiency-letter-response-playbook",publishedAt:"2026-03-01T00:00:00.000Z"},{slug:"fda-medical-device-threat-model-template",path:"guides/fda-medical-device-threat-model-template",title:"FDA Medical Device Threat Model Template + Example",description:"Step-by-step template to build a threat model FDA reviewers will accept - architecture views, STRIDE, safety mapping, control traceability, and a worked example.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-medical-device-threat-model-template",publishedAt:"2026-03-01T00:00:00.000Z"},{slug:"fda-penetration-testing-scope-510k",path:"guides/fda-penetration-testing-scope-510k",title:"FDA Penetration Testing Scope: 510(k), De Novo, PMA",description:"How to scope penetration testing for an FDA submission so the report survives reviewer scrutiny: attack surfaces, evidence depth, and scope by pathway.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-penetration-testing-scope-510k",publishedAt:"2026-03-01T00:00:00.000Z"},{slug:"gmlp-controls-crosswalk-medical-devices",path:"guides/gmlp-controls-crosswalk-medical-devices",title:"GMLP Crosswalk: 10 Principles to Engineering Controls",description:"Each of the FDA/Health Canada/MHRA Good Machine Learning Practice principles mapped to concrete engineering, QMS, and documentation controls.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/gmlp-controls-crosswalk-medical-devices",publishedAt:"2026-03-01T00:00:00.000Z"},{slug:"pass-fda-510k-cybersecurity-first-submission",path:"guides/pass-fda-510k-cybersecurity-first-submission",title:"How to Pass FDA 510(k) Cybersecurity on the First Submission",description:"The cybersecurity package that clears 510(k) review without an AI letter: eight artifacts, common rejection patterns, and a 30-day readiness check.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/pass-fda-510k-cybersecurity-first-submission",publishedAt:"2026-03-01T00:00:00.000Z"},{slug:"pma-cybersecurity-full-service-guide",path:"guides/pma-cybersecurity-full-service-guide",title:"Full-Service Cybersecurity for PMA Submissions",description:"What a Class III PMA cybersecurity package needs, and how one integrated team delivers threat modeling, SBOM, pen testing, and the postmarket plan.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/pma-cybersecurity-full-service-guide",publishedAt:"2026-03-01T00:00:00.000Z"},{slug:"postmarket-sbom-maintenance-medical-devices",path:"guides/postmarket-sbom-maintenance-medical-devices",title:"Postmarket SBOM Maintenance for Medical Devices",description:"How to maintain SBOMs across a fleet of cleared devices: regeneration cadence, vulnerability triage, VEX, and the postmarket plan that ties it together.",image:"/guides/postmarket-sbom-maintenance-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/guides/postmarket-sbom-maintenance-medical-devices",publishedAt:"2026-03-01T00:00:00.000Z"},{slug:"penetration-testing-for-medical-devices",path:"guides/penetration-testing-for-medical-devices",title:"Penetration Testing for Medical Devices: A 2026 Explainer",description:"What medical device penetration testing is, why the FDA requires it under Section 524B, the four FDA-expected test categories, scope by device archetype, and what a credible deliverable contains.",image:"/guides/penetration-testing-for-medical-devices.jpg",sourceUrl:"https://bluegoatcyber.com/guides/penetration-testing-for-medical-devices"},{slug:"sbom-for-medical-devices",path:"guides/sbom-for-medical-devices",title:"SBOM for Medical Devices: The 2026 FDA Pillar Guide",description:"What an SBOM is, why the FDA requires one under Section 524B, SPDX vs CycloneDX, how to generate and submit one, and how it powers postmarket vulnerability management.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/sbom-for-medical-devices"},{slug:"cpe-vs-purl-sbom-medical-devices",path:"guides/cpe-vs-purl-sbom-medical-devices",title:"CPE vs PURL for Medical Device SBOMs: Which Identifier and When",description:"How CPE and PURL identifiers differ, why medical device SBOMs need both, and how to map PURL to CPE for FDA postmarket CVE monitoring under Section 524B.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/cpe-vs-purl-sbom-medical-devices"}
209,{slug:"fda-pathway-cybersecurity-differences",path:"guides/fda-pathway-cybersecurity-differences",title:"FDA Pathway Cybersecurity Differences: 510(k), De Novo, PMA, HDE, IDE, Q-Sub, PDP",description:"How cybersecurity expectations differ across FDA pathways - 510(k), De Novo, PMA, HDE, IDE, Q-Sub, and PDP - under Section 524B and the February 2026 final guidance.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-pathway-cybersecurity-differences"},{slug:"eu-mdr-vs-fda-cybersecurity",path:"guides/eu-mdr-vs-fda-cybersecurity",title:"EU MDR vs FDA Medical Device Cybersecurity: A Side-by-Side Crosswalk",description:"How EU MDR/IVDR cybersecurity requirements compare to FDA Section 524B and the February 2026 guidance - Annex I §17.2, MDCG 2019-16, SBOM, vulnerability handling, and postmarket obligations.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/eu-mdr-vs-fda-cybersecurity"},{slug:"eu-ai-act-vs-fda-ai-ml-cybersecurity",path:"guides/eu-ai-act-vs-fda-ai-ml-cybersecurity",title:"EU AI Act vs FDA AI/ML Cybersecurity for Devices",description:"How EU AI Act Article 15 obligations compare to the FDA's PCCP framework and Section 524B for AI/ML SaMD.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/eu-ai-act-vs-fda-ai-ml-cybersecurity"},{slug:"fda-pccp-change-control-plans",path:"guides/fda-pccp-change-control-plans",title:"FDA PCCP: Predetermined Change Control Plans",description:"How to author a Predetermined Change Control Plan the FDA will accept: modifications protocol, methods, impact assessment, and cybersecurity coverage.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-pccp-change-control-plans"},{slug:"gtm-compliance-crosswalk-fda-soc2-hipaa-hitrust-gdpr",path:"guides/gtm-compliance-crosswalk-fda-soc2-hipaa-hitrust-gdpr",title:"GTM Compliance Crosswalk: FDA + SOC 2 + HIPAA + HITRUST + GDPR",description:"A crosswalk of the five frameworks MedTech teams face after FDA clearance: SOC 2, HIPAA, HITRUST, GDPR, and shared control sequencing.",image:"/imported-images/0e58b1b050d75414.png",sourceUrl:"https://bluegoatcyber.com/guides/gtm-compliance-crosswalk-fda-soc2-hipaa-hitrust-gdpr"},{slug:"10-reasons-medical-device-cybersecurity-vendors-fail-you",path:"guides/10-reasons-medical-device-cybersecurity-vendors-fail-you",title:"10 Reasons Medical Device Cybersecurity Vendors Fail You",description:"A practical, ungated buyer's guide for medical device manufacturers evaluating cybersecurity partners, what goes wrong, why it costs you, and what to demand from your next engagement. Aligned to the FDA February 2026 premarket guidance.",image:"/imported-images/44f026967ff9529a.png",sourceUrl:"https://bluegoatcyber.com/guides/10-reasons-medical-device-cybersecurity-vendors-fail-you"},{slug:"12-critical-findings-from-medical-device-penetration-tests",path:"guides/12-critical-findings-from-medical-device-penetration-tests",title:"12 Critical Findings from Medical Device Penetration Tests",description:"The most common high- and critical-severity findings we surface in medical device penetration tests, what each one looks like in the field, and how to fix it before your FDA submission.",image:"/imported-images/b54f34d2e22bfdc5.png",sourceUrl:"https://bluegoatcyber.com/guides/12-critical-findings-from-medical-device-penetration-tests"},{slug:"12-critical-threat-modeling-gaps-medical-device-submissions",path:"guides/12-critical-threat-modeling-gaps-medical-device-submissions",title:"12 Critical Threat Modeling Gaps in Medical Device Submissions",description:"A practical, ungated guide to the threat modeling gaps that trigger FDA cybersecurity questions in 510(k), De Novo, and PMA submissions - and exactly how to close them before reviewers find them.",image:"/imported-images/e50bf3bde6a9b042.png",sourceUrl:"https://bluegoatcyber.com/guides/12-critical-threat-modeling-gaps-medical-device-submissions"},{slug:"12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions",path:"guides/12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions",title:"12 Reasons the FDA Rejects Medical Device Cybersecurity Submissions",de
209scription:"The most common cybersecurity deficiencies in 510(k), De Novo, and PMA submissions, what triggers each one and how to fix it before you file. Aligned to the FDA February 2026 final guidance and Section 524B.",image:"/imported-images/69348c825cbf5d67.png",sourceUrl:"https://bluegoatcyber.com/guides/12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions"},{slug:"fda-cybersecurity-deficiency-response-checklist",path:"guides/fda-cybersecurity-deficiency-response-checklist",title:"FDA Cybersecurity Deficiency Letter Response Checklist",description:"A step-by-step, 11-stage checklist for organizing and resolving FDA cybersecurity deficiency letters across 510(k), PMA, De Novo, and HDE submissions. Aligned to the FDA February 2026 final guidance and Section 524B.",image:"/guides/deficiency-response.jpg",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-deficiency-response-checklist"},{slug:"the-medtech-cybersecurity-standards-decoder",path:"guides/the-medtech-cybersecurity-standards-decoder",title:"The MedTech Cybersecurity Standards Decoder",description:"A plain-English field guide to FDA Section 524B, IEC 81001-5-1, AAMI TIR57, ANSI/AAMI SW96, ISO 14971, and 8 more medical device cybersecurity standards, what they require, how they connect, and what FDA expects in your eSTAR premarket submission.",image:"/imported-images/3b802a01fec20248.png",sourceUrl:"https://bluegoatcyber.com/guides/the-medtech-cybersecurity-standards-decoder"},{slug:"postmarket-cybersecurity-readiness-plan",path:"guides/postmarket-cybersecurity-readiness-plan",title:"The Postmarket Cybersecurity Readiness Plan",description:"A three-phase plan, Premarket â Launch â Operate, for the cybersecurity work that starts before your 510(k) is filed, lights up before your first device ships, and runs for the life of the product. Aligned to the FDA February 2026 final guidance.",image:"/imported-images/72b738da299b1d40.png",sourceUrl:"https://bluegoatcyber.com/guides/postmarket-cybersecurity-readiness-plan"},{slug:"medical-device-cybersecurity-spdf-playbook",path:"guides/medical-device-cybersecurity-spdf-playbook",title:"The SPDF Playbook for FDA-Ready Medical Devices",description:"A practical, ungated guide to building a Secure Product Development Framework (SPDF) that FDA accepts, the eight pillars, the artifacts each one produces, and a pre-submission readiness checklist you can score yourself against.",image:"/imported-images/bde36f4758fd347a.png",sourceUrl:"https://bluegoatcyber.com/guides/medical-device-cybersecurity-spdf-playbook"},{slug:"fda-premarket-cybersecurity-deliverables-estar-map",path:"guides/fda-premarket-cybersecurity-deliverables-estar-map",title:"FDA Premarket Cybersecurity Deliverables & eSTAR v7.0 Map",description:"All 18 FDA premarket cybersecurity deliverables, mapped to the February 2026 guidance sections and the non-IVD eSTAR v7.0 fields. Used on 275+ submissions.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-premarket-cybersecurity-deliverables-estar-map"},{slug:"legacy-medical-device-cybersecurity",path:"guides/legacy-medical-device-cybersecurity",title:"Legacy Medical Device Cybersecurity: The 2026 FDA Guide",description:"SBOM reconstruction, vulnerability triage without source code, and end-of-support communication for devices cleared before Section 524B.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/legacy-medical-device-cybersecurity"}],II=[{slug:"de-novo-cybersecurity-submission-guide",path:"guides/de-novo-cybersecurity-submission-guide",title:"De Novo Cybersecurity Submission Guide | Blue Goat Cyber",description:"Learn the specific cybersecurity requirements for a successful De Novo submission. Ensure FDA compliance with threat modeling, SBOM, and pen testing.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/de-novo-cybersecurity-submission-guide"},{slug:"fda-cybersecurity-deficiency-letter-examples",path:"guides/fda-cybersecurity-deficiency-letter-examples",title:"FDA Cybersecurity Deficiency Letter Examples: Real Reviewer Wording",description:"Analyze real-world FDA
209cybersecurity deficiency letter examples. Learn how to address RTA and AI deficiency requests for 510(k) and PMA submissions.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-cybersecurity-deficiency-letter-examples"},{slug:"postmarket-cybersecurity-monitoring-program",path:"guides/postmarket-cybersecurity-monitoring-program",title:"Postmarket Cybersecurity Monitoring Guide for MedTech",description:"Ensure FDA compliance with our guide to postmarket cybersecurity monitoring for medical devices. Master vulnerability intake, risk assessments, and disclosure.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/postmarket-cybersecurity-monitoring-program"},{slug:"samd-cybersecurity-requirements",path:"guides/samd-cybersecurity-requirements",title:"SaMD Cybersecurity FDA Requirements: 2024 Compliance Guide",description:"Master SaMD cybersecurity FDA requirements. Learn premarket submission needs, SBOM standards, and postmarket monitoring for SaMD under Section 524B.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/samd-cybersecurity-requirements"},{slug:"fda-premarket-cybersecurity-submission-checklist",path:"guides/fda-premarket-cybersecurity-submission-checklist",title:"FDA Premarket Cybersecurity Submission Checklist Guide",description:"Ensure your 510(k) or PMA is compliant. Use our checklist for FDA premarket cybersecurity submissions, covering SBOM, threat models, and pen testing.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-premarket-cybersecurity-submission-checklist"},{slug:"sbom-vulnerability-management-medical-devices",path:"guides/sbom-vulnerability-management-medical-devices",title:"SBOM Vulnerability Management for Medical Devices Guide",description:"Master SBOM vulnerability management for medical devices. Learn to track, triage, and mitigate software risks to meet FDA premarket and postmarket requirements.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/sbom-vulnerability-management-medical-devices"},{slug:"aami-tir57-vs-tir97-comparison",path:"guides/aami-tir57-vs-tir97-comparison",title:"AAMI TIR57 vs TIR97: Medical Device Risk Management Guide",description:"Compare AAMI TIR57 vs TIR97. Learn how these cybersecurity risk management standards differ and how to apply them for FDA premarket and postmarket compliance.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/aami-tir57-vs-tir97-comparison"},{slug:"fda-pma-cybersecurity-requirements",path:"guides/fda-pma-cybersecurity-requirements",title:"FDA PMA Cybersecurity Requirements: Expert Guide (2024)",description:"Master FDA PMA cybersecurity requirements. Learn the technical documentation, risk management, and SPDF requirements needed for a successful Class III submissio",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-pma-cybersecurity-requirements"},{slug:"vex-document-medical-device-fda",path:"guides/vex-document-medical-device-fda",title:"VEX Document Guide for FDA Medical Device Compliance",description:"Learn how VEX documents complement SBOMs for FDA medical device compliance. Expert guidance on Vulnerability Exploitability eXchange for MedTech manufacturers.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/vex-document-medical-device-fda"},{slug:"stride-threat-modeling-medical-devices",path:"guides/stride-threat-modeling-medical-devices",title:"STRIDE Threat Modeling for Medical Devices | Blue Goat Cyber",description:"Master STRIDE threat modeling for medical devices. Learn to identify risks, meet FDA premarket requirements, and secure your MedTech ecosystem. Read our guide.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/stride-threat-modeling-medical-devices"},{slug:"security-risk-assessment-iec-81001-5-1",path:"guides/security-risk-assessment-iec-81001-5-1",title:"IEC 81001-5-1 Security Risk Assessment Guide",description:"Learn how to implement IEC 81001-5-1 security risk assessments for FDA compliance. Expert guidance on medical device lifecycle security mapping.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/security-risk-assessment-iec-81001-5-1"},{slug:"coordinated-vulnerability-disclosure-medical-devices",path:"guides/coordinated-vulnerability-disclosure-medical-devices",title:"Medical Device CVD Guide: FDA Compliance & Best Practices",description:"Master Coordinated Vulnerability Disclosure (CVD) for medical devices. Learn FDA requirements, ISO/IEC 29147 standards, and how to handle security researchers.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/coordinated-vulnerability-disclosure-medical-devices"},{slug:"fda-524b-cybersecurity-requirements-explained",path:"guides/fda-524b-cybersecurity-requirements-explained",title:"FDA 524B Cybersecurity Requirements: Full Compliance Guide",description:"Master FDA 524B cybersecurity requirements. Learn how to meet SBOM, vulnerability monitoring, and patch management standards for medical device submissions.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/fda-524b-cybersecurity-requirements-explained"},{slug:"cyclonedx-vs-spdx-medical-devices",path:"guides/cyclonedx-vs-spdx-medical-devices",title:"CycloneDX vs SPDX: Medical Device SBOM Compliance Guide",description:"Does the FDA prefer CycloneDX or SPDX? C
209ompare SBOM formats for medical device cybersecurity compliance and premarket 510(k) submissions.",image:"",sourceUrl:"https://bluegoatcyber.com/guides/cyclonedx-vs-spdx-medical-devices"}],jI=[{slug:"cost-of-medical-device-penetration-testing",path:"blog/cost-of-medical-device-penetration-testing",title:"Medical Device Penetration Testing Cost: 2026 Guide",description:"Understand the factors influencing medical device penetration testing cost, from FDA requirements to device complexity. Get a transparent pricing breakdown.",image:"",sourceUrl:"https://bluegoatcyber.com/blog/cost-of-medical-device-penetration-testing"},{slug:"how-long-does-fda-cybersecurity-review-take",path:"blog/how-long-does-fda-cybersecurity-review-take",title:"FDA Cybersecurity Review Timeline: 510(k) & De Novo Guide",description:"Learn the actual timelines for FDA cybersecurity review. Understand 510(k) and De Novo clock stops, RTA hold periods, and how to avoid costly delays.",image:"",sourceUrl:"https://bluegoatcyber.com/blog/how-long-does-fda-cybersecurity-review-take"}],zw=[{slug:"gtm-compliance-crosswalk-fda-soc2-hipaa-hitrust-gdpr",title:"GTM Compliance Crosswalk: FDA + SOC 2 + HIPAA + HITRUST + GDPR",blurb:"Overview and crosswalk of the five frameworks every MedTech innovator must satisfy after FDA clearance - shared controls, sequencing, and FAQs.",tag:"Standards"},{slug:"the-medtech-cybersecurity-standards-decoder",title:"The MedTech Cybersecurity Standards Decoder",blurb:"FDA Section 524B, IEC 81001-5-1, AAMI TIR57, ISO 14971 and more - what they require, how they connect, and what the FDA expects to see.",tag:"Standards"},{slug:"fda-cybersecurity-deficiency-response-checklist",title:"FDA Cybersecurity Deficiency Response Checklist",blurb:"Step-by-step checklist for responding to FDA cybersecurity deficiency letters without losing your submission timeline.",tag:"FDA"},{slug:"12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions",title:"12 Reasons the FDA Rejects Cybersecurity Submissions",blurb:"The most common deficiencies we see in 510(k), De Novo, and PMA cybersecurity packages - and how to avoid each one.",tag:"FDA"},{slug:"12-critical-findings-from-medical-device-penetration-tests",title:"12 Critical Findings from Medical Device Pen Tests",blurb:"Real, recurring vulnerabilities we uncover during penetration testing on Class II/III connected medical devices.",tag:"Pen Testing"},{slug:"12-critical-threat-modeling-gaps-medical-device-submissions",title:"12 Critical Threat-Modeling Gaps in Submissions",blurb:"Where threat models fall short of FDA expectations under the 2026 cybersecurity guidance - and how to fix the gaps.",tag:"Threat Modeling"},{slug:"medical-device-cybersecurity-spdf-playbook",title:"The SPDF Playbook",blurb:"A practical playbook for implementing the Secure Product Development Framework across your QMS and SDLC.",tag:"SPDF"},{slug:"estar-v7-cybersecurity-mapping-fda-2026-guidance",title:"eSTAR v7.0 Cybersecurity Attachments: How the 8 Slots Map to the FDA's 2026 Guidance",blurb:"Side-by-side mapping of the 8 Cybersecurity attachment slots in eSTAR v7.0 to the 15 deliverables in the FDA's February 2026 final guidance, with the most common RTA trigger per slot.",tag:"FDA",updatedAt:"2026-07-25"},{slug:"fda-cybersecurity-testing-requirements-taxonomy",title:"FDA Cybersecurity Testing Requirements: The Complete 2026 Taxonomy",blurb:"Ten families of cybersecurity testing the Feb 2026 guidance expects, mapped to eSTAR v7.0 slots and recognized standards.",tag:"FDA",updatedAt:"2026-06-11"},{slug:"cybersecurity-management-plan-fda-medical-devices",title:"Cybersecurity Management Plan for FDA Submissions: A 2026 Guide",blurb:"What goes in the Cybersecurity Management Plan reviewers expect in eSTAR v7.0 Slot 1: scope, governance, QMS integration, postmarket commitments, and the most common deficiency patterns.",tag:"FDA",updatedAt:"2026-06-11"},{slug:"fda-security-control-categories-medical-devices",title:"FDA Security Control Categories: What Reviewers Expect Per Category",blurb:"The 8 security control categories every cyber device must cover, and the evidence FDA expects for each one.",tag:"FDA",updatedAt:"2026-06-11"}
209,{slug:"medical-device-vdp-cvd-workflows-guide",title:"VDP and CVD Workflows for Medical Devices",blurb:"Stand up a Vulnerability Disclosure Program and Coordinated Vulnerability Disclosure workflow that satisfies FDA, aligns to ISO/IEC 29147 / 30111, and actually works for a small MedTech security team.",tag:"Postmarket",updatedAt:"2026-05-23"},{slug:"postmarket-cybersecurity-readiness-plan",title:"Postmarket Cybersecurity Readiness Plan",blurb:"What you need in place after clearance to satisfy FDA postmarket expectations and stay ahead of vulnerabilities.",tag:"Postmarket"},{slug:"10-reasons-medical-device-cybersecurity-vendors-fail-you",title:"10 Reasons Cybersecurity Vendors Fail MedTech",blurb:"Why generic IT-security vendors keep blowing FDA submissions - and what to demand from a true MedTech specialist.",tag:"Vendor Selection"},{slug:"fda-2025-ai-enabled-device-software-functions-guidance-decoded",title:"FDA 2025 AI-Enabled Device Software Functions Guidance, Decoded",blurb:"Plain-English breakdown of FDA's 2025 draft AI guidance: what it adds beyond PCCP and GMLP, transparency labeling expectations, and what reviewers want to see.",tag:"AI/ML",updatedAt:"2026-05-08"},{slug:"pccp-template-ai-ml-medical-devices",title:"PCCP Template & Worked Example for AI/ML Medical Devices",blurb:"How to write a Predetermined Change Control Plan FDA will accept - structure, the three required components, performance bounds, and a worked example.",tag:"AI/ML",updatedAt:"2026-05-08"},{slug:"gmlp-controls-crosswalk-medical-devices",title:"GMLP Crosswalk: 10 Principles to Engineering Controls",blurb
209:"Each of the FDA/Health Canada/MHRA Good Machine Learning Practice principles mapped to concrete engineering, QMS, and documentation controls.",tag:"AI/ML",updatedAt:"2026-05-08"},{slug:"aami-cr34971-ai-risk-management-explained",title:"AAMI CR34971 Explained: AI Risk Management for Medical Devices",blurb:"What CR34971 adds on top of ISO 14971, the AI-specific risk categories it covers, and how to integrate it with your existing risk file.",tag:"AI/ML",updatedAt:"2026-05-08"},{slug:"fda-medical-device-threat-model-template",title:"FDA-Grade Medical Device Threat Model: Template & Worked Example",blurb:"Step-by-step template to build a threat model FDA reviewers will accept - architecture views, STRIDE, safety mapping, control traceability, and a worked example.",tag:"Threat Modeling",updatedAt:"2026-05-08"},{slug:"fda-penetration-testing-scope-510k",title:"FDA Penetration Testing Scope: 510(k), De Novo, PMA & IDE",blurb:"How to scope penetration testing for an FDA submission so the report holds up under reviewer scrutiny. Required attack surfaces, evidence depth, and how scope differs by pathway.",tag:"Penetration Testing",updatedAt:"2026-08-01"},{slug:"aami-cr515-ml-medical-device-cybersecurity",title:"AAMI CR515:2025: ML Medical Device Cybersecurity (2026)",blurb:"What AAMI CR515:2025 covers for machine learning-enabled devices, the ML threats generic threat modeling misses, and how it interlocks with GMLP, PCCP, AIBOM, and Section 524B.",tag:"AI/ML",updatedAt:"2026-09-02"},{slug:"aibom-medical-devices",title:"AIBOM for Medical Devices: AI Bill of Materials (2026)",blurb:"What an AI bill of materials is, how it differs from an SBOM, the fields the FDA expects for AI-enabled devices, and how to generate one in CycloneDX or SPDX.",tag:"AI/ML",updatedAt:"2026-08-02"},{slug:"fda-sbom-requirements",title:"FDA SBOM Requirements for Medical Devices (2026)",blurb:"FDA SBOM requirements for medical devices: required format, the seven minimum elements, vulnerability mapping, submission deadlines, and the most-cited reviewer deficiencies.",tag:"SBOM",updatedAt:"2026-08-02"},{slug:"validating-cybersecurity-tools-iso-tr-80002-2",title:"ISO/TR 80002-2 and Validating Cybersecurity Tools (2026)",blurb:"ISO/TR 80002-2:2017 governs validation of non-device software used in the quality system. How it applies to SBOM generators, SCA scanners, threat modeling tools, and signing pipelines.",tag:"Standards",updatedAt:"2026-09-01"},{slug:"iec-60601-medical-device-cybersecurity",title:"IEC 60601 and Cybersecurity: What It Covers (2026)",blurb:"IEC 60601 is an electrical safety and EMC family, not a cybersecurity standard. What each sub-part covers, where it touches security, and the standards that actually apply.",tag:"Standards",updatedAt:"2026-08-05"},{slug:"fda-sbom-format-requirements",title:"What SBOM Format Does the FDA Require? (2026)",blurb:"The FDA accepts CycloneDX and SPDX SBOMs in machine-readable form. Version floors, file types, required fields, and the format mistakes that trigger deficiencies.",tag:"SBOM",updatedAt:"2026-08-02"},{slug:"sbom-510k-submission",title:"SBOM in a 510(k) Submission: Where It Goes (2026)",blurb:"Where the SBOM belongs in a 510(k) eSTAR submission, what has to accompany it, how
209it ties to the vulnerability assessment, and the placement errors that trigger deficiencies.",tag:"SBOM",updatedAt:"2026-08-02"},{slug:"supplier-sbom-responsibility-medical-devices",title:"Who Is Responsible for Supplier SBOMs? (2026)",blurb:"Supplier SBOM responsibility under FDA Section 524B: the manufacturer owns the device SBOM, what to require in supplier contracts, and how to document gaps reviewers will accept.",tag:"SBOM",updatedAt:"2026-08-02"},{slug:"pass-fda-510k-cybersecurity-first-submission",title:"How to Pass FDA 510(k) Cybersecurity on the First Submission",blurb:"The exact cybersecurity package that gets through 510(k) review without an AI letter. Eight artifacts, common rejection patterns, and a 30-day pre-submission readiness check.",tag:"510(k)",updatedAt:"2026-05-08"},{slug:"pma-cybersecurity-full-service-guide",title:"Full-Service Cybersecurity for PMA Submissions",blurb:"Everything a Class III PMA cybersecurity package needs - and how a single integrated team delivers threat modeling, SBOM, pen testing, postmarket plan, and reviewer engagement.",tag:"PMA",updatedAt:"2026-05-08"},{slug:"postmarket-sbom-maintenance-medical-devices",title:"Postmarket SBOM Maintenance for Medical Devices",blurb:"How to maintain SBOMs across a fleet of cleared devices - regeneration cadence, vulnerability triage, VEX, and the postmarket cybersecurity plan that ties it together.",tag:"Postmarket",updatedAt:"2026-05-08"},{slug:"premarket-fda-cybersecurity-submission-checklist",title:"Premarket FDA Cybersecurity Submission Checklist (2026)",blurb:"A printable, item-by-item checklist for the cybersecurity content of an FDA premarket submission - aligned to the February 2026 final guidance.",tag:"Checklist",updatedAt:"2026-05-08"},{slug:"fda-cybersecurity-deficiency-letter-response-playbook",title:"FDA Cybersecurity Deficiency Response Timeline and Sequencing",blurb:"A field-tested playbook for responding to FDA cybersecurity deficiencies inside the 180-day clock - triage, gap analysis, fix sequence, and reviewer-ready format.",tag:"Deficiency Response",updatedAt:"2026-05-08"}],Ww=[{slug:"fda-cybersecurity-requirements-medical-devices-2026",title:"FDA Cybersecurity Requirements for Medical Devices (2026)",category:"FDA"},{slug:"the-role-of-mds2-in-medical-device-cybersecurity",title:"The Role of MDS² in Medical Device Cybersecurity",category:"Standards"},{slug:"the-top-50-cybersecurity-issues-with-medical-devices",title:"The Top 50 Cybersecurity Issues with Medical Devices",category:"Risk"},{slug:"a-guide-to-conducting-a-medical-device-security-audit-for-manufacturers",title:"Conducting a Medical Device Security Audit",category:"Audits"},{slug:"iso-14971-its-crucial-role-in-medical-device-security-and-connection-with-aami-tir57",title:"ISO 14971 + AAMI TIR57: The Connection",category:"Standards"},{slug:"iso-14971-risk-management-in-medical-device-security",title:"ISO 14971 Risk Management for Medical Device Security",category:"Risk"},{slug:"corrective-and-preventive-actions-capa-in-medical-device-cybersecurity",title:"CAPA in Medical Device Cybersecurity",category:"Quality"},{slug:"a-comprehensive-guide-to-software-testing-for-medical-devices",title:"A Comprehensive Guide to Software Testing for Medical Devices",category:"Testing"},{slug:"a-comprehensive-guide-to-risk-based-testing-for-medical-device-software",title:"Risk-Based Testing for Medical Device Software",category:"Testing"},{slug:"secure-software-development-for-medical-devices-ensuring-safety-and-compliance",title:"Secure Software Development for Medical Devices",category:"SDLC"},{slug:"medical-device-cybersecurity-best-practices",title:"Medical Device Cybersecurity: 2026 Best Practices Guide",category:"Best Practices"},{slug:"integrating-cybersecurity-assessments-into-the-medical-device-lifecycle",title:"Integrating Cybersecurity Across the Device Lifecycle",category:"Lifecycle"},{slug:"managing-connected-medical-devices-a-strategic-approach",title:"Managing Connected Medical Devices: A Strategic Approach",category:"Strategy"},{slug:"securing-iot-enabled-medical-devices-5-essential-tips",title:"Securing IoT-Enabled Medical Devices: 5 Essential Tips",category:"IoT"},{slug:"securing-communication-protocols-in-medical-devices",title:"Securing Communication Protocols in Medical Devices",category:"Networking"},{slug:"510k-cybersecurity-requirements-every-maker-must-meet",title:"510(k) Cybersecurity Requirements Every Maker Must Meet",category:"FDA"},{slug:"21-cfr-part-820-and-its-role-in-medical-device-cybersecurity",title:"21 CFR Part 820 and Medical Device Cybersecurity",category:"Quality"},{slug:"a-step-by-step-guide-to-threat-modeling-connected-and-implantable-medical-devices",title:"Threat Modeling Connected & Implantable Devices",category:"Threat Modeling",publishedAt:"2026-04-01T00:00:00+00:00"},{slug:"aami-tir57-risk-management-for-medical-device-security",title:"AAMI TIR57 Risk Management for Medical Devices",category:"Standards"},{slug:"25-use-cases-for-white-box-penetration-testing",title:"25 Use Cases for White-Box Penetration Testing",category:"Pen Testing"},{slug:"a-guide-to-hacker-hat-colors",title:"A Guide to Hacker Hat Colors",category:"Primer"},{slug:"brainjacking-cyber-physical-threat-neurotech",title:"Brainjacking: The Real Cyber-Physical Threat to NeuroTech",category:"Threat Modeling"}],IN={name:"The Med Device Cyber Podcast",formerName:"Reinventing Cybersecurity",url:"https://mdcpodcast.com/",host:"Christian Espinosa",blurb
209:"A medical device cybersecurity podcast: candid conversations with regulatory leads, founders, and security engineers on FDA Section 524B, threat modeling, SBOMs, and postmarket vulnerability management."},MI={"samd-vs-simd":"/blog/samd-vs-simd-what-medical-device-manufacturers-need-to-know","telemedicine-cybersecurity-risks":"/services/fda-postmarket-cybersecurity-services","uncovering-btle-vulnerabilities":"/services/medical-device-penetration-testing","what-is-a-laboratory-information-system-lis":"/blog","a-guide-to-cryptographically-secure-pseudo-random-number-generators-csprng":"/services/fda-compliant-sbom-services-for-medtech","message-authentication-codes-in-cybersecurity":"/services/medical-device-penetration-testing#methodology","touchscreen-vulnerabilities-addressing-hidden-risks":"/services/medical-device-penetration-testing","what-is-a-cybersecurity-fault-tree-analysis":"/services/medical-device-threat-modeling","what-are-hardcoded-passwords-in-software":"/services/medical-device-penetration-testing","defining-residual-risk":"/services/medical-device-threat-modeling","risk-registers-explained":"/services/medical-device-threat-modeling","a-guide-to-hardware-security-modules-hsms":"/services/fda-premarket-cybersecurity-services","exploring-common-embedded-operating-systems":"/services/medical-device-penetration-testing","network-segmentation-as-a-security-strategy":"/services/medical-device-penetration-testing","what-is-code-signing":"/services/fda-premarket-cybersecurity-services","code-integrity-with-secure-boot":"/services/fda-premarket-cybersecurity-services","what-is-the-kev":"/services/fda-postmarket-cybersecurity-services","defense-in-depth-layered-security-strategies":"/services/medical-device-penetration-testing","cybersecurity-risk-matrices-explained":"/services/medical-device-threat-modeling","the-overlooked-danger-of-firmware-attacks":"/services/medical-device-penetration-testing","verification-vs-validation-in-software-development":"/guides/medical-device-cybersecurity-spdf-playbook","rfid-hacking-protection-strategies":"/services/wireless-penetration-testing","the-capa-and-fmea-relationship":"/services/fda-postmarket-cybersecurity-services","constrained-interfaces-and-cybersecurity-effects":"/services/medical-device-penetration-testing","exploitability-vs-likelihood-in-cybersecurity-risk":"/services/medical-device-threat-modeling","exploring-the-cybersecurity-and-infrastructure-security-agency-cisa-known-exploited-vulnerabilities-catalog":"/services/fda-postmarket-cybersecurity-services","what-is-rfid-cloning":"/services/wireless-penetration-testing","what-is-the-mitre-attck-framework":"/services/medical-device-threat-modeling","rtos-a-comprehensive-guide":"/services/medical-device-penetration-testing","fda-medical-device-cybersecurity-guidance-2026":"/guides/fda-cybersecurity-guidance","how-to-meet-fda-524b-cybersecurity-requirements":"/guides/fda-cybersecurity-guidance","fda-estar-cybersecurity-documentation-a-510k-field-guide":"/blog/510k-cybersecurity-requirements-every-maker-must-meet","pma-de-novo-510k-cybersecurity-fda-submissions":"/blog/510k-cybersecurity-requirements-every-maker-must-meet","what-is-a-risk-management-file-for-fda-medical-device-cybersecurity":"/blog/medical-device-cybersecurity-risk-analysis-the-fda-playbook","buffer-overflow-attacks-prevention-tips":"/services/medical-device-penetration-testing","protecting-against-rfid-attacks-what-you-need-to-know":"/services/wireless-penetration-testing","quantum-key-distribution-explained":"/services/fda-premarket-cybersecurity-services","the-clipper-chip-controversy-encryption-privacy-and-government-surveillance":"/services/fda-premarket-cybersecurity-services","the-importance-of-regression-testing-in-cybersecurity":"/guides/medical-device-cybersecurity-spdf-playbook","the-relationship-between-verification-validation-and-cybersecurity-testing":"/guides/medical-device-cybersecurity-spdf-playbook","top-nfc-vulnerabilities":"/services/wireless-penetration-testing","where-did-2600-come-from":"/leadership","cybersecurity-traceability-matrices-explained":"/blog/medical-device-cybersecurity-traceability","what-is-a-cyber-device-understanding-fdas-latest-definition":"/blog/what-is-a-medical-cyber-device-unraveling-the-fdas-cyber-device-definition","authenticator-apps-vs-sms-for-two-factor-authentication-which-is-safer":"/blog/fda-medical-device-cybersecurity-requirements-security-controls-for-authentication-and-authorization","how-is-xor-used-in-encryption":"/blog/medical-device-key-exchange-cybersecurity","covert-channels-using-lan-turtles":"/blog/cybersecurity-attack-entry-points-for-medical-devices","homeland-episode-with-pacemaker-attack-assessing-the-realism":"/blog/the-dangers-of-pacemaker-hacks-what-you-need-to-know","dns-exfiltration-with-base64-encoding-a-stealthy-data-theft-technique":"/blog/cybersecurity-attack-entry-points-for-medical-devices","why-is-insecure-used-instead-of-unsecure-in-cybersecurity":"/blog","what-is-an-xxe-attack-in-cybersecurity":"/blog/medical-device-sql-injection-parameterized-queries","unsigned-vs-signed-integer":"/blog/embedded-cybersecurity-challenges","3-ways-to-break-e
209ncryption":"/blog/understanding-relevant-threats-for-medical-devices","the-role-of-mds%C2%B2-in-medical-device-cybersecurity":"/blog/the-role-of-mds2-in-medical-device-cybersecurity","the-role-of-mds²-in-medical-device-cybersecurity":"/blog/the-role-of-mds2-in-medical-device-cybersecurity","iatf-16949-and-medical-device-cybersecurity":"/blog/iso-13485-and-its-relation-to-medical-device-cybersecurity","how-does-medical-device-cybersecurity-relate-to-iso-9001":"/blog/iso-13485-and-its-relation-to-medical-device-cybersecurity","iso-27001-and-medical-device-cybersecurity":"/blog/why-iso-27001-and-soc-2-are-not-enough-for-fda-medical-device-cybersecurity","enhancing-cybersecurity-a-guide-to-fault-tree-analysis-fta":"/services/medical-device-threat-modeling","the-importance-of-open-box-testing-in-medical-device-cybersecurity":"/blog/closed-box-testing-in-medical-device-cybersecurity","ajax-vulnerabilities-medical-device-cybersecurity":"/services/medical-device-penetration-testing","url-encoding-medical-device-web-security":"/services/medical-device-penetration-testing","cybersecurity-in-the-coap-medical-device-protocol":"/blog/securing-communication-protocols-in-medical-devices","cybersecurity-for-medical-devices-with-narrowband-iot-protocol":"/blog/securing-communication-protocols-in-medical-devices","ivd-cybersecurity-concerns":"/blog/cybersecurity-risk-with-ivd-medical-devices","ensuring-cybersecurity-for-medical-devices-with-mqtt-technology":"/blog/mqtt-vulnerabilities-connected-medical-devices-fda","enhancing-cybersecurity-for-ant-ant-medical-devices":"/services/wireless-penetration-testing","former-cybersecurity-employees-indicted-in-medical-device-company-hack":"/services/fda-postmarket-cybersecurity-services","when-cybersecurity-becomes-a-crime-what-the-illumina-case-signals-for-medical-device-makers":"/services/fda-postmarket-cybersecurity-services","spdf-cybersecurity-documentation-what-fda-reviewers-expect":"/guides/medical-device-cybersecurity-spdf-playbook","medtech-cyber-standards-every-device-team-must-know":"/guides/the-medtech-cybersecurity-standards-decoder","a-guide-to-fmea-failure-mode-and-effects-analysis":"/guides/security-risk-assessment-iec-81001-5-1","a-guide-to-rfcs":"/blog","a-guide-to-symmetric-key-encryption":"/guides/fda-security-control-categories-medical-devices","acls-in-cybersecurity-managing-access-control-effectively":"/guides/fda-security-control-categories-medical-devices","biometric-security-and-the-gummy-bear-attack":"/blog","leveraging-the-owasp-top-10-framework-for-secure-applications":"/services/medical-device-penetration-testing","ot-vs-it-security-differences-that-matter":"/guides/medical-device-cybersecurity-spdf-playbook","the-challenge-of-attribution-in-cyber-attacks":"/blog","the-seven-principles-of-software-testing":"/guides/fda-cybersecurity-testing-requirements-taxonomy","25-use-cases-for-white-box-penetration-testing":"/services/medical-device-penetration-testing","a-guide-to-hacker-hat-colors":"/blog","alternatives-to-tor-accessing-the-dark-web-safely":"/blog","command-shell-via-sql-injection-on-login-page":"/services/medical-device-penetration-testing","comparing-wafs-and-reverse-proxies":"/guides/fda-security-control-categories-medical-devices","debunking-cell-phone-cloning-myths":"/blog","differences-between-obfuscation-and-encryption":"/guides/fda-security-control-categories-medical-devices","nonce-understanding-the-concept-and-its-importance":"/guides/fda-security-control-categories-medical-devices","shodan-io-the-search-engine-for-hackers":"/blog","sqlmap-tutorial-mastering-sql-injection-detection-and-exploitation":"/services/medical-device-penetration-testing","the-role-of-input-validation-in-preventing-attacks":"/guides/fda-security-control-categories-medical-devices","the-role-of-non-executable-stacks-in-preventing-buffer-overflows":"/guides/fda-security-control-categories-medical-devices","tlsv1-3-an-introduction-and-overview":"/guides/fda-security-control-categories-medical-devices","understanding-aslr-and-buffer-overflow-attacks":"/guides/fda-security-control-categories-medical-devices","understanding-replay-attacks-in-cybersecurity":"/guides/stride-threat-modeling-medical-devices","understanding-suid-attacks-and-how-to-protect-against-them":"/blog","understanding-vapt-more-than-just-penetration-testing":"/services/medical-device-penetration-testing","what-is-a-salami-attack":"/blog","what-is-a-software-defined-radio":"/guides/penetration-testing-for-medical-devices","what-is-an-interpreted-programming-language":"/blog","what-is-electronic-frontier-foundation-eff":"/blog","what-is-self-aware-ai":"/guides/eu-ai-act-vs-fda-ai-ml-cybersecurity","the-rise-of-nfc-attacks-how-to-protect-your-devices":"/blog/nfc-and-medical-device-cybersecurity","fuzz-testing-in-medical-device-cybersecurity":"/blog/enhancing-medical-device-cybersecurity-robustness-and-fuzz-testing-explained","medical-device-software-testing":"/blog/a-comprehe
209nsive-guide-to-software-testing-for-medical-devices","automated-testing-for-medical-device-software-ensuring-efficiency-and-reliability":"/blog/a-comprehensive-guide-to-software-testing-for-medical-devices","navigating-the-evolving-cybersecurity-landscape-for-medical-devices":"/blog/the-importance-of-cybersecurity-in-the-medical-device-industry","medical-device-security-testing-complete-taxonomy":"/guides/fda-cybersecurity-testing-requirements-taxonomy","fda-cybersecurity-guidance-what-device-makers-must-know":"/guides/fda-cybersecurity-guidance","fda-cybersecurity-requirements-medical-devices-2026":"/guides/fda-cybersecurity-guidance","fda-cybersecurity-pma-deficiencies-complete-response-letters":"/guides/fda-pma-cybersecurity-requirements","aami-tir57-risk-management-for-medical-device-security":"/guides/aami-tir57-vs-tir97-comparison","how-to-respond-to-a-510k-cybersecurity-deficiency-letter":"/guides/fda-cybersecurity-deficiency-letter-response-playbook","what-are-fda-deficiency-letters-for-medical-devices":"/blog/fda-deficiency-letter-vs-rta-vs-hold-letter","penetration-testing-for-medical-devices-what-fda-expects":"/blog/fda-penetration-testing-requirements-medical-devices","stride-threat-modeling-for-connected-medical-devices":"/guides/stride-threat-modeling-medical-devices","importance-of-data-flow-diagrams-in-security":"/blog/data-flow-diagrams-medical-device-cybersecurity","the-importance-of-in-depth-attack-surface-analysis-for-medical-device-testing":"/blog/understanding-medical-device-attack-surface-analysis","what-is-a-coordinated-vulnerability-disclosure-process":"/guides/coordinated-vulnerability-disclosure-medical-devices","the-role-of-mds%c2%b2-in-medical-device-cybersecurity":"/blog/the-role-of-mds2-in-medical-device-cybersecurity","what-does-temporal-mean-in-cvss":"/blog/cvss-3-1-vs-4-0-medical-devices","nfc-vs-rfid-which-is-more-secure":"/blog/nfc-and-medical-device-cybersecurity","top-rfid-cybersecurity-vulnerabilities":"/blog/rfid-medical-devices-cybersecurity","covert-vs-overt-channels-in-cybersecurity-understanding-the-difference":"/guides/penetration-testing-for-medical-devices","what-is-uefi-secure-boot":"/blog/top-10-embedded-operating-systems-for-medical-devices","what-is-volatile-memory":"/blog/write-blocker-medical-device-cybersecurity","gps-system-vulnerabilities-and-countermeasures":"/guides/penetration-testing-for-medical-devices","creating-effective-password-wordlists":"/guides/penetration-testing-for-medical-devices","discovering-the-google-hacking-database":"/services/medical-device-penetration-testing","twofish-vs-blowfish-a-comparison-of-two-popular-encryption-algorithms":"/services/fda-compliant-sbom-services-for-medtech","what-is-imei-the-unique-identifier-for-your-mobile-device":"/guides/penetration-testing-for-medical-devices"},RI=[...PI,...jI],$w=[..._I,...II],Hw=e=>e.replace(/\s*[---]\s*Blue Goat Cyber\s*$/i,"").replace(/\s*\|\s*Blue Goat Cyber\s*$/i,"").trim(),OI=Object.fromEntries(Ww.map(e=>[e.slug,e.category])),xf=Object.fromEntries(zw.map(e=>[e.slug,e.tag])),FI=[{category:"FDA",test:/\bfda\b|510\(?k\)?|de novo|premarket|postmarket|\bpma\b|estar|524b|deficiency|guidance/i},{category:"Threat Modeling",test:/threat model|stride|dread|pasta|attack tree/i},{category:"Pen Testing",test:/pen[- ]?test|penetration|red team|fuzz/i},{category:"AI & ML",test:/\bai\b|machine learning|gmlp|pccp|\bml\b|\bllm\b|neural/i},{category:"SBOM & Supply Chain",test:/\bsbom\b|software bill of materials|cyclonedx|spdx|\bvex\b|supply chain|third[- ]party/i},{category:"Standards",test:/\biec\b|\biso\b|aami|tir57|tir97|sw96|81001|62304|14971|13485|\bnist\b|hipaa|hitrust|soc ?2|mds2|mds²|iatf|\bgmp\b|qmsr|\bqsr\b|openssf|labeling|labelling|traceability|standard/i},{category:"Cryptography",test:/encrypt|cipher|blowfish|twofish|\baes\b|\brsa\b|\btls\b|\bssl\b|certificate|signing|secure boot|uefi|hashing|cryptograph/i},{category:"IoT & Connected Devices",test:/\biot\b|\biomt\b|\bble\b|bluetooth|\bnfc\b|\brfid\b|zigbee|connected device|embedded|wearable|implant|infusion pump|pacemaker|insulin|patient monitor|surgical robot|\brobot|augmented reality|\bdicom\b|imaging|radiology|contact lens|\bivd\b|in vitro/i},{category:"Networking",test:/\bnetwork\b|firewall|\bvpn\b|segmentation|wifi|wi-fi|\bota\b|\bport\b|protocol/i},{category:"Identity & Access",test:/authenticat|password|\bmfa\b|\bsso\b|identity|access control|\brbac\b|iris|biometric/i},{category:"Lifecycle",test:/lifecycle|legacy|end[- ]of[- ]life|sunset|maintenance|update|\bpatch/i},{category:"Testing",test:/\btest\b|\bqa\b|verification|validation|\bxss\b|injection/i},{category:"SDLC",test:/\bsdlc\b|spdf|secure develop|devsecops|sprint|agile/i},{category:"Strategy",test:/strategy|roadmap|program|governance|leadership|founder|growth|market|competitive/i},{category:"Risk",test:/\brisk\b|hazard|fmea|vulnerabilit|\bcve\b|\bkev\b|exploit|incident/i}],NI={Audits:"Standards","Threat Intel":"Risk","Web Security":"Testing",IoT:"IoT & Connected Devices",SBOM:"SBOM & Supply Chain","Best Practices":"Fundamentals"},Vw=(e,t,i)=>{let r=e;if(r==="Primer"){const s=`${t} ${i.join(" ")}`,n=FI.find(o=>o.test.test(s));
209r=n?n.category:"Fundamentals"}return NI[r]??r},LI=[{tag:"AI/ML",test:(e,t)=>/\bai\/ml\b|machine learning|gmlp|pccp|cr34971/i.test(t)},{tag:"FDA",test:(e,t)=>/\bfda\b|510\(?k\)?|de novo|premarket|postmarket|pma|estar|524b|deficiency/i.test(t)},{tag:"Standards",test:(e,t)=>/\biec\b|\biso\b|aami|tir57|sw96|81001|62304|14971|sbom|standards|decoder/i.test(t)},{tag:"Threat Modeling",test:(e,t)=>/threat model/i.test(t)},{tag:"Pen Testing",test:(e,t)=>/pen[- ]?test|penetration/i.test(t)},{tag:"SPDF",test:(e,t)=>/spdf|secure product develop/i.test(t)},{tag:"Postmarket",test:(e,t)=>/postmarket|legacy/i.test(t)},{tag:"Vendor Selection",test:(e,t)=>/vendor|provider|buyer/i.test(t)},{tag:"Risk",test:(e,t)=>/risk|fmea|hazard/i.test(t)},{tag:"Standards",test:()=>!0}],BI=(e,t)=>{if(xf[e])return xf[e];for(const i of LI)if(i.test(e,t))return i.tag;return"Standards"},jN=[{name:"Start here",slug:"start-here",blurb:"Foundational pillars for teams new to FDA medical device cybersecurity."},{name:"Premarket & submission",slug:"premarket-submission",blurb:"510(k), De Novo, PMA, and eSTAR-ready deliverables for premarket filings."},{name:"Threat modeling & risk",slug:"threat-modeling-risk",blurb:"STRIDE, ISO 14971, and hazard analysis artifacts reviewers accept."},{name:"SBOM & supply chain",slug:"sbom-supply-chain",blurb:"SBOM generation, VEX, and third-party vulnerability management."},{name:"Testing & evidence",slug:"testing-evidence",blurb:"Penetration testing, security controls, and testing taxonomy proof."},{name:"Postmarket & deficiency response",slug:"postmarket",blurb:"Monitoring, CVD, legacy devices, and FDA deficiency letter workflows."},{name:"Standards & cross-regulatory",slug:"standards-cross-regulatory",blurb:"EU MDR, AI Act, IVD, SaMD, HIPAA, and cross-framework crosswalks."}],UI={"fda-524b-cybersecurity-requirements-explained":"Start here","the-medtech-cybersecurity-standards-decoder":"Start here","medical-device-cybersecurity-spdf-playbook":"Start here","fda-cybersecurity-guidance":"Start here","10-reasons-medical-device-cybersecurity-vendors-fail-you":"Start here","fda-premarket-cybersecurity-submission-checklist":"Premarket & submission","fda-premarket-cybersecurity-deliverables-estar-map":"Premarket & submission","estar-v7-cybersecurity-mapping-fda-2026-guidance":"Premarket & submission","fda-cybersecurity-rta-prevention-checklist":"Premarket & submission","fda-cybersecurity-technical-screening-checklist":"Premarket & submission","fda-pathway-cybersecurity-differences":"Premarket & submission","fda-pma-cybersecurity-requirements":"Premarket & submission","de-novo-cybersecurity-submission-guide":"Premarket & submission","fda-pccp-change-control-plans":"Premarket & submission","cybersecurity-management-plan-fda-medical-devices":"Premarket & submission","combination-product-cybersecurity-fda":"Premarket & submission","stride-threat-modeling-medical-devices":"Threat modeling & risk","12-critical-threat-modeling-gaps-medical-device-submissions":"Threat modeling & risk","security-risk-assessment-iec-81001-5-1":"Threat modeling & risk","iso-14971-vs-aami-tir57-hazard-analysis":"Threat modeling & risk","aami-tir57-vs-tir97-comparison":"Threat modeling & risk","sbom-for-medical-devices":"SBOM & supply chain","sbom-vulnerability-management-medical-devices":"SBOM & supply chain","cyclonedx-vs-spdx-medical-devices":"SBOM & supply chain","cpe-vs-purl-sbom-medical-devices":"SBOM & supply chain","vex-document-medical-device-fda":"SBOM & supply chain","penetration-testing-for-medical-devices":"Testing & evidence","12-critical-findings-from-medical-device-penetration-tests":"Testing & evidence","fda-cybersecurity-testing-requirements-taxonomy":"Testing & evidence","fda-security-control-categories-medical-devices":"Testing & evidence","fda-security-requirements-testing-guide":"Testing & evidence","postmarket-cybersecurity-monitoring-program":"Postmarket & deficiency response","postmarket-cybersecurity-readiness-plan":"Postmarket & deficiency response","legacy-medical-device-cybersecurity":"Postmarket & deficiency response","coordinated-vulnerability-disclosure-medical-devices":"Postmarket & deficiency response","medical-device-vdp-cvd-wor
209kflows-guide":"Postmarket & deficiency response","medical-device-incident-response-plan-fda":"Postmarket & deficiency response","fda-cybersecurity-deficiency-letter-examples":"Postmarket & deficiency response","fda-cybersecurity-deficiency-response-checklist":"Postmarket & deficiency response","12-reasons-the-fda-rejects-medical-device-cybersecurity-submissions":"Postmarket & deficiency response","eu-mdr-vs-fda-cybersecurity":"Standards & cross-regulatory","eu-ai-act-vs-fda-ai-ml-cybersecurity":"Standards & cross-regulatory","samd-cybersecurity-requirements":"Standards & cross-regulatory","cybersecurity-for-ivd-devices":"Standards & cross-regulatory","hhs-hph-cpgs-medical-device-manufacturers":"Standards & cross-regulatory","gtm-compliance-crosswalk-fda-soc2-hipaa-hitrust-gdpr":"Standards & cross-regulatory","iec-60601-medical-device-cybersecurity":"Standards & cross-regulatory","validating-cybersecurity-tools-iso-tr-80002-2":"Standards & cross-regulatory","aami-cr515-ml-medical-device-cybersecurity":"Standards & cross-regulatory","aami-cr34971-ai-risk-management-explained":"Standards & cross-regulatory","fda-2025-ai-enabled-device-software-functions-guidance-decoded":"Standards & cross-regulatory","gmlp-controls-crosswalk-medical-devices":"Standards & cross-regulatory","ide-cybersecurity-requirements-guide":"Premarket & submission","ide-cybersecurity-submission-guide":"Premarket & submission","pccp-template-ai-ml-medical-devices":"Premarket & submission","pass-fda-510k-cybersecurity-first-submission":"Premarket & submission","pma-cybersecurity-full-service-guide":"Premarket & submission","premarket-fda-cybersecurity-submission-checklist":"Premarket & submission","fda-medical-device-threat-model-template":"Threat modeling & risk","fda-penetration-testing-scope-510k":"Testing & evidence","fda-sbom-requirements":"SBOM & supply chain","fda-sbom-format-requirements":"SBOM & supply chain","sbom-510k-submission":"SBOM & supply chain","supplier-sbom-responsibility-medical-devices":"SBOM & supply chain","aibom-medical-devices":"SBOM & supply chain","postmarket-sbom-maintenance-medical-devices":"SBOM & supply chain","fda-cybersecurity-deficiency-letter-response-playbook":"Postmarket & deficiency response"},Gw=e=>{const t=UI[e];return t||(typeof console<"u","Start here")},Kw=(e,t)=>{const i=`${e} ${t}`.toLowerCase();return/checklist|response steps|step[- ]by[- ]step|deficiency response/.test(i)?"Checklist":/playbook|runbook|plan\b|workflow|how to|template/.test(i)?"Playbook":"Reference"},Xs=new Map;for(const e of RI){if(e.slug==="blog")continue;const t=Hw(e.title),i=OI[e.slug]??e.category??"Primer",r=e.tags&&e.tags.length?e.tags:Array.from(new Set([i])).slice(0,6),s=Vw(i,t,r),n=Xs.get(e.slug);Xs.set(e.slug,{slug:e.slug,title:t,description:e.description??(n==null?void 0:n.description),image:e.image||(n==null?void 0:n.image),imageAlt:e.imageAlt??(n==null?void 0:n.imageAlt),sourceUrl:e.sourceUrl??(n==null?void 0:n.sourceUrl),publishedAt:e.publishedAt??(n==null?void 0:n.publishedAt),category:s,tags:r})}var yy;for(const e of Ww){const t=Xs.get(e.slug),i=e.title||(t==null?void 0:t.title)||e.slug,r=(yy=t==null?void 0:t.tags)!=null&&yy.length?t.tags:[e.category],s=Vw(e.category,i,r);t?Xs.set(e.slug,{...t,title:i,category:s,tags:r,publishedAt:t.publishedAt??e.publishedAt}):Xs.set(e.slug,{slug:e.slug,title:i,description:"",image:"",sourceUrl:`https://bluegoatcyber.com/blog/${e.slug}/`,publishedAt:e.publishedAt,category:s,tags:r})}const qI=(e,t)=>e.publishedAt&&t.publishedAt?t.publishedAt.localeCompare(e.publishedAt):e.publishedAt?-1:t.publishedAt?1:e.title.localeCompare(t.title),Qw=Array.from(Xs.values()).sort(qI),Xw=e=>/^podcast-/.test(e.slug)||e.category==="Podcast",ao=Qw.filter(e=>!Xw(e));Qw.filter(Xw);const zI=new Set([...Object.keys(MI),...qw.filter(Uw).map(e=>e.from).filter(e=>e.startsWith("/blog/")).map(e=>e.slice(6))]),MN=ao.filter(e=>!zI.has(e.slug)),la=new Map,WI="0e58b1b050d75414.png",$I=e=>e&&(e.includes(WI)||e.includes("/imported-images/")||e.includes("/og/guides/")||e.includes("/post-heroes/")?"":e),HI=new Set(["vendor-comparison-sheet","vendor-comparison-sheet-checklist","consultant-evaluation-checklist"]),VI=new Set($w.map(e=>e.slug)),GI=e=>{if(e==="guides"||HI.has(e))return!0;
209if(e.endsWith("-checklist")){const t=e.slice(0,-10);if(VI.has(t))return!0}return!1};for(const e of $w){if(GI(e.slug))continue;const t=Hw(e.title);la.set(e.slug,{slug:e.slug,title:t,blurb:e.description,description:e.description,image:$I(e.image),sourceUrl:e.sourceUrl,tag:BI(e.slug,t),format:Kw(e.slug,t),category:Gw(e.slug)})}for(const e of zw){const t=la.get(e.slug);t?la.set(e.slug,{...t,title:e.title,blurb:e.blurb,tag:e.tag}):la.set(e.slug,{slug:e.slug,title:e.title,blurb:e.blurb,description:e.blurb,image:"",sourceUrl:`https://bluegoatcyber.com/guides/${e.slug}/`,tag:e.tag,format:Kw(e.slug,e.title),category:Gw(e.slug)})}const KI=Array.from(la.values()).sort((e,t)=>e.title.localeCompare(t.title)),RN=e=>ao.find(t=>t.slug===e),ON=e=>KI.find(t=>t.slug===e),FN=(()=>{const e=new Map;for(const t of ao)e.set(t.category,(e.get(t.category)??0)+1);return Array.from(e.entries()).map(([t,i])=>({name:t,count:i})).sort((t,i)=>i.count-t.count||t.name.localeCompare(i.name))})(),NN=(()=>{const e=new Map;for(const t of ao)for(const i of t.tags)e.set(i,(e.get(i)??0)+1);return Array.from(e.entries()).map(([t,i])=>({name:t,count:i})).filter(t=>t.count>=2).sort((t,i)=>i.count-t.count||t.name.localeCompare(i.name))}
209)(),QI=({eyebrow:e="Related deep dives",heading:t="Go deeper on the technical detail",blurb:i,slugs:r,columns:s=3})=>{const n=r.map(c=>ao.find(l=>l.slug===c)).filter(c=>!!c);if(n.length===0)return null;const o=s===2?"grid gap-4 sm:grid-cols-2":"grid gap-4 sm:grid-cols-2 lg:grid-cols-3";return a.jsx("section",{className:"border-t border-border py-14",children:a.jsx("div",{className:"container-x",children:a.jsxs("div",{className:"mx-auto max-w-5xl",children:[a.jsx("span",{className:"font-mono text-[10px] font-semibold uppercase tracking-widest text-accent",children:e}),a.jsx("h2",{className:"mt-2 font-display text-2xl font-bold sm:text-3xl",children:t}),i?a.jsx("p",{className:"mt-3 max-w-2xl text-sm leading-relaxed text-foreground/70",children:i}):null,a.jsx("ul",{className:`mt-8 ${o}`,children:n.map(c=>a.jsx("li",{children:a.jsxs(H,{to:`/blog/${c.slug}`,className:"group flex h-full flex-col rounded-xl border border-border bg-card p-5 transition hover:-translate-y-0.5 hover:border-accent/60 hover:shadow-[var(--shadow-md)]",children:[a.jsx("div",{className:"font-mono text-[10px] font-semibold uppercase tracking-widest text-foreground/50",children:c.category}),a.jsx("div",{className:"mt-1.5 font-display text-base font-semibold leading-snug",children:c.title}),c.description?a.jsx("p",{className:"mt-2 line-clamp-3 flex-1 text-sm leading-relaxed text-foreground/70",children:c.description}):null,a.jsxs("span",{className:"mt-4 inline-flex items-center gap-1.5 text-xs font-semibold text-accent",children:["Read the analysis",a.jsx(Me,{className:"h-3.5 w-3.5 transition-transform group-hover:translate-x-0.5"})]})]})},c.slug))})]})})})},XI=[{slug:"class-ii-samd-imaging-ai",client:"Series-B imaging AI manufacturer (US, ~60 FTEs)",segment:"Imaging & AI/SaMD",deviceClass:"Class II SaMD (De Novo)",timeline:"30-day FDA response window - delivered in 21 days",team:"Lead consultant + threat-modeling engineer + SBOM/pen-test pair (4 people)",standards:["FDA Premarket Cybersecurity Guidance (Feb 3, 2026 final)","AAMI SW96:2023","IEC 81001-5-1","ISO 14971 (security harms)","AAMI TIR57"],techStack:["PyTorch model server behind FastAPI","DICOMweb gateway (Orthanc)","AWS (EKS, S3, KMS, Cognito)","Auth0 federated identity"],challenge:"An FDA reviewer issued a cybersecurity AI Request on a De Novo submission for an AI triage SaMD, citing an incomplete threat model, a non-conformant SBOM, and missing evidence that the model-loading pipeline had been security-tested. The team had 30 days to respond, no in-house cybersecurity lead, and an investor-board commitment to a Q3 commercial launch.",approach:["Reconstructed the threat model in Microsoft Threat Modeling Tool to AAMI SW96 expectations - 47 STRIDE threats across the DICOM gateway, model loader, inference API, and clinician web app, each traced to a 14971 harm and a control","Generated an FDA-compliant CycloneDX 1.5 SBOM for the entire model-serving stack, including transitive Python wheels and the CUDA/cuDNN runtime; mapped 312 components against KEV and EPSS","Ran an authenticated gray-box pen test against the SaMD REST API, the DICOMweb endpoints, and the model-loader (pickle deserialization, model substitution, prompt-injection-style adversarial inputs)","Drafted the deficiency response narrative aligned line-by-line to the reviewer's questions, with a cross-reference matrix back to the SPDF evidence package"],deliverables:["47-threat STRIDE model with traceability matrix to ISO 14971 harms","CycloneDX 1.5 SBOM (312 components) + vulnerability disclosure sheet","Pen test report with 3 highs / 11 mediums and remediation guidance","FDA AI Request response letter (12 pages) with evidence appendices","Updated SPDF cybersecurity plan and postmarket monitoring SOP"],outcome:[{label:"Deficiency cleared in",value:"21 days"},{label:"Final submission outcome",value:"De Novo granted"},{label:"Additional reviewer rounds",value:"0"},{label:"High/critical pen-test findings closed before response",value:"100%"}],lessons:["Pickle-based model loading is the single most common cyber finding we see in PyTorch SaMDs - swap to safetensors before submission, not after","Reviewers want to see the SBOM tied to a vulnerability triage process, not just an inventory - KEV + EPSS scoring closes that loop","Threat models written without explicit harm mapping read as security theater; SW96 traceability is what moves a reviewer"],quote:{text:"We had three weeks to respond and no playbook. Blue Goat dropped in, took ownership of the cyber section, and we cleared on the next round.",attribution:"VP Regulatory, imaging AI manufacturer"},services:["fda-cybersecurity-deficiency-response","medical-device-threat-modeling","fda-compliant-sbom-services-for-medtech","api-penetration-testing"]},{slug:"class-ii-cardiac-monitor",client:"Cardiac remote-monitoring manufacturer (US/EU dual market)",segment:"Cardiovascular",deviceClass:"Class II 510(k)",timeline:"16 weeks pre-submission (Jan - Apr 2025), first-cycle clearance in 84 days",team:"Principal consultant + hardware/RF pen-test lead + firmware reverse engineer + threat-modeling engineer (4 people)",standards:["FDA Premarket Cybersecurity Guid
209ance (Feb 3, 2026 final), Section 524B","AAMI SW96, IEC 81001-5-1, IEC 62304","AAMI TIR57","NIST SP 800-30 / 800-53 (referenced controls)","ANSI/AAMI SW68 for postmarket"],techStack:["ARM Cortex-M4 MCU with secure boot","Cellular LTE-M backhaul + BLE 5.0 to home gateway","Linux-based home gateway (Yocto)","AWS IoT Core + Lambda + Aurora"],challenge:"A connected cardiac event monitor with cellular backhaul needed a complete premarket cybersecurity package for a 510(k), with the device launching to a national hospital network at scale. The MCU firmware had been carried over from a legacy un-cleared product line, secure boot was implemented but never audited, and the cellular AT-command surface had never been fuzzed.",approach:["Full STRIDE threat model spanning implant-side firmware, BLE pairing, the home gateway, and the AWS IoT cloud control plane - 62 threats with explicit attack trees for the high-risk paths (cellular MITM, BLE pairing downgrade, gateway-side firmware update poisoning)","Hardware and firmware penetration test: JTAG/SWD reachability, fuse state, secure boot bypass attempts, anti-rollback enforcement, and SDR-based RF capture/replay on the BLE link","Cellular AT-command and TCP/TLS surface fuzzing on the modem stack; PKI review of the device certificates and AWS IoT policies","FDA-aligned CycloneDX SBOM for firmware, gateway image, and cloud microservices, with a postmarket vulnerability management plan keyed to KEV/EPSS and a 30-day patch SLA","Drafted the cybersecurity sections of the 510(k) eSTAR package and the §524B SPDF evidence binder"],deliverables:["62-threat STRIDE model + 4 detailed attack trees","Hardware/firmware pen-test report (38 pages) with fix verification re-test","CycloneDX SBOM across 3 components (firmware / gateway / cloud)","Postmarket cybersecurity plan with CVD policy and disclosure timelines","eSTAR cybersecurity module content + SPDF evidence binder"],outcome:[{label:"510(k) clearance",value:"Granted on first cycle"},{label:"Cybersecurity AIs from FDA",value:"0"},{label:"High/critical findings closed pre-submission",value:"100%"},{label:"Days from submission to clearance",value:"84"}],lessons:["BLE pairing must use Numeric Comparison or OOB - 'Just Works' will draw an AI Request 100% of the time on a Class II monitor","Anti-rollback is the single highest-leverage control on field-deployed firmware; test it in production-equivalent units, not dev boards","A postmarket plan with named SLAs (patch window, CVD response time) is what separates a 'pass' from 'pass with minor comments'"],quote:{text:"First-cycle clearance with zero cyber AIs. That's not luck - that's preparation.",attribution:"Director of Quality, cardiac monitoring manufacturer"},services:["fda-premarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling","fda-compliant-sbom-services-for-medtech"]},{slug:"class-iii-neurostimulator-pma",client:"Implantable neurostimulator manufacturer (Class III, life-sustaining)",segment:"Neuromodulation / Active Implantables",deviceClass:"Class III PMA",timeline:"11 months across pre-PMA and PMA review (May 2024 - Apr 2025), 2 AI rounds resolved",team:"Principal consultant + 2 hardware/RF engineers + cryptographer + SBOM lead + regulatory writer (6 people)",standards:["FD&C Act §524B","FDA Premarket Cybersecurity Guidance (Feb 3, 2026 final)","AAMI SW96, IEC 81001-5-1, IEC 62304 Class C","ISO 14971 (life-sustaining harm scenarios)","FIPS 140-3 (cryptographic module review)","ANSI/AAMI/IEC TIR60601-4-5 (security capabilities)","ISO/IEEE 11073-40101 (PHD security)"],techStack:["Implant: ARM Cortex-M33 + custom MICS-band radio","Programmer: Windows tablet + proprietary inductive link","Patient remote: BLE 5.2 with LE Secure Connections","Cloud: Azure (AKS, Key Vault HSM, Event Hub) with FedRAMP-aligned controls"],challenge:"A pre-PMA implantable neurostimulator with a wireless programmer, patient remote, and cloud telemetry needed a full Section 524B cybersecurity package that would survive an Advisory Panel and a multi-cycle PMA review - with patient-safety risk tolerances far tighter than a typical 510(k). The device is life-sustaining, the radio link is proprietary, and a successful attack on the firmware update path would be unrecoverable in the field.",approach:["End-to-end STRIDE threat model covering implant, programmer, patient remote, gateway, and cloud - 138 threats with explicit life-sustaining harm scenarios mapped to ISO 14971, including therapy-suspension, over-stimulation, and battery-drain attack paths","FIPS 140-3 cryptographic review of the MICS/BLE link, programmer authentication, and signed firmware update path; identified and closed a nonce-reuse risk in the implant's session establishment","Hardware, firmware, and RF penetration test on production-equivalent units - JTAG fusing audit, secure boot chain validation, anti-rollback enforcement, MICS-band replay/jamming, and side-channel analysis on the inductive programmer link","FDA-compliant CycloneDX SBOM for implant firmware, programmer softw
209are, and cloud services (1,847 components total) with KEV/EPSS-driven postmarket vulnerability management plan and a 14-day patch SLA for critical findings","Authored the §524B narrative, full SPDF evidence package, and postmarket cybersecurity plan inside the PMA modules; supported two FDA AI Request rounds and the cybersecurity portion of Advisory Panel prep"],deliverables:["138-threat STRIDE model with life-sustaining harm matrix","FIPS 140-3 cryptographic assessment + remediation verification","Hardware/firmware/RF pen-test report (94 pages) + side-channel addendum","CycloneDX SBOMs for 3 components (1,847 components, KEV/EPSS triaged)","§524B narrative + full SPDF evidence binder embedded in PMA modules","Advisory Panel cybersecurity briefing deck and Q&A backstop","Postmarket cybersecurity plan with CVD policy and 14-day critical patch SLA"],outcome:[{label:"PMA outcome",value:"Approved"},{label:"Cybersecurity AI rounds resolved",value:"2 of 2"},{label:"Field-replaceable cyber controls at approval",value:"100%"},{label:"Open high/critical findings at lock",value:"0"},{label:"Schedule slip caused by cyber workstream",value:"0 days"}],lessons:["On a life-sustaining implant, every cyber control must be field-recoverable - if a finding can only be fixed by explant, it must be closed before lock, not deferred postmarket","Proprietary RF links don't get a security pass; reviewers will ask for the same evidence you'd show for BLE - replay resistance, freshness, and authenticated firmware updates","Two AI rounds is the median for Class III cyber; build the SPDF evidence binder so AI responses are a re-cut, not a rewrite"],quote:{text:"PMA reviewers don't grade on a curve. Blue Goat built a cyber package that held up through panel prep, two AI rounds, and final approval - without ever pushing our timeline.",attribution:"VP Regulatory & Quality, implantable neurostimulator manufacturer"},services:["fda-premarket-cybersecurity-services","medical-device-threat-modeling","medical-device-penetration-testing","fda-compliant-sbom-services-for-medtech","fda-postmarket-cybersecurity-services"]}],JI="/assets/lsi-usa-2026-CoWg2DOo.png",YI="/assets/lsi-asia-2026-clwYRGhO.png",ZI="/assets/medtech-na-2026-D8U4uKbh.png",ej="/assets/medtech-asia-2026-DOH8CUpc.png",tj="/assets/medtech-europe-2026-CnnnK9Lp.png",ij="/assets/medtech-dubai-2027-C7BFY-KJ.png",rj="/assets/advamed-medtech-conference-2026-DgaxxzPX.jpg",sj="/assets/christian-espinosa-Da4KOV-Z.jpg",nj="/assets/melissa-espinosa-CLpbEptl.jpg",aj="/assets/claudio-salvador-CFVNB4eV.png",oj="/assets/dinia-reeves-BC3BRRdD.png",Ji=[{name:"Christian Espinosa",role:"Founder & CEO",linkedin:"https://www.linkedin.com/in/christianespinosa",avatar:sj},{name:"Melissa Espinosa",role:"VP, Strategic Partnerships",linkedin:"https://www.linkedin.com/in/melissa-espinosa-b20892151",avatar:nj}],cj={name:"Claudio Salvador",role:"Business Development",linkedin:"https://www.linkedin.com/in/claudio-salvador/",avatar:aj},lj={name:"Dinia Reeves",role:"Business Development Representative",linkedin:"https://www.linkedin.com/in/diniareeves/",avatar:oj},Jw=[{slug:"medtech-world-north-america-2026",name:"MedTech World North America",series:"MedTech World",sponsorship:"Title Sponsor",city:"West Palm Beach, FL",country:"USA",venue:"Hilton West Palm Beach",dates:"May 11-13, 2026",startDate:"2026-05-11",endDate:"2026-05-13",url:"https://med-tech.world/north-america/",region:"North America",status:"Open",attendees:[...Ji,cj],image:ZI,imageAlt:"Blue Goat Cyber team at the MedTech World booth",tagline:"Title sponsor. Three full days of FDA cybersecurity strategy on the East Coast.",activations:["Title sponsor branding across the main stage and program","On-site FDA cybersecurity clinic at our booth","Christian Espinosa speaking on Section 524B and the 2026 FDA guidance","Private 1:1 strategy sessions - book a slot in advance"],topics:["Section 524B readiness and the Feb 2026 FDA guidance","Pre-Sub strategy for connected devices","Threat modeling for AI/ML-enabled devices","Reviewer deficiency response (AI letter triage)"],agenda:[{label:"Day 1 - Monday, May 11",date:"2026-05-11",items:[{time:"8:30 - 9:00",title:"Registration & coffee at the BGC clinic table"},{time:"9:00 - 9:30",title:"Title sponsor welcome",who:"Christian Espinosa"},{time:"9:45 - 10:30",title:"Keynote: Section 524B in 2026 - what FDA actually rejects",description:"What the Feb 2026 final guidance changed and how reviewers are scoring submissions today.",who:"Christian Espinosa"},{time:"11:00 - 17:00",title:"On-site FDA cybersecurity clinic",description:"Walk-up reviews of your SPDF, SBOM, threat model, or AI letter response."}]},{label:"Day 2 - Tuesday, May 12",date:"2026-05-12",items:[{time:"9:00 - 10:00",title:"Workshop: Pre-Sub strategy for connected devices",who:"Melissa Espinosa"},{time:"10:30 - 12:30",title:"1:1 strategy sessions (pre-booked)"},{time:"13:30 - 14:30",title:"Panel: Threat modeling for AI/ML-enabled devices"},{time:"15:00 - 17:30",title:"Booth-side AI letter triage clinic",who:"Claudio Salvador"}]},{label:"Day 3 - Wednesday, May 13",date:"2026-05-13",items:[{time:"9:00 - 10:00",title:"Roundtable: Reviewer deficiency response patterns"},{time:"10:30 - 12:00",title:"1:1 strategy sessions (pre-booked)"},{time:"12:30 - 13:30",title:"Closing keynote & action plan"}
209]}]},{slug:"medtech-world-asia-2026",name:"MedTech World Asia",series:"MedTech World",sponsorship:"Title Sponsor",city:"Hong Kong",country:"Hong Kong",dates:"Aug 26-28, 2026",startDate:"2026-08-26",endDate:"2026-08-28",url:"https://med-tech.world/medtech-hongkong-summit/",region:"Asia",status:"Open",attendees:Ji,image:ej,imageAlt:"Blue Goat Cyber at MedTech World Asia",tagline:"Title sponsor. Helping APAC manufacturers translate FDA + EU MDR cyber requirements.",activations:["Title sponsor of the flagship Asia summit","Booth-side FDA cybersecurity clinic for APAC manufacturers","Speaking slots on harmonizing FDA, EU MDR, and NMPA expectations","Pre-arranged 1:1 strategy meetings throughout the program"],topics:["Selling into the US: 524B essentials for APAC manufacturers","EU MDR + IVDR cybersecurity alignment","SBOM (CycloneDX) operating models","Postmarket vulnerability disclosure (CVD) programs"],agenda:[{label:"Day 1 - Wednesday, August 26",date:"2026-08-26",items:[{time:"9:00 - 9:30",title:"Title sponsor opening remarks",who:"Christian Espinosa"},{time:"10:00 - 11:00",title:"Keynote: 524B essentials for APAC manufacturers selling into the US"},{time:"11:30 - 17:00",title:"On-site FDA + EU MDR cybersecurity clinic"}]},{label:"Day 2 - Thursday, August 27",date:"2026-08-27",items:[{time:"9:00 - 10:30",title:"Workshop: Harmonising FDA, EU MDR, and NMPA expectations"},{time:"11:00 - 13:00",title:"1:1 strategy sessions (pre-booked)"},{time:"14:00 - 15:00",title:"Panel: SBOM (CycloneDX) operating models for APAC OEMs"},{time:"15:30 - 17:30",title:"Postmarket CVD programme working session"}]},{label:"Day 3 - Friday, August 28",date:"2026-08-28",items:[{time:"9:00 - 11:00",title:"Roundtable: cross-border deal diligence on cybersecurity"},{time:"11:30 - 13:00",title:"1:1 strategy sessions"},{time:"13:30 - 14:30",title:"Closing keynote & summit wrap"}]}]},{slug:"medtech-world-europe-2026",name:"MedTech World Europe",series:"MedTech World",sponsorship:"Title Sponsor",city:"Valletta",country:"Malta",dates:"Nov 11-13, 2026",startDate:"2026-11-11",endDate:"2026-11-13",url:"https://med-tech.world/malta/",region:"Europe",status:"Open",attendees:Ji,image:tj,imageAlt:"Blue Goat Cyber team at MedTech World Europe in Malta",tagline:"Title sponsor. EU MDR, IVDR, and the Cyber Resilience Act in one place.",activations:["Title sponsor of the European flagship summit","EU MDR + CRA cybersecurity working sessions at our stand","Speaking on MDCG 2019-16 alignment with FDA's Feb 2026 guidance","On-site Pre-Sub and Notified Body strategy reviews"],topics:["EU MDR & IVDR cybersecurity expectations","Cyber Resilience Act (CRA) impact on medical devices","MDCG 2019-16 â FDA harmonization","Postmarket surveillance and PSUR cyber inputs"],agenda:[{label:"Day 1 - Wednesday, November 11",date:"2026-11-11",items:[{time:"9:00 - 9:30",title:"Title sponsor opening & Malta welcome",who:"Christian Espinosa"},{time:"10:00 - 11:00",title:"Keynote: EU MDR, IVDR, and the Cyber Resilience Act in one slide",who:"Christian Espinosa"},{time:"11:30 - 17:00",title:"EU MDR + CRA cybersecurity working sessions at our stand"}]},{label:"Day 2 - Thursday, November 12",date:"2026-11-12",items:[{time:"9:00 - 10:00",title:"Workshop: MDCG 2019-16 â FDA Feb 2026 guidance harmonisation",who:"Melissa Espinosa"},{time:"10:30 - 13:00",title:"Pre-Sub & Notified Body strategy reviews (1:1)"},{time:"14:00 - 15:00",title:"Panel: Cyber Resilience Act impact on medical devices"},{time:"15:30 - 17:30",title:"PSUR cyber inputs working session"}]},{label:"Day 3 - Friday, November 13",date:"2026-11-13",items:[{time:"9:00 - 11:00",title:"Roundtable: dual-market (EU + US) cyber evidence strategy"},{time:"11:30 - 13:00",title:"1:1 strategy sessions"},{time:"13:30 - 14:30",title:"Closing keynote & summit wrap"}]}]},{slug:"medtech-world-middle-east-2027",name:"MedTech World Middle East",series:"MedTech World",sponsorship:"Title Sponsor",city:"Dubai",country:"UAE",dates:"February 2027",startDate:"2027-02-11",endDate:"2027-02-13",url:"https://med-tech.world/dubai/",region:"Middle East",status:"Upcoming",attendees:Ji,image:ij,imageAlt:"Christian Espinosa at MedTech World Dubai",tagline:"Title sponsor. Supporting GCC manufacturers entering FDA and EU markets.",activations:["Title sponsor of the GCC flagship summit","GCC-to-FDA market entry strategy sessions at our booth","Speaking on cybersecurity expectations from MOH-UAE, SFDA, and FDA","Private cyber strategy reviews with regional manufacturers"],topics:["FDA market entry from the GCC","EU MDR routes for Middle East manufacturers","Threat modeling for connected and AI-enabled devices","Building a CVD program from scratch"],agenda:[{label:"Day 1 - Thursday, February 11",date:"2027-02-11",items:[{time:"9:00 - 9:30",title:"Title sponsor welcome",who:"Christian Espinosa"},{time:"10:00 - 11:00",title:"Keynote: cybersecurity expectations from MOH-UAE, SFDA, and FDA"},{time:"11:30 - 17:00",title:"GCC-to-FDA market entry strategy sessions at our booth"}]},{label:"Day 2 - Friday, February 12",date:"2027-02-12",items:[{time:"9:00 - 10:30",title:"Workshop: building a CVD programme from scratch"},{time:"11:00 - 13:00",title:"1:1 strategy reviews with regional manufacturers"},{time:"14:00 - 15:00",title:"Panel: EU MDR routes for Middle East manufacturers"},{time:"15:30 - 17:30",title:"Threat modelling for connected & AI-enabled devices"}]},{label:"Day 3 - Saturday, February 13",date:"2027-02-13",items:[{time:"9:00 - 11:00",title:"Roundtable: closing the regional cyber talent gap"},{time:"11:30 - 13:00",title:"1:1 strategy sessions"},{time:"13:30 - 14:30",title:"Closing keynote & summit wrap"}]}]},{slug:"lsi-usa-2026",name:"LSI USA '26 Emerging MedTech Summit",series:"LSI",sponsorship:"Sponsor",city:"Dana Point, CA",country:"USA",venue:"Waldorf Astoria, Monarch Beach",dates:"Mar 16-20, 2026",startDate:"2026-03-16",endD
209ate:"2026-03-20",url:"https://www.lsiusasummit.com/",region:"North America",status:"At capacity",attendees:Ji,image:JI,imageAlt:"Blue Goat Cyber booth at LSI USA",tagline:"Sponsor. The premier emerging MedTech investor + founder summit in North America.",activations:["Sponsor of the flagship LSI USA summit","Booth-side cybersecurity diligence reviews for founders and investors","1:1 meetings on premarket cyber strategy and budgeting","Investor briefings on cybersecurity as regulatory risk reduction"],topics:["What investors should diligence on device cybersecurity","Cyber budgets by funding stage (Pre-Seed to Series C)","How to scope a fixed-fee FDA cyber package","Avoiding the Top 10 vendor failure modes"],pastNote:"LSI USA '26 wrapped on March 20, 2026. We hosted 80+ founder conversations and 14 cyber-diligence reviews at the Waldorf Astoria. Recap below.",agenda:[{label:"Day 1 - Monday, March 16",date:"2026-03-16",items:[{time:"8:00 - 9:00",title:"Sponsor breakfast on the Monarch terrace"},{time:"9:00 - 10:00",title:"Opening keynote: the 2026 emerging MedTech landscape"},{time:"10:30 - 12:00",title:"Founder pitches - Track A (Cardiovascular)"},{time:"13:00 - 17:30",title:"Booth-side cybersecurity diligence reviews",who:"Christian Espinosa, Melissa Espinosa"},{time:"18:30 - 21:00",title:"BGC + LSI sponsor reception"}]},{label:"Day 2 - Tuesday, March 17",date:"2026-03-17",items:[{time:"8:30 - 9:30",title:"Investor breakfast: cyber as regulatory risk reduction",who:"Christian Espinosa"},{time:"10:00 - 12:00",title:"Workshop: cyber budgets by funding stage (Pre-Seed â Series C)",who:"Melissa Espinosa"},{time:"13:00 - 17:30",title:"1:1 strategy meetings (pre-booked)"},{time:"19:00 - 22:00",title:"Founder dinner (invite only)"}]},{label:"Day 3 - Wednesday, March 18",date:"2026-03-18",items:[{time:"9:00 - 10:00",title:"Panel: scoping a fixed-fee FDA cyber package"},{time:"10:30 - 12:30",title:"Founder pitches - Track B (Neuro / Digital Health)"},{time:"13:30 - 17:30",title:"Booth-side AI-letter triage clinic"}]},{label:"Day 4 - Thursday, March 19",date:"2026-03-19",items:[{time:"9:00 - 10:30",title:"Roundtable: avoiding the Top 10 vendor failure modes",who:"Christian Espinosa"},{time:"11:00 - 13:00",title:"Investor diligence office hours"},{time:"14:00 - 17:30",title:"1:1 strategy meetings"}]},{label:"Day 5 - Friday, March 20",date:"2026-03-20",items:[{time:"9:00 - 10:00",title:"Closing keynote: what worked, what to fix in '27"},{time:"10:30 - 12:00",title:"Final 1:1 sessions and wrap-up"}]}]},{slug:"lsi-asia-2026",name:"LSI Asia '26 Emerging MedTech Summit",series:"LSI",sponsorship:"Sponsor",city:"Singapore",country:"Singapore",venue:"Shangri-La Orchard Road",dates:"Jun 30 - Jul 2, 2026",startDate:"2026-06-30",endDate:"2026-07-02",url:"https://www.lsiasiasummit.com/",region:"Asia",status:"At capacity",attendees:Ji,image:YI,imageAlt:"Blue Goat Cyber at LSI Asia",tagline:"Sponsor. Where APAC innovators and US/EU acquirers find each other.",activations:["Sponsor of LSI Asia","Booth-side FDA + EU MDR cyber readiness reviews","Panel participation on regulatory strategy for APAC innovators","Pre-booked 1:1 strategy sessions with our team"],topics:["FDA market entry from APAC","Cybersecurity diligence for cross-border deals","SBOM and VEX operating models","Threat modeling for connected hospital systems"],pastNote:"LSI Asia '26 wrapped on July 2, 2026 at Shangri-La Orchard Road in Singapore. Christian Espinosa spoke on FDA market entry from APAC, and our team ran booth-side FDA and EU MDR readiness reviews across the three days. Recap below.",agenda:[{label:"Day 1 - Tuesday, June 30",date:"2026-06-30",items:[{time:"8:30 - 9:30",title:"Sponsor breakfast at Shangri-La Orchard"},{time:"10:00 - 11:00",title:"Opening keynote: APAC innovators meet US/EU acquirers"},{time:"11:30 - 17:00",title:"Booth-side FDA + EU MDR cyber readiness reviews"},{time:"18:30 - 21:00",title:"Sponsor reception"}]},{label:"Day 2 - Wednesday, July 1",date:"2026-07-01",items:[{time:"9:00 - 10:00",title:"Workshop: FDA market entry from APAC",who:"Christian Espinosa"},{time:"10:30 - 12:30",title:"Panel: cybersecurity diligence for cross-border deals"},{time:"13:30 - 17:30",title:"1:1 strategy meetings (pre-booked)"}]},{label:"Day 3 - Thursday, July 2",date:"2026-07-02",items:[{time:"9:00 - 10:30",title:"Roundtable: SBOM & VEX operating models for hospital systems"},{time:"11:00 - 13:00",title:"Investor office hours"},{time:"13:30 - 14:30",title:"Closing keynote & summit wrap"}]}]},{slug:"advamed-medtech-conference-2026",name:"The MedTech Conference 2026 (AdvaMed)",series:"AdvaMed",sponsorship:"Exhibitor",city:"Boston, MA",country:"USA",venue:"Boston Convention & Exhibition Center",dates:"Oct 18-21, 2026",startDate:"2026-10-18",endDate:"2026-10-21",url:"https://www.medtechconference.com/",region:"North America",status:"Open",attendees:Ji,image:rj,imageAlt:"Blue Goat Cyber at The MedTech Conference, hosted by AdvaMed",tagline:"Exhibitor. The largest gathering of MedTech executives in North America.",activations:["Exhibiting on the show floor - stop by for an FDA cyber clinic","Pre-booked 1:1 strategy sessions with our senior team","Reviewer deficiency response tri
209age on-site","Cybersecurity diligence reviews for executives and investors"],topics:["Section 524B and the Feb 2026 FDA guidance","AI/ML PCCP and cybersecurity","Postmarket SBOM, VEX, and CVD program design","QMSR (21 CFR Part 820) cybersecurity inputs"],agenda:[{label:"Day 1 - Sunday, October 18",date:"2026-10-18",items:[{time:"12:00 - 18:00",title:"Booth opens at Boston Convention & Exhibition Center"},{time:"13:00 - 17:00",title:"Walk-up FDA cyber clinic"},{time:"18:30 - 21:00",title:"Opening reception"}]},{label:"Day 2 - Monday, October 19",date:"2026-10-19",items:[{time:"9:00 - 10:00",title:"Keynote: Section 524B + the Feb 2026 FDA guidance, two years in",who:"Christian Espinosa"},{time:"10:30 - 17:30",title:"1:1 strategy sessions (pre-booked)"},{time:"13:00 - 14:00",title:"Panel: AI/ML PCCP and cybersecurity"}]},{label:"Day 3 - Tuesday, October 20",date:"2026-10-20",items:[{time:"9:00 - 10:30",title:"Workshop: postmarket SBOM, VEX, and CVD programme design",who:"Melissa Espinosa"},{time:"11:00 - 13:00",title:"Reviewer deficiency response tri
209age on-site"},{time:"14:00 - 17:30",title:"Cybersecurity diligence reviews for executives & investors"}]},{label:"Day 4 - Wednesday, October 21",date:"2026-10-21",items:[{time:"9:00 - 10:30",title:"Roundtable: QMSR (21 CFR Part 820) cybersecurity inputs"},{time:"11:00 - 13:00",title:"Final 1:1 sessions and conference wrap"}]}]},{slug:"medtech-innovator-summit-2026",name:"2026 Innovator Summit (MedTech Innovator)",series:"MedTech Innovator",sponsorship:"Sponsor",city:"San Francisco, CA",country:"USA",dates:"Jun 2-4, 2026",startDate:"2026-06-02",endDate:"2026-06-04",url:"https://medtechinnovator.org/the-2026-innovator-summit-bridging-innovators-shaping-the-future/",region:"North America",status:"Open",attendees:[...Ji,lj],tagline:"Christian Espinosa speaks at the U.S. Market Access pre-summit, then joins the 2026 Innovator Summit kickoff.",activations:["Speaking June 2 to Singapore-based companies in the U.S. Market Access Program","Two days of cohort kickoff networking with the MTI US, BTI, and MTI APAC classes of 2026","1:1 cybersecurity strategy meetings with founders entering the U.S. market"],topics:["U.S. market entry: FDA cybersecurity expectations for APAC manufacturers","Commercialization and scaling globally","Healthcare innovation and connected device security"]}],Yw=new Date().toISOString().slice(0,10),dj=[...Jw].filter(e=>(e.endDate??e.startDate)>=Yw).sort((e,t)=>e.startDate.localeCompare(t.startDate)),LN=[...Jw].filter(e=>(e.endDate??e.startDate)<Yw).sort((e,t)=>t.startDate.localeCompare(e.startDate)),Zw=[{slug:"neurotech",name:"NeuroTechnology & Brain-Computer Interfaces",shortName:"NeuroTech / BCI",icon:Yc,tagline:"Cybersecurity for BCIs, neuromodulation, and implantable neural devices.",metaTitle:"NeuroTech & BCI Cybersecurity | FDA Premarket Support",metaDescription:"FDA cybersecurity for brain-computer interfaces, deep brain stimulation, and neuromodulation devices. Threat modeling, SBOM, and pen testing for NeuroTech.",intro:"Brain-computer interfaces and neuromodulation systems represent the most safety-critical class of connected medical devices. A cyber compromise can directly affect cognition, motor control, or therapeutic stimulation. We help NeuroTech manufacturers meet FDA's 2026 premarket cybersecurity expectations with threat models, SBOMs, and penetration testing tuned to implantable and wearable neural systems.",examples:["Implantable neurostimulators","Deep brain stimulation (DBS)","Invasive and non-invasive BCIs","Spinal cord stimulators","Closed-loop neuromodulation"],risks:[{title:"Wireless command injection",body:"BLE and proprietary RF links to clinician programmers must be authenticated and replay-resistant - unauthenticated stimulation parameter changes can cause direct patient harm."},{title:"Firmware tampering on implants",body:"Implantable firmware updates require signed, attested update channels with rollback protection and out-of-band recovery paths."},{title:"Mobile companion app exposure",body:"Patient-facing apps frequently ship with hardcoded keys, weak TLS pinning, and over-permissioned cloud APIs."}],pathways:["510(k)","De Novo","PMA","Q-Sub / Pre-Sub"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","ISO 14971","IEC 62304","IEC 81001-5-1","ISO/IEC 27001"],services:["fda-premarket-cybersecurity-services","medical-device-threat-modeling","medical-device-penetration-testing","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"Does FDA require a separate cybersecurity submission for BCIs and neurostim devices?",a:"No - cybersecurity documentation is part of your 510(k), De Novo, or PMA, not a separate submission. We deliver an eSTAR-ready package aligned to the FDA 2026 final premarket cybersecurity guidance, AAMI SW96, and the IEC 14971 risk file. The cyber artifacts cross-reference the rest of the submission so reviewers can trace each control from threat to test to label."},{q:"How do you test implantable wireless interfaces (BLE, MICS, proprietary RF)?",a:"We use SDR-based protocol analysis to capture and characterize the link, fuzzing of BLE and proprietary RF stacks (including downgrade and pairing-mode abuse), and authenticated gray-box testing of the clinician programmer. Replay, MITM, and spoofing of stimulation parameter writes are exercised on staging hardware only, never on a clinical system. Findings tie back to specific hazard entries in the IEC 14971 risk file so safety and security team
209s act on the same evidence."},{q:"Do you cover the clinician programmer and patient remote together?",a:"Yes. Programmer and patient remote are modeled as part of the same system boundary as the implant, and we test programmer-to-implant and remote-to-implant paths - including pairing, session management, key custody, and stimulation-parameter authorization. Findings on either accessory feed back into the implant threat model so the system view stays coherent and reviewable."},{q:"How do you address closed-loop neuromodulation safety?",a:"Closed-loop systems get a dedicated control-integrity analysis: sensing-to-stimulation latency, signal authenticity, fail-safe behavior under spoofed or replayed neural input, and integrity of any in-loop adaptation. Crypto and integrity checks must hold within the clinically acceptable timing window, so we measure end-to-end timing and budget primitives accordingly. The SPDF documents the budget, the chosen primitives, and the fail-safe behavior tied to specific hazards."},{q:"What about post-explant data and end-of-life expectations?",a:"We document end-of-life cyber expectations in the SPDF and labeling: key destruction, telemetry shutoff, data retention boundaries on patient remotes, and any forensic-readiness obligations. Explanted device handling (chain of custody, data extraction controls, secure disposal) is addressed because explanted neural implants can carry sensitive biometric data that cannot be rotated like a password."},{q:"Will FDA expect a Coordinated Vulnerability Disclosure (CVD) program for implantables?",a:"Yes. Long-lived neural implants are exactly the use case FDA cites for needing a documented CVD process, SBOM monitoring, and a postmarket update plan under section §524B. We deliver the CVD policy, public intake (e.g., security.txt, vendor portal), acknowledgment and remediation SLAs, and the QMS process from CVE to controlled software change as part of the premarket package."},{q:"How do you handle long-lifetime crypto agility (10-15+ year implants)?",a:"Cryptography selected today must remain defensible across the implant's deployed lifetime, so the design includes explicit crypto agility: algorithm identifiers in protocol headers, key rotation procedures, primitive deprecation paths, and a documented post-quantum migration plan. The SPDF and the postmarket plan describe how a primitive becomes obsolete and how the deployed fleet is migrated without loss of therapy continuity."},{q:"What about cloud telemetry of neural recordings?",a:"Neural recordings are sensitive biometric data and irrevocable - they can't be rotated. Cloud architecture, retention, and access controls reflect that: minimization at the source, encryption at rest and in transit, key custody, region/residency, audit logging, and explicit retention windows. Multi-tenant authorization is exercised aggressively because a single BOLA in this segment exposes continuous neural data for many patients."},{q:"How do you handle multi-vendor BCI ecosystems (sensors, controllers, stimulators)?",a:"When sensors, controllers, and stimulators come from different vendors, threat-model boundaries and interface contracts are made explicit in the submission. Each interface is enumerated with its protocol, authentication, integrity, and failure mode, and each vendor is treated as an explicit untrusted-but-contractually-bound party. The SPDF cross-references the integration test plan so reviewers can verify that the cleared system survives realistic adversarial conditions across the boundary."},{q:"What standards stack applies to NeuroTech implantables?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (Class C for active implantables), ISO 14971, IEC 60601-1 with applicable particulars, IEC 81001-5-1 for the secure software lifecycle, and ISO 14708 series for active implantables. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map artifacts across both regimes so you don't redo work."},{q:"How long does a NeuroTech premarket cyber engagement typically take?",a:"For a new connected neural implant with programmer, patient remote, and cloud telemetry, end-to-e
209nd premarket cyber work generally runs 12-18 weeks. Threat modeling and SBOM front-load in weeks 1-5, pen testing across implant link, programmer, remote, and cloud runs in weeks 5-14, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"cardiovascular-devices",name:"Cardiovascular Devices",shortName:"Cardiovascular",icon:T_,tagline:"Cybersecurity for pacemakers, ICDs, CIEDs, and cardiac monitoring.",metaTitle:"Cardiovascular Device Cybersecurity | Pacemakers, ICDs, CIEDs",metaDescription:"FDA cybersecurity for pacemakers, ICDs, cardiac monitors, and remote follow-up systems. Pen testing, SBOM, and threat modeling for cardiac device manufacturers.",intro:"Cardiac implantable electronic devices (CIEDs) and remote monitoring platforms have a long history of high-profile cybersecurity recalls. We help cardiovascular manufacturers harden device-to-programmer, device-to-home-monitor, and home-monitor-to-cloud paths against the threats FDA reviewers now expect to see modeled.",examples:["Pacemakers and CRT-Ds","Implantable cardioverter-defibrillators (ICDs)","Insertable cardiac monitors","Remote home-monitoring transmitters","ECG patches and Holter systems"],risks:[{title:"Programmer-to-device authentication",body:"Inductive and RF interfaces to in-clinic programmers must enforce mutual authentication, session keys, and anti-replay."},{title:"Home monitor backhaul",body:"Cellular and Wi-Fi backhaul from home monitors needs certificate pinning, secure boot, and tamper-evident telemetry."},{title:"Long-lived deployed fleets",body:"10+ year device lifetimes demand a postmarket vulnerability management plan and SBOM monitoring."}],pathways:["510(k)","PMA","PMA Supplement"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","ANSI/AAMI/IEC TIR60601-4-5","ISO 14971","IEC 62304"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"How do you handle long-lifetime cardiac fleets (10-15 years)?",a:"We pair premarket work with a postmarket cybersecurity management plan under section §524B: continuous SBOM monitoring across implant firmware, programmer, and home-monitor; a Coordinated Vulnerability Disclosure (CVD) program; severity-based remediation SLAs; and a 10-15 year crypto-agility plan covering key rotation, primitive deprecation, and post-quantum migration. Cardiac is the segment with the longest documented FDA cyber-recall history, and reviewers expect to see lessons learned reflected explicitly."},{q:"Do you test the in-clinic programmer separately from the implant?",a:"Yes. Programmers are scoped as connected system components with their own threat model, OS hardening review, software-supply-chain analysis, and pen test. The inductive and RF link to the implant is exercised for mutual authentication, replay, downgrade, and stimulation/parameter authorization. Findings on the programmer are tied back to the implant threat model so the system view stays coherent and reviewable."},{q:"How do you cover home-monitor backhaul (cellular/Wi-Fi)?",a:"Home transmitters are tested for cellular and Wi-Fi configuration, certificate validation and pinning, secure boot, anti-rollback, and tamper-evident telemetry, plus the cloud APIs they call. The cellular fleet-management layer gets dedicated attention because compromise there can affect every patient device simultaneously. The threat model treats the carrier and the home network as explicit untrusted-but-contractually-bound parties."},{q:"Can you support a PMA Supplement adding remote monitoring or changing crypto?",a:"Yes. We deliver a focused delta threat model, an updated SBOM with VEX, and an incremental test report scoped to the new path so reviewers can see the change clearly. The package cross-references the previously approved submission and the IEC 14971 risk file so the delta is unambiguous - which is exactly what PMA Supplement reviewers look for in cyber-only changes."},{q:"What about MDS2 and hospital procurement?",a:"We help you produce an MDS2 that's consistent with your SPDF, labeling, and pen-test summary so hospital security reviews don't contradict your FDA submission. Inconsistencies between MDS2, SBOM, and the FDA package are one of the most common reasons cardiac products stall in procurement, and they're easy to avoid when the artifacts are produced together rather than reverse-engineered later."},{q:"How are recalls and field updates handled cyber-side?",a:"We document the secure-update mechanism (signed payloads, anti-rollback, atomic install, staged rollout, rollback-safe) and the CVD process that triggers field updates - both expected by FDA reviewers and both relevant to 522 / recall calculus. Premarket-time documentation of secure update mechanisms reduces the downstream burden when a finding lands and forces a coordinated field action."},{q:"How do you address fleet heterogeneity (multiple firmware generations)?",a:"Active cardiac fleets typically span multiple firmware generations and pairings, so the postmarket plan addresses all simultaneously without breaking patient care. We document the supported configuration matrix, the patching strategy per generation, and the EOL/EOS communications plan, and we verify that compensating controls hold for older generations that can no longer accept secure updates. The matrix lives in the postmarket plan and is referenced by the SPDF."},{q:"How do you handle cloud-side patient portal account takeover and data exfiltration?",a:"Patient portals are tested for credential stuffing, MFA enforcement and bypass, session management, BOLA, multi-tenant authorization, and abuse paths against bulk-export and search APIs. Account-recovery flows get particular attention because they're a common takeover vector and a high-impact one in cardiac (telemetry exposure plus identity). Findings are tied to specific code paths and to the threat-model entries that should have prevented them."},{q:"What about insider/clinic threats via unattended programmers?",a:"Unattended programmers in clinics are an explicit threat-model entry: physical access, USB/serial service ports, lock-screen behavior, session timeouts, and audit logging are all reviewed and tested. The IFU and labeling document the operational assumptions the clinic is expected to enforce, and the SPDF makes the residual risk explicit so the institution understands the boundary between device and environment."},{q:"What standards stack applies to cardiac implantable electronic devices?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (Class C for active implantables), ISO 14971, IEC 60601-1 with applicable particulars (e.g., -2-31 for external pacemaker pulse generators), IEC 81001-5-1 for the secure software lifecycle, and ISO 14708 series for active implantables. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map across both regimes."},{q:"How long does a CIED premarket cyber engagement typically take?",a:"For a new connected CIED platform with programmer, home-monitor, and patient portal, end-to-e
209nd premarket cyber work generally runs 12-18 weeks. Threat modeling and SBOM front-load in weeks 1-5, pen testing across implant link, programmer, home-monitor, cloud, and portal runs in weeks 5-14, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"diabetes-cgm",name:"Diabetes & Continuous Glucose Monitoring",shortName:"Diabetes / CGM",icon:yD,tagline:"Cybersecurity for CGMs, insulin pumps, and AID systems.",metaTitle:"CGM & Insulin Pump Cybersecurity | AID System FDA Support",metaDescription:"FDA cybersecurity for continuous glucose monitors, insulin pumps, and automated insulin delivery (AID) systems. Pen testing and SBOM for diabetes device makers.",intro:"Automated insulin delivery (AID) systems combine a CGM, an insulin pump, and a control algorithm - often spread across vendors and a smartphone. Each interop boundary is a cyber attack surface where a fault could cause hypo- or hyperglycemia. We secure the full closed loop end-to-end.",examples:["Continuous glucose monitors (CGMs)","Insulin pumps and patch pumps","Automated insulin delivery (AID) systems","iCGM/iAGC interoperable components","Companion mobile apps"],risks:[{title:"BLE pairing and key management",body:"Pump-to-CGM and pump-to-phone BLE links must use authenticated pairing, not Just Works, with rotating session keys."},{title:"Algorithmic dosing manipulation",body:"Sensor spoofing or replay can drive an AID controller to over-deliver or stall insulin."},{title:"Cloud and account takeover",body:"Companion-app account takeover can expose dosing history and, in some designs, change pump behavior."}],pathways:["510(k)","De Novo","iCGM / iAGC special controls"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304","ISO 14971","ISO/IEC 27001"],services:["fda-premarket-cybersecurity-services","medical-device-penetration-testing","mobile-application-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"Do interoperable iCGM/iAGC special controls require extra cybersecurity work?",a:"Yes. Interoperability special controls require explicit threat modeling of each defined boundary (sensor-controller, controller-pump, controller-app, app-cloud) and documented mitigations for spoofing, replay, and tampering at each one. The cyber package has to demonstrate that the cleared interoperability claim survives realistic adversarial conditions, and the SPDF cross-references the special controls so reviewers can trace each requirement to a specific control and test."},{q:"How do you test BLE pairing on a CGM-pump pair?",a:"We exercise pairing modes (LE Secure Connections passkey, numeric comparison, OOB), verify session-key rotation and bonding storage, and run replay/MITM tests against bonded and unbonded sessions. Downgrade behavior, peer denylisting, and recovery from a lost or stolen peer device are all tested. The threat model documents the chosen pairing mode, the rationale, and the residual risk; the IFU tells the patient what 'good' looks like."},{q:"What about third-party AID controllers running on the patient's phone?",a:"We model the controller as a trusted-but-isolated component with explicit assumptions about the host phone (OS version, lock-screen behavior, sideloading posture), test its API surface against pump and sensor, and document the constraints the IFU places on the patient's environment. Where the controller is third-party, the boundary is documented as an explicit interoperable interface and the cleared claim is exercised under realistic adversarial conditions including stale tokens, replay, and concurrent peer interference."},{q:"How do you cover sensor spoofing of the AID loop?",a:"We inject malformed, out-of-range, and adversarially-crafted glucose readings into the controller and verify the algorithm's safety bounds, alerting, fallback dosing, and IEC 14971-aligned hazard mitigations. The test plan exercises both single-sample and time-series attack patterns because closed-loop algorithms are sensitive to trajectory, not just point values. Findings tie back to specific hazard entries in the risk file so safety and security team
209s act on the same evidence."},{q:"Can you handle FDA cyber and EU MDR cyber together?",a:"Yes. Our package maps the same artifacts to FDA's 2026 premarket guidance, AAMI SW96, ISO 14971, IEC 62304, MDR Annex I §17.2, and MDCG 2019-16 so you don't redo work for Europe. Notified-body specific deltas (e.g., evidence-of-conformity expectations) are flagged and addressed in the same package, and the postmarket plan satisfies both section §524B and MDR vigilance obligations."},{q:"What does the postmarket plan look like for AID systems?",a:"Continuous SBOM monitoring across the pump, controller, sensor stacks, and any companion app; a Coordinated Vulnerability Disclosure intake with severity-based SLAs; a defined process for hot-fixing the mobile controller without breaking the cleared interoperability claim; and explicit handling for sensor and pump firmware updates that respect therapy continuity. The plan is delivered as part of the premarket package so it's ready for clearance."},{q:"How do you handle the dosing-loop latency vs. integrity-check tradeoff?",a:"Crypto and integrity checks added to the closed-loop control path can't push the loop out of the clinically acceptable timing window, so the design has to budget cryptographic overhead from the start. We measure end-to-end timing under realistic conditions, document the budget in the SPDF, and verify that the chosen primitives (e.g., AES-CCM/GCM, hardware-accelerated where available) hold within budget across the supported device variants. Findings that push timing out of budget are escalated as safety-relevant."},{q:"What about smartphone OS variability and sideloaded-app risk?",a:"Off-the-shelf phones are not medical devices, so the design must compensate for OS variability, sideloading, accessibility-service abuse, and OS-level screen-lock bypass. We document the supported OS versions and platform constraints in the IFU, exercise the highest-impact platform-abuse scenarios in pen testing, and verify root/jailbreak detection, secure storage, and attestation (where available) behave as documented. Where the controller depends on phone-side controls, the residual risk is explicit."},{q:"How do you cover cloud APIs that hold dosing history?",a:"Cloud APIs holding dosing history are tested for BOLA, multi-tenant authorization, scope confusion, JWT claim tampering, soft-delete/undelete tenancy leaks, and rate-limiting/abuse resistance. Encryption at rest and in transit, key custody, audit logging, and region/residency are documented in the SPDF. Findings are tied to specific code paths because in this segment a single authorization gap can expose continuous dosing data for many patients - which is both a HIPAA and a safety event."},{q:"What standards stack applies to AID and CGM systems?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (Class C for AID controllers), ISO 14971, IEC 60601-1 with applicable particulars (e.g., -2-24 for infusion pumps), IEC 81001-5-1 for the secure software lifecycle, OWASP MASVS for the controller app, and Bluetooth SIG profile-specific security requirements. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map across both regimes."},{q:"How long does a diabetes/CGM premarket cyber engagement typically take?",a:"For a connected AID system with pump, sensor, mobile controller, and cloud, end-to-end premarket cyber work generally runs 10-16 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across pump/sensor/controller/cloud and interoperability boundaries runs in weeks 4-12, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]}
209,{slug:"surgical-robotics",name:"Surgical Robotics",shortName:"Surgical Robotics",icon:pD,tagline:"Cybersecurity for robot-assisted surgery and telesurgery platforms.",metaTitle:"Surgical Robotics Cybersecurity | FDA Premarket Pen Testing",metaDescription:"FDA cybersecurity for surgical robots, robot-assisted surgery platforms, and telesurgery. Threat modeling, network and pen testing for robotic platforms.",intro:"Surgical robots are large, networked control systems running real-time software in an OR environment. Cyber faults can disrupt a procedure mid-case. We model the OR network, harden console-to-arm control paths, and run authenticated pen tests against vision, control, and service interfaces.",examples:["Robot-assisted laparoscopic systems","Orthopedic and spine robots","Catheter-based robotic platforms","Imaging-guided robotic systems"],risks:[{title:"OR network exposure",body:"Robotic systems often share VLANs with imaging and EHR - lateral movement from a compromised endpoint must be modeled."},{title:"Service and remote-support interfaces",body:"Vendor remote-service tunnels need MFA, jump-host isolation, and full session logging."},{title:"Real-time control integrity",body:"Control messages between console and arms need integrity protection without breaking deterministic timing."}],pathways:["510(k)","De Novo","PMA"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304","IEC 60601-1","IEC 81001-5-1"],services:["fda-premarket-cybersecurity-services","medical-device-threat-modeling","medical-device-penetration-testing","network-penetration-testing"],faqs:[{q:"Can penetration testing be done without a live, clinical-grade robot?",a:"Yes - and it usually should be. We test against staging units, lab benches, vendor-provided digital twins, and instrumented sub-assemblies (console, vision tower, arm controller) so destructive or fault-injection testing never touches a system that could be used on a patient. On-site testing is reserved for hardware-specific interfaces (instrument identification, service ports, OR network integration) and is always coordinated with your safety, risk, and clinical engineering teams. The test plan documents which findings were exercised on real hardware vs. an emulated path so FDA reviewers can trace coverage back to the threat model."},{q:"How do you scope the OR network in a threat model for a robotic platform?",a:"We model the robot, console, vision tower, instrument tray, and any imaging, navigation, or EHR integrations as a sub-network with explicit trust boundaries. Each interface (DICOM, HL7, FHIR, vendor service VPN, USB service ports, BLE foot-pedal, etc.) is enumerated with its protocol, authentication mechanism, data sensitivity, and failure mode. We document segmentation assumptions the hospital is expected to enforce - VLAN isolation, firewall rules, and zero-trust posture - and call out residual risk where the design depends on hospital controls. This makes the threat model verifiable in the field instead of an abstract diagram."},{q:"How do you handle vendor remote-service tunnels (the most common FDA finding)?",a:"Remote service is one of the most scrutinized cyber surfaces on a surgical robot because it is high-privilege, persistent, and often outside hospital change control. We require and validate MFA on the service account, jump-host isolation between the public internet and the device, full session recording with tamper-evident storage, least-privilege scoping (no general shell unless explicitly justified), and time-bounded access tokens. The end-to-end path is then pen-tested - including credential handling on the vendor side - and documented as a controlled interface in the SPDF and MDS2."},{q:"Do you test safety-critical real-time control paths?",a:"Yes, but with strict constraints aligned to IEC 60601-1 and your IEC 14971 risk file. We exercise control messages for integrity, replay, ordering, and timing on staging hardware only, never on a clinical system, and we coordinate every test with your software safety classification (typically Class C under IEC 62304). Findings that could plausibly affect patient safety are immediately escalated, and the report cross-references the affected hazard analysis entries so your risk and regulatory team
209s can update controls in lockstep."},{q:"How do you handle third-party imaging, navigation, or AI modules integrated into the robot?",a:"Each third-party module is treated as a distinct SBOM component with its own trust boundary, vulnerability monitoring obligation, and integration test plan. We review the vendor's SBOM (SPDX or CycloneDX), the integration glue code, the data path between modules (especially DICOM and proprietary RPC), and the update mechanism for that component. Where vendor SBOMs are missing or thin, we generate one ourselves via binary analysis so your postmarket monitoring under section §524B has complete coverage."},{q:"What's the right standards stack for a surgical robotic system?",a:"The current expected baseline is the FDA 2026 final premarket cybersecurity guidance, AAMI SW96 (security risk management), AAMI TIR57 (security risk management - principles), IEC 62304 (software lifecycle, generally Class C), IEC 60601-1 plus applicable particulars (e.g., -2-77 for robotic surgery, -2-2 for HF surgical), and IEC 81001-5-1 for the secure software lifecycle. NIST SP 800-30 informs threat assessment methodology, and ISO 14971 ties the security risk file back to overall device risk management."},{q:"How do you address SBOM and vulnerability monitoring across RTOS, embedded Linux, and Windows?",a:"Surgical robots almost always combine an RTOS (control plane), embedded Linux (vision/navigation), and Windows (HMI/service) in a single product, so the SBOM and postmarket plan must cover all three. We produce a unified SBOM per build, in SPDX or CycloneDX, with VEX statements for known-not-affected CVEs, and we configure continuous monitoring against NVD, vendor advisories, and CISA KEV. The postmarket plan documents triage SLAs by severity and the path from a CVE to a controlled software change under your QMS."},{q:"How do you reconcile patch cadence with clinical uptime?",a:"Hospitals cannot take a robot offline on short notice, so secure update mechanisms must be robust, fast, atomic, and rollback-safe - and that has to be a premarket design decision, not a postmarket scramble. We document the update architecture (signed, staged, A/B partitioning, integrity-verified at boot), the staged rollout strategy across customer fleets, the rollback path, and the operational SLAs you commit to. This evidence appears in both the SPDF and the postmarket cybersecurity management plan FDA expects under section §524B."},{q:"Do you cover DICOM, HL7, and instrument-ID interfaces in pen testing?",a:"Yes. DICOM and HL7/FHIR ingestion is fuzzed and authorization-tested - reviewers increasingly expect parser memory-safety evidence given historical CVEs in DICOM toolkits. Instrument identification (RFID, 1-Wire, proprietary tag) is exercised for spoofing, replay, and counterfeit-instrument acceptance, since accepting a non-genuine instrument is both a safety and a business-model issue. Findings are mapped back to the relevant threat-model entries and to the corresponding test cases in your software V&V."},{q:"What deliverables do we get for an FDA submission on a robotic platform?",a:"A typical premarket package includes: a STRIDE-based threat model scoped to the robot ecosystem, an architecture and data-flow diagram set, a unified SBOM with VEX, a vulnerability and exploitability analysis, an authenticated penetration test report covering control plane, service interfaces, and integrated modules, the security risk management file aligned to AAMI SW96 and ISO 14971, MDS2, labeling/security documentation for hospital procurement, and a postmarket cybersecurity management plan. Every artifact cross-references the others so reviewers can trace any control from threat to test to label."},{q:"How long does a surgical-robotics premarket cybersecurity engagement typically take?",a:"For a new 510(k) or De Novo robotic platform, end-to-end premarket cyber work generally runs 8-14 weeks depending on the number of integrated modules, availability of staging hardware, and prior cybersecurity maturity. Threat modeling and SBOM work front-loads in weeks 1-4, pen testing and exploitability analysis run in weeks 4-10, and the consolidated submission package and postmarket plan close in weeks 10-14. Clearance-commitment scope and timeline are confirmed in writing before kickoff."}]},{slug:"imaging-ai-samd",name:"Imaging & AI / SaMD",shortName:"Imaging & AI/SaMD",icon:SD,tagline:"Cybersecurity for SaMD, AI/ML diagnostics, and medical imaging.",metaTitle:"AI/SaMD Cybersecurity | Medical Imaging & ML Model FDA Support",metaDescription:"FDA cybersecurity for Software as a Medical Device (SaMD), AI/ML diagnostic models, and medical imaging platforms. SBOM, threat modeling, and pen testing.",intro:"AI/ML-driven SaMD has unique cyber concerns: model integrity, training-data provenance, and the interfaces SaMD uses to ingest DICOM, FHIR, and PACS data. We deliver FDA-aligned threat models that explicitly cover model-supply-chain risks alongside conventional appsec.",examples:["Radiology AI triage","Pathology AI","Cardiology image analysis","Clinical decision support SaMD","Cloud-hosted diagnostic platforms"],r
209isks:[{title:"Model and weight integrity",body:"Trained model artifacts must be signed, version-pinned, and verified at load - supply-chain tampering is now an FDA review topic."},{title:"DICOM/HL7/FHIR interface abuse",body:"Parser bugs and authorization gaps in clinical interfaces are a leading source of SaMD vulnerabilities."},{title:"Multi-tenant cloud isolation",body:"Tenant separation, key scoping, and audit trails must be designed and tested, not assumed."}],pathways:["510(k)","De Novo","PCCP (Predetermined Change Control Plan)"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI CR34971","ISO/IEC 27001","IEC 62304"],services:["fda-premarket-cybersecurity-services","fda-compliant-sbom-services-for-medtech","medical-device-threat-modeling","web-application-penetration-testing","api-penetration-testing"],faqs:[{q:"How does a Predetermined Change Control Plan (PCCP) affect cybersecurity documentation?",a:"If you have a PCCP, the cyber sections of the modification protocol must describe how security posture is maintained as the model is retrained, repackaged, or redeployed. That includes which changes can occur without re-review, how the SBOM is regenerated, how vulnerability and exploitability analyses are refreshed, how training-data lineage is reverified, and how the postmarket plan continues to apply across versions. We help you write those cyber elements explicitly so the PCCP doesn't accidentally invalidate the cleared cyber controls."},{q:"Do you test the model itself, or just the surrounding software?",a:"Both, scoped to clinical relevance. The surrounding software gets conventional appsec, API testing, BOLA/tenancy checks, and infrastructure review. The model itself gets supply-chain controls (signing, version pinning, load-time verification of weights and config), adversarial-input checks where a perturbation could plausibly change a clinical decision, and integrity controls for any in-product caching or fine-tuning. The depth of model-level testing is calibrated to the indication so we don't burn budget on cosmetic robustness for non-safety-critical features."},{q:"What about training-data provenance?",a:"We document training-data lineage controls in the SPDF: source attestation, integrity at ingest, access scoping during labeling and training, deletion/right-to-be-forgotten handling where applicable, and audit logging across the training pipeline. FDA reviewers increasingly expect this to be addressed explicitly rather than waved at, particularly for AI/SaMD with diagnostic claims, and the EU AI Act adds aligned obligations for high-risk medical AI."},{q:"How do you handle DICOM, HL7, and FHIR ingestion?",a:"Each ingestion interface is enumerated with its protocol, authentication mechanism, and parser. DICOM C-STORE/C-FIND/C-MOVE and Eye Care service classes are fuzzed with explicit memory-safety evidence; HL7 v2 and FHIR endpoints are tested for authentication, authorization (especially BOLA and multi-tenant scoping), parser robustness under malformed and oversized payloads, and replay/order-injection resistance. SMART on FHIR scope handling and token revocation are verified separately."},{q:"Is SOC 2 enough for a cloud SaMD?",a:"No. SOC 2 covers operational controls and is useful for procurement conversations, but it does not satisfy FDA premarket cybersecurity content - SPDF, threat model, SBOM with VEX, security architecture views, security testing, MDS2, and a postmarket plan are still required. Where you have SOC 2, we make sure the controls referenced in your Type II report align with the SPDF so reviewers and procurement see one coherent story."},{q:"What's the SBOM expectation for an AI/SaMD product?",a:"A full transitive SBOM in SPDX or CycloneDX, including model dependencies (weights, config, tokenizers), container base images, ML frameworks, inference runtimes, GPU/accelerator drivers in scope, and any third-party APIs in the inference path. The SBOM is paired with a vulnerability and exploitability analysis (VEX) and integrated into the postmarket plan under section §524B for continuous monitoring against NVD, vendor advisories, and CISA KEV."},{q:"How do you handle generative AI / LLM features in clinical software?",a:"Generative AI in clinical SaMD gets dedicated treatment: prompt-injection resistance, output handling and escaping (especially when output flows into another system or is auto-actioned), content provenance, hallucination handling tied to the indication's risk file, supply-chain controls on the model and its hosting, and explicit threat modeling for jailbreaks and indirect prompt injection. Where the model is a third-party API, the boundary is documented as an explicit untrusted-but-contractually-bound interface and tested for abuse and PHI leakage."},{q:"How do you address model versioning, rollback, and reproducibility?",a:"Model versioning, rollback, and reproducibility are treated as cybersecurity-relevant change controls under your QMS. Each deployed model has a verifiable identity (hash, signature), a documented provenance back to its training run, and a tested rollback path. The SPDF and the PCCP (if you have one) describe how a substituted, downgraded, or corrupted model is detected and rejected at load time, and how the audit trail proves which model produced any given inference."},{q:"What about multi-tenant cloud authorization (BOLA, tenancy leaks, scope confusion)?",a:"Multi-tenant authorization is the dominant finding area in cloud SaMD, full stop. We exercise BOLA, parameter-tampering, IDOR, OAuth scope confusion, JWT claim tampering, soft-delete/undelete tenancy leaks, and cross-tenant search/export paths systematically. Findings are tied to specific code paths and to the threat-model entries that should have prevented them so remediation is unamb
209iguous and reviewable."},{q:"What standards stack applies to AI/SaMD?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (typically Class B or C depending on indication), ISO 14971, IEC 81001-5-1, ISO/IEC 23894 (AI risk management), and the GMLP principles. EU manufacturers add MDR Annex I §17.2, MDCG 2019-16, and the EU AI Act's high-risk obligations - we map artifacts across all three regimes so you don't redo work."},{q:"How long does an AI/SaMD premarket cyber engagement typically take?",a:"For a cloud-hosted AI/SaMD with image ingestion, model serving, and EHR integration, end-to-end premarket cyber work generally runs 6-12 weeks. Threat modeling and SBOM (including model dependencies) front-load in weeks 1-3, web/API/DICOM/integration pen testing and model-supply-chain review run in weeks 3-9, and the consolidated submission package, PCCP cyber elements, and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"digital-therapeutics",name:"Digital Therapeutics (DTx)",shortName:"Digital Therapeutics",icon:O0,tagline:"Cybersecurity for prescription digital therapeutics and DTx apps.",metaTitle:"Digital Therapeutics (DTx) Cybersecurity | FDA Software Support",metaDescription:"FDA cybersecurity for prescription digital therapeutics (PDTx) and DTx mobile apps. Mobile pen testing, SBOM, and threat modeling for DTx makers.",intro:"Prescription digital therapeutics are mobile- and web-first SaMD with patient-identifiable data and clinical claims. We deliver mobile and API penetration testing, SBOMs, and threat models built for DTx submission packages.",examples:["Prescription DTx apps","Cognitive behavioral therapy software","Substance use disorder DTx","ADHD and pediatric DTx","Chronic disease management apps"],risks:[{title:"Mobile client hardening",body:"Root/jailbreak detection, secure storage, and TLS pinning are basic expectations for prescription-class mobile SaMD."},{title:"Backend API authorization",body:"Object-level authorization gaps (BOLA) are the #1 finding in DTx backends."},{title:"Third-party SDK risk",body:"Analytics and ad SDKs in DTx apps frequently leak PHI - SBOM and SDK review are essential."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","OWASP MASVS","OWASP ASVS","HIPAA Security Rule"],services:["fda-premarket-cybersecurity-services","mobile-application-penetration-testing","api-penetration-testing","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"Is HIPAA enough for a DTx submission?",a:"No. HIPAA covers privacy, breach response, and the obligations of covered entities and business associates - it does not satisfy FDA premarket cybersecurity content. You need both, and the cyber documentation has to demonstrate that HIPAA controls are coherent with the FDA-expected security risk management under AAMI SW96 and ISO 14971. Reviewers explicitly flag inconsistencies between privacy notices, BAAs, and the SPDF."},{q:"What mobile testing standard do you align to?",a:"OWASP MASVS L2 by default for prescription DTx, with MSTG-driven test cases. Verification level is tuned to the actual risk profile - prescription products with controlled-substance or pediatric indications often warrant MASVS L2+R (resilience), while adjunctive wellness-style indications may justify L1. The chosen level, the rationale, and the resulting test coverage are all documented in the SPDF so reviewers can see why the depth is appropriate."},{q:"How do you handle third-party SDKs (analytics, ads, attribution, crash reporting)?",a:"Each SDK is enumerated in the SBOM with its version, the data classes it can access, and the destinations it sends to. Data flows are mapped, any PHI exposure is flagged, and we typically recommend stripping ad and attribution SDKs from the prescription build entirely. Analytics SDKs are kept only when configured for de-identified or aggregated telemetry and run through a DPIA-style review. SDK supply-chain risk (typosquatting, dependency confusion, post-install scripts) is also assessed."},{q:"Do you test the prescriber portal too?",a:"Yes. The clinician-facing portal, EHR integrations, caregiver views, and any back-office or admin consoles are scoped together with the patient app so authorization, tenancy, and audit logging are tested coherently. Cross-role authorization (patient vs. caregiver vs. prescriber vs. admin) is one of the highest-impact finding areas in DTx and is exercised exhaustively in the test plan."},{q:"How long does a DTx engagement take?",a:"A typical premarket cyber package - threat model, SBOM with VEX, mobile pen test, API pen test, prescriber portal pen test, security risk file, and consolidated report - runs 4-7 weeks depending on backend complexity, number of integrated services, and whether the prescriber portal is in scope. Threat modeling and SBOM front-load in weeks 1-2, testing runs in weeks 2-6, and the consolidated package and postmarket plan close out in the final week."},{q:"What about app store review and DTx?",a:"We help you write privacy disclosures, security disclosures, and clinical-claim language consistent with both Apple App Store and Google Play policies and your FDA submission so they don't contradict. App store rejections in this space frequently cite mismatch between the IFU's claims and the listing copy, or PHI-relevant SDK behavior that wasn't disclosed - both of which the cyber and regulatory team
209s should be solving together, not separately."},{q:"How do you handle the 'phone as platform' problem?",a:"Off-the-shelf phones aren't medical devices, so the design has to compensate for OS variability, sideloading, OS-level screen-lock bypass, accessibility-service abuse, and the user installing arbitrary apps in the same trust boundary. We document the assumed platform constraints in the IFU, exercise the highest-impact platform-abuse scenarios in pen testing, and verify that compensating controls (e.g., root/jailbreak detection, secure storage, attestation where available) behave as documented."},{q:"Do you cover wearables and BLE peripherals that integrate with a DTx?",a:"Yes. Paired wearables, sensors, and BLE peripherals are scoped as part of the connected system: pairing mode, OTA signing on the peripheral firmware, sensor-spoofing resistance, and battery/DoS handling. Findings against the peripheral feed back into the system-level threat model and SBOM so the regulatory and cyber stories stay unified."},{q:"What about generative-AI features in DTx (chat, content generation, coaching)?",a:"When generative AI affects clinical claims or behavior, the model is part of the regulated software and the cyber package addresses prompt-injection resistance, output-handling/escaping, content provenance, supply-chain controls on the model and its hosting, and any PCCP cyber elements. Where the model is a third-party API, the boundary is documented as an explicit untrusted-but-contractually-bound interface and tested for abuse and PHI leakage."},{q:"What standards stack applies to prescription DTx?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (typically Class B for adjunctive DTx, Class C where therapeutic outcome depends on software correctness), ISO 14971, OWASP MASVS for mobile, OWASP ASVS for web/API, plus HIPAA Security Rule mappings. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map the same artifacts across both regimes."},{q:"What postmarket cybersecurity expectations apply under section §524B?",a:"A formal postmarket cybersecurity management plan: continuous SBOM monitoring across mobile, web, backend, and any peripheral firmware; a published Coordinated Vulnerability Disclosure intake with severity-based SLAs; a controlled patching process through the QMS; and explicit handling for app-store-driven updates so a fast mobile release cycle doesn't break the cleared interoperability or claims. We deliver the postmarket plan as part of the premarket package so it's ready for clearance."}]},{slug:"wearables-rpm",name:"Wearables & Remote Patient Monitoring",shortName:"Wearables / RPM",icon:TD,tagline:"Cybersecurity for clinical wearables and RPM ecosystems.",metaTitle:"Wearables & RPM Cybersecurity | FDA Connected Device Support",metaDescription:"FDA cybersecurity for clinical wearables and remote patient monitoring (RPM). BLE, mobile, and cloud pen testing tailored to wearable medical devices.",intro:"Clinical wearables and RPM platforms span sensor, BLE link, mobile app, cloud, and EHR integration. We secure the full data path with a single coordinated engagement.",examples:["ECG and arrhythmia patches","Continuous vitals monitors","Pulse oximeters and SpO2 wearables","Blood pressure cuffs","Pediatric and neonatal monitors"],risks:[{title:"BLE link security",body:"Unauthenticated BLE pairing, fixed PINs, and unencrypted GATT services are the most common findings."},{title:"Cloud telemetry pipeline",body:"Telemetry brokers (MQTT, custom) need authenticated tenants, authorization at the topic level, and abuse limits."},{title:"OTA firmware updates",body:"Wearables need signed, atomic, rollback-safe OTA - and a CVD plan for the deployed fleet."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304","ISO 14971"],services:["fda-premarket-cybersecurity-services","medical-device-penetration-testing","mobile-application-penetration-testing","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"Do consumer wearables need an FDA cyber package?",a:"Only when you make a clinical claim and pursue clearance (510(k), De Novo, or PMA). The moment you do, the full premarket cyber package applies - threat model, SBOM, security architecture, authenticated penetration testing, MDS2, labeling, and a postmarket plan under section §524B. Wellness-only positioning avoids the cyber package, but the line is narrower than most consumer-electronics teams expect, so we frequently help scope a Pre-Sub to settle it."},{q:"What's the right BLE pairing mode for a clinical wearable?",a:"Authenticated pairing under LE Secure Connections - either numeric comparison or out-of-band - is the expected baseline for any clinical wearable. Just Works pairing is hard to defend in a threat model because it offers no MITM protection, and 'Just Works on first pair, encrypted thereafter' has known downgrade attacks. The threat model documents the chosen pairing mode, the rationale, and the residual risk; the IFU tells the patient what 'good' looks like."},{q:"How do you test the OTA firmware update path?",a:"We verify cryptographic signature validation against a hardware-rooted trust anchor where available, anti-rollback enforcement, atomic install with A/B partitioning or equivalent, and recovery behavior under interrupted updates. The cloud delivery path's authentication, integrity, and authorization are pen-tested separately, and we exercise downgrade and substitution scenarios to ensure a hostile peer or compromised cloud cannot push an older or malicious build."},{q:"Do you cover the EHR integration in scope?",a:"Yes when the EHR integration is part of the cleared system. Typically the FHIR or HL7 endpoint, its authentication (SMART on FHIR, mTLS, OAuth), its authorization model (scopes, claims, tenancy), and its rate-limiting/abuse-resistance properties are tested as part of the wearable system. Findings here often have outsized impact because a single integration may serve many patients across many provider tenants."},{q:"What about battery-drain and DoS attacks against the sensor?",a:"Battery exhaustion and DoS are recognized safety-relevant cyber threats for wearables - a forced-pairing storm, a malicious BLE peer, or a malformed advertisement flood can drain a clinical device and silence its alarms. We model and exercise these scenarios on the device and document the mitigations (rate limiting, peer denylisting, exponential backoff, low-battery alarm integrity) in the SPDF and labeling. The IEC 14971 risk file ties the controls back to specific patient hazards."},{q:"How is multi-tenant cloud isolation tested?",a:"We perform cross-tenant authorization testing (BOLA), key-scoping and KMS-policy verification, audit-trail review, and tenant-migration / soft-delete / undelete flow testing. Every cross-tenant access we surface is treated as a critical finding because in this segment a single authorization gap can expose continuous physiologic data for thousands of patients. Findings are tied back to specific code paths so remediation is unamb
209iguous."},{q:"What's the playbook for cellular-connected wearables and patches?",a:"Cellular-connected patches and wearables get an additional radio-stack review: APN configuration, certificate pinning on the cellular backhaul, IMEI/IMSI handling, and SIM lifecycle (eSIM provisioning, deactivation, replay). We also pen-test the device-management layer that controls the cellular fleet because compromise there can affect every patient device simultaneously. The threat model includes the carrier as an explicit untrusted-but-contractually-bound party."},{q:"How do you handle continuous physiologic data on the cloud (PHI scale)?",a:"Continuous data raises the impact ceiling for any confidentiality finding, so we test encryption at rest and in transit, key custody, region/residency controls, audit logging, and retention with the same rigor as a high-volume health platform. The SPDF documents the data classification, lawful basis, retention windows, and access patterns, and pen testing exercises the highest-volume read paths (clinician dashboards, exports, research APIs) under realistic authorization conditions."},{q:"Do you cover companion mobile apps separately?",a:"Companion apps get the standard mobile premarket package: OWASP MASVS L2 baseline with MSTG-driven test cases, secure storage of pairing material, TLS pinning, root/jailbreak detection where clinically justified, and authorization checks against both the device and any cloud APIs. Findings on the app are tied back to the device threat model so the system view stays coherent."},{q:"What standards stack applies to RPM and clinical wearables?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (typically Class B for monitoring-only, Class C when therapy is in the loop), ISO 14971, OWASP MASVS for the app, OWASP ASVS for the cloud, plus Bluetooth SIG profile-specific security requirements and applicable IEC 60601 particulars where the device is electrically connected to the patient. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16."},{q:"How long does an RPM/wearables premarket cyber engagement typically take?",a:"For a connected wearable with mobile app, cloud, and EHR integration, end-to-end premarket cyber work generally runs 6-12 weeks. Threat modeling and SBOM front-load in weeks 1-3, device/app/cloud/EHR pen testing runs in weeks 3-9, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"infusion-drug-delivery",name:"Infusion & Drug Delivery",shortName:"Infusion / Drug Delivery",icon:__,tagline:"Cybersecurity for infusion pumps and connected drug delivery.",metaTitle:"Infusion Pump Cybersecurity | Connected Drug Delivery FDA Support",metaDescription:"FDA cybersecurity for infusion pumps, smart pumps, and connected drug delivery systems. Network pen testing, SBOM, and threat modeling.",intro:"Infusion pumps were the original FDA cybersecurity story and remain a focus for both pre- and postmarket scrutiny. We help pump and connected-delivery manufacturers harden drug-library distribution, EHR interoperability, and network management interfaces.",examples:["Smart IV pumps","PCA pumps","Enteral feeding pumps","Connected auto-injectors","Ambulatory infusion systems"],risks:[{title:"Drug library distribution",body:"Drug-library updates are a high-impact target - they need signed payloads and verified delivery."},{title:"Hospital network exposure",body:"Pump fleets sit on hospital VLANs with ASTM, HL7, and SNMP exposed - frequently with default credentials."},{title:"Postmarket vulnerability response",body:"Long device lifetimes require an active SBOM monitoring and CVD program."}],pathways:["510(k)","PMA Supplement"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304","ISO 14971","IEC 81001-5-1"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","network-penetration-testing","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"How do you test infusion pumps without a hospital network?",a:"We rebuild a representative hospital network segment in our lab - managed switch, VLAN segmentation, EHR simulator, drug-library distribution server, and pump management server - and run authenticated and unauthenticated tests against it. The lab environment is documented in the test plan so reviewers can map findings back to a defined topology, and on-site testing is reserved for hardware-specific surfaces and customer-environment validation."},{q:"Is drug-library distribution in scope for cyber?",a:"Yes, explicitly. The drug library is safety-critical configuration data: a tampered library can produce a clinically meaningful (and litigable) overdose. We test the signing of library payloads, the distribution path from the management server to the pump, signature verification on the pump, rollback behavior, and the audit trail. The SPDF documents key custody, key rotation, and what happens when verification fails."},{q:"What about legacy pumps already deployed in the field?",a:"Legacy fleets are addressed through a postmarket cybersecurity management plan under section §524B: SBOM monitoring, CVD intake, vulnerability disclosures, and a documented patching strategy aligned to FDA postmarket guidance and the hospital's ability to absorb updates without disrupting patient care. Where the firmware c
209an no longer accept secure updates, compensating controls (segmentation, ACLs, monitoring) are documented and the EOL/EOS communications plan is part of the package."},{q:"Do you cover the pump server / management station?",a:"Yes. The pump management server is treated as a connected system component with its own threat model, OS hardening review, application security testing, and pen test. It's frequently the highest-impact target in the segment because compromising it can affect every pump in the institution. The SPDF documents the server architecture, authentication model, audit logging, and update mechanism alongside the pump itself."},{q:"How do you handle interoperability with hospital EHRs (BCMA, smart-pump-EHR)?",a:"HL7 v2 and FHIR endpoints, and any vendor-specific BCMA/smart-pump-EHR integrations, are tested for authentication, authorization, parser robustness under malformed and oversized payloads, and replay/order-injection resistance. We document the assumptions on the hospital network in the IFU and MDS2 - including what segmentation, ACLs, and PKI the institution is expected to provide - so the boundary between device and environment is clear in both clinical and procurement reviews."},{q:"Can you support a 510(k) Special for a cyber-only change?",a:"Yes. We deliver a focused delta threat model, an updated SBOM with VEX, and a targeted test report scoped to the cyber change so reviewers can clear the supplement quickly. The package explicitly cross-references the previously cleared submission so the delta is unambiguous, which is what 510(k) Special reviewers look for."},{q:"How do you address wireless interfaces (Wi-Fi, BLE, cellular) on infusion pumps?",a:"Each radio is enumerated as a distinct interface with its own threat model: 802.11 WPA2/WPA3-Enterprise configuration, EAP method, certificate validation, BLE pairing mode, and cellular APN/PKI where applicable. We exercise downgrade behavior, rogue AP/peer scenarios, and DoS resistance, and we verify that compromise of one radio cannot escalate into device control. The SPDF documents the supported configurations and the IFU tells the hospital how to deploy them safely."},{q:"Do you cover insulin pumps, PCA pumps, and ambulatory pumps differently?",a:"The threat-model topology differs - insulin pumps usually pair with CGMs and a phone; PCA pumps live on the hospital network; ambulatory pumps move between home and clinic - but the same cyber playbook applies: signed configuration, authenticated control, secure updates, monitored telemetry, and a CVD program. We tune the test plan and labeling to the actual deployment topology rather than forcing one shape."},{q:"How do you handle alarms, alerts, and clinical decision support tied to the pump?",a:"Alarm integrity is a safety property: suppressed, delayed, or spoofed alarms can cause direct patient harm. We model alarm paths (on-device, nurse call, mobile clinician notification, EHR) explicitly in the threat model and test for tampering at each hop. Findings are tied back to the IEC 14971 risk file so the safety and security teams act on the same evidence."},{q:"What standards stack applies to infusion and drug-delivery devices?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (typically Class C), ISO 14971, IEC 60601-1 with applicable particulars (e.g., -2-24 for infusion pumps), IEC 81001-5-1 for the secure software lifecycle, and IEC 80001 considerations for the connected hospital network. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map across both regimes."},{q:"How long does an infusion-pump premarket cyber engagement typically take?",a:"For a new connected pump platform with a management server and EHR integrations, end-to-end premarket cyber work generally runs 10-16 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across pump, server, distribution, and EHR integrations runs in weeks 4-12, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"ivd-diagnostics",name:"In-Vitro Diagnostics (IVD)",shortName:"IVD",icon:Ow,tagline:"Cybersecurity for IVD analyzers, LIS integrations, and lab platforms.",metaTitle:"IVD Cybersecurity | Lab Analyzer & LIS Integration FDA Support",metaDescription:"FDA cybersecurity for in-vitro diagnostics (IVD) anal
209yzers, LIS integrations, and connected lab platforms. Threat modeling, pen testing, and SBOM.",intro:"IVD analyzers are connected lab instruments that integrate with LIS, middleware, and increasingly cloud reporting. We secure the LIS interface, instrument OS, and remote service paths against both unauthenticated network attacks and insider misuse.",examples:["Chemistry and immunoassay analyzers","Molecular diagnostics platforms","Hematology analyzers","Point-of-care IVDs","Companion diagnostics platforms"],risks:[{title:"LIS / ASTM / HL7 parser hardening",body:"Lab interface parsers are a chronic source of memory-safety and authorization bugs."},{title:"Embedded Windows / Linux exposure",body:"Many analyzers run end-of-life OS images - patching, allowlisting, and segmentation must be documented."},{title:"Service-engineer remote access",body:"Vendor remote support paths must be MFA-protected and session-logged."}],pathways:["510(k)","De Novo","PMA"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304","CLIA","ISO 15189"],services:["fda-premarket-cybersecurity-services","medical-device-threat-modeling","network-penetration-testing","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"Do CLIA labs change FDA cyber expectations for IVDs?",a:"No - they run in parallel. CLIA governs lab operations and personnel; FDA cybersecurity expectations apply to the IVD device or system as a regulated product. Both apply, and the documentation must be coherent across them: an analyzer's secure-update story, for example, has to make sense to both an FDA reviewer and a CLIA-regulated lab director."},{q:"How do you handle analyzers running end-of-life Windows?",a:"End-of-life Windows is the IVD industry's biggest open cyber finding. We document compensating controls in the SPDF and labeling - segmentation, application allowlisting, restricted services, hardened user accounts, time-bounded service access - and we test the resulting attack surface from both authenticated and unauthenticated positions on the lab network. The submission also includes a documented OS migration plan so reviewers see the trajectory, not just the snapshot."},{q:"What about LIS / ASTM / HL7 / FHIR interface testing?",a:"Every middleware and LIS interface in scope is enumerated with its protocol, authentication mechanism, and parser. We fuzz the parsers (ASTM E1394 in particular has a thin error-handling history), test authentication and authorization on every message type, and verify behavior under malformed and oversized payloads. Findings are tied back to specific message types so QA and dev know exactly what to remediate."},{q:"Do you cover service-engineer remote access?",a:"Yes - vendor remote support paths are one of the most consistently scrutinized cyber surfaces on IVDs because they are high-privilege, often persistent, and outside lab change control. We require and validate MFA, jump-host isolation between the public internet and the analyzer, full session recording with tamper-evident storage, least-privilege scoping, and time-bounded access tokens, and we pen-test the path end-to-e
209nd including credential handling on the vendor side."},{q:"Is middleware in scope for cyber testing?",a:"If you ship or recommend middleware as part of the cleared system, it's in scope. We test it the same way as the analyzer - application security, authentication, integration security, audit logging - and we make sure the SBOM, threat model, and labeling treat it as part of the regulated product. If middleware is genuinely third-party and out of scope, the boundary is documented explicitly so reviewers don't infer otherwise."},{q:"What's the postmarket cybersecurity expectation for IVDs under section §524B?",a:"A formal postmarket cybersecurity management plan: SBOM monitoring across analyzer OS, instrument firmware, middleware, and any cloud components; a Coordinated Vulnerability Disclosure (CVD) program with published intake and severity-based SLAs; a controlled patch and update plan that respects clinical-lab uptime constraints; and integration of CVE triage into your QMS so each finding maps cleanly to a controlled change."},{q:"How do you handle multiplex molecular and POC IVDs differently from core-lab analyzers?",a:"Point-of-care and near-patient IVDs (cartridge-based molecular, POC chemistry, rapid antigen with connectivity) often connect over Wi-Fi/cellular and integrate directly with EHRs, so the cloud and EHR boundaries get more weight in the threat model. Core-lab analyzers are usually in a hospital LAN sub-network, where service tunnels and middleware are the dominant threats. The same standards apply, but the test plan is tuned to the actual deployment topology."},{q:"Do you cover companion diagnostics (CDx) and software-driven assay reporting?",a:"Yes. CDx and assay-reporting software are in scope as connected components, often with SaMD characteristics. We test the data path from instrument to result to clinician/EHR, verify integrity of the reported result, and audit the change-control story for the assay's software and decision rules. Where AI/ML is in the result chain, supply-chain controls and any PCCP cyber elements are documented in the SPDF."},{q:"How do you address third-party reagent / consumable identification?",a:"Reagent and cartridge identification (RFID, barcode, vendor-proprietary) is exercised for spoofing, replay, and counterfeit-consumable acceptance, since accepting a non-genuine consumable is both a clinical and a business-model issue. The SPDF documents the integrity controls and the threat model traces them back to specific patient-impact scenarios."},{q:"What standards stack applies to IVDs?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304, ISO 14971, ISO 13485, IEC 81001-5-1 for the secure software lifecycle, plus IEC 61010 for the instrument and CLSI standards where applicable. EU manufacturers operating under IVDR add Annex I requirements and MDCG guidance; we map artifacts across both regimes."},{q:"How long does an IVD premarket cyber engagement typically take?",a:"For a connected core-lab analyzer with middleware and LIS integration, end-to-end premarket cyber work generally runs 8-14 weeks. POC molecular or rapid devices with cloud and EHR integration typically run 6-10 weeks. Threat modeling and SBOM front-load, pen testing across analyzer/middleware/integrations runs in the middle weeks, and the consolidated submission package and postmarket plan close out at the end - all under a written deficiency commitment."}]},{slug:"ophthalmic-devices",name:"Ophthalmic Devices",shortName:"Ophthalmic",icon:H_,tagline:"Cybersecurity for surgical, diagnostic, and therapeutic ophthalmic devices.",metaTitle:"Ophthalmic Device Cybersecurity | FDA Premarket Support",metaDescription:"FDA cybersecurity for ophthalmic surgical lasers, OCT, and diagnostic platforms. Threat modeling, pen testing, and SBOM for ophthalmic manufacturers.",intro:"Ophthalmic devices range from precision surgical lasers to OCT scanners and connected diagnostic platforms. We tailor cyber engagements to the specific clinical workflow and image data pipeline.",examples:["Femtosecond and excimer lasers","OCT and fundus imaging","Phacoemulsification systems","Connected diagnostic platforms","Visual field analyzers"],risks:[{title:"Image and DICOM pipeline",body:"Ophthalmic imaging vendors frequently expose DICOM services with weak authentication."},{title:"Service interface exposure",body:"Maintenance interfaces over USB, Ethernet, and serial need authenticated lockdown for shipped product."}],pathways:["510(k)","De Novo","PMA"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 60601-2-22","IEC 62304"],services:["fda-premarket-cybersecurity-services","medical-device-threat-modeling","medical-device-penetration-testing"],faqs:[{q:"Do ophthalmic devices need DICOM-specific cybersecurity testing?",a:"Yes. OCT, fundus cameras, perimetry systems, and ophthalmic surgical platforms almost universally use DICOM (with a
209strong dose of Eye Care-specific service classes), so DICOM service fuzzing, authorization tests across C-STORE/C-FIND/C-MOVE, and parser memory-safety evidence are part of the scope. DICOM toolkits have a long CVE history and reviewers expect explicit testing rather than narrative claims of conformance."},{q:"How do you scope a surgical-laser cybersecurity engagement?",a:"We focus on the control system (laser parameter authorization, energy-delivery integrity, foot-pedal and treatment-pattern interfaces), the service interfaces (USB, serial, vendor remote support), and any networked planning workflow that feeds the device. Safety-critical control paths are exercised on staging hardware only and coordinated with the device's IEC 60601-1 (and applicable -2-22 for laser surgical) and IEC 14971 risk file. The SPDF captures every interface, its authentication, and its failure mode."},{q:"What about OCT and fundus image data on the cloud?",a:"Cloud-stored ophthalmic images are PHI and frequently sensitive (they reveal systemic conditions beyond ophthalmology). We test encryption at rest and in transit, key custody, tenant isolation, and authorization on every read path - including image-sharing flows between practices and reading centers. The SPDF documents storage regions, retention, and any cross-border data flow so reviewers, hospital procurement, and privacy counsel see one coherent story."},{q:"Are USB and serial service interfaces in scope?",a:"Yes. Service ports (USB, RS-232, Ethernet service VLAN, vendor proprietary) are a common path to privileged access on ophthalmic platforms, and they're a frequent FDA finding when left enabled by default. We verify that they're authenticated, locked down on shipped product, gated by physical or procedural controls, and properly documented in labeling. The threat model treats them as untrusted local interfaces regardless of how 'internal' the vendor considers them."},{q:"How do you support a 510(k) or De Novo for an OCT or imaging device?",a:"Standard premarket cyber package: STRIDE-based threat model, SBOM in SPDX or CycloneDX with VEX, security architecture views, authenticated penetration testing focused on DICOM, network, service, and (when present) cloud surfaces, MDS2, labeling content, and a postmarket cybersecurity management plan under section §524B. Everything is packaged for eSTAR and cross-references the IEC 14971 risk file."},{q:"Do you cover the in-clinic workstation that drives the device?",a:"When the workstation is part of the cleared system or recommended configuration, OS hardening, application allowlisting, update mechanisms, and remote-access exposure are all in scope. End-of-life Windows is documented with compensating controls (segmentation, allowlisting, restricted services) plus a migration plan - reviewers accept that combination but reject silence on it."},{q:"How do you handle AI-driven ophthalmic SaMD (DR screening, AMD analysis, glaucoma progression)?",a:"AI ophthalmic SaMD is treated like other AI/SaMD: model supply-chain controls (signing, version pinning, load-time verification), training-data lineage in the SPDF, adversarial-input testing where clinically meaningful, and PCCP-aware change control if you have one. The DICOM ingestion path is fuzzed and authorization-tested separately from the model so issues in either layer are isolated and traceable."},{q:"What about reading-center and tele-ophthalmology integrations?",a:"Reading centers and tele-ophthalmology partners are modeled as explicit external trust boundaries with documented authentication, authorization, and data-retention controls. We test the case-routing and image-sharing APIs for cross-tenant isolation and stale-session access, and we verify that revocation flows actually terminate the partner's access. These integrations frequently surface authorization findings if not designed deliberately."},{q:"How do you cover surgical-suite integration (e.g., femto-cataract, vitrectomy platforms)?",a:"Surgical platforms are scoped as connected systems within the OR sub-network: console, foot pedal, irrigation/aspiration controllers, energy modules, navigation, and any imaging integration. We model the OR network with explicit trust boundaries, exercise vendor remote-service tunnels for MFA/jump-host/session-recording compliance, and pen-test the service paths end-to-e
209nd - the same playbook applied to surgical robotics, scaled to ophthalmic specifics."},{q:"What standards stack applies to ophthalmic devices?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (often Class B or C depending on indication), ISO 14971, IEC 60601-1 with applicable particulars (e.g., -2-22 for laser surgical, -2-57 for ophthalmic light sources), and DICOM-specific test cases. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map across both regimes."},{q:"What postmarket cybersecurity expectations apply?",a:"A formal postmarket cybersecurity management plan under section §524B: continuous SBOM monitoring across device firmware, embedded OS, in-clinic workstation, and any cloud components; CVD intake with severity-based SLAs; controlled patching through the QMS; and a secure update mechanism (signed, anti-rollback, atomic, recovery-safe) that respects clinic uptime constraints."}]},{slug:"dental-devices",name:"Dental Devices",shortName:"Dental",icon:Gm,tagline:"Cybersecurity for digital dentistry, intraoral scanners, and CAD/CAM.",metaTitle:"Dental Device Cybersecurity | Digital Dentistry FDA Support",metaDescription:"FDA cybersecurity for intraoral scanners, dental CAD/CAM, and connected dental platforms. Threat modeling and pen testing for dental device makers.",intro:"Digital dentistry is rapidly becoming connected - intraoral scanners, CAD/CAM mills, and cloud case-design platforms all carry patient data and clinical workflows that need to be secured.",examples:["Intraoral scanners","Cone beam CT (CBCT)","CAD/CAM design platforms","Cloud case management","Implant planning software"],risks:[{title:"Cloud case data exposure",body:"Case-design platforms are multi-tenant SaaS - tenant isolation and PHI handling must be designed and tested."},{title:"Workstation OS hardening",body:"Scanner and CAM workstations frequently ship as un-hardened Windows."}],pathways:["510(k)"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304","HIPAA Security Rule"],services:["fda-premarket-cybersecurity-services","medical-device-threat-modeling","web-application-penetration-testing"],faqs:[{q:"Are dental SaaS platforms regulated as medical devices?",a:"Many are SaMD when they make clinical claims - implant planning, orthodontic treatment planning, automated caries detection on radiographs, and similar features routinely cross the SaMD threshold. When in doubt we help you scope a Pre-Submission to FDA so the regulatory line is settled before architecture decisions lock in. The threat model and SBOM scope follow that determination, which keeps cyber effort proportional to the actual regulatory posture."},{q:"Do intraoral scanners need FDA cyber documentation?",a:"Yes when cleared as a medical device. Even when the scanner itself is low-risk hardware, the connected workflow (cloud case design, CAD/CAM mill output, EHR integration, third-party labs) typically pulls cyber into scope because the regulated indication depends on the integrity of the data moving through that pipeline. We test the device, the cloud, and the boundary between them as one connected system."},{q:"How do you test a cloud case-design platform?",a:"Web and API penetration testing with explicit cross-tenant authorization (BOLA) checks, plus a review of PHI handling, retention, audit logging, and key custody. We pay particular attention to the case-sharing model between dentists, labs, and specialists - that's where authorization issues most commonly surface. The architecture, data flows, and trust boundaries are documented in the threat model and traced back to specific test cases in the report."},{q:"What about the CAD/CAM workstation OS?",a:"When the workstation is part of the cleared system or the recommended configuration, OS hardening, application allowlisting, update mechanisms, and remote-access exposure all get reviewed and documented in the SPDF. End-of-life Windows on milling stations is a common finding and is addressed with compensating controls (segmentation, allowlisting, restricted services) plus a documented migration path - reviewers expect that combination, not silence on the topic."},{q:"Is HIPAA enough for a dental cloud platform?",a:"No. HIPAA covers privacy, breach response, and the obligations of covered entities and business associates - it does not satisfy FDA premarket cybersecurity content (SPDF, threat model, SBOM, security architecture, testing) when the platform is SaMD. Both apply in parallel, and the cyber documentation has to demonstrate alignment between HIPAA controls and FDA-expected security risk management under AAMI SW96 and ISO 14971."},{q:"How do you handle third-party design libraries and milling presets?",a:"Each library and preset bundle is treated as a SBOM component with explicit integrity controls: signed at the source, version-pinned in the application, and verified at load time. We test the update mechanism end to end - including how a malicious or substituted library would be detected and rejected - because corrupted prosthesis presets can produce a clinically meaningful (and litigable) outcome. The chain from supplier to clinician is documented as a tamper-evident pipeline."},{q:"What about AI-driven dental imaging (caries, perio, orthodontic analysis)?",a:"AI de
209ntal SaMD is treated like other AI/SaMD: the model gets supply-chain controls (signing, version pinning, load-time verification), training-data lineage is documented in the SPDF, adversarial-input testing is performed where clinically meaningful, and any PCCP describes how cyber posture is maintained across model updates. DICOM and proprietary image ingestion paths are fuzzed and authorization-tested separately from the model itself."},{q:"Do you cover lab-to-clinician data flows?",a:"Yes. The lab boundary is one of the highest-risk authorization surfaces in dental software because cases routinely route to external labs and specialists with varying security postures. We model the lab as an explicit untrusted-but-authenticated party, test cross-account isolation, and document the retention and access controls that apply when a case leaves the practice tenant."},{q:"How do you handle integrations with practice management systems and EHRs?",a:"PMS/EHR integrations (HL7 v2, FHIR, vendor-specific REST) are enumerated as distinct interfaces with their own authentication, authorization, and parser-robustness tests. Where SMART on FHIR or OAuth is used we verify scope handling and token revocation. Findings here often have outsized impact because a PMS compromise can affect every case in flight."},{q:"What standards stack applies to dental SaMD and connected hardware?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, IEC 62304 (often Class B for case-design SaMD, Class C for treatment-affecting AI), ISO 14971, OWASP ASVS for web/API, OWASP MASVS for any mobile components, plus DICOM-specific test cases for image ingestion. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map artifacts across both regimes."},{q:"How long does a dental-device premarket cyber engagement typically take?",a:"For a cloud SaMD case-design platform with mill/scanner integration, end-to-end premarket cyber work generally runs 5-9 weeks. Threat modeling and SBOM front-load in weeks 1-3, web/API/DICOM/integration pen testing runs in weeks 3-7, and the consolidated submission package and postmarket plan close in the final weeks. Scope and clearance-commitment terms are confirmed in writing before kickoff."}]},{slug:"hearing-devices",name:"Hearing Devices",shortName:"Hearing",icon:vD,tagline:"Cybersecurity for hearing aids, cochlear implants, and OTC hearing.",metaTitle:"Hearing Device Cybersecurity | Cochlear & OTC Hearing FDA Support",metaDescription:"FDA cybersecurity for hearing aids, cochlear implants, and OTC hearing devices. BLE, mobile, and cloud pen testing for hearing manufacturers.",intro:"BLE-connected hearing aids and cochlear implants are increasingly programmable from patient-facing apps. We secure the BLE link, mobile companion, and fitting workflow.",examples:["Prescription hearing aids","OTC hearing aids","Cochlear implants","Bone-anchored hearing systems","Tinnitus therapy devices"],risks:[{title:"BLE programming interfaces",body:"Audio-streaming and programming services on hearing devices need authentication and authorization separation."},{title:"Fitting software supply chain",body:"Audiologist fitting software is a privileged client and a target for supply-chain attacks."}],pathways:["510(k)","De Novo","OTC special controls"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304"],services:["fda-premarket-cybersecurity-services","medical-device-penetration-testing","mobile-application-penetration-testing"],faqs:[{q:"Do OTC hearing aids need a cyber package?",a:"If they're connected and software-controlled - which nearly all modern OTC hearing aids are - then yes. The OTC Hearing Aid Final Rule and the associated special controls reference applicable FDA cybersecurity guidance, so the premarket package (threat model, SBOM, security testing, labeling content) applies. We tailor the depth to the actual connectivity surface so OTC submissions don't get over-scoped."},{q:"How do you test the BLE programming interface vs. the audio path?",a:"We separate audio-streaming services (typically LE Audio, ASHA, or vendor profiles) from programming/configuration services in the threat model and test them as distinct interfaces. Every programming command - whether issued by the audiologist's fitting software or the patient companion app - is verified for authentication, authorization, and replay resistance. Audio-only services are reviewed for DoS and downgrade behavior so a hostile peer can't drop the device into an insecure mode."},{q:"What about the audiologist fitting software?",a:"Fitting software is a privileged client with the ability to change clinically meaningful parameters, so it's treated as a connected system component. We review its software supply chain, code signing, update path, credential handling, and the protocol it uses to talk to the device, and we pen-test the entire path including any cloud-side configuration storage. Findings here are some of the highest-impact in the segment because a compromised fitting workstation can affect many patients."},{q:"Are cochlear and brain-stem implants treated like other implantables?",a:"Yes. Cochlear implants and auditory brainstem implants (ABIs) get the same expectations as other Class III active implantables: a full premarket cyber package, postmarket vulnerability management, a documented secure update path (often constrained by inductive or low-bandwidth RF), a CVD program, and a 10-15 year crypto-agility plan. The IEC 14971 risk file ties the cyber controls to specific patient hazards."},{q:"How do you handle the patient companion mobile app?",a:"Standard mobile premarket package: OWASP MASVS L2 baseline, MSTG-driven test cases, secure storage of pairing material, TLS pinning, jailbreak/root detection where clinically justified, and authorization checks against both the device and any cloud APIs. Streaming and call audio paths are reviewed for c
209onfidentiality and integrity, especially when the app is also acting as a remote microphone."},{q:"What's expected for OTC hearing aid labeling and IFU cyber content?",a:"The IFU should include cybersecurity content consistent with FDA premarket guidance: pairing instructions and what 'good' looks like, OTA update behavior and user actions, expected support lifetime, and a coordinated vulnerability disclosure point of contact. Hospital and audiology procurement reviewers also expect MDS2 alignment with the SPDF so claims don't contradict each other."},{q:"How do you address tinnitus, hearing-screening, and rehab apps that integrate with the hearing aid?",a:"Companion clinical apps (tinnitus masking, auditory training, screening) are scoped as part of the connected system whenever they affect device behavior or generate clinical data. We test their API surface, authorization model, and data flows, and we make sure the threat model covers third-party integrations (e.g., audiology EHRs, telehealth platforms) as untrusted boundaries."},{q:"How do you handle accessory ecosystems (TV streamers, remote mics, chargers)?",a:"Each accessory that pairs with the hearing aid is enumerated as a system component with its own pairing flow, firmware update path, and trust boundary. We test pairing for impersonation and downgrade, exercise OTA on the accessory firmware, and verify that compromise of an accessory cannot escalate into programming-level access on the device. Accessories are a recurring source of audit findings because they're often built by sub-vendors with weaker baselines."},{q:"What standards stack applies to advanced/connected hearing devices?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, IEC 62304, IEC 60601-1 with applicable particulars, ISO 14971, OWASP MASVS for the mobile app, and Bluetooth SIG profile-specific security requirements. EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16, and we map the same artifacts across both regimes."},{q:"What postmarket plan applies under section §524B?",a:"Continuous SBOM monitoring on device firmware, fitting software, mobile app, and accessory firmware; a CVD intake with published acknowledgment and remediation SLAs; a controlled patching process through the QMS; and a secure update mechanism design that respects the device's bandwidth and battery constraints. We deliver the postmarket plan as part of the premarket package so it's ready for clearance."},{q:"How long does a hearing-device premarket cyber engagement typically take?",a:"For a connected OTC or prescription hearing aid with companion app and accessories, end-to-end premarket cyber work generally runs 6-10 weeks. Cochlear and ABI engagements run 10-16 weeks given the implant complexity and Class III expectations. Threat modeling and SBOM front-load, pen testing runs in the middle weeks, and the consolidated package closes in the final weeks - all under a written deficiency commitment."}]},{slug:"orthopedic-implants",name:"Orthopedic & Implantable Devices",shortName:"Orthopedic / Implants",icon:Rw,tagline:"Cybersecurity for smart implants, orthopedic robots, and surgical planning.",metaTitle:"Smart Implant & Orthopedic Cybersecurity | FDA Support",metaDescription:"FDA cybersecurity for smart orthopedic implants, surgical planning software, and orthopedic robots. Threat modeling and pen testing for ortho.",intro:"Modern orthopedics combines pre-op planning SaMD, intra-op robotics, and increasingly sensor-equipped implants. Each layer needs targeted cybersecurity work.",examples:["Sensor-enabled smart implants","Orthopedic surgical robots","Pre-op planning SaMD","Patient-specific instrument workflows"],risks:[{title:"Implant telemetry",body:"BLE-equipped smart implants need authenticated readouts and privacy-preserving analytics."},{title:"Planning-to-OR data flow",body:"Pre-op plans must be integrity-protected from cloud through to robot or guide."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304"],services:["fda-premarket-cybersecurity-services","medical-device-threat-modeling","medical-device-penetration-testing"],faqs:[{q:"Are smart orthopedic implants high-risk for cyber?",a:"Risk is workflow-dependent. Passive sensors that only telemeter healing data are lower risk; active or therapeutic implants (e.g., closed-loop spinal cord stimulators, smart prostheses with motor control) get full FDA premarket scrutiny equivalent to other Class III implantables. The threat model has to make that distinction explicit and tie it back to the IEC 14971 risk file so reviewers can see why the cyber controls scale with patient harm."},{q:"How do you secure the planning-to-OR data flow for patient-specific guides and implants?",a:"Pre-op plans, patient-specific instrument (PSI) designs, and implant-design files are integrity-protected from cloud planner through to manufacturer and on to the OR. Every consuming endpoint - the mill, the 3D printer, the navigation system, the robot - verifies a signature before it accepts the file. We document the chain of custody, test the upload/download path for tampering and misrouting, and include the controls in the SPDF so a substituted or altered design cannot reach a patient."},{q:"What about pre-op planning SaMD running on the cloud?",a:"Standard SaMD package: web/API penetration testing, BOLA and multi-tenant authorization checks, SBOM with VEX, threat modeling of the export-to-OR boundary, and authorization scoping for surgeons, residents, and reps. We also test the integration with imaging (DICOM/CT/MR
209) and any AI segmentation modules as distinct trust boundaries with their own supply-chain controls."},{q:"Do sensor-enabled orthopedic implants need a Coordinated Vulnerability Disclosure (CVD) program?",a:"Yes. Any connected implant with a long deployed lifetime needs a documented CVD program, public intake (e.g., security.txt, vendor portal), defined acknowledgment and remediation SLAs, and SBOM monitoring against NVD, vendor advisories, and CISA KEV. FDA's 2026 premarket guidance and section §524B both cite this expectation explicitly for connected devices, and reviewers will look for the artifact."},{q:"How do you test the orthopedic robot itself?",a:"Same playbook as general surgical robotics: scope the OR sub-network, model the console/arm/imaging integrations as a connected system with explicit trust boundaries, exercise vendor remote-service tunnels for MFA/jump-host/session-recording compliance, and run console-to-arm control-path integrity tests on staging hardware only. Findings feed back into the IEC 14971 risk file and the SPDF."},{q:"Can patient-specific instrument (PSI) workflows be in scope for cyber testing?",a:"Yes. The design file's integrity from cloud planner to manufacturer to OR is treated as a tamper-evident chain. We document the signing keys, key custody, signature verification points, and rollback / revocation procedures, and we test the upload/download path for tampering, misrouting, and replay. PSI workflows often span multiple vendors, so trust boundaries and contractual security obligations are made explicit in the threat model."},{q:"How do you handle imaging integrations (CT, MR, fluoro) on orthopedic platforms?",a:"Each imaging interface is enumerated with its protocol (DICOM C-STORE/Q/R, proprietary), authentication mechanism, and parser. We fuzz the DICOM stack and authorization-test multi-modality service classes. Where the imaging device is third-party, we model it as untrusted input regardless of vendor reputation - DICOM toolkits have a long CVE history and reviewers expect explicit memory-safety evidence."},{q:"What standards stack applies to smart orthopedic implants?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96 (security risk management), AAMI TIR57, IEC 62304 (software lifecycle, often Class C), ISO 14971 (risk management), and IEC 60601-1 with applicable particulars where electrically-active. For the EU, MDR Annex I §17.2 and MDCG 2019-16 apply, and we map the same artifacts to both regimes to avoid duplicate work."},{q:"How do you cover the surgeon-facing app or tablet?",a:"When the app or tablet is part of the cleared system, it gets the standard mobile premarket package: MASVS-aligned testing, secure storage, TLS pinning, root/jailbreak detection where clinically justified, and authorization checks against the planner and any device APIs. Off-the-shelf tablets used as accessories are addressed through labeling assumptions and the threat model's environmental controls."},{q:"What postmarket cybersecurity expectations apply for smart implants?",a:"A formal postmarket cybersecurity management plan is now required under section §524B: continuous SBOM monitoring across the implant firmware, programmer, and any cloud planner; CVD intake; severity-based SLAs; controlled patching processes through the QMS; and a secure update mechanism design (signed, anti-rollback, atomic, recovery-safe) you can defend in a recall or 522 conversation. We deliver these as part of the package, not as an afterthought."},{q:"How long does a smart-implant premarket cyber engagement typically take?",a:"For a connected implant with a planner, app, and (often) a robot or guided instrumentation, end-to-end premarket cyber work generally runs 10-16 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across implant firmware, app, planner, and any service interfaces runs in weeks 4-12, and the consolidated submission package and postmarket plan close in the final weeks. Clearance-commitment terms and timeline are confirmed in writing at kickoff."}]},{slug:"womens-health",name:"Women's Health Devices",shortName:"Women's Health",icon:Q_,tagline:"Cybersecurity for fertility, maternal, and women's health devices.",metaTitle:"Women's Health Device Cybersecurity | FDA Support",metaDescription:"FDA cybersecurity for fertility monitoring, fetal monitors, breast pumps, and connected women's health devices. Pen testing, SBOM, threat modeling.",intro:"Connected women's health devices handle uniquely sensitive data and often integrate consumer-grade hardware with clinical claims. We help manufacturers reach FDA cyber expectations without losing the consumer-product feel.",examples:["Fertility tracking devices","Fetal and maternal monitors","Connected breast pumps","Pelvic floor therapy devices"],risks:[{title:"Sensitive data handling",body:"Reproductive and pregnancy data require explicit consent flows, minimal retention, and strong access controls."},{title:"Consumer hardware origins",body:"Devices that started as consumer products often inherit insecure defaults that need to be removed before clearance."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","IEC 62304","HIPAA Security Rule"],services:["fda-premarket-cybersecurity-services","mobile-application-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"How do you handle reproductive-data sensitivity in a threat model?",a:"Reproductive, menstrual, and fertility data is high-sensitivity health information that can carry legal exposure beyond HIPAA - particularly under state-level reproductive privacy statutes. We model misuse and over-collection alongside conventional confidentiality, integrity, and availability threats, and we recommend explicit retention windows, minimization, and access patterns FDA reviewers and privacy counsel both expect to see. The SPDF documents the data classification, lawful basis, and the controls (encryption, access scoping, audit) that enforce it."}
209,{q:"What's the playbook for consumer-grade hardware becoming a cleared device?",a:"Consumer hardware moving into a regulated indication usually carries baseline hygiene problems - default credentials, exposed debug interfaces (UART/JTAG/SWD), insecure radios, undocumented OTA paths, and unsigned firmware. We run a hardening sweep first, lock down those baseline issues, generate a clean SBOM, and only then build the FDA-aligned premarket cyber package on top. Trying to add the FDA package without remediating the consumer-era debt almost always produces deficiency letters."},{q:"Do connected fetal/maternal monitors get the full premarket cyber package?",a:"Yes. Connected fetal and maternal monitors are networked medical devices with safety-relevant alarms - exactly the class of product the 2026 FDA premarket cyber guidance and AAMI SW96 are written for. Deliverables include the threat model, SBOM (SPDX or CycloneDX) with VEX, security architecture views, authenticated penetration testing of device, app, and cloud, MDS2, labeling content, and a postmarket cybersecurity management plan under section §524B."},{q:"How do you cover partner / caregiver sharing in fertility and pregnancy apps?",a:"Account sharing is modeled as an explicit authorization boundary with explicit consent and revocation flows, not as a UI feature. The API is tested for BOLA (broken object-level authorization), tenancy leaks across linked accounts, and stale-token access after revocation - these are the most common findings in this segment. The threat model and the privacy policy must agree on what a 'partner' can see and for how long; if they don't, the inconsistency surfaces in both FDA review and state AG inquiries."},{q:"Is HIPAA enough for a women's health platform?",a:"No. HIPAA covers a slice (covered entities, business associates, breach response) and applies only when the platform is acting in those roles. FDA premarket cybersecurity content is required when the product is a regulated device, regardless of HIPAA status. State-level reproductive privacy laws (e.g., Washington's MHMDA, California, Connecticut) impose additional obligations on consent, sale, and disclosure of reproductive health data and need to be reflected in the security and privacy design."},{q:"How do you document cloud regions and data residency?",a:"The SPDF and the privacy notice should tell the same story: storage regions, key custody, replication scope, sub-processor list, and any cross-border transfer mechanisms. We document the data flows in the threat model, identify any data that leaves the primary region (including incidentally - logs, metrics, support tooling), and verify the controls in pen testing. This single coherent story is what reviewers, hospital procurement, and privacy counsel all need."},{q:"What about cycle-tracking algorithms that influence clinical decisions?",a:"When predictions affect clinical decisions (e.g., fertility windows used for conception or contraception), the algorithm is part of the regulated software and the cyber package must address its supply chain, model integrity, training data lineage, and adversarial-input resistance. We treat it the same way we treat AI/SaMD: signing, version pinning, load-time verification, and PCCP-aware change control."},{q:"How do you handle pregnancy and pediatric data retention?",a:"Pregnancy data carries an extra duty because it implicates the fetus and, after birth, a separate pediatric record. We document retention separately for the gestational period, postpartum, and pediatric continuation, with explicit deletion paths and parental consent flows. These controls are tested in the cloud pen test and called out in the labeling and IFU."},{q:"Do you cover wearables that pair with women's health apps?",a:"Yes. Paired wearables (BLE thermometers, smart rings, breast pumps, pelvic-floor trainers) are scoped as part of the system: BLE pairing mode, OTA signing, sensor-spoofing resistance, and battery/DoS handling are all in the test plan. Findings against the wearable feed back into the device-level threat model and SBOM."},{q:"What's the postmarket plan look like for women's health software?",a:"Continuous SBOM monitoring across mobile, web, backend, and any wearable firmware; a published Coordinated Vulnerability Disclosure (CVD) intake; defined SLAs by severity; and a documented path from CVE to controlled software change under your QMS. Because this segment frequently ships fast through app stores, the postmarket plan must explicitly address how mobile updates are managed without breaking the cleared interoperability or claims."},{q:"How long does a women's-health premarket cyber engagement take?",a:"Typical end-to-e
209nd timeline is 4-8 weeks for a software-only DTx-style product and 8-12 weeks when paired wearables, fetal/maternal monitors, or significant cloud architecture are in scope. Threat modeling and SBOM front-load in weeks 1-3, mobile/web/API and (where applicable) device pen testing run in weeks 3-8, and the consolidated submission package and postmarket plan close out in the final weeks. Scope and clearance-commitment terms are confirmed in writing before kickoff."}]},{slug:"cardiac-rhythm-management",name:"Cardiac Rhythm Management (CRM)",shortName:"Cardiac Rhythm Management",icon:E_,tagline:"Cybersecurity for pacemakers, ICDs, CRT-Ds, leadless pacers, ILRs, programmers, and home monitors.",metaTitle:"Cardiac Rhythm Management Cybersecurity | Pacemakers, ICDs",metaDescription:"FDA cybersecurity for pacemakers, ICDs, CRT-Ds, leadless pacers, ILRs, in-clinic programmers, and home-monitoring systems. Threat modeling, SBOM, pen testing.",intro:"Cardiac Rhythm Management (CRM) devices - pacemakers, ICDs, CRT-Ds, S-ICDs, leadless pacers, and insertable cardiac monitors - carry the longest, most public cybersecurity track record of any medical device class. The St. Jude Medical / Abbott Merlin@home advisories (2017), Medtronic Conexus telemetry (ICSMA-19-080-01, 2019), and Medtronic CareLink 2090 programmer findings (ICSMA-18-128-01, 2018) define how the FDA reviews this segment today. We build premarket and postmarket cybersecurity packages tuned to the implant-to-programmer link, the home-monitor backhaul, and the 10-15 year deployed fleet.",examples:["Pacemakers (single-, dual-, and biventricular)","Implantable cardioverter-defibrillators (ICDs, S-ICDs)","Cardiac resynchronization therapy devices (CRT-D, CRT-P)","Leadless pacemakers (e.g., Micra-class)","Insertable loop recorders (ILRs)","In-clinic programmers","Home-monitoring transmitters (CareLink, Merlin@home, LATITUDE-class)"],risks:[{title:"Implant-to-programmer telemetry trust",body:"Inductive, MICS-band, and BLE links between implant and programmer must enforce mutual authentication, session keys, and replay protection - Conexus-class flaws are the canonical reviewer reference."},{title:"Home-monitor backhaul and fleet management",body:"Cellular and Wi-Fi backhaul from home monitors needs certificate pinning, secure boot, anti-rollback, and tamper-evident telemetry; the fleet-management plane can affect every patient device at once if compromised."},{title:"Long-lived crypto on 10-15 year implants",body:"Cryptography chosen today must remain defensible across the implant's deployed lifetime, with explicit algorithm agility, key rotation, and a post-quantum migration plan."},{title:"Programmer trust boundary",body:"In-clinic programmers are full computing systems on hospital networks - OS hardening, software supply chain, physical port lockdown, and session management are all in scope."}],pathways:["PMA","PMA Supplement","510(k)"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","ISO 14708-2 / 14708-6","IEC 60601-2-31","IEC 62304 (Class C)","IEC 8
2091001-5-1","ISO 14971"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"How does CRM differ from the broader Cardiovascular Devices segment for cybersecurity purposes?",a:"CRM is the implantable-rhythm subset - pacemakers, ICDs, CRT-Ds, S-ICDs, leadless pacers, and ILRs - with their programmers and home-monitoring chain. It shares the long-fleet, implant-link, and home-monitor concerns of broader cardiovascular but adds two distinctive things: the documented public failure history that the FDA explicitly references (St. Jude/Abbott Merlin@home, Medtronic Conexus, CareLink 2090), and the rhythm-specific essential performance under IEC 60601-2-31 and ISO 14708-2/6. Reviewers expect a CRM submission to address those lessons in the threat model and the postmarket plan, not just generic cardiovascular controls."},{q:"How do you test the implant-to-programmer telemetry link (MICS, inductive, BLE)?",a:"We characterize the protocol with SDR (for MICS-band and proprietary RF) and BLE-aware tooling (for newer programmers), then exercise mutual authentication, session establishment, replay, downgrade, pairing-mode abuse, and parameter-write authorization on staging hardware - never on a clinical system. The Conexus disclosure (ICSMA-19-080-01) is the canonical pattern: unauthenticated and unencrypted telemetry was the root cause, so we explicitly test for those properties and document positive evidence of authentication and integrity for the submission."},{q:"Do you cover the home-monitoring transmitter (CareLink / Merlin@home / LATITUDE class) separately?",a:"Yes. Home transmitters are scoped as connected system components with their own threat model, OS hardening review, software-supply-chain analysis, and pen test. Cellular and Wi-Fi configuration, certificate validation and pinning, secure boot, anti-rollback, tamper-evident telemetry, and the cloud APIs they call are all tested. The cellular fleet-management layer gets dedicated attention because compromise there can affect every patient device simultaneously - the Abbott Merlin@home advisory is the reference reviewers cite."},{q:"How do you address long-lifetime crypto on a 10-15 year implant?",a:"The design includes explicit crypto agility: algorithm identifiers in protocol headers, key rotation procedures, primitive deprecation paths, and a documented post-quantum migration plan. The SPDF and the postmarket plan describe how a primitive becomes obsolete and how the deployed fleet is migrated without loss of therapy continuity. For battery-constrained implants we document the energy budget for each cryptographic primitive so reviewers can see the agility plan is physically realistic."},{q:"Can you support a PMA Supplement for cyber-only changes (e.g., adding remote monitoring, changing crypto)?",a:"Yes. We deliver a focused delta threat model, an updated SBOM with VEX, and an incremental test report scoped to the new path so reviewers can see the change clearly. The package cross-references the previously approved submission and the IEC 14971 risk file so the delta is unambiguous - exactly what PMA Supplement reviewers look for in cyber-only changes."},{q:"How do you handle CIED fleet heterogeneity (multiple firmware generations in the field)?",a:"Active CRM fleets typically span multiple firmware generations and pairings. The postmarket plan documents the supported configuration matrix, the patching strategy per generation, and the EOL/EOS communications plan, and we verify that compensating controls hold for older generations that can no longer accept secure updates. The matrix lives in the postmarket plan and is referenced by the SPDF so the FDA reviewers and hospital procurement see the same story."},{q:"What about MDS2, hospital procurement, and the relationship to the FDA submission?",a:"We produce an MDS2 that's consistent with your SPDF, labeling, and pen-test summary so hospital security reviews don't contradict your FDA submission. Inconsistencies between MDS2, SBOM, and the FDA package are one of the most common reasons CRM products stall in procurement at academic medical centers - and they're easy to avoid when the artifacts are produced together rather than reverse-engineered later."},{q:"How do you handle in-clinic programmer threats (CareLink 2090-class issues)?",a:"The CareLink 2090 advisory (ICSMA-18-128-01) is the canonical reviewer reference for programmer trust: unauthenticated update paths, exposed maintenance interfaces, and weak physical-port controls. We test programmers as full computing systems: OS hardening, softw
209are supply chain, lock-screen behavior, session timeouts, USB/serial service ports, audit logging, and update integrity. The IFU and labeling document the operational assumptions the clinic is expected to enforce, and the SPDF makes the residual risk explicit."},{q:"How are cyber findings handled in the recall / 522 calculus for CRM?",a:"CRM is the segment where cyber findings most often drive 522 orders and field corrections - the Abbott firmware update for Merlin@home-paired implants is the public example. We document the secure-update mechanism (signed payloads, anti-rollback, atomic install, staged rollout, rollback-safe) and the CVD process that triggers field updates premarket, so that when a finding lands, the field-action path is already designed and documented rather than improvised."},{q:"What standards stack applies to a modern CRM device?",a:"Typical baseline: FDA 2026 final premarket cybersecurity guidance, AAMI SW96, AAMI TIR57, IEC 62304 (Class C for active implantables), ISO 14971, IEC 60601-1 with IEC 60601-2-31 for external pacemaker pulse generators, IEC 81001-5-1 for the secure software lifecycle, and the ISO 14708 series (notably 14708-2 for cardiac pacemakers and 14708-6 for tachyarrhythmia devices). EU manufacturers add MDR Annex I §17.2 and MDCG 2019-16; we map artifacts across both regimes."},{q:"Will the FDA expect a Coordinated Vulnerability Disclosure (CVD) program and SBOM monitoring under section §524B?",a:"Yes. Long-lived CRM implants are exactly the use case section §524B and the 2026 guidance are written for. We deliver the CVD policy, public intake (e.g., security.txt, vendor portal), acknowledgment and remediation SLAs, severity-based triage, and the QMS process from CVE through controlled software change as part of the premarket package. Continuous SBOM monitoring runs against implant firmware, programmer, and home-monitor components."},{q:"How long does a CRM premarket cyber engagement typically take?",a:"For a new connected CRM platform with implant, in-clinic programmer, home-monitor, and patient/clinician portal, end-to-end premarket cyber work generally runs 14-20 weeks. Threat modeling and SBOM front-load in weeks 1-5, pen testing across implant link, programmer, home-monitor, cloud, and portal runs in weeks 5-16, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"respiratory-ventilation",name:"Respiratory & Ventilation Devices",shortName:"Respiratory / Ventilation",icon:ED,tagline:"Cybersecurity for ventilators, CPAP/BiPAP, oxygen concentrators, and connected respiratory therapy.",metaTitle:"Ventilator & Respiratory Device Cybersecurity | FDA Premarket",metaDescription:"FDA cybersecurity for ventilators, CPAP/BiPAP, anesthesia ventilation, and connected oxygen concentrators. Threat modeling, SBOM, pen testing tuned to safety-critical ventilation control loops.",intro:"Ventilators and respiratory therapy devices sit on a safety-critical control loop where a compromised setpoint can directly affect oxygenation. The Philips Respironics recalls and the ICU/home-vent connectivity push have moved this segment to the top of the FDA's postmarket scrutiny list. We deliver premarket and postmarket cybersecurity packages tuned to the ventilator-to-clinical-network path, the home/cloud telemetry backhaul, and the long deployed service life of capital respiratory equipment.",examples:["ICU and transport ventilators","Anesthesia ventilation modules","CPAP / BiPAP / ASV devices","High-flow nasal oxygen","Portable oxygen concentrators","Home ventilator cloud-monitoring platforms"],risks:[{title:"Setpoint and alarm-tampering paths",body:"Tidal volume, PEEP, FiO2, and alarm-threshold writes are safety-critical state - any path that can modify them (touchscreen service mode, clinical network, USB service port, cloud) must be authenticated, integrity-protected, and audited."},{title:"Hospital-network and biomed-tool exposure",body:"Ventilators live on flat clinical VLANs alongside biomed laptops and vendor service tools
209- the threat model must treat the hospital network as hostile and document compensating controls."},{title:"Home/cloud backhaul for chronic respiratory therapy",body:"CPAP/BiPAP and home-vent cloud platforms ingest adherence and pressure data from millions of devices - multi-tenant authorization, fleet-management abuse, and patient-portal account takeover are recurring findings."},{title:"Long capital lifetimes with EOL OS components",body:"Embedded Windows/Linux versions inside vents commonly go EOL mid-deployment - the postmarket plan must document compensating controls and a defensible patch cadence."}],pathways:["510(k)","De Novo","PMA Supplement"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","IEC 62304","ISO 14971","IEC 60601-1","IEC 60601-2-12 (ICU vents)","IEC 60601-2-13 (anesthesia)","IEC 60601-2-70 (home CPAP/BiPAP)","IEC 81001-5-1"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"Why is FDA so focu
209sed on ventilator cybersecurity now?",a:"Ventilation is the canonical safety-critical control loop in medicine, and the Philips Respironics recalls plus the COVID-era surge in connected home-vent and CPAP/BiPAP cloud platforms put the segment under sustained postmarket scrutiny. Reviewers expect a threat model that explicitly enumerates every path that can modify tidal volume, PEEP, FiO2, or alarm thresholds, with positive evidence of authentication and integrity on each one, plus a postmarket plan that survives the 10-15 year service life of capital respiratory equipment."},{q:"How do you test the ventilator-to-hospital-network boundary?",a:"We treat the clinical VLAN as hostile by default. Scope includes the device's exposed services (HL7, web service ports, vendor management protocols), SNMP and remote-service tooling, network-time and DNS dependencies, and any biomed-laptop-attached service paths. Findings are mapped back to the threat model so the SPDF documents which controls hold and which require operational compensating controls in the IFU and MDS2."},{q:"Do you cover the home CPAP/BiPAP cloud platform separately?",a:"Yes. The cloud platform is scoped as its own system: multi-tenant authorization (BOLA on adherence and pressure data is the recurring finding), patient-portal account takeover, fleet-management abuse, provider/payer tenant separation, and the OTA path back to the home device. Findings on the cloud are tied back to the device threat model so the system view stays coherent and reviewable."},{q:"How do you handle EOL embedded OS components inside ventilators?",a:"Embedded Windows or Linux versions inside ventilators routinely go EOL mid-deployment. The postmarket plan documents the affected configuration matrix, the compensating controls (network segmentation, service-port lockdown, restricted application allowlisting), and the migration roadmap. The SPDF references the matrix so reviewers and hospital biomed see the same story."},{q:"What about anesthesia workstations - same segment?",a:"Anesthesia ventilation modules share the ventilator threat model but add the OR-network and gas-delivery interfaces. We scope anesthesia workstations alongside ICU vents when manufacturers ship both - the SBOM and threat model are shared, with anesthesia-specific essential performance (IEC 60601-2-13) and OR-integration paths called out separately."},{q:"How long does a respiratory premarket cyber engagement typically take?",a:"For a connected ICU or home ventilator with cloud monitoring, end-to-end premarket cyber work runs 10-14 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across device, clinical network, cloud, and patient portal runs in weeks 4-11, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"patient-monitoring-anesthesia",name:"Patient Monitoring & Anesthesia",shortName:"Patient Monitoring / Anesthesia",icon:F_,tagline:"Cybersecurity for ICU/OR multiparameter monitors, capnography, anesthesia workstations, and central-station networks.",metaTitle:"Patient Monitor & Anesthesia Cybersecurity | FDA Premarket",metaDescription:"FDA cybersecurity for multiparameter patient monitors, central stations, capnography, and anesthesia workstations. Pen testing, SBOM, and threat modeling for ICU/OR networked monitoring fleets.",intro:"Multiparameter monitors, central stations, and anesthesia workstations form the densest networked footprint in any hospital. They consume HL7 and proprietary monitor protocols at line rate, surface real-time alarms, and span ICU, OR, ED, and step-down units on flat clinical VLANs. We build premarket and postmarket cybersecurity packages tuned to the monitor-to-central-station bus, HL7/EHR egress, and the vendor remote-service tooling that's become the most common entry point into these fleets.",examples:["ICU multiparameter monitors","OR/anesthesia workstations","Central nursing stations","Capnography and pulse-oximetry modules","Telemetry transmitters and receivers","Bedside-to-EHR gateways"],risks:[{title:"Monitor-to-central-station bus",body:"Proprietary monitor protocols typically run on the clinical VLAN with minimal authentication - integrity of waveform and alarm traffic must be explicit in the threat model and tested in the network pen test."},{title:"HL7/EHR egress and alarm forwarding",body:"Bedside-to-EHR gateways and alarm-forwarding services translate proprietary streams to HL7/FHIR with implicit trust - the threat model must treat both sides as untrusted and exercise the translation surface."},{title:"Vendor remote-service tooling",body:"Jump hosts, support tunnels, and field-service laptops are the most common entry point into monitoring fleets - the postmarket plan must cover them as a continuous surface, not a one-time review."},{title:"Alarm-suppression and silence-state abuse",body:"Network-driven alarm silencing is a documented patient-safety hazard - any remote path that can suppress, mute, or re-route alarms must be authenticated, audited, and modeled explicitly."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","IEC 62304","ISO 14971","IEC 60601-1-8 (alarms)","IEC 60601-2-49 (multifunction monitors)","IEC 60601-2-13 (anesthesia)","IEC 8
2091001-5-1","IHE PCD profiles"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"What's distinctive about patient-monitor cybersecurity compared to other capital equipment?",a:"Monitors and central stations carry the densest real-time networked traffic in the hospital and they're directly tied to alarm-driven clinical decisions. A compromise that suppresses or alters waveforms or alarms is a patient-safety event, not just a data issue. Reviewers expect the threat model to enumerate waveform integrity, alarm integrity, and silence-state abuse as first-class hazards, with positive evidence of authentication and integrity on the monitor-to-central-station path."},{q:"How do you test the proprietary monitor-to-central-station bus?",a:"We characterize the protocol on a staging fleet (never on a live clinical network), then exercise authentication, integrity, replay, and injection of waveform and alarm traffic. Network segmentation assumptions are made explicit in the SPDF and verified in the pen test. Findings cross-reference the IEC 60601-1-8 alarm hazards so safety and security teams act on the same evidence."},{q:"Do you cover HL7/EHR egress and alarm-forwarding gateways?",a:"Yes. Bedside-to-EHR gateways and third-party alarm-forwarding services are scoped as their own components: HL7/FHIR translation surface, message authentication, downstream-system trust assumptions, and the alarm-forwarding integrity chain. IHE PCD profiles are referenced where applicable so the architecture is interoperability-aware as well as security-aware."},{q:"How do you handle vendor remote-service tooling and jump hosts?",a:"Remote-service tooling is the most common entry point into monitoring fleets. The postmarket plan documents jump-host architecture, account custody, session recording, and the boundary between vendor and hospital responsibility. The pen test includes the remote-service path end to end so reviewers can see it's been exercised rather than assumed safe."},{q:"What about anesthesia workstations specifically?",a:"Anesthesia workstations combine monitoring, ventilation, and gas-delivery on one platform, so the threat model spans IEC 60601-2-13 essential performance plus the OR-network and AIMS-integration paths. We scope them alongside ICU monitors when manufacturers ship both, with anesthesia-specific hazards (gas concentration, vaporizer control, agent identification) called out separately."},{q:"How long does a patient-monitoring premarket cyber engagement typically take?",a:"For a connected multiparameter monitor with central station and EHR gateway, end-to-end premarket cyber work runs 10-14 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across monitor, central station, gateway, and remote-service tooling runs in weeks 4-11, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"dialysis-renal",name:"Dialysis & Renal Replacement Therapy",shortName:"Dialysis / Renal",icon:bD,tagline:"Cybersecurity for in-center hemodialysis, home hemodialysis, and peritoneal-dialysis cyclers with cloud connectivity.",metaTitle:"Dialysis Device Cybersecurity | FDA Premarket & Postmarket",metaDescription:"FDA cybersecurity for hemodialysis machines, home dialysis platforms, and peritoneal-dialysis cyclers. Threat modeling, SBOM, pen testing for cloud-connected renal therapy with safety-critical fluid-management control.",intro:"Dialysis devices run a safety-critical fluid-management control loop - ultrafiltration rate, dialysate composition, and treatment-time enforcement are all writable state where a compromise can cause direct patient harm. The shift to home hemodialysis and cloud-connected PD cyclers has pushed the segment into multi-tenant cloud, mobile companion-app, and remote-prescription territory that the FDA's 2026 guidance and section §524B now scrutinize explicitly. We build premarket and postmarket cybersecurity packages tuned to the prescription-to-device path, the home/cloud telemetry backhaul, and the long deployed service life of dialysis capital equipment.",examples:["In-center hemodialysis machines","Home hemodialysis systems","Peritoneal-dialysis cyclers (APD)","CRRT machines (ICU)","Cloud prescription / fleet platforms","Patient and clinician companion apps"],risks:[{title:"Prescription-to-device integrity",body:"Cloud-pushed or USB-loaded prescriptions (UF rate, dialysate composition, treatment time) are safety-critical writable state - the threat model must enumerate every path and require signed, authenticated, replay-resistant delivery."},{title:"Home network as hostile environment",body:"Home dialysis cyclers live on consumer-grade Wi-Fi with no IT staff - the device must be safe-by-default and the cloud backhaul must assume the home network and any paired phone are compromised."},{title:"Multi-tenant fleet platform",body:"Cloud prescription and fleet-management platforms serve multiple clinics and tens of thousands of patients - BOLA, tenant separation, and fleet-wide command abuse are the most consequential findings."},{title:"Long capital lifetimes with EOL OS components",body:"Embedded OS components inside dialysis machines routinely go EOL mid-deployment - the postmarket plan must document compensating controls and a defensible patch cadence."}],pathways:["510(k)","De Novo","PMA Supplement"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","IEC 62304","ISO 14971","IEC 60601-2-16 (hemodialysis)","IEC 60601-2-39 (peritoneal dialysis)","ISO 23500 series (water/dialysate quality)","IEC 8
2091001-5-1"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"Why is dialysis a top-priority cyber segment under the 2026 guidance?",a:"Dialysis combines safety-critical fluid-management control with the move to home therapy and cloud-pushed prescriptions, which is exactly the combination FDA's 2026 guidance and section §524B were written to address. A compromise on the prescription path or the home backhaul can cause direct patient harm at fleet scale, and the deployed service lives are long enough that postmarket monitoring is not optional."},{q:"How do you test the cloud-prescription-to-device path?",a:"We scope the entire prescription chain: clinician portal, cloud signing/authentication, transport, on-device verification, and the local fallback (USB or manual entry). Every path is exercised for authentication, integrity, replay, and downgrade, and the device's behavior under tampered or malformed prescriptions is validated against the IEC 60601-2-16 essential-performance bounds. Findings tie back to specific hazard entries in the IEC 14971 risk file."},{q:"How do you handle the home network as a hostile environment?",a:"Home cyclers are designed to be safe-by-default with no expectation of household IT support. The threat model treats the home Wi-Fi, paired phone, and any household devices as untrusted; the device authenticates outbound to the cloud with mutual TLS and pinning, refuses unsolicited inbound connections, and degrades safely when connectivity is lost. The IFU and labeling document the operational assumptions clearly enough that a non-technical patient can follow them."},{q:"Do you cover the multi-tenant cloud fleet platform separately?",a:"Yes. The cloud platform is scoped as its own system: clinic/patient tenant separation, BOLA on prescription and treatment data, fleet-wide command abuse, provider/payer authorization, and the OTA path back to the device. Findings on the cloud are tied back to the device threat model so the system view stays coherent."},{q:"What about CRRT machines in the ICU - same segment?",a:"CRRT shares the dialysis threat model but adds the hospital-network and ICU-integration paths. We scope CRRT alongside hemodialysis when manufacturers ship both, with CRRT-specific essential performance and ICU-monitor integration called out separately."},{q:"How long does a dialysis premarket cyber engagement typically take?",a:"For a connected hemodialysis or home-dialysis platform with cloud prescription and patient app, end-to-end premarket cyber work runs 12-16 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across device, cloud, clinician portal, and patient app runs in weeks 4-13, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"endoscopy",name:"Endoscopy & Minimally-Invasive Visualization",shortName:"Endoscopy",icon:DD,tagline:"Cybersecurity for flexible and rigid endoscopes, video processors, capsule endoscopy, and image-management systems.",metaTitle:"Endoscopy Cybersecurity | FDA Premarket for Video Processors & Scopes",metaDescription:"FDA cybersecurity for endoscopy video processors, flexible/rigid scopes with electronics, capsule endoscopy receivers, and image-management systems. Threat modeling, SBOM, and pen testing for connected visualization platforms.",intro:"Modern endoscopy platforms are networked visualization computers with high-bandwidth video, AI-assisted detection modules, and tight integration into PACS and the EHR. Capsule endoscopy adds a wireless-receiver and cloud-review path that significantly widens the attack surface. We build cybersecurity packages tuned to the video-processor trust boundary, the AI add-on module supply chain, and the image-management integrations that hospital procurement reviews closely.",examples:["Flexible GI / pulmonary endoscope video processors","Rigid endoscopy / arthroscopy towers","Capsule endoscopy receivers and cloud review","AI polyp/lesion detection modules","Endoscopy image-management and reporting systems"],risks:[{title:"Video processor as a clinical-network computer",body:"Endoscopy video processors are full Windows/Linux computers on the clinical VLAN
209- OS hardening, USB/service-port lockdown, and PACS/EHR integration are all in scope."},{title:"AI detection module integrity",body:"Bolt-on AI modules (polyp detection, lesion classification) bring their own model files, update channels, and inference servers - the SBOM must include the model and weights, and the PCCP must govern updates."},{title:"Capsule endoscopy wireless receiver",body:"The patient-worn receiver and the cloud review path widen the attack surface considerably - pairing, signal integrity, and cloud multi-tenancy all belong in the threat model."},{title:"USB and removable-media exfiltration",body:"Clinical workflows commonly export images and video to USB for case review - the SPDF must document the export controls and the labeling must state the operational assumptions."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","IEC 62304","ISO 14971","IEC 60601-1","IEC 60601-2-18 (endoscopic equipment)","DICOM Security","IEC 81001-5-1"],services:["fda-premarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"How is endoscopy cybersecurity different from generic imaging cybersecurity?",a:"Endoscopy adds real-time video, AI-assisted detection modules, and a high rate of intra-procedure USB/PACS export that pure imaging doesn't have. The video processor is a clinical-network computer carrying live procedural data, and the AI add-on modules introduce their own model integrity and update concerns. Reviewers expect the threat model to enumerate the processor OS, the AI module supply chain, the PACS/EHR egress, and the export workflows as distinct trust zones."},{q:"How do you handle bolt-on AI detection modules (polyp, lesion)?",a:"AI modules are scoped as their own subsystem: model file integrity, signed weight delivery, inference-server hardening, update path under a PCCP, and adversarial-input resistance. The SBOM includes the model and the inference stack, not just the host application. Findings tie back to the device-level threat model so the integrated system view stays coherent for the FDA reviewer."},{q:"Do you test the PACS/EHR/DICOM egress?",a:"Yes. DICOM and HL7 egress are exercised against the processor as untrusted inputs (malformed studies, oversized tags, embedded-script abuse) and the egress side is checked for authentication and integrity. DICOM Security profile usage is documented in the SPDF where the deployment supports it; where it doesn't, the compensating controls are documented explicitly."},{q:"What about capsule endoscopy receivers and cloud review?",a:"Capsule platforms add a patient-worn receiver and a cloud review/sharing service. The receiver is scoped for pairing, signal integrity, on-device storage protection, and the upload path; the cloud is scoped for multi-tenant authorization, BOLA on patient studies, and clinician account takeover. Both feed back into the device threat model."},{q:"How do you handle USB and removable-media export?",a:"Export workflows are a recurring source of incidents in this segment, so the SPDF documents the supported export channels, the on-by-default vs opt-in behavior, audit logging, and the operational assumptions in the IFU and MDS2. The pen test exercises both the allowed export paths and the abuse paths (oversized media, malformed filesystems, AutoRun-style abuse on the host)."},{q:"How long does an endoscopy premarket cyber engagement typically take?",a:"For a video-processor platform with AI module, PACS/EHR egress, and reporting system, end-to-end premarket cyber work runs 8-12 weeks. Threat modeling and SBOM front-load in weeks 1-3, pen testing across processor, AI module, integrations, and any cloud review path runs in weeks 3-10, and the consolidated submission package closes in the final weeks - all under a written deficiency commitment."}]},{slug:"radiation-oncology",name:"Radiation Oncology & Radiotherapy",shortName:"Radiation Oncology",icon:I_,tagline:"Cybersecurity for linacs, treatment planning systems, oncology information systems, and brachytherapy platforms.",metaTitle:"Radiation Oncology Cybersecurity | Linac, TPS, OIS Pen Testing",metaDescription:"FDA cybersecurity for linear accelerators, treatment planning systems, oncology information systems, and brachytherapy. Threat modeling, SBOM, and pen testing for safety-critical radiotherapy with documented ransomware history.",intro:"Radiation oncology platforms - linacs, treatment planning systems (TPS), oncology information systems (OIS), and brachytherapy afterloaders
209- carry the most documented ransomware history of any medical device segment (Elekta cloud-storage incident, Varian/Siemens advisories, Universal Health Services and Sky Lakes outages). They combine safety-critical dose-delivery control with multi-day patient-treatment workflows that cannot tolerate downtime. We build premarket and postmarket cybersecurity packages tuned to the TPS-to-linac plan path, the OIS integration boundary, and the long deployed service lives of radiotherapy capital equipment.",examples:["Linear accelerators (Varian, Elekta-class)","Treatment planning systems (TPS)","Oncology information systems (OIS / ARIA / MOSAIQ-class)","Brachytherapy afterloaders","Image-guided radiotherapy (IGRT) systems","Proton-therapy gantries"],risks:[{title:"TPS-to-linac plan integrity",body:"The treatment plan delivered from TPS to linac is safety-critical writable state - any path that can substitute, modify, or replay a plan must be authenticated, integrity-protected, and audited end to end."},{title:"OIS as the ransomware blast-radius",body:"The OIS is the convergence point for scheduling, plans, imaging, and delivery records - the Elekta 2021 incident demonstrated that cloud-OIS outage halts treatment fleet-wide; segmentation and recovery plans are first-class deliverables."},{title:"Long-tenure capital and embedded OS",body:"Linacs and TPS hosts routinely run for 10-15 years on embedded OS versions that go EOL mid-deployment - the postmarket plan must document compensating controls and a defensible patch cadence under treatment-schedule constraints."},{title:"Vendor remote-service and physics tooling",body:"Vendor service tunnels and on-site physicist tooling have been the entry point in multiple public incidents - they're a continuous postmarket surface, not a one-time review."}],pathways:["510(k)","De Novo","PMA"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","IEC 62304","ISO 14971","IEC 60601-2-1 (linacs)","IEC 60601-2-17 (brachytherapy)","IEC 60601-2-68 (image-guided radiotherapy)","DICOM-RT","IEC 81001-5-1"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"Why does radiation oncology get more cyber scrutiny than other oncology segments?",a:"Radiation oncology has the most documented ransomware and outage history of any medical device segment - the Elekta cloud-storage incident, the UHS and Sky Lakes outages, and multiple Varian/Siemens advisories define how the FDA and hospital procurement evaluate this category. Reviewers expect the threat model to enumerate plan-integrity, OIS resilience, and vendor remote-service paths explicitly, with positive evidence and a postmarket plan that addresses fleet recovery, not just individual-device patching."},{q:"How do you test the TPS-to-linac plan-delivery path?",a:"We scope the entire chain: TPS export, transport (DICOM-RT or proprietary), OIS storage and retrieval, and on-linac verification. Each hop is exercised for authentication, integrity, replay, and substitution, and the device's behavior under tampered or malformed plans is validated against the IEC 60601-2-1 essential-performance bounds. Findings tie back to specific hazard entries in the risk file so safety and security teams act on the same evidence."},{q:"Do you cover OIS resilience and ransomware recovery?",a:"Yes. The OIS is scoped as the convergence point for treatment continuity. The postmarket plan documents segmentation between OIS and clinical-network zones, backup/restore RTO/RPO for treatment-day operations, the manual fallback workflow when OIS is unavailable, and the relationship to hospital-wide incident response. Reviewers and hospital security teams both expect this level of explicit operational planning after the public 2021 incident."},{q:"How do you handle long-tenure linacs with EOL embedded OS?",a:"Linacs commonly run for 10-15 years on embedded OS versions that go EOL mid-deployment. The postmarket plan documents the configuration matrix per generation, the compensating controls (segmentation, allowlisting, restricted USB/service-port use), the patch cadence under treatment-schedule constraints, and the EOL/EOS communications plan. The matrix is referenced from the SPDF so reviewers and hospital biomed see the same story."},{q:"What about brachytherapy afterloaders and proton platforms?",a:"Brachytherapy afterloaders share the TPS-to-device plan integrity concern but add the source-position control loop under IEC 60601-2-17. Proton platforms add real-time gantry control under IEC 60601-2-68. Both are scoped alongside the linac model when applicable, with platform-specific essential performance called out separately."},{q:"How long does a radiation-oncology premarket cyber engagement typically take?",a:"For a linac platform with TPS, OIS integration, and IGRT, end-to-e
209nd premarket cyber work runs 14-18 weeks. Threat modeling and SBOM front-load in weeks 1-5, pen testing across linac, TPS, OIS, IGRT, and vendor remote-service runs in weeks 5-15, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"connected-drug-delivery",name:"Connected Drug Delivery & Combination Products",shortName:"Connected Drug Delivery",icon:CD,tagline:"Cybersecurity for connected auto-injectors, smart inhalers, on-body injectors, and drug-device combination products.",metaTitle:"Connected Drug Delivery Cybersecurity | Combination Product Cyber",metaDescription:"FDA cybersecurity for connected auto-injectors, smart inhalers, on-body injectors, and drug-device combination products. Threat modeling, SBOM, and pen testing aligned to CDER/CDRH combination-product expectations.",intro:"Connected drug-delivery combination products sit at the CDRH/CDER boundary - the device constituent carries the cyber expectations of the 2026 guidance and section §524B while the drug constituent shapes the dosing-safety hazards. Smart inhalers, connected auto-injectors, and on-body injectors typically pair to a patient phone via BLE, log adherence to the cloud, and increasingly accept remote-titration or dose-confirmation flows. We build premarket and postmarket cybersecurity packages tuned to combination-product submission paths, the BLE pairing surface, and the adherence/dosing cloud platform.",examples:["Connected auto-injectors (biologics, emergency epinephrine)","Smart MDI / DPI inhalers","On-body injectors and wearable pumps","Connected pen injectors for diabetes/GLP-1","Adherence-tracking and titration platforms"],risks:[{title:"Combination-product submission boundary",body:"Cyber documentation must align with the lead-center pathway (CDER or CDRH) and address both the device constituent's FDA cyber expectations and the drug constituent's dosing hazards as a single coherent package."},{title:"BLE pairing and companion-app trust",body:"Pairing, bonding, and OOB key delivery determine whether a hostile phone can impersonate a clinician or patient - the threat model must enumerate every pairing path and the app must assume OS hostility and reverse engineering."},{title:"Adherence and dosing-confirmation integrity",body:"Cloud adherence and dose-confirmation records can drive clinical decisions and reimbursement - the integrity, source-attribution, and tamper-evidence of those records belong in the SPDF and the audit trail."},{title:"Remote titration and prescription paths",body:"Where the platform supports remote dose adjustment, the prescription-to-device path is safety-critical writable state - authentication, integrity, replay protection, and clinician identity binding must be modeled and tested explicitly."}],pathways:["510(k)","De Novo","NDA/BLA with device constituent","Combination-product cross-labeling"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","IEC 62304","ISO 14971","ISO 11608 series (needle-based injection systems)","ISO 20417 / IEC 60601-1","21 CFR Part 4 (combination products)","IEC 8
2091001-5-1"],services:["fda-premarket-cybersecurity-services","fda-postmarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling"],faqs:[{q:"How does cybersecurity work for a combination product under 21 CFR Part 4?",a:"Combination products are reviewed by a lead center (typically CDER for drug-led or CDRH for device-led), but the device constituent carries the full FDA cyber expectations from the 2026 guidance and section §524B regardless of lead. We produce one coherent cyber package that maps to the lead-center pathway, addresses the device-constituent threat model and SBOM, and reconciles dosing-safety hazards with the drug constituent's risk file. The submission cross-references both constituents so the reviewer sees a single integrated story."},{q:"How do you test the BLE pairing and companion-app surface?",a:"BLE is exercised end to end: pairing mode (Just Works, Passkey, OOB), bonding storage, key custody, authenticated reads/writes for dose data, replay and downgrade resistance, and pairing-mode abuse from a hostile phone. The companion app is tested under jailbreak/root assumptions: hardcoded secrets, TLS pinning, OAuth/SSO flows, BOLA on cloud APIs, push-notification abuse, and reverse-engineering resistance proportional to the dosing-safety hazard."},{q:"What about adherence and dose-confirmation records used for clinical decisions or reimbursement?",a:"Where adherence or dose-confirmation records influence titration, reimbursement, or clinical decisions, they're safety-relevant data and the SPDF must document their integrity, source attribution, and tamper-evidence. The threat model enumerates the paths that can create, modify, or suppress those records, and the cloud pen test exercises the abuse paths. The audit trail and retention policy are documented in the labeling and the privacy notice so they tell the same story."},{q:"Do you cover remote titration and prescription paths?",a:"Yes. Where the platform supports remote dose adjustment, the entire prescription-to-device chain is scoped: clinician portal, identity binding, cloud signing, transport, on-device verification, and the local fallback. Each hop is exercised for authentication, integrity, replay, and clinician-identity abuse, and the device behavior under tampered or malformed prescriptions is validated against ISO 11608-class essential-performance bounds."},{q:"How is this different from the diabetes/CGM or infusion-pump segments?",a:"Diabetes and infusion-pump segments cover dedicated medical-device platforms with their own pathways. Connected drug-delivery combination products are typically single-use or limited-use injectors and inhalers paired to a patient phone, with the drug constituent driving labeling and risk framing. The cyber threat model is similar in shape but the combination-product submission pathway and the constituent-cross-labeling work are distinctive, and that's where most teams underestimate the documentation lift."},{q:"How long does a combination-product premarket cyber engagement typically take?",a:"For a connected auto-injector or smart-inhaler platform with companion app and cloud adherence, end-to-end premarket cyber work runs 8-12 weeks. Threat modeling and SBOM front-load in weeks 1-3, pen testing across device, BLE link, mobile app, and cloud runs in weeks 3-10, and the consolidated submission package and postmarket plan close in the final weeks - all under a written deficiency commitment."}]},{slug:"digital-pathology-lab-automation",name:"Digital Pathology & Lab Automation",shortName:"Digital Pathology / Lab Automation",icon:P_,tagline:"Cybersecurity for whole-slide imaging, AI pathology, and connected lab-automation platforms.",metaTitle:"Digital Pathology & Lab Automation Cybersecurity | FDA Premarket",metaDescription:"FDA cybersecurity for whole-slide imaging scanners, AI pathology, and connected lab-automation platforms. Threat modeling, SBOM, and pen testing tuned to LIS integration, image integrity, and ML model governance.",intro:"Digital pathology and lab automation sit at the intersection of large-image workflows, AI-assisted diagnosis, and deep LIS/LIMS integration. Whole-slide imaging scanners produce multi-gigabyte images that flow into image-management systems and increasingly into FDA-cleared AI modules; lab-automation lines connect pre-analytic, analytic, and post-analytic instruments through middleware that's historically been a recurring CVE source. We build cybersecurity packages tuned to slide-image integrity, AI model governance, and the LIS/LIMS trust boundary.",examples:["Whole-slide imaging scanners","Image-management systems for pathology","FDA-cleared AI pathology modules","Lab-automation tracks and pre-/post-analytic instruments","Middleware connecting analyzers to LIS/LIMS","Cloud pathology review and second-opinion platforms"],r
209isks:[{title:"Slide-image and result integrity",body:"Diagnostic decisions ride on whole-slide images and analyzer results - the integrity and source attribution of those artifacts from scanner/analyzer through middleware to LIS must be enumerated and tested."},{title:"AI pathology module governance",body:"FDA-cleared AI modules introduce model files, weight delivery, inference servers, and PCCP-governed updates - the SBOM and threat model must treat them as their own subsystem."},{title:"Middleware as a recurring CVE source",body:"Vendor middleware between analyzers and LIS/LIMS is a documented recurring source of CVEs and account-credential abuse - continuous monitoring and a postmarket plan that addresses middleware specifically are required."},{title:"Cloud review and second-opinion sharing",body:"Pathology cloud platforms that support remote review and second-opinion sharing add multi-tenant authorization and cross-institution data-residency concerns to the threat model."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","AAMI CR515:2025 (ML-enabled devices)","IEC 62304","ISO 14971","DICOM (incl. DICOM-WSI)","HL7 / ASTM lab protocols","IEC 8
2091001-5-1"],services:["fda-premarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"How is digital pathology different from IVD diagnostics for cyber purposes?",a:"IVD diagnostics covers analyzer-led workflows where the analyzer produces a structured result. Digital pathology adds gigabyte-scale image data, AI-assisted diagnosis on top of those images, and a pathologist-in-the-loop review workflow that often spans multiple institutions via cloud second-opinion platforms. The threat model has to address image integrity and AI module governance on top of the LIS integration concerns shared with IVD."},{q:"How do you handle FDA-cleared AI pathology modules?",a:"AI modules are scoped as their own subsystem: model file integrity, signed weight delivery, inference-server hardening, update path under a PCCP, adversarial-input resistance, and drift/performance monitoring. The SBOM includes the model and the inference stack, and AAMI CR515:2025 is referenced for ML-enabled device considerations where applicable. Findings tie back to the device-level threat model so the integrated system view stays coherent."},{q:"Do you test the analyzer/scanner-to-LIS chain end to end?",a:"Yes. The chain - analyzer or scanner, middleware, LIS/LIMS, EHR result-delivery - is exercised as a single trust boundary. HL7/ASTM and DICOM-WSI traffic are tested for authentication and integrity where the protocol supports it and for compensating controls where it doesn't. Middleware service accounts, vendor remote-service tooling, and the credential-custody story are first-class scope items because they're the recurring source of incidents in this segment."},{q:"What about cloud second-opinion and remote-review platforms?",a:"Cloud review platforms are scoped as their own system: multi-tenant authorization, BOLA on case data, clinician account takeover, cross-institution data-residency, and the export/sharing surface. Findings on the cloud are tied back to the scanner threat model so the system view stays coherent for the FDA reviewer and for hospital procurement."},{q:"Where does lab automation fit alongside digital pathology?",a:"Lab automation tracks and pre-/post-analytic instruments share the LIS/middleware concerns and the long-deployed-fleet concerns of digital pathology. We scope them together when manufacturers ship both, with automation-specific concerns (track control, robotic-arm safety, sample-handling integrity) called out separately."},{q:"How long does a digital-pathology premarket cyber engagement typically take?",a:"For a whole-slide imaging scanner with image-management system and AI module, end-to-end premarket cyber work runs 10-14 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across scanner, image-management, AI module, and LIS integration runs in weeks 4-11, and the consolidated submission package closes in the final weeks - all under a written deficiency commitment."}]}
209,{slug:"surgical-navigation",name:"Surgical Navigation & Image-Guided Surgery",shortName:"Surgical Navigation",icon:R_,tagline:"Cybersecurity for image-guided navigation, AR-guided surgery, and intraoperative tracking platforms.",metaTitle:"Surgical Navigation Cybersecurity | Image-Guided & AR Surgery",metaDescription:"FDA cybersecurity for surgical navigation systems, image-guided surgery, intraoperative tracking, and AR-guided surgical platforms. Threat modeling, SBOM, and pen testing tuned to imaging-to-OR data flow integrity.",intro:"Surgical navigation platforms - cranial, spine, ENT, orthopedic, and the new AR-guided systems - build an intraoperative trust chain from preoperative imaging through registration to real-time tracking and (increasingly) tool actuation. A compromise on the imaging-import path, the registration step, or the tracking telemetry can produce a wrong-site or wrong-trajectory hazard without ever triggering a network alarm. We build cybersecurity packages tuned to the DICOM ingest boundary, the OR-network footprint, and the real-time tracking trust chain that defines this segment.",examples:["Cranial and spine navigation systems","ENT and orthopedic image-guided platforms","AR-guided surgery headsets and consoles","Intraoperative imaging integration (iCT, O-arm-class)","Optical and EM tracking platforms"],risks:[{title:"DICOM ingest as untrusted input",body:"Preoperative imaging is imported into navigation systems from PACS, USB, and CD - every ingest path must treat the input as untrusted and validate it through the registration step, not just at parse time."},{title:"Real-time tracking integrity",body:"Optical and EM tracking telemetry drives the surgeon's spatial reference - the threat model must enumerate the paths that can spoof, delay, or replay tracking data and validate the system's behavior under each."},{title:"OR-network and integration-tower footprint",body:"Navigation consoles connect to OR-integration towers, intraoperative imaging, and increasingly to robotic platforms - segmentation and inter-device authentication are first-class deliverables."},{title:"AR headset and consumer-OS exposure",body:"AR-guided platforms built on consumer-grade headsets inherit the headset OS's update cadence and app-permission model - the SBOM must include the headset stack and the threat model must address the consumer-OS reality."}],pathways:["510(k)","De Novo"],standards:["FDA 2026 Premarket Cyber Guidance","AAMI SW96","AAMI TIR57","IEC 62304","ISO 14971","IEC 60601-1","DICOM Security","IEC 81001-5-1"],services:["fda-premarket-cybersecurity-services","medical-device-penetration-testing","medical-device-threat-modeling","fda-compliant-sbom-services-for-medtech"],faqs:[{q:"How is surgical navigation different from surgical robotics for cyber purposes?",a:"Surgical robotics covers platforms where the system physically actuates instruments under control of a surgeon console. Surgical navigation provides spatial reference and guidance without (typically) actuating tissue - but the integrity of that spatial reference is itself a patient-safety hazard, because a wrong-trajectory or wrong-site outcome can be produced by tampered imaging or spoofed tracking. The threat model has to address imaging-import, registration, and tracking integrity as first-class hazards even when the system doesn't move."},{q:"How do you test DICOM ingest into a navigation system?",a:"DICOM ingest is exercised as untrusted input across every supported channel - PACS pull, push, USB, CD - with malformed studies, oversized tags, embedded-script abuse, and pixel-data tampering. The pen test continues through the registration step because that's where ingest tampering produces clinically meaningful effects. DICOM Security profile usage is documented where the deployment supports it; where it doesn't, the compensating controls are documented explicitly."},{q:"How do you address real-time tracking telemetry integrity?",a:"Optical and EM tracking are scoped as safety-critical inputs. The threat model enumerates the paths that can introduce spoofed, delayed, or replayed telemetry (network-attached tracking modules, integration-tower compromise, hostile OR devices) and the system's behavior under each is validated against the IFU's spatial-accuracy claims. Findings tie back to specific hazard entries in the IEC 14971 risk file."},{q:"Do you cover AR-guided surgical platforms built on consumer headsets?",a:"Yes. AR-guided platforms inherit the consumer headset's OS update cadence, app-permission model, and connectivity defaults. The SBOM includes the headset stack, the threat model addresses the consumer-OS reality (sideloaded apps, headset-OS background services, paired-phone abuse), and the SPDF documents the operational assumptions the OR is expected to enforce. The pen test exercises the headset-to-console path and the consumer-OS abuse paths explicitly."},{q:"What about integration with intraoperative imaging and robotics?",a:"Intraoperative imaging (iCT, O-arm-class) and robotic platforms are scoped as connected components when they share the navigation trust chain. Each interface is enumerated with its protocol, authentication, integrity, and failure mode, and inter-device authentication is verified in the pen test. The SPDF cross-references the integration test plan so the reviewer sees a coherent system."},{q:"How long does a surgical-navigation premarket cyber engagement typically take?",a:"For a navigation platform with DICOM ingest, intraoperative imaging, and tracking, end-to-e
209nd premarket cyber work runs 10-14 weeks. Threat modeling and SBOM front-load in weeks 1-4, pen testing across navigation console, DICOM ingest, tracking, and OR-integration runs in weeks 4-11, and the consolidated submission package closes in the final weeks - all under a written deficiency commitment."}]}],BN=e=>Zw.find(t=>t.slug===e),Di=({children:e,as:t="div",delay:i=0,className:r="",rootMargin:s="0px 0px -10% 0px",once:n=!0})=>{const o=p.useRef(null);p.useEffect(()=>{const l=o.current;if(!l)return;if(typeof IntersectionObserver>"u"){l.classList.add("is-visible");return}const d=new IntersectionObserver(u=>{for(const h of u)h.isIntersecting?(h.target.classList.add("is-visible"),n&&d.unobserve(h.target)):n||h.target.classList.remove("is-visible")},{rootMargin:s,threshold:.05});return d.observe(l),()=>d.disconnect()},[n,s]);const c=i?{transitionDelay:`${i}ms`}:void 0;return a.jsx(t,{ref:o,className:`reveal ${r}`.trim(),style:c,children:e})},ek="bgc_booking_source",uj=e=>{var t;if(!(typeof window>"u"))try{const i={location:e,path:window.location.pathname,ts:Date.now()};(t=window.sessionStorage)==null||t.setItem(ek,JSON.stringify(i))}catch{}},UN=()=>{var e;if(typeof window>"u")return null;try{const t=(e=window.sessionStorage)==null?void 0:e.getItem(ek);if(!t)return null;const i=JSON.parse(t);return i&&typeof i.location=="string"?i:null}catch{return null}},hj=(e,t={},i={})=>{if(!(typeof window>"u"))try{window.dataLayer=window.dataLayer||[];const r={event:`lp_${e}`,lp_event:e,lp_path:window.location.pathname,...t};if(i.awaitable&&(r.eventCallback=()=>{},r.eventTimeout=800),window.dataLayer.push(r),i.awaitable&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function")try{const s=new Blob([JSON.stringify(r)],{type:"application/json"});navigator.sendBeacon("/__lp_event",s)}catch{}}catch{}},hc=(e,t={})=>{uj(e),hj("booking_click",{cta_location:e,...t},{awaitable:!0})},Af=e=>
209/^https?:\/\//i.test(e),mj=({eyebrow:e="Ready when you are",title:t="Get FDA cleared without the cybersecurity headaches.",body:i="30-minute strategy session. No cost, no commitment - just answers from people who've shipped 275+ FDA submissions.",ctaLabel:r="Book strategy session",ctaHref:s=Qs.meetingUrl,secondaryLabel:n="Explore services",secondaryHref:o="/services",ctaLocation:c="cta_band"})=>{const l=Af(s),d=o?Af(o):!1;return a.jsxs("section",{className:"relative overflow-hidden bg-primary",children:[a.jsx("div",{className:"absolute inset-0 grid-bg opacity-20 mix-blend-overlay","aria-hidden":!0}),a.jsx("div",{className:"absolute inset-0 bg-foreground/10","aria-hidden":!0}),a.jsx("div",{className:"container-x relative py-20 lg:py-24 text-center text-white",children:a.jsxs(Di,{children:[a.jsx("span",{className:"eyebrow mx-auto !border-white/40 !bg-white/15 !text-white",children:e}),a.jsx("h2",{className:"mx-auto mt-6 max-w-3xl font-display text-3xl font-bold sm:text-4xl lg:text-5xl",children:t}),a.jsx("p",{className:"mx-auto mt-4 max-w-2xl text-white/85",children:i}),a.jsxs("div",{className:"mt-8 flex flex-wrap justify-center gap-3",children:[a.jsx(ge,{asChild:!0,size:"xl",className:"h-auto min-h-12 w-full whitespace-normal bg-white py-3 text-center text-foreground hover:bg-white/90 sm:w-auto",children:l?a.jsxs("a",{href:s,target:"_blank",rel:"noreferrer",onClick:()=>hc(c),children:[a.jsx(Hc,{className:"h-5 w-5"}),r]}):a.jsxs(H,{to:s,children:[a.jsx(Hc,{className:"h-5 w-5"}),r]})}),n&&o&&a.jsx(ge,{asChild:!0,variant:"outline",size:"xl",className:"h-auto min-h-12 w-full whitespace-normal border-white/60 bg-transparent py-3 text-center text-white hover:bg-white/10 hover:text-white sm:w-auto",children:d?a.jsxs("a",{href:o,target:"_blank",rel:"noreferrer",children:[n,a.jsx(Me,{className:"h-5 w-5"})]}):a.jsxs(H,{to:o,children:[n,a.jsx(Me,{className:"h-5 w-5"})]})})]})]})})]})},tk={"ai-ml-submission-timeline":{slug:"ai-ml-submission-timeline",to:"/tools/ai-ml-submission-timeline",icon:Yc,title:"AI/ML Submission Timeline",short:"Sequence the work, concept to postmarket",blurb:"Fourteen steps from concept to postmarket retraining for an AI/ML-enabled device, each anchored to an AAMI CR515:2025 topic area, with the outputs it produces, the Section 524B obligation it feeds, and the pitfall that sends it back. Filter by phase and export as PDF or CSV.",time:"5 min",tags:["ai","ml","machine learning","ai/ml","timeline","pccp","cr515","gmlp","aibom","submission","postmarket"]}
209,"cr515-crosswalk":{slug:"cr515-crosswalk",to:"/tools/cr515-crosswalk",icon:Yc,title:"CR515 Crosswalk",short:"Map ML cyber topics to your file",blurb:"Every AAMI CR515:2025 topic area for machine learning-enabled devices, mapped to the GMLP control, the PCCP clause, the AIBOM entry, and the Section 524B obligation it feeds. Filter by area and export as PDF or CSV.",time:"4 min",tags:["cr515","aami cr515","ai","ml","machine learning","ai/ml","gmlp","pccp","aibom","adversarial","model security"]},"standards-mapper":{slug:"standards-mapper",to:"/tools/standards-mapper",icon:O_,title:"Standards Mapper",short:"Which standards apply to you?",blurb:"Pick a device type and use case. Get the chain that applies, Section 524B, ANSI/AAMI SW96:2023, IEC 81001-5-1, IEC 62304, and ISO 14971, with the deliverables and severity floor for that profile.",time:"3 min",tags:["standards","sw96","81001-5-1","62304","iso 14971","tir57","60601","consensus standards","regulatory"]},"pccp-builder":{slug:"pccp-builder",to:"/tools/pccp-builder",icon:U_,title:"PCCP Builder",short:"Draft your SDS-PCCP outline",blurb:"Scope a Predetermined Change Control Plan for your AI/ML-enabled device. 8 FDA-guidance sections, per-modification cyber impact, reviewer-rejection flags, and a Markdown export.",time:"8 min",tags:["pccp","ai","ml","machine learning","predetermined change","change control","ai/ml","samd"]},"cyber-device-applicability":{slug:"cyber-device-applicability",to:"/tools/cyber-device-applicability",icon:w_,title:"Section 524B Applicability",short:"Cyber device - yes or no?",blurb:"Six questions tell you whether FD&C Act §524B applies and whether SBOM, threat modeling, and the full premarket cyber package are mandatory.",time:"2 min",tags:["524b","cyber device","fda","premarket","applicability","scope"]},"samd-simd-classifier":{slug:"samd-simd-classifier",to:"/tools/samd-simd-classifier",icon:z_,title:"SaMD / SiMD + EU Rule 11",short:"Classify + map evidence",blurb:"Classify your product as SaMD or SiMD, then map it to EU MDR Rule 11 risk class and the cyber evidence each path requires.",time:"3 min",tags:["samd","simd","eu mdr","rule 11","classification","software medical device"]},"sbom-readiness":{slug:"sbom-readiness",to:"/tools/sbom-readiness",icon:C_,title:"SBOM Readiness",short:"Score your SBOM + supply chain",blurb:"Score your SBOM program against the current FDA premarket and postmarket cybersecurity expectations: format, depth, VEX, monitoring cadence, SLSA build provenance, Sigstore signing, AI-generated code tracking, and dependency-confusion defenses.",time:"4 min",tags:["sbom","spdx","cyclonedx","vex","software bill of materials","supply chain","slsa","sigstore","signing"]},"sbom-diff-vex":{slug:"sbom-diff-vex",to:"/tools/sbom-diff-vex",icon:q_,title:"SBOM Diff & VEX Drafter",short:"Compare SBOMs, draft VEX",blurb:"Paste two SBOMs (or one + a CVE list). See added / removed / version-bumped components, prioritize by KEV/EPSS-style signals, and export a CycloneDX VEX stub for the not-affected calls.",time:"5 min",tags:["sbom diff","vex","vulnerability exploitability exchange","cyclonedx vex","sbom compare"]},"component-risk-scorecard":{slug:"component-risk-scorecard",to:"/tools/component-risk-scorecard",icon:W_,title:"Third-Party Component Risk Scorecard",short:"Score a single dependency",blurb:"Score one third-party component on maintenance health, signing / provenance, license, known CVEs, sanctions / origin exposure, and AI-training-data provenance. Get a go / caution / no-go verdict with rationale.",time:"3 min",tags:["third party risk","component risk","open source risk","supply chain","license risk","ossf scorecard"]},"legacy-component-triage":{slug:"legacy-component-triage",to:"/tools/legacy-component-triage",icon:Nw,title:"Legacy / End-of-Support Triage",short:"Compensating-controls memo",blurb:"For devices stuck on Windows 10 IoT, RHEL 7, end-of-life kernels, or unsupported chipsets - outputs an FDA-style compensating-controls memo and a TPLC verdict you can hand to a reviewer.",time:"4 min",tags:["legacy","end of support","eos","windows 10 iot","rhel 7","tplc","compensating controls"]},"wireless-interface-profiler":{slug:"wireless-interface-profiler",to:"/tools/wireless-interface-profiler",icon:K_,title:"Wireless & Physical Interface Profiler",short:"NFC, RFID, BLE, USB, JTAGâ¦",blurb:"Pick the wireless and physical interfaces your device exposes - Wi-Fi, BLE, BR/EDR, NFC, RFID, USB-OTG, JTAG/SWD, CAN - get a per-interface threat list, pen-test scoping notes, and required premarket evidence.",time:"5 min",tags:["wireless","nfc","rfid","ble","bluetooth","usb","jtag","interface security","attack surface"]},"threat-model-starter":{slug:"threat-model-starter",to:"/tools/threat-model-starter",icon:uf,title:"Threat Model Starter",short:"STRIDE list in 5 minutes",blurb
209:"Pick your interfaces and assets; get a structured STRIDE threat list aligned to AAMI TIR57 / SW96 as the starting point for a formal model.",time:"5 min",tags:["threat model","stride","tir57","sw96","aami","security risk"]},"cvd-policy-generator":{slug:"cvd-policy-generator",to:"/tools/cvd-policy-generator",icon:x_,title:"CVD Policy Generator",short:"Publishable disclosure policy",blurb:"Produce a §524B-aligned Coordinated Vulnerability Disclosure policy ready to publish. ISO 29147 structure with your SLAs and contacts baked in.",time:"4 min",tags:["cvd","coordinated vulnerability disclosure","iso 29147","disclosure","psirt"]},"deficiency-letter-triage":{slug:"deficiency-letter-triage",to:"/tools/deficiency-letter-triage",icon:D_,title:"Deficiency Letter Triage",short:"Categorize FDA cyber asks",blurb:"Paste an FDA cybersecurity AI request or hold letter. We categorize each ask and outline a structured response with required evidence.",time:"2 min",tags:["deficiency","ai request","hold letter","fda response","additional information"]},"postmarket-cadence-calculator":{slug:"postmarket-cadence-calculator",to:"/tools/postmarket-cadence-calculator",icon:gD,title:"Postmarket Cadence Calculator",short:"Monitoring + patch SLAs",blurb:"Risk class + connectivity + PHI sensitivity â monitoring, patch, pen-test, and FDA-reporting SLAs that match reviewer expectations.",time:"2 min",tags:["postmarket","monitoring","vulnerability management","patch cadence","sla"]},"estar-cyber-checklist":{slug:"estar-cyber-checklist",to:"/tools/estar-cyber-checklist",icon:Jc,title:"eSTAR Cyber Checklist",short:"16 artifacts reviewers look for",blurb:"Sixteen artifacts FDA reviewers look for in the eSTAR cybersecurity sections. Check what you have; we show what's missing and where it goes.",time:"4 min",tags:["estar","510k","premarket submission","checklist","artifacts"]},"controlled-risk-classifier":{slug:"controlled-risk-classifier",to:"/tools/controlled-risk-classifier",icon:uf,title:"Controlled vs Uncontrolled Risk Classifier",short:"Classify a fielded vulnerability",blurb:"Six questions on reachability, harm severity, KEV/EPSS signal, access, mitigations, and monitoring â FDA-aligned verdict (controlled, uncontrolled-monitor, uncontrolled-action) with next steps and 21 CFR 806 timeline.",time:"3 min",tags:["controlled risk","uncontrolled risk","postmarket","21 cfr 806","kev","epss","vulnerability triage"]},"mds2-generator":{slug:"mds2-generator",to:"/tools/mds2-generator",icon:S_,title:"MDS² Generator",short:"HN1-2019 disclosure draft",blurb:"Draft a Manufacturer Disclosure Statement for Medical Device Security against the 21 HN1-2019 sections. Markdown export ready for product security and regulatory review.",time:"8 min",tags:["mds2","mds²","hn1-2019","labeling","manufacturer disclosure","iec 80001"]},"spdf-gap-checker":{slug:"spdf-gap-checker",to:"/tools/spdf-gap-checker",icon:Km,title:"SPDF Gap Checker",short:"6-domain SPDF maturity score",blurb:"Score your Secure Product Development Framework across governance, design, implementation, V&V, postmarket, and supply chain - mapped to the FDA Feb 3, 2026 final premarket guidance and IEC 81001-5-1.",time:"6 min",tags:["spdf","secure product development framework","iec 81001-5-1","iec 81001","iec 62304","sdlc","sw96","aami sw96","jsp2","joint security plan","framework choice"]},"submission-pathway-selector":{slug:"submission-pathway-selector",to:"/tools/submission-pathway-selector",icon:B_,title:"Submission Pathway Selector",short:"510(k) vs De Novo vs PMA",blurb:"Five questions â 510(k), De Novo, or PMA recommendation, with the cybersecurity evidence delta for each pathway under the FDA's Feb 3, 2026 final premarket guidance.",time:"3 min",tags:["510k","de novo","pma","submission pathway","premarket"]},"ota-update-questionnaire":{slug:"ota-update-questionnaire",to:"/tools/ota-update-questionnaire",icon:AD,title:"OTA Update Questionnaire",short:"Patch / OTA mechanism audit",blurb:"Score the patch / OTA update mechanism your device ships with across integrity, transport, deployment safety, and lifecycle c
209ontrols. Get a critical / high / medium gap list with concrete remediation.",time:"6 min",tags:["ota","patch","firmware update","code signing","rollback","secure update"]},readiness:{slug:"readiness",to:"/readiness",icon:Jc,title:"FDA Cyber Readiness Quiz",short:"7-question premarket score",blurb:"Seven-question score against the current FDA premarket cybersecurity guidance with a gap list and fastest path to clearance.",time:"2 min",tags:["readiness","premarket","fda","quiz","gap analysis"]},"cost-of-delay":{slug:"cost-of-delay",to:"/cost-of-delay",icon:$c,title:"Cost of Delay Calculator",short:"What a slip really costs",blurb:"Translate every week of submission slip into lost revenue, gross margin, and runway burn.",time:"1 min",tags:["business case","delay","cost","revenue","runway"]},"scope-estimator":{slug:"scope-estimator",to:"/scope-estimator",icon:$c,title:"Pen Test Scope Estimator",short:"Architecture â effort range",blurb:"Architecture and interface inputs â recommended penetration test scope and rough effort range.",time:"2 min",tags:["pen test","penetration testing","scope","estimate","effort"]}},pj=Object.values(tk),gj={"fda-premarket-cybersecurity-services":["cyber-device-applicability","estar-cyber-checklist","readiness"],"fda-postmarket-cybersecurity-services":["controlled-risk-classifier","postmarket-cadence-calculator","sbom-readiness","cvd-policy-generator"],"fda-cybersecurity-deficiency-response":["deficiency-letter-triage","estar-cyber-checklist","readiness"],"medical-device-threat-modeling":["threat-model-starter","cyber-device-applicability","samd-simd-classifier"],"fda-compliant-sbom-services-for-medtech":["sbom-readiness","sbom-diff-vex","component-risk-scorecard","postmarket-cadence-calculator"],"medical-device-penetration-testing":["scope-estimator","wireless-interface-profiler","threat-model-starter"],"samd-cybersecurity":["samd-simd-classifier","pccp-builder","threat-model-starter"],"legacy-medical-device-cybersecurity-services":["legacy-component-triage","sbom-readiness","threat-model-starter"],"medical-device-cybersecurity-consulting":["readiness","cyber-device-applicability","scope-estimator"]};function ik(e){return e.map(t=>tk[t]).filter(Boolean)}function fj(e){if(!e)return[];const t=gj[e];return t?ik(t):[]}function qN(e){const i=[e.slug??"",e.title??"",e.category??"",...e.tags??[],(e.body??"").slice(0,1200)].join(" ").toLowerCase();if(!i.trim())return null;let r=null;for(const s of pj){let n=0;for(const o of s.tags){const c=o.toLowerCase();if(!c)continue;new RegExp(`(^|[^a-z0-9])${c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}([^a-z0-9]|$)`,"i").test(i)&&(n+=c.includes(" ")?3:1)}n>0&&(!r||n>r.score)&&(r={tool:s,score:n})}return r&&r.score>=2?r.tool:null}function yj({slugs:e,serviceSlug:t,eyebrow:i="Free tools",heading:r="Try the free tool first.",intro:s="Pressure-test the work yourself before you scope an engagement. No signup, results are yours to keep.",variant:n="surface",max:o=4}){const c=(e?ik(e):fj(t)).slice(0,o);if(c.length===0)return null;const l=n==="surface"?"border-t border-border bg-surface py-16 lg:py-20":"py-16 lg:py-20";return a.jsx("section",{className:l,"aria-labelledby":"relevant-tools-heading",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-4",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsxs("span",{className:"eyebrow inline-flex items-center gap-2",children:[a.jsx(G_,{className:"h-3.5 w-3.5","aria-hidden":!0})," ",i]}),a.jsx("h2",{id:"relevant-tools-heading",className:"mt-3 font-display text-2xl font-bold sm:text-3xl",children:r}),s&&a.jsx("p",{className:"mt-3 text-foreground/70",children:s})]}),a.jsxs(H,{to:"/tools",className:"inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:underline",children:["All free tools ",a.jsx(Me,{className:"h-4 w-4","aria-hidden":!0})]})]}),a.jsx("div",{className:"mt-8 grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:c.map(d=>{const u=d.icon;return a.jsxs(H,{to:d.to,className:"card-hover group flex h-full flex-col rounded-2xl border border-border bg-background p-5",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"inline-flex h-10 w-10 items-center justify-center rounded-xl border border-border/60 bg-card/60 text-primary",children:a.jsx(u,{className:"h-5 w-5","aria-hidden":!0})}),a.jsx("span",{className:"text-[11px] uppercase tracking-wider text-foreground
209/50",children:d.time})]}),a.jsx("h3",{className:"mt-4 font-display text-base font-semibold leading-snug",children:d.title}),a.jsx("p",{className:"mt-1.5 text-sm text-foreground/70",children:d.short}),a.jsxs("span",{className:"mt-4 inline-flex items-center gap-1 text-sm font-medium text-primary",children:["Open tool"," ",a.jsx(Me,{className:"h-4 w-4 transition group-hover:translate-x-1","aria-hidden":!0})]})]},d.slug)})})]})})}function Sf(e){return e.replace(/<[^>]+>/g,"").replace(/!\[[^\]]*\]\([^)]*\)/g,"").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\*\*([^*]+)\*\*/g,"$1").replace(/\*([^*]+)\*/g,"$1").replace(/_([^_]+)_/g,"$1").replace(/\s+/g," ").trim()}const Cf=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"").slice(0,64),bj="https://bluegoatcyber.com",vj=e=>/^https?:\/\//i.test(e)?e:e.startsWith("/")?`${bj}${e}`:"";function wj(e){let t=e;try{t=new URL(e).pathname}catch{}const i=t.split("/").filter(Boolean).pop();return i?i.replace(/\.[a-z0-9]+$/i,"").replace(/[-_]+/g," ").replace(/\b\w/g,r=>r.toUpperCase()).trim():"Blue Goat Cyber"}function kj(e){const t=[],i=r=>{const s=vj(r.trim());s&&!t.includes(s)&&t.push(s)};for(const r of e.matchAll(/\[[^\]]+\]\(([^)\s]+)[^)]*\)/g))i(r[1]);for(const r of e.matchAll(/<a[^>]+href=["']([^"']+)["']/gi))i(r[1]);return t}function xj(e,t={}){const i=t.id??(t.url?`${t.url}#faq`:void 0),r=t.url?`${t.url}${t.anchor?`#${t.anchor}`:""}`:void 0;return{"@context":"https://schema.org","@type":"FAQPage",...i?{"@id":i}:{},...t.url?{url:t.url}:{},inLanguage:t.inLanguage??"en-US",...t.isPartOf?{isPartOf:t.isPartOf}:{},...t.about?{about:t.about}:{},...r?{mainEntityOfPage:r}:{},mainEntity:e.map(s=>{const n=kj(s.a),o=t.url?`${t.url}#${Cf(s.q)||"faq"}`:void 0;return{"@type":"Question",...i?{"@id":`${i}-${Cf(s.q)||"q"}`}:{},name:Sf(s.q),acceptedAnswer:{"@type":"Answer",text:Sf(s.a),...o?{url:o}:{}},...n.length?{mentions:n.map(c=>({"@type":"WebPage",name:wj(c),url:c}))}:{}}})}}const Aj="January|February|March|April|May|June|July|August|September|October|November|December",uh="\\-âââââ",Zc=new RegExp(`^[\\s·|â¢${uh}:,.]+`),Sj=[new RegExp(`^Updated\\s+(?:${Aj})\\s+\\d{1,2},?\\s+\\d{4}\\b`,"i"),new RegExp("^Updated\\s+(?:[A-Z][a-z]{2,8}\\s+)?\\d{4}\\b","i"),/^Free\s+[\w'â]+(?:[- ][\w'â]+){0,3}\s+(?:Guide|Checklist|Playbook|Brief|Toolkit|Report)\b/i,/^Free\s+(?:Guide|Checklist|Playbook|Brief|Toolkit|Report)\b/i,/^FDA[-\s]Aligned\b/i,/^Ungated\b/i,/^\d{1,3}\s+Pages?\b/i,/^[A-Z][A-Z0-9&/]+(?:\s+[A-Z][A-Z0-9&/]+){0,4}(?=\s*[\u00b7|]|\s+[A-Z][a-z])/],Df=new RegExp(`^(?:zero|none|[+${uh}]?\\d{1,4}(?:[${uh}]\\d{1,4})?\\s*(?:wk|wks|week|weeks|h|hr|hrs|d|day|days|mo|min|%)?\\+?)$`,"i");function Cj(e){let t=e;for(let i=0;i<8;i++){const r=t;t=t.replace(Zc,"");for(const s of Sj)if(s.test(t)){t=t.replace(s,"").replace(Zc,"").trim();break}if(t===r)break}return t.trim()}function Dj(e){const t=e.split(/\s+/);let i=0,r=0;for(;i<t.length;){const s=`${t[i]} ${t[i+1]??""}`.trim();if(t[i+1]&&Df.test(s)){i+=2,r++;continue}if(Df.test(t[i])){i+=1,r++;continue}break}return r>=2?t.slice(i).join(" "):e}function Tj(e){return e.replace(/(?:\s+(?:[A-Z][A-Z0-9&/.+-]*|\d{2,4}))+\s*$/,t=>t.trim().split(/\s+/).length>=3?"":t).trim()}function Ej(e){let t=(e??"").replace(/\s+/g," ").trim();return t&&(t=Cj(t),t=Dj(t),t=Tj(t),t=t.replace(Zc,"").trim(),t)}const Pj=new Set(["a","an","and","as","at","but","by","for","from","in","into","of","on","or","so","that","the","then","to","via","with","within"]);function _j(e,t){const i=e.trim(),r=(t??"").trim();if(!r||r.length<12||!i.toLowerCase().startsWith(r.toLowerCase()))return i;const s=i.slice(r.length).replace(Zc,"").trim();if(s.length<60)return i;const n=s.split(/\s+/)[0].replace(/[^A-Za-z]/g,"").toLowerCase();return Pj.has(n)||!/^[A-Z0-9"'(\u201c]/.test(s)?i:s}const Bd={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1,VITE_SUPABASE_PROJECT_ID:"iypdpvysibkuikwuihgt",VITE_SUPABASE_PUBLISHABLE_KEY:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Iml5cGRwdnlzaWJrdWlrd3VpaGd0Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3Nzc2NDE3MzMsImV4cCI6MjA5MzIxNzczM30.m4qWx4r2xJ8fyw2ALn0D92Dg381ReiHzQr03mFa1_9A",VITE_SUPABASE_URL:"https://iypdpvysibkuikwuihgt.supabase.co"},mt="https://bluegoatcyber.com",Tf=`${mt}/og-default.png`,rk=({title:e,description:t,path:i,canonicalUrl:r,image:s=Tf,type:n="website",jsonLd:o,absolute:c,article:l,noindex:d,prevPath:u,nextPath:
209h,keywords:g,alternates:m,audio:w,imageCacheBuster:v,imageAlt:k,preloadImages:y})=>{var we;const f=e,b=155,C=(z=>{const V=(z??"").trim().replace(/\s+/g," ");if(V.length<=b)return V;const xt=V.match(/[^.!?]+[.!?]+(?:\s|$)/g)||[];let He="";for(const Nt of xt){if((He+Nt).length>b)break;He+=Nt}if(He=He.trim(),He.length>=80&&He.length<=b)return He;const Ot=V.slice(0,b-1),Ft=Ot.lastIndexOf(" ");return`${(Ft>b*.6?Ot.slice(0,Ft):Ot).replace(/[\s,.;:â-]+$/,"")}.`})(_j(Ej(t),e)),D=`${mt}${i.startsWith("/")?i:`/${i}`}`,I=(z=>{try{const V=new URL(z);return V.hostname==="www.bluegoatcyber.com"||V.hostname==="bluegoatcyber.com"?(V.hostname="bluegoatcyber.com",V.protocol="https:",V.toString().replace(/\/$/,V.pathname==="/"?"/":"")):z}catch{return z}})(r??D),F=(z=>/^https?:\/\//i.test(z)||z.startsWith("data:")?z:`${mt}${z.startsWith("/")?z:`/${z}`}`)(s),K=typeof import.meta<"u"&&(Bd==null?void 0:Bd.VITE_OG_CACHE_BUSTER)||"",N=(v??K).toString().trim(),J=z=>{if(!N||!/^https?:\/\//i.test(z))return z;try{const V=new URL(z);return V.hostname!=="bluegoatcyber.com"&&V.hostname!=="www.bluegoatcyber.com"?z:(V.searchParams.has("v")||V.searchParams.set("v",N),V.toString())}catch{const V=z.includes("?")?"&":"?";return`${z}${V}v=${encodeURIComponent(N)}`}},B=/\.(png|jpe?g|webp|gif)(\?|#|$)/i,ne=z=>/^https?:\/\//i.test(z)&&B.test(z),Q=J(F),Z=ne(Q)?Q:J(Tf),_=z=>{const V=z.match(/\.(png|jpe?g|webp|gif)(?:\?|#|$)/i);if(!V)return;const xt=V[1].toLowerCase();return xt==="jpg"||xt==="jpeg"?"image/jpeg":`image/${xt}`},j=_(Q),q=/\.png(\?|$)/i.test(Q)&&(/\/og\//i.test(Q)||/\/og-default\.png/i.test(Q)),Y=_(Z),G=o?Array.isArray(o)?o:[o]:[],re=u?`${mt}${u.startsWith("/")?u:`/${u}`}`:null,se=h?`${mt}${h.startsWith("/")?h:`/${h}`}`:null;return a.jsxs(eo,{children:[a.jsx("title",{children:f}),a.jsx("meta",{name:"description",content:C}),g&&g.length>0&&a.jsx("meta",{name:"keywords",content:g.join(", ")}),a.jsx("link",{rel:"canonical",href:I}),y==null?void 0:y.map(z=>a.jsx("link",{rel:"preload",as:"image",href:z.href,...z.imageSrcSet?{imageSrcSet:z.imageSrcSet}:{},...z.imageSizes?{imageSizes:z.imageSizes}:{},...z.type?{type:z.type}:{},...z.fetchPriority?{fetchPriority:z.fetchPriority}:{}},z.href)),re&&a.jsx("link",{rel:"prev",href:re}),se&&a.jsx("link",{rel:"next",href:se}),d&&a.jsx("meta",{name:"robots",content:"noindex,follow"}),m==null?void 0:m.map(z=>a.jsx("link",{rel:"alternate",hrefLang:z.hreflang,href:`${mt}${z.path.startsWith("/")?z.path:`/${z.path}`}`},`${z.hreflang}-${z.path}`)),a.jsx("meta",{property:"og:title",content:f}),a.jsx("meta",{property:"og:description",content:C}),a.jsx("meta",{property:"og:type",content:n}),a.jsx("meta",{property:"og:url",content:I}),a.jsx("meta",{property:"og:image",content:Q}),j&&a.jsx("meta",{property:"og:image:type",content:j}),q&&a.jsx("meta",{property:"og:image:width",content:"1200"}),q&&a.jsx("meta",{property:"og:image:height",content:"630"}),a.jsx("meta",{property:"og:image:alt",content:k||f}),a.jsx("meta",{property:"og:site_name",content:"Blue Goat Cyber"}),a.jsx("meta",{property:"og:locale",content:"en_US"}),a.jsx("meta",{name:"twitter:card",content:"summary_large_image"}),a.jsx("meta",{name:"twitter:title",content:f}),a.jsx("meta",{name:"twitter:description",content:C}),a.jsx("meta",{name:"twitter:image",content:Z}),Y&&a.jsx("meta",{name:"twitter:image:type",content:Y}),a.jsx("meta",{name:"twitter:image:alt",content:k||f}),(w==null?void 0:w.url)&&a.jsx("meta",{property:"og:audio",content:w.url}),(w==null?void 0:w.url)&&w.url.startsWith("https://")&&a.jsx("meta",{property:"og:audio:secure_url",content:w.url}),(w==null?void 0:w.url)&&a.jsx("meta",{property:"og:audio:type",content:w.type??"audio/mpeg"}),(w==null?void 0:w.url)&&a.jsx("meta",{name:"twitter:player:stream",content:w.url}),(w==null?void 0:w.url)&&a.jsx("meta",{name:"twitter:player:stream:content_type",content:w.type??"audio/mpeg"}),n==="article"&&(l==null?void 0:l.publishedTime)&&a.jsx("meta",{property:"article:published_time",content:l.publishedTime}),n==="article"&&(l==null?void 0:l.author)&&a.jsx("meta",{property:"article:author",content:l.author}),n==="article"&&(l==null?void 0:l.section)&&a.jsx("meta",{property:"article:section",content:l.section}),n==="article"&&((we=l==null?void 0:l.tags)==null?void 0:we.map(z=>a.jsx("meta",{property:"article:tag",content:z},z))),G.map((z,V)=>a.jsx("script",{type:"application/ld+json",children:JSON.stringify(z)},V))]})},Ij={"@context":"https://schema.org","@type":["Organization","ProfessionalService"],"@id":`${mt}/#organization`,name:"Blue Goat Cyber",alternateName:"Blue Goat Cyber LLC",legalName:"Blue Goat Cyber LLC",url:mt,logo:`${mt}/og-default.png`,description:"Medical device cybersecurity specialists. Service-disabled veteran-owned firm helping MedTech manufacturers clear FDA premarket cybersecurity review with fixed-fee, retest-included engagements.",foundingDate:"2022",founder:{"@type":"Person",name:"Christian Espinosa",jobTitle:"Founder & CEO",sameAs:["https://www.linkedin.com/in/christianespinosa/"]},address:{"@type":"PostalAddress",addressLocality:"Scottsdale",addressRegion:"AZ",addressCountry:"US"}
209,telephone:"+1-844-939-4628",email:"[email protected]",areaServed:"Worldwide",award:["Service-Disabled Veteran-Owned Small Business (SDVOSB)"],knowsAbout:["Medical Device Cybersecurity","FDA Premarket Cybersecurity","FDA Postmarket Cybersecurity","510(k) Submissions","De Novo Submissions","PMA Submissions","SBOM Generation","Threat Modeling","Penetration Testing","IoMT Security","SaMD Security","IEC 62304","IEC 81001-5-1","AAMI TIR57","AAMI TIR97","ISO 14971","ISO 13485","FDA 21 CFR Part 820"],sameAs:["https://www.linkedin.com/company/blue-goat-cyber","https://www.youtube.com/@BlueGoatCyber","https://www.instagram.com/bluegoatcyber/","https://twitter.com/bluegoatcyber","https://mdcpodcast.com/"],contactPoint:[{"@type":"ContactPoint",telephone:"+1-844-939-4628",email:"[email protected]",contactType:"customer support",areaServed:"Worldwide",availableLanguage:"English"}]};function zN(e){var s;const t=jj(e),i=t[t.length-1],r=(s=i==null?void 0:i.path)!=null&&s.startsWith("/")?i.path:`/${(i==null?void 0:i.path)??""}`;return{"@context":"https://schema.org","@type":"BreadcrumbList","@id":`${mt}${r}#breadcrumb`,itemListElement:t.map((n,o)=>({"@type":"ListItem",position:o+1,name:n.name,item:`${mt}${n.path.startsWith("/")?n.path:`/${n.path}`}`}))}}function jj(e){const t=[],i=new Set,r=(s,n)=>{const o=n.replace(/\/+$/,"")||"/";i.has(o)||(i.add(o),t.push({name:s,path:o}))};for(let s=0;s<e.length;s++){const n=e[s];if(e.length-1,!n.path||n.path==="/"){r(n.name,n.path||"/");continue}const o=n.path.replace(/^\/+|\/+$/g,"").split("/");for(let c=0;c<o.length;c++){const l="/"+o.slice(0,c+1).join("/"),d=c===o.length-1;if(!d&&!Lw.has(l))continue;const u=d?n.name:Bw(o[c]);r(u,l)}}return t}var Bl="Collapsible",[Mj,sk]=xn(Bl),[Rj,Qm]=Mj(Bl),nk=p.forwardRef((e,t)=>{const{__scopeCollapsible:i,open:r,defaultOpen:s,disabled:n,onOpenChange:o,...c}=e,[l,d]=to({prop:r,defaultProp:s??!1,onChange:o,caller:Bl});return a.jsx(Rj,{scope:i,disabled:n,contentId:Mm(),open:l,onOpenToggle:p.useCallback(()=>d(u=>!u),[d]),children:a.jsx(Fe.div,{"data-state":Jm(l),"data-disabled":n?"":void 0,...c,ref:t})})});nk.displayName=Bl;var ak="CollapsibleTrigger",ok=p.forwardRef((e,t)=>{const{__scopeCollapsible:i,...r}=e,s=Qm(ak,i);return a.jsx(Fe.button,{type:"button","aria-controls":s.contentId,"aria-expanded":s.open||!1,"data-state":Jm(s.open),"data-disabled":s.disabled?"":void 0,disabled:s.disabled,...r,ref:t,onClick:_e(e.onClick,s.onOpenToggle)})});ok.displayName=ak;var Xm="CollapsibleContent",ck=p.forwardRef((e,t)=>{const{forceMount:i,...r}=e,s=Qm(Xm,e.__scopeCollapsible);return a.jsx(Pl,{present:i||s.open,children:({present:n})=>a.jsx(Oj,{...r,ref:t,present:n})})});ck.displayName=Xm;var Oj=p.forwardRef((e,t)=>{const{__scopeCollapsible:i,present:r,children:s,...n}
209=e,o=Qm(Xm,i),[c,l]=p.useState(r),d=p.useRef(null),u=vt(t,d),h=p.useRef(0),g=h.current,m=p.useRef(0),w=m.current,v=o.open||c,k=p.useRef(v),y=p.useRef(void 0);return p.useEffect(()=>{const f=requestAnimationFrame(()=>k.current=!1);return()=>cancelAnimationFrame(f)},[]),vi(()=>{const f=d.current;if(f){y.current=y.current||{transitionDuration:f.style.transitionDuration,animationName:f.style.animationName},f.style.transitionDuration="0s",f.style.animationName="none";const b=f.getBoundingClientRect();h.current=b.height,m.current=b.width,k.current||(f.style.transitionDuration=y.current.transitionDuration,f.style.animationName=y.current.animationName),l(r)}},[o.open,r]),a.jsx(Fe.div,{"data-state":Jm(o.open),"data-disabled":o.disabled?"":void 0,id:o.contentId,hidden:!v,...n,ref:u,style:{"--radix-collapsible-content-height":g?`${g}px`:void 0,"--radix-collapsible-content-width":w?`${w}px`:void 0,...e.style},children:v&&s})});function Jm(e){return e?"open":"closed"}var Fj=nk,Nj=ok,Lj=ck,Bj=p.createContext(void 0);function Uj(e){const t=p.useContext(Bj);return e||t||"ltr"}var oi="Accordion",qj=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[Ym,zj,Wj]=n0(oi),[Ul,WN]=xn(oi,[Wj,sk]),Zm=sk(),lk=E.forwardRef((e,t)=>{const{type:i,...r}=e,s=r,n=r;return a.jsx(Ym.Provider,{scope:e.__scopeAccordion,children:i==="multiple"?a.jsx(Gj,{...n,ref:t}):a.jsx(Vj,{...s,ref:t})})});lk.displayName=oi;var[dk,$j]=Ul(oi),[uk,Hj]=Ul(oi,{collapsible:!1}),Vj=E.forwardRef((e,t)=>{const{value:i,defaultValue:r,onValueChange:s=()=>{},collapsible:n=!1,...o}=e,[c,l]=to({prop:i,defaultProp:r??"",onChange:s,caller:oi});return a.jsx(dk,{scope:e.__scopeAccordion,value:E.useMemo(()=>c?[c]:[],[c]),onItemOpen:l,onItemClose:E.useCallback(()=>n&&l(""),[n,l]),children:a.jsx(uk,{scope:e.__scopeAccordion,collapsible:n,children:a.jsx(hk,{...o,ref:t})})})}),Gj=E.forwardRef((e,t)=>{const{value:i,defaultValue:r,onValueChange:s=()=>{},...n}=e,[o,c]=to({prop:i,defaultProp:r??[],onChange:s,caller:oi}),l=E.useCallback(u=>c((h=[])=>[...h,u]),[c]),d=E.useCallback(u=>c((h=[])=>h.filter(g=>g!==u)),[c]);return a.jsx(dk,{scope:e.__scopeAccordion,value:o,onItemOpen:l,onItemClose:d,children:a.jsx(uk,{scope:e.__scopeAccordion,collapsible:!0,children:a.jsx(hk,{...n,ref:t})})})}),[Kj,ql]=Ul(oi),hk=E.forwardRef((e,t)=>{const{__scopeAccordion:i,disabled:r,dir:s,orientation:n="vertical",...o}=e,c=E.useRef(null),l=vt(c,t),d=zj(i),h=Uj(s)==="ltr",g=_e(e.onKeyDown,m=>{var I;if(!qj.includes(m.key))return;const w=m.target,v=d().filter(R=>{var F;return!((F=R.ref.current)!=null&&F.disabled)}),k=v.findIndex(R=>R.ref.current===w),y=v.length;if(k===-1)return;m.preventDefault();let f=k;const b=0,x=y-1,C=()=>{f=k+1,f>x&&(f=b)},D=()=>{f=k-1,f<b&&(f=x)};switch(m.key){case"Home":f=b;break;case"End":f=x;break;case"ArrowRight":n==="horizontal"&&(h?C():D());break;case"ArrowDown":n==="vertical"&&C();break;case"ArrowLeft":n==="horizontal"&&(h?D():C());break;case"ArrowUp":n==="vertical"&&D();break}const T=f%y;(I=v[T].ref.current)==null||I.focus()});return a.jsx(Kj,{scope:i,disabled:r,direction:s,orientation:n,children:a.jsx(Ym.Slot,{scope:i,children:a.jsx(Fe.div,{...o,"data-orientation":n,ref:l,onKeyDown:r?void 0:g})})})}),el="AccordionItem",[Qj,ep]=Ul(el),mk=E.forwardRef((e,t)=>{const{__scopeAccordion:i,value:r,...s}=e,n=ql(el,i),o=$j(el,i),c=Zm(i),l=Mm(),d=r&&o.value.includes(r)||!1,u=n.disabled||e.disabled;return a.jsx(Qj,{scope:i,open:d,disabled:u,triggerId:l,children:a.jsx(Fj,{"data-orientation":n.orientation,"data-state":vk(d),...c,...s,ref:t,disabled:u,open:d,onOpenChange:h=>{h?o.onItemOpen(r):o.onItemClose(r)}})})});mk.displayName=el;var pk="AccordionHeader",gk=E.forwardRef((e,t)=>{const{__scopeAccordion:i,...r}=e,s=ql(oi,i),n=ep(pk,i);return a.jsx(Fe.h3,{"data-orientation":s.orientation,"data-state":vk(n.open),"data-disabled":n.disabled?"":void 0,...r,ref:t})});gk.displayName=pk;var hh="AccordionTrigger",fk=E.forwardRef((e,t)=>{const{__scopeAccordion:i,...r}=e,s=ql(oi,i),n=ep(hh,i),o=Hj(hh,i),c=Zm(i);return a.jsx(Ym.ItemSlot,{scope:i,children:a.jsx(Nj,{"aria-disabled":n.open&&!o.collapsible||void 0,"data-orientation":s.orientation,id:n.triggerId,...c,...r,ref:t})})});fk.displayName=hh;var yk="AccordionContent",bk=E.forwardRef((e,t)=>
209{const{__scopeAccordion:i,...r}=e,s=ql(oi,i),n=ep(yk,i),o=Zm(i);return a.jsx(Lj,{role:"region","aria-labelledby":n.triggerId,"data-orientation":s.orientation,...o,...r,ref:t,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...e.style}})});bk.displayName=yk;function vk(e){return e?"open":"closed"}var Xj=lk,Jj=mk,Yj=gk,wk=fk,kk=bk;const Zj=Xj,xk=p.forwardRef(({className:e,...t},i)=>a.jsx(Jj,{ref:i,className:Rt("border-b",e),...t}));xk.displayName="AccordionItem";const Ak=p.forwardRef(({className:e,children:t,...i},r)=>a.jsx(Yj,{className:"flex",children:a.jsxs(wk,{ref:r,className:Rt("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",e),...i,children:[t,a.jsx(Xn,{className:"h-4 w-4 shrink-0 transition-transform duration-200"})]})}));Ak.displayName=wk.displayName;const Sk=p.forwardRef(({className:e,children:t,...i},r)=>a.jsx(kk,{ref:r,className:"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...i,children:a.jsx("div",{className:Rt("pb-4 pt-0",e),children:t})}));Sk.displayName=kk.displayName;const eM="/hero-medical-bg.jpg",tM=p.lazy(()=>S(()=>import("./HubSpotForm-DOxDf-S2.js"),[]).then(e=>({default:e.HubSpotForm}))),iM=p.lazy(()=>S(()=>import("./CybersecurityJourney-Bxb4NGbF.js"),[]).then(e=>({default:e.CybersecurityJourney}))),rM=p.lazy(()=>S(()=>import("./InTheWild-D5-wbaQz.js"),__vite__mapDeps([13,14,15,16,17,18,19,20,21,22])).then(e=>({default:e.InTheWild}))),sM=p.lazy(()=>S(()=>import("./TestimonialCarousel-XvdN_nPl.js"),__vite__mapDeps([23,24])).then(e=>({default:e.TestimonialCarousel}))),nM=p.lazy(()=>S(()=>import("./EventsCalendar-CoVx1juw.js"),[]).then(e=>({default:e.EventsCalendar}))),aM=p.lazy(()=>S(()=>import("./LatestWebinar-DnwpczEw.js"),__vite__mapDeps([25,26,27])).then(e=>({default:e.LatestWebinar}))),fs=({minH:e="min-h-[400px]",children:t})=>a.jsx(p.Suspense,{fallback:a.jsx("div",{className:e,"aria-hidden":"true"}),children:t}),Ck=[{q:"What does the FDA actually require for medical device cybersecurity?",a:"Every premarket submission for a cyber device (510(k), De Novo, PMA) must include a documented Secure Product Development Framework (SPDF), a threat model traced to your ISO 14971 risk file, a cybersecurity risk assessment with exploitability scoring, a machine-readable SBOM with vulnerability and VEX analysis, security architecture views (global system, multi-patient harm, updateability, security use cases), evidence of security testing including independent third-party penetration testing with a Letter of Attestation, and cybersecurity labeling under Section 502(f). All of this is anchored in Section 524B of the FD&C Act and FDA's February 3, 2026 final premarket guidance, and it must drop directly into the eSTAR template."},{q:"Which devices count as 'cyber devices' under Section 524B?",a:"Section 524B defines a cyber device by three conditions, all of which must be met: (1) it includes software validated, installed, or authorized by the sponsor, (2) it has the ability to connect to the internet, and (3) it contains technological characteristics that could be vulnerable to cybersecurity threats. In practice this captures nearly every modern connected, software-driven, or wireless-enabled device, including BLE-paired wearables, USB-charged hearing aids, cloud-connected infusion pumps, and most SaMD. Risk class is irrelevant. If your device meets the three conditions, the full cybersecurity package is mandatory and the FDA can refuse to accept the submission without it."},{q:"Do I need a SBOM, and what format does the FDA expect?",a:"Yes. Section 524B(b)(3) makes an SBOM a statutory requirement for every cyber device submission. The FDA expects a machine-readable SBOM in CycloneDX 1.4+ or SPDX 2.3+, covering all commercial, open-source, and off-the-shelf components, including transitive dependencies. Each component needs supplier, version, unique identifier, dependency relationships, and known-vulnerability mapping (CVE status). We deliver CycloneDX 1.5 with VEX statements so reviewers see which CVEs are actually exploitable in your device's context, plus a documented postmarket monitoring source list (NVD, CISA KEV, vendor PSIRTs), triage SLAs, and a patch and update process tied to your QMS."},{q:"How long does premarket cybersecurity work usually take?",a:"For a typical Class II connected device, our submission-ready package, threat model, security risk assessment per AAMI SW96, CycloneDX SBOM with VEX, security architecture views, manual penetration test against every interface, and eSTAR-formatted documentation, runs 4 to 6 weeks once we have device artifacts. Simpler devices close in 2 to 3 weeks. Complex platforms, AI/ML devices under a PCCP, or PMA-class implantables can run 8 to 12 weeks. We can kick off this week, no 4 to 8 week onboarding queue, and we deliver a fixed-fee scope within 24 hours of your discovery call."},{q:"What happens if the FDA issues a cybersecurity deficiency letter?",a:"You have 180 days to respond before the submission goes on hold. We deliver a written gap analysis within 24 hours, mapping each finding to the relevant 524B subsection ((b)(1) postmarket, (b)(2) SPDF, (b)(3) SBOM) and the underlying guidance section. Most deficiencies fall into predictable buckets: incomplete threat model, weak SBOM or VEX analysis, insufficient pen test depth, missing architecture views, or unclear update strategy. We rebuild the affected sections, retest where required, and deliver a reviewer-ready point-by-point response, without losing your place in the FDA review queue. Across 275+ FDA submissions, we have never had a response rejected."},{q:"Is penetration testing required, and is automated scanning enough?",a:"Manual third-party penetration testing is required, and 'insufficient third-party penetration testing' is one of the top 5 reasons the FDA issues AI letters on cyber. Automated scans and
209SAST reports alone are explicitly not sufficient. FDA's February 2026 guidance expects exploit-driven testing against every interface the device exposes (wireless, BLE, USB, cellular, cloud APIs, companion apps, service ports, OTA update path), executed under availability constraints by independent qualified testers, with findings traced back to your threat model. The deliverable is a signed Letter of Attestation that names the testers, their independence, scope, methodology, and results. A web-app pen test rebadged for the device will be rejected."},{q:"What about postmarket cybersecurity obligations?",a:"Section 524B(b)(1) does not end at clearance. Manufacturers must run a documented postmarket program for the life of the device: monthly CVE triage against the SBOM, a coordinated vulnerability disclosure (CVD) program aligned with ISO/IEC 29147 and 30111, change-controlled patch delivery under 21 CFR Part 820, MedWatch-reportable incident decision logic, and KPI reporting to executive leadership. The FDA can issue 483 observations, Warning Letters, or recall actions if this program is missing or unevidenced at inspection. We run the program on your behalf, monitoring, triage, CVD intake, patch validation, and reporting, so a named team owns it instead of a help desk."},{q:"We haven't filed our premarket submission yet. When should we engage?",a:"As early as design inputs. The Secure Product Development Framework cannot be retrofitted: SPDF requires unbroken traceability from architecture decisions through threat model, security requirements, test evidence, and unresolved-anomaly disposition. Reviewers can tell when that chain was assembled after design freeze, dates do not line up, threat model assumptions contradict the as-built design, and the design history file has no security entries before V&V. The result is a Major Deficiency on SPDF and a request to redo design controls. We routinely help teams weeks from filing and teams responding to deficiency letters, but engaging at concept is dramatically cheaper and lower risk."}],oM=[{code:"CISSP",name:"Certified Information Systems Security Professional"},{code:"CSSLP",name:"Certified Secure Software Lifecycle Professional"},{code:"OSWE",name:"Offensive Security Web Expert"},{code:"OSCP",name:"Offensive Security Certified Professional"},{code:"CRTE",name:"Certified Red Team Expert"},{code:"CRTL",name:"Certified Red Team Lead"},{code:"CARTP",name:"Certified Azure Red Team Professional"},{code:"CBBH",name:"Certified Bug Bounty Hunter"}],cM=[{year:"2026",title:"Medical Device Cybersecurity Solution of the Year",org:"Medical Tech Outlook",note:"Cover story profiling Blue Goat Cyber as a top industry leader."},{year:"2026",title:"Medical Device Cybersecurity Partner of the Year",org:"MedTech World North America",note:"Inaugural North America Awards, in collaboration with CS Lifesciences - recognition of our patient-safety-first approach to FDA cybersecurity submissions."},{year:"2025",title:"MedTech Service Provider Excellence Award of the Year",org:"MedTech World Malta · sponsored by the Malta Medicines Authority",note:"Honored on the global MedTech stage for FDA-facing cybersecurity work."}],lM=["No obligation","Expert-led from minute one","NDA available on request"],dM=xj(Ck),uM=[Ij,{"@context":"https://schema.org","@type":"WebSite",name:"Blue Goat Cyber",url:mt,potentialAction:{"@type":"SearchAction",target:`${mt}/search?q={search_term_string}`,"query-input":"required name=search_term_string"}},dM],hM=()=>a.jsxs(a.Fragment,{children:[a.jsx(rk,{title:"Medical Device Cybersecurity for FDA Clearance",description:"Blue Goat Cyber is a senior US-based medical device cybersecurity team: 275+ FDA submissions supported, 0 cybersecurity rejections. Pen testing, SBOM, threat modeling, SPDF. Fixed-fee quote in 24 hours.",path:"/",jsonLd:uM,preloadImages:[{href:"/hero-medical-bg-900.avif",imageSrcSet:"/hero-medical-bg-900.avif 900w, /hero-medical-bg.avif 1920w",imageSizes:"100vw",type:"image/avif",fetchPriority:"high"},{href:"/hero-medical-bg-900.webp",imageSrcSet:"/hero-medical-bg-900.webp 900w, /hero-medical-bg.webp 1920w",imageSizes:"100vw",type:"image/webp"}]}),a.jsxs("section",{className:"relative overflow-hidden",children:[a.jsx("div",{className:"absolute inset-0","aria-hidden":!0,
209children:a.jsxs("picture",{children:[a.jsx("source",{type:"image/avif",srcSet:"/hero-medical-bg-900.avif 900w, /hero-medical-bg.avif 1920w",sizes:"100vw"}),a.jsx("source",{type:"image/webp",srcSet:"/hero-medical-bg-900.webp 900w, /hero-medical-bg.webp 1920w",sizes:"100vw"}),a.jsx("img",{src:eM,srcSet:"/hero-medical-bg-900.jpg 900w, /hero-medical-bg.jpg 1920w",sizes:"100vw",alt:"",role:"presentation",width:1920,height:1080,loading:"eager",fetchPriority:"high",decoding:"sync",className:"h-full w-full object-cover object-right"})]})}),a.jsx("div",{className:"absolute inset-0","aria-hidden":!0,style:{background:"hsl(205 60% 96% / 0.92)"}}),a.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 h-1",style:{background:"var(--gradient-vibrant)",opacity:.9}}),a.jsxs("div",{className:"container-x relative grid items-center gap-12 py-20 lg:grid-cols-[1.1fr_1fr] lg:gap-12 lg:py-28",children:[a.jsxs("div",{children:[a.jsxs("span",{className:"inline-flex items-center gap-2 rounded-full border border-primary/30 bg-primary/5 px-3 py-1 font-mono text-[11px] uppercase tracking-widest text-primary shadow-sm backdrop-blur",children:[a.jsx(Yt,{className:"h-3.5 w-3.5"}),"Aligned with FDA Feb 2026 Final Premarket Cybersecurity Guidance"]}),a.jsxs("h1",{className:"h-display-1 mt-6 text-foreground",children:["Accelerate FDA Clearance."," ",a.jsx("span",{className:"text-gradient-vibrant",children:"No Cyber Gaps Left Open."})]}),a.jsxs("p",{className:"mt-6 max-w-xl text-lg leading-relaxed text-foreground/75",children:["Full-service"," ",a.jsx(H,{to:"/medical-device-cybersecurity",className:"text-accent underline-offset-4 hover:underline",children:"medical device cybersecurity"})," ","built so 510(k), De Novo, and PMA submissions hold up under first-pass cybersecurity review: penetration testing, SBOMs, threat modeling, and eSTAR-ready documentation, handled end to end."]}),a.jsx("p",{className:"mt-4 max-w-xl text-base font-semibold leading-relaxed text-foreground",children:"If the FDA raises cybersecurity deficiencies after our submission, we resolve them at no additional cost."}),a.jsxs("div",{className:"mt-8 flex flex-wrap items-center gap-3",children:[a.jsx(ge,{asChild:!0,variant:"cta",size:"xl",children:a.jsxs("a",{href:Qs.meetingUrl,target:"_blank",rel:"noreferrer",onClick:()=>hc("home_hero"),children:[a.jsx(Hc,{className:"h-5 w-5"}),"Book strategy session"]})}),a.jsx(ge,{asChild:!0,size:"xl",variant:"outline",className:"border-accent/40 bg-white/70 text-foreground backdrop-blur hover:border-accent hover:bg-white hover:text-accent",children:a.jsxs(H,{to:"/guides/the-medtech-cybersecurity-standards-decoder",children:[a.jsx(Od,{className:"h-5 w-5"}),"Get the free guide"]})})]}),a.jsx("ul",{className:"mt-6 flex flex-wrap items-center gap-x-5 gap-y-2 text-sm text-foreground/70",children:lM.map(e=>a.jsxs("li",{className:"flex items-center gap-1.5",children:[a.jsx(Wn,{className:"h-4 w-4 flex-none text-accent","aria-hidden":"true"}),a.jsx("span",{children:e})]},e))}),a.jsxs(H,{to:"/why",className:"group mt-8 flex max-w-xl items-start gap-3 rounded-xl border border-accent/30 bg-white/85 p-4 shadow-[var(--shadow-md)] backdrop-blur transition-all hover:-translate-y-0.5 hover:border-accent/60 hover:bg-white",children:[a.jsx("div",{className:"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full border border-accent/40 bg-accent/15",children:a.jsx(Yt,{className:"h-5 w-5 text-accent"})}),a.jsxs("div",{className:"flex-1",children:[a.jsx("div",{className:"font-display text-base font-bold leading-tight text-foreground",children:"FDA Cybersecurity Deficiency Commitment"}),a.jsxs("p",{className:"mt-1 text-sm leading-relaxed text-foreground/70",children:["If the FDA raises cybersecurity deficiencies on work we delivered, we resolve them at no additional cost to you."," ",a.jsx("span",{className:"font-medium text-accent group-hover:underline",children:"See why â"})]}),a.jsx("p",{className:"mt-2 text-xs leading-relaxed text-foreground/55",children:"We commit to the work, not to the FDA's decision. Clearance rests with the FDA and depends on factors beyond cybersecurity."})]})]})]}),a.jsx("div",{className:"relative hidden lg:block",children:a.jsxs("div",{className:"relative ml-auto max-w-md rounded-3xl border border-white/60 bg-white/75 p-6 shadow-[var(--shadow-lg)] backdrop-blur-xl",children:[a.jsxs("div",{className:"flex items-center gap-2 font-mono text-[10px] uppercase tracking-widest text-muted-foreground",children:[a.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-accent"}),"Track record"]}),a.jsxs("div",{className:"mt-4 grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 text-accent",children:[a.jsx(j_,{className:"h-4 w-4"}),a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-wider",children:"FDA submissions"})]}),a.jsx("p",{className:"mt-1 font-display text-3xl font-bold leading-none",children:"275+"})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 text-c-teal",children:[a.jsx(mf,{className:"h-4 w-4"}),a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-wider",children:"To submission-ready"})]}),a.jsxs("p",{className:"mt-1 font-display text-3xl font-bold leading-none",children:["2-4",a.jsx("span",{className:"ml-1 text-base font-medium text-muted-foreground",children:"wk"})]})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 text-accent",children:[a.jsx(Wn,{className:"h-4 w-4"}),a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-wider",children:"Cyber deficiencies left open"})]}),a.jsx("p",{className:"mt-1 font-display text-3xl font-bold leading-none",children:"0"})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 text-c-teal",children:[a.jsx(Fd,{className:"h-4 w-4"}),a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-wider",children:"Deficiency response"})]}),a.jsx("p",{className:"mt-1 font-display text-xl font-bold leading-tight",children:"No extra cost"}),a.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"We answer FDA cyber deficiencies on our work until they clear."})]})]}),a.jsx("div",{className:"mt-5 border-t border-border/60 pt-4",children:a.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[a.jsx(A_,{className:"h-4 w-4 text-accent"}),a.jsxs("span",{className:"font-mono uppercase tracking-wider text-foreground
209/70",children:[a.jsx(H,{to:"/glossary#fda-2026",className:"hover:text-accent hover:underline underline-offset-4",children:"FDA 2026"})," · ",a.jsx(H,{to:"/glossary#ansi-aami-sw96",className:"hover:text-accent hover:underline underline-offset-4",children:"AAMI SW96"})," · ",a.jsx(H,{to:"/glossary#iso-13485",className:"hover:text-accent hover:underline underline-offset-4",children:"ISO 13485"})," · ",a.jsx(H,{to:"/glossary#iso-14971",className:"hover:text-accent hover:underline underline-offset-4",children:"ISO 14971"})]})]})})]})})]})]}),a.jsx("section",{className:"bg-background",children:a.jsxs("div",{className:"container-x py-14 sm:py-16",children:[a.jsx("p",{className:"text-center font-mono text-xs font-semibold uppercase tracking-[0.3em] text-accent",children:"Trusted by leading MedTech teams"}),a.jsx("div",{className:"group relative mt-10 overflow-hidden",style:{maskImage:"linear-gradient(to right, transparent, black 15%, black 85%, transparent)",WebkitMaskImage:"linear-gradient(to right, transparent, black 15%, black 85%, transparent)"},children:a.jsx("div",{className:"flex w-max animate-[marquee_45s_linear_infinite] gap-16 group-hover:[animation-play-state:paused] sm:gap-20",children:[...Fo,...Fo].map((e,t)=>a.jsx("div",{className:"flex h-20 w-[200px] shrink-0 items-center justify-center",title:e.name,"aria-hidden":t>=Fo.length?!0:void 0,children:a.jsx(EI,{src:e.src,alt:t>=Fo.length?"":`${e.name}, Blue Goat Cyber client`,width:200,height:Math.round(56*(e.scale??1)),style:{maxHeight:`${Math.round(56*(e.scale??1))}px`},className:"w-auto max-w-full object-contain"})},`${e.name}-${t}`))})})]})}),a.jsxs("section",{className:"container-x py-20",children:[a.jsxs("div",{className:"mx-auto mb-10 max-w-2xl text-center",children:[a.jsx("span",{className:"eyebrow",children:"By the numbers"}),a.jsxs("h2",{className:"mt-4 font-display text-3xl font-bold leading-tight sm:text-4xl",children:["Proof, not ",a.jsx("span",{className:"text-accent",children:"promises."})]})]}),a.jsx("div",{className:"relative",children:a.jsx("div",{className:"grid gap-px overflow-hidden rounded-2xl border border-border bg-border sm:grid-cols-2 lg:grid-cols-4",children:eI.map((e,t)=>{const i=[Xc,Yt,Fd,mf][t];return a.jsxs("div",{className:"group relative flex flex-col gap-3 bg-background p-8 transition-colors hover:bg-accent/[0.03]",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("div",{className:"grid h-11 w-11 place-items-center rounded-xl bg-accent/10 text-accent transition-transform group-hover:scale-110",children:a.jsx(i,{className:"h-5 w-5"})}),a.jsxs("div",{className:"font-mono text-[10px] uppercase tracking-widest text-muted-foreground/60",children:["0",t+1]})]}),a.jsx("div",{className:"font-display text-5xl font-bold leading-none tracking-tight text-foreground lg:text-6xl",children:e.value}),a.jsxs("div",{children:[a.jsx("div",{className:"text-sm font-semibold uppercase tracking-wider text-foreground",children:e.label}),a.jsx("div",{className:"mt-1 text-xs text-muted-foreground",children:e.sublabel})]}),a.jsx("div",{className:"absolute inset-x-0 bottom-0 h-0.5 origin-left scale-x-0 bg-gradient-to-r from-accent via-c-teal to-accent transition-transform duration-500 group-hover:scale-x-100"})]},e.label)})})})]}),a.jsxs("section",{className:"container-x grid gap-12 py-20 lg:grid-cols-[1fr_1.2fr]",children:[a.jsxs("div",{children:[a.jsx("span",{className:"eyebrow",children:"Medical Device Cybersecurity"}),a.jsxs("h2",{className:"mt-5 font-display text-3xl font-bold leading-tight sm:text-4xl",children:["Medical device cybersecurity, ",a.jsx("span",{className:"text-accent",children:"explained."})]})]}),a.jsxs("div",{className:"space-y-4 text-lg text-foreground/75",children:[a.jsxs("p",{children:[a.jsx("strong",{className:"text-foreground",children:"Medical device cybersecurity"})," is the set of controls, documentation, and testing that keeps a device safe and effective when exposed to real-world misuse, malicious attacks, and software supply chain risk, and satisfies the FDA reviewers who verify it. It is not generic IT security."]}),a.jsx("p",{children:"It focuses on how the device actually operates across hospital networks, patient homes, companion apps, cloud services, and third-party software."})]})]}),a.jsx("section",{className:"bg-surface py-24",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"What's at Stake"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:"When cybersecurity goes wrong, the cost is real."}
209),a.jsx("p",{className:"mt-4 text-foreground/70",children:"MedTech teams scramble to keep up with evolving FDA requirements - and the cost of a misstep is not just a delay."})]}),a.jsx("div",{className:"mt-12 grid gap-6 md:grid-cols-3",children:iI.map((e,t)=>a.jsxs(Di,{delay:t*80,className:"card-hover group rounded-2xl border border-border bg-background p-8",children:[a.jsx(e.icon,{className:"h-8 w-8 text-accent"}),a.jsx("h3",{className:"mt-5 font-display text-xl font-semibold",children:e.title}),a.jsx("p",{className:"mt-3 text-sm text-foreground/70 leading-relaxed",children:e.body})]},e.title))})]})}),a.jsxs("section",{className:"container-x pt-12",children:[a.jsxs("div",{className:"mb-6 flex flex-col items-start justify-between gap-3 sm:flex-row sm:items-end",children:[a.jsxs("div",{className:"max-w-xl",children:[a.jsx("span",{className:"eyebrow",children:"From Code Blue Chart"}),a.jsx("h2",{className:"mt-3 font-display text-2xl font-bold sm:text-3xl",children:"The threats aren't hypothetical."}),a.jsx("p",{className:"mt-2 text-sm text-foreground/70",children:"A public-record timeline of medical-device cybersecurity events, sponsored by Blue Goat Cyber."})]}),a.jsx(ge,{asChild:!0,variant:"ghost",children:a.jsxs("a",{href:"https://codebluechart.com/",target:"_blank",rel:"noopener noreferrer",children:["View full incident database ",a.jsx(Me,{className:"h-4 w-4"})]})})]}),a.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[a.jsxs("a",{href:"https://codebluechart.com/timeline",target:"_blank",rel:"noopener noreferrer",className:"group rounded-2xl border border-border/60 bg-card/60 p-6 transition hover:border-primary hover:bg-primary/5",children:[a.jsx("p",{className:"font-display text-5xl font-bold text-foreground",children:"86+"}),a.jsx("p",{className:"mt-2 text-sm font-semibold text-foreground",children:"Documented MedTech cyber events"}),a.jsx("p",{className:"mt-1 text-xs text-foreground/60",children:"Sourced from FDA recalls, CISA ICSMA advisories, peer-reviewed studies, and HHS OCR filings - 1985 to today."}),a.jsxs("span",{className:"mt-4 inline-flex items-center gap-1 text-xs font-medium text-primary group-hover:translate-x-0.5 transition",children:["Explore the timeline ",a.jsx(Me,{className:"h-3.5 w-3.5"})]})]}),a.jsxs("a",{href:"https://codebluechart.com/timeline",target:"_blank",rel:"noopener noreferrer",className:"group rounded-2xl border border-border/60 bg-card/60 p-6 transition hover:border-primary hover:bg-primary/5",children:[a.jsx("p",{className:"font-display text-5xl font-bold text-foreground",children:"7"}),a.jsx("p",{className:"mt-2 text-sm font-semibold text-foreground",children:"Events tied to patient harm"}),a.jsx("p",{className:"mt-1 text-xs text-foreground/60",children:"Including the NHS-attributed cyber-related death from the 2024 Synnovis attack and three cyber-driven device recalls."}),a.jsxs("span",{className:"mt-4 inline-flex items-center gap-1 text-xs font-medium text-primary group-hover:translate-x-0.5 transition",children:["See the cases ",a.jsx(Me,{className:"h-3.5 w-3.5"})]})]})]})]}),a.jsx("section",{className:"relative overflow-hidden border-y border-destructive/20 bg-gradient-to-br from-destructive/10 via-background to-primary/5 py-20",children:a.jsxs("div",{className:"container-x",children:[a.jsx(Di,{children:a.jsxs("div",{className:"mx-auto max-w-3xl text-center",children:[a.jsx("span",{className:"eyebrow text-destructive",children:"Reality check"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl md:text-5xl",children:"5 misconceptions delaying your FDA clearance."}),a.jsx("p",{className:"mt-4 text-foreground/70 md:text-lg",children:"After 275+ FDA submissions, these are the beliefs we see crater MedTech timelines - every one of them ends in a hold, an AI letter, or a missed launch window."})]})}),a.jsxs("div",{className:"mx-auto mt-12 grid max-w-5xl gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[[{n:"01",myth:"âMy device isnât a cyber device.â",reality:"Section 524B(c) defines a cyber device by three conditions, all of which must be met: (1) it includes software validated, installed, or authorized by the sponsor,
209(2) it has the ability to connect to the internet, and (3) it contains technological characteristics that could be vulnerable to cybersecurity threats. BLE pairing, a USB charging port, or a companion app each satisfy condition 2. If your device meets all three, the full SPDF, SBOM, threat model, and pen test package is mandatory - and the FDA can refuse to accept the submission without it."},{n:"02",myth:"âMy developers know cybersecurity.â",reality:"Reviewers don't ask if your team can write secure code. They ask for a STRIDE-based threat model traced to ISO 14971 hazards, a CycloneDX SBOM with VEX justifications for every flagged CVE, security architecture views (global system, multi-patient harm, updateability, security use cases), and a Letter of Attestation from an independent pen tester. We watched one team's submission get a Major Deficiency because their threat model listed mitigations without traceability to the design history file - reviewer wanted to see the chain, not the conclusion."},{n:"03",myth:"âItâs about protecting data.â",reality:"The FDA'
209s February 2026 final premarket guidance (Section IV) frames cybersecurity as patient safety, device availability, and data integrity - in that order. HIPAA and data confidentiality language alone gets flagged as a scope gap. Your threat model has to show how a compromise could harm a patient, render the device unavailable, or corrupt the data it acts on. That is the lens reviewers apply."},{n:"04",myth:"âWeâll add cybersecurity later.â",reality:"The Secure Product Development Framework (Section 524B(b)(2)) requires unbroken traceability from architecture decisions through threat model, security requirements, test evidence, and unresolved-anomaly disposition. Reviewers can tell when the chain was assembled after design freeze: dates don't line up, threat model assumptions contradict the as-built design, and the design history file has no security entries before V&V. The result is a Major Deficiency on SPDF and a request to redo design controls - 6 to 9 months added to your timeline."},{n:"05",myth:"âTraditional IT cybersecurity works.â",reality:"IT pen testing assumes you can take a system offline. Medical device pen testing has to respect availability constraints - you cannot brick an infusion pump mid-test. The deliverable is a signed Letter of Attestation naming the testers, their independence, scope, and methodology, plus firmware-level testing the FDA increasingly expects (secure boot verification, OTA update path, debug interfaces). A SOC 2 report or a generic vulnerability scan rebadged for the device will be rejected."}].map(e=>a.jsxs("div",{className:"rounded-xl border border-border/60 bg-card/70 p-5 backdrop-blur transition hover:border-destructive/40 hover:bg-card",children:[a.jsx("div",{className:"font-display text-2xl font-bold text-destructive/70",children:e.n}),a.jsx("p",{className:"mt-2 text-sm font-medium text-foreground/80 line-through decoration-destructive/50 decoration-2",children:e.myth}),a.jsx("p",{className:"mt-3 text-sm text-foreground/70",children:e.reality})]},e.n)),a.jsxs(H,{to:"/misconceptions",className:"group flex flex-col items-start justify-center gap-2 rounded-xl border border-primary/40 bg-primary/10 p-5 text-left transition hover:bg-primary/20",children:[a.jsx("span",{className:"font-display text-2xl font-bold text-primary",children:"+ Reality"}),a.jsxs("span",{className:"inline-flex items-center gap-1 text-sm font-semibold text-primary",children:["See what FDA actually expects",a.jsx(Me,{className:"h-4 w-4 transition group-hover:translate-x-0.5"})]})]})]}),a.jsxs("div",{className:"mt-10 flex flex-col items-center gap-3",children:[a.jsx(ge,{asChild:!0,size:"lg",className:"rounded-full px-8",children:a.jsxs(H,{to:"/misconceptions",children:["Read the 5 costly misconceptions",a.jsx(Me,{className:"h-4 w-4"})]})}),a.jsx("p",{className:"text-xs text-foreground/50",children:"~4 min read · grounded in 275+ FDA submissions"})]})]})}),a.jsx(fs,{children:a.jsx(iM,{})}),a.jsx(fs,{children:a.jsx(rM,{})}),a.jsxs("section",{className:"container-x py-24",children:[a.jsxs("div",{className:"flex flex-col items-start justify-between gap-6 sm:flex-row sm:items-end",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"Services"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:"Medical device cybersecurity services."}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"Purpose-built for FDA-regulated medical devices - from premarket submission through postmarket monitoring."})]}),a.jsx(ge,{asChild:!0,variant:"ghost",children:a.jsxs(H,{to:"/services",children:["All services ",a.jsx(Me,{className:"h-4 w-4"})]})})]}),a.jsx("div",{className:"mt-12 grid gap-5 sm:grid-cols-2 sm:gap-6 lg:grid-cols-4 lg:gap-6 auto-rows-fr",children:[{slug:"medtech-compliance-bundle",badge:"Most Requested"},{slug:"ai-ml-medical-device-security",badge:"New · High Stakes"},{slug:"fda-premarket-cybersecurity-services",badge:void 0},{slug:"fda-cybersecurity-deficiency-response",badge:void 0},{slug:"secure-medtech-product-design-consulting",badge:void 0},{slug:"medical-device-threat-modeling",badge:void 0},{slug:"medical-device-penetration-testing",badge:void 0},{slug:"fda-postmarket-cybersecurity-services",badge:void 0}].map(e=>{const t=uc.find(i=>i.slug===e.slug);return t?{...t,badge:e.badge}:null}).filter(e=>!!e).map(e=>a.jsxs(H,{to:`/services/${e.slug}`,className:`card-hover group relative flex h-full flex-col rounded-2xl border bg-background p-6 ${e.badge?"border-accent/60 shadow-[var(--shadow-md)]":"border-border"}`,children:[e.badge&&a.jsx("span",{className:"absolute -top-2.5 left-4 inline-flex items-center rounded-full bg-accent px-2.5 py-0.5 font-mono text-[10px] uppercase tracking-widest text-accent-foreground shadow-sm",children:e.badge}),a.jsxs("div",{className:"flex items-center justify-between gap-3",children:[a.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-lg bg-accent/10 text-accent",children:a.jsx(e.icon,{className:"h-5 w-5"})}),a.jsxs("span",{className:`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 font-mono text-[10px] uppercase tracking-widest ${e.category==="Premarket"?"border-accent/30 bg-accent/10 text-accent":"border-primary/30 bg-primary/10 text-primary"}`,children:[a.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${e.category==="Premarket"?"bg-accent":"bg-primary"}`,"aria-hidden":!0}),e.category]})]}),a.jsx("h3",{className:"mt-5 font-display text-lg font-semibold leading-snug line-clamp-2 min-h-[3.25rem]",children:e.title}
209),a.jsx("p",{className:"mt-2 flex-1 text-sm text-foreground/70 leading-relaxed line-clamp-4",children:e.short}),a.jsxs("span",{className:"mt-5 inline-flex items-center gap-1.5 text-sm font-semibold text-accent",children:["View service ",a.jsx(Me,{className:"h-4 w-4 transition-transform group-hover:translate-x-1"})]})]},e.slug))}),a.jsxs("div",{className:"mt-10 flex flex-wrap items-center justify-center gap-3",children:[a.jsx(ge,{asChild:!0,variant:"cta",size:"lg",children:a.jsxs(H,{to:"/services",children:["See all 25 services ",a.jsx(Me,{className:"h-5 w-5"})]})}),a.jsx(ge,{asChild:!0,variant:"outline",size:"lg",children:a.jsx(H,{to:"/contact",children:"Talk to a MedTech expert"})})]})]}),a.jsxs("section",{className:"container-x py-20 lg:py-24",children:[a.jsxs("div",{className:"mx-auto max-w-2xl text-center",children:[a.jsx("span",{className:"eyebrow mx-auto",children:"Get answers in minutes"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:"Self-serve tools, built by engineers who've shipped 275+ FDA submissions."}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"No sales call required. Score your readiness or model what a deficiency would cost you."})]}),a.jsx("div",{className:"mt-12 grid gap-6 md:grid-cols-2 lg:grid-cols-3",children:[{to:"/readiness",icon:Jc,eyebrow:"2-minute quiz",title:"FDA cyber readiness score",body:"7 questions mapped to FDA premarket guidance. Get a score, gap list, and your fastest path to clearance.",cta:"Score my device"},{to:"/cost-of-delay",icon:$c,eyebrow:"ROI calculator",title:"Cost-of-delay calculator",body:"Plug in your revenue and timeline. See what one FDA cybersecurity deficiency really costs your MedTech business.",cta:"Run the math"},{href:"/downloads/fda-cyber-readiness-checklist.pdf",icon:Xg,eyebrow:"Free PDF",title:"FDA readiness checklist",body:"A 20-item self-assessment covering SPDF, SBOM, postmarket monitoring, architecture, and labeling - aligned to the FDA February 2026 premarket cybersecurity guidance.",cta:"Download the PDF"}].map(({to:e,href:t,icon:i,eyebrow:r,title:s,body:n,cta:o})=>{const c="group flex flex-col rounded-2xl border border-border bg-background p-7 transition hover:-translate-y-1 hover:border-primary hover:shadow-lg",l=a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"flex h-12 w-12 items-center justify-center rounded-xl bg-primary/10 text-primary",children:a.jsx(i,{className:"h-6 w-6","aria-hidden":!0})}),a.jsx("span",{className:"mt-5 text-xs uppercase tracking-wider text-foreground/50",children:r}),a.jsx("h3",{className:"mt-2 font-display text-xl font-semibold",children:s}),a.jsx("p",{className:"mt-3 flex-1 text-sm text-foreground/70",children:n}),a.jsxs("span",{className:"mt-5 inline-flex items-center gap-1.5 text-sm font-medium text-primary",children:[o," ",a.jsx(Me,{className:"h-4 w-4 transition group-hover:translate-x-1"})]})]});return t?a.jsx("a",{href:t,target:"_blank",rel:"noreferrer",className:c,children:l},t):a.jsx(H,{to:e,className:c,children:l},e)})})]}),a.jsxs("section",{className:"dark-section relative overflow-hidden",children:[a.jsx("div",{className:"absolute inset-0",style:{background:"var(--gradient-mesh)"},"aria-hidden":!0}),a.jsxs("div",{className:"container-x relative py-24",children:[a.jsxs(Di,{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"How we work"}),a.jsxs("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:["From discovery to clearance - ",a.jsx("span",{className:"text-gradient-accent",children:"one team, one process."})]})]}),a.jsx("div",{className:"mt-12 grid gap-6 md:grid-cols-3 lg:grid-cols-5",children:rI.map((e,t)=>a.jsxs(Di,{delay:t*60,className:"card-hover rounded-2xl border border-border bg-background/80 p-6 backdrop-blur",children:[a.jsxs("div",{className:"flex items-center justify-between gap-2",children:[a.jsxs("div",{className:"font-mono text-xs text-accent",children:["0",t+1]}),"when"in e&&e.when&&a.jsx("span",{className:"rounded-full border border-accent/30 bg-accent/10 px-2 py-0.5 font-mono text-[10px] uppercase tracking-widest text-accent",children:e.when})]}),a.jsx(e.icon,{className:"mt-3 h-6 w-6 text-accent"}),a.jsx("h3",{className:"mt-4 font-display text-lg font-semibold text-foreground",children:e.title}
209),a.jsx("p",{className:"mt-2 text-sm text-foreground/70 leading-relaxed",children:e.body})]},e.title))})]})]}),a.jsx("section",{className:"border-t border-border bg-surface py-24",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"flex flex-col items-start justify-between gap-6 sm:flex-row sm:items-end",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"Segments"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:"Cybersecurity by MedTech segment."}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"Every device class has its own attack surface and FDA reviewer expectations. Pick yours."})]}),a.jsx(ge,{asChild:!0,variant:"ghost",children:a.jsxs(H,{to:"/medtech-segments",children:["All segments ",a.jsx(Me,{className:"h-4 w-4"})]})})]}),a.jsx("div",{className:"mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:Zw.slice(0,8).map(e=>a.jsxs(H,{to:`/medtech-segments/${e.slug}`,className:"card-hover group flex flex-col rounded-2xl border border-border bg-background p-6",children:[a.jsx("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-accent/10 text-accent",children:a.jsx(e.icon,{className:"h-5 w-5"})}),a.jsx("h3",{className:"mt-4 font-display text-base font-semibold",children:e.shortName}),a.jsx("p",{className:"mt-1.5 flex-1 text-xs text-foreground/65 leading-relaxed",children:e.tagline}),a.jsxs("span",{className:"mt-3 inline-flex items-center gap-1 text-xs font-medium text-accent",children:["Explore ",a.jsx(Me,{className:"h-3.5 w-3.5 transition-transform group-hover:translate-x-1"})]})]},e.slug))})]})}),a.jsx("section",{className:"border-t border-border bg-background py-24",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"flex flex-col items-start justify-between gap-6 sm:flex-row sm:items-end",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"Case studies"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:"Real wins, anonymized."}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"Device names and clients are confidential. Outcomes are not. Three engagements from the last 12 months - every one cleared without a re-do."})]}),a.jsx(ge,{asChild:!0,variant:"ghost",children:a.jsxs(H,{to:"/case-studies",children:["All case studies ",a.jsx(Me,{className:"h-4 w-4"})]})})]}),a.jsx("div",{className:"mt-12 grid gap-6 md:grid-cols-2 lg:grid-cols-3",children:XI.slice(0,3).map((e,t)=>a.jsxs(Di,{delay:t*80,className:"card-hover flex flex-col rounded-2xl border border-border bg-surface p-7",children:[a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-widest text-accent",children:e.deviceClass}),a.jsx("h3",{className:"mt-3 font-display text-lg font-semibold leading-snug",children:e.client}),a.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:e.segment}),a.jsx("p",{className:"mt-5 font-mono text-[11px] uppercase tracking-wider text-muted-foreground",children:"Challenge"}),a.jsx("p",{className:"mt-1 text-sm text-foreground/75 leading-relaxed",children:e.challenge}),a.jsx("ul",{className:"mt-5 space-y-2",children:e.outcome.map(i=>a.jsxs("li",{className:"flex items-baseline justify-between gap-3 border-t border-border pt-2 text-sm",children:[a.jsx("span",{className:"text-foreground/70",children:i.label}),a.jsx("span",{className:"font-display font-semibold text-accent",children:i.value})]},i.label))})]},e.slug))}),a.jsxs("p",{className:"mt-8 text-sm text-muted-foreground",children:["Want references in your device class?"," ",a.jsx("a",{href:Qs.meetingUrl,target:"_blank",rel:"noreferrer",className:"font-medium text-accent hover:underline",onClick:()=>hc("home_references_inline"),children:"Ask on your discovery call"})," "," - we can connect you with clients under NDA."]})]})}),a.jsx("section",{className:"border-t border-border bg-surface/40 py-24",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"flex flex-col items-start justify-between gap-6 md:flex-row md:items-end",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"Meet us in person"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:"Title sponsor of MedTech World. Sponsor of every LSI summit."}
209),a.jsx("p",{className:"mt-4 text-foreground/70",children:"Blue Goat Cyber is title sponsor of MedTech World and cybersecurity sponsor of every LSI summit. Our team keynotes, judges, and mentors across the US, EMEA, and APAC - because the firms shaping the next generation of medical devices are the same firms we work with every day."})]}),a.jsx(ge,{asChild:!0,variant:"ghost",children:a.jsxs(H,{to:"/events",children:["All events ",a.jsx(Me,{className:"h-4 w-4"})]})})]}),a.jsx("div",{className:"mt-12",children:a.jsx(fs,{minH:"min-h-[600px]",children:a.jsx(nM,{year:2026})})}),a.jsx("div",{className:"mt-10 grid gap-5 md:grid-cols-2 lg:grid-cols-4",children:dj.slice(0,4).map((e,t)=>a.jsxs(Di,{delay:t*60,className:"card-hover flex flex-col rounded-2xl border border-border bg-background p-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-widest text-accent",children:e.sponsorship}),a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-widest text-foreground/60",children:e.region})]}),a.jsx("h3",{className:"mt-4 font-display text-base font-semibold leading-snug",children:e.name}),a.jsx("p",{className:"mt-3 text-sm text-foreground/75",children:e.dates}),a.jsxs("p",{className:"mt-1 text-sm text-foreground/60",children:[e.city,", ",e.country]}),a.jsx(H,{to:`/events/${e.slug}`,className:"mt-auto pt-5 text-sm font-medium text-accent hover:underline",children:"Event details â"})]},e.name))})]})}),a.jsx(yj,{slugs:["readiness","cyber-device-applicability","sbom-readiness","pccp-builder"],heading:"Skip the sales call. Try the free tools.",intro:"No-signup tools built by the same engineers who run the FDA submissions. Most take under 5 minutes."}),a.jsx(fs,{minH:"min-h-[500px]",children:a.jsx(sM,{})}),a.jsx("section",{className:"border-t border-border bg-background py-24",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"Industry recognition"}),a.jsx("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:"Award-winning. Globally recognized."}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"Our work has been honored by the leading voices in medical device cybersecurity."})]}),a.jsx("div",{className:"mt-12 grid gap-6 md:grid-cols-3",children:cM.map((e,t)=>a.jsxs(Di,{delay:t*80,className:"card-hover flex flex-col rounded-2xl border border-border bg-surface p-7",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx(Fd,{className:"h-7 w-7 text-accent","aria-hidden":"true"}),a.jsx("span",{className:"font-mono text-xs font-semibold uppercase tracking-widest text-accent",children:e.year})]}),a.jsx("h3",{className:"mt-5 font-display text-lg font-semibold leading-snug",children:e.title}),a.jsx("p",{className:"mt-2 text-sm font-medium text-foreground/80",children:e.org}),a.jsx("p",{className:"mt-3 flex-1 text-sm text-foreground/65 leading-relaxed",children:e.note})]},e.title))})]})}),a.jsx("section",{className:"bg-surface py-24",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("span",{className:"eyebrow",children:"Offensive security credentials"}),a.jsxs("h2",{className:"mt-5 font-display text-3xl font-bold sm:text-4xl",children:["The certifications that actually ",a.jsx("span",{className:"text-accent",children:"break into devices."})]}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"Our team holds the offensive security certifications real attackers respect - backed by hands-on U.S. government red team and military cyber operations experience."})]}),a.jsx("div",{className:"mt-10 grid gap-3 sm:grid-cols-2 lg:grid-cols-4",children:oM.map(e=>a.jsxs("div",{className:"flex items-start gap-3 rounded-xl border border-border bg-background p-4",children:[a.jsx("div",{className:"flex h-10 w-10 flex-none items-center justify-center rounded-lg bg-accent/10 text-accent",children:a.jsx($_,{className:"h-5 w-5","aria-hidden":"true"})}),a.jsxs("div",{children:[a.jsx("p",{className:"font-mono text-sm font-bold text-foreground",children:e.code}
209),a.jsx("p",{className:"mt-1 text-xs text-foreground/65 leading-snug",children:e.name})]})]},e.code))}),a.jsxs("ul",{className:"mt-8 flex flex-wrap items-center gap-x-6 gap-y-2 text-sm text-foreground/80",children:[a.jsxs("li",{className:"inline-flex items-center gap-2",children:[a.jsx(Yt,{className:"h-4 w-4 text-accent","aria-hidden":!0})," U.S. government red team experience"]}),a.jsxs("li",{className:"inline-flex items-center gap-2",children:[a.jsx(V_,{className:"h-4 w-4 text-accent","aria-hidden":!0})," Military cyber operations"]}),a.jsxs("li",{className:"inline-flex items-center gap-2",children:[a.jsx(Xc,{className:"h-4 w-4 text-accent","aria-hidden":!0})," Manual business-logic testing"]})]})]})}),a.jsx("section",{className:"border-t border-border bg-background py-24",children:a.jsxs("div",{className:"container-x",children:[a.jsxs("div",{className:"grid gap-10 lg:grid-cols-[1fr_1.4fr] lg:items-end",children:[a.jsxs("div",{children:[a.jsx("span",{className:"eyebrow",children:"Regulatory frameworks"}),a.jsxs("h2",{className:"mt-5 font-display text-3xl font-bold leading-tight sm:text-4xl",children:["Every standard FDA reviewers expect - ",a.jsx("span",{className:"text-accent",children:"covered."})]}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"We speak the language so your team doesn't have to learn it from scratch. Each framework below maps to a specific deliverable in your submission package."})]}),a.jsxs("div",{className:"rounded-2xl border border-border bg-surface p-6",children:[a.jsx("p",{className:"font-mono text-xs font-semibold uppercase tracking-widest text-accent",children:"Not sure which apply to you?"}),a.jsx("p",{className:"mt-3 text-sm text-foreground/75",children:"The Standards Decoder maps each framework to your submission pathway - 510(k), De Novo, or PMA - and the artifacts the FDA expects against each."}),a.jsx(ge,{asChild:!0,variant:"outline",size:"sm",className:"mt-4",children:a.jsxs(H,{to:"/glossary",children:[a.jsx(Od,{className:"h-4 w-4"})," Browse the standards glossary"]})})]})]}),a.jsxs("div",{className:"mt-12",children:[a.jsx("p",{className:"font-mono text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Core standards · We lead with these"}),a.jsx("div",{className:"mt-4 grid gap-px overflow-hidden rounded-2xl border border-border bg-border sm:grid-cols-2",children:ff.slice(0,4).map(e=>a.jsxs(H,{to:`/glossary#${e.code.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")}`,className:"group relative bg-background p-6 transition-colors hover:bg-surface",children:[a.jsxs("div",{className:"flex items-start justify-between gap-4",children:[a.jsx("div",{className:"font-mono text-xs font-semibold uppercase tracking-wider text-accent",children:e.code}),a.jsx("span",{className:"rounded-full border border-accent/30 bg-accent/5 px-2 py-0.5 font-mono text-[10px] font-semibold uppercase tracking-widest text-accent",children:"Core"})]}),a.jsx("h3",{className:"mt-3 font-display text-lg font-semibold group-hover:text-accent",children:e.title}),a.jsx("p",{className:"mt-2 text-sm leading-relaxed text-foreground/65",children:e.body}),a.jsx("span",{className:"mt-4 inline-flex items-center gap-1 font-mono text-xs font-semibold uppercase tracking-wider text-accent opacity-0 transition-opacity group-hover:opacity-100",children:"See details â"})]},e.code))})]}),a.jsxs("div",{className:"mt-12",children:[a.jsx("p",{className:"font-mono text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Adjacent frameworks · Referenced in our deliverables"}),a.jsx("div",{className:"mt-4 grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:ff.slice(4).map(e=>a.jsxs(H,{to:`/glossary#${e.code.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")}`,className:"group rounded-xl border border-border bg-surface p-4 transition-colors hover:border-accent/40 hover:bg-background",children:[a.jsx("div",{className:"font-mono text-xs font-semibold uppercase tracking-wider text-accent",children:e.code}),a.jsx("h4",{className:"mt-1.5 font-display text-sm font-semibold group-hover:text-accent",children:e.title}),a.jsx("p",{className:"mt-1.5 text-xs leading-relaxed text-foreground
209/60",children:e.body})]},e.code))})]}),a.jsxs("div",{className:"mt-10 flex flex-wrap items-center gap-x-6 gap-y-3 rounded-2xl border border-border bg-surface px-6 py-5",children:[a.jsx("p",{className:"font-mono text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"We also align with"}),a.jsx("p",{className:"text-sm text-foreground/75",children:tI.join(" · ")})]})]})}),a.jsx("section",{className:"bg-surface py-20",children:a.jsx("div",{className:"container-x",children:a.jsxs(Di,{className:"grid items-center gap-8 rounded-2xl border border-accent/30 bg-gradient-to-br from-accent/10 via-accent/5 to-transparent p-8 md:grid-cols-[1.4fr_1fr] md:p-10",children:[a.jsxs("div",{children:[a.jsx("p",{className:"font-mono text-xs font-semibold uppercase tracking-widest text-accent",children:"Free resource · PDF"}),a.jsx("h2",{className:"mt-3 font-display text-2xl font-bold sm:text-3xl",children:"The MedTech Cybersecurity Standards Decoder"}),a.jsx("p",{className:"mt-3 text-foreground/75 leading-relaxed",children:"FDA Section 524B, AAMI SW96, ISO 14971, IEC 81001-5-1 and more - what each requires, how they connect, and what the FDA expects to see. No email, no signup."})]}),a.jsxs("div",{className:"flex flex-col gap-3",children:[a.jsx(ge,{asChild:!0,variant:"cta",size:"lg",children:a.jsxs(H,{to:"/guides/the-medtech-cybersecurity-standards-decoder",children:[a.jsx(Od,{className:"h-5 w-5"})," Read the guide"]})}),a.jsx(ge,{asChild:!0,variant:"outline",size:"lg",children:a.jsxs("a",{href:"/downloads/guides/the-medtech-cybersecurity-standards-decoder.pdf",target:"_blank",rel:"noreferrer",children:[a.jsx(Xg,{className:"h-5 w-5"})," Download PDF"]})})]})]})})}),a.jsx("section",{className:"border-t border-border bg-background py-24",children:a.jsxs("div",{className:"container-x grid gap-12 lg:grid-cols-[1fr_1.6fr]",children:[a.jsxs("div",{children:[a.jsx("span",{className:"eyebrow",children:"FAQ"}),a.jsxs("h2",{className:"mt-5 font-display text-3xl font-bold leading-tight sm:text-4xl",children:["Medical device cybersecurity, ",a.jsx("span",{className:"text-accent",children:"answered."})]}),a.jsx("p",{className:"mt-4 text-foreground/70",children:"The questions MedTech teams ask us most about FDA cybersecurity expectations, SBOMs, pen testing, and what regulators actually want to see."}),a.jsxs("div",{className:"mt-6 flex flex-wrap gap-3",children:[a.jsx(ge,{asChild:!0,variant:"cta",children:a.jsxs("a",{href:Qs.meetingUrl,target:"_blank",rel:"noreferrer",onClick:()=>hc("home_faq"),children:[a.jsx(Hc,{className:"h-4 w-4"})," Talk to an expert"]})}),a.jsx(ge,{asChild:!0,variant:"outline",children:a.jsx(H,{to:"/readiness",children:"Take readiness quiz"})})]})]}),a.jsx(Zj,{type:"single",collapsible:!0,className:"w-full",children:Ck.map((e,t)=>a.jsxs(xk,{value:`faq-${t}`,children:[a.jsx(Ak,{className:"text-left font-display text-base font-semibold sm:text-lg",children:e.q}),a.jsx(Sk,{className:"text-foreground/75 leading-relaxed",children:e.a})]},t))})]})}),a.jsx(fs,{minH:"min-h-[400px]",children:a.jsx(aM,{})}),a.jsx("section",{className:"container-x py-20",children:a.jsxs("div",{className:"mx-auto grid max-w-5xl gap-10 lg:grid-cols-[0.9fr_1.1fr] lg:items-start",children:[a.jsxs("div",{children:[a.jsx("p",{className:"font-mono text-[11px] uppercase tracking-widest text-accent",children:"Get in touch"}),a.jsx("h2",{className:"mt-3 font-display text-3xl font-bold tracking-tight sm:text-4xl",children:"Tell us about your device."}),a.jsx("p",{className:"mt-4 text-foreground/75 leading-relaxed",children:"A senior MedTech cybersecurity engineer will reply within one business day with a clear next step - no sales rep, no scripted call."}),a.jsxs("ul",{className:"mt-6 space-y-2 text-sm text-foreground/75",children:[a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Wn,{className:"mt-0.5 h-4 w-4 shrink-0 text-accent"})," Senior engineer on the first reply"]}),a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Wn,{className:"mt-0.5 h-4 w-4 shrink-0 text-accent"})," Aligned to FDA's 2026 premarket guidance"]}),a.jsxs("li",{className:"flex items-start gap-2",children:[a.jsx(Wn,{className:"mt-0.5 h-4 w-4 shrink-0 text-accent"})," FDA cybersecurity deficiency commitment"]})]})]}),a.jsxs("div",{className:"rounded-2xl border border-border bg-card p-6 sm:p-8 shadow-[var(--shadow-md)]",children:[a.jsx("h3",{className:"font-display text-xl font-bold",children:"Talk to a medical device cyber expert"}
209),a.jsx("p",{className:"mt-2 text-sm text-foreground/70",children:"Reply within one business day. Prefer to skip the form? Book a strategy session."}),a.jsx("div",{className:"mt-6",children:a.jsx(fs,{minH:"min-h-[500px]",children:a.jsx(tM,{portalId:"7462611",formId:"44520873-dd69-4756-ae28-5df1df179d14"})})})]})]})}),a.jsx(mj,{eyebrow:"Start here",title:"Ready to clear FDA cybersecurity on the first pass?",body:"A free 30-minute Discovery Session with a senior MedTech expert. Walk away with a scoping plan and clear next steps.",ctaLabel:"Book a Discovery Session",secondaryLabel:"See how we work",secondaryHref:"/why"}),a.jsx(QI,{eyebrow:"Related deep dives",heading:"Start with the medical device cybersecurity fundamentals",blurb:"Foundational reading on how medical device cybersecurity differs from IT, where the real threats sit, and how to make it a competitive advantage.",slugs:["traditional-cybersecurity-vs-medical-device-cybersecurity","the-importance-of-cybersecurity-in-the-medical-device-industry","top-10-medical-device-vulnerabilities-revealed-protecting-patient-safety","cybersecurity-as-a-competitive-edge-in-medtech","integrating-cybersecurity-assessments-into-the-medical-device-lifecycle","guide-to-medical-device-cybersecurity-standards-premarket-postmarket-lifecycle"]})]});function mM(e,t,i,r){function s(n){return n instanceof i?n:new i(function(o){o(n)})}return new(i||(i=Promise))(function(n,o){function c(u){try{d(r.next(u))}catch(h){o(h)}}function l(u){try{d(r.throw(u))}catch(h){o(h)}}function d(u){u.done?n(u.value):s(u.value).then(c,l)}d((r=r.apply(e,t||[])).next())})}const pM=e=>e?(...t)=>e(...t):(...t)=>fetch(...t);
209class tp extends Error{constructor(t,i="FunctionsError",r){super(t),this.name=i,this.context=r}toJSON(){return{name:this.name,message:this.message,context:this.context}}}class gM extends tp{constructor(t){super("Failed to send a request to the Edge Function","FunctionsFetchError",t)}}class Ef extends tp{constructor(t){super("Relay Error invoking the Edge Function","FunctionsRelayError",t)}}class Pf extends tp{constructor(t){super("Edge Function returned a non-2xx status code","FunctionsHttpError",t)}}var mh;(function(e){e.Any="any",e.ApNortheast1="ap-northeast-1",e.ApNortheast2="ap-northeast-2",e.ApSouth1="ap-south-1",e.ApSoutheast1="ap-southeast-1",e.ApSoutheast2="ap-southeast-2",e.CaCentral1="ca-central-1",e.EuCentral1="eu-central-1",e.EuWest1="eu-west-1",e.EuWest2="eu-west-2",e.EuWest3="eu-west-3",e.SaEast1="sa-east-1",e.UsEast1="us-east-1",e.UsWest1="us-west-1",e.UsWest2="us-west-2"})(mh||(mh={}));class fM{constructor(t,{headers:i={},customFetch:r,region:s=mh.Any}={}){this.url=t,this.headers=i,this.region=s,this.fetch=pM(r)}setAuth(t){this.headers.Authorization=`Bearer ${t}`}invoke(t){return mM(this,arguments,void 0,function*(i,r={}){var s;let n,o;try{const{headers:c,method:l,body:d,signal:u,timeout:h}=r;let g={},{region:m}=r;m||(m=this.region);const w=new URL(`${this.url}/${i}`);m&&m!=="any"&&(g["x-region"]=m,w.searchParams.set("forceFunctionRegion",m));let v;d&&(c&&!Object.prototype.hasOwnProperty.call(c,"Content-Type")||!c)?typeof Blob<"u"&&d instanceof Blob||d instanceof ArrayBuffer?(g["Content-Type"]="application/octet-stream",v=d):typeof d=="string"?(g["Content-Type"]="text/plain",v=d):typeof FormData<"u"&&d instanceof FormData?v=d:(g["Content-Type"]="application/json",v=JSON.stringify(d)):d&&typeof d!="string"&&!(typeof Blob<"u"&&d instanceof Blob)&&!(d instanceof ArrayBuffer)&&!(typeof FormData<"u"&&d instanceof FormData)?v=JSON.stringify(d):v=d;let k=u;h&&(o=new AbortController,n=setTimeout(()=>o.abort(),h),u?(k=o.signal,u.addEventListener("abort",()=>o.abort())):k=o.signal);const y=yield this.fetch(w.toString(),{method:l||"POST",headers:Object.assign(Object.assign(Object.assign({},g),this.headers),c),body:v,signal:k}).catch(C=>{throw new gM(C)}),f=y.headers.get("x-relay-error");if(f&&f==="true")throw new Ef(y);if(!y.ok)throw new Pf(y);let b=((s=y.headers.get("Content-Type"))!==null&&s!==void 0?s:"text/plain").split(";")[0].trim(),x;return b==="application/json"?x=yield y.json():b==="application/octet-stream"||b==="application/pdf"?x=yield y.blob():b==="text/event-stream"?x=y:b==="multipart/form-data"?x=yield y.formData():x=yield y.text(),{data:x,error:null,response:y}}catch(c){return{data:null,error:c,response:c instanceof Pf||c instanceof Ef?c.context:void 0}}finally{n&&clearTimeout(n)}})}}const Dk=3,_f=e=>Math.min(1e3*2**e,3e4),yM=[520,503],Tk=["GET","HEAD","OPTIONS"];var bM=class extends Error{constructor(e){super(e.message),this.name="PostgrestError",this.details=e.details,this.hint=e.hint,this.co
209de=e.code}toJSON(){return{name:this.name,message:this.message,details:this.details,hint:this.hint,code:this.code}}};function If(e,t){return new Promise(i=>{if(t!=null&&t.aborted){i();return}const r=setTimeout(()=>{t==null||t.removeEventListener("abort",s),i()},e);function s(){clearTimeout(r),i()}t==null||t.addEventListener("abort",s)})}function vM(e,t,i,r){return!(!r||i>=Dk||!Tk.includes(e)||!yM.includes(t))}var wM=class{constructor(e){var t,i,r,s,n;this.shouldThrowOnError=!1,this.retryEnabled=!0,this.method=e.method,this.url=e.url,this.headers=new Headers(e.headers),this.schema=e.schema,this.body=e.body,this.shouldThrowOnError=(t=e.shouldThrowOnError)!==null&&t!==void 0?t:!1,this.signal=e.signal,this.isMaybeSingle=(i=e.isMaybeSingle)!==null&&i!==void 0?i:!1,this.shouldStripNulls=(r=e.shouldStripNulls)!==null&&r!==void 0?r:!1,this.urlLengthLimit=(s=e.urlLengthLimit)!==null&&s!==void 0?s:8e3,this.retryEnabled=(n=e.retry)!==null&&n!==void 0?n:!0,e.fetch?this.fetch=e.fetch:this.fetch=fetch}throwOnError(){return this.shouldThrowOnError=!0,this}stripNulls(){if(this.headers.get("Accept")==="text/csv")throw new Error("stripNulls() cannot be used with csv()");return this.shouldStripNulls=!0,this}setHeader(e,t){return this.headers=new Headers(this.headers),this.headers.set(e,t),this}retry(e){return this.retryEnabled=e,this}then(e,t){var i=this;if(this.schema===void 0||(["GET","HEAD"].includes(this.method)?this.headers.set("Accept-Profile",this.schema):this.headers.set("Content-Profile",this.schema)),this.method!=="GET"&&this.method!=="HEAD"&&this.headers.set("Content-Type","application/json"),this.shouldStripNulls){const o=this.headers.get("Accept");o==="application/vnd.pgrst.object+json"?this.headers.set("Accept","application/vnd.pgrst.object+json;nulls=stripped"):(!o||o==="application/json")&&this.headers.set("Accept","application/vnd.pgrst.array+json;nulls=stripped")}const r=this.fetch;let n=(async()=>{let o=0;for(;;){const d=new Headers(i.headers);o>0&&d.set("X-Retry-Count",String(o));let u;try{u=await r(i.url.toString(),{method:i.method,headers:d,body:JSON.stringify(i.body,(h,g)=>typeof g=="bigint"?g.toString():g),signal:i.signal})}catch(h){if((h==null?void 0:h.name)==="AbortError"||(h==null?void 0:h.code)==="ABORT_ERR"||!Tk.includes(i.method))throw h;if(i.retryEnabled&&o<Dk){const g=_f(o);o++,await If(g,i.signal);continue}throw h}if(vM(i.method,u.status,o,i.retryEnabled)){var c,l;const h=(c=(l=u.headers)===null||l===void 0?void 0:l.get("Retry-After"))!==null&&c!==void 0?c:null,g=h!==null?Math.max(0,parseInt(h,10)||0)*1e3:_f(o);await u.text(),o++,await If(g,i.signal);continue}return await i.processResponse(u)}})();return this.shouldThrowOnError||(n=n.catch(o=>{var c;let l="",d="",u="";const h=o==null?void 0:o.cause;if(h){var g,m,w,v;const f=(g=h==null?void 0:h.message)!==null&&g!==void 0?g:"",b=(m=h==null?void 0:h.code)!==null&&m!==void 0?m:"";l=`${(w=o==null?void 0:o.name)!==null&&w!==void 0?w:"FetchError"}: ${o==null?void 0:o.message}`,l+=` 210 211Caused by: ${(v=h==null?void 0:h.name)!==null&&v!==void 0?v:"Error"}: ${f}`,b&&(l+=` (${b})`),h!=null&&h.stack&&(l+=` 212${h.stack}`)}else{var k;l=(k=o==null?void 0:o.stack)!==null&&k!==void 0?k:""}const y=this.url.toString().length;return(o==null?void 0:o.name)==="AbortError"||(o==null?void 0:o.code)==="ABORT_ERR"?(u="",d="Request was aborted (timeout or manual cancellation)",y>this.urlLengthLimit&&(d+=`. Note: Your request URL is ${y} characters, which may exceed server limits. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [many IDs])), consider using an RPC function to pass values server-side.`)):((h==null?void 0:h.name)==="HeadersOverflowError"||(h==null?void 0:h.code)==="UND_ERR_HEADERS_OVERFLOW")&&(u="",d="HTTP headers exceeded server limits (typically 16KB)",y>this.urlLengthLimit&&(d+=`. Your request URL is ${y} characters. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [200+ IDs])), consider using an RPC function instead.`)),{success:!1,error:{message:`${(c=o==null?void 0:o.name)!==null&&c!==void 0?c:"FetchError"}: ${o==null?void 0:o.message}`,details:l,hint:d,code:u},data:null,count:null,status:0,statusText:""}}
212)),n.then(e,t)}async processResponse(e){var t=this;let i=null,r=null,s=null,n=e.status,o=e.statusText;if(e.ok){var c,l;if(t.method!=="HEAD"){var d;const g=await e.text();g===""||(t.headers.get("Accept")==="text/csv"||t.headers.get("Accept")&&(!((d=t.headers.get("Accept"))===null||d===void 0)&&d.includes("application/vnd.pgrst.plan+text"))?r=g:r=JSON.parse(g))}const u=(c=t.headers.get("Prefer"))===null||c===void 0?void 0:c.match(/count=(exact|planned|estimated)/),h=(l=e.headers.get("content-range"))===null||l===void 0?void 0:l.split("/");u&&h&&h.length>1&&(s=parseInt(h[1])),t.isMaybeSingle&&Array.isArray(r)&&(r.length>1?(i={code:"PGRST116",details:`Results contain ${r.length} rows, application/vnd.pgrst.object+json requires 1 row`,hint:null,message:"JSON object requested, multiple (or no) rows returned"},r=null,s=null,n=406,o="Not Acceptable"):r.length===1?r=r[0]:r=null)}else{const u=await e.text();try{i=JSON.parse(u),Array.isArray(i)&&e.status===404&&(r=[],i=null,n=200,o="OK")}catch{e.status===404&&u===""?(n=204,o="No Content"):i={message:u}}if(i&&t.shouldThrowOnError)throw new bM(i)}return{success:i===null,error:i,data:r,count:s,status:n,statusText:o}}returns(){return this}overrideTypes(){return this}},kM=class extends wM{select(e){let t=!1;const i=(e??"*").split("").map(r=>/\s/.test(r)&&!t?"":(r==='"'&&(t=!t),r)).join("");return this.url.searchParams.set("select",i),this.headers.append("Prefer","return=representation"),this}order(e,{ascending:t=!0,nullsFirst:i,foreignTable:r,referencedTable:s=r}={}){const n=s?`${s}.order`:"order",o=this.url.searchParams.get(n);return this.url.searchParams.set(n,`${o?`${o},`:""}${e}.${t?"asc":"desc"}${i===void 0?"":i?".nullsfirst":".nullslast"}`),this}limit(e,{foreignTable:t,referencedTable:i=t}={}){const r=typeof i>"u"?"limit":`${i}.limit`;return this.url.searchParams.set(r,`${e}`),this}range(e,t,{foreignTable:i,referencedTable:r=i}={}){const s=typeof r>"u"?"offset":`${r}.offset`,n=typeof r>"u"?"limit":`${r}.limit`;return this.url.searchParams.set(s,`${e}`),this.url.searchParams.set(n,`${t-e+1}`),this}abortSignal(e){return this.signal=e,this}single(){return this.headers.set("Accept","application/vnd.pgrst.object+json"),this}maybeSingle(){return this.isMaybeSingle=!0,this}csv(){return this.headers.set("Accept","text/csv"),this}geojson(){return this.headers.set("Accept","application/geo+json"),this}explain({analyze:e=!1,verbose:t=!1,settings:i=!1,buffers:r=!1,wal:s=!1,format:n="text"}={}){var o;const c=[e?"analyze":null,t?"verbose":null,i?"settings":null,r?"buffers":null,s?"wal":null].filter(Boolean).join("|"),l=(o=this.headers.get("Accept"))!==null&&o!==void 0?o:"application/json";return this.headers.set("Accept",`application/vnd.pgrst.plan+${n}; for="${l}"; options=${c};`),n==="json"?this:this}rollback(){return this.headers.append("Prefer","tx=rollback"),this}returns(){return this}maxAffected(e){return this.headers.append("Prefer","handling=strict"),this.headers.append("Prefer",`max-affected=${e}`),this}};const jf=new RegExp("[,()]");var xs=class extends kM{eq(e,t){return this.url.searchParams.append(e,`eq.${t}`),this}neq(e,t){return this.url.searchParams.append(e,`neq.${t}`),this}gt(e,t){return this.url.searchParams.append(e,`gt.${t}`),this}gte(e,t){return this.url.searchParams.append(e,`gte.${t}`),this}lt(e,t){return this.url.searchParams.append(e,`lt.${t}`),this}lte(e,t){return this.url.searchParams.append(e,`lte.${t}`),this}like(e,t){return this.url.searchParams.append(e,`like.${t}`),this}likeAllOf(e,t){return this.url.searchParams.append(e,`like(all).{${t.join(",")}}`),this}likeAnyOf(e,t){return this.url.searchParams.append(e,`like(any).{${t.join(",")}}`),this}ilike(e,t){return this.url.searchParams.append(e,`ilike.${t}`),this}ilikeAllOf(e,t){return this.url.searchParams.append(e,`ilike(all).{${t.join(",")}}`),this}ilikeAnyOf(e,t){return this.url.searchParams.append(e,`ilike(any).{${t.join(",")}}`),this}regexMatch(e,t){return this.url.searchParams.append(e,`match.${t}`),this}regexIMatch(e,t){return this.url.searchParams.append(e,`imatch.${t}`),this}is(e,t){return this.url.searchParams.append(e,`is.${t}`),this}isDistinct(e,t){return this.url.searchParams.append(e,`isdistinct.${t}`),this}in(e,t){const i=Array.from(new Set(t)).map(r=>typeof r=="string"&&jf.test(r)?`"${r}"`:`${r}`).join(",");return this.url.searchParams.append(e,`in.(${i})`),this}notIn(e,t){const i=Array.from(new Set(t)).map(r=>typeof r=="string"&&jf.test(r)?`"${r}"`:`${r}`).join(",");return this.url.searchParams.append(e,`not.in.(${i})`),this}contains(e,t){return typeof t=="string"?this.url.searchParams.append(e,`cs.${t}`):Array.isArray(t)?this.url.searchParams.append(e,`cs.{${t.join(",")}}`):this.url.searchParams.append(e,`cs.${JSON.stringify(t)}`),this}containedBy(e,t){return typeof t=="string"?this.url.searchParams.append(e,`cd.${t}`):Array.isArray(t)?this.url.searchParams.append(e,`cd.{${t.join(",")}}`):this.url.searchParams.append(e,`cd.${JSON.stringify(t)}`),this}rangeGt(e,t){return this.url.searchParams.append(e,`sr.${t}`),this}rangeGte(e,t){return this.url.searchParams.append(e,`nxl.${t}`),this}rangeLt(e,t){return this.url.searchParams.append(e,`sl.${t}`),this}rangeLte(e,t){return this.url.searchParams.append(e,`nxr.${t}`),this}rangeAdjacent(e,t){return this.url.searchParams.append(e,`adj.${t}`),this}overlaps(e,t){return typeof t=="string"?this.url.searchParams.append(e,`ov.${t}`):this.url.searchParams.append(e,`ov.{${t.join(",")}}`),this}textSearch(e,t,{config:i,type:r}={}){let s="";r==="plain"?s="pl":r==="phrase"?s="ph":r==="websearch"&&(s="w");const n=i===void 0?"":`(${i})`;return this.url.searchParams.append(e,`${s}fts${n}.${t}`),this}match(e){return Object.entries(e).filter(([t,i])=>
212i!==void 0).forEach(([t,i])=>{this.url.searchParams.append(t,`eq.${i}`)}),this}not(e,t,i){return this.url.searchParams.append(e,`not.${t}.${i}`),this}or(e,{foreignTable:t,referencedTable:i=t}={}){const r=i?`${i}.or`:"or";return this.url.searchParams.append(r,`(${e})`),this}filter(e,t,i){return this.url.searchParams.append(e,`${t}.${i}`),this}},xM=class{constructor(e,{headers:t={},schema:i,fetch:r,urlLengthLimit:s=8e3,retry:n}){this.url=e,this.headers=new Headers(t),this.schema=i,this.fetch=r,this.urlLengthLimit=s,this.retry=n}cloneRequestState(){return{url:new URL(this.url.toString()),headers:new Headers(this.headers)}}select(e,t){const{head:i=!1,count:r}=t??{},s=i?"HEAD":"GET";let n=!1;const o=(e??"*").split("").map(d=>/\s/.test(d)&&!n?"":(d==='"'&&(n=!n),d)).join(""),{url:c,headers:l}=this.cloneRequestState();return c.searchParams.set("select",o),r&&l.append("Prefer",`count=${r}`),new xs({method:s,url:c,headers:l,schema:this.schema,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}insert(e,{count:t,defaultToNull:i=!0}={}){var r;const s="POST",{url:n,headers:o}=this.cloneRequestState();if(t&&o.append("Prefer",`count=${t}`),i||o.append("Prefer","missing=default"),Array.isArray(e)){const c=e.reduce((l,d)=>l.concat(Object.keys(d)),[]);if(c.length>0){const l=[...new Set(c)].map(d=>`"${d}"`);n.searchParams.set("columns",l.join(","))}}return new xs({method:s,url:n,headers:o,schema:this.schema,body:e,fetch:(r=this.fetch)!==null&&r!==void 0?r:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}upsert(e,{onConflict:t,ignoreDuplicates:i=!1,count:r,defaultToNull:s=!0}={}){var n;const o="POST",{url:c,headers:l}=this.cloneRequestState();if(l.append("Prefer",`resolution=${i?"ignore":"merge"}-duplicates`),t!==void 0&&c.searchParams.set("on_conflict",t),r&&l.append("Prefer",`count=${r}`),s||l.append("Prefer","missing=default"),Array.isArray(e)){const d=e.reduce((u,h)=>u.concat(Object.keys(h)),[]);if(d.length>0){const u=[...new Set(d)].map(h=>`"${h}"`);c.searchParams.set("columns",u.join(","))}}return new xs({method:o,url:c,headers:l,schema:this.schema,body:e,fetch:(n=this.fetch)!==null&&n!==void 0?n:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}update(e,{count:t}={}){var i;const r="PATCH",{url:s,headers:n}=this.cloneRequestState();return t&&n.append("Prefer",`count=${t}`),new xs({method:r,url:s,headers:n,schema:this.schema,body:e,fetch:(i=this.fetch)!==null&&i!==void 0?i:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}delete({count:e}={}){var t;const i="DELETE",{url:r,headers:s}=this.cloneRequestState();return e&&s.append("Prefer",`count=${e}`),new xs({method:i,url:r,headers:s,schema:this.schema,fetch:(t=this.fetch)!==null&&t!==void 0?t:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}};function Na(e){"@babel/helpers - typeof";return Na=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Na(e)}function AM(e,t){if(Na(e)!="object"||!e)return e;var i=e[Symbol.toPrimitive];if(i!==void 0){var r=i.call(e,t||"default");if(Na(r)!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function SM(e){var t=AM(e,"string");return Na(t)=="symbol"?t:t+""}function CM(e,t,i){return(t=SM(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function Mf(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(s){return Object.getOwnPropertyDescriptor(e,s).enumerable})),i.push.apply(i,r)}return i}function No(e){for(var t=1;t<arguments.length;t++){var i=arguments[t]!=null?arguments[t]:{};t%2?Mf(Object(i),!0).forEach(function(r){CM(e,r,i[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):Mf(Object(i)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(i,r))})}return e}var DM=class Ek{constructor(t,{headers:i={},schema:r,fetch:s,timeout:n,urlLengthLimit:o=8e3,retry:c}={}){this.url=t,this.headers=new Headers(i),this.schemaName=r,this.urlLengthLimit=o;const l=s??globalThis.fetch;n!==void 0&&n>0?this.fetch=(d,u)=>{const h=new AbortController,g=setTimeout(()=>h.abort(),n),m=u==null?void 0:u.signal;if(m){if(m.aborted)return clearTimeout(g),l(d,u);const w=()=>{clearTimeout(g),h.abort()};return m.addEventListener("abort",w,{once:!0}),l(d,No(No({},u),{},{signal:h.signal})).finally(()=>{clearTimeout(g),m.removeEventListener("abort",w)})}return l(d,No(No({},u),{},{signal:h.signal})).finally(()=>clearTimeout(g))}:this.fetch=l,this.retry=c}from(t){if(!t||typeof t!="string"||t.trim()==="")throw new Error("Invalid relation name: relation must be a non-empty string.");return new xM(new URL(`${this.url}/${t}`),{headers:new Headers(this.headers),schema:this.schemaName,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}schema(t){return new Ek(this.url,{headers:this.headers,schema:t,fetch:this.fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}rpc(t,i={},{head:r=!1,get:s=!1,count:n}={}){var o;let c;const l=new URL(`${this.url}/rpc/${t}`);let d;const u=m=>m!==null&&typeof m=="object"&&(!Array.isArray(m)||m.some(u)),h=r&&Object.values(i).some(u);h?(c="POST",d=i):r||s?(c=r?"HEAD":"GET",Object.entries(i).filter(([m,w])=>w!==void 0).map(([m,w])=>[m,Array.isArray(w)?`{${w.join(",")}}`:`${w}
212`]).forEach(([m,w])=>{l.searchParams.append(m,w)})):(c="POST",d=i);const g=new Headers(this.headers);return h?g.set("Prefer",n?`count=${n},return=minimal`:"return=minimal"):n&&g.set("Prefer",`count=${n}`),new xs({method:c,url:l,headers:g,schema:this.schemaName,body:d,fetch:(o=this.fetch)!==null&&o!==void 0?o:fetch,urlLengthLimit:this.urlLengthLimit,retry:this.retry})}};class TM{constructor(){}static detectEnvironment(){var t;if(typeof WebSocket<"u")return{type:"native",constructor:WebSocket};if(typeof globalThis<"u"&&typeof globalThis.WebSocket<"u")return{type:"native",constructor:globalThis.WebSocket};if(typeof global<"u"&&typeof global.WebSocket<"u")return{type:"native",constructor:global.WebSocket};if(typeof globalThis<"u"&&typeof globalThis.WebSocketPair<"u"&&typeof globalThis.WebSocket>"u")return{type:"cloudflare",error:"Cloudflare Workers detected. WebSocket clients are not supported in Cloudflare Workers.",workaround:"Use Cloudflare Workers WebSocket API for server-side WebSocket handling, or deploy to a different runtime."};if(typeof globalThis<"u"&&globalThis.EdgeRuntime||typeof navigator<"u"&&(!((t=navigator.userAgent)===null||t===void 0)&&t.includes("Vercel-Edge")))return{type:"unsupported",error:"Edge runtime detected (Vercel Edge/Netlify Edge). WebSockets are not supported in edge functions.",workaround:"Use serverless functions or a different deployment target for WebSocket functionality."};const i=globalThis.process;if(i){const r=i.versions;if(r&&r.node){const s=r.node,n=parseInt(s.replace(/^v/,"").split(".")[0]);return n>=22?typeof globalThis.WebSocket<"u"?{type:"native",constructor:globalThis.WebSocket}:{type:"unsupported",error:`Node.js ${n} detected but native WebSocket not found.`,workaround:"Provide a WebSocket implementation via the transport option."}:{type:"unsupported",error:`Node.js ${n} detected without native WebSocket support.`,workaround:`For Node.js < 22, install "ws" package and provide it via the transport option: 213import ws from "ws" 214new RealtimeClient(url, { transport: ws })`}}}return{type:"unsupported",error:"Unknown JavaScript runtime without WebSocket support.",workaround:"Ensure you're running in a supported environment (browser, Node.js, Deno) or provide a custom WebSocket implementation."}}static getWebSocketConstructor(){const t=this.detectEnvironment();if(t.constructor)return t.constructor;let i=t.error||"WebSocket not supported in this environment.";throw t.workaround&&(i+=` 215 216Suggested solution: ${t.workaround}`),new Error(i)}static isWebSocketSupported(){try{const t=this.detectEnvironment();return t.type==="native"||t.type==="ws"}catch{return!1}}}const EM="2.105.1",PM=`realtime-js/${EM}`,_M="1.0.0",Pk="2.0.0",IM=Pk,jM=1e4,MM=100,rr={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},_k={close:"phx_close",error:"phx_error",join:"phx_join",reply:"phx_reply",leave:"phx_leave",access_token:"access_token"},ph={connecting:"connecting",open:"open",closing:"closing",closed:"closed"};class RM{constructor(t){this.HEADER_LENGTH=1,this.USER_BROADCAST_PUSH_META_LENGTH=6,this.KINDS={userBroadcastPush:3,userBroadcast:4},this.BINARY_ENCODING=0,this.JSON_ENCODING=1,this.BROADCAST_EVENT="broadcast",this.allowedMetadataKeys=[],this.allowedMetadataKeys=t??[]}encode(t,i){if(t.event===this.BROADCAST_EVENT&&!(t.payload instanceof ArrayBuffer)&&typeof t.payload.event=="string")return i(this._binaryEncodeUserBroadcastPush(t));let r=[t.join_ref,t.ref,t.topic,t.event,t.payload];return i(JSON.stringify(r))}_binaryEncodeUserBroadcastPush(t){var i;return this._isArrayBuffer((i=t.payload)===null||i===void 0?void 0:i.payload)?this._encodeBinaryUserBroadcastPush(t):this._encodeJsonUserBroadcastPush(t)}_encodeBinaryUserBroadcastPush(t){var i,r;const s=(r=(i=t.payload)===null||i===void 0?void 0:i.payload)!==null&&r!==void 0?r:new ArrayBuffer(0);return this._encodeUserBroadcastPush(t,this.BINARY_ENCODING,s)}_encodeJsonUserBroadcastPush(t){var i,r;const s=(r=(i=t.payload)===null||i===void 0?void 0:i.payload)!==null&&r!==void 0?r:{},o=new TextEncoder().encode(JSON.stringify(s)).buffer;return this._encodeUserBroadcastPush(t,this.JSON_ENCODING,o)}_encodeUserBroadcastPush(t,i,r){var s,n;const o=t.topic,c=(s=t.ref)!==null&&s!==void 0?s:"",l=(n=t.join_ref)!==null&&n!==void 0?n:"",d=t.payload.event,u=this.allowedMetadataKeys?this._pick(t.payload,this.allowedMetadataKeys):{},h=Object.keys(u).length===0?"":JSON.stringify(u);if(l.length>255)throw new Error(`joinRef length ${l.length} exceeds maximum of 255`);if(c.length>255)throw new Error(`ref length ${c.length} exceeds maximum of 255`);if(o.length>255)throw new Error(`topic length ${o.length} exceeds maximum of 255`);if(d.length>255)throw new Error(`userEvent length ${d.length} exceeds maximum of 255`);if(h.length>255)throw new Error(`metadata length ${h.length} exceeds maximum of 255`);const g=this.USER_BROADCAST_PUSH_META_LENGTH+l.length+c.length+o.length+d.length+h.length,m=new ArrayBuffer(this.HEADER_LENGTH+g);let w=new DataView(m),v=0;w.setUint8(v++,this.KINDS.userBroadcastPush),w.setUint8(v++,l.length),w.setUint8(v++,c.length),w.setUint8(v++,o.length),w.setUint8(v++,d.length),w.setUint8(v++,h.length),w.setUint8(v++,i),Array.from(l,y=>
216w.setUint8(v++,y.charCodeAt(0))),Array.from(c,y=>w.setUint8(v++,y.charCodeAt(0))),Array.from(o,y=>w.setUint8(v++,y.charCodeAt(0))),Array.from(d,y=>w.setUint8(v++,y.charCodeAt(0))),Array.from(h,y=>w.setUint8(v++,y.charCodeAt(0)));var k=new Uint8Array(m.byteLength+r.byteLength);return k.set(new Uint8Array(m),0),k.set(new Uint8Array(r),m.byteLength),k.buffer}decode(t,i){if(this._isArrayBuffer(t)){let r=this._binaryDecode(t);return i(r)}if(typeof t=="string"){const r=JSON.parse(t),[s,n,o,c,l]=r;return i({join_ref:s,ref:n,topic:o,event:c,payload:l})}return i({})}_binaryDecode(t){const i=new DataView(t),r=i.getUint8(0),s=new TextDecoder;switch(r){case this.KINDS.userBroadcast:return this._decodeUserBroadcast(t,i,s)}}_decodeUserBroadcast(t,i,r){const s=i.getUint8(1),n=i.getUint8(2),o=i.getUint8(3),c=i.getUint8(4);let l=this.HEADER_LENGTH+4;const d=r.decode(t.slice(l,l+s));l=l+s;const u=r.decode(t.slice(l,l+n));l=l+n;const h=r.decode(t.slice(l,l+o));l=l+o;const g=t.slice(l,t.byteLength),m=c===this.JSON_ENCODING?JSON.parse(r.decode(g)):g,w={type:this.BROADCAST_EVENT,event:u,payload:m};return o>0&&(w.meta=JSON.parse(h)),{join_ref:null,ref:null,topic:d,event:this.BROADCAST_EVENT,payload:w}}_isArrayBuffer(t){var i;return t instanceof ArrayBuffer||((i=t==null?void 0:t.constructor)===null||i===void 0?void 0:i.name)==="ArrayBuffer"}_pick(t,i){return!t||typeof t!="object"?{}:Object.fromEntries(Object.entries(t).filter(([r])=>i.includes(r)))}}var ue;(function(e){e.abstime="abstime",e.bool="bool",e.date="date",e.daterange="daterange",e.float4="float4",e.float8="float8",e.int2="int2",e.int4="int4",e.int4range="int4range",e.int8="int8",e.int8range="int8range",e.json="json",e.jsonb="jsonb",e.money="money",e.numeric="numeric",e.oid="oid",e.reltime="reltime",e.text="text",e.time="time",e.timestamp="timestamp",e.timestamptz="timestamptz",e.timetz="timetz",e.tsrange="tsrange",e.tstzrange="tstzrange"})(ue||(ue={}));const Rf=(e,t,i={})=>{var r;const s=(r=i.skipTypes)!==null&&r!==void 0?r:[];return t?Object.keys(t).reduce((n,o)=>(n[o]=OM(o,e,t,s),n),{}):{}},OM=(e,t,i,r)=>{const s=t.find(c=>c.name===e),n=s==null?void 0:s.type,o=i[e];return n&&!r.includes(n)?Ik(n,o):gh(o)},Ik=(e,t)=>{if(e.charAt(0)==="_"){const i=e.slice(1,e.length);return BM(t,i)}switch(e){case ue.bool:return FM(t);case ue.float4:case ue.float8:case ue.int2:case ue.int4:case ue.int8:case ue.numeric:case ue.oid:return NM(t);case ue.json:case ue.jsonb:return LM(t);
vendor: 5,178 bytes, line 216
216case ue.timestamp:return UM(t);case ue.abstime:case ue.date:case ue.daterange:case ue.int4range:case ue.int8range:case ue.money:case ue.reltime:case ue.text:case ue.time:case ue.timestamptz:case ue.timetz:case ue.tsrange:case ue.tstzrange:return gh(t);default:return gh(t)}},gh=e=>e,FM=e=>{switch(e){case"t":return!0;case"f":return!1;default:return e}},NM=e=>{if(typeof e=="string"){const t=parseFloat(e);if(!Number.isNaN(t))return t}return e},LM=e=>{if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return e},BM=(e,t)=>{if(typeof e!="string")return e;const i=e.length-1,r=e[i];if(e[0]==="{"&&r==="}"){let n;const o=e.slice(1,i);try{n=JSON.parse("["+o+"]")}catch{n=o?o.split(","):[]}return n.map(c=>Ik(t,c))}return e},UM=e=>typeof e=="string"?e.replace(" ","T"):e,jk=e=>{const t=new URL(e);return t.protocol=t.protocol.replace(/^ws/i,"http"),t.pathname=t.pathname.replace(/\/+$/,"").replace(/\/socket\/websocket$/i,"").replace(/\/socket$/i,"").replace(/\/websocket$/i,""),t.pathname===""||t.pathname==="/"?t.pathname="/api/broadcast":t.pathname=t.pathname+"/api/broadcast",t.href};var da=e=>typeof e=="function"?e:function(){return e},qM=typeof self<"u"?self:null,As=typeof window<"u"?window:null,ui=qM||As||globalThis,zM="2.0.0",WM=1e4,$M=1e3,gi={connecting:0,open:1,closing:2,closed:3},st={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},Ei={close:"phx_close",error:"phx_error",join:"phx_join",reply:"phx_reply",leave:"phx_leave"},fh={longpoll:"longpoll",websocket:"websocket"},HM={complete:4},yh="base64url.bearer.phx.",Lo=class{constructor(e,t,i,r){this.channel=e,this.event=t,this.payload=i||function(){return{}},this.receivedResp=null,this.timeout=r,this.timeoutTimer=null,this.recHooks=[],this.sent=!1,this.ref=void 0}resend(e){this.timeout=e,this.reset(),this.send()}send(){this.hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}receive(e,t){return this.hasReceived(e)&&t(this.receivedResp.response),this.recHooks.push({status:e,callback:t}),this}reset(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}destroy(){this.cancelRefEvent(),this.cancelTimeout()}matchReceive({status:e,response:t,_ref:i}){this.recHooks.filter(r=>r.status===e).forEach(r=>r.callback(t))}cancelRefEvent(){this.refEvent&&this.channel.off(this.refEvent)}cancelTimeout(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}startTimeout(){this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,e=>{this.cancelRefEvent(),this.cancelTimeout(),this.receivedResp=e,this.matchReceive(e)}),this.timeoutTimer=setTimeout(()=>{this.trigger("timeout",{})},this.timeout)}hasReceived(e){return this.receivedResp&&this.receivedResp.status===e}trigger(e,t){this.channel.trigger(this.refEvent,{status:e,response:t})}},Mk=class{constructor(e,t){this.callback=e,this.timerCalc=t,this.timer=void 0,this.tries=0}reset(){this.tries=0,clearTimeout(this.timer)}scheduleTimeout(){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.tries=this.tries+1,this.callback()},this.timerCalc(this.tries+1))}},VM=class{constructor(e,t,i){this.state=st.closed,this.topic=e,this.params=da(t||{}),this.socket=i,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new Lo(this,Ei.join,this.params,this.timeout),this.pushBuffer=[],this.stateChangeRefs=[],this.rejoinTimer=new Mk(()=>{this.socket.isConnected()&&this.rejoin()},this.socket.rejoinAfterMs),this.stateChangeRefs.push(this.socket.onError(()=>this.rejoinTimer.reset())),this.stateChangeRefs.push(this.socket.onOpen(()=>{this.rejoinTimer.reset(),this.isErrored()&&this.rejoin()})),this.joinPush.receive("ok",()=>{this.state=st.joined,this.rejoinTimer.reset(),this.pushBuffer.forEach(r=>r.send()),this.pushBuffer=[]}),this.joinPush.receive("error",r=>{this.state=st.errored,this.socket.hasLogger()&&this.socket.log("channel",`error ${this.topic}`,r),this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.onClose(()=>{this.rejoinTimer.reset(),this.socket.hasLogger()&&this.socket.log("channel",`close ${this.topic}`),this.state=st.closed,this.socket.remove(this)}),this.onError(r=>{this.socket.hasLogger()&&this.socket.log("channel",`error ${this.topic}`,r),this.isJoining()&&this.joinPush.reset(),this.state=st.errored,this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.joinPush.receive("timeout",()=>{this.socket.hasLogger()&&this.socket.log("channel",`timeout ${this.topic}`,this.joinPush.timeout),new Lo(this,Ei.leave,da({}),this.timeout).send(),this.state=st.errored,this.joinPush.reset(),this.socket.isConnected()&&this.rejoinTimer.scheduleTimeout()}),this.on(Ei.reply,(r,s)=>{this.trigger(this.replyEventName(s),r)})}join(e=this.timeout){if(this.joinedOnce)throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");return this.timeout=e,this.joinedOnce=!0,this.rejoin(),this.joinPush}
vendor: 5,263 bytes, line 216
216teardown(){this.pushBuffer.forEach(e=>e.destroy()),this.pushBuffer=[],this.rejoinTimer.reset(),this.joinPush.destroy(),this.state=st.closed,this.bindings=[]}onClose(e){this.on(Ei.close,e)}onError(e){return this.on(Ei.error,t=>e(t))}on(e,t){let i=this.bindingRef++;return this.bindings.push({event:e,ref:i,callback:t}),i}off(e,t){this.bindings=this.bindings.filter(i=>!(i.event===e&&(typeof t>"u"||t===i.ref)))}canPush(){return this.socket.isConnected()&&this.isJoined()}push(e,t,i=this.timeout){if(t=t||{},!this.joinedOnce)throw new Error(`tried to push '${e}' to '${this.topic}' before joining. Use channel.join() before pushing events`);let r=new Lo(this,e,function(){return t},i);return this.canPush()?r.send():(r.startTimeout(),this.pushBuffer.push(r)),r}leave(e=this.timeout){this.rejoinTimer.reset(),this.joinPush.cancelTimeout(),this.state=st.leaving;let t=()=>{this.socket.hasLogger()&&this.socket.log("channel",`leave ${this.topic}`),this.trigger(Ei.close,"leave")},i=new Lo(this,Ei.leave,da({}),e);return i.receive("ok",()=>t()).receive("timeout",()=>t()),i.send(),this.canPush()||i.trigger("ok",{}),i}onMessage(e,t,i){return t}filterBindings(e,t,i){return!0}isMember(e,t,i,r){return this.topic!==e?!1:r&&r!==this.joinRef()?(this.socket.hasLogger()&&this.socket.log("channel","dropping outdated message",{topic:e,event:t,payload:i,joinRef:r}),!1):!0}joinRef(){return this.joinPush.ref}rejoin(e=this.timeout){this.isLeaving()||(this.socket.leaveOpenTopic(this.topic),this.state=st.joining,this.joinPush.resend(e))}trigger(e,t,i,r){let s=this.onMessage(e,t,i,r);if(t&&!s)throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");let n=this.bindings.filter(o=>o.event===e&&this.filterBindings(o,t,i));for(let o=0;o<n.length;o++)n[o].callback(s,i,r||this.joinRef())}replyEventName(e){return`chan_reply_${e}`}isClosed(){return this.state===st.closed}isErrored(){return this.state===st.errored}isJoined(){return this.state===st.joined}isJoining(){return this.state===st.joining}isLeaving(){return this.state===st.leaving}},tl=class{static request(e,t,i,r,s,n,o){if(ui.XDomainRequest){let c=new ui.XDomainRequest;return this.xdomainRequest(c,e,t,r,s,n,o)}else if(ui.XMLHttpRequest){let c=new ui.XMLHttpRequest;return this.xhrRequest(c,e,t,i,r,s,n,o)}else{if(ui.fetch&&ui.AbortController)return this.fetchRequest(e,t,i,r,s,n,o);throw new Error("No suitable XMLHttpRequest implementation found")}}static fetchRequest(e,t,i,r,s,n,o){let c={method:e,headers:i,body:r},l=null;return s&&(l=new AbortController,setTimeout(()=>l.abort(),s),c.signal=l.signal),ui.fetch(t,c).then(d=>d.text()).then(d=>this.parseJSON(d)).then(d=>o&&o(d)).catch(d=>{d.name==="AbortError"&&n?n():o&&o(null)}),l}static xdomainRequest(e,t,i,r,s,n,o){return e.timeout=s,e.open(t,i),e.onload=()=>{let c=this.parseJSON(e.responseText);o&&o(c)},n&&(e.ontimeout=n),e.onprogress=()=>{},e.send(r),e}static xhrRequest(e,t,i,r,s,n,o,c){e.open(t,i,!0),e.timeout=n;for(let[l,d]of Object.entries(r))e.setRequestHeader(l,d);return e.onerror=()=>c&&c(null),e.onreadystatechange=()=>{if(e.readyState===HM.complete&&c){let l=this.parseJSON(e.responseText);c(l)}},o&&(e.ontimeout=o),e.send(s),e}static parseJSON(e){if(!e||e==="")return null;try{return JSON.parse(e)}catch{return console&&console.log("failed to parse JSON response",e),null}}static serialize(e,t){let i=[];for(var r in e){if(!Object.prototype.hasOwnProperty.call(e,r))continue;let s=t?`${t}[${r}]`:r,n=e[r];typeof n=="object"?i.push(this.serialize(n,s)):i.push(encodeURIComponent(s)+"="+encodeURIComponent(n))}return i.join("&")}static appendParams(e,t){if(Object.keys(t).length===0)return e;let i=e.match(/\?/)?"&":"?";return`${e}${i}${this.serialize(t)}`}},GM=e=>{let t="",i=new Uint8Array(e),r=i.byteLength;for(let s=0;s<r;s++)t+=String.fromCharCode(i[s]);return btoa(t)},ys=class{constructor(e,t){t&&t.length===2&&t[1].startsWith(yh)&&(this.authToken=atob(t[1].slice(yh.length))),this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.reqs=new Set,this.awaitingBatchAck=!1,this.currentBatch=null,this.currentBatchTimer=null,this.batchBuffer=[],this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(e),this.readyState=gi.connecting,setTimeout(()=>this.poll(),0)}normalizeEndpoint(e){return e.replace("ws://","http://").replace("wss://","https://").replace(new RegExp("(.*)/"+fh.websocket),"$1/"+fh.longpoll)}endpointURL(){return tl.appendParams(this.pollEndpoint,{token:this.token})}closeAndRetry(e,t,i){this.close(e,t,i),this.readyState=gi.connecting}ontimeout(){this.onerror("timeout"),this.closeAndRetry(1005,"timeout",!1)}isActive(){return this.readyState===gi.open||this.readyState===gi.connecting}poll(){const e={Accept:"application/json"};this.authToken&&(e["X-Phoenix-AuthToken"]=this.authToken),this.ajax("GET",e,null,()=>this.ontimeout(),t=>{if(t){var{status:i,token:r,messages:s}=t;if(i===410&&this.token!==null){this.onerror(410),this.closeAndRetry(3410,"session_gone",!1);return}this.token=r}else i=0;switch(i){case 200:s.forEach(n=>{setTimeout(()=>this.onmessage({data:n}),0)}),this.poll();break;case 204:this.poll();break;case 410:this.readyState=gi.open,this.onopen({}),this.poll();break;
216case 403:this.onerror(403),this.close(1008,"forbidden",!1);break;case 0:case 500:this.onerror(500),this.closeAndRetry(1011,"internal server error",500);break;default:throw new Error(`unhandled poll status ${i}`)}})}send(e){typeof e!="string"&&(e=GM(e)),this.currentBatch?this.currentBatch.push(e):this.awaitingBatchAck?this.batchBuffer.push(e):(this.currentBatch=[e],this.currentBatchTimer=setTimeout(()=>{this.batchSend(this.currentBatch),this.currentBatch=null},0))}batchSend(e){this.awaitingBatchAck=!0,this.ajax("POST",{"Content-Type":"application/x-ndjson"},e.join(` 217`),()=>this.onerror("timeout"),t=>{this.awaitingBatchAck=!1,!t||t.status!==200?(this.onerror(t&&t.status),this.closeAndRetry(1011,"internal server error",!1)):this.batchBuffer.length>0&&(this.batchSend(this.batchBuffer),this.batchBuffer=[])})}close(e,t,i){for(let s of this.reqs)s.abort();this.readyState=gi.closed;let r=Object.assign({code:1e3,reason:void 0,wasClean:!0},{code:e,reason:t,wasClean:i});this.batchBuffer=[],clearTimeout(this.currentBatchTimer),this.currentBatchTimer=null,typeof CloseEvent<"u"?this.onclose(new CloseEvent("close",r)):this.onclose(r)}ajax(e,t,i,r,s){let n,o=()=>{this.reqs.delete(n),r()};n=tl.request(e,this.endpointURL(),t,i,this.timeout,o,c=>{this.reqs.delete(n),this.isActive()&&s(c)}),this.reqs.add(n)}},KM=class Jn{constructor(t,i={}){let r=i.events||{state:"presence_state",diff:"presence_diff"};this.state={},this.pendingDiffs=[],this.channel=t,this.joinRef=null,this.caller={onJoin:function(){},onLeave:function(){},onSync:function(){}},this.channel.on(r.state,s=>{let{onJoin:n,onLeave:o,onSync:c}=this.caller;this.joinRef=this.channel.joinRef(),this.state=Jn.syncState(this.state,s,n,o),this.pendingDiffs.forEach(l=>{this.state=Jn.syncDiff(this.state,l,n,o)}),this.pendingDiffs=[],c()}),this.channel.on(r.diff,s=>{let{onJoin:n,onLeave:o,onSync:c}=this.caller;this.inPendingSyncState()?this.pendingDiffs.push(s):(this.state=Jn.syncDiff(this.state,s,n,o),c())})}onJoin(t){this.caller.onJoin=t}onLeave(t){this.caller.onLeave=t}onSync(t){this.caller.onSync=t}list(t){return Jn.list(this.state,t)}inPendingSyncState(){return!this.joinRef||this.joinRef!==this.channel.joinRef()}static syncState(t,i,r,s){let n=this.clone(t),o={},c={};return this.map(n,(l,d)=>{i[l]||(c[l]=d)}),this.map(i,(l,d)=>{let u=n[l];if(u){let h=d.metas.map(v=>v.phx_ref),g=u.metas.map(v=>v.phx_ref),m=d.metas.filter(v=>g.indexOf(v.phx_ref)<0),w=u.metas.filter(v=>h.indexOf(v.phx_ref)<0);m.length>0&&(o[l]=d,o[l].metas=m),w.length>0&&(c[l]=this.clone(u),c[l].metas=w)}else o[l]=d}),this.syncDiff(n,{joins:o,leaves:c},r,s)}static syncDiff(t,i,r,s){let{joins:n,leaves:o}=this.clone(i);return r||(r=function(){}),s||(s=function(){}),this.map(n,(c,l)=>{let d=t[c];if(t[c]=this.clone(l),d){let u=t[c].metas.map(g=>g.phx_ref),h=d.metas.filter(g=>u.indexOf(g.phx_ref)<0);t[c].metas.unshift(...h)}r(c,d,l)}),this.map(o,(c,l)=>{let d=t[c];if(!d)return;let u=l.metas.map(h=>h.phx_ref);d.metas=d.metas.filter(h=>u.indexOf(h.phx_ref)<0),s(c,d,l),d.metas.length===0&&delete t[c]}),t}static list(t,i){return i||(i=function(r,s){return s}),this.map(t,(r,s)=>i(r,s))}static map(t,i){return Object.getOwnPropertyNames(t).map(r=>i(r,t[r]))}static clone(t){return JSON.parse(JSON.stringify(t))}},Bo={HEADER_LENGTH:1,META_LENGTH:4,KINDS:{push:0,reply:1,broadcast:2},encode(e,t){if(e.payload.constructor===ArrayBuffer)return t(this.binaryEncode(e));{let i=[e.join_ref,e.ref,e.topic,e.event,e.payload];return t(JSON.stringify(i))}},decode(e,t){if(e.constructor===ArrayBuffer)return t(this.binaryDecode(e));{let[i,r,s,n,o]=JSON.parse(e);return t({join_ref:i,ref:r,topic:s,event:n,payload:o})}},binaryEncode(e){let{join_ref:t,ref:i,event:r,topic:s,payload:n}=e,o=this.META_LENGTH+t.length+i.length+s.length+r.length,c=new ArrayBuffer(this.HEADER_LENGTH+o),l=new DataView(c),d=0;l.setUint8(d++,this.KINDS.push),l.setUint8(d++,t.length),l.setUint8(d++,i.length),l.setUint8(d++,s.length),l.setUint8(d++,r.length),Array.from(t,h=>l.setUint8(d++,h.charCodeAt(0))),Array.from(i,h=>l.setUint8(d++,h.charCodeAt(0))),Array.from(s,h=>l.setUint8(d++,h.charCodeAt(0))),Array.from(r,h=>l.setUint8(d++,h.charCodeAt(0)));var u=new Uint8Array(c.byteLength+n.byteLength);return u.set(new Uint8Array(c),0),u.set(new Uint8Array(n),c.byteLength),u.buffer},binaryDecode(e){let t=new DataView(e),i=t.getUint8(0),r=new TextDecoder;switch(i){case this.KINDS.push:return this.decodePush(e,t,r);case this.KINDS.reply:return this.decodeReply(e,t,r);case this.KINDS.broadcast:return this.decodeBroadcast(e,t,r)}},decodePush(e,t,i){let r=t.getUint8(1),s=t.getUint8(2),n=t.getUint8(3),o=this.HEADER_LENGTH+this.META_LENGTH-1,c=i.decode(e.slice(o,o+r));o=o+r;let l=i.decode(e.slice(o,o+s));o=o+s;let d=i.decode(e.slice(o,o+n));o=o+n;let u=e.slice(o,e.byteLength);return{join_ref:c,ref:null,topic:l,event:d,payload:u}},decodeReply(e,t,i){let r=t.getUint8(1),s=t.getUint8(2),n=t.getUint8(3),o=t.getUint8(4),c=this.HEADER_LENGTH+this.META_LENGTH,l=i.decode(e.slice(c,c+r));c=c+r;let d=i.decode(e.slice(c,c+s));c=c+s;let u=i.decode(e.slice(c,c+n));c=c+n;
217let h=i.decode(e.slice(c,c+o));c=c+o;let g=e.slice(c,e.byteLength),m={status:h,response:g};return{join_ref:l,ref:d,topic:u,event:Ei.reply,payload:m}},decodeBroadcast(e,t,i){let r=t.getUint8(1),s=t.getUint8(2),n=this.HEADER_LENGTH+2,o=i.decode(e.slice(n,n+r));n=n+r;let c=i.decode(e.slice(n,n+s));n=n+s;let l=e.slice(n,e.byteLength);return{join_ref:null,ref:null,topic:o,event:c,payload:l}}},QM=class{constructor(e,t={}){this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.fallbackRef=null,this.timeout=t.timeout||WM,this.transport=t.transport||ui.WebSocket||ys,this.conn=void 0,this.primaryPassedHealthCheck=!1,this.longPollFallbackMs=t.longPollFallbackMs,this.fallbackTimer=null,this.sessionStore=t.sessionStorage||ui&&ui.sessionStorage,this.establishedConnections=0,this.defaultEncoder=Bo.encode.bind(Bo),this.defaultDecoder=Bo.decode.bind(Bo),this.closeWasClean=!0,this.disconnecting=!1,this.binaryType=t.binaryType||"arraybuffer",this.connectClock=1,this.pageHidden=!1,this.encode=void 0,this.decode=void 0,this.transport!==ys?(this.encode=t.encode||this.defaultEncoder,this.decode=t.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder);let i=null;As&&As.addEventListener&&(As.addEventListener("pagehide",r=>{this.conn&&(this.disconnect(),i=this.connectClock)}),As.addEventListener("pageshow",r=>{i===this.connectClock&&(i=null,this.connect())}),As.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?this.pageHidden=!0:(this.pageHidden=!1,!this.isConnected()&&!this.closeWasClean&&this.teardown(()=>this.connect()))})),this.heartbeatIntervalMs=t.heartbeatIntervalMs||3e4,this.autoSendHeartbeat=t.autoSendHeartbeat??!0,this.heartbeatCallback=t.heartbeatCallback??(()=>{}),this.rejoinAfterMs=r=>t.rejoinAfterMs?t.rejoinAfterMs(r):[1e3,2e3,5e3][r-1]||1e4,this.reconnectAfterMs=r=>t.reconnectAfterMs?t.reconnectAfterMs(r):[10,50,100,150,200,250,500,1e3,2e3][r-1]||5e3,this.logger=t.logger||null,!this.logger&&t.debug&&(this.logger=(r,s,n)=>{console.log(`${r}: ${s}`,n)}),this.longpollerTimeout=t.longpollerTimeout||2e4,this.params=da(t.params||{}),this.endPoint=`${e}/${fh.websocket}`,this.vsn=t.vsn||zM,this.heartbeatTimeoutTimer=null,this.heartbeatTimer=null,this.heartbeatSentAt=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new Mk(()=>{if(this.pageHidden){this.log("Not reconnecting as page is hidden!"),this.teardown();return}this.teardown(async()=>{t.beforeReconnect&&await t.beforeReconnect(),this.connect()})},this.reconnectAfterMs),this.authToken=t.authToken}getLongPollTransport(){return ys}replaceTransport(e){this.connectClock++,this.closeWasClean=!0,clearTimeout(this.fallbackTimer),this.reconnectTimer.reset(),this.conn&&(this.conn.close(),this.conn=null),this.transport=e}protocol(){return location.protocol.match(/^https/)?"wss":"ws"}endPointURL(){let e=tl.appendParams(tl.appendParams(this.endPoint,this.params()),{vsn:this.vsn});return e.charAt(0)!=="/"?e:e.charAt(1)==="/"?`${this.protocol()}:${e}`:`${this.protocol()}://${location.host}${e}`}disconnect(e,t,i){this.connectClock++,this.disconnecting=!0,this.closeWasClean=!0,clearTimeout(this.fallbackTimer),this.reconnectTimer.reset(),this.teardown(()=>{this.disconnecting=!1,e&&e()},t,i)}connect(e){e&&(console&&console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"),this.params=da(e)),!(this.conn&&!this.disconnecting)&&(this.longPollFallbackMs&&this.transport!==ys?this.connectWithF
vendor: 4,379 bytes, line 217
217allback(ys,this.longPollFallbackMs):this.transportConnect())}log(e,t,i){this.logger&&this.logger(e,t,i)}hasLogger(){return this.logger!==null}onOpen(e){let t=this.makeRef();return this.stateChangeCallbacks.open.push([t,e]),t}onClose(e){let t=this.makeRef();return this.stateChangeCallbacks.close.push([t,e]),t}onError(e){let t=this.makeRef();return this.stateChangeCallbacks.error.push([t,e]),t}onMessage(e){let t=this.makeRef();return this.stateChangeCallbacks.message.push([t,e]),t}onHeartbeat(e){this.heartbeatCallback=e}ping(e){if(!this.isConnected())return!1;let t=this.makeRef(),i=Date.now();this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:t});let r=this.onMessage(s=>{s.ref===t&&(this.off([r]),e(Date.now()-i))});return!0}transportName(e){switch(e){case ys:return"LongPoll";default:return e.name}}transportConnect(){this.connectClock++,this.closeWasClean=!1;let e;this.authToken&&(e=["phoenix",`${yh}${btoa(this.authToken).replace(/=/g,"")}`]),this.conn=new this.transport(this.endPointURL(),e),this.conn.binaryType=this.binaryType,this.conn.timeout=this.longpollerTimeout,this.conn.onopen=()=>this.onConnOpen(),this.conn.onerror=t=>this.onConnError(t),this.conn.onmessage=t=>this.onConnMessage(t),this.conn.onclose=t=>this.onConnClose(t)}getSession(e){return this.sessionStore&&this.sessionStore.getItem(e)}storeSession(e,t){this.sessionStore&&this.sessionStore.setItem(e,t)}connectWithFallback(e,t=2500){clearTimeout(this.fallbackTimer);let i=!1,r=!0,s,n,o=this.transportName(e),c=l=>{this.log("transport",`falling back to ${o}...`,l),this.off([s,n]),r=!1,this.replaceTransport(e),this.transportConnect()};if(this.getSession(`phx:fallback:${o}`))return c("memorized");this.fallbackTimer=setTimeout(c,t),n=this.onError(l=>{this.log("transport","error",l),r&&!i&&(clearTimeout(this.fallbackTimer),c(l))}),this.fallbackRef&&this.off([this.fallbackRef]),this.fallbackRef=this.onOpen(()=>{if(i=!0,!r){let l=this.transportName(e);return this.primaryPassedHealthCheck||this.storeSession(`phx:fallback:${l}`,"true"),this.log("transport",`established ${l} fallback`)}clearTimeout(this.fallbackTimer),this.fallbackTimer=setTimeout(c,t),this.ping(l=>{this.log("transport","connected to primary after",l),this.primaryPassedHealthCheck=!0,clearTimeout(this.fallbackTimer)})}),this.transportConnect()}clearHeartbeats(){clearTimeout(this.heartbeatTimer),clearTimeout(this.heartbeatTimeoutTimer)}onConnOpen(){this.hasLogger()&&this.log("transport",`connected to ${this.endPointURL()}`),this.closeWasClean=!1,this.disconnecting=!1,this.establishedConnections++,this.flushSendBuffer(),this.reconnectTimer.reset(),this.autoSendHeartbeat&&this.resetHeartbeat(),this.triggerStateCallbacks("open")}heartbeatTimeout(){if(this.pendingHeartbeatRef){this.pendingHeartbeatRef=null,this.heartbeatSentAt=null,this.hasLogger()&&this.log("transport","heartbeat timeout. Attempting to re-establish connection");try{this.heartbeatCallback("timeout")}catch(e){this.log("error","error in heartbeat callback",e)}this.triggerChanError(new Error("heartbeat timeout")),this.closeWasClean=!1,this.teardown(()=>this.reconnectTimer.scheduleTimeout(),$M,"heartbeat timeout")}}resetHeartbeat(){this.conn&&this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,this.clearHeartbeats(),this.heartbeatTimer=setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs))}teardown(e,t,i){if(!this.conn)return e&&e();const r=this.conn;this.waitForBufferDone(r,()=>{t?r.close(t,i||""):r.close(),this.waitForSocketClosed(r,()=>{this.conn===r&&(this.conn.onopen=function(){},this.conn.onerror=function(){},this.conn.onmessage=function(){},this.conn.onclose=function(){},this.conn=null),e&&e()})})}waitForBufferDone(e,t,i=1){if(i===5||!e.bufferedAmount){t();return}setTimeout(()=>{this.waitForBufferDone(e,t,i+1)},150*i)}waitForSocketClosed(e,t,i=1){if(i===5||e.readyState===gi.closed){t();return}setTimeout(()=>{this.waitForSocketClosed(e,t,i+1)},150*i)}onConnClose(e){this.conn&&(this.conn.onclose=()=>{}),this.hasLogger()&&this.log("transport","close",e),this.triggerChanError(e),this.clearHeartbeats(),this.closeWasClean||this.reconnectTimer.scheduleTimeout(),this.triggerStateCallbacks("close",e)}onConnError(e){this.hasLogger()&&this.log("transport","error",e);let t=this.transport,i=this.establishedConnections;this.triggerStateCallbacks("error",e,t,i),(t===this.transport||i>0)&&this.triggerChanError(e)}
217triggerChanError(e){this.channels.forEach(t=>{t.isErrored()||t.isLeaving()||t.isClosed()||t.trigger(Ei.error,e)})}connectionState(){switch(this.conn&&this.conn.readyState){case gi.connecting:return"connecting";case gi.open:return"open";case gi.closing:return"closing";default:return"closed"}}isConnected(){return this.connectionState()==="open"}remove(e){this.off(e.stateChangeRefs),this.channels=this.channels.filter(t=>t!==e)}off(e){for(let t in this.stateChangeCallbacks)this.stateChangeCallbacks[t]=this.stateChangeCallbacks[t].filter(([i])=>e.indexOf(i)===-1)}channel(e,t={}){let i=new VM(e,t,this);return this.channels.push(i),i}push(e){if(this.hasLogger()){let{topic:t,event:i,payload:r,ref:s,join_ref:n}=e;this.log("push",`${t} ${i} (${n}, ${s})`,r)}this.isConnected()?this.encode(e,t=>this.conn.send(t)):this.sendBuffer.push(()=>this.encode(e,t=>this.conn.send(t)))}makeRef(){let e=this.ref+1;return e===this.ref?this.ref=0:this.ref=e,this.ref.toString()}sendHeartbeat(){if(!this.isConnected()){try{this.heartbeatCallback("disconnected")}catch(e){this.log("error","error in heartbeat callback",e)}return}if(this.pendingHeartbeatRef){this.heartbeatTimeout();return}this.pendingHeartbeatRef=this.makeRef(),this.heartbeatSentAt=Date.now(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef});try{this.heartbeatCallback("sent")}catch(e){this.log("error","error in heartbeat callback",e)}this.heartbeatTimeoutTimer=setTimeout(()=>this.heartbeatTimeout(),this.heartbeatIntervalMs)}flushSendBuffer(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(e=>e()),this.sendBuffer=[])}onConnMessage(e){this.decode(e.data,t=>{let{topic:i,event:r,payload:s,ref:n,join_ref:o}=t;if(n&&n===this.pendingHeartbeatRef){const c=this.heartbeatSentAt?Date.now()-this.heartbeatSentAt:void 0;this.clearHeartbeats();try{this.heartbeatCallback(s.status==="ok"?"ok":"error",c)}catch(l){this.log("error","error in heartbeat callback",l)}this.pendingHeartbeatRef=null,this.heartbeatSentAt=null,this.autoSendHeartbeat&&(this.heartbeatTimer=setTimeout(()=>this.sendHeartbeat(),this.heartbeatIntervalMs))}this.hasLogger()&&this.log("receive",`${s.status||""} ${i} ${r} ${n&&"("+n+")"||""}`.trim(),s);for(let c=0;c<this.channels.length;c++){const l=this.channels[c];l.isMember(i,r,s,o)&&l.trigger(r,s,n,o)}this.triggerStateCallbacks("message",t)})}triggerStateCallbacks(e,...t){try{this.stateChangeCallbacks[e].forEach(([i,r])=>{try{r(...t)}catch(s){this.log("error",`error in ${e} callback`,s)}})}catch(i){this.log("error",`error triggering ${e} callbacks`,i)}}leaveOpenTopic(e){let t=this.channels.find(i=>i.topic===e&&(i.isJoined()||i.isJoining()));t&&(this.hasLogger()&&this.log("transport",`leaving duplicate topic "${e}"`),t.leave())}};class ua{constructor(t,i){const r=JM(i);this.presence=new KM(t.getChannel(),r),this.presence.onJoin((s,n,o)=>{const c=ua.onJoinPayload(s,n,o);t.getChannel().trigger("presence",c)}),this.presence.onLeave((s,n,o)=>{const c=ua.onLeavePayload(s,n,o);t.getChannel().trigger("presence",c)}),this.presence.onSync(()=>{t.getChannel().trigger("presence",{event:"sync"})})}get state(){return ua.transformState(this.presence.state)}static transformState(t){return t=XM(t),Object.getOwnPropertyNames(t).reduce((i,r)=>{const s=t[r];return i[r]=mc(s),i},{})}static onJoinPayload(t,i,r){const s=Of(i),n=mc(r);return{event:"join",key:t,currentPresences:s,newPresences:n}}static onLeavePayload(t,i,r){const s=Of(i),n=mc(r);return{event:"leave",key:t,currentPresences:s,leftPresences:n}}}function mc(e){return e.metas.map(t=>(t.presence_ref=t.phx_ref,delete t.phx_ref,delete t.phx_ref_prev,t))}function XM(e){return JSON.parse(JSON.stringify(e))}function JM(e){return(e==null?void 0:e.events)&&{events:e.events}}function Of(e){return e!=null&&e.metas?mc(e):[]}var Ff;(function(e){e.SYNC="sync",e.JOIN="join",e.LEAVE="leave"})(Ff||(Ff={}));class YM{get state(){return this.presenceAdapter.state}constructor(t,i){this.channel=t,this.presenceAdapter=new ua(this.channel.channelAdapter,i)}}function ZM(e){if(e instanceof Error)return e;if(typeof e=="string")return new Error(e);
217if(e&&typeof e=="object"){const t=e;if(typeof t.code=="number"){const i=typeof t.reason=="string"&&t.reason?` (${t.reason})`:"";return new Error(`socket closed: ${t.code}${i}`,{cause:e})}return new Error("channel error: transport failure",{cause:e})}return new Error("channel error: connection lost")}class eR{constructor(t,i,r){const s=tR(r);this.channel=t.getSocket().channel(i,s),this.socket=t}get state(){return this.channel.state}set state(t){this.channel.state=t}get joinedOnce(){return this.channel.joinedOnce}get joinPush(){return this.channel.joinPush}get rejoinTimer(){return this.channel.rejoinTimer}on(t,i){return this.channel.on(t,i)}off(t,i){this.channel.off(t,i)}subscribe(t){return this.channel.join(t)}unsubscribe(t){return this.channel.leave(t)}teardown(){this.channel.teardown()}onClose(t){this.channel.onClose(t)}onError(t){return this.channel.onError(t)}push(t,i,r){let s;try{s=this.channel.push(t,i,r)}catch{throw new Error(`tried to push '${t}' to '${this.channel.topic}' before joining. Use channel.subscribe() before pushing events`)}if(this.channel.pushBuffer.length>MM){const n=this.channel.pushBuffer.shift();n.cancelTimeout(),this.socket.log("channel",`discarded push due to buffer overflow: ${n.event}`,n.payload())}return s}updateJoinPayload(t){const i=this.channel.joinPush.payload();this.channel.joinPush.payload=()=>Object.assign(Object.assign({},i),t)}canPush(){return this.socket.isConnected()&&this.state===rr.joined}isJoined(){return this.state===rr.joined}isJoining(){return this.state===rr.joining}isClosed(){return this.state===rr.closed}isLeaving(){return this.state===rr.leaving}updateFilterBindings(t){this.channel.filterBindings=t}updatePayloadTransform(t){this.channel.onMessage=t}getChannel(){return this.channel}}function tR(e){return{config:Object.assign({broadcast:{ack:!1,self:!1},presence:{key:"",enabled:!1},private:!1},e.config)}}var Nf;(function(e){e.ALL="*",e.INSERT="INSERT",e.UPDATE="UPDATE",e.DELETE="DELETE"})(Nf||(Nf={}));var Ls;(function(e){e.BROADCAST="broadcast",e.PRESENCE="presence",e.POSTGRES_CHANGES="postgres_changes",e.SYSTEM="system"})(Ls||(Ls={}));var Pi;(function(e){e.SUBSCRIBED="SUBSCRIBED",e.TIMED_OUT="TIMED_OUT",e.CLOSED="CLOSED",e.CHANNEL_ERROR="CHANNEL_ERROR"})(Pi||(Pi={}));class ha{get state(){return this.channelAdapter.state}set state(t){this.channelAdapter.state=t}get joinedOnce(){return this.channelAdapter.joinedOnce}get timeout(){return this.socket.timeout}get joinPush(){return this.channelAdapter.joinPush}get rejoinTimer(){return this.channelAdapter.rejoinTimer}constructor(t,i={config:{}},r){var s,n;if(this.topic=t,this.params=i,this.socket=r,this.bindings={},this.subTopic=t.replace(/^realtime:/i,""),this.params.config=Object.assign({broadcast:{ack:!1,self:!1},presence:{key:"",enabled:!1},private:!1},i.config),this.channelAdapter=new eR(this.socket.socketAdapter,t,this.params),this.presence=new YM(this),this._onClose(()=>{this.socket._remove(this)}),this._updateFilterTransform(),this.broadcastEndpointURL=jk(this.socket.socketAdapter.endPointURL()),this.private=this.params.config.private||!1,!this.private&&(!((n=(s=this.params.config)===null||s===void 0?void 0:s.broadcast)===null||n===void 0)&&n.replay))throw new Error(`tried to use replay on public channel '${this.topic}'. It must be a private channel.`)}subscribe(t,i=this.timeout){var r,s,n;if(this.socket.isConnected()||this.socket.connect(),this.channelAdapter.isClosed()){const{config:{broadcast:o,presence:c,private:l}}=this.params,d=(s=(r=this.bindings.postgres_changes)===null||r===void 0?void 0:r.map(m=>m.filter))!==null&&s!==void 0?s:[],u=!!this.bindings[Ls.PRESENCE]&&this.bindings[Ls.PRESENCE].length>0||((n=this.params.config.presence)===null||n===void 0?void 0:n.enabled)===!0,h={},g={broadcast:o,presence:Object.assign(Object.assign({},c),{enabled:u}),postgres_changes:d,private:l};this.socket.accessTokenValue&&(h.access_token=this.socket.accessTokenValue),this._onError(m=>{t==null||t(Pi.CHANNEL_ERROR,ZM(m))}),this._onClose(()=>t==null?void 0:t(Pi.CLOSED)),this.updateJoinPayload(Object.assign({config:g},h)),this._updateFilterMessage(),this.channelAdapter.subscribe(i).receive("ok",async({postgres_changes:m})=>
217{if(this.socket._isManualToken()||this.socket.setAuth(),m===void 0){t==null||t(Pi.SUBSCRIBED);return}this._updatePostgresBindings(m,t)}).receive("error",m=>{this.state=rr.errored;const w=Object.values(m).join(", ")||"error";t==null||t(Pi.CHANNEL_ERROR,new Error(w,{cause:m}))}).receive("timeout",()=>{t==null||t(Pi.TIMED_OUT)})}return this}_updatePostgresBindings(t,i){var r;const s=this.bindings.postgres_changes,n=(r=s==null?void 0:s.length)!==null&&r!==void 0?r:0,o=[];for(let c=0;c<n;c++){const l=s[c],{filter:{event:d,schema:u,table:h,filter:g}}=l,m=t&&t[c];if(m&&m.event===d&&ha.isFilterValueEqual(m.schema,u)&&ha.isFilterValueEqual(m.table,h)&&ha.isFilterValueEqual(m.filter,g))o.push(Object.assign(Object.assign({},l),{id:m.id}));else{this.unsubscribe(),this.state=rr.errored,i==null||i(Pi.CHANNEL_ERROR,new Error("mismatch between server and client bindings for postgres changes"));return}}this.bindings.postgres_changes=o,this.state!=rr.errored&&i&&i(Pi.SUBSCRIBED)}presenceState(){return this.presence.state}async track(t,i={}){return await this.send({type:"presence",event:"track",payload:t},i.timeout||this.timeout)}async untrack(t={}){return await this.send({type:"presence",event:"untrack"},t)}on(t,i,r){const s=this.channelAdapter.isJoined()||this.channelAdapter.isJoining(),n=t===Ls.PRESENCE||t===Ls.POSTGRES_CHANGES;if(s&&n)throw this.socket.log("channel",`cannot add \`${t}\` callbacks for ${this.topic} after \`subscribe()\`.`),new Error(`cannot add \`${t}\` callbacks for ${this.topic} after \`subscribe()\`.`);return this._on(t,i,r)}async httpSend(t,i,r={}){var s;if(i==null)return Promise.reject(new Error("Payload is required for httpSend()"));const n={apikey:this.socket.apiKey?this.socket.apiKey:"","Content-Type":"application/json"};this.socket.accessTokenValue&&(n.Authorization=`Bearer ${this.socket.accessTokenValue}`);const o={method:"POST",headers:n,body:JSON.stringify({messages:[{topic:this.subTopic,event:t,payload:i,private:this.private}]})},c=await this._fetchWithTimeout(this.broadcastEndpointURL,o,(s=r.timeout)!==null&&s!==void 0?s:this.timeout);if(c.status===202)return{success:!0};let l=c.statusText;try{const d=await c.json();l=d.error||d.message||l}catch{}return Promise.reject(new Error(l))}async send(t,i={}){var r,s;if(!this.channelAdapter.canPush()&&t.type==="broadcast"){console.warn("Realtime send() is automatically falling back to REST API. This behavior will be deprecated
217in the future. Please use httpSend() explicitly for REST delivery.");const{event:n,payload:o}=t,c={apikey:this.socket.apiKey?this.socket.apiKey:"","Content-Type":"application/json"};this.socket.accessTokenValue&&(c.Authorization=`Bearer ${this.socket.accessTokenValue}`);const l={method:"POST",headers:c,body:JSON.stringify({messages:[{topic:this.subTopic,event:n,payload:o,private:this.private}]})};try{const d=await this._fetchWithTimeout(this.broadcastEndpointURL,l,(r=i.timeout)!==null&&r!==void 0?r:this.timeout);return await((s=d.body)===null||s===void 0?void 0:s.cancel()),d.ok?"ok":"error"}catch(d){return d.name==="AbortError"?"timed out":"error"}}else return new Promise(n=>{var o,c,l;const d=this.channelAdapter.push(t.type,t,i.timeout||this.timeout);t.type==="broadcast"&&!(!((l=(c=(o=this.params)===null||o===void 0?void 0:o.config)===null||c===void 0?void 0:c.broadcast)===null||l===void 0)&&l.ack)&&n("ok"),d.receive("ok",()=>n("ok")),d.receive("error",()=>n("error")),d.receive("timeout",()=>n("timed out"))})}updateJoinPayload(t){this.channelAdapter.updateJoinPayload(t)}async unsubscribe(t=this.timeout){return new Promise(i=>{this.channelAdapter.unsubscribe(t).receive("ok",()=>i("ok")).receive("timeout",()=>i("timed out")).receive("error",()=>i("error"))})}teardown(){this.channelAdapter.teardown()}async _fetchWithTimeout(t,i,r){const s=new AbortController,n=setTimeout(()=>s.abort(),r),o=await this.socket.fetch(t,Object.assign(Object.assign({},i),{signal:s.signal}));return clearTimeout(n),o}_on(t,i,r){const s=t.toLocaleLowerCase(),n=this.channelAdapter.on(t,r),o={type:s,filter:i,callback:r,ref:n};return this.bindings[s]?this.bindings[s].push(o):this.bindings[s]=[o],this._updateFilterMessage(),this}_onClose(t){this.channelAdapter.onClose(t)}_onError(t){this.channelAdapter.onError(t)}_updateFilterMessage(){this.channelAdapter.updateFilterBindings((t,i,r)=>{var s,n,o,c,l,d,u;const h=t.event.toLocaleLowerCase();if(this._notThisChannelEvent(h,r))return!1;const g=(s=this.bindings[h])===null||s===void 0?void 0:s.find(m=>m.ref===t.ref);if(!g)return!0;if(["broadcast","presence","postgres_changes"].includes(h))if("id"in g){const m=g.id,w=(n=g.filter)===null||n===void 0?void 0:n.event;return m&&((o=i.ids)===null||o===void 0?void 0:o.includes(m))&&(w==="*"||(w==null?void 0:w.toLocaleLowerCase())===((c=i.data)===null||c===void 0?void 0:c.type.toLocaleLowerCase()))}else{const m=(d=(l=g==null?void 0:g.filter)===null||l===void 0?void 0:l.event)===null||d===void 0?void 0:d.toLocaleLowerCase();return m==="*"||m===((u=i==null?void 0:i.event)===null||u===void 0?void 0:u.toLocaleLowerCase())}else return g.type.toLocaleLowerCase()===h})}_notThisChannelEvent(t,i){const{close:r,error:s,leave:n,join:o}=_k;return i&&[r,s,n,o].includes(t)&&i!==this.joinPush.ref}_updateFilterTransform(){this.channelAdapter.updatePayloadTransform((t,i,r)=>{if(typeof i=="object"&&"ids"in i){const s=i.data,{schema:n,table:o,commit_timestamp:c,type:l,errors:d}=s;return Object.assign(Object.assign({},{schema:n,table:o,commit_timestamp:c,eventType:l,new:{},old:{},errors:d}),this._getPayloadRecords(s))}return i})}copyBindings(t){if(this.joinedOnce)throw new Error("cannot copy bindings into joined channel");for(const i in t.bindings)for(const r of t.bindings[i])this._on(r.type,r.filter,r.callback)}static isFilterValueEqual(t,i){return(t??void 0)===(i??void 0)}_getPayloadRecords(t){const i={new:{},old:{}};return(t.type==="INSERT"||t.type==="UPDATE")&&(i.new=Rf(t.columns,t.record)),(t.type==="UPDATE"||t.type==="DELETE")&&(i.old=Rf(t.columns,t.old_record)),i}}class iR{constructor(t,i){this.socket=new QM(t,i)}get timeout(){return this.socket.timeout}get endPoint(){return this.socket.endPoint}get transport(){return this.socket.transport}get heartbeatIntervalMs(){return this.socket.heartbeatIntervalMs}get heartbeatCallback(){return this.socket.heartbeatCallback}set heartbeatCallback(t){this.socket.heartbeatCallback=t}get heartbeatTimer(){return this.socket.heartbeatTimer}get pendingHeartbeatRef(){return this.socket.pendingHeartbeatRef}get reconnectTimer(){return this.socket.reconnectTimer}get vsn(){return this.socket.vsn}get encode(){return this.socket.encode}get decode(){return this.socket.decode}get reconnectAfterMs(){return this.socket.reconnectAfterMs}get sendBuffer(){return this.socket.sendBuffer}get stateChangeCallbacks(){return this.socket.stateChangeCallbacks}connect(){this.socket.connect()}disconnect(t,i,r,s=1e4){return new Promise(n=>{setTimeout(()=>n("timeout"),s),this.socket.disconnect(()=>{t(),n("ok")},i,r)})}push(t){this.socket.push(t)}log(t,i,r){this.socket.log(t,i,r)}makeRef(){return this.socket.makeRef()}onOpen(t){this.socket.onOpen(t)}onClose(t){this.socket.onClose(t)}onError(t){this.socket.onError(t)}onMessage(t){this.socket.onMessage(t)}isConnected(){return this.socket.isConnected()}isConnecting(){return this.socket.connectionState()==ph.connecting}isDisconnecting(){return this.socket.connectionState()==ph.closing}connectionState(){return this.socket.connectionState()}endPointURL(){return this.socket.endPointURL()}sendHeartbeat(){this.socket.sendHeartbeat()}getSocket(){return this.socket}}const Lf={HEARTBEAT_INTERVAL:25e3,RECONNECT_DELAY:10,HEARTBEAT_TIMEOUT_FALLBACK:100},rR=[1e3,2e3,5e3,1e4],sR=1e4,nR=` 218 addEventListener("message", (e) => { 219 if (e.data.event === "start") { 220 setInterval(() => postMessage({ event: "keepAlive" }), e.data.interval); 221 } 222 });`;class aR{get endPoint(){return this.socketAdapter.endPoint}get timeout(){return this.socketAdapter.timeout}get transport(){return this.socketAdapter.transport}get heartbeatCallback(){return this.socketAdapter.heartbeatCallback}get heartbeatIntervalMs(){return this.socketAdapter.heartbeatIntervalMs}get heartbeatTimer(){return this.worker?this._workerHeartbeatTimer:this.socketAdapter.heartbeatTimer}get pendingHeartbeatRef(){return this.worker?this._pendingWorkerHeartbeatRef:this.socketAdapter.pendingHeartbeatRef}get reconnectTimer(){return this.socketAdapter.reconnectTimer}get vsn(){return this.socketAdapter.vsn}get encode(){return this.socketAdapter.encode}get decode(){return this.socketAdapter.decode}get reconnectAfterMs(){return this.socketAdapter.reconnectAfterMs}get sendBuffer(){return this.socketAdapter.sendBuffer}get stateChangeCallbacks(){return this.socketAdapter.stateChangeCallbacks}constructor(t,i){var r;if(this.channels=new Array,this.accessTokenValue=null,this.accessToken=null,this.apiKey=null,this.httpEndpoint="",this.headers={},this.params={}
222,this.ref=0,this.serializer=new RM,this._manuallySetToken=!1,this._authPromise=null,this._workerHeartbeatTimer=void 0,this._pendingWorkerHeartbeatRef=null,this._pendingDisconnectTimer=null,this._disconnectOnEmptyChannelsAfterMs=0,this._resolveFetch=n=>n?(...o)=>n(...o):(...o)=>fetch(...o),!(!((r=i==null?void 0:i.params)===null||r===void 0)&&r.apikey))throw new Error("API key is required to connect to Realtime");this.apiKey=i.params.apikey;const s=this._initializeOptions(i);this.socketAdapter=new iR(t,s),this.httpEndpoint=jk(t),this.fetch=this._resolveFetch(i==null?void 0:i.fetch)}connect(){if(!(this.isConnecting()||this.isDisconnecting()||this.isConnected())){this.accessToken&&!this._authPromise&&this._setAuthSafely("connect"),this._setupConnectionHandlers();try{this.socketAdapter.connect()}catch(t){const i=t.message;throw i.includes("Node.js")?new Error(`${i} 223 224To use Realtime in Node.js, you need to provide a WebSocket implementation: 225 226Option 1: Use Node.js 22+ which has native WebSocket support 227Option 2: Install and provide the "ws" package: 228 229 npm install ws 230 231 import ws from "ws" 232 const client = new RealtimeClient(url, { 233 ...options, 234 transport: ws 235 })`):new Error(`WebSocket not available: ${i}`)}this._handleNodeJsRaceCondition()}}endpointURL(){return this.socketAdapter.endPointURL()}async disconnect(t,i){return this._cancelPendingDisconnect(),this.isDisconnecting()?"ok":await this.socketAdapter.disconnect(()=>{clearInterval(this._workerHeartbeatTimer),this._terminateWorker()},t,i)}getChannels(){return this.channels}async removeChannel(t){const i=await t.unsubscribe();return i==="ok"&&t.teardown(),i}async removeAllChannels(){const t=this.channels.map(async r=>{const s=await r.unsubscribe();return r.teardown(),s}),i=await Promise.all(t);return await this.disconnect(),i}log(t,i,r){this.socketAdapter.log(t,i,r)}connectionState(){return this.socketAdapter.connectionState()||ph.closed}isConnected(){return this.socketAdapter.isConnected()}isConnecting(){return this.socketAdapter.isConnecting()}isDisconnecting(){return this.socketAdapter.isDisconnecting()}channel(t,i={config:{}}){const r=`realtime:${t}`,s=this.getChannels().find(n=>n.topic===r);if(s)return s;{const n=new ha(`realtime:${t}`,i,this);return this._cancelPendingDisconnect(),this.channels.push(n),n}}push(t){this.socketAdapter.push(t)}async setAuth(t=null){this._authPromise=this._performAuth(t);try{await this._authPromise}finally{this._authPromise=null}}_isManualToken(){return this._manuallySetToken}async sendHeartbeat(){this.socketAdapter.sendHeartbeat()}onHeartbeat(t){this.socketAdapter.heartbeatCallback=this._wrapHeartbeatCallback(t)}_makeRef(){return this.socketAdapter.makeRef()}_remove(t){this.channels=this.channels.filter(i=>i.topic!==t.topic),this.channels.length===0&&(this.log("transport","no channels remaining, scheduling disconnect"),this._schedulePendingDisconnect())}_schedulePendingDisconnect(){if(this._cancelPendingDisconnect(),this._disconnectOnEmptyChannelsAfterMs===0){this.log("transport","disconnecting immediately - no channels"),this.disconnect();return}
235this._pendingDisconnectTimer=setTimeout(()=>{this._pendingDisconnectTimer=null,this.channels.length===0&&(this.log("transport","deferred disconnect fired - no channels, disconnecting"),this.disconnect())},this._disconnectOnEmptyChannelsAfterMs),this.log("transport",`deferred disconnect scheduled in ${this._disconnectOnEmptyChannelsAfterMs}ms`)}_cancelPendingDisconnect(){this._pendingDisconnectTimer!==null&&(this.log("transport","pending disconnect cancelled - channel activity detected"),clearTimeout(this._pendingDisconnectTimer),this._pendingDisconnectTimer=null)}async _performAuth(t=null){let i,r=!1;if(t)i=t,r=!0;else if(this.accessToken)try{i=await this.accessToken()}catch(s){this.log("error","Error fetching access token from callback",s),i=this.accessTokenValue}else i=this.accessTokenValue;r?this._manuallySetToken=!0:this.accessToken&&(this._manuallySetToken=!1),this.accessTokenValue!=i&&(this.accessTokenValue=i,this.channels.forEach(s=>{const n={access_token:i,version:PM};i&&s.updateJoinPayload(n),s.joinedOnce&&s.channelAdapter.isJoined()&&s.channelAdapter.push(_k.access_token,{access_token:i})}))}async _waitForAuthIfNeeded(){this._authPromise&&await this._authPromise}_setAuthSafely(t="general"){this._isManualToken()||this.setAuth().catch(i=>{this.log("error",`Error setting auth in ${t}`,i)})}_setupConnectionHandlers(){this.socketAdapter.onOpen(()=>{(this._authPromise||(this.accessToken&&!this.accessTokenValue?this.setAuth():Promise.resolve())).catch(i=>{this.log("error","error waiting for auth on connect",i)}),this.worker&&!this.workerRef&&this._startWorkerHeartbeat()}),this.socketAdapter.onClose(()=>{this.worker&&this.workerRef&&this._terminateWorker()}),this.socketAdapter.onMessage(t=>{t.ref&&t.ref===this._pendingWorkerHeartbeatRef&&(this._pendingWorkerHeartbeatRef=null)})}_handleNodeJsRaceCondition(){this.socketAdapter.isConnected()&&this.socketAdapter.getSocket().onConnOpen()}_wrapHeartbeatCallback(t){return(i,r)=>{i=="sent"&&this._setAuthSafely(),t&&t(i,r)}}_startWorkerHeartbeat(){this.workerUrl?this.log("worker",`starting worker for from ${this.workerUrl}`):this.log("worker","starting default worker");const t=this._workerObjectUrl(this.workerUrl);this.workerRef=new Worker(t),this.workerRef.onerror=i=>{this.log("worker","worker error",i.message),this._terminateWorker(),this.disconnect()},this.workerRef.onmessage=i=>{i.data.event==="keepAlive"&&this.sendHeartbeat()},this.workerRef.postMessage({event:"start",interval:this.heartbeatIntervalMs})}_terminateWorker(){this.workerRef&&(this.log("worker","terminating worker"),this.workerRef.terminate(),this.workerRef=void 0)}_workerObjectUrl(t){let i;if(t)i=t;else{const r=new Blob([nR],{type:"application/javascript"});i=URL.createObjectURL(r)}return i}_initializeOptions(t){var i,r,s,n,o,c,l,d,u,h,g;this.worker=(i=t==null?void 0:t.worker)!==null&&i!==void 0?i:!1,this.accessToken=(r=t==null?void 0:t.accessToken)!==null&&r!==void 0?r:null;const m={};m.timeout=(s=t==null?void 0:t.timeout)!==null&&s!==void 0?s:jM,m.heartbeatIntervalMs=(n=t==null?void 0:t.heartbeatIntervalMs)!==null&&n!==void 0?n:Lf.HEARTBEAT_INTERVAL,this._disconnectOnEmptyChannelsAfterMs=(o=t==null?void 0:t.disconnectOnEmptyChannelsAfterMs)!==null&&o!==void 0?o:2*((c=t==null?void 0:t.heartbeatIntervalMs)!==null&&c!==void 0?c:Lf.HEARTBEAT_INTERVAL),m.transport=(l=t==null?void 0:t.transport)!==null&&l!==void 0?l:TM.getWebSocketConstructor(),m.params=t==null?void 0:t.params,m.logger=t==null?void 0:t.logger,m.heartbeatCallback=this._wrapHeartbeatCallback(t==null?void 0:t.heartbeatCallback),m.reconnectAfterMs=(d=t==null?void 0:t.reconnectAfterMs)!==null&&d!==void 0?d:y=>rR[y-1]||sR;let w,v;const k=(u=t==null?void 0:t.vsn)!==null&&u!==void 0?u:IM;switch(k){case _M:w=(y,f)=>f(JSON.stringify(y)),v=(y,f)=>f(JSON.parse(y));break;case Pk:w=this.serializer.encode.bind(this.serializer),v=this.serializer.decode.bind(this.serializer);break;default:throw new Error(`Unsupported serializer version: ${m.vsn}`)}if(m.vsn=k,m.encode=(h=t==null?void 0:t.encode)!==null&&h!==void 0?h:w,m.decode=(g=t==null?void 0:t.decode)!==null&&g!==void 0?g:v,m.beforeReconnect=this._reconnectAuth.bind(this),(t!=null&&t.logLevel||t!=null&&t.log_level)&&(this.logLevel=t.logLevel||t.log_level,m.params=Object.assign(Object.assign({},m.params),{log_level:this.logLevel})),this.worker){if(typeof window<"u"&&!window.Worker)throw new Error("Web Worker is not supported");this.workerUrl=t==null?void 0:t.workerUrl,m.autoSendHeartbeat=!this.worker}return m}async _reconnectAuth(){await this._waitForAuthIfNeeded(),this.isConnected()||this.connect()}}
235var La=class extends Error{constructor(e,t){var i;super(e),this.name="IcebergError",this.status=t.status,this.icebergType=t.icebergType,this.icebergCode=t.icebergCode,this.details=t.details,this.isCommitStateUnknown=t.icebergType==="CommitStateUnknownException"||[500,502,504].includes(t.status)&&((i=t.icebergType)==null?void 0:i.includes("CommitState"))===!0}isNotFound(){return this.status===404}isConflict(){return this.status===409}isAuthenticationTimeout(){return this.status===419}};function oR(e,t,i){const r=new URL(t,e);if(i)for(const[s,n]of Object.entries(i))n!==void 0&&r.searchParams.set(s,n);return r.toString()}async function cR(e){return!e||e.type==="none"?{}:e.type==="bearer"?{Authorization:`Bearer ${e.token}`}:e.type==="header"?{[e.name]:e.value}:e.type==="custom"?await e.getHeaders():{}}function lR(e){const t=e.fetchImpl??globalThis.fetch;return{async request({method:i,path:r,query:s,body:n,headers:o}){const c=oR(e.baseUrl,r,s),l=await cR(e.auth),d=await t(c,{method:i,headers:{...n?{"Content-Type":"application/json"}:{},...l,...o},body:n?JSON.stringify(n):void 0}),u=await d.text(),h=(d.headers.get("content-type")||"").includes("application/json"),g=h&&u?JSON.parse(u):u;if(!d.ok){const m=h?g:void 0,w=m==null?void 0:m.error;throw new La((w==null?void 0:w.message)??`Request failed with status ${d.status}`,{status:d.status,icebergType:w==null?void 0:w.type,icebergCode:w==null?void 0:w.code,details:m})}return{status:d.status,headers:d.headers,data:g}}}}function Uo(e){return e.join("�")}var dR=class{constructor(e,t=""){this.client=e,this.prefix=t}async listNamespaces(e){const t=e?{parent:Uo(e.namespace)}:void 0;return(await this.client.request({method:"GET",path:`${this.prefix}/namespaces`,query:t})).data.namespaces.map(r=>({namespace:r}))}async createNamespace(e,t){const i={namespace:e.namespace,properties:t==null?void 0:t.properties};return(await this.client.request({method:"POST",path:`${this.prefix}/namespaces`,body:i})).data}async dropNamespace(e){await this.client.request({method:"DELETE",path:`${this.prefix}/namespaces/${Uo(e.namespace)}`})}async loadNamespaceMetadata(e){return{properties:(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${Uo(e.namespace)}`})).data.properties}}async namespaceExists(e){try{return await this.client.request({method:"HEAD",path:`${this.prefix}/namespaces/${Uo(e.namespace)}`}),!0}catch(t){if(t instanceof La&&t.status===404)return!1;throw t}}async createNamespaceIfNotExists(e,t){try{return await this.createNamespace(e,t)}catch(i){if(i instanceof La&&i.status===409)return;throw i}}};function bs(e){return e.join("�")}var uR=class{constructor(e,t="",i){this.client=e,this.prefix=t,this.accessDelegation=i}async listTables(e){return(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${bs(e.namespace)}/tables`})).data.identifiers}async createTable(e,t){const i={};return this.accessDelegation&&(i["X-Iceberg-Access-Delegation"]=this.accessDelegation),(await this.client.request({method:"POST",path:`${this.prefix}/namespaces/${bs(e.namespace)}/tables`,body:t,headers:i})).data.metadata}async updateTable(e,t){const i=await this.client.request({method:"POST",path:`${this.prefix}/namespaces/${bs(e.namespace)}/tables/${e.name}`,body:t});return{"metadata-location":i.data["metadata-location"],metadata:i.data.metadata}}async dropTable(e,t){await this.client.request({method:"DELETE",path:`${this.prefix}/namespaces/${bs(e.namespace)}/tables/${e.name}`,query:{purgeRequested:String((t==null?void 0:t.purge)??!1)}})}async loadTable(e){const t={};return this.accessDelegation&&(t["X-Iceberg-Access-Delegation"]=this.accessDelegation),(await this.client.request({method:"GET",path:`${this.prefix}/namespaces/${bs(e.namespace)}/tables/${e.name}`,headers:t})).data.metadata}async tableExists(e){const t={};this.accessDelegation&&(t["X-Iceberg-Access-Delegation"]=this.accessDelegation);try{return await this.client.request({method:"HEAD",path:`${this.prefix}/namespaces/${bs(e.namespace)}/tables/${e.name}`,headers:t}),!0}catch(i){if(i instanceof La&&i.status===404)return!1;throw i}}async createTableIfNotExists(e,t){try{return await this.createTable(e,t)}catch(i){if(i instanceof La&&i.status===409)return await this.loadTable({namespace:e.namespace,name:t.name});throw i}}},hR=class{constructor(e){var r;let t="v1";e.catalogName&&(t+=`/${e.catalogName}`);const i=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;this.client=lR({baseUrl:i,auth:e.auth,fetchImpl:e.fetch}),this.accessDelegation=(r=e.accessDelegation)==null?void 0:r.join(","),this.namespaceOps=new dR(this.client,t),this.tableOps=new uR(this.client,t,this.accessDelegation)}async listNamespaces(e){return this.namespaceOps.listNamespaces(e)}async createNamespace(e,t){return this.namespaceOps.createNamespace(e,t)}async dropNamespace(e){await this.namespaceOps.dropNamespace(e)}async loadNamespaceMetadata(e){return this.namespaceOps.loadNamespaceMetadata(e)}async listTables(e){return this.tableOps.listTables(e)}
235async createTable(e,t){return this.tableOps.createTable(e,t)}async updateTable(e,t){return this.tableOps.updateTable(e,t)}async dropTable(e,t){await this.tableOps.dropTable(e,t)}async loadTable(e){return this.tableOps.loadTable(e)}async namespaceExists(e){return this.namespaceOps.namespaceExists(e)}async tableExists(e){return this.tableOps.tableExists(e)}async createNamespaceIfNotExists(e,t){return this.namespaceOps.createNamespaceIfNotExists(e,t)}async createTableIfNotExists(e,t){return this.tableOps.createTableIfNotExists(e,t)}};function Ba(e){"@babel/helpers - typeof";return Ba=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ba(e)}function mR(e,t){if(Ba(e)!="object"||!e)return e;var i=e[Symbol.toPrimitive];if(i!==void 0){var r=i.call(e,t||"default");if(Ba(r)!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function pR(e){var t=mR(e,"string");return Ba(t)=="symbol"?t:t+""}function gR(e,t,i){return(t=pR(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function Bf(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(s){return Object.getOwnPropertyDescriptor(e,s).enumerable})),i.push.apply(i,r)}return i}function X(e){for(var t=1;t<arguments.length;t++){var i=arguments[t]!=null?arguments[t]:{};t%2?Bf(Object(i),!0).forEach(function(r){gR(e,r,i[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):Bf(Object(i)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(i,r))})}return e}var zl=class extends Error{constructor(e,t="storage",i,r){super(e),this.__isStorageError=!0,this.namespace=t,this.name=t==="vectors"?"StorageVectorsError":"StorageError",this.status=i,this.statusCode=r}toJSON(){return{name:this.name,message:this.message,status:this.status,statusCode:this.statusCode}}};function Wl(e){return typeof e=="object"&&e!==null&&"__isStorageError"in e}var bh=class extends zl{constructor(e,t,i,r="storage"){super(e,r,t,i),this.name=r==="vectors"?"StorageVectorsApiError":"StorageApiError",this.status=t,this.statusCode=i}toJSON(){return X({},super.toJSON())}},Rk=class extends zl{constructor(e,t,i="storage"){super(e,i),this.name=i==="vectors"?"StorageVectorsUnknownError":"StorageUnknownError",this.originalError=t}};function il(e,t,i){const r=X({},e),s=t.toLowerCase();for(const n of Object.keys(r))n.toLowerCase()===s&&delete r[n];return r[s]=i,r}function fR(e){const t={};for(const[i,r]of Object.entries(e))t[i.toLowerCase()]=r;return t}const yR=e=>e?(...t)=>e(...t):(...t)=>fetch(...t),bR=e=>{if(typeof e!="object"||e===null)return!1;const t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},vh=e=>{if(Array.isArray(e))return e.map(i=>vh(i));if(typeof e=="function"||e!==Object(e))return e;const t={};return Object.entries(e).forEach(([i,r])=>{const s=i.replace(/([-_][a-z])/gi,n=>n.toUpperCase().replace(/[-_]/g,""));t[s]=vh(r)}),t},vR=e=>!e||typeof e!="string"||e.length===0||e.length>100||e.trim()!==e||e.includes("/")||e.includes("\\")?!1:/^[\w!.\*'() &$@=;:+,?-]+$/.test(e),Uf=e=>{var t;return e.msg||e.message||e.error_description||(typeof e.error=="string"?e.error:(t=e.error)===null||t===void 0?void 0:t.message)||JSON.stringify(e)},wR=async(e,t,i,r)=>{if(e!==null&&typeof e=="object"&&typeof e.json=="function"){const s=e;let n=parseInt(s.status,10);Number.isFinite(n)||(n=500),s.json().then(o=>{const c=(o==null?void 0:o.statusCode)||(o==null?void 0:o.code)||n+"";t(new bh(Uf(o),n,c,r))}).catch(()=>{const o=n+"";t(new bh(s.statusText||`HTTP ${n} error`,n,o,r))})}else t(new Rk(Uf(e),e,r))},kR=(e,t,i,r)=>{const s={method:e,headers:(t==null?void 0:t.headers)||{}};if(e==="GET"||e==="HEAD"||!r)return X(X({},s),i);if(bR(r)){var n;const o=(t==null?void 0:t.headers)||{};let c;for(const[l,d]of Object.entries(o))l.toLowerCase()==="content-type"&&(c=d);s.headers=il(o,"Content-Type",(n=c)!==null&&n!==void 0?n:"application/json"),s.body=JSON.stringify(r)}else s.body=r;return t!=null&&t.duplex&&(s.duplex=t.duplex),X(X({},s),i)};async function $n(e,t,i,r,s,n,o){return new Promise((c,l)=>{e(i,kR(t,r,s,n)).then(d=>{if(!d.ok)throw d;if(r!=null&&r.noResolveJson)return d;if(o==="vectors"){const u=d.headers.get("content-type");if(d.headers.get("content-length")==="0"||d.status===204)return{};if(!u||!u.includes("application/json"))return{}}return d.json()}).then(d=>c(d)).catch(d=>wR(d,l,r,o))})}function Ok(e="storage"){return{get:async(t,i,r,s)=>$n(t,"GET",i,r,s,void 0,e),post:async(t,i,r,s,n)=>$n(t,"POST",i,s,n,r,e),put:async(t,i,r,s,n)=>$n(t,"PUT",i,s,n,r,e),head:async(t,i,r,s)=>$n(t,"HEAD",i,X(X({},r),{},{noResolveJson:!0}),s,void 0,e),remove:async(t,i,r,s,n)=>$n(t,"DELETE",i,s,n,r,e)}}const xR=Ok("storage"),{get:Ua,post:Gt,put:wh,head:AR,remove:ip}=xR,pt=Ok("vectors");var En=class{constructor(e,t={},i,r="storage"){this.shouldThrowOnError=!1,this.url=e,this.headers=fR(t),this.fetch=yR(i),this.namespace=r}throwOnError(){return this.shouldThrowOnError=!0,this}setHeader(e,t){return this.headers=il(this.headers,e,t),this}async handleOperation(e){var t=this;try{return{data:await e(),error:null}}catch(i){if(t.shouldThrowOnError)throw i;if(Wl(i))return{data:null,error:i};throw i}}},SR=class{constructor(e,t){this.downloadFn=e,this.shouldThrowOnError=t}then(e,t){return this.execute().then(e,t)}async execute(){var e=this;try{return{data:(await e.downloadFn()).body,error:null}}catch(t){if(e.shouldThrowOnError)throw t;if(Wl(t))return{data:null,error:t};throw t}}};let Fk;Fk=Symbol.toStringTag;var CR=class{constructor(e,t){this.downloadFn=e,this.shouldThrowOnError=t,this[Fk]="BlobDownloadBuilder",this.promise=null}asStream(){return new SR(this.downloadFn,this.shouldThrowOnError)}then(e,t){return this.getPromise().then(e,t)}catch(e){return this.getPromise().catch(e)}finally(e){return this.getPromise().finally(e)}getPromise(){return this.promise||(this.promise=this.execute()),this.promise}async execute(){var e=this;try{return{data:await(await e.downloadFn()).blob(),error:null}}catch(t){if(e.shouldThrowOnError)throw t;if(Wl(t))return{data:null,error:t};throw t}}};const DR={limit:100,offset:0,sortBy:{column:"name",order:"asc"}},qf={cacheControl:"3600",contentType:"text/plain;charset=UTF-8",upsert:!1};
235var TR=class extends En{constructor(e,t={},i,r){super(e,t,r,"storage"),this.bucketId=i}async uploadOrUpdate(e,t,i,r){var s=this;return s.handleOperation(async()=>{let n;const o=X(X({},qf),r);let c=X(X({},s.headers),e==="POST"&&{"x-upsert":String(o.upsert)});const l=o.metadata;if(typeof Blob<"u"&&i instanceof Blob?(n=new FormData,n.append("cacheControl",o.cacheControl),l&&n.append("metadata",s.encodeMetadata(l)),n.append("",i)):typeof FormData<"u"&&i instanceof FormData?(n=i,n.has("cacheControl")||n.append("cacheControl",o.cacheControl),l&&!n.has("metadata")&&n.append("metadata",s.encodeMetadata(l))):(n=i,c["cache-control"]=`max-age=${o.cacheControl}`,c["content-type"]=o.contentType,l&&(c["x-metadata"]=s.toBase64(s.encodeMetadata(l))),(typeof ReadableStream<"u"&&n instanceof ReadableStream||n&&typeof n=="object"&&"pipe"in n&&typeof n.pipe=="function")&&!o.duplex&&(o.duplex="half")),r!=null&&r.headers)for(const[g,m]of Object.entries(r.headers))c=il(c,g,m);const d=s._removeEmptyFolders(t),u=s._getFinalPath(d),h=await(e=="PUT"?wh:Gt)(s.fetch,`${s.url}/object/${u}`,n,X({headers:c},o!=null&&o.duplex?{duplex:o.duplex}:{}));return{path:d,id:h.Id,fullPath:h.Key}})}async upload(e,t,i){return this.uploadOrUpdate("POST",e,t,i)}async uploadToSignedUrl(e,t,i,r){var s=this;const n=s._removeEmptyFolders(e),o=s._getFinalPath(n),c=new URL(s.url+`/object/upload/sign/${o}`);return c.searchParams.set("token",t),s.handleOperation(async()=>{let l;const d=X(X({},qf),r);let u=X(X({},s.headers),{"x-upsert":String(d.upsert)});const h=d.metadata;if(typeof Blob<"u"&&i instanceof Blob?(l=new FormData,l.append("cacheControl",d.cacheControl),h&&l.append("metadata",s.encodeMetadata(h)),l.append("",i)):typeof FormData<"u"&&i instanceof FormData?(l=i,l.has("cacheControl")||l.append("cacheControl",d.cacheControl),h&&!l.has("metadata")&&l.append("metadata",s.encodeMetadata(h))):(l=i,u["cache-control"]=`max-age=${d.cacheControl}`,u["content-type"]=d.contentType,h&&(u["x-metadata"]=s.toBase64(s.encodeMetadata(h))),(typeof ReadableStream<"u"&&l instanceof ReadableStream||l&&typeof l=="object"&&"pipe"in l&&typeof l.pipe=="function")&&!d.duplex&&(d.duplex="half")),r!=null&&r.headers)for(const[g,m]of Object.entries(r.headers))u=il(u,g,m);return{path:n,fullPath:(await wh(s.fetch,c.toString(),l,X({headers:u},d!=null&&d.duplex?{duplex:d.duplex}:{}))).Key}})}async createSignedUploadUrl(e,t){var i=this;return i.handleOperation(async()=>{let r=i._getFinalPath(e);const s=X({},i.headers);t!=null&&t.upsert&&(s["x-upsert"]="true");const n=await Gt(i.fetch,`${i.url}/object/upload/sign/${r}`,{},{headers:s}),o=new URL(i.url+n.url),c=o.searchParams.get("token");if(!c)throw new zl("No token returned by API");return{signedUrl:o.toString(),path:e,token:c}})}async update(e,t,i){return this.uploadOrUpdate("PUT",e,t,i)}async move(e,t,i){var r=this;return r.handleOperation(async()=>await Gt(r.fetch,`${r.url}/object/move`,{bucketId:r.bucketId,sourceKey:e,destinationKey:t,de
235stinationBucket:i==null?void 0:i.destinationBucket},{headers:r.headers}))}async copy(e,t,i){var r=this;return r.handleOperation(async()=>({path:(await Gt(r.fetch,`${r.url}/object/copy`,{bucketId:r.bucketId,sourceKey:e,destinationKey:t,destinationBucket:i==null?void 0:i.destinationBucket},{headers:r.headers})).Key}))}async createSignedUrl(e,t,i){var r=this;return r.handleOperation(async()=>{let s=r._getFinalPath(e);const n=typeof(i==null?void 0:i.transform)=="object"&&i.transform!==null&&Object.keys(i.transform).length>0;let o=await Gt(r.fetch,`${r.url}/object/sign/${s}`,X({expiresIn:t},n?{transform:i.transform}:{}),{headers:r.headers});const c=new URLSearchParams;i!=null&&i.download&&c.set("download",i.download===!0?"":i.download),(i==null?void 0:i.cacheNonce)!=null&&c.set("cacheNonce",String(i.cacheNonce));const l=c.toString();return{signedUrl:encodeURI(`${r.url}${o.signedURL}${l?`&${l}`:""}`)}})}async createSignedUrls(e,t,i){var r=this;return r.handleOperation(async()=>{const s=await Gt(r.fetch,`${r.url}/object/sign/${r.bucketId}`,{expiresIn:t,paths:e},{headers:r.headers}),n=new URLSearchParams;i!=null&&i.download&&n.set("download",i.download===!0?"":i.download),(i==null?void 0:i.cacheNonce)!=null&&n.set("cacheNonce",String(i.cacheNonce));const o=n.toString();return s.map(c=>X(X({},c),{},{signedUrl:c.signedURL?encodeURI(`${r.url}${c.signedURL}${o?`&${o}`:""}`):null}))})}download(e,t,i){const r=typeof(t==null?void 0:t.transform)=="object"&&t.transform!==null&&Object.keys(t.transform).length>0?"render/image/authenticated":"object",s=new URLSearchParams;t!=null&&t.transform&&this.applyTransformOptsToQuery(s,t.transform),(t==null?void 0:t.cacheNonce)!=null&&s.set("cacheNonce",String(t.cacheNonce));const n=s.toString(),o=this._getFinalPath(e),c=()=>Ua(this.fetch,`${this.url}/${r}/${o}${n?`?${n}`:""}`,{headers:this.headers,noResolveJson:!0},i);return new CR(c,this.shouldThrowOnError)}async info(e){var t=this;const i=t._getFinalPath(e);return t.handleOperation(async()=>vh(await Ua(t.fetch,`${t.url}/object/info/${i}`,{headers:t.headers})))}async exists(e){var t=this;const i=t._getFinalPath(e);try{return await AR(t.fetch,`${t.url}/object/${i}`,{headers:t.headers}),{data:!0,error:null}}catch(s){if(t.shouldThrowOnError)throw s;if(Wl(s)){var r;const n=s instanceof bh?s.status:s instanceof Rk?(r=s.originalError)===null||r===void 0?void 0:r.status:void 0;if(n!==void 0&&[400,404].includes(n))return{data:!1,error:s}}throw s}}getPublicUrl(e,t){const i=this._getFinalPath(e),r=new URLSearchParams;t!=null&&t.download&&r.set("download",t.download===!0?"":t.download),t!=null&&t.transform&&this.applyTransformOptsToQuery(r,t.transform),(t==null?void 0:t.cacheNonce)!=null&&r.set("cacheNonce",String(t.cacheNonce));const s=r.toString(),n=typeof(t==null?void 0:t.transform)=="object"&&t.transform!==null&&Object.keys(t.transform).length>0?"render/image":"object";return{data:{publicUrl:encodeURI(`${this.url}/${n}/public/${i}`)+(s?`?${s}`:"")}}}async remove(e){var t=this;return t.handleOperation(async()=>await ip(t.fetch,`${t.url}/object/${t.bucketId}`,{prefixes:e},{headers:t.headers}))}async list(e,t,i){var r=this;return r.handleOperation(async()=>{const s=X(X(X({},DR),t),{},{prefix:e||""});return await Gt(r.fetch,`${r.url}/object/list/${r.bucketId}`,s,{headers:r.headers},i)})}async listV2(e,t){var i=this;return i.handleOperation(async()=>{const r=X({},e);return await Gt(i.fetch,`${i.url}/object/list-v2/${i.bucketId}`,r,{headers:i.headers},t)})}encodeMetadata(e){return JSON.stringify(e)}toBase64(e){return typeof Buffer<"u"?Buffer.from(e).toString("base64"):btoa(e)}_getFinalPath(e){return`${this.bucketId}/${e.replace(/^\/+/,"")}`}_removeEmptyFolders(e){return e.replace(/^\/|\/$/g,"").replace(/\/+/g,"/")}applyTransformOptsToQuery(e,t){return t.width&&e.set("width",t.width.toString()),t.height&&e.set("height",t.height.toString()),t.resize&&e.set("resize",t.resize),t.format&&e.set("format",t.format),t.quality&&e.set("quality",t.quality.toString()),e}};const ER="2.105.1",oo={"X-Client-Info":`storage-js/${ER}`};var PR=class extends En{constructor(e,t={},i,r){const s=new URL(e);r!=null&&r.useNewHostname&&/supabase\.(co|in|red)$/.test(s.hostname)&&!s.hostname.includes("storage.supabase.")&&(s.hostname=s.hostname.replace("supabase.","storage.supabase."));const n=s.href.replace(/\/$/,""),o=X(X({},oo),t);super(n,o,i,"storage")}async listBuckets(e){var t=this;return t.handleOperation(async()=>{const i=t.listBucketOptionsToQueryString(e);return await Ua(t.fetch,`${t.url}/bucket${i}`,{headers:t.headers})})}async getBucket(e){var t=this;return t.handleOperation(async()=>await Ua(t.fetch,`${t.url}/bucket/${e}`,{headers:t.headers}))}async createBucket(e,t={public:!1}){var i=this;return i.handleOperation(async()=>await Gt(i.fetch,`${i.url}/bucket`,{id:e,name:e,type:t.type,public:t.public,file_size_limit:t.fileSizeLimit,allowed_mime_types:t.allowedMimeTypes},{headers:i.headers}))}async updateBucket(e,t){var i=this;return i.handleOperation(async()=>await wh(i.fetch,`${i.url}/bucket/${e}`,{id:e,name:e,public:t.public,file_size_limit:t.fileSizeLimit,allowed_mime_types:t.allowedMimeTypes},{headers:i.headers}))}async emptyBucket(e){var t=this;return t.handleOperation(async()=>await Gt(t.fetch,`${t.url}/bucket/${e}/empty`,{},{headers:t.headers}))}async deleteBucket(e){var t=this;return t.handleOperation(async()=>await ip(t.fetch,`${t.url}/bucket/${e}`,{},{headers:t.headers}))}listBucketOptionsToQueryString(e){const t={};return e&&("limit"in e&&(t.limit=String(e.limit)),"offset"in e&&(t.offset=String(e.offset)),e.search&&(t.search=e.search),e.sortColumn&&(t.sortColumn=e.sortColumn),e.sortOrder&&(t.sortOrder=e.sortOrder)),Object.keys(t).length>0?"?"+new URLSearchParams(t).toString():""}}
235,_R=class extends En{constructor(e,t={},i){const r=e.replace(/\/$/,""),s=X(X({},oo),t);super(r,s,i,"storage")}async createBucket(e){var t=this;return t.handleOperation(async()=>await Gt(t.fetch,`${t.url}/bucket`,{name:e},{headers:t.headers}))}async listBuckets(e){var t=this;return t.handleOperation(async()=>{const i=new URLSearchParams;(e==null?void 0:e.limit)!==void 0&&i.set("limit",e.limit.toString()),(e==null?void 0:e.offset)!==void 0&&i.set("offset",e.offset.toString()),e!=null&&e.sortColumn&&i.set("sortColumn",e.sortColumn),e!=null&&e.sortOrder&&i.set("sortOrder",e.sortOrder),e!=null&&e.search&&i.set("search",e.search);const r=i.toString(),s=r?`${t.url}/bucket?${r}`:`${t.url}/bucket`;return await Ua(t.fetch,s,{headers:t.headers})})}async deleteBucket(e){var t=this;return t.handleOperation(async()=>await ip(t.fetch,`${t.url}/bucket/${e}`,{},{headers:t.headers}))}from(e){var t=this;if(!vR(e))throw new zl("Invalid bucket name: File, folder, and bucket names must follow AWS object key naming guidelines and should avoid the use of any other characters.");const i=new hR({baseUrl:this.url,catalogName:e,auth:{type:"custom",getHeaders:async()=>t.headers},fetch:this.fetch}),r=this.shouldThrowOnError;return new Proxy(i,{get(s,n){const o=s[n];return typeof o!="function"?o:async(...c)=>{try{return{data:await o.apply(s,c),error:null}}catch(l){if(r)throw l;return{data:null,error:l}}}}})}},IR=class extends En{constructor(e,t={},i){const r=e.replace(/\/$/,""),s=X(X({},oo),{},{"Content-Type":"application/json"},t);super(r,s,i,"vectors")}async createIndex(e){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/CreateIndex`,e,{headers:t.headers})||{})}async getIndex(e,t){var i=this;return i.handleOperation(async()=>await pt.post(i.fetch,`${i.url}/GetIndex`,{vectorBucketName:e,indexName:t},{headers:i.headers}))}async listIndexes(e){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/ListIndexes`,e,{headers:t.headers}))}async deleteIndex(e,t){var i=this;return i.handleOperation(async()=>await pt.post(i.fetch,`${i.url}/DeleteIndex`,{vectorBucketName:e,indexName:t},{headers:i.headers})||{})}},jR=class extends En{constructor(e,t={},i){const r=e.replace(/\/$/,""),s=X(X({},oo),{},{"Content-Type":"application/json"},t);super(r,s,i,"vectors")}async putVectors(e){var t=this;if(e.vectors.length<1||e.vectors.length>500)throw new Error("Vector batch size must be between 1 and 500 items");return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/PutVectors`,e,{headers:t.headers})||{})}async getVectors(e){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/GetVectors`,e,{headers:t.headers}))}async listVectors(e){var t=this;if(e.segmentCount!==void 0){if(e.segmentCount<1||e.segmentCount>16)throw new Error("segmentCount must be between 1 and 16");if(e.segmentIndex!==void 0&&(e.segmentIndex<0||e.segmentIndex>=e.segmentCount))throw new Error(`segmentIndex must be between 0 and ${e.segmentCount-1}`)}return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/ListVectors`,e,{headers:t.headers}))}async queryVectors(e){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/QueryVectors`,e,{headers:t.headers}))}async deleteVectors(e){var t=this;if(e.keys.length<1||e.keys.length>500)throw new Error("Keys batch size must be between 1 and 500 items");return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/DeleteVectors`,e,{headers:t.headers})||{})}},MR=class extends En{constructor(e,t={},i){const r=e.replace(/\/$/,""),s=X(X({},oo),{},{"Content-Type":"application/json"},t);super(r,s,i,"vectors")}async createBucket(e){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/CreateVectorBucket`,{vectorBucketName:e},{headers:t.headers})||{})}async getBucket(e){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/GetVectorBucket`,{vectorBucketName:e},{headers:t.headers}))}async listBuckets(e={}){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/ListVectorBuckets`,e,{headers:t.headers}))}async deleteBucket(e){var t=this;return t.handleOperation(async()=>await pt.post(t.fetch,`${t.url}/DeleteVectorBucket`,{vectorBucketName:e},{headers:t.headers})||{})}},RR=class extends MR{constructor(e,t={}){super(e,t.headers||{},t.fetch)}from(e){return new OR(this.url,this.headers,e,this.fetch)}async createBucket(e){var t=()=>super.createBucket,i=this;return t().call(i,e)}async getBucket(e){var t=()=>super.getBucket,i=this;return t().call(i,e)}async listBuckets(e={}){var t=()=>super.listBuckets,i=this;return t().call(i,e)}async deleteBucket(e){var t=()=>super.deleteBucket,i=this;return t().call(i,e)}},OR=class extends IR{constructor(e,t,i,r){super(e,t,r),this.vectorBucketName=i}async createIndex(e){var t=()=>super.createIndex,i=this;return t().call(i,X(X({},e),{},{vectorBucketName:i.vectorBucketName}))}
235async listIndexes(e={}){var t=()=>super.listIndexes,i=this;return t().call(i,X(X({},e),{},{vectorBucketName:i.vectorBucketName}))}async getIndex(e){var t=()=>super.getIndex,i=this;return t().call(i,i.vectorBucketName,e)}async deleteIndex(e){var t=()=>super.deleteIndex,i=this;return t().call(i,i.vectorBucketName,e)}index(e){return new FR(this.url,this.headers,this.vectorBucketName,e,this.fetch)}},FR=class extends jR{constructor(e,t,i,r,s){super(e,t,s),this.vectorBucketName=i,this.indexName=r}async putVectors(e){var t=()=>super.putVectors,i=this;return t().call(i,X(X({},e),{},{vectorBucketName:i.vectorBucketName,indexName:i.indexName}))}async getVectors(e){var t=()=>super.getVectors,i=this;return t().call(i,X(X({},e),{},{vectorBucketName:i.vectorBucketName,indexName:i.indexName}))}async listVectors(e={}){var t=()=>super.listVectors,i=this;return t().call(i,X(X({},e),{},{vectorBucketName:i.vectorBucketName,indexName:i.indexName}))}async queryVectors(e){var t=()=>super.queryVectors,i=this;return t().call(i,X(X({},e),{},{vectorBucketName:i.vectorBucketName,indexName:i.indexName}))}async deleteVectors(e){var t=()=>super.deleteVectors,i=this;return t().call(i,X(X({},e),{},{vectorBucketName:i.vectorBucketName,indexName:i.indexName}))}},NR=class extends PR{constructor(e,t={},i,r){super(e,t,i,r)}from(e){return new TR(this.url,this.headers,e,this.fetch)}get vectors(){return new RR(this.url+"/vector",{headers:this.headers,fetch:this.fetch})}get analytics(){return new _R(this.url+"/iceberg",this.headers,this.fetch)}};function $l(e,t){var i={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(i[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,r=Object.getOwnPropertySymbols(e);s<r.length;s++)t.indexOf(r[s])<0&&Object.prototype.propertyIsEnumerable.call(e,r[s])&&(i[r[s]]=e[r[s]]);return i}const Nk="2.105.1",Ss=30*1e3,kh=3,Ud=kh*Ss,LR="http://localhost:9999",BR="supabase.auth.token",UR={"X-Client-Info":`gotrue-js/${Nk}`},xh="X-Supabase-Api-Version",Lk={"2024-01-01":{timestamp:Date.parse("2024-01-01T00:00:00.0Z"),name:"2024-01-01"}},qR=/^([a-z0-9_-]{4})*($|[a-z0-9_-]{3}$|[a-z0-9_-]{2}$)$/i,zR=10*60*1e3;class qa extends Error{constructor(t,i,r){super(t),this.__isAuthError=!0,this.name="AuthError",this.status=i,this.code=r}toJSON(){return{name:this.name,message:this.message,status:this.status,code:this.code}}}function L(e){return typeof e=="object"&&e!==null&&"__isAuthError"in e}class WR extends qa{constructor(t,i,r){super(t,i,r),this.name="AuthApiError",this.status=i,this.code=r}}function $R(e){return L(e)&&e.name==="AuthApiError"}class Zt extends qa{constructor(t,i){super(t),this.name="AuthUnknownError",this.originalError=i}}class $i extends qa{constructor(t,i,r,s){super(t,r,s),this.name=i,this.status=r}}class Ne extends $i{constructor(){super("Auth session missing!","AuthSessionMissingError",400,void 0)}}function qo(e){return L(e)&&e.name==="AuthSessionMissingError"}class vs extends $i{constructor(){super("Auth session or user missing","AuthInvalidToken
235ResponseError",500,void 0)}}class zo extends $i{constructor(t){super(t,"AuthInvalidCredentialsError",400,void 0)}}class Wo extends $i{constructor(t,i=null){super(t,"AuthImplicitGrantRedirectError",500,void 0),this.details=null,this.details=i}toJSON(){return Object.assign(Object.assign({},super.toJSON()),{details:this.details})}}function HR(e){return L(e)&&e.name==="AuthImplicitGrantRedirectError"}class zf extends $i{constructor(t,i=null){super(t,"AuthPKCEGrantCodeExchangeError",500,void 0),this.details=null,this.details=i}toJSON(){return Object.assign(Object.assign({},super.toJSON()),{details:this.details})}}class VR extends $i{constructor(){super("PKCE code verifier not found in storage. This can happen if the auth flow was initiated in a different browser or device, or if the storage was cleared. For SSR frameworks (Next.js, SvelteKit, etc.), use @supabase/ssr on both the server and client to store the code verifier in cookies.","AuthPKCECodeVerifierMissingError",400,"pkce_code_verifier_not_found")}}class Ah extends $i{constructor(t,i){super(t,"AuthRetryableFetchError",i,void 0)}}function qd(e){return L(e)&&e.name==="AuthRetryableFetchError"}class Wf extends $i{constructor(t,i,r){super(t,"AuthWeakPasswordError",i,"weak_password"),this.reasons=r}toJSON(){return Object.assign(Object.assign({},super.toJSON()),{reasons:this.reasons})}}class Sh extends $i{constructor(t){super(t,"AuthInvalidJwtError",400,"invalid_jwt")}}const rl="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".split(""),$f=` 236\r=`.split(""),GR=(()=>{const e=new Array(128);for(let t=0;t<e.length;t+=1)e[t]=-1;for(let t=0;t<$f.length;t+=1)e[$f[t].charCodeAt(0)]=-2;for(let t=0;t<rl.length;t+=1)e[rl[t].charCodeAt(0)]=t;return e})();function Hf(e,t,i){if(e!==null)for(t.queue=t.queue<<8|e,t.queuedBits+=8;t.queuedBits>=6;){const r=t.queue>>t.queuedBits-6&63;i(rl[r]),t.queuedBits-=6}else if(t.queuedBits>0)for(t.queue=t.queue<<6-t.queuedBits,t.queuedBits=6;t.queuedBits>=6;){const r=t.queue>>t.queuedBits-6&63;i(rl[r]),t.queuedBits-=6}}function Bk(e,t,i){const r=GR[e];if(r>-1)for(t.queue=t.queue<<6|r,t.queuedBits+=6;t.queuedBits>=8;)i(t.queue>>t.queuedBits-8&255),t.queuedBits-=8;else{if(r===-2)return;throw new Error(`Invalid Base64-URL character "${String.fromCharCode(e)}"`)}}function Vf(e){const t=[],i=o=>{t.push(String.fromCodePoint(o))},r={utf8seq:0,codepoint:0},s={queue:0,queuedBits:0},n=o=>{XR(o,r,i)};for(let o=0;o<e.length;o+=1)Bk(e.charCodeAt(o),s,n);return t.join("")}function KR(e,t){if(e<=127){t(e);return}else if(e<=2047){t(192|e>>6),t(128|e&63);return}else if(e<=65535){t(224|e>>12),t(128|e>>6&63),t(128|e&63);return}else if(e<=1114111){t(240|e>>18),t(128|e>>12&63),t(128|e>>6&63),t(128|e&63);return}throw new Error(`Unrecognized Unicode codepoint: ${e.toString(16)}`)}function QR(e,t){for(let i=0;i<e.length;i+=1){let r=e.charCodeAt(i);if(r>55295&&r<=56319){const s=(r-55296)*1024&65535;r=(e.charCodeAt(i+1)-56320&65535|s)+65536,i+=1}KR(r,t)}}function XR(e,t,i){if(t.utf8seq===0){if(e<=127){i(e);return}for(let r=1;r<6;r+=1)if(!(e>>7-r&1)){t.utf8seq=r;break}if(t.utf8seq===2)t.codepoint=e&31;else if(t.utf8seq===3)t.codepoint=e&15;else if(t.utf8seq===4)t.codepoint=e&7;else throw new Error("Invalid UTF-8 sequence");t.utf8seq-=1}else if(t.utf8seq>0){if(e<=127)throw new Error("Invalid UTF-8 sequence");t.codepoint=t.codepoint<<6|e&63,t.utf8seq-=1,t.utf8seq===0&&i(t.codepoint)}}function Js(e){const t=[],i={queue:0,queuedBits:0},r=s=>{t.push(s)};for(let s=0;s<e.length;s+=1)Bk(e.charCodeAt(s),i,r);return new Uint8Array(t)}function JR(e){const t=[];return QR(e,i=>t.push(i)),new Uint8Array(t)}function Hr(e){const t=[],i={queue:0,queuedBits:0},r=s=>{t.push(s)};return e.forEach(s=>Hf(s,i,r)),Hf(null,i,r),t.join("")}function YR(e){return Math.round(Date.now()/1e3)+e}function ZR(){return Symbol("auth-callback")}const qe=()=>typeof window<"u"&&typeof document<"u",Fr={tested:!1,writable:!1},Uk=()=>{if(!qe())return!1;try{if(typeof globalThis.localStorage!="object")return!1}catch{return!1}if(Fr.tested)return Fr.writable;const e=`lswt-${Math.random()}${Math.random()}`;try{globalThis.localStorage.setItem(e,e),globalThis.localStorage.removeItem(e),Fr.tested=!0,Fr.writable=!0}catch{Fr.tested=!0,Fr.writable=!1}return Fr.writable};function eO(e){const t={},i=new URL(e);if(i.hash&&i.hash[0]==="#")try{new URLSearchParams(i.hash.substring(1)).forEac
236h((s,n)=>{t[n]=s})}catch{}return i.searchParams.forEach((r,s)=>{t[s]=r}),t}const qk=e=>e?(...t)=>e(...t):(...t)=>fetch(...t),tO=e=>typeof e=="object"&&e!==null&&"status"in e&&"ok"in e&&"json"in e&&typeof e.json=="function",Cs=async(e,t,i)=>{await e.setItem(t,JSON.stringify(i))},Nr=async(e,t)=>{const i=await e.getItem(t);if(!i)return null;try{return JSON.parse(i)}catch{return i}},Ue=async(e,t)=>{await e.removeItem(t)};class Hl{constructor(){this.promise=new Hl.promiseConstructor((t,i)=>{this.resolve=t,this.reject=i})}}Hl.promiseConstructor=Promise;function $o(e){const t=e.split(".");if(t.length!==3)throw new Sh("Invalid JWT structure");for(let r=0;r<t.length;r++)if(!qR.test(t[r]))throw new Sh("JWT not in base64url format");return{header:JSON.parse(Vf(t[0])),payload:JSON.parse(Vf(t[1])),signature:Js(t[2]),raw:{header:t[0],payload:t[1]}}}async function iO(e){return await new Promise(t=>{setTimeout(()=>t(null),e)})}function rO(e,t){return new Promise((r,s)=>{(async()=>{for(let n=0;n<1/0;n++)try{const o=await e(n);if(!t(n,null,o)){r(o);return}}catch(o){if(!t(n,o)){s(o);return}}})()})}function sO(e){return("0"+e.toString(16)).substr(-2)}function nO(){const t=new Uint32Array(56);if(typeof crypto>"u"){const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",r=i.length;let s="";for(let n=0;n<56;n++)s+=i.charAt(Math.floor(Math.random()*r));return s}return crypto.getRandomValues(t),Array.from(t,sO).join("")}async function aO(e){const i=new TextEncoder().encode(e),r=await crypto.subtle.digest("SHA-256",i),s=new Uint8Array(r);return Array.from(s).map(n=>String.fromCharCode(n)).join("")}async function oO(e){if(!(typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof TextEncoder<"u"))return console.warn("WebCrypto API is not supported. Code challenge method will default to use plain instead of sha256."),e;const i=await aO(e);return btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function ws(e,t,i=!1){const r=nO();let s=r;i&&(s+="/recovery"),await Cs(e,`${t}-code-verifier`,s);const n=await oO(r);return[n,r===n?"plain":"s256"]}const cO=/^2[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/i;function lO(e){const t=e.headers.get(xh);if(!t||!t.match(cO))return null;try{return new Date(`${t}T00:00:00.0Z`)}catch{return null}}function dO(e){if(!e)throw new Error("Missing exp claim");const t=Math.floor(Date.now()/1e3);if(e<=t)throw new Error("JWT has expired")}function uO(e){switch(e){case"RS256":return{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}};case"ES256":return{name:"ECDSA",namedCurve:"P-256",hash:{name:"SHA-256"}};default:throw new Error("Invalid alg claim")}}const hO=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;function Si(e){if(!hO.test(e))throw new Error("@supabase/auth-js: Expected parameter to be UUID but is not")}function $t(e){if(!e.passkey)throw new Error("@supabase/auth-js: the passkey API is experimental and disabled by default. Enable it by passing `auth: { experimental: { passkey: true } }` to createClient (or to the GoTrueClient constructor).")}function zd(){const e={};return new Proxy(e,{get:(t,i)=>{if(i==="__isUserNotAvailableProxy")return!0;if(typeof i=="symbol"){const r=i.toString();if(r==="Symbol(Symbol.toPrimitive)"||r==="Symbol(Symbol.toStringTag)"||r==="Symbol(util.inspect.custom)")return}throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Accessing the "${i}" property of the session object is not supported. Please use getUser() instead.`)},set:(t,i)=>{throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Setting the "${i}" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.`)},deleteProperty:(t,i)=>{throw new Error(`@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Deleting the "${i}" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.`)}})}function mO(e,t){return new Proxy(e,{get:(i,r,s)=>{if(r==="__isInsecureUserWarningProxy")return!0;
236if(typeof r=="symbol"){const n=r.toString();if(n==="Symbol(Symbol.toPrimitive)"||n==="Symbol(Symbol.toStringTag)"||n==="Symbol(util.inspect.custom)"||n==="Symbol(nodejs.util.inspect.custom)")return Reflect.get(i,r,s)}return!t.value&&typeof r=="string"&&(console.warn("Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server."),t.value=!0),Reflect.get(i,r,s)}})}function Gf(e){return JSON.parse(JSON.stringify(e))}const Ur=e=>e.msg||e.message||e.error_description||e.error||JSON.stringify(e),pO=[502,503,504,520,521,522,523,524,530];async function Kf(e){var t;if(!tO(e))throw new Ah(Ur(e),0);if(pO.includes(e.status))throw new Ah(Ur(e),e.status);let i;try{i=await e.json()}catch(n){throw new Zt(Ur(n),n)}let r;const s=lO(e);if(s&&s.getTime()>=Lk["2024-01-01"].timestamp&&typeof i=="object"&&i&&typeof i.code=="string"?r=i.code:typeof i=="object"&&i&&typeof i.error_code=="string"&&(r=i.error_code),r){if(r==="weak_password")throw new Wf(Ur(i),e.status,((t=i.weak_password)===null||t===void 0?void 0:t.reasons)||[]);if(r==="session_not_found")throw new Ne}else if(typeof i=="object"&&i&&typeof i.weak_password=="object"&&i.weak_password&&Array.isArray(i.weak_password.reasons)&&i.weak_password.reasons.length&&i.weak_password.reasons.reduce((n,o)=>n&&typeof o=="string",!0))throw new Wf(Ur(i),e.status,i.weak_password.reasons);throw new WR(Ur(i),e.status||500,r)}const gO=(e,t,i,r)=>{const s={method:e,headers:(t==null?void 0:t.headers)||{}};return e==="GET"?s:(s.headers=Object.assign({"Content-Type":"application/json;charset=UTF-8"},t==null?void 0:t.headers),s.body=JSON.stringify(r),Object.assign(Object.assign({},s),i))};async function $(e,t,i,r){var s;const n=Object.assign({},r==null?void 0:r.headers);n[xh]||(n[xh]=Lk["2024-01-01"].name),r!=null&&r.jwt&&(n.Authorization=`Bearer ${r.jwt}`);const o=(s=r==null?void 0:r.query)!==null&&s!==void 0?s:{};r!=null&&r.redirectTo&&(o.redirect_to=r.redirectTo);const c=Object.keys(o).length?"?"+new URLSearchParams(o).toString():"",l=await fO(e,t,i+c,{headers:n,noResolveJson:r==null?void 0:r.noResolveJson},{},r==null?void 0:r.body);return r!=null&&r.xform?r==null?void 0:r.xform(l):{data:Object.assign({},l),error:null}}async function fO(e,t,i,r,s,n){const o=gO(t,r,s,n);let c;try{c=await e(i,Object.assign({},o))}catch(l){throw console.error(l),new Ah(Ur(l),0)}if(c.ok||await Kf(c),r!=null&&r.noResolveJson)return c;try{return await c.json()}catch(l){await Kf(l)}}function St(e){var t;let i=null;vO(e)&&(i=Object.assign({},e),e.expires_at||(i.expires_at=YR(e.expires_in)));const r=(t=e.user)!==null&&t!==void 0?t:e;return{data:{session:i,user:r},error:null}}function Qf(e){const t=St(e);return!t.error&&e.weak_password&&typeof e.weak_password=="object"&&Array.isArray(e.weak_password.reasons)&&e.weak_password.reasons.length&&e.weak_password.message&&typeof e.weak_password.message=="string"&&e.weak_password.reasons.reduce((i,r)=>i&&typeof r=="string",!0)&&(t.data.weak_password=e.weak_password),t}function sr(e){var t;return{data:{user:(t=e.user)!==null&&t!==void 0?t:e},error:null}}function yO(e){return{data:e,error:null}}function bO(e){const{action_link:t,email_otp:i,hashed_token:r,redirect_to:s,verification_type:n}=e,o=$l(e,["action_link","email_otp","hashed_token","redirect_to","verification_type"]),c={action_link:t,email_otp:i,hashed_token:r,redirect_to:s,verification_type:n},l=Object.assign({},o);return{data:{properties:c,user:l},error:null}}function Xf(e){return e}function vO(e){return e.access_token&&e.refresh_token&&e.expires_in}const Wd=["global","local","others"];class wO{constructor({url:t="",headers:i={},fetch:r,experimental:s}){this.url=t,this.headers=i,this.fetch=qk(r),this.experimental=s??{},this.mfa={listFactors:this._listFactors.bind(this),deleteFactor:this._deleteFactor.bind(this)},this.oauth={listClients:this._listOAuthClients.bind(this),createClient:this._createOAuthClient.bind(this),getClient:this._getOAuthClient.bind(this),updateClient:this._updateOAuthClient.bind(this),deleteClient:this._deleteOAuthClient.bind(this),regenerateClientSecret:this._regenerateOAuthClientSecret.bind(this)},this.customProviders={listProviders:this._listCustomProviders.bind(this),createProvider:this._createCustomProvider.bind(this),getProvider:this._getCustomProvider.bind(this),updateProvider:this._updateCustomProvider.bind(this),deleteProvider:this._deleteCustomProvider.bind(this)},this.passkey={listPasskeys:this._adminListPasskeys.bind(this),deletePasskey:this._adminDeletePasskey.bind(this)}}async signOut(t,i=Wd[0]){if(Wd.indexOf(i)<0)throw new Error(`@supabase/auth-js: Parameter scope must be one of ${Wd.join(", ")}`);try{return await $(this.fetch,"POST",`${this.url}/logout?scope=${i}`,{headers:this.headers,jwt:t,noResolveJson:!0}),{data:null,error:null}}catch(r){if(L(r))return{data:null,error:r};throw r}}async inviteUserByEmail(t,i={}){try{return await $(this.fetch,"POST",`${this.url}/invite`,{body:{email:t,data:i.data},headers:this.headers,redirectTo:i.redirectTo,xform:sr})}catch(r){if(L(r))return{data:{user:null},error:r};throw r}}async generateLink(t){try{const{options:i}=t,r=$l(t,["options"]),s=Object.assign(Object.assign({},r),i);return"newEmail"in r&&(s.new_email=r==null?void 0:r.newEmail,delete s.newEmail),await $(this.fetch,"POST",`${this.url}/admin/generate_link`,{body:s,headers:this.headers,xform:bO,redirectTo:i==null?void 0:i.redirectTo})}catch(i){if(L(i))return{data:{properties:null,user:null},error:i};throw i}}async createUser(t){try{return await $(this.fetch,"POST",`${this.url}/admin/users`,{body:t,headers:this.headers,xform:sr})}catch(i){if(L(i))return{data:{user:null},error:i};throw i}}async listUsers(t){var i,r,s,n,o,c,l;try{const d={nextPage:null,lastPage:0,total:0},u=await $(this.fetch,"GET",`${this.url}/admin/users`,{headers:this.headers,noResolveJson:!0,query:{page:(r=(i=t==null?void 0:t.page)===null||i===void 0?void 0:i.toString())!==null&&r!==void 0?r:"",per_page:(n=(s=t==null?void 0:t.perPage)===null||s===void 0?void 0:s.toString())!==null&&n!==void 0?n:""},xform:Xf});if(u.error)throw u.error;const h=await u.json(),g=(o=u.headers.get("x-total-count"))!==null&&o!==void 0?o:0,m=(l=(c=u.headers.get("link"))===null||c===void 0?void 0:c.split(","))!==null&&l!==void 0?l:[];return m.length>0&&(m.forEach(w=>{const v=parseInt(w.split(";")[0].split("=")[1].substring(0,1)),k=JSON.parse(w.split(";")[1].split("=")[1]);d[`${k}Page`]=v}),d.total=parseInt(g)),{data:Object.assign(Object.assign({},h),d),error:null}}catch(d){if(L(d))return{data:{users:[]},error:d};throw d}}async getUserById(t){Si(t);try{return await $(this.fetch,"GET",`${this.url}/admin/users/${t}`,{headers:this.headers,xform:sr})}catch(i){if(L(i))return{data:{user:null},error:i};throw i}}async updateUserById(t,i){Si(t);try{return await $(this.fetch,"PUT",`${this.url}/admin/users/${t}`,{body:i,headers:this.headers,xform:sr})}catch(r){if(L(r))return{data:{user:null},error:r};throw r}}async deleteUser(t,i=!1){Si(t);
236try{return await $(this.fetch,"DELETE",`${this.url}/admin/users/${t}`,{headers:this.headers,body:{should_soft_delete:i},xform:sr})}catch(r){if(L(r))return{data:{user:null},error:r};throw r}}async _listFactors(t){Si(t.userId);try{const{data:i,error:r}=await $(this.fetch,"GET",`${this.url}/admin/users/${t.userId}/factors`,{headers:this.headers,xform:s=>({data:{factors:s},error:null})});return{data:i,error:r}}catch(i){if(L(i))return{data:null,error:i};throw i}}async _deleteFactor(t){Si(t.userId),Si(t.id);try{return{data:await $(this.fetch,"DELETE",`${this.url}/admin/users/${t.userId}/factors/${t.id}`,{headers:this.headers}),error:null}}catch(i){if(L(i))return{data:null,error:i};throw i}}async _listOAuthClients(t){var i,r,s,n,o,c,l;try{const d={nextPage:null,lastPage:0,total:0},u=await $(this.fetch,"GET",`${this.url}/admin/oauth/clients`,{headers:this.headers,noResolveJson:!0,query:{page:(r=(i=t==null?void 0:t.page)===null||i===void 0?void 0:i.toString())!==null&&r!==void 0?r:"",per_page:(n=(s=t==null?void 0:t.perPage)===null||s===void 0?void 0:s.toString())!==null&&n!==void 0?n:""},xform:Xf});if(u.error)throw u.error;const h=await u.json(),g=(o=u.headers.get("x-total-count"))!==null&&o!==void 0?o:0,m=(l=(c=u.headers.get("link"))===null||c===void 0?void 0:c.split(","))!==null&&l!==void 0?l:[];return m.length>0&&(m.forEach(w=>{const v=parseInt(w.split(";")[0].split("=")[1].substring(0,1)),k=JSON.parse(w.split(";")[1].split("=")[1]);d[`${k}Page`]=v}),d.total=parseInt(g)),{data:Object.assign(Object.assign({},h),d),error:null}}catch(d){if(L(d))return{data:{clients:[]},error:d};throw d}}async _createOAuthClient(t){try{return await $(this.fetch,"POST",`${this.url}/admin/oauth/clients`,{body:t,headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(L(i))return{data:null,error:i};throw i}}async _getOAuthClient(t){try{return await $(this.fetch,"GET",`${this.url}/admin/oauth/clients/${t}`,{headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(L(i))return{data:null,error:i};throw i}}async _updateOAuthClient(t,i){try{return await $(this.fetch,"PUT",`${this.url}/admin/oauth/clients/${t}`,{body:i,headers:this.headers,xform:r=>({data:r,error:null})})}catch(r){if(L(r))return{data:null,error:r};throw r}}async _deleteOAuthClient(t){try{return await $(this.fetch,"DELETE",`${this.url}/admin/oauth/clients/${t}`,{headers:this.headers,noResolveJson:!0}),{data:null,error:null}}catch(i){if(L(i))return{data:null,error:i};throw i}}async _regenerateOAuthClientSecret(t){try{return await $(this.fetch,"POST",`${this.url}/admin/oauth/clients/${t}/regenerate_secret`,{headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(L(i))return{data:null,error:i};throw i}}async _listCustomProviders(t){try{const i={};return t!=null&&t.type&&(i.type=t.type),await $(this.fetch,"GET",`${this.url}/admin/custom-providers`,{headers:this.headers,query:i,xform:r=>{var s;return{data:{providers:(s=r==null?void 0:r.providers)!==null&&s!==void 0?s:[]},error:null}}})}catch(i){if(L(i))return{data:{providers:[]},error:i};throw i}}async _createCustomProvider(t){try{return await $(this.fetch,"POST",`${this.url}/admin/custom-providers`,{body:t,headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(L(i))return{data:null,error:i};throw i}}async _getCustomProvider(t){try{return await $(this.fetch,"GET",`${this.url}/admin/custom-providers/${t}`,{headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(L(i))return{data:null,error:i};throw i}}async _updateCustomProvider(t,i){try{return await $(this.fetch,"PUT",`${this.url}/admin/custom-providers/${t}`,{body:i,headers:this.headers,xform:r=>({data:r,error:null})})}catch(r){if(L(r))return{data:null,error:r};throw r}}async _deleteCustomProvider(t){try{return await $(this.fetch,"DELETE",`${this.url}/admin/custom-providers/${t}`,{headers:this.headers,noResolveJson:!0}),{data:null,error:null}}catch(i){if(L(i))return{data:null,error:i};throw i}}async _adminListPasskeys(t){$t(this.experimental),Si(t.userId);try{return await $(this.fetch,"GET",`${this.url}/admin/users/${t.userId}/passkeys`,{headers:this.headers,xform:i=>({data:i,error:null})})}catch(i){if(L(i))return{data:null,error:i};throw i}}async _adminDeletePasskey(t){$t(this.experimental),Si(t.userId),Si(t.passkeyId);
236try{return await $(this.fetch,"DELETE",`${this.url}/admin/users/${t.userId}/passkeys/${t.passkeyId}`,{headers:this.headers,noResolveJson:!0}),{data:null,error:null}}catch(i){if(L(i))return{data:null,error:i};throw i}}}function Jf(e={}){return{getItem:t=>e[t]||null,setItem:(t,i)=>{e[t]=i},removeItem:t=>{delete e[t]}}}const li={debug:!!(globalThis&&Uk()&&globalThis.localStorage&&globalThis.localStorage.getItem("supabase.gotrue-js.locks.debug")==="true")};class zk extends Error{constructor(t){super(t),this.isAcquireTimeout=!0}}class Yf extends zk{}async function kO(e,t,i){li.debug&&console.log("@supabase/gotrue-js: navigatorLock: acquire lock",e,t);const r=new globalThis.AbortController;let s;t>0&&(s=setTimeout(()=>{r.abort(),li.debug&&console.log("@supabase/gotrue-js: navigatorLock acquire timed out",e)},t)),await Promise.resolve();try{return await globalThis.navigator.locks.request(e,t===0?{mode:"exclusive",ifAvailable:!0}:{mode:"exclusive",signal:r.signal},async n=>{if(n){clearTimeout(s),li.debug&&console.log("@supabase/gotrue-js: navigatorLock: acquired",e,n.name);try{return await i()}finally{li.debug&&console.log("@supabase/gotrue-js: navigatorLock: released",e,n.name)}}else{if(t===0)throw li.debug&&console.log("@supabase/gotrue-js: navigatorLock: not immediately available",e),new Yf(`Acquiring an exclusive Navigator LockManager lock "${e}" immediately failed`);if(li.debug)try{const o=await globalThis.navigator.locks.query();console.log("@supabase/gotrue-js: Navigator LockManager state",JSON.stringify(o,null," "))}catch(o){console.warn("@supabase/gotrue-js: Error when querying Navigator LockManager state",o)}return console.warn("@supabase/gotrue-js: Navigator LockManager returned a null lock when using #request without ifAvailable set to true, it appears this browser is not following the LockManager spec https://developer.mozilla.org/en-US/docs/Web/API/LockManager/request"),clearTimeout(s),await i()}})}catch(n){if(t>0&&clearTimeout(s),(n==null?void 0:n.name)==="AbortError"&&t>0){if(r.signal.aborted)return li.debug&&console.log("@supabase/gotrue-js: navigatorLock: acquire timeout, recovering by stealing lock",e),console.warn(`@supabase/gotrue-js: Lock "${e}" was not released within ${t}ms. This may indicate an orphaned lock from a component unmount (e.g., React Strict Mode). Forcefully acquiring the lock to recover.`),await Promise.resolve().then(()=>globalThis.navigator.locks.request(e,{mode:"exclusive",steal:!0},async o=>{if(o){li.debug&&console.log("@supabase/gotrue-js: navigatorLock: recovered (stolen)",e,o.name);try{return await i()}finally{li.debug&&console.log("@supabase/gotrue-js: navigatorLock: released (stolen)",e,o.name)}}else return console.warn("@supabase/gotrue-js: Navigator LockManager returned null lock even with steal: true"),await i()}));throw li.debug&&console.log("@supabase/gotrue-js: navigatorLock: lock was stolen by another request",e),new Yf(`Lock "${e}" was released because another request stole it`)}throw n}}function xO(){if(typeof globalThis!="object")try{Object.defineProperty(Object.prototype,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__}catch{typeof self<"u"&&(self.globalThis=self)}}function Wk(e){if(!/^0x[a-fA-F0-9]{40}$/.test(e))throw new Error(`@supabase/auth-js: Address "${e}" is invalid.`);return e.toLowerCase()}function AO(e){return parseInt(e,16)}function SO(e){const t=new TextEncoder().encode(e);return"0x"+Array.from(t,r=>r.toString(16).padStart(2,"0")).join("")}function CO(e){var t;const{chainId:i,domain:r,expirationTime:s,issuedAt:n=new Date,nonce:o,notBefore:c,requestId:l,resources:d,scheme:u,uri:h,version:g}=e;{if(!Number.isInteger(i))throw new Error(`@supabase/auth-js: Invalid SIWE message field "chainId". Chain ID must be a EIP-155 chain ID. Provided value: ${i}`);if(!r)throw new Error('@supabase/auth-js: Invalid SIWE message field "domain". Domain must be provided.');if(o&&o.length<8)throw new Error(`@supabase/auth-js: Invalid SIWE message field "nonce". Nonce must be at least 8 characters. Provided value: ${o}`);if(!h)throw new Error('@supabase/auth-js: Invalid SIWE message field "uri". URI must be provided.');if(g!=="1")throw new Error(`@supabase/auth-js: Invalid SIWE message field "version". Version must be '1'. Provided value: ${g}`);if(!((t=e.statement)===null||t===void 0)&&t.includes(` 237`))throw new Error(`@supabase/auth-js: Invalid SIWE message field "statement". Statement must not include '\\n'. Provided value: ${e.statement}`)}const m=Wk(e.address),w=u?`${u}://${r}`:r,v=e.statement?`${e.statement} 238`:"",k=`${w} wants you to sign in with your Ethereum account: 239${m} 240 241${v}`;let y=`URI: ${h} 242Version: ${g} 243Chain ID: ${i}${o?` 244Nonce: ${o}`:""} 245Issued At: ${n.toISOString()}`;if(s&&(y+=` 246Expiration Time: ${s.toISOString()}
246`),c&&(y+=` 247Not Before: ${c.toISOString()}`),l&&(y+=` 248Request ID: ${l}`),d){let f=` 249Resources:`;for(const b of d){if(!b||typeof b!="string")throw new Error(`@supabase/auth-js: Invalid SIWE message field "resources". Every resource must be a valid string. Provided value: ${b}`);f+=` 250- ${b}`}y+=f}return`${k} 251${y}`}class Ie extends Error{constructor({message:t,code:i,cause:r,name:s}){var n;super(t,{cause:r}),this.__isWebAuthnError=!0,this.name=(n=s??(r instanceof Error?r.name:void 0))!==null&&n!==void 0?n:"Unknown Error",this.code=i}}class sl extends Ie{constructor(t,i){super({code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:i,message:t}),this.name="WebAuthnUnknownError",this.originalError=i}}function DO({error:e,options:t}){var i,r,s;const{publicKey:n}=t;if(!n)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new Ie({message:"Registration ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else if(e.name==="ConstraintError"){if(((i=n.authenticatorSelection)===null||i===void 0?void 0:i.requireResidentKey)===!0)return new Ie({message:"Discoverable credentials were required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT",cause:e});if(t.mediation==="conditional"&&((r=n.authenticatorSelection)===null||r===void 0?void 0:r.userVerification)==="required")return new Ie({message:"User verification was required during automatic registration but it could not be performed",code:"ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE",cause:e});if(((s=n.authenticatorSelection)===null||s===void 0?void 0:s.userVerification)==="required")return new Ie({message:"User verification was required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT",cause:e})}else{if(e.name==="InvalidStateError")return new Ie({message:"The authenticator was previously registered",code:"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED",cause:e});if(e.name==="NotAllowedError")return new Ie({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="NotSupportedError")return n.pubKeyCredParams.filter(c=>c.type==="public-key").length===0?new Ie({message:'No entry in pubKeyCredParams was of type "public-key"',code:"ERROR_MALFORMED_PUBKEYCREDPARAMS",cause:e}):new Ie({message:"No available authenticator supported any of the specified pubKeyCredParams algorithms",code:"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG",cause:e});if(e.name==="SecurityError"){const o=window.location.hostname;if($k(o)){if(n.rp.id!==o)return new Ie({message:`The RP ID "${n.rp.id}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new Ie({message:`${window.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="TypeError"){if(n.user.id.byteLength<1||n.user.id.byteLength>64)return new Ie({message:"User ID was not between 1 and 64 characters",code:"ERROR_INVALID_USER_ID_LENGTH",cause:e})}else if(e.name==="UnknownError")return new Ie({message:"The authenticator was unable to process the specified options, or could not create a new credential",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return new Ie({message:"a Non-Webauthn related error has occurred",code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e})}function TO({error:e,options:t}){const{publicKey:i}=t;if(!i)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new Ie({message:"Authentication ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else{if(e.name==="NotAllowedError")return new Ie({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="SecurityError"){const r=window.location.hostname;if($k(r)){if(i.rpId!==r)return new Ie({message:`The RP ID "${i.rpId}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new Ie({message:`${window.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="UnknownError")return new Ie({message:"The authenticator was unable to process the specified options, or could not create a new assertion signature",code:"ERROR_AUTHENTICATOR_GENERAL_ER
251ROR",cause:e})}return new Ie({message:"a Non-Webauthn related error has occurred",code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e})}class EO{createNewAbortSignal(){if(this.controller){const i=new Error("Cancelling existing WebAuthn API call for new one");i.name="AbortError",this.controller.abort(i)}const t=new AbortController;return this.controller=t,t.signal}cancelCeremony(){if(this.controller){const t=new Error("Manually cancelling existing WebAuthn API call");t.name="AbortError",this.controller.abort(t),this.controller=void 0}}}const Ch=new EO;function Zf(e){if(!e)throw new Error("Credential creation options are required");if(typeof PublicKeyCredential<"u"&&"parseCreationOptionsFromJSON"in PublicKeyCredential&&typeof PublicKeyCredential.parseCreationOptionsFromJSON=="function")return PublicKeyCredential.parseCreationOptionsFromJSON(e);const{challenge:t,user:i,excludeCredentials:r}=e,s=$l(e,["challenge","user","excludeCredentials"]),n=Js(t).buffer,o=Object.assign(Object.assign({},i),{id:Js(i.id).buffer}),c=Object.assign(Object.assign({},s),{challenge:n,user:o});if(r&&r.length>0){c.excludeCredentials=new Array(r.length);for(let l=0;l<r.length;l++){const d=r[l];c.excludeCredentials[l]=Object.assign(Object.assign({},d),{id:Js(d.id).buffer,type:d.type||"public-key",transports:d.transports})}}return c}function ey(e){if(!e)throw new Error("Credential request options are required");if(typeof PublicKeyCredential<"u"&&"parseRequestOptionsFromJSON"in PublicKeyCredential&&typeof PublicKeyCredential.parseRequestOptionsFromJSON=="function")return PublicKeyCredential.parseRequestOptionsFromJSON(e);const{challenge:t,allowCredentials:i}=e,r=$l(e,["challenge","allowCredentials"]),s=Js(t).buffer,n=Object.assign(Object.assign({},r),{challenge:s});if(i&&i.length>0){n.allowCredentials=new Array(i.length);for(let o=0;o<i.length;o++){const c=i[o];n.allowCredentials[o]=Object.assign(Object.assign({},c),{id:Js(c.id).buffer,type:c.type||"public-key",transports:c.transports})}}return n}function ty(e){var t;if("toJSON"in e&&typeof e.toJSON=="function")return e.toJSON();const i=e;return{id:e.id,rawId:e.id,response:{attestationObject:Hr(new Uint8Array(e.response.attestationObject)),clientDataJSON:Hr(new Uint8Array(e.response.clientDataJSON))},type:"public-key",clientExtensionResults:e.getClientExtensionResults(),authenticatorAttachment:(t=i.authenticatorAttachment)!==null&&t!==void 0?t:void 0}}function iy(e){var t;if("toJSON"in e&&typeof e.toJSON=="function")return e.toJSON();const i=e,r=e.getClientExtensionResults(),s=e.response;return{id:e.id,rawId:e.id,response:{authenticatorData:Hr(new Uint8Array(s.authenticatorData)),clientDataJSON:Hr(new Uint8Array(s.clientDataJSON)),signature:Hr(new Uint8Array(s.signature)),userHandle:s.userHandle?Hr(new Uint8Array(s.userHandle)):void 0},type:"public-key",clientExtensionResults:r,authenticatorAttachment:(t=i.authenticatorAttachment)!==null&&t!==void 0?t:void 0}}function $k(e){return e==="localhost"||/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i.test(e)}function nl(){var e,t;return!!(qe()&&"PublicKeyCredential"in window&&window.PublicKeyCredential&&"credentials"in navigator&&typeof((e=navigator==null?void 0:navigator.credentials)===null||e===void 0?void 0:e.create)=="function"&&typeof((t=navigator==null?void 0:navigator.credentials)===null||t===void 0?void 0:t.get)=="function")}async function Hk(e){try{const t=await navigator.credentials.create(e);return t?t instanceof PublicKeyCredential?{data:t,error:null}:{data:null,error:new sl("Browser returned unexpected credential type",t)}:{data:null,error:new sl("Empty credential response",t)}}catch(t){return{data:null,error:DO({error:t,options:e})}}}async function Vk(e){try{const t=await navigator.credentials.get(e);return t?t instanceof PublicKeyCredential?{data:t,error:null}:{data:null,error:new sl("Browser returned unexpected credential type",t)}:{data:null,error:new sl("Empty credential response",t)}}catch(t){return{data:null,error:TO({error:t,options:e})}}}const PO={hints:["security-key"],authenticatorSelection:{authenticatorAttachment:"cross-platform",requireResidentKey:!1,userVerification:"preferred",residentKey:"discouraged"},attestation:"direct"},_O={userVerification:"preferred",hints:["security-key"],attestation:"direct"};function al(...e){const t=s=>s!==null&&typeof s=="object"&&!Array.isArray(s),i=s=>s instanceof ArrayBuffer||ArrayBuffer.isView(s),r={};for(const s of e)if(s)for(const n in s){const o=s[n];if(o!==void 0)if(Array.isArray(o))r[n]=o;else if(i(o))r[n]=o;else if(t(o)){const c=r[n];t(c)?r[n]=al(c,o):r[n]=al(o)}else r[n]=o}return r}function IO(e,t){return al(PO,e,t||{})}function jO(e,t){return al(_O,e,t||{})}class MO{constructor(t){this.client=t,this.enroll=this._enroll.bind(this),this.challenge=this._challenge.bind(this),this.verify=this._verify.bind(this),this.authenticate=this._authenticate.bind(this),this.register=this._register.bind(this)}async _enroll(t){return this.client.mfa.enroll(Object.assign(Object.assign({},t),{factorType:"webauthn"}))}async _challenge({factorId:t,webauthn:i,friendlyName:r,signal:s},n){var o;try{const{data:c,error:l}=await this.client.mfa.challenge({factorId:t,webauthn:i});if(!c)return{data:null,error:l};const d=s??Ch.createNewAbortSignal();if(c.webauthn.type==="create"){const{user:u}=c.webauthn.credential_options.publicKey;if(!u.name){const h=r;if(h)u.name=`${u.id}:${h}`;else{const m=(await this.client.getUser()).data.user,w=((o=m==null?void 0:m.user_metadata)===null||o===void 0?void 0:o.name)||(m==null?void 0:m.email)||(m==null?void 0:m.id)||"User";u.name=`${u.id}:${w}`}}u.displayName||(u.displayName=u.name)}
251switch(c.webauthn.type){case"create":{const u=IO(c.webauthn.credential_options.publicKey,n==null?void 0:n.create),{data:h,error:g}=await Hk({publicKey:u,signal:d});return h?{data:{factorId:t,challengeId:c.id,webauthn:{type:c.webauthn.type,credential_response:h}},error:null}:{data:null,error:g}}case"request":{const u=jO(c.webauthn.credential_options.publicKey,n==null?void 0:n.request),{data:h,error:g}=await Vk(Object.assign(Object.assign({},c.webauthn.credential_options),{publicKey:u,signal:d}));return h?{data:{factorId:t,challengeId:c.id,webauthn:{type:c.webauthn.type,credential_response:h}},error:null}:{data:null,error:g}}}}catch(c){return L(c)?{data:null,error:c}:{data:null,error:new Zt("Unexpected error in challenge",c)}}}async _verify({challengeId:t,factorId:i,webauthn:r}){return this.client.mfa.verify({factorId:i,challengeId:t,webauthn:r})}async _authenticate({factorId:t,webauthn:{rpId:i=typeof window<"u"?window.location.hostname:void 0,rpOrigins:r=typeof window<"u"?[window.location.origin]:void 0,signal:s}={}},n){if(!i)return{data:null,error:new qa("rpId is required for WebAuthn authentication")};try{if(!nl())return{data:null,error:new Zt("Browser does not support WebAuthn",null)};const{data:o,error:c}=await this.challenge({factorId:t,webauthn:{rpId:i,rpOrigins:r},signal:s},{request:n});if(!o)return{data:null,error:c};const{webauthn:l}=o;return this._verify({factorId:t,challengeId:o.challengeId,webauthn:{type:l.type,rpId:i,rpOrigins:r,credential_response:l.credential_response}})}catch(o){return L(o)?{data:null,error:o}:{data:null,error:new Zt("Unexpected error in authenticate",o)}}}async _register({friendlyName:t,webauthn:{rpId:i=typeof window<"u"?window.location.hostname:void 0,rpOrigins:r=typeof window<"u"?[window.location.origin]:void 0,signal:s}={}},n){if(!i)return{data:null,error:new qa("rpId is required for WebAuthn registration")};try{if(!nl())return{data:null,error:new Zt("Browser does not support WebAuthn",null)};const{data:o,error:c}=await this._enroll({friendlyName:t});if(!o)return await this.client.mfa.listFactors().then(u=>{var h;return(h=u.data)===null||h===void 0?void 0:h.all.find(g=>g.factor_type==="webauthn"&&g.friendly_name===t&&g.status!=="unverified")}).then(u=>u?this.client.mfa.unenroll({factorId:u==null?void 0:u.id}):void 0),{data:null,error:c};const{data:l,error:d}=await this._challenge({factorId:o.id,friendlyName:o.friendly_name,webauthn:{rpId:i,rpOrigins:r},signal:s},{create:n});return l?this._verify({factorId:o.id,challengeId:l.challengeId,webauthn:{rpId:i,rpOrigins:r,type:l.webauthn.type,credential_response:l.webauthn.credential_response}}):{data:null,error:d}}catch(o){return L(o)?{data:null,error:o}:{data:null,error:new Zt("Unexpected error in register",o)}}}}xO();const RO={url:LR,storageKey:BR,autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,headers:UR,flowType:"implicit",debug:!1,hasCustomAuthorizationHeader:!1,throwOnError:!1,lockAcquireTimeout:5e3,skipAutoInitialize:!1,experimental:{}};async function ry(e,t,i){return await i()}const ks={};class za{get jwks(){var t,i;return(i=(t=ks[this.storageKey])===null||t===void 0?void 0:t.jwks)!==null&&i!==void 0?i:{keys:[]}}set jwks(t){ks[this.storageKey]=Object.assign(Object.assign({},ks[this.storageKey]),{jwks:t})}get jwks_cached_at(){var t,i;return(i=(t=ks[this.storageKey])===null||t===void 0?void 0:t.cachedAt)!==null&&i!==void 0?i:Number.MIN_SAFE_INTEGER}set jwks_cached_at(t){ks[this.storageKey]=Object.assign(Object.assign({},ks[this.storageKey]),{cachedAt:t})}constructor(t){var i,r,s,n;this.userStorage=null,this.memoryStorage=null,this.stateChangeEmitters=new Map,this.autoRefreshTicker=null,this.autoRefreshTickTimeout=null,this.visibilityChangedCallback=null,this.refreshingDeferred=null,this.initializePromise=null,this.detectSessionInUrl=!0,this.hasCustomAuthorizationHeader=!1,this.suppressGetSessionWarning=!1,this.lockAcquired=!1,this.pendingInLock=[],this.broadcastChannel=null,this.logger=console.log;const o=Object.assign(Object.assign({},RO),t);if(this.storageKey=o.storageKey,this.instanceID=(i=za.nextInstanceID[this.storageKey])!==null&&i!==void 0?i:0,za.nextInstanceID[this.storageKey]=this.instanceID+1,this.logDebugMessages=!!o.debug,typeof o.debug=="function"&&(this.logger=o.debug),this.instanceID>0&&qe()){const c=`${this._logPrefix()} Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key.`;console.warn(c),this.logDebugMessages&&console.trace(c)}if(this.persistSession=o.persistSession,this.autoRefreshToken=o.autoRefreshToken,this.experimental=(r=o.experimental)!==null&&r!==void 0?r:{},this.admin=new wO({url:o.url,headers:o.headers,fetch:o.fetch,experimental:this.experimental}),this.url=o.url,this.headers=o.headers,this.fetch=qk(o.fetch),this.lock=o.lock||ry,this.detectSessionInUrl=o.detectSessionInUrl,this.flowType=o.flowType,this.hasCustomAuthorizationHeader=o.hasCustomAuthorizationHeader,this.throwOnError=o.throwOnError,this.lockAcquireTimeout=o.lockAcquireTimeout,o.lock?this.lock=o.lock:this.persistSession&&qe()&&(!((s=globalThis==null?void 0:globalThis.navigator)===null||s===void 0)&&s.locks)?this.lock=kO:this.lock=ry,this.jwks||(this.jwks={keys:[]},this.jwks_cached_at=Number.MIN_SAFE_INTEGER),this.mfa={verify:this._verify.bind(this),enroll:this._enroll.bind(this),unenroll:this._unenroll.bind(this),challenge:this._challenge.bind(this),listFactors:this._listFactors.bind(this),challengeAndVerify:this._challengeAndVerify.bind(this),getAuthenticatorAssuranceLevel:this._getAuthenticatorAssuranceLevel.bind(this),webauthn:new MO(this)}
251,this.oauth={getAuthorizationDetails:this._getAuthorizationDetails.bind(this),approveAuthorization:this._approveAuthorization.bind(this),denyAuthorization:this._denyAuthorization.bind(this),listGrants:this._listOAuthGrants.bind(this),revokeGrant:this._revokeOAuthGrant.bind(this)},this.passkey={startRegistration:this._startPasskeyRegistration.bind(this),verifyRegistration:this._verifyPasskeyRegistration.bind(this),startAuthentication:this._startPasskeyAuthentication.bind(this),verifyAuthentication:this._verifyPasskeyAuthentication.bind(this),list:this._listPasskeys.bind(this),update:this._updatePasskey.bind(this),delete:this._deletePasskey.bind(this)},this.persistSession?(o.storage?this.storage=o.storage:Uk()?this.storage=globalThis.localStorage:(this.memoryStorage={},this.storage=Jf(this.memoryStorage)),o.userStorage&&(this.userStorage=o.userStorage)):(this.memoryStorage={},this.storage=Jf(this.memoryStorage)),qe()&&globalThis.BroadcastChannel&&this.persistSession&&this.storageKey){try{this.broadcastChannel=new globalThis.BroadcastChannel(this.storageKey)}catch(c){console.error("Failed to create a new BroadcastChannel, multi-tab state changes will not be available",c)}(n=this.broadcastChannel)===null||n===void 0||n.addEventListener("message",async c=>{this._debug("received broadcast notification from other tab or client",c);try{await this._notifyAllSubscribers(c.data.event,c.data.session,!1)}catch(l){this._debug("#broadcastChannel","error",l)}})}o.skipAutoInitialize||this.initialize().catch(c=>{this._debug("#initialize()","error",c)})}isThrowOnErrorEnabled(){return this.throwOnError}_returnResult(t){if(this.throwOnError&&t&&t.error)throw t.error;return t}_logPrefix(){return`GoTrueClient@${this.storageKey}:${this.instanceID} (${Nk}) ${new Date().toISOString()}`}_debug(...t){return this.logDebugMessages&&this.logger(this._logPrefix(),...t),this}async initialize(){return this.initializePromise?await this.initializePromise:(this.initializePromise=(async()=>await this._acquireLock(this.lockAcquireTimeout,async()=>await this._initialize()))(),await this.initializePromise)}async _initialize(){var t;try{let i={},r="none";if(qe()&&(i=eO(window.location.href),this._isImplicitGrantCallback(i)?r="implicit":await this._isPKCECallback(i)&&(r="pkce")),qe()&&this.detectSessionInUrl&&r!=="none"){const{data:s,error:n}=await this._getSessionFromURL(i,r);if(n){if(this._debug("#_initialize()","error detecting session from URL",n),HR(n)){const l=(t=n.details)===null||t===void 0?void 0:t.code;if(l==="identity_already_exists"||l==="identity_not_found"||l==="single_identity_not_deletable")return{error:n}}return{error:n}}const{session:o,redirectType:c}=s;return this._debug("#_initialize()","detected session in URL",o,"redirect type",c),await this._saveSession(o),setTimeout(async()=>{c==="recovery"?await this._notifyAllSubscribers("PASSWORD_RECOVERY",o):await this._notifyAllSubscribers("SIGNED_IN",o)},0),{error:null}}return await this._recoverAndRefresh(),{error:null}}catch(i){return L(i)?this._returnResult({error:i}):this._returnResult({error:new Zt("Unexpected error during initialization",i)})}finally{await this._handleVisibilityChange(),this._debug("#_initialize()","end")}}async signInAnonymously(t){var i,r,s;try{const n=await $(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{data:(r=(i=t==null?void 0:t.options)===null||i===void 0?void 0:i.data)!==null&&r!==void 0?r:{},gotrue_meta_security:{captcha_token:(s=t==null?void 0:t.options)===null||s===void 0?void 0:s.captchaToken}},xform:St}),{data:o,error:c}=n;if(c||!o)return this._returnResult({data:{user:null,session:null},error:c});const l=o.session,d=o.user;return o.session&&(await this._saveSession(o.session),await this._notifyAllSubscribers("SIGNED_IN",l)),this._returnResult({data:{user:d,session:l},error:null})}catch(n){if(L(n))return this._returnResult({data:{user:null,session:null},error:n});throw n}}async signUp(t){var i,r,s;try{let n;if("email"in t){const{email:u,password:h,options:g}=t;let m=null,w=null;this.flowType==="pkce"&&([m,w]=await ws(this.storage,this.storageKey)),n=await $(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,redirectTo:g==null?void 0:g.emailRedirectTo,body:{email:u,password:h,data:(i=g==null?void 0:g.data)!==null&&i!==void 0?i:{},gotrue_meta_security:{captcha_token:g==null?void 0:g.captchaToken},code_challenge:m,code_challenge_method:w},xform:St})}else if("phone"in t){const{phone:u,password:h,options:g}=t;n=await $(this.fetch,"POST",`${this.url}/signup`,{headers:this.headers,body:{phone:u,password:h,data:(r=g==null?void 0:g.data)!==null&&r!==void 0?r:{},channel:(s=g==null?void 0:g.channel)!==null&&s!==void 0?s:"sms",gotrue_meta_security:{captcha_token:g==null?void 0:g.captchaToken}},xform:St})}else throw new zo("You must provide either an email or phone number and a password");const{data:o,error:c}=n;if(c||!o)return await Ue(this.storage,`${this.storageKey}-code-verifier`),this._returnResult({data:{user:null,session:null},error:c});const l=o.session,d=o.user;return o.session&&(await this._saveSession(o.session),await this._notifyAllSubscribers("SIGNED_IN",l)),this._returnResult({data:{user:d,session:l},error:null})}catch(n){if(await Ue(this.storage,`${this.storageKey}-code-verifier`),L(n))return this._returnResult({data:{user:null,session:null},error:n});throw n}}async signInWithPassword(t){try{let i;if("email"in t){const{email:n,password:o,options:c}=t;i=await $(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{email:n,password:o,gotrue_meta_security:{captcha_token:c==null?void 0:c.captchaToken}},xform:Qf})}else if("phone"in t){const{phone:n,password:o,options:c}=t;i=await $(this.fetch,"POST",`${this.url}/token?grant_type=password`,{headers:this.headers,body:{phone:n,password:o,gotrue_meta_security:{captcha_token:c==null?void 0:c.captchaToken}},xform:Qf})}else throw new zo("You must provide either an email or phone number and a password");const{data:r,error:s}=i;if(s)return this._returnResult({data:{user:null,session:null},error:s});if(!r||!r.session||!r.user){const n=new vs;return this._returnResult({data:{user:null,session:null},error:n})}return r.session&&(await this._saveSession(r.session),await this._notifyAllSubscribers("SIGNED_IN",r.session)),this._returnResult({data:Object.assign({user:r.user,session:r.session},r.weak_password?{weakPassword:r.weak_password}:null),error:s})}catch(i){if(L(i))return this._returnResult({data:{user:null,session:null},error:i});throw i}}async signInWithOAuth(t){var i,r,s,n;return await this._handleProviderSignIn(t.provider,{redirectTo:(i=t.options)===null||i===void 0?void 0:i.redirectTo,scopes:(r=t.options)===null||r===void 0?void 0:r.scopes,queryParams:(s=t.options)===null||s===void 0?void 0:s.queryParams,skipBrowserRedirect:(n=t.options)===null||n===void 0?void 0:n.skipBrowserRedirect})}async exchangeCodeForSession(t){return await this.initializePromise,this._acquireLock(this.lockAcquireTimeout,async()=>this._exchangeCodeForSession(t))}async signInWithWeb3(t){const{chain:i}=t;switch(i){case"ethereum":return await this.signInWithEthereum(t);case"solana":return await this.signInWithSolana(t);default:throw new Error(`@supabase/auth-js: Unsupported chain "${i}"`)}}async signInWithEthereum(t){var i,r,s,n,o,c,l,d,u,h,g;let m,w;if("message"in t)m=t.message,w=t.signature;else{const{chain:v,wallet:k,statement:y,options:f}=t;let b;
251if(qe())if(typeof k=="object")b=k;else{const R=window;if("ethereum"in R&&typeof R.ethereum=="object"&&"request"in R.ethereum&&typeof R.ethereum.request=="function")b=R.ethereum;else throw new Error("@supabase/auth-js: No compatible Ethereum wallet interface on the window object (window.ethereum) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'ethereum', wallet: resolvedUserWallet }) instead.")}else{if(typeof k!="object"||!(f!=null&&f.url))throw new Error("@supabase/auth-js: Both wallet and url must be specified in non-browser environments.");b=k}const x=new URL((i=f==null?void 0:f.url)!==null&&i!==void 0?i:window.location.href),C=await b.request({method:"eth_requestAccounts"}).then(R=>R).catch(()=>{throw new Error("@supabase/auth-js: Wallet method eth_requestAccounts is missing or invalid")});if(!C||C.length===0)throw new Error("@supabase/auth-js: No accounts available. Please ensure the wallet is connected.");const D=Wk(C[0]);let T=(r=f==null?void 0:f.signInWithEthereum)===null||r===void 0?void 0:r.chainId;if(!T){const R=await b.request({method:"eth_chainId"});T=AO(R)}const I={domain:x.host,address:D,statement:y,uri:x.href,version:"1",chainId:T,nonce:(s=f==null?void 0:f.signInWithEthereum)===null||s===void 0?void 0:s.nonce,issuedAt:(o=(n=f==null?void 0:f.signInWithEthereum)===null||n===void 0?void 0:n.issuedAt)!==null&&o!==void 0?o:new Date,expirationTime:(c=f==null?void 0:f.signInWithEthereum)===null||c===void 0?void 0:c.expirationTime,notBefore:(l=f==null?void 0:f.signInWithEthereum)===null||l===void 0?void 0:l.notBefore,requestId:(d=f==null?void 0:f.signInWithEthereum)===null||d===void 0?void 0:d.requestId,resources:(u=f==null?void 0:f.signInWithEthereum)===null||u===void 0?void 0:u.resources};m=CO(I),w=await b.request({method:"personal_sign",params:[SO(m),D]})}try{const{data:v,error:k}=await $(this.fetch,"POST",`${this.url}/token?grant_type=web3`,{headers:this.headers,body:Object.assign({chain:"ethereum",message:m,signature:w},!((h=t.options)===null||h===void 0)&&h.captchaToken?{gotrue_meta_security:{captcha_token:(g=t.options)===null||g===void 0?void 0:g.captchaToken}}:null),xform:St});if(k)throw k;if(!v||!v.session||!v.user){const y=new vs;return this._returnResult({data:{user:null,session:null},error:y})}return v.session&&(await this._saveSession(v.session),await this._notifyAllSubscribers("SIGNED_IN",v.session)),this._returnResult({data:Object.assign({},v),error:k})}catch(v){if(L(v))return this._returnResult({data:{user:null,session:null},error:v});throw v}}async signInWithSolana(t){var i,r,s,n,o,c,l,d,u,h,g,m;let w,v;if("message"in t)w=t.message,v=t.signature;else{const{chain:k,wallet:y,statement:f,options:b}=t;let x;if(qe())if(typeof y=="object")x=y;else{const D=window;if("solana"in D&&typeof D.solana=="object"&&("signIn"in D.solana&&typeof D.solana.signIn=="function"||"signMessage"in D.solana&&typeof D.solana.signMessage=="function"))x=D.solana;else throw new Error("@supabase/auth-js: No compatible Solana wallet interface on the window object (window.solana) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'solana', wallet: resolvedUserWallet }) instead.")}else{if(typeof y!="object"||!(b!=null&&b.url))throw new Error("@supabase/auth-js: Both wallet and url must be specified in non-browser environments.");x=y}const C=new URL((i=b==null?void 0:b.url)!==null&&i!==void 0?i:window.location.href);if("signIn"in x&&x.signIn){const D=await x.signIn(Object.assign(Object.assign(Object.assign({issuedAt:new Date().toISOString()},b==null?void 0:b.signInWithSolana),{version:"1",domain:C.host,uri:C.href}),f?{statement:f}:null));let T;if(Array.isArray(D)&&D[0]&&typeof D[0]=="object")T=D[0];else if(D&&typeof D=="object"&&"signedMessage"in D&&"signature"in D)T=D;else throw new Error("@supabase/auth-js: Wallet method signIn() returned unrecognized value");if("signedMessage"in T&&"signature"in T&&(typeof T.signedMessage=="string"||T.signedMessage instanceof Uint8Array)&&T.signature instanceof Uint8Array)w=typeof T.signedMessage=="string"?T.signedMessage:new TextDecoder().decode(T.signedMessage),v=T.signature;else throw new Error("@supabase/auth-js: Wallet method signIn() API returned object without signedMessage and signature fields")}else{if(!("signMessage"in x)||typeof x.signMessage!="function"||!("publicKey"in x)||typeof x!="object"||!x.publicKey||!("toBase58"in x.publicKey)||typeof x.publicKey.toBase58!="function")throw new Error("@supabase/auth-js: Wallet does not have a compatible signMessage() and publicKey.toBase58() API");w=[`${C.host} wants you to sign in with your Solana account:`,x.publicKey.toBase58(),...f?["",f,""]:[""],"Version: 1",`URI: ${C.href}`,`Issued At: ${(s=(r=b==null?void 0:b.signInWithSolana)===null||r===void 0?void 0:r.issuedAt)!==null&&s!==void 0?s:new Date().toISOString()}`,...!((n=b==null?void 0:b.signInWithSolana)===null||n===void 0)&&n.notBefore?[`Not Before: ${b.signInWithSolana.notBefore}`]:[],...!((o=b==null?void 0:b.signInWithSolana)===null||o===void 0)&&o.expirationTime?[`Expiration Time: ${b.signInWithSolana.expirationTime}`]:[],...!((c=b==null?void 0:b.signInWithSolana)===null||c===void 0)&&c.chainId?[`Chain ID: ${b.signInWithSolana.chainId}`]:[],...!((l=b==null?void 0:b.signInWithSolana)===null||l===void 0)&&l.nonce?[`Nonce: ${b.signInWithSolana.nonce}`]:[],...!((d=b==null?void 0:b.signInWithSolana)===null||d===void 0)&&d.requestId?[`Request ID: ${b.signInWithSolana.requestId}`]:[],...!((h=(u=b==null?void 0:b.signInWithSolana)===null||u===void 0?void 0:u.resources)===null||h===void 0)&&h.length?["Resources",...b.signInWithSolana.resources.map(T=>`- ${T}`)]:[]].join(` 252`);const D=await x.signMessage(new TextEncoder().encode(w),"utf8");if(!D||!(D instanceof Uint8Array))throw new Error("@supabase/auth-js: Wallet signMessage() API returned an recognized value");v=D}}try{const{data:k,error:y}=await $(this.fetch,"POST",`${this.url}/token?grant_type=web3`,{headers:this.headers,body:Object.assign({chain:"solana",message:w,signature:Hr(v)},!((g=t.options)===null||g===void 0)&&g.captchaToken?{gotrue_meta_security:{captcha_token:(m=t.options)===null||m===void 0?void 0:m.captchaToken}}:null),xform:St});if(y)throw y;if(!k||!k.session||!k.user){const f=new vs;return this._returnResult({data:{user:null,session:null},error:f})}return k.session&&(await this._saveSession(k.session),await this._notifyAllSubscribers("SIGNED_IN",k.session)),this._returnResult({data:Object.assign({},k),error:y})}catch(k){if(L(k))return this._returnResult({data:{user:null,session:null},error:k});throw k}}async _exchangeCodeForSession(t){const i=await Nr(this.storage,`${this.storageKey}-code-verifier`),[r,s]=(i??"").split("/");try{if(!r&&this.flowType==="pkce")throw new VR;const{data:n,error:o}=await $(this.fetch,"POST",`${this.url}/token?grant_type=pkce`,{headers:this.headers,body:{auth_code:t,code_verifier:r},xform:St});if(await Ue(this.storage,`${this.storageKey}-code-verifier`),o)throw o;if(!n||!n.session||!n.user){const c=new vs;return this._returnResult({data:{user:null,session:null,redirectType:null},error:c})}return n.session&&(await this._saveSession(n.session),await this._notifyAllSubscribers(s==="recovery"?"PASSWORD_RECOVERY":"SIGNED_IN",n.session)),this._returnResult({data:Object.assign(Object.assign({},n),{redirectType:s??null}),error:o})}catch(n){if(await Ue(this.storage,`${this.storageKey}-code-verifier`),L(n))return this._returnResult({data:{user:null,session:null,redirectType:null},error:n});throw n}}async signInWithIdToken(t){try{const{options:i,provider:r,token:s,access_token:n,nonce:o}=t,c=await $(this.fetch,"POST",`${this.url}/token?grant_type=id_token`,{headers:this.headers,body:{provider:r,id_token:s,access_token:n,nonce:o,gotrue_meta_security:{captcha_token:i==null?void 0:i.captchaToken}},xform:St}),{data:l,error:d}=c;if(d)return this._returnResult({data:{user:null,session:null},error:d});if(!l||!l.session||!l.user){const u=new vs;return this._returnResult({data:{user:null,session:null},error:u})}return l.session&&(await this._saveSession(l.session),await this._notifyAllSubscribers("SIGNED_IN",l.session)),this._returnResult({data:l,error:d})}catch(i){if(L(i))return this._returnResult({data:{user:null,session:null},error:i});throw i}}async signInWithOtp(t){var i,r,s,n,o;try{if("email"in t){const{email:c,options:l}=t;let d=null,u=null;this.flowType==="pkce"&&([d,u]=await ws(this.storage,this.storageKey));const{error:h}=await $(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{email:c,data:(i=l==null?void 0:l.data)!==null&&i!==void 0?i:{},create_user:(r=l==null?void 0:l.shouldCreateUser)!==null&&r!==void 0?r:!0,gotrue_meta_security:{captcha_token:l==null?void 0:l.captchaToken},code_challenge:d,code_challenge_method:u},redirectTo:l==null?void 0:l.emailRedirectTo});return this._returnResult({data:{user:null,session:null},error:h})}if("phone"in t){const{phone:c,options:l}=t,{data:d,error:u}=await $(this.fetch,"POST",`${this.url}/otp`,{headers:this.headers,body:{phone:c,data:(s=l==null?void 0:l.data)!==null&&s!==void 0?s:{},create_user:(n=l==null?void 0:l.shouldCreateUser)!==null&&n!==void 0?n:!0,gotrue_meta_security:{captcha_token:l==null?void 0:l.captchaToken},channel:(o=l==null?void 0:l.channel)!==null&&o!==void 0?o:"sms"}});return this._returnResult({data:{user:null,session:null,messageId:d==null?void 0:d.message_id},error:u})}throw new zo("You must provide either an email or phone number.")}catch(c){if(await Ue(this.storage,`${this.storageKey}-code-verifier`),L(c))return this._returnResult({data:{user:null,session:null},error:c});throw c}}async verifyOtp(t){var i,r;try{let s,n;"options"in t&&(s=(i=t.options)===null||i===void 0?void 0:i.redirectTo,n=(r=t.options)===null||r===void 0?void 0:r.captchaToken);const{data:o,error:c}=await $(this.fetch,"POST",`${this.url}/verify`,{headers:this.headers,body:Object.assign(Object.assign({},t),{gotrue_meta_security:{captcha_token:n}}),redirectTo:s,xform:St});if(c)throw c;if(!o)throw new Error("An error occurred on token verification.");const l=o.session,d=o.user;return l!=null&&l.access_token&&(await this._saveSession(l),await this._notifyAllSubscribers(t.type=="recovery"?"PASSWORD_RECOVERY":"SIGNED_IN",l)),this._returnResult({data:{user:d,session:l},error:null})}catch(s){if(L(s))return this._returnResult({data:{user:null,session:null},error:s});throw s}}async signInWithSSO(t){var i,r,s,n,o;try{let c=null,l=null;this.flowType==="pkce"&&([c,l]=await ws(this.storage,this.storageKey));const d=await $(this.fetch,"POST",`${this.url}/sso`,{body:Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},"providerId"in t?{provider_id:t.providerId}:null),"domain"in t?{domain:t.domain}:null),{redirect_to:(r=(i=t.options)===null||i===void 0?void 0:i.redirectTo)!==null&&r!==void 0?r:void 0}),!((s=t==null?void 0:t.options)===null||s===void 0)&&s.captchaToken?{gotrue_meta_security:{captcha_token:t.options.captchaToken}}:null),{skip_http_redirect:!0,code_challenge:c,code_challenge_method:l}),headers:this.headers,xform:yO});return!((n=d.data)===null||n===void 0)&&n.url&&qe()&&!(!((o=t.options)===null||o===void 0)&&o.skipBrowserRedirect)&&window.location.assign(d.data.url),this._returnResult(d)}catch(c){if(await Ue(this.storage,`${this.storageKey}-code-verifier`),L(c))return this._returnResult({data:null,error:c});throw c}}async reauthenticate(){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._reauthenticate())}async _reauthenticate(){try{return await this._useSession(async t=>{const{data:{session:i},error:r}=t;if(r)throw r;if(!i)throw new Ne;const{error:s}=await $(this.fetch,"GET",`${this.url}/reauthenticate`,{headers:this.headers,jwt:i.access_token});return this._returnResult({data:{user:null,session:null},error:s})})}catch(t){if(L(t))return this._returnResult({data:{user:null,session:null},error:t});throw t}}async resend(t){try{const i=`${this.url}/resend`;if("email"in t){const{email:r,type:s,options:n}=t,{error:o}=await $(this.fetch,"POST",i,{headers:this.headers,body:{email:r,type:s,gotrue_meta_security:{captcha_token:n==null?void 0:n.captchaToken}},redirectTo:n==null?void 0:n.emailRedirectTo});return this._returnResult({data:{user:null,session:null},error:o})}else if("phone"in t){const{phone:r,type:s,options:n}=t,{data:o,error:c}=await $(this.fetch,"POST",i,{headers:this.headers,body:{phone:r,type:s,gotrue_meta_security:{captcha_token:n==null?void 0:n.captchaToken}}});return this._returnResult({data:{user:null,session:null,messageId:o==null?void 0:o.message_id},error:c})}throw new zo("You must provide either an email or phone number and a type")}catch(i){if(L(i))return this._returnResult({data:{user:null,session:null},error:i});throw i}}async getSession(){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>this._useSession(async i=>i))}async _acquireLock(t,i){this._debug("#_acquireLock","begin",t);try{if(this.lockAcquired){const r=this.pendingInLock.length?this.pendingInLock[this.pendingInLock.length-1]:Promise.resolve(),s=(async()=>(await r,await i()))();return this.pendingInLock.push((async()=>{try{await s}catch{}})()),s}return await this.lock(`lock:${this.storageKey}`,t,async()=>{this._debug("#_acquireLock","lock acquired for storage key",this.storageKey);try{this.lockAcquired=!0;const r=i();for(this.pendingInLock.push((async()=>{try{await r}catch{}})()),await r;this.pendingInLock.length;){const s=[...this.pendingInLock];await Promise.all(s),this.pendingInLock.splice(0,s.length)}return await r}finally{this._debug("#_acquireLock","lock released for storage key",this.storageKey),this.lockAcquired=!1}})}finally{this._debug("#_acquireLock","end")}}async _useSession(t){this._debug("#_useSession","begin");try{const i=await this.__loadSession();return await t(i)}finally{this._debug("#_useSession","end")}}async __loadSession(){this._debug("#__loadSession()","begin"),this.lockAcquired||this._debug("#__loadSession()","used outside of an acquired lock!",new Error().stack);try{let t=null;const i=await Nr(this.storage,this.storageKey);
252if(this._debug("#getSession()","session from storage",i),i!==null&&(this._isValidSession(i)?t=i:(this._debug("#getSession()","session from storage is not valid"),await this._removeSession())),!t)return{data:{session:null},error:null};const r=t.expires_at?t.expires_at*1e3-Date.now()<Ud:!1;if(this._debug("#__loadSession()",`session has${r?"":" not"} expired`,"expires_at",t.expires_at),!r){if(this.userStorage){const o=await Nr(this.userStorage,this.storageKey+"-user");o!=null&&o.user?t.user=o.user:t.user=zd()}if(this.storage.isServer&&t.user&&!t.user.__isUserNotAvailableProxy){const o={value:this.suppressGetSessionWarning};t.user=mO(t.user,o),o.value&&(this.suppressGetSessionWarning=!0)}return{data:{session:t},error:null}}const{data:s,error:n}=await this._callRefreshToken(t.refresh_token);return n?this._returnResult({data:{session:null},error:n}):this._returnResult({data:{session:s},error:null})}finally{this._debug("#__loadSession()","end")}}async getUser(t){if(t)return await this._getUser(t);await this.initializePromise;const i=await this._acquireLock(this.lockAcquireTimeout,async()=>await this._getUser());return i.data.user&&(this.suppressGetSessionWarning=!0),i}async _getUser(t){try{return t?await $(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:t,xform:sr}):await this._useSession(async i=>{var r,s,n;const{data:o,error:c}=i;if(c)throw c;return!(!((r=o.session)===null||r===void 0)&&r.access_token)&&!this.hasCustomAuthorizationHeader?{data:{user:null},error:new Ne}:await $(this.fetch,"GET",`${this.url}/user`,{headers:this.headers,jwt:(n=(s=o.session)===null||s===void 0?void 0:s.access_token)!==null&&n!==void 0?n:void 0,xform:sr})})}catch(i){if(L(i))return qo(i)&&(await this._removeSession(),await Ue(this.storage,`${this.storageKey}-code-verifier`)),this._returnResult({data:{user:null},error:i});throw i}}async updateUser(t,i={}){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._updateUser(t,i))}async _updateUser(t,i={}){try{return await this._useSession(async r=>{const{data:s,error:n}=r;if(n)throw n;if(!s.session)throw new Ne;const o=s.session;let c=null,l=null;this.flowType==="pkce"&&t.email!=null&&([c,l]=await ws(this.storage,this.storageKey));const{data:d,error:u}=await $(this.fetch,"PUT",`${this.url}/user`,{headers:this.headers,redirectTo:i==null?void 0:i.emailRedirectTo,body:Object.assign(Object.assign({},t),{code_challenge:c,code_challenge_method:l}),jwt:o.access_token,xform:sr});if(u)throw u;return o.user=d.user,await this._saveSession(o),await this._notifyAllSubscribers("USER_UPDATED",o),this._returnResult({data:{user:o.user},error:null})})}catch(r){if(await Ue(this.storage,`${this.storageKey}-code-verifier`),L(r))return this._returnResult({data:{user:null},error:r});throw r}}async setSession(t){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._setSession(t))}async _setSession(t){try{if(!t.access_token||!t.refresh_token)throw new Ne;const i=Date.now()/1e3;let r=i,s=!0,n=null;const{payload:o}=$o(t.access_token);if(o.exp&&(r=o.exp,s=r<=i),s){const{data:c,error:l}=await this._callRefreshToken(t.refresh_token);if(l)return this._returnResult({data:{user:null,session:null},error:l});if(!c)return{data:{user:null,session:null},error:null};n=c}else{const{data:c,error:l}=await this._getUser(t.access_token);if(l)return this._returnResult({data:{user:null,session:null},error:l});n={access_token:t.access_token,refresh_token:t.refresh_token,user:c.user,token_type:"bearer",expires_in:r-i,expires_at:r},await this._saveSession(n),await this._notifyAllSubscribers("SIGNED_IN",n)}return this._returnResult({data:{user:n.user,session:n},error:null})}catch(i){if(L(i))return this._returnResult({data:{session:null,user:null},error:i});throw i}}async refreshSession(t){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._refreshSession(t))}async _refreshSession(t){try{return await this._useSession(async i=>{var r;if(!t){const{data:o,error:c}=i;if(c)throw c;t=(r=o.session)!==null&&r!==void 0?r:void 0}if(!(t!=null&&t.refresh_token))throw new Ne;const{data:s,error:n}=await this._callRefreshToken(t.refresh_token);return n?this._returnResult({data:{user:null,session:null},error:n}):s?this._returnResult({data:{user:s.user,session:s},error:null}):this._returnResult({data:{user:null,session:null},error:null})})}catch(i){if(L(i))return this._returnResult({data:{user:null,session:null},error:i});throw i}}async _getSessionFromURL(t,i){var r;try{if(!qe())throw new Wo("No browser detected.");
252if(t.error||t.error_description||t.error_code)throw new Wo(t.error_description||"Error in URL with unspecified error_description",{error:t.error||"unspecified_error",code:t.error_code||"unspecified_code"});switch(i){case"implicit":if(this.flowType==="pkce")throw new zf("Not a valid PKCE flow url.");break;case"pkce":if(this.flowType==="implicit")throw new Wo("Not a valid implicit grant flow url.");break;default:}if(i==="pkce"){if(this._debug("#_initialize()","begin","is PKCE flow",!0),!t.code)throw new zf("No code detected.");const{data:b,error:x}=await this._exchangeCodeForSession(t.code);if(x)throw x;const C=new URL(window.location.href);return C.searchParams.delete("code"),window.history.replaceState(window.history.state,"",C.toString()),{data:{session:b.session,redirectType:(r=b.redirectType)!==null&&r!==void 0?r:null},error:null}}const{provider_token:s,provider_refresh_token:n,access_token:o,refresh_token:c,expires_in:l,expires_at:d,token_type:u}=t;if(!o||!l||!c||!u)throw new Wo("No session defined in URL");const h=Math.round(Date.now()/1e3),g=parseInt(l);let m=h+g;d&&(m=parseInt(d));const w=m-h;w*1e3<=Ss&&console.warn(`@supabase/gotrue-js: Session as retrieved from URL expires in ${w}s, should have been closer to ${g}s`);const v=m-g;h-v>=120?console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued over 120s ago, URL could be stale",v,m,h):h-v<0&&console.warn("@supabase/gotrue-js: Session as retrieved from URL was issued in the future? Check the device clock for skew",v,m,h);const{data:k,error:y}=await this._getUser(o);if(y)throw y;const f={provider_token:s,provider_refresh_token:n,access_token:o,expires_in:g,expires_at:m,refresh_token:c,token_type:u,user:k.user};return window.location.hash="",this._debug("#_getSessionFromURL()","clearing window.location.hash"),this._returnResult({data:{session:f,redirectType:t.type},error:null})}catch(s){if(L(s))return this._returnResult({data:{session:null,redirectType:null},error:s});throw s}}_isImplicitGrantCallback(t){return typeof this.detectSessionInUrl=="function"?this.detectSessionInUrl(new URL(window.location.href),t):!!(t.access_token||t.error_description)}async _isPKCECallback(t){const i=await Nr(this.storage,`${this.storageKey}-code-verifier`);return!!(t.code&&i)}async signOut(t={scope:"global"}){return await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>await this._signOut(t))}async _signOut({scope:t}={scope:"global"}){return await this._useSession(async i=>{var r;const{data:s,error:n}=i;if(n&&!qo(n))return this._returnResult({error:n});const o=(r=s.session)===null||r===void 0?void 0:r.access_token;if(o){const{error:c}=await this.admin.signOut(o,t);if(c&&!($R(c)&&(c.status===404||c.status===401||c.status===403)||qo(c)))return this._returnResult({error:c})}return t!=="others"&&(await this._removeSession(),await Ue(this.storage,`${this.storageKey}-code-verifier`)),this._returnResult({error:null})})}onAuthStateChange(t){const i=ZR(),r={id:i,callback:t,unsubscribe:()=>{this._debug("#unsubscribe()","state change callback with id removed",i),this.stateChangeEmitters.delete(i)}};return this._debug("#onAuthStateChange()","registered callback with id",i),this.stateChangeEmitters.set(i,r),(async()=>(await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>{this._emitInitialSession(i)})))(),{data:{subscription:r}}}async _emitInitialSession(t){return await this._useSession(async i=>{var r,s;try{const{data:{session:n},error:o}=i;if(o)throw o;await((r=this.stateChangeEmitters.get(t))===null||r===void 0?void 0:r.callback("INITIAL_SESSION",n)),this._debug("INITIAL_SESSION","callback id",t,"session",n)}catch(n){await((s=this.stateChangeEmitters.get(t))===null||s===void 0?void 0:s.callback("INITIAL_SESSION",null)),this._debug("INITIAL_SESSION","callback id",t,"error",n),qo(n)?console.warn(n):console.error(n)}})}async resetPasswordForEmail(t,i={}){let r=null,s=null;this.flowType==="pkce"&&([r,s]=await ws(this.storage,this.storageKey,!0));try{return await $(this.fetch,"POST",`${this.url}/recover`,{body:{email:t,code_challenge:r,code_challenge_method:s,gotrue_meta_security:{captcha_token:i.captchaToken}},headers:this.headers,redirectTo:i.redirectTo})}catch(n){if(await Ue(this.storage,`${this.storageKey}-code-verifier`),L(n))return this._returnResult({data:null,error:n});throw n}}async getUserIdentities(){var t;try{const{data:i,error:r}=await this.getUser();if(r)throw r;return this._returnResult({data:{identities:(t=i.user.identities)!==null&&t!==void 0?t:[]},error:null})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async linkIdentity(t){return"token"in t?this.linkIdentityIdToken(t):this.linkIdentityOAuth(t)}async linkIdentityOAuth(t){var i;try{const{data:r,error:s}=await this._useSession(async n=>{var o,c,l,d,u;const{data:h,error:g}=n;if(g)throw g;const m=await this._getUrlForProvider(`${this.url}/user/identities/authorize`,t.provider,{redirectTo:(o=t.options)===null||o===void 0?void 0:o.redirectTo,scopes:(c=t.options)===null||c===void 0?void 0:c.scopes,queryParams:(l=t.options)===null||l===void 0?void 0:l.queryParams,skipBrowserRedirect:!0});return await $(this.fetch,"GET",m,{headers:this.headers,jwt:(u=(d=h.session)===null||d===void 0?void 0:d.access_token)!==null&&u!==void 0?u:void 0})});if(s)throw s;return qe()&&!(!((i=t.options)===null||i===void 0)&&i.skipBrowserRedirect)&&window.location.assign(r==null?void 0:r.url),this._returnResult({data:{provider:t.provider,url:r==null?void 0:r.url},error:null})}catch(r){if(L(r))return this._returnResult({data:{provider:t.provider,url:null},error:r});throw r}}async linkIdentityIdToken(t){return await this._useSession(async i=>{var r;try{const{error:s,data:{session:n}}=i;if(s)throw s;const{options:o,provider:c,token:l,access_token:d,nonce:u}=t,h=await $(this.fetch,"POST",`${this.url}/token?grant_type=id_token`,{headers:this.headers,jwt:(r=n==null?void 0:n.access_token)!==null&&r!==void 0?r:void 0,body:{provider:c,id_token:l,access_token:d,nonce:u,link_identity:!0,gotrue_meta_security:{captcha_token:o==null?void 0:o.captchaToken}},xform:St}),{data:g,error:m}=h;return m?this._returnResult({data:{user:null,session:null},error:m}):!g||!g.session||!g.user?this._returnResult({data:{user:null,session:null},error:new vs}):(g.session&&(await this._saveSession(g.session),await this._notifyAllSubscribers("USER_UPDATED",g.session)),this._returnResult({data:g,error:m}))}catch(s){if(await Ue(this.storage,`${this.storageKey}-code-verifier`),L(s))return this._returnResult({data:{user:null,session:null},error:s});throw s}})}async unlinkIdentity(t){try{return await this._useSession(async i=>{var r,s;const{data:n,error:o}=i;if(o)throw o;
252return await $(this.fetch,"DELETE",`${this.url}/user/identities/${t.identity_id}`,{headers:this.headers,jwt:(s=(r=n.session)===null||r===void 0?void 0:r.access_token)!==null&&s!==void 0?s:void 0})})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async _refreshAccessToken(t){const i=`#_refreshAccessToken(${t.substring(0,5)}...)`;this._debug(i,"begin");try{const r=Date.now();return await rO(async s=>(s>0&&await iO(200*Math.pow(2,s-1)),this._debug(i,"refreshing attempt",s),await $(this.fetch,"POST",`${this.url}/token?grant_type=refresh_token`,{body:{refresh_token:t},headers:this.headers,xform:St})),(s,n)=>{const o=200*Math.pow(2,s);return n&&qd(n)&&Date.now()+o-r<Ss})}catch(r){if(this._debug(i,"error",r),L(r))return this._returnResult({data:{session:null,user:null},error:r});throw r}finally{this._debug(i,"end")}}_isValidSession(t){return typeof t=="object"&&t!==null&&"access_token"in t&&"refresh_token"in t&&"expires_at"in t}async _handleProviderSignIn(t,i){const r=await this._getUrlForProvider(`${this.url}/authorize`,t,{redirectTo:i.redirectTo,scopes:i.scopes,queryParams:i.queryParams});return this._debug("#_handleProviderSignIn()","provider",t,"options",i,"url",r),qe()&&!i.skipBrowserRedirect&&window.location.assign(r),{data:{provider:t,url:r},error:null}}async _recoverAndRefresh(){var t,i;const r="#_recoverAndRefresh()";this._debug(r,"begin");try{const s=await Nr(this.storage,this.storageKey);if(s&&this.userStorage){let o=await Nr(this.userStorage,this.storageKey+"-user");!this.storage.isServer&&Object.is(this.storage,this.userStorage)&&!o&&(o={user:s.user},await Cs(this.userStorage,this.storageKey+"-user",o)),s.user=(t=o==null?void 0:o.user)!==null&&t!==void 0?t:zd()}else if(s&&!s.user&&!s.user){const o=await Nr(this.storage,this.storageKey+"-user");o&&(o!=null&&o.user)?(s.user=o.user,await Ue(this.storage,this.storageKey+"-user"),await Cs(this.storage,this.storageKey,s)):s.user=zd()}if(this._debug(r,"session from storage",s),!this._isValidSession(s)){this._debug(r,"session is not valid"),s!==null&&await this._removeSession();return}const n=((i=s.expires_at)!==null&&i!==void 0?i:1/0)*1e3-Date.now()<Ud;if(this._debug(r,`session has${n?"":" not"} expired with margin of ${Ud}s`),n){if(this.autoRefreshToken&&s.refresh_token){const{error:o}=await this._callRefreshToken(s.refresh_token);o&&(console.error(o),qd(o)||(this._debug(r,"refresh failed with a non-retryable error, removing the session",o),await this._removeSession()))}}else if(s.user&&s.user.__isUserNotAvailableProxy===!0)try{const{data:o,error:c}=await this._getUser(s.access_token);!c&&(o!=null&&o.user)?(s.user=o.user,await this._saveSession(s),await this._notifyAllSubscribers("SIGNED_IN",s)):this._debug(r,"could not get user data, skipping SIGNED_IN notification")}catch(o){console.error("Error getting user data:",o),this._debug(r,"error getting user data, skipping SIGNED_IN notification",o)}else await this._notifyAllSubscribers("SIGNED_IN",s)}catch(s){this._debug(r,"error",s),console.error(s);return}finally{this._debug(r,"end")}}async _callRefreshToken(t){var i,r;if(!t)throw new Ne;if(this.refreshingDeferred)return this.refreshingDeferred.promise;const s=`#_callRefreshToken(${t.substring(0,5)}...)`;this._debug(s,"begin");try{this.refreshingDeferred=new Hl;const{data:n,error:o}=await this._refreshAccessToken(t);if(o)throw o;if(!n.session)throw new Ne;await this._saveSession(n.session),await this._notifyAllSubscribers("TOKEN_REFRESHED",n.session);const c={data:n.session,error:null};return this.refreshingDeferred.resolve(c),c}catch(n){if(this._debug(s,"error",n),L(n)){const o={data:null,error:n};return qd(n)||await this._removeSession(),(i=this.refreshingDeferred)===null||i===void 0||i.resolve(o),o}throw(r=this.refreshingDeferred)===null||r===void 0||r.reject(n),n}finally{this.refreshingDeferred=null,this._debug(s,"end")}}async _notifyAllSubscribers(t,i,r=!0){const s=`#_notifyAllSubscribers(${t})`;this._debug(s,"begin",i,`broadcast = ${r}`);try{this.broadcastChannel&&r&&this.broadcastChannel.postMessage({event:t,session:i});const n=[],o=Array.from(this.stateChangeEmitters.values()).map(async c=>{try{await c.callback(t,i)}catch(l){n.push(l)}});if(await Promise.all(o),n.length>0){for(let c=0;c<n.length;c+=1)console.error(n[c]);throw n[0]}}finally{this._debug(s,"end")}}async _saveSession(t){this._debug("#_saveSession()",t),this.suppressGetSessionWarning=!0,await Ue(this.storage,`${this.storageKey}-code-verifier`);const i=Object.assign({},t),r=i.user&&i.user.__isUserNotAvailableProxy===!0;if(this.userStorage){!r&&i.user&&await Cs(this.userStorage,this.storageKey+"-user",{user:i.user});const s=Object.assign({},i);delete s.user;const n=Gf(s);await Cs(this.storage,this.storageKey,n)}else{const s=Gf(i);await Cs(this.storage,this.storageKey,s)}}async _removeSession(){this._debug("#_removeSession()"),this.suppressGetSessionWarning=!1,await Ue(this.storage,this.storageKey),await Ue(this.storage,this.storageKey+"-code-verifier"),await Ue(this.storage,this.storageKey+"-user"),this.userStorage&&await Ue(this.userStorage,this.storageKey+"-user"),await this._notifyAllSubscribers("SIGNED_OUT",null)}_removeVisibilityChangedCallback(){this._debug("#_removeVisibilityChangedCallback()");const t=this.visibilityChangedCallback;this.visibilityChangedCallback=null;try{t&&qe()&&(window!=null&&window.removeEventListener)&&window.removeEventListener("visibilitychange",t)}
252catch(i){console.error("removing visibilitychange callback failed",i)}}async _startAutoRefresh(){await this._stopAutoRefresh(),this._debug("#_startAutoRefresh()");const t=setInterval(()=>this._autoRefreshTokenTick(),Ss);this.autoRefreshTicker=t,t&&typeof t=="object"&&typeof t.unref=="function"?t.unref():typeof Deno<"u"&&typeof Deno.unrefTimer=="function"&&Deno.unrefTimer(t);const i=setTimeout(async()=>{await this.initializePromise,await this._autoRefreshTokenTick()},0);this.autoRefreshTickTimeout=i,i&&typeof i=="object"&&typeof i.unref=="function"?i.unref():typeof Deno<"u"&&typeof Deno.unrefTimer=="function"&&Deno.unrefTimer(i)}async _stopAutoRefresh(){this._debug("#_stopAutoRefresh()");const t=this.autoRefreshTicker;this.autoRefreshTicker=null,t&&clearInterval(t);const i=this.autoRefreshTickTimeout;this.autoRefreshTickTimeout=null,i&&clearTimeout(i)}async startAutoRefresh(){this._removeVisibilityChangedCallback(),await this._startAutoRefresh()}async stopAutoRefresh(){this._removeVisibilityChangedCallback(),await this._stopAutoRefresh()}async _autoRefreshTokenTick(){this._debug("#_autoRefreshTokenTick()","begin");try{await this._acquireLock(0,async()=>{try{const t=Date.now();try{return await this._useSession(async i=>{const{data:{session:r}}=i;if(!r||!r.refresh_token||!r.expires_at){this._debug("#_autoRefreshTokenTick()","no session");return}const s=Math.floor((r.expires_at*1e3-t)/Ss);this._debug("#_autoRefreshTokenTick()",`access token expires in ${s} ticks, a tick lasts ${Ss}ms, refresh threshold is ${kh} ticks`),s<=kh&&await this._callRefreshToken(r.refresh_token)})}catch(i){console.error("Auto refresh tick failed with error. This is likely a transient error.",i)}}finally{this._debug("#_autoRefreshTokenTick()","end")}})}catch(t){if(t.isAcquireTimeout||t instanceof zk)this._debug("auto refresh token tick lock not available");else throw t}}async _handleVisibilityChange(){if(this._debug("#_handleVisibilityChange()"),!qe()||!(window!=null&&window.addEventListener))return this.autoRefreshToken&&this.startAutoRefresh(),!1;try{this.visibilityChangedCallback=async()=>{try{await this._onVisibilityChanged(!1)}catch(t){this._debug("#visibilityChangedCallback","error",t)}},window==null||window.addEventListener("visibilitychange",this.visibilityChangedCallback),await this._onVisibilityChanged(!0)}catch(t){console.error("_handleVisibilityChange",t)}}async _onVisibilityChanged(t){const i=`#_onVisibilityChanged(${t})`;this._debug(i,"visibilityState",document.visibilityState),document.visibilityState==="visible"?(this.autoRefreshToken&&this._startAutoRefresh(),t||(await this.initializePromise,await this._acquireLock(this.lockAcquireTimeout,async()=>{if(document.visibilityState!=="visible"){this._debug(i,"acquired the lock to recover the session, but the browser visibilityState is no longer visible, aborting");return}await this._recoverAndRefresh()}))):document.visibilityState==="hidden"&&this.autoRefreshToken&&this._stopAutoRefresh()}async _getUrlForProvider(t,i,r){const s=[`provider=${encodeURIComponent(i)}`];if(r!=null&&r.redirectTo&&s.push(`redirect_to=${encodeURIComponent(r.redirectTo)}`),r!=null&&r.scopes&&s.push(`scopes=${encodeURIComponent(r.scopes)}`),this.flowType==="pkce"){const[n,o]=await ws(this.storage,this.storageKey),c=new URLSearchParams({code_challenge:`${encodeURIComponent(n)}`,code_challenge_method:`${encodeURIComponent(o)}`});s.push(c.toString())}if(r!=null&&r.queryParams){const n=new URLSearchParams(r.queryParams);s.push(n.toString())}return r!=null&&r.skipBrowserRedirect&&s.push(`skip_http_redirect=${r.skipBrowserRedirect}`),`${t}?${s.join("&")}`}async _unenroll(t){try{return await this._useSession(async i=>{var r;const{data:s,error:n}=i;return n?this._returnResult({data:null,error:n}):await $(this.fetch,"DELETE",`${this.url}/factors/${t.factorId}`,{headers:this.headers,jwt:(r=s==null?void 0:s.session)===null||r===void 0?void 0:r.access_token})})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async _enroll(t){try{return await this._useSession(async i=>{var r,s;const{data:n,error:o}=i;if(o)return this._returnResult({data:null,error:o});const c=Object.assign({friendly_name:t.friendlyName,factor_type:t.factorType},t.factorType==="phone"?{phone:t.phone}:t.factorType==="totp"?{issuer:t.issuer}:{}),{data:l,error:d}=await $(this.fetch,"POST",`${this.url}/factors`,{body:c,headers:this.headers,jwt:(r=n==null?void 0:n.session)===null||r===void 0?void 0:r.access_token});return d?this._returnResult({data:null,error:d}):(t.factorType==="totp"&&l.type==="totp"&&(!((s=l==null?void 0:l.totp)===null||s===void 0)&&s.qr_code)&&(l.totp.qr_code=`data:image/svg+xml;utf-8,${l.totp.qr_code}`),this._returnResult({data:l,error:null}))})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async _verify(t){return this._acquireLock(this.lockAcquireTimeout,async()=>{try{return await this._useSession(async i=>{var r;const{data:s,error:n}=i;if(n)return this._returnResult({data:null,error:n});const o=Object.assign({challenge_id:t.challengeId},"webauthn"in t?{webauthn:Object.assign(Object.assign({},t.webauthn),{credential_response:t.webauthn.type==="create"?ty(t.webauthn.credential_response):iy(t.webauthn.credential_response)})}:{code:t.code}),{data:c,error:l}=await $(this.fetch,"POST",`${this.url}/factors/${t.factorId}/verify`,{body:o,headers:this.headers,jwt:(r=s==null?void 0:s.session)===null||r===void 0?void 0:r.access_token});return l?this._returnResult({data:null,error:l}):(await this._saveSession(Object.assign({expires_at:Math.round(Date.now()/1e3)+c.expires_in},c)),await this._notifyAllSubscribers("MFA_CHALLENGE_VERIFIED",c),this._returnResult({data:c,error:l}))})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}})}async _challenge(t){return this._acquireLock(this.lockAcquireTimeout,async()=>{try{return await this._useSession(async i=>{var r;const{data:s,error:n}=i;if(n)return this._returnResult({data:null,error:n});const o=await $(this.fetch,"POST",`${this.url}/factors/${t.factorId}/challenge`,{body:t,headers:this.headers,jwt:(r=s==null?void 0:s.session)===null||r===void 0?void 0:r.access_token});if(o.error)return o;const{data:c}=o;if(c.type!=="webauthn")return{data:c,error:null};switch(c.webauthn.type){case"create":return{data:Object.assign(Object.assign({},c),{webauthn:Object.assign(Object.assign({},c.webauthn),{credential_options:Object.assign(Object.assign({},c.webauthn.credential_options),{publicKey:Zf(c.webauthn.credential_options.publicKey)})})}),error:null};case"request":return{data:Object.assign(Object.assign({},c),{webauthn:Object.assign(Object.assign({},c.webauthn),{credential_options:Object.assign(Object.assign({},c.webauthn.credential_options),{publicKey:ey(c.webauthn.credential_options.publicKey)})})}),error:null}}})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}})}async _challengeAndVerify(t){const{data:i,error:r}=await this._challenge({factorId:t.factorId});return r?this._returnResult({data:null,error:r}):await this._verify({factorId:t.factorId,challengeId:i.id,code:t.code})}async _listFactors(){var t;const{data:{user:i},error:r}=await this.getUser();if(r)return{data:null,error:r};const s={all:[],phone:[],totp:[],webauthn:[]};for(const n of(t=i==null?void 0:i.factors)!==null&&t!==void 0?t:[])s.all.push(n),n.status==="verified"&&s[n.factor_type].push(n);return{data:s,error:null}}async _getAuthenticatorAssuranceLevel(t){var i,r,s,n;if(t)try{const{payload:m}=$o(t);let w=null;m.aal&&(w=m.aal);let v=w;const{data:{user:k},error:y}=await this.getUser(t);if(y)return this._returnResult({data:null,error:y});((r=(i=k==null?void 0:k.factors)===null||i===void 0?void 0:i.filter(x=>x.status==="verified"))!==null&&r!==void 0?r:[]).length>0&&(v="aal2");const b=m.amr||[];return{data:{currentLevel:w,nextLevel:v,currentAuthenticationMethods:b},error:null}}catch(m){if(L(m))return this._returnResult({data:null,error:m});throw m}const{data:{session:o},error:c}
252=await this.getSession();if(c)return this._returnResult({data:null,error:c});if(!o)return{data:{currentLevel:null,nextLevel:null,currentAuthenticationMethods:[]},error:null};const{payload:l}=$o(o.access_token);let d=null;l.aal&&(d=l.aal);let u=d;((n=(s=o.user.factors)===null||s===void 0?void 0:s.filter(m=>m.status==="verified"))!==null&&n!==void 0?n:[]).length>0&&(u="aal2");const g=l.amr||[];return{data:{currentLevel:d,nextLevel:u,currentAuthenticationMethods:g},error:null}}async _getAuthorizationDetails(t){try{return await this._useSession(async i=>{const{data:{session:r},error:s}=i;return s?this._returnResult({data:null,error:s}):r?await $(this.fetch,"GET",`${this.url}/oauth/authorizations/${t}`,{headers:this.headers,jwt:r.access_token,xform:n=>({data:n,error:null})}):this._returnResult({data:null,error:new Ne})})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async _approveAuthorization(t,i){try{return await this._useSession(async r=>{const{data:{session:s},error:n}=r;if(n)return this._returnResult({data:null,error:n});if(!s)return this._returnResult({data:null,error:new Ne});const o=await $(this.fetch,"POST",`${this.url}/oauth/authorizations/${t}/consent`,{headers:this.headers,jwt:s.access_token,body:{action:"approve"},xform:c=>({data:c,error:null})});return o.data&&o.data.redirect_url&&qe()&&!(i!=null&&i.skipBrowserRedirect)&&window.location.assign(o.data.redirect_url),o})}catch(r){if(L(r))return this._returnResult({data:null,error:r});throw r}}async _denyAuthorization(t,i){try{return await this._useSession(async r=>{const{data:{session:s},error:n}=r;if(n)return this._returnResult({data:null,error:n});if(!s)return this._returnResult({data:null,error:new Ne});const o=await $(this.fetch,"POST",`${this.url}/oauth/authorizations/${t}/consent`,{headers:this.headers,jwt:s.access_token,body:{action:"deny"},xform:c=>({data:c,error:null})});return o.data&&o.data.redirect_url&&qe()&&!(i!=null&&i.skipBrowserRedirect)&&window.location.assign(o.data.redirect_url),o})}catch(r){if(L(r))return this._returnResult({data:null,error:r});throw r}}async _listOAuthGrants(){try{return await this._useSession(async t=>{const{data:{session:i},error:r}=t;return r?this._returnResult({data:null,error:r}):i?await $(this.fetch,"GET",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:i.access_token,xform:s=>({data:s,error:null})}):this._returnResult({data:null,error:new Ne})})}catch(t){if(L(t))return this._returnResult({data:null,error:t});throw t}}async _revokeOAuthGrant(t){try{return await this._useSession(async i=>{const{data:{session:r},error:s}=i;return s?this._returnResult({data:null,error:s}):r?(await $(this.fetch,"DELETE",`${this.url}/user/oauth/grants`,{headers:this.headers,jwt:r.access_token,query:{client_id:t.clientId},noResolveJson:!0}),{data:{},error:null}):this._returnResult({data:null,error:new Ne})})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async fetchJwk(t,i={keys:[]}){let r=i.keys.find(c=>c.kid===t);if(r)return r;const s=Date.now();if(r=this.jwks.keys.find(c=>c.kid===t),r&&this.jwks_cached_at+zR>s)return r;const{data:n,error:o}=await $(this.fetch,"GET",`${this.url}/.well-known/jwks.json`,{headers:this.headers});if(o)throw o;return!n.keys||n.keys.length===0||(this.jwks=n,this.jwks_cached_at=s,r=n.keys.find(c=>c.kid===t),!r)?null:r}async getClaims(t,i={}){try{let r=t;if(!r){const{data:m,error:w}
252=await this.getSession();if(w||!m.session)return this._returnResult({data:null,error:w});r=m.session.access_token}const{header:s,payload:n,signature:o,raw:{header:c,payload:l}}=$o(r);i!=null&&i.allowExpired||dO(n.exp);const d=!s.alg||s.alg.startsWith("HS")||!s.kid||!("crypto"in globalThis&&"subtle"in globalThis.crypto)?null:await this.fetchJwk(s.kid,i!=null&&i.keys?{keys:i.keys}:i==null?void 0:i.jwks);if(!d){const{error:m}=await this.getUser(r);if(m)throw m;return{data:{claims:n,header:s,signature:o},error:null}}const u=uO(s.alg),h=await crypto.subtle.importKey("jwk",d,u,!0,["verify"]);if(!await crypto.subtle.verify(u,h,o,JR(`${c}.${l}`)))throw new Sh("Invalid JWT signature");return{data:{claims:n,header:s,signature:o},error:null}}catch(r){if(L(r))return this._returnResult({data:null,error:r});throw r}}async signInWithPasskey(t){var i,r,s;$t(this.experimental);try{if(!nl())return this._returnResult({data:null,error:new Zt("Browser does not support WebAuthn",null)});const{data:n,error:o}=await this._startPasskeyAuthentication({options:{captchaToken:(i=t==null?void 0:t.options)===null||i===void 0?void 0:i.captchaToken}});if(o||!n)return this._returnResult({data:null,error:o});const c=ey(n.options),l=(s=(r=t==null?void 0:t.options)===null||r===void 0?void 0:r.signal)!==null&&s!==void 0?s:Ch.createNewAbortSignal(),{data:d,error:u}=await Vk({publicKey:c,signal:l});if(u||!d)return this._returnResult({data:null,error:u??new Zt("WebAuthn ceremony failed",null)});const h=iy(d);return this._verifyPasskeyAuthentication({challengeId:n.challenge_id,credential:h})}catch(n){if(L(n))return this._returnResult({data:null,error:n});throw n}}async registerPasskey(t){var i,r;$t(this.experimental);try{if(!nl())return this._returnResult({data:null,error:new Zt("Browser does not support WebAuthn",null)});const{data:s,error:n}=await this._startPasskeyRegistration();if(n||!s)return this._returnResult({data:null,error:n});const o=Zf(s.options),c=(r=(i=t==null?void 0:t.options)===null||i===void 0?void 0:i.signal)!==null&&r!==void 0?r:Ch.createNewAbortSignal(),{data:l,error:d}=await Hk({publicKey:o,signal:c});if(d||!l)return this._returnResult({data:null,error:d??new Zt("WebAuthn ceremony failed",null)});const u=ty(l);return this._verifyPasskeyRegistration({challengeId:s.challenge_id,credential:u})}catch(s){if(L(s))return this._returnResult({data:null,error:s});throw s}}async _startPasskeyRegistration(){$t(this.experimental);try{return await this._useSession(async t=>{const{data:{session:i},error:r}=t;if(r)return this._returnResult({data:null,error:r});if(!i)return this._returnResult({data:null,error:new Ne});const{data:s,error:n}=await $(this.fetch,"POST",`${this.url}/passkeys/registration/options`,{headers:this.headers,jwt:i.access_token,body:{}});return n?this._returnResult({data:null,error:n}):this._returnResult({data:s,error:null})})}catch(t){if(L(t))return this._returnResult({data:null,error:t});throw t}}async _verifyPasskeyRegistration(t){$t(this.experimental);try{return await this._useSession(async i=>{const{data:{session:r},error:s}=i;if(s)return this._returnResult({data:null,error:s});if(!r)return this._returnResult({data:null,error:new Ne});const{data:n,error:o}=await $(this.fetch,"POST",`${this.url}/passkeys/registration/verify`,{headers:this.headers,jwt:r.access_token,body:{challenge_id:t.challengeId,credential:t.credential}});return o?this._returnResult({data:null,error:o}):this._returnResult({data:n,error:null})})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async _startPasskeyAuthentication(t){var i;$t(this.experimental);try{const{data:r,error:s}=await $(this.fetch,"POST",`${this.url}/passkeys/authentication/options`,{headers:this.headers,body:{gotrue_meta_security:{captcha_token:(i=t==null?void 0:t.options)===null||i===void 0?void 0:i.captchaToken}}});return s?this._returnResult({data:null,error:s}):this._returnResult({data:r,error:null})}catch(r){if(L(r))return this._returnResult({data:null,error:r});throw r}}async _verifyPasskeyAuthentication(t){$t(this.experimental);try{const{data:i,error:r}=await $(this.fetch,"POST",`${this.url}/passkeys/authentication/verify`,{headers:this.headers,body:{challenge_id:t.challengeId,credential:t.credential},xform:St});return r?this._returnResult({data:null,error:r}):(i.session&&(await this._saveSession(i.session),await this._notifyAllSubscribers("SIGNED_IN",i.session)),this._returnResult({data:i,error:null}))}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async _listPasskeys(){$t(this.experimental);try{return await this._useSession(async t=>{const{data:{session:i},error:r}=t;if(r)return this._returnResult({data:null,error:r});if(!i)return this._returnResult({data:null,error:new Ne});const{data:s,error:n}=await $(this.fetch,"GET",`${this.url}/passkeys`,{headers:this.headers,jwt:i.access_token,xform:o=>({data:o,error:null})});return n?this._returnResult({data:null,error:n}):this._returnResult({data:s,error:null})})}catch(t){if(L(t))return this._returnResult({data:null,error:t});throw t}}async _updatePasskey(t){$t(this.experimental);try{return await this._useSession(async i=>{const{data:{session:r},error:s}=i;if(s)return this._returnResult({data:null,error:s});if(!r)return this._returnResult({data:null,error:new Ne});const{data:n,error:o}=await $(this.fetch,"PATCH",`${this.url}/passkeys/${t.passkeyId}`,{headers:this.headers,jwt:r.access_token,body:{friendly_name:t.friendlyName}});return o?this._returnResult({data:null,error:o}):this._returnResult({data:n,error:null})})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}async _deletePasskey(t){$t(this.experimental);try{return await this._useSession(async i=>{const{data:{session:r},error:s}=i;if(s)return this._returnResult({data:null,error:s});if(!r)return this._returnResult({data:null,error:new Ne});const{error:n}
252=await $(this.fetch,"DELETE",`${this.url}/passkeys/${t.passkeyId}`,{headers:this.headers,jwt:r.access_token,noResolveJson:!0});return n?this._returnResult({data:null,error:n}):this._returnResult({data:null,error:null})})}catch(i){if(L(i))return this._returnResult({data:null,error:i});throw i}}}za.nextInstanceID={};const OO=za,FO="2.105.1";let Yn="";typeof Deno<"u"?Yn="deno":typeof document<"u"?Yn="web":typeof navigator<"u"&&navigator.product==="ReactNative"?Yn="react-native":Yn="node";const NO={"X-Client-Info":`supabase-js-${Yn}/${FO}`},LO={headers:NO},BO={schema:"public"},UO={autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,flowType:"implicit"},qO={};function Wa(e){"@babel/helpers - typeof";return Wa=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Wa(e)}function zO(e,t){if(Wa(e)!="object"||!e)return e;var i=e[Symbol.toPrimitive];if(i!==void 0){var r=i.call(e,t||"default");if(Wa(r)!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function WO(e){var t=zO(e,"string");return Wa(t)=="symbol"?t:t+""}function $O(e,t,i){return(t=WO(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function sy(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(s){return Object.getOwnPropertyDescriptor(e,s).enumerable})),i.push.apply(i,r)}return i}function Te(e){for(var t=1;t<arguments.length;t++){var i=arguments[t]!=null?arguments[t]:{};t%2?sy(Object(i),!0).forEach(function(r){$O(e,r,i[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):sy(Object(i)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(i,r))})}return e}const HO=e=>e?(...t)=>e(...t):(...t)=>fetch(...t),VO=()=>Headers,GO=(e,t,i)=>{const r=HO(i),s=VO();return async(n,o)=>{var c;const l=(c=await t())!==null&&c!==void 0?c:e;let d=new s(o==null?void 0:o.headers);return d.has("apikey")||d.set("apikey",e),d.has("Authorization")||d.set("Authorization",`Bearer ${l}`),r(n,Te(Te({},o),{},{headers:d}))}};function KO(e){return e.endsWith("/")?e:e+"/"}function QO(e,t){var i,r;const{db:s,auth:n,realtime:o,global:c}=e,{db:l,auth:d,realtime:u,global:h}=t,g={db:Te(Te({},l),s),auth:Te(Te({},d),n),realtime:Te(Te({},u),o),storage:{},global:Te(Te(Te({},h),c),{},{headers:Te(Te({},(i=h==null?void 0:h.headers)!==null&&i!==void 0?i:{}),(r=c==null?void 0:c.headers)!==null&&r!==void 0?r:{})}),accessToken:async()=>""};return e.accessToken?g.accessToken=e.accessToken:delete g.accessToken,g}function XO(e){const t=e==null?void 0:e.trim();if(!t)throw new Error("supabaseUrl is required.");if(!t.match(/^https?:\/\//i))throw new Error("Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.");try{return new URL(KO(t))}catch{throw Error("Invalid supabaseUrl: Provided URL is malformed.")}}var JO=class extends OO{constructor(e){super(e)}},YO=class{constructor(e,t,i){var r,s;this.supabaseUrl=e,this.supabaseKey=t;const n=XO(e);if(!t)throw new Error("supabaseKey is required.");this.realtimeUrl=new URL("realtime/v1",n),this.realtimeUrl.protocol=this.realtimeUrl.protocol.replace("http","ws"),this.authUrl=new URL("auth/v1",n),this.storageUrl=new URL("storage/v1",n),this.functionsUrl=new URL("functions/v1",n);const o=`sb-${n.hostname.split(".")[0]}-auth-token`,c={db:BO,realtime:qO,auth:Te(Te({},UO),{},{storageKey:o}),global:LO},l=QO(i??{},c);if(this.storageKey=(r=l.auth.storageKey)!==null&&r!==void 0?r:"",this.headers=(s=l.global.headers)!==null&&s!==void 0?s:{},l.accessToken)this.accessToken=l.accessToken,this.auth=new Proxy({},{get:(u,h)=>{throw new Error(`@supabase/supabase-js: Supabase Client is configured with the accessToken option, accessing supabase.auth.${String(h)} is not possible`)}});else{var d;this.auth=this._initSupabaseAuthClient((d=l.auth)!==null&&d!==void 0?d:{},this.headers,l.global.fetch)}this.fetch=GO(t,this._getAccessToken.bind(this),l.global.fetch),this.realtime=this._initRealtimeClient(Te({headers:this.headers,accessToken:this._getAccessToken.bind(this),fetch:this.fetch},l.realtime)),this.accessToken&&Promise.resolve(this.accessToken()).then(u=>this.realtime.setAuth(u)).catch(u=>console.warn("Failed to set initial Realtime auth token:",u)),this.rest=new DM(new URL("rest/v1",n).href,{headers:this.headers,schema:l.db.schema,fetch:this.fetch,timeout:l.db.timeout,urlLengthLimit:l.db.urlLengthLimit}),this.storage=new NR(this.storageUrl.href,this.headers,this.fetch,i==null?void 0:i.storage),l.accessToken||this._listenForAuthEvents()}get functions(){return new fM(this.functionsUrl.href,{headers:this.headers,customFetch:this.fetch})}from(e){return this.rest.from(e)}schema(e){return this.rest.schema(e)}rpc(e,t={},i={head:!1,get:!1,count:void 0}){return this.rest.rpc(e,t,i)}
252channel(e,t={config:{}}){return this.realtime.channel(e,t)}getChannels(){return this.realtime.getChannels()}removeChannel(e){return this.realtime.removeChannel(e)}removeAllChannels(){return this.realtime.removeAllChannels()}async _getAccessToken(){var e=this,t,i;if(e.accessToken)return await e.accessToken();const{data:r}=await e.auth.getSession();return(t=(i=r.session)===null||i===void 0?void 0:i.access_token)!==null&&t!==void 0?t:e.supabaseKey}_initSupabaseAuthClient({autoRefreshToken:e,persistSession:t,detectSessionInUrl:i,storage:r,userStorage:s,storageKey:n,flowType:o,lock:c,debug:l,throwOnError:d,experimental:u},h,g){const m={Authorization:`Bearer ${this.supabaseKey}`,apikey:`${this.supabaseKey}`};return new JO({url:this.authUrl.href,headers:Te(Te({},m),h),storageKey:n,autoRefreshToken:e,persistSession:t,detectSessionInUrl:i,storage:r,userStorage:s,flowType:o,lock:c,debug:l,throwOnError:d,experimental:u,fetch:g,hasCustomAuthorizationHeader:Object.keys(this.headers).some(w=>w.toLowerCase()==="authorization")})}_initRealtimeClient(e){return new aR(this.realtimeUrl.href,Te(Te({},e),{},{params:Te(Te({},{apikey:this.supabaseKey}),e==null?void 0:e.params)}))}_listenForAuthEvents(){return this.auth.onAuthStateChange((e,t)=>{this._handleTokenChanged(e,"CLIENT",t==null?void 0:t.access_token)})}_handleTokenChanged(e,t,i){(e==="TOKEN_REFRESHED"||e==="SIGNED_IN")&&this.changedAccessToken!==i?(this.changedAccessToken=i,this.realtime.setAuth(i)):e==="SIGNED_OUT"&&(this.realtime.setAuth(),t=="STORAGE"&&this.auth.signOut(),this.changedAccessToken=void 0)}};const ZO=(e,t,i)=>new YO(e,t,i);function eF(){if(typeof window<"u")return!1;const e=globalThis.process;if(!e)return!1;const t=e.version;if(t==null)return!1;const i=t.match(/^v(\d+)\./);return i?parseInt(i[1],10)<=18:!1}eF()&&console.warn("â ï¸ Node.js 18 and below are deprecated and will no longer be supported in future versions of @supabase/supabase-js. Please upgrade to Node.js 20 or later. For more information, visit: https://github.com/orgs/supabase/discussions/37217");function tF(){var k,y;if(typeof window>"u")return;const e=location.hostname,i=["lovableproject.com","lovableproject-dev.com","lovable.app","gpt-eng.com","gptengineer.run"].some(f=>e===f||e.endsWith("."+f)),r="[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}",s=i?((k=e.match(new RegExp("^(?:id-preview(?:-[a-z0-9]+)?|project)--("+r+")(?:-dev)?(?=\\.|$)","i")))==null?void 0:k[1])??((y=e.match(new RegExp("^("+r+")(?=[.-])","i")))==null?void 0:y[1]):void 0,n=window.parent&&window.parent!==window;if(!s||!n)return localStorage;const o=e.endsWith(".lovableproject-dev.com")||e.endsWith(".gpt-eng.com"),c=o?/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$|^http:\/\/localhost:3000$/:/^https:\/\/([a-z0-9-]+\.)*(lovable\.dev|gptengineer\.app)$/,l=location.ancestorOrigins&&location.ancestorOrigins[0]||(document.referrer?new URL(document.referrer).origin:""),d=l&&c.test(l)?[l]:o?["https://lovable.dev","http://localhost:3000"]:["https://lovable.dev"],u="lovable-preview-auth:result",h=2e3,g=()=>Math.random().toString(36).slice(2)+Date.now().toString(36),m=(f,b,x)=>new Promise(C=>{const D=g();let T=!1,I;const R=N=>{T||(T=!0,clearTimeout(I),window.removeEventListener("message",F),C(N))},F=N=>{if(d.indexOf(N.origin)<0)return;const J=N.data;J&&J.type===u&&J.requestId===D&&R(J)};window.addEventListener("message",F);const K={type:f,requestId:D,projectId:s,key:b};x!==void 0&&(K.value=x);for(const N of d)window.parent.postMessage(K,N);I=setTimeout(()=>R(null),h)});let w=!0;const v=250;return{getItem:async f=>{let b=await m("lovable-preview-auth:get",f);return!b&&w&&(await new Promise(x=>setTimeout(x,v)),b=await m("lovable-preview-auth:get",f)),w=!1,b&&b.ok&&typeof b.value=="string"?b.value===""?(localStorage.removeItem(f),null):b.value:localStorage.getItem(f)},setItem:(f,b)=>(localStorage.setItem(f,b),m("lovable-preview-auth:set",f,b).then(()=>{})),removeItem:f=>(localStorage.removeItem(f),m("lovable-preview-auth:remove",f).then(()=>{}))}}const iF="https://iypdpvysibkuikwuihgt.supabase.co",rF="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Iml5cGRwdnlzaWJrdWlrd3VpaGd0Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3Nzc2NDE3MzMsImV4cCI6MjA5MzIxNzczM30.m4qWx4r2xJ8fyw2ALn0D92Dg381ReiHzQr03mFa1_9A",sF=ZO(iF,rF,{auth:{storage:tF(),persistSession:!0,autoRefreshToken:!0}}),Gk=p.forwardRef(({className:e,type:t,...i},r)=>a.jsx("input",{type:t,className:Rt("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",e),ref:r,...i}));Gk.displayName="Input";
252const nF=[{label:"Services",to:"/services",blurb:"FDA cybersecurity, pen testing, SBOM, threat modeling."},{label:"Guides",to:"/guides",blurb:"Deep-dive playbooks on FDA premarket & postmarket cyber."},{label:"Blog",to:"/blog",blurb:"Latest medical device cybersecurity articles."},{label:"Tools",to:"/tools",blurb:"Free calculators and self-serve cyber readiness tools."},{label:"Podcast",to:"/podcast",blurb:"The Med Device Cyber Podcast - every episode."},{label:"Contact",to:"/contact",blurb:"Talk to our team about your submission."}],Hn=()=>{const e=Mt(),t=Za(),i=e.pathname+e.search,[r,s]=p.useState("");p.useEffect(()=>{console.warn("404:",i);const o=typeof document<"u"&&document.referrer||"";sF.functions.invoke("log-not-found",{body:{path:i,referrer:o}}).catch(()=>{})},[i]);const n=o=>{o.preventDefault();const c=r.trim();t(c?`/search?q=${encodeURIComponent(c)}`:"/search")};return a.jsxs("main",{className:"min-h-[70vh] px-6 py-20 md:py-28",children:[a.jsx(rk,{path:e.pathname,title:"Page not found (404)",description:"The page you're looking for doesn't exist or has moved. Search the site or jump to services, guides, tools, or the podcast.",noindex:!0}),a.jsxs(eo,{children:[a.jsx("meta",{name:"prerender-status-code",content:"404"}),a.jsx("meta",{httpEquiv:"status",content:"404 Not Found"})]}),a.jsxs("div",{className:"mx-auto max-w-3xl",children:[a.jsxs("div",{className:"text-center",children:[a.jsx("p",{className:"text-sm font-mono uppercase tracking-widest text-muted-foreground mb-4",children:"Error 404"}),a.jsx("h1",{className:"h-display-1 mb-6",children:"Page not found"}),a.jsxs("p",{className:"text-lg text-muted-foreground mb-1",children:["We couldn't find"," ",a.jsx("code",{className:"font-mono text-foreground break-all",children:e.pathname}),"."]}),a.jsx("p",{className:"text-muted-foreground mb-8",children:"The link may be broken, or the page may have moved."}),a.jsxs("form",{onSubmit:n,role:"search","aria-label":"Search Blue Goat Cyber",className:"mx-auto flex max-w-md gap-2 mb-6",children:[a.jsxs("div",{className:"relative flex-1",children:[a.jsx(R0,{"aria-hidden":!0,className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),a.jsx(Gk,{type:"search",name:"q",value:r,onChange:o=>s(o.target.value),placeholder:"Search guides, tools, podcastâ¦","aria-label":"Search the site",className:"pl-9"})]}),a.jsx(ge,{type:"submit",children:"Search"})]}),a.jsxs("div",{className:"flex flex-wrap justify-center gap-3 mb-14",children:[a.jsx(ge,{asChild:!0,size:"lg",children:a.jsx(H,{to:"/",children:"Back to home"})}),a.jsx(ge,{asChild:!0,size:"lg",variant:"outline",children:a.jsx(H,{to:"/contact",children:"Contact us"})})]})]}),a.jsxs("section",{"aria-labelledby":"popular-heading",children:[a.jsx("h2",{id:"popular-heading",className:"text-sm font-mono uppercase tracking-widest text-muted-foreground text-center mb-6",children:"Popular destinations"}),a.jsx("ul",{className:"grid gap-3 sm:grid-cols-2",children:nF.map(o=>a.jsx("li",{children:a.jsxs(H,{to:o.to,className:"block rounded-lg border border-border bg-card p-4 transition-colors hover:border-primary hover:bg-accent/40",children:[a.jsx("div",{className:"font-semibold mb-1",children:o.label}),a.jsx("div",{className:"text-sm text-muted-foreground",children:o.blurb})]})},o.to))})]})]})]})},aF=()=>{const{slug:e=""}=Dm();return a.jsx(si,{to:`/research/${e}`,replace:!0})},oF=()=>{const{pathname:e,search:t,hash:i}=window.location,r=e.replace(/^\/feed/,"");return a.jsx(si,{to:`/goatfeed${r}${t}${i}`,replace:!0})},cF=()=>{const{slug:e=""}=Dm();return a.jsx(si,{to:`/news/the-goats-weekly/${e}`,replace:!0})},lF=p.lazy(()=>S(()=>import("./Services-DAfNl4rF.js"),__vite__mapDeps([28,29,23,24,30,31,32]))),dF=p.lazy(()=>S(()=>import("./FdaCybersecurityHub-D0Y9nx3z.js"),__vite__mapDeps([33,29,34,35,30]))),uF=p.lazy(()=>S(()=>import("./ServiceDetail-C83xG1W5.js"),__vite__mapDeps([36,23,24,30,26,7,37,31,38,39,40,41,42,43,44,18,45,46,47,48,49,50]))),hF=p.lazy(()=>S(()=>import("./ServiceSegmentLanding-5-jpmNtD.js"),__vite__mapDeps([51,29,42,43,46,47,48,18,49]))),mF=p.lazy(()=>S(()=>import("./MtiApac-CFEa_yxZ.js"),__vite__mapDeps([52,53,54,55,56,57,58,59,4,60,43,7,2]))),pF=p.lazy(()=>S(()=>import("./MtiApacReadiness-BI28JKyj.js"),__vite__mapDeps([61,54,20,58,47,49]))),gF=p.lazy(()=>S(()=>
252import("./MtiApacResources-Ct883tJv.js"),__vite__mapDeps([62,63,49,64,55,56,43,57,60]))),fF=p.lazy(()=>S(()=>import("./MtiApacBudget-BDy7mOfG.js"),__vite__mapDeps([65,63,49,20,55,56]))),yF=p.lazy(()=>S(()=>import("./MtiApacFaq-D-E7-HEP.js"),__vite__mapDeps([66,63,49,55,56]))),bF=p.lazy(()=>S(()=>import("./Lp510k-BZBFAfr7.js"),__vite__mapDeps([67,68,53,5,20,69]))),vF=p.lazy(()=>S(()=>import("./Lp524b-DKtjljQZ.js"),__vite__mapDeps([70,68,53,5,20,69]))),wF=p.lazy(()=>S(()=>import("./LpPmaDeNovo-DOJq0ibA.js"),__vite__mapDeps([71,68,53,5,20,69]))),kF=p.lazy(()=>S(()=>import("./LpDeficiencyLetter-BlRx5_rH.js"),__vite__mapDeps([72,68,53,5,20]))),xF=p.lazy(()=>S(()=>import("./LpHoldLetter-vjc1SAHb.js"),__vite__mapDeps([73,68,53,5,20]))),AF=p.lazy(()=>S(()=>import("./LpRefuseToAccept-BugM9pRw.js"),__vite__mapDeps([74,68,53,5,20]))),SF=p.lazy(()=>S(()=>import("./LpMedDevicePenTest-BK36IQ62.js"),__vite__mapDeps([75,68,53,5,20]))),CF=p.lazy(()=>S(()=>import("./LpMedDevicePenTestRequirements-5XVko5Ju.js"),__vite__mapDeps([76,68,53,5,20]))),DF=p.lazy(()=>S(()=>import("./LpFdaPenTest-QawlyV--.js"),__vite__mapDeps([77,68,53,5,20]))),TF=p.lazy(()=>S(()=>import("./LpFdaPostmarket-9UZ-A703.js"),__vite__mapDeps([78,68,53,5,20,69]))),EF=p.lazy(()=>S(()=>import("./LpPostmarketVulnMgmt-DSqAJQDn.js"),__vite__mapDeps([79,68,53,5,20,69]))),PF=p.lazy(()=>S(()=>import("./LpFdaPremarket-DmtUVioS.js"),__vite__mapDeps([80,68,53,5,20,69]))),_F=p.lazy(()=>S(()=>import("./LpMedicalDeviceCyber-D7ZkhQmh.js"),__vite__mapDeps([81,68,53,5,20,69]))),IF=p.lazy(()=>S(()=>import("./LpFdaCyberConsulting-Cl9tFIVR.js"),__vite__mapDeps([82,68,53,5,20]))),jF=p.lazy(()=>S(()=>import("./LpIdeCybersecurity-DlWh-uv4.js"),__vite__mapDeps([83,68,53,5,20]))),MF=p.lazy(()=>S(()=>import("./LpVsMedcrypt-BCYDwIzC.js"),__vite__mapDeps([84,68,53,5,20,85]))),RF=p.lazy(()=>S(()=>import("./LpVsMedsec-BGvPvvvX.js"),__vite__mapDeps([86,68,53,5,20,85]))),OF=p.lazy(()=>S(()=>import("./LpVsVelentium-Byk48mp1.js"),__vite__mapDeps([87,68,53,5,20,85]))),FF=p.lazy(()=>S(()=>import("./About-CDh9Gqrv.js"),__vite__mapDeps([88,26,89,90,91,1,2,3,92,13,14,15,16,17,18,19,20,21,22,39,40,93,94,95,96,60,7,43]))),NF=p.lazy(()=>S(()=>import("./Faqs-DNIJewry.js"),__vite__mapDeps([97,29]))),LF=p.lazy(()=>S(()=>import("./FdaCybersecurityFaq-B-NT539h.js"),__vite__mapDeps([98,29]))),BF=p.lazy(()=>S(()=>import("./Contact-D46p4fEo.js"),__vite__mapDeps([99,29,100,23,24,30,31,101,2,4,5,7,6]))),$d=p.lazy(()=>S(()=>import("./Blog-CyT0X8BV.js"),__vite__mapDeps([102,29,103,104,105,106,107]))),UF=p.lazy(()=>S(()=>import("./BlogTopics-CxMqNmCz.js"),__vite__mapDeps([108,29,109]))),qF=p.lazy(()=>S(()=>import("./BlogDetail-5aggfNas.js"),__vite__mapDeps([110,111,15,16,53,29,44,18,17,35,104,106,107,112,1,2,3,113,49,101,114,26,7,43,115,116,47,117,118,119,38,39,40,120,121]))),zF=p.lazy(()=>S(()=>import("./Weekly-nuAWg_KP.js"),__vite__mapDeps([122,29,123,64,4,124]))),WF=p.lazy(()=>S(()=>import("./EditorialStandards-Dm7YkTPP.js"),__vite__mapDeps([125,29]))),$F=p.lazy(()=>S(()=>import("./WeeklyIssue-By2aj1j9.js"),__vite__mapDeps([126,111,15,16,53,29,44,18,17,35,104,106,107,112,1,2,3,113,49,101,127,123,64,4,128,129,130,131,132,47]))),Hd=p.lazy(()=>S(()=>import("./WeeklyFeed-SiA9jcA3.js"),__vite__mapDeps([133,123,64,4,134,135,16,136,47,49,137,138,139,140,141,43,142,143,92]))),HF=p.lazy(()=>S(()=>import("./FeedDashboard-TBx2kbZw.js"),__vite__mapDeps([144,142,143,49]))),VF=p.lazy(()=>S(()=>import("./FeedAccount-Cb1ft746.js"),__vite__mapDeps([145,131,136,146,147,49,64,32]))),Ho=p.lazy(()=>S(()=>import("./WeeklyDigest-DsA7nAZJ.js"),__vite__mapDeps([148,29,134,135,16,136,47,49,137,138,139,140,123,64,4]))),GF=p.lazy(()=>S(()=>import("./WeeklyItem-D1AJGhKa.js"),__vite__mapDeps([149,29,150,138,139,136,49,43]))),KF=p.lazy(()=>S(()=>import("./WeeklyTopic-kp07zI0p.js"),__vite__mapDeps([151,29,137,138,139,136,140,47,49]))),QF=p.lazy(()=>S(()=>import("./FeedVendor-BEgW6DWM.js"),__vite__mapDeps([152,137,138,139,136,140,47,49,43,124]))),XF=p.lazy(()=>S(()=>import("./Methodology-4mZ3Nuv1.js"),__vite__mapDeps([153,4]))),JF=p.lazy(()=>S(()=>import("./FeedRiskRubric-BramXtX4.js"),__vite__mapDeps([154,29]))),ny=p.lazy(()=>S(()=>import("./Guides-CDLWmXKr.js"),__vite__mapDeps([155,29,104,105,106]))),YF=p.lazy(()=>S(()=>import("./GuideDetail-Bkh92Cky.js"),__vite__mapDeps([156,111,15,16,53,29,44,18,17,35,104,106,107,112,1,2,3,113,49,101,114,26,7,43,115,116,47,117,157,118,119,158,38,39,40,120,12
2521]))),ZF=p.lazy(()=>S(()=>import("./PccpCybersecurityCollection-Buq_G5m1.js"),__vite__mapDeps([159,29]))),e4=p.lazy(()=>S(()=>import("./Resources-vQyxLSFF.js"),__vite__mapDeps([160,29,91,26,1,2,3,92,161,56,4,48,162,50]))),t4=p.lazy(()=>S(()=>import("./ResourceCollection-028Rl8p7.js"),__vite__mapDeps([163,29,161,56,4,3,49,92]))),i4=p.lazy(()=>S(()=>import("./GiveBackPage-CtILuy3c.js"),__vite__mapDeps([164,29,91,26,1,2,3,92,165]))),r4=p.lazy(()=>S(()=>import("./CompanyOverview-B9GeCSPJ.js"),__vite__mapDeps([166,29,90,24,40,167,95,168,169,170,171,172,50]))),s4=p.lazy(()=>S(()=>import("./CaseStudies--vCQD2G6.js"),__vite__mapDeps([173,29]))),n4=p.lazy(()=>S(()=>import("./Testimonials-B9-d-Vg3.js"),__vite__mapDeps([174,26,29,48,24,50,7,43]))),a4=p.lazy(()=>S(()=>import("./Webinars-BWMLuojF.js"),__vite__mapDeps([175,29,176,177]))),o4=p.lazy(()=>S(()=>import("./WebinarDetail-CpzhVj1g.js"),__vite__mapDeps([178,26,176,179,64,49,177,43,60]))),c4=p.lazy(()=>S(()=>import("./Podcast-mUmlf0Uf.js"),__vite__mapDeps([180,29,117,106,181,182,183,184,185,3,43,179,64,170,8,60,4]))),l4=p.lazy(()=>S(()=>import("./PodcastEpisode-hPJe4wsA.js"),__vite__mapDeps([186,111,15,16,53,29,44,18,17,35,104,106,107,112,1,2,3,113,49,101,114,26,7,43,181,182,183,184,117,38,39,40,120,119,118,121,187,185,179,8,60,177,188]))),d4=p.lazy(()=>S(()=>import("./PodcastTopic-djmy6maq.js"),__vite__mapDeps([189,29,181,182,183,184,179,3,60]))),u4=p.lazy(()=>S(()=>import("./News-57IXIcx5.js"),__vite__mapDeps([190,26,29,191,183,192,117,106,193,194,123,64,4,158,58,124,60,50]))),h4=p.lazy(()=>S(()=>import("./NewsArticle-DWq11MSm.js"),__vite__mapDeps([195,103,111,15,16,53,29,44,18,17,35,104,106,107,112,1,2,3,113,49,101,114,26,7,43,117,191,183,196,38,39,40,120,119,118]))),m4=p.lazy(()=>S(()=>import("./MedicalDeviceCybersecurityUpdates-DU4R35nw.js"),__vite__mapDeps([197,29,191,183,193,194,158,198,43]))),p4=p.lazy(()=>S(()=>import("./MentionDetail-CKiiZ3I8.js"),__vite__mapDeps([199,103,26,193,194,196,117,106,49,43,60,50]))),g4=p.lazy(()=>S(()=>import("./NewsMentions-BF8FaRFB.js"),__vite__mapDeps([200,29,193,194,192,117,106,49,60,50]))),f4=p.lazy(()=>S(()=>import("./RegulatoryTracker-Dam5Ead2.js"),__vite__mapDeps([201,29,158,124]))),y4=p.lazy(()=>S(()=>import("./RegulatoryTrackerEntry-DrvhcSML.js"),__vite__mapDeps([202,26,158,203,49,43]))),b4=p.lazy(()=>S(()=>import("./RegulatoryTrackerAgency-BlXoeG8H.js"),__vite__mapDeps([204,158,203,49,124]))),v4=p.lazy(()=>S(()=>import("./Cvd-DXEq9Ac6.js"),__vite__mapDeps([205,29,165,100,4,5]))),w4=p.lazy(()=>S(()=>import("./ExecutiveBriefing--7e3KF2f.js"),__vite__mapDeps([206,165,100]))),k4=p.lazy(()=>S(()=>import("./PrivacyPolicy-AubhNfVE.js"),__vite__mapDeps([207,29]))),x4=p.lazy(()=>S(()=>import("./TermsOfService-BEhWma4V.js"),__vite__mapDeps([208,29]))),A4=p.lazy(()=>S(()=>import("./CookiePolicy-I_Xp2zY0.js"),__vite__mapDeps([209,29]))),S4=p.lazy(()=>S(()=>import("./Accessibility-DBVpslhl.js"),__vite__mapDeps([210,29]))),C4=p.lazy(()=>S(()=>import("./FormSubmissionConfirmation-CIJogCYR.js"),__vite__mapDeps([211,29,212]))),D4=p.lazy(()=>S(()=>import("./MeetingConfirmation-Dcunpg3O.js"),__vite__mapDeps([213,29,212]))),T4=p.lazy(()=>S(()=>import("./Search-D2ZgpNXX.js"),__vite__mapDeps([214,29,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,116,
252183,37,31,109,474,475,141,60,45]))),E4=p.lazy(()=>S(()=>import("./Why-DTkSaCZA.js"),__vite__mapDeps([476,29,90,23,24,30,31,93,477,47,171,143]))),P4=p.lazy(()=>S(()=>import("./Segments-DeFIdO7-.js"),__vite__mapDeps([478,29,23,24,30,31]))),_4=p.lazy(()=>S(()=>import("./SegmentDetail-Bv9sVcGn.js"),__vite__mapDeps([479,44,18,29,12,100,4,23,24,46,47,48,49]))),I4=p.lazy(()=>S(()=>import("./Readiness-BgoLpLjk.js"),__vite__mapDeps([480,29,100,165,481,26,43,47,140,7,10,128,482,483,484,59]))),j4=p.lazy(()=>S(()=>import("./ScopeEstimator-6qF8-inu.js"),__vite__mapDeps([485,29,486,49,130,487,488,489,16,490,188,47,491,64,165,483,492,143]))),M4=p.lazy(()=>S(()=>import("./ToolsHub-BTvX9SJh.js"),__vite__mapDeps([493,29]))),R4=p.lazy(()=>S(()=>import("./PccpBuilder-BIpJaqR8.js"),__vite__mapDeps([494,29,165,481,26,43,47,140,7,10,128,495,130,487,496,490,483,497,484,482,20,59]))),O4=p.lazy(()=>S(()=>import("./CyberDeviceApplicability-CDfNHjt3.js"),__vite__mapDeps([498,29,165,481,26,43,47,140,7,10,128,495,499,497,482,59,20]))),F4=p.lazy(()=>S(()=>import("./SamdSimdClassifier-D2kOMRjG.js"),__vite__mapDeps([500,29,165,481,26,43,47,140,7,10,128,495,499,497,482,59,20]))),N4=p.lazy(()=>S(()=>import("./SbomReadiness-BMhjZB30.js"),__vite__mapDeps([501,29,165,481,26,43,47,140,7,10,128,483,497,486,49,482,167,95,502,59,20]))),L4=p.lazy(()=>S(()=>import("./ThreatModelStarter-fGQQSLae.js"),__vite__mapDeps([503,29,165,481,26,43,47,140,7,10,128,484,130,487,496,490,497,504,486,49,482,20,59]))),B4=p.lazy(()=>S(()=>import("./CvdPolicyGenerator-Dz2ake1z.js"),__vite__mapDeps([505,29,165,481,26,43,47,140,7,10,128,484,130,497,486,49,482,506,20,59]))),U4=p.lazy(()=>S(()=>import("./DeficiencyLetterTriage-DRe8CTyy.js"),__vite__mapDeps([507,29,165,481,26,43,47,140,7,10,128,487,497,482,20,59]))),q4=p.lazy(()=>S(()=>import("./PostmarketCadenceCalculator-B_7mNEDG.js"),__vite__mapDeps([508,29,165,481,26,43,47,140,7,10,128,497,482,59,20]))),z4=p.lazy(()=>S(()=>import("./EstarCyberChecklist-BG4XX-Mb.js"),__vite__mapDeps([509,29,165,481,26,43,47,140,7,10,128,484,496,490,483,497,486,49,482,20,59]))),W4=p.lazy(()=>S(()=>import("./SbomDiffVex-C-4JMDbF.js"),__vite__mapDeps([510,29,165,481,26,43,47,140,7,10,128,130,487,497,484,482,20,147,143,59]))),$4=p.lazy(()=>S(()=>import("./ComponentRiskScorecard-DhITjHb7.js"),__vite__mapDeps([511,29,165,481,26,43,47,140,7,10,128,130,487,497,484,482,20,59]))),H4=p.lazy(()=>S(()=>import("./LegacyComponentTriage-BRB_AXQ0.js"),__vite__mapDeps([512,29,165,481,26,43,47,140,7,10,128,130,487,496,490,484,497,482,20,59]))),V4=p.lazy(()=>S(()=>import("./WirelessInterfaceProfiler-BrBXKHU3.js"),__vite__mapDeps([513,29,165,481,26,43,47,140,7,10,128,130,496,490,484,504,497,482,20,59]))),G4=p.lazy(()=>S(()=>import("./ControlledRiskClassifier-DtBjPZB3.js"),__vite__mapDeps([514,29,165,481,26,43,47,140,7,10,128,515,490,516,130,497,20,59]))),K4=p.lazy(()=>S(()=>import("./Mds2Generator-Bibf4ybL.js"),__vite__mapDeps([517,29,165,481,26,43,47,140,7,10,128,486,49,482,484,130,487,20,506,59]))),Q4=p.lazy(()=>S(()=>import("./SpdfGapChecker-BKhzFRVu.js"),__vite__mapDeps([518,29,165,481,26,43,47,140,7,10,128,486,49,482,484,130,483,20,59]))),X4=p.lazy(()=>S(()=>import("./SubmissionPathwaySelector-BhCwfIPA.js"),__vite__mapDeps([519,29,165,481,26,43,47,140,7,10,128,482,484,130,20,59]))),J4=p.lazy(()=>S(()=>import("./OtaUpdateQuestionnaire-w92-0AWc.js"),__vite__mapDeps([520,29,165,481,26,43,47,140,7,10,128,482,484,130,483,20,59]))),Y4=p.lazy(()=>S(()=>import("./SirResponseBuilder-PZlzlYYt.js"),__vite__mapDeps([521,29,165,481,26,43,47,140,7,10,128,487,130,522,491,49,506,59,20]))),Z4=p.lazy(()=>S(()=>import("./PathwayCrosswalk-BMYKhsiz.js"),__vite__mapDeps([523,29,522,59,20]))),e5=p.lazy(()=>S(()=>import("./StandardsMapper-DyKweooR.js"),__vite__mapDeps([524,29,522,59,20]))),t5=p.lazy(()=>S(()=>import("./AiMlSubmissionTimeline-vhrr1THo.js"),__vite__mapDeps([525,29,522,526,59,20,47]))),i5=p.lazy(()=>S(()=>import("./Cr515Crosswalk-CG948WKH.js"),__vite__mapDeps([527,29,522,526,59,20]))),r5=p.lazy(()=>S(()=>import("./CostOfDelay-gz8wnYBl.js"),__vite__mapDeps([528,29,529,165,130,489,490,20]))),s5=p.lazy(()=>S(()=>import("./Misconceptions-pZDiQrel.js"),__vite__mapDeps([530,29,165,60,43]))
252),n5=p.lazy(()=>S(()=>import("./Partners-DamFDnis.js"),__vite__mapDeps([531,29,165,20,4,101,7,45,198,127]))),a5=p.lazy(()=>S(()=>import("./SupplierQualification-B4BByvRQ.js"),__vite__mapDeps([532,29]))),o5=p.lazy(()=>S(()=>import("./PartnerDetail-CCuTZWR6.js"),__vite__mapDeps([533,26,29,165,198,6,43]))),c5=p.lazy(()=>S(()=>import("./Ecosystem-DsTxlciV.js"),__vite__mapDeps([534,26,29,15,16,92,6,127,113]))),l5=p.lazy(()=>S(()=>import("./Prep-BnmkWhRq.js"),__vite__mapDeps([535,29,92,198]))),d5=p.lazy(()=>S(()=>import("./Glossary-BO8sKmFB.js"),__vite__mapDeps([536,29,474,475,157,135,16,43]))),u5=p.lazy(()=>S(()=>import("./Leadership-CpZn0aoz.js"),__vite__mapDeps([537,26,29,39,40,7,92]))),h5=p.lazy(()=>S(()=>import("./ChristianEspinosa-1V6AWDl9.js"),__vite__mapDeps([538,26,29,165,14,15,16,17,18,19,20,39,40,539,22,7,92,43,60,50]))),ay=p.lazy(()=>S(()=>import("./AuthorPage-CvuQBQ1k.js"),__vite__mapDeps([540,26,29,39,40,120,7]))),m5=p.lazy(()=>S(()=>import("./Awards-Cijojul-.js"),__vite__mapDeps([541,29,165,542,43]))),p5=p.lazy(()=>S(()=>import("./AboutCoreValues-D72uy9Wp.js"),__vite__mapDeps([543,29,90,165]))),g5=p.lazy(()=>S(()=>import("./AboutManifesto-TyJOj6OI.js"),__vite__mapDeps([544,29,165,90,89]))),f5=p.lazy(()=>S(()=>import("./Journey-CFnoYgeA.js"),__vite__mapDeps([545,103,47]))),y5=p.lazy(()=>S(()=>import("./JourneyHub-VBK-zz7X.js"),__vite__mapDeps([546,103,47]))),b5=p.lazy(()=>S(()=>import("./MonthlyPulse--kajpjF-.js"),__vite__mapDeps([547,29,548,4]))),v5=p.lazy(()=>S(()=>import("./MonthlyPulseEdition-Cwqz7XW4.js"),__vite__mapDeps([549,29,548,49,4,7,10,47,140]))),w5=p.lazy(()=>S(()=>import("./Events-DL5r_6zs.js"),__vite__mapDeps([550,29,551,26,7,552,6,92]))),k5=p.lazy(()=>S(()=>import("./EventDetail-C9XVf3-V.js"),__vite__mapDeps([553,26,29,551,7,6,92,101,49]))),x5=p.lazy(()=>S(()=>import("./Media-CLltvlkR.js"),__vite__mapDeps([554,26,193,194,542,29,165,15,16,539,21,19,43,6,60,7,8,9]))),A5=p.lazy(()=>S(()=>import("./Press-DWUgKAg4.js"),__vite__mapDeps([555,29,26,43,60]))),S5=p.lazy(()=>S(()=>import("./Careers-C2ZsYuln.js"),__vite__mapDeps([556,29,90,557,22,39,40,542,4,6,45]))),C5=p.lazy(()=>S(()=>import("./CareerDetail-BGpClMta.js"),__vite__mapDeps([558,29,557,49,4]))),oy=p.lazy(()=>S(()=>import("./CareerApply-Cr2WT22Q.js"),__vite__mapDeps([559,29,130,487,557,491,49]))),D5=p.lazy(()=>S(()=>import("./CareersFaq-BV3sKoC0.js"),__vite__mapDeps([560,29,557,49,4]))),T5=p.lazy(()=>S(()=>import("./Topics-guHagIAD.js"),__vite__mapDeps([561,29,109]))),E5=p.lazy(()=>S(()=>import("./Proof-DM9l66DW.js"),__vite__mapDeps([562,26,29,93,48,194,60,43]))),P5=p.lazy(()=>S(()=>import("./TopicHub-BIl1s6oy.js"),__vite__mapDeps([563,29,30,109,41,475,161,56,4,3,564,34,35]))),_5=p.lazy(()=>S(()=>import("./AskTheGoat-Dz5D3HGy.js"),__vite__mapDeps([565,487,29,112,64,170]))),I5=p.lazy(()=>S(()=>import("./PlaybooksIndex-Dtt6L4wc.js"),__vite__mapDeps([566,29,567]))),j5=p.lazy(()=>S(()=>import("./GlobalRegulatoryMap-BTdzU0bg.js"),__vite__mapDeps([568,29,43]))),M5=p.lazy(()=>S(()=>import("./PlaybookDetail-CEdoZ3R7.js"),__vite__mapDeps([569,29,114,26,7,43,120,39,40,119,104,121,567,49,4]))),R5=p.lazy(()=>S(()=>import("./InfographicsIndex-CpOOUDja.js"),__vite__mapDeps([570,29,571,162]))),O5=p.lazy(()=>S(()=>import("./InfographicDetail-s2C_5nIK.js"),__vite__mapDeps([572,571,49]))),F5=p.lazy(()=>S(()=>import("./RegulatoryStrategy-DLLKNZIk.js"),__vite__mapDeps([573,29,20,15,16,49,170,132,43]))),N5=p.lazy(()=>S(()=>import("./FundingCybersecurity-BJYiVk3V.js"),__vite__mapDeps([574,29,20,59,171,47,506]))),L5=p.lazy(()=>S(()=>import("./NotFoundLog-D9dIyhNh.js"),__vite__mapDeps([575,29,576,129,130,131,26,150,577]))),B5=p.lazy(()=>S(()=>import("./LinkOpportunities-BeJ5N-f-.js"),__vite__mapDeps([578,26,29,576,129,130,131,150,577]))),U5=p.lazy(()=>S(()=>import("./AdminSeo-Ciy2PIxw.js"),__vite__mapDeps([579,580,129,130,131,150,581,515,577,576,167,95,168,582]))),q5=p.lazy(()=>S(()=>import("./AdminCrawlHealth-BS1rEwwo.js"),__vite__mapDeps([583,580,576,129,130,131,26,150,581,515,577,64,43]))),z5=p.lazy(()=>S(()=>import("./AdminFeedHealth-BLWnw7As.js"),__vite__mapDeps([584,580,129,130,131,150,577,64]))),W5=p.lazy(()=>S(()=>import("./AdminPodcastTranscripts-PhpRcZUi.js"),__vite__mapDeps([585,129,130,131,184,64,177]))),$5=p.lazy(()=>S(()=>import("./AdminPodcastSeo-vyNf4C7F.js"),__vite__mapDeps([586,129,130,131,150,182,183,184,187]))),H5=p.lazy(()=>S(()=>import("./AdminRegulatoryTracker-DVgUDXqB.js"),__vite__mapDeps([587,129,130,131,150,487,26]))),V5=p.lazy(()=>S(()=>import("./AdminApplications-DRfLlqH7.js"),__vite__mapDeps([588,129,130,131,150,487,26,557]))),G5=p.lazy(()=>S(()=>import("./AdminHiringFunnel-D5ODsnb1.js"),__vite__mapDeps([589,129,130,131,150,557]))),K5=p.lazy(()=>S(()=>import("./AdminWeekly-bVr-SUlo.js"),__vite__mapDeps([590,129,130,131,150,581,515,15,16,487,488,489,490,188,47,136,64,146]))),Vd=p.lazy(()=>S(()=>import("./WeeklyConfirm-D0hDTTuE.js"),__vite__mapDeps([591,64]))),Q5=p.lazy(()=>S(()=>import("./WeeklyRssRedirect-DgGMLNnr.js"),[])),X5=p.lazy(()=>S(()=>import("./Unsubscribe-C6Rc6Y7I.js"),__vite__mapDeps([592,64]))),J5=p.lazy(()=>S(()=>
252import("./FdaDeficiencyLettersHub-D3xcffxi.js"),__vite__mapDeps([593,29,564,34,35]))),Y5=p.lazy(()=>S(()=>import("./FdaDeficiencyLetterTopic-D3kQchzV.js"),__vite__mapDeps([594,29,564,475,34,35,47]))),Z5=p.lazy(()=>S(()=>import("./Research-B1yn9HFG.js"),__vite__mapDeps([595,29,596]))),e6=p.lazy(()=>S(()=>import("./CompareSw96Tir57-ChqVh9Ci.js"),__vite__mapDeps([597,44,18,598]))),t6=p.lazy(()=>S(()=>import("./ComparePathways-C6n6C3t3.js"),__vite__mapDeps([599,598]))),i6=p.lazy(()=>S(()=>import("./CompareSpdxCyclonedx-3ESORoG5.js"),__vite__mapDeps([600,598]))),r6=p.lazy(()=>S(()=>import("./ComparePage-CwlChnwR.js"),__vite__mapDeps([601,44,18,598,53,48,602,43,50]))),s6=p.lazy(()=>S(()=>import("./FdaCybersecurityTimeline-DpKKHoDt.js"),__vite__mapDeps([603,598]))),n6=p.lazy(()=>S(()=>import("./FdaCybersecurityAcronyms-BTOjHG1g.js"),__vite__mapDeps([604,598]))),a6=p.lazy(()=>S(()=>import("./DeviceClassesCyberRequirements-CTzUXPjI.js"),__vite__mapDeps([605,598]))),o6=p.lazy(()=>S(()=>import("./ResearchReport-CYuwj8xb.js"),__vite__mapDeps([606,26,607,167,95,168,169,502,582,114,7,43,596,39,40]))),c6=p.lazy(()=>S(()=>import("./ResearchPressKit-DN16dhBm.js"),__vite__mapDeps([608,607,167,95,168,169,502,582,596,39,40,4]))),l6=p.lazy(()=>S(()=>import("./ResearchData-BEDcDgJi.js"),__vite__mapDeps([609,29,596,43]))),d6=p.lazy(()=>S(()=>import("./Goatwatch-61zr7Bnk.js"),__vite__mapDeps([610,602,32,477,127,516,132,147,146,47,20,27,143,5,50,172]))),u6=p.lazy(()=>S(()=>import("./GoatwatchGuide-C544YZ0H.js"),__vite__mapDeps([611,49]))),h6=p.lazy(()=>S(()=>import("./MedicalDeviceCybersecurity-CD7TOQ7Y.js"),__vite__mapDeps([612,29,165])));p.lazy(()=>S(()=>import("./ThreatGoatMarketing-CR2WZvuV.js"),[]));p.lazy(()=>S(()=>import("./ThreatGoatPricing-DXDQtyfZ.js"),__vite__mapDeps([613,614,47])));p.lazy(()=>S(()=>import("./ThreatGoatSignup-D_L_I8qT.js"),__vite__mapDeps([615,130,488,489,16,490,188,47,131,616,614])));const m6=p.lazy(()=>S(()=>import("./ThreatGoatLogin-pH9ombbx.js"),__vite__mapDeps([617,130,131,618])));p.lazy(()=>S(()=>import("./ThreatGoatCheckout-C5ndmwWy.js"),__vite__mapDeps([619,94,620,616,614,47,621])));p.lazy(()=>S(()=>import("./ThreatGoatCheckoutReturn-DpwxOT7i.js"),[]));const p6=p.lazy(()=>S(()=>import("./ThreatGoatDashboard-DOam8iCK.js"),__vite__mapDeps([622,621,620,614,15,16,130,488,489,490,188,47,147]))),g6=p.lazy(()=>S(()=>import("./ThreatGoatProjectWorkspace-5fbxwxES.js"),__vite__mapDeps([623,130,487,496,490,47,488,489,16,188,621,15,147,146,17]))),cy=p.lazy(()=>S(()=>import("./RequireThreatGoatAccess-BJryrJrl.js"),__vite__mapDeps([624,621,620,618])).then(e=>({default:e.RequireThreatGoatAccess}))),f6=new t2,y6=()=>a.jsx("div",{className:"min-h-[60vh]","aria-busy":"true","aria-live":"polite"}),b6=()=>a.jsx(i0,{children:a.jsx(i2,{client:f6,children:a.jsxs(zE,{children:[a.jsx(dT,{}),a.jsx(mC,{}),a.jsxs(eS,{children:[a.jsx(KE,{}),a.jsx(vI,{children:a.jsx(p.Suspense,{fallback:a.jsx(y6,{}),children:a.jsxs(H2,{children:[a.jsx(A,{path:"/",element:a.jsx(hM,{})}),a.jsx(A,{path:"/medical-device-cybersecurity",element:a.jsx(h6,{})}),a.jsx(A,{path:"/services",element:a.jsx(lF,{})}),a.jsx(A,{path:"/services/fda-cybersecurity",element:a.jsx(dF,{})}),a.jsx(A,{path:"/services/:serviceSlug/for/:segmentSlug",element:a.jsx(hF,{})}),a.jsx(A,{path:"/services/:slug",element:a.jsx(uF,{})}),a.jsx(A,{path:"/mti-apac",element:a.jsx(mF,{})}),a.jsx(A,{path:"/mti-apac/readiness",element:a.jsx(pF,{})}),a.jsx(A,{path:"/mti-apac/resources",element:a.jsx(gF,{})}),a.jsx(A,{path:"/mti-apac/budget",element:a.jsx(fF,{})}),a.jsx(A,{path:"/mti-apac/faq",element:a.jsx(yF,{})}),a.jsx(A,{path:"/lp/510k-cybersecurity",element:a.jsx(bF,{})}),a.jsx(A,{path:"/lp/section-524b-cybersecurity",element:a.jsx(vF,{})}),a.jsx(A,{path:"/lp/pma-de-novo-cybersecurity",element:a.jsx(wF,{})}),a.jsx(A,{path:"/lp/fda-deficiency-letter",element:a.jsx(kF,{})}),a.jsx(A,{path:"/lp/fda-hold-letter",element:a.jsx(xF,{})}),a.jsx(A,{path:"/lp/fda-refuse-to-accept",element:a.jsx(AF,{})}),a.jsx(A,{path:"/lp/medical-device-penetration-testing",element:a.jsx(SF,{})}),a.jsx(A,{path:"/lp/medical-device-penetration-testing-requirements",element:a.jsx(CF,{})}),a.jsx(A,{path:"/lp/fda-penetration-testing",element:a.jsx(DF,{})}),a.jsx(A,{path:"/lp/fda-postmarket-cybersecurity",element:a.jsx(TF,{})}),a.jsx(A,{path:"/lp/postmarket-vulnerability-management",element:a.jsx(EF,{})}),a.jsx(A,{path:"/lp/fda-premarket-cybersecurity",element:a.jsx(PF,{})}),a.jsx(A,{path:"/lp/medical-device-cybersecurity",element:a.jsx(_F,{})}),a.jsx(A,{path:"/lp/fda-cybersecurity-consulting",element:a.jsx(IF,{})}),a.jsx(A,{path:"/lp/ide-cybersecurity",element:a.jsx(jF,{})}),a.jsx(A,{path:"/lp/blue-goat-vs-medcrypt",element:a.jsx(MF,{})}),a.jsx(A,{path:"/lp/blue-goat-vs-medsec",element:a.jsx(RF,{})}),a.jsx(A,{path:"/lp/blue-goat-vs-velentium",element:a.jsx(OF,{})}),a.jsx(A,{path:"/lp/blue-goat-cyber-vs-medcrypt",element:a.jsx(ke,{to:"/lp/blue-goat-vs-medcrypt"})}),a.jsx(A,{path:"/lp/blue-goat-cyber-vs-medsec",element:a.jsx(ke,{to:"/lp/blue-goat-vs-medsec"})}),a.jsx(A,{path:"/lp/blue-goat-cyber-vs-velentium",element:a.jsx(ke,{to:"/lp/blue-goat-vs-velentium"})}),a.jsx(A,{path:"/medtech-segments",element:a.jsx(P4,{})}),a.jsx(A,{path:"/medtech-segments/:slug",element:a.jsx(_4,{})}),a.jsx(A,{path:"/journey",element:a.jsx(y5,{})}),a.jsx(A,{path:"/journey/:stage",element:a.jsx(f5,{})}),a.jsx(A,{path:"/about",element:a.jsx(FF,{})}),a.jsx(A,{path:"/company-overview",element:a.jsx(r4,{})}),a.jsx(A,{path:"/give-back",element:a.jsx(i4,{})}),a.jsx(A,{path:"/site-index",element:a.jsx(ke,{to:"/"})}),a.jsx(A,{path:"/sitemap",element:a.jsx(ke,{to:"/"})}),a.jsx(A,{path:"/leadership",element:a.jsx(u5,{})}),a.jsx(A,{path:"/christian-espinosa",element:a.jsx(ke,{to:"/team/christian-espinosa"})}),a.jsx(A,{path:"/trevor-slattery",element:a.jsx(ke,{to:"/leadership"})}),a.jsx(A,{path:"/myles-kellerman",element:a.jsx(ke,{to:"/team/myles-kellerman"})}),a.jsx(A,{path:"/melissa-espinosa",element:a.jsx(ke,{to:"/team/melissa-espinosa"})}),a.jsx(A,{path:"/kristy-kennedy",element:a.jsx(ke,{to:"/team/kristy-kennedy"})}),a.jsx(A,{path:"/jordan-john",element:a.jsx(ke,{to:"/team/jordan-john"})}),a.jsx(A,{path:"/michelle-hughes",element:a.jsx(ke,{to:"/team/michelle-hughes"})}),a.jsx(A,{path:"/sarah-beach",element:a.jsx(ke,{to:"/team/sarah-beach"})}),a.jsx(A,{path:"/team/christian-espinosa",element:a.jsx(h5,{})}),a.jsx(A,{path:"/team/trevor-slattery",element:a.jsx(ke,{to:"/leadership"})}),a.jsx(A,{path:"/team/:slug",element:a.jsx(ay,{})}),a.jsx(A,{path:"/team/:slug",element:a.jsx(ay,{})}),a.jsx(A,{path:"/about/awards",element:a.jsx(m5,{})}),a.jsx(A,{path:"/about/core-values",element:a.jsx(p5,{})}),a.jsx(A,{path:"/about/manifesto",element:a.jsx(g5,{})}),a.jsx(A,{path:"/about-us",element:a.jsx(ke,{to:"/about"})}),a.jsx(A,{path:"/about-us/leadership",element:a.jsx(ke,{to:"/leadership"})}),a.jsx(A,{path:"/about-us/awards",element:a.jsx(ke,{to:"/about/awards"})}),a.jsx(A,{path:"/why",element:a.jsx(E4,{})}),a.jsx(A,{path:"/faqs",element:a.jsx(NF,{})}),a.jsx(A,{path:"/fda-cybersecurity-faq",element:a.jsx(LF,{})}),a.jsx(A,{path:"/faq",element:a.jsx(ke,{to:"/faqs"})}),a.jsx(A,{path:"/ask-the-goat",element:a.jsx(_5,{})}),a.jsx(A,{path:"/contact",element:a.jsx(BF,{})}),a.jsx(A,{path:"/blog",element:a.jsx($d,{})}),a.jsx(A,{path:"/blog/topics",element:a.jsx(UF,{})}),a.jsx(A,{path:"/blog/category/:slug",element:a.jsx($d,{})}),a.jsx(A,{path:"/blog/tag/:slug",element:a.jsx($d,{})}),a.jsx(A,{path:"/blog/:slug",element:a.jsx(qF,{})}),a.jsx(A,{path:"/goatfeed",element:a.jsx(Hd,{})}),a.jsx(A,{path:"/goatfeed/today",element:a.jsx(Hd,{})}),a.jsx(A,{path:"/goatfeed/dashboard",element:a.jsx(HF,{})}),a.jsx(A,{path:"/goatfeed/account",element:a.jsx(VF,{})}),a.jsx(A,{path:"/goatfeed/day/:date",element:a.jsx(Hd,{})}),a.jsx(A,{path:"/goatfeed/week/:key",element:a.jsx(Ho,{period:"week"})}),a.jsx(A,{path:"/goatfeed/month/:key",element:a.jsx(Ho,{period:"month"})}),a.jsx(A,{path:"/goatfeed/quarter/:key",element:a.jsx(Ho,{period:"quarter"})}),a.jsx(A,{path:"/goatfeed/year/:key",element:a.jsx(Ho,{period:"year"})}),a.jsx(A,{path:"/goatfeed/topic/:slug",element:a.jsx(KF,{})}),a.jsx(A,{path:"/goatfeed/item/:slug",element:a.jsx(GF,{})}),a.jsx(A,{path:"/goatfeed/vendor/:slug",element:a.jsx(QF,{})}),a.jsx(A,{path:"/goatfeed/archive",element:a.jsx(ke,{to:"/news/the-goats-weekly"})}),a.jsx(A,{path:"/goatfeed/:slug",element:a.jsx(cF,{})}),a.jsx(A,{path:"/goatfeed/methodology",element:a.jsx(XF,{})}),a.jsx(A,{path:"/goatfeed/risk-rubric",element:a.jsx(JF,{})}),a.jsx(A,{path:"/methodology",element:a.jsx(ke,{to:"/goatfeed/methodology"})}),a.jsx(A,{path:"/feed",element:a.jsx(si,{to:"/goatfeed",replace:!0})}),a.jsx(A,{path:"/feed/*",element:a.jsx(oF,{})}),a.jsx(A,{path:"/guides",element:a.jsx(ny,{})}),a.jsx(A,{path:"/guides/tag/:slug",element:a.jsx(ny,{})}),a.jsx(A,{path:"/guides/guides",element:a.jsx(ke,{to:"/guides"})}),a.jsx(A,{path:"/guides/:slug",element:a.jsx(YF,{})}),a.jsx(A,{path:"/collections/pccp-cybersecurity",element:a.jsx(ZF,{})}),a.jsx(A,{path:"/search",element:a.jsx(T4,{})}),a.jsx(A,{path:"/resources",element:a.jsx(e4,{})}),a.jsx(A,{path:"/resources/global-regulatory-map",element:a.jsx(j5,{})}),a.jsx(A,{path:"/resources/playbooks",element:a.jsx(I5,{})}),a.jsx(A,{path:"/resources/playbooks/:slug",element:a.jsx(M5,{})}),a.jsx(A,{path:"/resources/infographics",element:a.jsx(R5,{})}),a.jsx(A,{path:"/resources/infographics/:slug",element:a.jsx(O5,{})}),a.jsx(A,{path:"/regulatory-strategy",element:a.jsx(F5,{})}),a.jsx(A,{path:"/funding-cybersecurity",element:a.jsx(N5,{})}),a.jsx(A,{path:"/resources/pulse",element:a.jsx(b5,{})}),a.jsx(A,{path:"/resources/pulse/:slug",element:a.jsx(v5,{})}),a.jsx(A,{path:"/resources/:collection",element:a.jsx(t4,{})}),a.jsx(A,{path:"/research",element:a.jsx(Z5,{})}),a.jsx(A,{path:"/research/data",element:a.jsx(l6,{})}),a.jsx(A,{path:"/research/:slug",element:a.jsx(o6,{})}),a.jsx(A,{path:"/research/:slug/press-kit",element:a.jsx(c6,{})}),a.jsx(A,{path:"/research/:slug/embed/:chartId",element:a.jsx(aF,{})}),a.jsx(A,{path:"/case-studies",element:a.jsx(s4,{})}),a.jsx(A,{path:"/events",element:a.jsx(w5,{})}),a.jsx(A,{path:"/events/:slug",element:a.jsx(k5,{})}),a.jsx(A,{path:"/testimonials",element:a.jsx(n4,{})}),a.jsx(A,{path:"/webinars",element:a.jsx(a4,{})}),a.jsx(A,{path:"/webinars/:slug",element:a.jsx(o4,{})}),a.jsx(A,{path:"/podcast",element:a.jsx(c4,{})}),a.jsx(A,{path:"/podcast/topics/:slug",element:a.jsx(d4,{})}),a.jsx(A,{path:"/podcast/:slug",element:a.jsx(l4,{})}),a.jsx(A,{path:"/the-med-device-cyber-podcast",element:a.jsx(ke,{to:"/podcast"})}),a.jsx(A,{path:"/news",element:a.jsx(u4,{})}),a.jsx(A,{path:"/news/regulatory-tracker",element:a.jsx(f4,{})}),a.jsx(A,{path:"/news/regulatory-tracker/agency/:agencySlug",element:a.jsx(b4,{})}),a.jsx(A,{path:"/news/regulatory-tracker/:slug",element:a.jsx(y4,{})}),a.jsx(A,{path:"/news/mentions",element:a.jsx(g4,{})}),a.jsx(A,{path:"/news/mentions/:slug",element:a.jsx(p4,{})}),a.jsx(A,{path:"/news/medical-device-cybersecurity-updates",element:a.jsx(m4,{})}),a.jsx(A,{path:"/news/the-goats-weekly",element:a.jsx(zF,{})}),a.jsx(A,{path:"/news/the-goats-weekly/rss.xml",element:a.jsx(Q5,{})}),a.jsx(A,{path:"/news/the-goats-weekly/:slug",element:a.jsx($F,{})}),a.jsx(A,{path:"/news/:slug",element:a.jsx(h4,{})}),a.jsx(A,{path:"/editorial-standards",element:a.jsx(WF,{})}),a.jsx(A,{path:"/partners",element:a.jsx(n5,{})}),a.jsx(A,{path:"/partners/:slug",element:a.jsx(o5,{})}),a.jsx(A,{path:"/supplier-qualification",element:a.jsx(a5,{})}),a.jsx(A,{path:"/ecosystem",element:a.jsx(c5,{})}),a.jsx(A,{path:"/products/goatwatch",element:a.jsx(d6,{})}),a.jsx(A,{path:"/products/goatwatch/guide",element:a.jsx(u6,{})}),a.jsx(A,{path:"/prep",element:a.jsx(l5,{})}),a.jsx(A,{path:"/cvd",element:a.jsx(v4,{})}),a.jsx(A,{path:"/executive-briefing",element:a.jsx(w4,{})}),a.jsx(A,{path:"/privacy-policy",element:a.jsx(k4,{})}),a.jsx(A,{path:"/terms-of-service",element:a.jsx(x4,{})}),a.jsx(A,{path:"/cookie-policy",element:a.jsx(A4,{})}),a.jsx(A,{path:"/accessibility",element:a.jsx(S4,{})}),a.jsx(A,{path:"/form-submission-confirmation",element:a.jsx(C4,{})}),a.jsx(A,{path:"/meeting-confirmation",element:a.jsx(D4,{})}),a.jsx(A,{path:"/products/threatgoat/pricing",element:a.jsx(Hn,{})}),a.jsx(A,{path:"/products/threatgoat/signup",element:a.jsx(Hn,{})}),a.jsx(A,{path:"/products/threatgoat/login",element:a.jsx(m6,{})}),a.jsx(A,{path:"/products/threatgoat/checkout",element:a.jsx(Hn,{})}),a.jsx(A,{path:"/products/threatgoat/checkout/return",element:a.jsx(Hn,{})}),a.jsx(A,{path:"/products/threatgoat",element:a.jsx(cy,{children:a.jsx(p6,{})})}),a.jsx(A,{path:"/products/threatgoat/:projectId",element:a.jsx(cy,{children:a.jsx(g6,{})})}),a.jsx(A,{path:"/scope-estimator",element:a.jsx(j4,{})}),a.jsx(A,{path:"/cost-of-delay",element:a.jsx(r5,{})}),a.jsx(A,{path:"/tools",element:a.jsx(M4,{})}),a.jsx(A,{path:"/tools/pccp-builder",element:a.jsx(R4,{})}),a.jsx(A,{path:"/tools/cyber-device-applicability",element:a.jsx(O4,{})}),a.jsx(A,{path:"/tools/samd-simd-classifier",element:a.jsx(F4,{})}),a.jsx(A,{path:"/tools/sbom-readiness",element:a.jsx(N4,{})}),a.jsx(A,{path:"/readiness",element:a.jsx(I4,{})}),a.jsx(A,{path:"/tools/threat-model-starter",element:a.jsx(L4,{})}),a.jsx(A,{path:"/tools/cvd-policy-generator",element:a.jsx(B4,{})}
252),a.jsx(A,{path:"/tools/deficiency-letter-triage",element:a.jsx(U4,{})}),a.jsx(A,{path:"/tools/postmarket-cadence-calculator",element:a.jsx(q4,{})}),a.jsx(A,{path:"/tools/estar-cyber-checklist",element:a.jsx(z4,{})}),a.jsx(A,{path:"/tools/sbom-diff-vex",element:a.jsx(W4,{})}),a.jsx(A,{path:"/tools/component-risk-scorecard",element:a.jsx($4,{})}),a.jsx(A,{path:"/tools/legacy-component-triage",element:a.jsx(H4,{})}),a.jsx(A,{path:"/tools/wireless-interface-profiler",element:a.jsx(V4,{})}),a.jsx(A,{path:"/tools/controlled-risk-classifier",element:a.jsx(G4,{})}),a.jsx(A,{path:"/tools/mds2-generator",element:a.jsx(K4,{})}),a.jsx(A,{path:"/tools/spdf-gap-checker",element:a.jsx(Q4,{})}),a.jsx(A,{path:"/tools/submission-pathway-selector",element:a.jsx(X4,{})}),a.jsx(A,{path:"/tools/ota-update-questionnaire",element:a.jsx(J4,{})}),a.jsx(A,{path:"/tools/sir-response-builder",element:a.jsx(Y4,{})}),a.jsx(A,{path:"/tools/pathway-crosswalk",element:a.jsx(Z4,{})}),a.jsx(A,{path:"/tools/standards-mapper",element:a.jsx(e5,{})}),a.jsx(A,{path:"/tools/cr515-crosswalk",element:a.jsx(i5,{})}),a.jsx(A,{path:"/tools/ai-ml-submission-timeline",element:a.jsx(t5,{})}),a.jsx(A,{path:"/misconceptions",element:a.jsx(s5,{})}),a.jsx(A,{path:"/fda-cybersecurity-deficiency-letters",element:a.jsx(J5,{})}),a.jsx(A,{path:"/fda-cybersecurity-deficiency-letters/:slug",element:a.jsx(Y5,{})}),a.jsx(A,{path:"/glossary",element:a.jsx(d5,{})}),Object.entries(aS).map(([e,t])=>a.jsx(A,{path:e,element:a.jsx(si,{to:t,replace:!0})},e)),a.jsx(A,{path:"/topics",element:a.jsx(T5,{})}),a.jsx(A,{path:"/topics/:slug",element:a.jsx(P5,{})}),a.jsx(A,{path:"/proof",element:a.jsx(E5,{})}),a.jsx(A,{path:"/compare",element:a.jsx(ke,{to:"/compare/510k-vs-de-novo-vs-pma-cybersecurity"})}),a.jsx(A,{path:"/compare/aami-sw96-vs-tir57",element:a.jsx(e6,{})}),a.jsx(A,{path:"/compare/510k-vs-de-novo-vs-pma-cybersecurity",element:a.jsx(t6,{})}),a.jsx(A,{path:"/compare/spdx-vs-cyclonedx",element:a.jsx(i6,{})}),a.jsx(A,{path:"/compare/:slug",element:a.jsx(r6,{})}),a.jsx(A,{path:"/reference/fda-cybersecurity-timeline",element:a.jsx(s6,{})}),a.jsx(A,{path:"/reference/fda-cybersecurity-acronyms",element:a.jsx(n6,{})}),a.jsx(A,{path:"/reference/medical-device-classes-cybersecurity-requirements",element:a.jsx(a6,{})}),a.jsx(A,{path:"/media",element:a.jsx(x5,{})}),a.jsx(A,{path:"/press",element:a.jsx(A5,{})}),a.jsx(A,{path:"/careers",element:a.jsx(S5,{})}),a.jsx(A,{path:"/careers/faq",element:a.jsx(D5,{})}),a.jsx(A,{path:"/careers/apply",element:a.jsx(oy,{})}),a.jsx(A,{path:"/careers/apply/:slug",element:a.jsx(oy,{})}),a.jsx(A,{path:"/careers/:slug",element:a.jsx(C5,{})}),DI(),a.jsx(A,{path:"/admin/404-log",element:a.jsx(L5,{})}),a.jsx(A,{path:"/admin/link-opportunities",element:a.jsx(B5,{})}),a.jsx(A,{path:"/admin/seo",element:a.jsx(U5,{})}),a.jsx(A,{path:"/admin/crawl-health",element:a.jsx(q5,{})}),a.jsx(A,{path:"/admin/feed-health",element:a.jsx(z5,{})}),a.jsx(A,{path:"/admin/podcast-transcripts",element:a.jsx(W5,{})}),a.jsx(A,{path:"/admin/podcast-seo",element:a.jsx($5,{})}),a.jsx(A,{path:"/admin/regulatory-tracker",element:a.jsx(H5,{})}),a.jsx(A,{path:"/admin/applications",element:a.jsx(V5,{})}),a.jsx(A,{path:"/admin/hiring-funnel",element:a.jsx(G5,{})}),a.jsx(A,{path:"/admin/goatfeed",element:a.jsx(K5,{})}),a.jsx(A,{path:"/news/the-goats-weekly/confirm",element:a.jsx(Vd,{})}),a.jsx(A,{path:"/goatfeed/confirm",element:a.jsx(Vd,{})}),a.jsx(A,{path:"/weekly/confirm",element:a.jsx(Vd,{})}),a.jsx(A,{path:"/unsubscribe",element:a.jsx(X5,{})}),a.jsx(A,{path:"*",element:a.jsx(Hn,{})})]})})})]})]})})});Iv(document.getElementById("root")).render(a.jsx(b6,{}));export{sj as $,Me as A,Od as B,mj as C,Xg as D,O_ as E,Xc as F,wD as G,k_ as H,M6 as I,W6 as J,Zj as K,H as L,xk as M,si as N,Ij as O,Ak as P,Sk as Q,yj as R,uc as S,_6 as T,eo as U,$6 as V,Km as W,L6 as X,Xn as Y,nj as Z,S as _,mt as a,FN as a$,$c as a0,R0 as a1,kD as a2,QI as a3,hj as a4,Wn as a5,dN as a6,X_ as a7,mf as a8,E as a9,Mt as aA,Bw as aB,Lw as aC,nN as aD,Y_ as aE,Z_ as aF,Za as aG,T_ as aH,L_ as aI,J6 as aJ,Y6 as aK,pN as aL,S6 as aM,F0 as aN,xn as aO,vt as aP,Fe as aQ,_e as aR,Pl as aS,Em as aT,D6 as aU,to as aV,Mm as aW,d0 as aX,Wc as aY,Va as aZ,Sr as a_,A_ as aa,E_ as ab,eN as ac,j_ as ad,Ow as ae,TD as af,gN as ag,SD as ah,__ as ai,Gm as aj,AN as ak,mN as al,Fd as am,kN as an,vD as ao,G_ as ap,SN as aq,M_ as ar,iN as as,aN as at,TN as au,Q6 as av,S_ as aw,DN as ax,Rt as ay,X6 as az,xj as b,Z6 as b$,NN as b0,MN as b1,MI as b2,qw as b3,Uw as b4,RN as b5,ke as b6,z6 as b7,q6 as b8,N6 as b9,R_ as bA,hf as bB,fN as bC,jN as bD,lN as bE,ON as bF,Ej as bG,zw as bH,DD as bI,XI as bJ,I0 as bK,rN as bL,pD as bM,CD as bN,Yc as bO,ED as bP,H_ as bQ,O0 as bR,P_ as bS,_h as bT,W_ as bU,IN as bV,uN as bW,bN as bX,UN as bY,D_ as bZ,II as b_,cN as ba,qN as bb,no as bc,_N as bd,w6 as be,sF as bf,Gk as bg,bC as bh,uf as bi,tN as bj,U6 as bk,vC as bl,sN as bm,AD as bn,Ya as bo,j0 as bp,wN as bq,yN as br,xN as bs,rw as bt,wE as bu,kE as bv,xE as bw,vE as bx,oN as by,C6 as bz,rk as c,zE as c0,BN as c1,Nw as c2,R6 as c3,n0 as c4,vi as c5,$C as c6,Uj as c7,w_ as c8,B_ as c9,Al as cA,W1 as cB,F1 as cC,k6 as cD,Uu as cE,Vt as cF,Sl as cG,R1 as cH,O1 as cI,Rv as cJ,K1 as cK,L1 as cL,et as cM,x6 as cN,A6 as cO,hN as cP,Fw as cQ,H6 as cR,V_ as cS,j6 as cT,vN as cU,F6 as cV,F_ as ca,C_ as cb,q_ as cc,K_ as cd,G6 as ce,gD as cf,Jc as cg,U_ as ch,B6 as ci,hE as cj,$_ as ck,V6 as cl,O6 as cm,Nd as cn,N_ as co,fD as cp,PN as cq,Hn as cr,EN as cs,dh as ct,dj as cu,LN as cv,Jw as cw,_l as cx,CN as cy,Jg as cz,Rw as d,Yt as e,zN as f,Mw as g,ve as h,fI as i,a as j,x_ as k,z_ as l,ge as m,Di as n,Qs as o,Fo as p,EI as q,p as r,K6 as s,I6 as t,Dm as u,WE as v,Zw as w,ao as x,KI as y,Hc as z};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.