<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">(()=&gt;{var e,t;e=this,t=()=&gt;{let e={startStopTimes:{},idleTimeoutMs:3e4,currentIdleTimeMs:0,checkIdleStateRateMs:250,isUserCurrentlyOnPage:!0,isUserCurrentlyIdle:!1,currentPageName:"default-page-name",timeElapsedCallbacks:[],userLeftCallbacks:[],userReturnCallbacks:[],trackTimeOnElement:t=&gt;{let s=document.getElementById(t);s&amp;&amp;(s.addEventListener("mouseover",(()=&gt;{e.startTimer(t)})),s.addEventListener("mousemove",(()=&gt;{e.startTimer(t)})),s.addEventListener("mouseleave",(()=&gt;{e.stopTimer(t)})),s.addEventListener("keypress",(()=&gt;{e.startTimer(t)})),s.addEventListener("focus",(()=&gt;{e.startTimer(t)})))},getTimeOnElementInSeconds:t=&gt;{let s=e.getTimeOnPageInSeconds(t);return s||0},startTimer:(t,s)=&gt;{if(t||(t=e.currentPageName),void 0===e.startStopTimes[t])e.startStopTimes[t]=[];else{let s=e.startStopTimes[t],n=s[s.length-1];if(void 0!==n&amp;&amp;void 0===n.stopTime)return}e.startStopTimes[t].push({startTime:s||new Date,stopTime:void 0})},stopAllTimers:()=&gt;{let t=Object.keys(e.startStopTimes);for(let s=0;s&lt;t.length;s++)e.stopTimer(t[s])},stopTimer:(t,s)=&gt;{t||(t=e.currentPageName);let n=e.startStopTimes[t];void 0!==n&amp;&amp;0!==n.length&amp;&amp;void 0===n[n.length-1].stopTime&amp;&amp;(n[n.length-1].stopTime=s||new Date)},getTimeOnCurrentPageInSeconds:()=&gt;e.getTimeOnPageInSeconds(e.currentPageName),getTimeOnPageInSeconds:t=&gt;{let s=e.getTimeOnPageInMilliseconds(t);return void 0===s?void 0:s/1e3},getTimeOnCurrentPageInMilliseconds:()=&gt;e.getTimeOnPageInMilliseconds(e.currentPageName),getTimeOnPageInMilliseconds:t=&gt;{let s=0,n=e.startStopTimes[t];if(void 0===n)return;let i=0;for(let e=0;e&lt;n.length;e++){let t=n[e].startTime,s=n[e].stopTime;void 0===s&amp;&amp;(s=new Date),i+=s-t}return s=Number(i),s},getTimeOnAllPagesInSeconds:()=&gt;{let t=[],s=Object.keys(e.startStopTimes);for(let n=0;n&lt;s.length;n++){let i=s[n],r=e.getTimeOnPageInSeconds(i);t.push({pageName:i,timeOnPage:r})}return t},setIdleDurationInSeconds:t=&gt;{let s=parseFloat(t);if(!1!==isNaN(s))throw{name:"InvalidDurationException",message:"An invalid duration time ("+t+") was provided."};e.idleTimeoutMs=1e3*t},setCurrentPageName:t=&gt;{e.currentPageName=t},resetRecordedPageTime:t=&gt;{delete e.startStopTimes[t]},resetAllRecordedPageTimes:()=&gt;{let t=Object.keys(e.startStopTimes);for(let s=0;s&lt;t.length;s++)e.resetRecordedPageTime(t[s])},userActivityDetected:()=&gt;{e.isUserCurrentlyIdle&amp;&amp;e.triggerUserHasReturned(),e.resetIdleCountdown()},resetIdleCountdown:()=&gt;{e.isUserCurrentlyIdle=!1,e.currentIdleTimeMs=0},callWhenUserLeaves:(t,s)=&gt;{e.userLeftCallbacks.push({callback:t,numberOfTimesToInvoke:s})},callWhenUserReturns:(t,s)=&gt;{e.userReturnCallbacks.push({callback:t,numberOfTimesToInvoke:s})},triggerUserHasReturned:()=&gt;{if(!e.isUserCurrentlyOnPage){e.isUserCurrentlyOnPage=!0,e.resetIdleCountdown();for(let t=0;t&lt;e.userReturnCallbacks.length;t++){let s=e.userReturnCallbacks[t],n=s.numberOfTimesToInvoke;(isNaN(n)||void 0===n||n&gt;0)&amp;&amp;(s.numberOfTimesToInvoke-=1,s.callback())}}e.startTimer()},triggerUserHasLeftPageOrGoneIdle:()=&gt;{if(e.isUserCurrentlyOnPage){e.isUserCurrentlyOnPage=!1;for(let t=0;t&lt;e.userLeftCallbacks.length;t++){let s=e.userLeftCallbacks[t],n=s.numberOfTimesToInvoke;(isNaN(n)||void 0===n||n&gt;0)&amp;&amp;(s.numberOfTimesToInvoke-=1,s.callback())}}e.stopAllTimers()},callAfterTimeElapsedInSeconds:(t,s)=&gt;{e.timeElapsedCallbacks.push({timeInSeconds:t,callback:s,pending:!0})},checkIdleState:()=&gt;{for(let t=0;t&lt;e.timeElapsedCallbacks.length;t++)e.timeElapsedCallbacks[t].pending&amp;&amp;e.getTimeOnCurrentPageInSeconds()&gt;e.timeElapsedCallbacks[t].timeInSeconds&amp;&amp;(e.timeElapsedCallbacks[t].callback(),e.timeElapsedCallbacks[t].pending=!1);!1===e.isUserCurrentlyIdle&amp;&amp;e.currentIdleTimeMs&gt;e.idleTimeoutMs?(e.isUserCurrentlyIdle=!0,e.triggerUserHasLeftPageOrGoneIdle()):e.currentIdleTimeMs+=e.checkIdleStateRateMs},visibilityChangeEventName:void 0,hiddenPropName:void 0,listenForVisibilityEvents:(t,s)=&gt;{t&amp;&amp;e.listenForUserLeavesOrReturnsEvents(),s&amp;&amp;e.listForIdleEvents()},listenForUserLeavesOrReturnsEvents:()=&gt;{void 0!==document.hidden?(e.hiddenPropName="hidden",e.visibilityChangeEventName="visibilitychange"):void 0!==document.mozHidden?(e.hiddenPropName="mozHidden",e.visibilityChangeEventName="mozvisibilitychange"):void 0!==document.msHidden?(e.hiddenPropName="msHidden",e.visibilityChangeEventName="msvisibilitychange"):void 0!==document.webkitHidden&amp;&amp;(e.hiddenPropName="webkitHidden",e.visibilityChangeEventName="webkitvisibilitychange"),document.addEventListener(e.visibilityChangeEventName,(()=&gt;{document[e.hiddenPropName]?e.triggerUserHasLeftPageOrGoneIdle():e.triggerUserHasReturned()}),!1),window.addEventListener("blur",(()=&gt;{e.triggerUserHasLeftPageOrGoneIdle()})),window.addEventListener("focus",(()=&gt;{e.triggerUserHasReturned()}))},listForIdleEvents:()=&gt;{document.addEventListener("mousemove",(()=&gt;{e.userActivityDetected()})),document.addEventListener("keyup",(()=&gt;{e.userActivityDetected()})),document.addEventListener("touchstart",(()=&gt;{e.userActivityDetected()})),window.addEventListener("scroll",(()=&gt;{e.userActivityDetected()})),setInterval((()=&gt;{!0!==e.isUserCurrentlyIdle&amp;&amp;e.checkIdleState()}),e.checkIdleStateRateMs)},websocket:void 0,websocketHost:void 0,setUpWebsocket:t=&gt;{if(window.WebSocket&amp;&amp;t){let s=t.websocketHost;try{e.websocket=new WebSocket(s),window.onbeforeunload=()=&gt;{e.sendCurrentTime(t.appId)},e.websocket.onopen=()=&gt;{e.sendInitWsRequest(t.appId)},e.websocket.onerror=e=&gt;{console&amp;&amp;console.log("Error occurred in websocket connection: "+e)},e.websocket.onmessage=e=&gt;{console&amp;&amp;console.log(e.data)}}catch(e){console&amp;&amp;console.error("Failed to connect to websocket host.  Error:"+e)}}},websocketSend:t=&gt;{e.websocket.send(JSON.stringify(t))},sendCurrentTime:t=&gt;{let s={type:"INSERT_TIME",appId:t,timeOnPageMs:e.getTimeOnCurrentPageInMilliseconds(),pageName:e.currentPageName};e.websocketSend(s)},sendInitWsRequest:t=&gt;{let s={type:"INIT",appId:t};e.websocketSend(s)},initialize:t=&gt;{let s,n,i=e.idleTimeoutMs||30,r=e.currentPageName||"default-page-name",a=!0,o=!0;t&amp;&amp;(i=t.idleTimeoutInSeconds||i,r=t.currentPageName||r,s=t.websocketOptions,n=t.initialStartTime,!1===t.trackWhenUserLeavesPage&amp;&amp;(a=!1),!1===t.trackWhenUserGoesIdle&amp;&amp;(o=!1)),e.setIdleDurationInSeconds(i),e.setCurrentPageName(r),e.setUpWebsocket(s),e.listenForVisibilityEvents(a,o),e.startTimer(void 0,n)}};return e},"undefined"!=typeof module&amp;&amp;module.exports?module.exports=t():"function"==typeof define&amp;&amp;define.amd?define([],(()=&gt;e.TimeMe=t())):e.TimeMe=t()}).call(this),TimeMe.initialize({idleTimeoutInSeconds:30});</pre></body></html>