{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/wsKqjEvDwH18LIO4wzsv/P1kPSvCcSrjGnW8iR3I6/siteMetadata.js"],
  "sourcesContent": ["// Generated by Framer (d65f646)\nexport default function metadata(params,activeLocale){return{customHTMLBodyEnd:'<!-- Google Tag Manager (noscript) -->\\n<noscript><iframe src=\"https://www.googletagmanager.com/ns.html?id=GTM-MD5PNVP\" height=\"0\" width=\"0\" style=\"display:none;visibility:hidden\"></iframe></noscript>\\n<!-- End Google Tag Manager (noscript) -->',customHTMLHeadEnd:\"<!-- Google Tag Manager -->\\n<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\\nj=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\\n'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\\n})(window,document,'script','dataLayer','GTM-MD5PNVP');</script>\\n<!-- End Google Tag Manager -->\\n\\n<script nowprocket=\\\"\\\" nitro-exclude=\\\"\\\" type=\\\"text/javascript\\\" id=\\\"sa-dynamic-optimization\\\" data-uuid=\\\"0ee1b952-5c31-4007-bfe5-eee3354a7bcb\\\" src=\\\"data:text/javascript;base64,dmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3NjcmlwdC5zZXRBdHRyaWJ1dGUoIm5vd3Byb2NrZXQiLCAiIik7c2NyaXB0LnNldEF0dHJpYnV0ZSgibml0cm8tZXhjbHVkZSIsICIiKTtzY3JpcHQuc3JjID0gImh0dHBzOi8vZGFzaGJvYXJkLnNlYXJjaGF0bGFzLmNvbS9zY3JpcHRzL2R5bmFtaWNfb3B0aW1pemF0aW9uLmpzIjtzY3JpcHQuZGF0YXNldC51dWlkID0gIjBlZTFiOTUyLTVjMzEtNDAwNy1iZmU1LWVlZTMzNTRhN2JjYiI7c2NyaXB0LmlkID0gInNhLWR5bmFtaWMtb3B0aW1pemF0aW9uLWxvYWRlciI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOw==\\\"></script>\\n\\n<script>\\n// Visitor Tracking Script\\nclass VisitorTracker {\\n    constructor() {\\n        this.startTime = this.getOrSetStartTime();\\n        this.pageVisits = this.getOrSetPageVisits();\\n        this.isReturning = this.checkReturningVisitor();\\n        this.setupTracking();\\n    }\\n\\n    // Get or set the initial start time from sessionStorage\\n    getOrSetStartTime() {\\n        let startTime = sessionStorage.getItem('visitorStartTime');\\n        if (!startTime) {\\n            startTime = Date.now();\\n            sessionStorage.setItem('visitorStartTime', startTime);\\n        }\\n        return parseInt(startTime);\\n    }\\n\\n    // Get or set the page visits from sessionStorage\\n    getOrSetPageVisits() {\\n        let visits = new Set();\\n        try {\\n            const storedVisits = JSON.parse(sessionStorage.getItem('pageVisits') || '[]');\\n            visits = new Set(storedVisits);\\n        } catch (e) {\\n            console.error('Error parsing stored page visits:', e);\\n        }\\n        return visits;\\n    }\\n\\n    // Check if this is a returning visitor using localStorage\\n    checkReturningVisitor() {\\n        const lastVisit = localStorage.getItem('lastVisit');\\n        const isReturning = !!lastVisit;\\n        localStorage.setItem('lastVisit', Date.now());\\n        return isReturning;\\n    }\\n\\n    // Calculate time spent on site\\n    getTimeOnSite() {\\n        const timeSpent = Math.floor((Date.now() - this.startTime) / 1000); // in seconds\\n        return timeSpent;\\n    }\\n\\n    // Track page visits\\n    trackPageVisit() {\\n        // Get full URL information\\n        const currentPath = window.location.pathname + window.location.search;\\n        const timestamp = new Date().toISOString();\\n        \\n        // Add new visit with timestamp\\n        this.pageVisits.add(JSON.stringify({\\n            path: currentPath,\\n            timestamp: timestamp,\\n            fullUrl: window.location.href\\n        }));\\n\\n        // Store updated visits in sessionStorage\\n        sessionStorage.setItem('pageVisits', JSON.stringify(Array.from(this.pageVisits)));\\n        \\n        // Log for debugging\\n        console.log('Page visit tracked:', currentPath);\\n        \\n        return Array.from(this.pageVisits).map(visit => JSON.parse(visit));\\n    }\\n\\n    // Get user's browser information\\n    getUserBrowserInfo() {\\n        return {\\n            userAgent: navigator.userAgent,\\n            language: navigator.language,\\n            platform: navigator.platform,\\n            screenWidth: window.screen.width,\\n            screenHeight: window.screen.height,\\n            timezone: Intl.DateTimeFormat().resolvedOptions().timeZone\\n        };\\n    }\\n\\n    // Get all tracking data as an object\\n    getTrackingData() {\\n        const visits = Array.from(this.pageVisits).map(visit => {\\n            try {\\n                return JSON.parse(visit);\\n            } catch (e) {\\n                return visit;\\n            }\\n        });\\n\\n        return {\\n            currentURL: window.location.href,\\n            referrer: document.referrer,\\n            timeOnSite: this.getTimeOnSite(),\\n            pagesVisited: visits,\\n            totalPagesVisited: visits.length,\\n            isReturning: this.isReturning,\\n            browserInfo: this.getUserBrowserInfo(),\\n            lastUpdated: new Date().toISOString(),\\n            sessionStartTime: new Date(this.startTime).toISOString()\\n        };\\n    }\\n\\n    // Update the user_data hidden field\\n    updateFormField() {\\n        const userDataField = document.querySelector('input[name=\\\"user_data\\\"]');\\n        if (userDataField) {\\n            const trackingData = this.getTrackingData();\\n            userDataField.value = JSON.stringify(trackingData);\\n            console.log('Updated user_data field:', trackingData);\\n        } else {\\n            console.error('Could not find hidden field with name \\\"user_data\\\"');\\n        }\\n    }\\n\\n    // Setup tracking events\\n    setupTracking() {\\n        // Track initial page load\\n        this.trackPageVisit();\\n\\n        // Update form field every 2 seconds and check for URL changes\\n        let lastUrl = location.href;\\n        setInterval(() => {\\n            // Check if URL has changed\\n            if (location.href !== lastUrl) {\\n                lastUrl = location.href;\\n                this.trackPageVisit();\\n            }\\n            this.updateFormField();\\n        }, 2000);\\n\\n        // Track page visibility changes\\n        document.addEventListener('visibilitychange', () => {\\n            if (document.visibilityState === 'hidden') {\\n                this.trackPageVisit();\\n                this.updateFormField();\\n            }\\n        });\\n\\n        // Track pushState and replaceState\\n        const originalPushState = history.pushState;\\n        const originalReplaceState = history.replaceState;\\n        \\n        history.pushState = function() {\\n            originalPushState.apply(this, arguments);\\n            window.visitorTracker.trackPageVisit();\\n            window.visitorTracker.updateFormField();\\n        };\\n        \\n        history.replaceState = function() {\\n            originalReplaceState.apply(this, arguments);\\n            window.visitorTracker.trackPageVisit();\\n            window.visitorTracker.updateFormField();\\n        };\\n\\n        // Listen for popstate events\\n        window.addEventListener('popstate', () => {\\n            this.trackPageVisit();\\n            this.updateFormField();\\n        });\\n\\n        // Track all click events that might be navigation\\n        document.addEventListener('click', (e) => {\\n            // Give a small delay to allow for navigation to complete\\n            setTimeout(() => {\\n                this.trackPageVisit();\\n                this.updateFormField();\\n            }, 100);\\n        });\\n    }\\n}\\n\\n// Ensure the hidden field exists\\nfunction ensureHiddenField() {\\n    let userDataField = document.querySelector('input[name=\\\"user_data\\\"]');\\n    \\n    if (!userDataField) {\\n        userDataField = document.createElement('input');\\n        userDataField.type = 'hidden';\\n        userDataField.name = 'user_data';\\n        \\n        // Find any form on the page\\n        const form = document.querySelector('form');\\n        if (form) {\\n            form.appendChild(userDataField);\\n            console.log('Created and attached user_data hidden field to form');\\n        } else {\\n            console.error('No form found on page to attach user_data field');\\n        }\\n    }\\n}\\n\\n// Initialize tracking when DOM is fully loaded\\ndocument.addEventListener('DOMContentLoaded', () => {\\n    ensureHiddenField();\\n    window.visitorTracker = new VisitorTracker();\\n});\\n</script>\",description:\"Discover expert hearing care at Highline Hearing. From cutting-edge hearing aids to personalized hearing solutions, we help you hear better and live fully. Book a consultation today!\",favicon:\"https://framerusercontent.com/assets/2KuWri5Rw2fFf1rZ9yXeme7oms0.png\",robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/KCf3vzeuBAinpBZCjAd7iJNUIlw.jpg\",title:\"Highline Hearing | Expert Hearing Care & Advanced Hearing Aids\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],
  "mappings": "AACe,SAARA,EAA0BC,EAAOC,EAAa,CAAC,MAAM,CAAC,kBAAkB;AAAA;AAAA,4CAAuP,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAgrP,YAAY,yLAAyL,QAAQ,uEAAuE,OAAO,0BAA0B,YAAY,uEAAuE,MAAM,gEAAgE,CAAE",
  "names": ["metadata", "params", "activeLocale"]
}
