1var TOURUTILS = { 2 doAnimation: function(map, currentMapOptions, newMapOptions, duration){ 3 var self = this; 4 5 var mapTween = new TWEEN.Tween(currentMapOptions) // Create a new tween that modifies 'cameraOptions'. 6 .to(newMapOptions, duration) // Move to destination in 15 second. 7 .easing(TWEEN.Easing.Quadratic.Out) // Use an easing function to make the animation smooth. 8 .onUpdate(() => { 9 map.moveCamera(currentMapOptions); 10 }) 11 .start(); 12 13 function animate(time) { 14 requestAnimationFrame(animate); 15 TWEEN.update(time); 16 } 17 requestAnimationFrame(animate); 18 }, 19} 20 21class LANDPTour { 22 23 constructor(options) { 24 this.options = options; 25 this.map = {}; 26 this.markers = []; 27 this.infoWindows = []; 28 this.mapLoaded = false; 29 this.zoom = 10; 30 this.mapId = "14925012e1104176"; 31 this.currentMapOptions = {}; 32 this.cameraOptions = { 33 tilt: 45, 34 heading: 0, 35 zoom: this.zoom, 36 center: {lat: this.options.gmcenteron_lat, lng: this.options.gmcenteron_lng}, 37 } 38 39 } 40 41 sayHi() { 42 alert(this.options); 43 } 44 45 init() { 46 // Styles a map in night mode. 47 var cameraOptions = this.cameraOptions; 48 const mapOptions = { 49 scrollwheel: false, 50 streetViewControl: false, 51 zoomControl:true, 52 zoomControlOptions: { 53 style: google.maps.ZoomControlStyle.SMALL, 54 position: google.maps.ControlPosition.RIGHT 55 }, 56 fullscreenControl: false, 57 mapTypeControlOptions: { 58 mapTypeIds: [] 59 }, 60 ...cameraOptions, 61 mapId: this.options.mapId, 62 }; 63 this.map = new google.maps.Map(document.getElementById(this.options.container), mapOptions); 64 this.mapLoaded = true; 65 this.currentMapOptions = { tilt:this.map.getTilt(), heading: this.map.getHeading(), zoom: this.options.zoom, center: this.map.getCenter()}; 66 var mapControlDiv = document.createElement('div'); 67 var refreshControl = this.initRefreshControl(mapControlDiv, this.map); 68 mapControlDiv.index = 1; 69 //this.map.controls[google.maps.ControlPosition.TOP_RIGHT].push(mapControlDiv); 70 if (this.gmlist == 'yes') { 71 //this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(mapControlDiv); 72 } 73 //ADD MARKERS 74 var l; 75 var contentString, infowindow, icon, pin, marker; 76 for (l = 0; l < this.options.locations.length; l++) { 77 //INFO WINDOW 78 //console.info(this.options.locations[l].poi_color); 79 contentString = ''; 80 //contentString += '<div class="gmap-iw">'; 81 //contentString += '<div class="gmap-iw-img-holder" style="background:url('+this.options.locations[l].poi_image+') no-repeat center center / cover">'; 82 83 //contentString += '</div>'; 84 contentString += '<div class="map-details-image" style="background-image:url(' + this.options.locations[l].poi_image + ');"></div>'; 85 contentString += '<h4 class="gmap-iw-heading" style="' + this.options.locations[l].poi_color + '"><a href="https://www.google.com/maps/place/' + encodeURIComponent(this.options.locations[l].poi_address + ' ' + this.options.locations[l].poi_city_state_zip) + '" style="color: #1A4C6D;">' + this.options.locations[l].poi_name + '</a></h4>'; 86 contentString += '<div class="gmap-iw-body">'; 87 if (this.options.locations[l].poi_description) { 88 contentString += '<p>' + this.options.locations[l].poi_description + '</p>'; 89 }; 90 if (this.options.locations[l].add_address == 'yes') { 91 contentString += '<h6>' + this.options.locations[l].poi_address + '<br>' + this.options.locations[l].poi_city_state_zip + '</h6>'; 92 }; 93 if (this.options.locations[l].add_address == 'yes') { 94 contentString += '<h6><a style="color:#26765B;" href="https://www.google.com/maps/place/' + encodeURIComponent(this.options.locations[l].poi_address + ' ' + this.options.locations[l].poi_city_state_zip) + '">Directions</a></h6>'; 95 }; 96 contentString += '</div>'; 97 contentString += '</div>'; 98 var infowindow = new google.maps.InfoWindow({ 99 content: contentString, 100 disableAutoPan: true 101 }); 102 //pin 103 //var poi_ico_style = "M50,0C29.4,0,12.7,16.9,12.5,37.8c0.1,7.3,2.2,14.2,5.9,19.9l28.7,40.1c0.8,1.5,1.9,2.2,2.9,2.2l0,0c1.1,0,2.1-0.7,2.9-2.2l28.6-40.1c3.7-5.8,5.9-12.6,5.9-19.9C87.3,16.9,70.6,0,50,0z M50,53.9c-9.1,0-16.4-7.3-16.4-16.4S40.9,21.1,50,21.1s16.4,7.3,16.4,16.4S59.1,53.9,50,53.9z"; 104 var poi_ico_style = "M 25,50a 25,25 0 1,1 50,0a 25,25 0 1,1 -50,0"; 105 //console.info(this.options.locations[l].poi_ico_style); 106 107 switch(this.options.locations[l].poi_ico_style){ 108 case 'apple': 109 poi_ico_style = "M350.85 129c25.97 4.67 47.27 18.67 63.92 42 14.65 20.67 24.64 46.67 29.96 78 4.67 28.67 4.32 57.33-1 86-7.99 47.33-23.97 87-47.94 119-28.64 38.67-64.59 58-107.87 58-10.66 0-22.3-3.33-34.96-10-8.66-5.33-18.31-8-28.97-8s-20.3 2.67-28.97 8c-12.66 6.67-24.3 10-34.96 10-43.28 0-79.23-19.33-107.87-58-23.97-32-39.95-71.67-47.94-119-5.32-28.67-5.67-57.33-1-86 5.32-31.33 15.31-57.33 29.96-78 16.65-23.33 37.95-37.33 63.92-42 15.98-2.67 37.95-.33 65.92 7 23.97 6.67 44.28 14.67 60.93 24 16.65-9.33 36.96-17.33 60.93-24 27.98-7.33 49.96-9.67 65.94-7zm-54.94-41c-9.32 8.67-21.65 15-36.96 19-10.66 3.33-22.3 5-34.96 5l-14.98-1c-1.33-9.33-1.33-20 0-32 2.67-24 10.32-42.33 22.97-55 9.32-8.67 21.65-15 36.96-19 10.66-3.33 22.3-5 34.96-5l14.98 1 1 15c0 12.67-1.67 24.33-4.99 35-3.99 15.33-10.31 27.67-18.98 37z"; 110 break; 111 case 'visit': 112 poi_ico_style = "M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19
112-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z"; 113 break; 114 case 'home': 115 poi_ico_style = "M64 311.4V496c0 8.8 7.2 16 16 16h416c8.8 0 16-7.2 16-16V311.4c-6.7-5.5-44.7-38.3-224-196.4C107.9 273.9 70.4 306.1 64 311.4zm314.1-26.3c27.6 23 29.1 64.2 4.5 89.1l-84.7 85.6c-5.5 5.5-14.3 5.5-19.8 0l-84.7-85.6c-24.6-24.9-23.2-66.1 4.3-89.1 24-20 59.7-16.4 81.6 5.8l8.6 8.7 8.6-8.7c22-22.2 57.7-25.8 81.6-5.8zM64 311.4v-.3s-2.7 2.5 0 .3zm506.7-75.1L512 184.5V48c0-8.8-7.2-16-16-16h-64c-8.8 0-16 7.2-16 16v51.7L314.7 10.3c-15.3-13.7-38.2-13.7-53.5 0l-256 226c-6.6 5.9-7.1 16-1.2 22.6l21.4 23.8c5.9 6.6 16 7.1 22.6 1.2L277.4 81.7c6-5.3 15.1-5.3 21.2 0L527.9 284c6.6 5.9 16.7 5.4 22.6-1.2l21.4-23.8c5.9-6.7 5.4-16.8-1.2-22.7zM512 311.1v.3c2.9 2.3 0-.3 0-.3z"; 116 break; 117 default: 118 poi_ico_style = "M 25,50a 25,25 0 1,1 50,0a 25,25 0 1,1 -50,0"; 119 } 120 var divby = 100; 121 var poi_ico_scolor = 'rgba(0,0,0,0)'; 122 if (this.options.locations[l].poi_ico_stroke_color) { 123 poi_ico_scolor = this.options.locations[l].poi_ico_stroke_color; 124 } 125 var poi_ico_sweight = 0; 126 if (this.options.poi_ico_stroke_sweight_size) { 127 poi_ico_sweight = this.options.locations[l].poi_ico_stroke_sweight_size; 128 } 129 var poi_icon_scale = 40/divby; 130 if (this.options.locations[l].poi_icon_scale_size) { 131 poi_icon_scale = (this.options.locations[l].poi_icon_scale_size) / divby; 132 } 133 icon = { 134 path: poi_ico_style, 135 fillColor: this.options.locations[l].poi_color, 136 fillOpacity: 1, 137 scale: poi_icon_scale, 138 strokeColor: this.options.locations[l].poi_color, 139 strokeWeight: poi_ico_sweight 140 }; 141 var scaledSizew = 55; 142 var scaledSizeh = 55; 143 var animation = false; 144 if (this.options.locations[l].poi_icon_animated == 'yes') { 145 animation = google.maps.Animation.DROP; 146 } 147 148 var marker; 149 150 var src ='/wp-content/uploads/2021/09/ammenities.png'; 151 var scaledSize = new google.maps.Size(40, 71); // scaled size 152 var origin=new google.maps.Point(0,0); // origin 153 var anchor=new google.maps.Point(20, 74); // anch 154 switch(this.options.locations[l].poi_group){ 155 case 'schools': 156 src ='/wp-content/uploads/2021/09/schools-1.png'; 157 break; 158 case 'parks': 159 src ='/wp-content/uploads/2021/09/park.png'; 160 break; 161 case 'modelhomes': 162 src ='/wp-content/uploads/2021/09/modelhome.png'; 163 break; 164 case 'trails': 165 src ='/wp-content/uploads/2021/09/trails.png'; 166 break; 167 case 'visitorcenter': 168 src ='/wp-content/uploads/2021/09/visitorcenters.png'; 169 break; 170 case 'homes': 171 src ='/wp-content/uploads/2021/09/ahome-1.png'; 172 scaledSize = new google.maps.Size(30, 53); // scaled size 173 origin=new google.maps.Point(0,0); // origin 174 anchor=new google.maps.Point(15, 57); // anch 175 break; 176 default: 177 src ='/wp-content/uploads/2021/09/ammenities.png'; 178 } 179 if(this.options.locations[l].poi_icon){ 180 src = this.options.locations[l].poi_icon; 181 } 182 icon = { 183 url: src, // url 184 scaledSize: scaledSize, // scaled size 185 origin: origin, // origin 186 anchor: anchor // anchor 187 }; 188 189 marker = new google.maps.Marker({ 190 lindex: l, 191 hindex: this.options.locations[l].hindex, 192 title: this.options.locations[l].poi_name, 193 position: new google.maps.LatLng(this.options.locations[l].poi_lat, this.options.locations[l].poi_lng), 194 map: this.map, 195 poi_id: this.options.locations[l].poi_id, 196 animation: animation, 197 group: this.options.locations[l].poi_group, 198 poi_image: this.options.locations[l].poi_image, 199 poi_url: this.options.locations[l].poi_url, 200 poi_name: this.options.locations[l].poi_name, 201 poi_description: this.options.locations[l].poi_description, 202 popup: this.options.locations[l].poi_popup_id, 203 icon: icon 204 }); 205 var elem = this; 206 var ww = jQuery(window).width(); 207 if(ww>=850){ 208 marker.addListener('mouseover', function(e) { 209 var lindex = this.lindex; 210 elem.closeInfoWindows(); 211 elem.infoWindows[lindex].open(elem.map, elem.markers[lindex]); 212 }); 213 infowindow.addListener('mouseout', function(e) { 214 var lindex = this.lindex; 215 elem.infoWindows[lindex].close(elem.map, elem.markers[lindex]); 216 }); 217 } 218 marker.addListener('click', function(e) { 219 elem.closeInfoWindows(); 220// $('#mapDetails').removeClass('active'); 221// $('.map-details-image').css('background-image','url(/wp-content/uploads/2022/07/loading.gif)'); 222// $('.map-title h2').html('...'); 223// $('.map-desc p').html('...'); 224// $('.map-more-btn a').attr('href', '#');
225// var theSlider = '#poiSlides'; 226 var lindex = this.lindex; 227 var hindex = this.hindex; 228 //elem.infoWindows[lindex].open(elem.map, this); 229 //elem.map.panTo(this.getPosition()) 230 for (var i = 0; i < elem.markers.length; i++) { 231 elem.markers[i].setOptions({ 232 'opacity': 1 233 }); 234 } 235 console.info(this); 236 var lat = this.position.lat(); 237 var lng = this.position.lng(); 238 var newMapOptions ={ 239 zoom: 15, 240 center: new google.maps.LatLng(lat,lng), 241 } 242 elem.doAnimation(newMapOptions, 500); 243//// this.setOptions({ 244//// 'opacity': 1, 245//// 'zIndex': 100000 246//// }); 247// console.info(this.group); 248// var gpop = 45; 249// if(this.group=='homes'){ 250// gpop = 218; 251// lindex = hindex; 252// theSlider = '#groupSlides'; 253// } 254 console.info(this.poi_image); 255 $('.map-details-image').css('background-image', 'url('+this.poi_image+')'); 256 $('.map-title h2').html(this.poi_name); 257 $('.map-desc p').html(this.poi_description); 258 $('.map-more-btn a').attr('href', this.poi_url); 259 260 setTimeout(function(){ 261 $('#mapDetails').addClass('active'); 262 //todo 263 264 },1400); 265 266 var timeout = 1000; 267 var ww = jQuery(window).width(); 268 if(ww<=0){ 269 timeout = 0 270 } 271 var _this = this; 272 setTimeout(function() { 273 //elem.infoWindows[lindex].open(elem.map, elem.markers[lindex]); 274 var lindex = _this.lindex; 275 elem.closeInfoWindows(); 276 elem.infoWindows[lindex].open(elem.map, elem.markers[lindex]); 277 }, timeout); 278 }); 279 //SITE.Global.mapMarkers.push(marker); 280 this.markers.push(marker); 281 this.infoWindows.push(infowindow); 282 283 } 284// this.map.data.loadGeoJson('/wp-content/plugins/landpui/elementor/widget-area-map/data.json?nc=577777575578957'); 285// this.map.data.setStyle(function(feature) { 286// var type = feature.getProperty('type'); 287// //console.info(type); 288// var fillColor = 'grey'; 289// var strokeColor = 'grey'; 290// var strokeWeight = 3; 291// //#0d9351 292// //#ba1049 293// switch(type){ 294// case 'north': 295// fillColor = '#cbd6b5'; 296// strokeColor = '#cbd6b5'; 297// strokeWeight = 3; 298// break; 299// case 'south': 300// fillColor = '#cbd6b5'; 301// strokeColor = '#cbd6b5'; 302// strokeWeight = 3; 303// break; 304// default: 305// fillColor = '#bbc92f'; 306// strokeColor = '#bbc92f'; 307// strokeWeight = 3; 308// } 309// return { 310// fillColor: fillColor, 311// strokeColor: strokeColor, 312// strokeWeight: strokeWeight, 313// fillOpacity: 0.24, 314// zIndex: -100 315// }; 316// }); 317 318 //END ADD MARKERS 319 /*this.map.data.loadGeoJson('/wp-content/plugins/wwcui/elementor/widget-gmap/local/grandparkway-south.json'); 320 321 WWCAMAP<?php echo $tkey; ?>.Actions.setInitStyle('all');*/ 322 323 google.maps.event.addListenerOnce(this.map, 'idle', function() { 324// if (this.options.mapLoaded === false) { 325// setTimeout(function() { 326// this.smoothZoom(this.map, this.options.gmzoom_size, this.map.getZoom(), true); 327// 328// }, 1000); 329// 330// } 331 }); 332 } 333 add3dPins(){ 334 var self = this; 335 let scene, renderer, camera, gfltloader; 336 337 const webglOverlayView = new google.maps.WebglOverlayView(); 338 webglOverlayView.onAdd = () => { 339 // Set up the Three.js scene. 340 scene = new THREE.Scene(); 341 camera = new THREE.PerspectiveCamera(); 342 const ambientLight = new THREE.AmbientLight( 0xffffff, 0.75 ); // Soft white light. 343 scene.add(ambientLight); 344 345 // Load the 3D model with GLTF Loader from Three.js. 346 gfltloader = new THREE.GLTFLoader(); 347 gfltloader.load("https://raw.githubusercontent.com/googlemaps/js-samples/master/assets/pin.gltf", function ( gltf ) { 348 gltf.scene.scale.set(10, 10, 10); 349 console.info(gltf); 350 }); 351 } 352 webglOverlayView.onContextRestored = (gl) => { 353 // Create the Three.js renderer, using the 354 // maps's WebGL rendering context. 355 renderer = new THREE.WebGLRenderer({ 356 canvas: gl.canvas, 357 context: gl, 358 ...gl.getContextAttributes(), 359 }); 360 renderer.autoClear = false;
361 } 362 webglOverlayView.onDraw = (gl, coordinateTransformer) => { 363 // Update camera matrix to ensure the model is georeferenced correctly on the map. 364 console.info('redraw'); 365 const matrix = coordinateTransformer.fromLatLngAltitude(self.map.getCenter(), 100); 366 camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix); 367 368 // Request a redraw and render the scene. 369 webglOverlayView.requestRedraw(); 370 renderer.render(scene, camera); 371 372 // Always reset the GL state. 373 renderer.resetState(); 374 } 375 376 // Add the overlay to the map. 377 webglOverlayView.setMap(this.map); 378 } 379 openingAnimation() { 380 // Styles a map in night mode. 381 var self = this; 382 var newcenter=new google.maps.LatLng(30.217652237033743, -98.21064068043921); // origin 383 var currentMapOptions = { tilt:0, heading: 0, zoom: 6, center: newcenter}; 384 var elem = this; 385 386 setTimeout(function(){ 387 TOURUTILS.doAnimation(self.map, currentMapOptions, { tilt: 60, heading: 0, zoom: 10 }, 1200); 388 setTimeout(function(){ 389 elem.infoWindows[0].open(elem.map, elem.markers[0]); 390 }, 500); 391 }, 500); 392 393 } 394 openingAnimation2() { 395 // Styles a map in night mode. 396 var self = this; 397 var currentMapOptions = { tilt:self.map.getTilt(), heading: self.map.getHeading(), zoom: self.map.getZoom(), center: self.map.getCenter()}; 398 TOURUTILS.doAnimation(self.map, currentMapOptions, { tilt: 37.5, heading: 185, zoom: this.options.zoom }, 1200); 399 400 } 401 doAnimation(newMapOptions, duration) { 402 // Styles a map in night mode. 403 var self = this; 404 SITE.Global.mapsobj[0].map.panTo(newMapOptions.center); 405 var currentMapOptions = { tilt:self.map.getTilt(), heading: self.map.getHeading(), zoom: self.map.getZoom(), center: self.map.getCenter()}; 406 TOURUTILS.doAnimation(self.map, currentMapOptions, newMapOptions, duration); 407 408 } 409 smoothZoom(level, cnt, mode) { 410 //alert('Count: ' + cnt + 'and Max: ' + level); 411 var z; 412 // If mode is zoom in 413 if (mode == true) { 414 415 if (cnt >= level) { 416 return; 417 } else { 418 z = google.maps.event.addListener(this.map, 'zoom_changed', function(event) { 419 google.maps.event.removeListener(z); 420 this.smoothZoom(level, cnt + 1, true); 421 }); 422 setTimeout(function() { 423 map.setZoom(cnt) 424 }, 80); 425 } 426 } else { 427 if (cnt <= level) { 428 return; 429 } else { 430 z = google.maps.event.addListener(this.map, 'zoom_changed', function(event) { 431 google.maps.event.removeListener(z); 432 this.smoothZoom(level, cnt - 1, false); 433 }); 434 setTimeout(function() { 435 this.map.setZoom(cnt) 436 }, 80); 437 } 438 } 439 } 440 441 closeInfoWindows() { 442 for (var i = 0; i < this.infoWindows.length; i++) { 443 this.infoWindows[i].close(); 444 } 445 } 446 initControl(controlDiv, map) { 447 448 // Set CSS for the control border. 449 var controlUI = document.createElement('div'); 450 controlUI.style.backgroundColor = '#2d464a'; 451 controlUI.style.border = '2px solid #fff'; 452 controlUI.style.borderRadius = '0'; 453 controlUI.style.boxShadow = '0 2px 6px rgba(0,0,0,0)'; 454 controlUI.style.cursor = 'pointer'; 455 controlUI.style.marginTop = '0'; 456 controlUI.style.marginBottom = '0'; 457 controlUI.style.textAlign = 'center'; 458 controlUI.style.width = '45px'; 459 controlUI.style.height = '45px'; 460 controlUI.classList.add('togglefilters'); 461 462 controlUI.title = 'Toggle List'; 463 controlDiv.appendChild(controlUI); 464 465 // Set CSS for the control interior. 466 var controlText = document.createElement('div'); 467 controlText.style.color = '#'; 468 controlText.style.fontFamily = 'Roboto,Arial,sans-serif'; 469 controlText.style.fontSize = '21px'; 470 controlText.style.lineHeight = '45px'; 471 controlText.style.paddingLeft = '5px'; 472 controlText.style.paddingRight = '5px'; 473 controlText.innerHTML = '<i style="color: white;" class="fas fa-expand-alt"></i>'; 474 controlUI.appendChild(controlText); 475 476 // Setup the click event listeners: simply set the map to Chicago. 477 controlUI.addEventListener('click', function() { 478 $('.land-amap-holder').toggleClass('open'); 479 }); 480 481 } 482 initRefreshControl(controlDiv, map) { 483 484 // Set CSS for the control border. 485 var controlUI = document.createElement('div'); 486 controlUI.style.backgroundColor = '#F78F47'; 487 controlUI.style.border = '1px solid #fff'; 488 controlUI.style.borderRadius = '0'; 489 controlUI.style.boxShadow = '0 2px 2px rgba(0,0,0,0)'; 490 controlUI.style.cursor = 'pointer'; 491 controlUI.style.marginTop = '0'; 492 controlUI.style.marginBottom = '0'; 493 controlUI.style.textAlign = 'center'; 494 controlUI.style.width = '35px'; 495 controlUI.style.height = '35px'; 496 controlUI.classList.add('refreshmap'); 497 498 controlUI.title = 'Refresh'; 499 controlDiv.appendChild(controlUI); 500 501 // Set CSS for the control interior. 502 var controlText = document.createElement('div'); 503 controlText.style.color = '#'; 504 controlText.style.fontFamily = 'Roboto,Arial,sans-serif'; 505 controlText.style.fontSize = '17px'; 506 controlText.style.lineHeight = '35px'; 507 controlText.style.paddingLeft = '5px'; 508 controlText.style.paddingRight = '5px'; 509 controlText.innerHTML = '<i style="color: white;" class="fas fa-redo"></i>'; 510 controlUI.appendChild(controlText); 511 var elem = this; 512 513 // Setup the click event listeners: simply set the map to Chicago. 514 controlUI.addEventListener('click', function() { 515 516 for (var i = 0; i < elem.markers.length; i++) { 517 elem.markers[i].setOptions({ 518 'opacity': 1 519 }); 520 } 521 var bounds = new google.maps.LatLngBounds(); 522 523 for (var i = 0; i < elem.infoWindows.length; i++) { 524 elem.infoWindows[i].close(); 525 } 526 for (var i = 0; i < elem.markers.length; i++) { 527 elem.markers[i].setVisible(true); 528 //$('.map-group').show(); 529 elem.map.panTo({ 530 lat: elem.options.gmcenteron_lat, 531 lng: elem.options.gmcenteron_lng 532 }); 533 setTimeout(function() { 534 elem.map.setZoom(9); 535 }, 500); 536 } 537 538 }); 539 } 540 541} 542 543
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.