1let navigatorErrorMessage="Could not find `userAgent` or `userAgentData` window.navigator properties to set `os`, `browser` and `version`",removeExcessMozillaAndVersion=/^mozilla\/\d\.\d\W/,browserPattern=/(\w+)\/(\d+\.\d+(?:\.\d+)?(?:\.\d+)?)/g,engineAndVersionPattern=/^(ver|cri|gec)/,brandList=["chrome","opera","safari","edge","firefox"],unknown="Unknown",empty="",isArray=Array.isArray,userAgentData=window.navigator.userAgentData,userAgent=window.navigator.userAgent,mobiles={iphone:/iphone/,ipad:/ipad|macintosh/,android:/android/},desktops={windows:/win/,mac:/macintosh/,linux:/linux/},detectPlatform=(e,n)=>{if(userAgent="string"==typeof e?e:userAgent,userAgentData="string"==typeof n?n:userAgentData,userAgent){let r=userAgent.toLowerCase().replace(removeExcessMozillaAndVersion,empty);var e=Object.keys(mobiles).find(e=>mobiles[e].test(r)&&1<=window.navigator.maxTouchPoints),n=Object.keys(desktops).find(e=>desktops[e].test(r)),n=e||n,o=r.match(browserPattern),t=r.match(/version\/(\d+(\.\d+)*)/),t=isArray(t)?t[1]:null,s=o&&(2<o.length&&!engineAndVersionPattern.test(o[1])?1:0),o=o&&o[o.length-1-(s||0)].split("/");return{os:n,browser:o&&o[0],version:t||o&&o[1],mobileOS:e}}if(userAgentData){var a,s=userAgentData.platform.toLowerCase();let e;for(a of userAgentData.brands){let r=a.brand.toLowerCase();var i=brandList.find(e=>{if(r.includes(e))return e});if(i){e={browser:i,version:a.version};break}}return{os:s,...e||{browser:unknown,version:unknown}}}return console.error(navigatorErrorMessage),{os:navigator.platform||unknown,browser:unknown,version:unknown}};
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.