PageSourceSearch

https://www.porsche-tennis.com/prod/pag/tennis.nsf/dist/js/custom-tennis.js?Open&v=20260416

js porsche-tennis.com collected 2026-10-02 16:40:36 UTC 24,298 bytes, 709 lines download raw bytes

1function initSlickVariableWidth(carousels, arrSlidesToShow, arrSlidesToScroll, arrDots, arrArrows) {
2  if (typeof carousels.slick === 'function') {
3    carousels.slick({
4      slidesToShow: arrSlidesToShow[0],
5      slidesToScroll: arrSlidesToScroll[0],
6      infinite: false,
7      dots: arrDots[0],
8      arrows: arrArrows[0],
9      variableWidth: true,
10      responsive: [
11        {
12          breakpoint: 1030,
13          settings: {
14            slidesToShow: arrSlidesToShow[1],
15            slidesToScroll: arrSlidesToScroll[1],
16            dots: arrDots[1],
17            arrows: arrArrows[1]
18          }
19        },
20        {
21          breakpoint: 770,
22          settings: {
23            slidesToShow: arrSlidesToShow[2],
24            slidesToScroll: arrSlidesToScroll[2],
25            dots: arrDots[2],
26            arrows: arrArrows[2]
27          }
28        },
29        {
30          breakpoint: 480,
31          settings: {
32            slidesToShow: arrSlidesToShow[3],
33            slidesToScroll: arrSlidesToScroll[3],
34            dots: arrDots[3],
35            arrows: arrArrows[3]
36          }
37        }
38        // You can unslick at a given breakpoint now by adding:
39        // settings: "unslick"
40        // instead of a settings object
41      ]
42    });
43  } else {
44    console.log('slick konnte nicht initialisiert werden. Ist das js eingebunden?');
45  }
46}
47
48/** benötigt für das Submenü mit allen Haupt-Headern der Seite */
49function initFloatingNav(carousels) {
50  var floatingHeader = $('.floating-header'),
51    floatingHeaderContainer = $('#floating-header'),
52    offset = 0,
53    pageHeader = $('.page-header'),
54    submenuHeaders = $('.submenu-header');
55
56  if (floatingHeader.length === 0) {
57    return;
58  }
59
60  // Überschriften (mit jeweiligem Offset) dem Floating Header hinzufügen
61  submenuHeaders.each(function (index, header) {
62    var offsetTop = $(header).offset().top - 150;
63    floatingHeaderContainer.append(
64      '<div class="slick-slide floating-header-submenu-item' +
65        (index === 0 ? ' slick-active' : '') +
66        '" data-scrolltoid="' +
67        $(header).closest('.submenu-block').attr('id') +
68        '"><span>' +
69        header.innerHTML +
70        '</span></div>'
71    );
72  });
73
74  var floatingHeaderSubmenuItem = $('.floating-header .floating-header-submenu-item');
75
76  // Scroll-Funktionalität bei Klick hinzufügen
77  floatingHeaderSubmenuItem.each(function (index, item) {
78    $(item).click(function () {
79      // "60" enspricht der Höhe des Submenüs
80      $([document.documentElement, document.body]).animate(
81        {
82          scrollTop: $('#' + $(item).attr('data-scrolltoid')).offset().top - 50
83        },
84        1000
85      );
86    });
87  });
88
89  // Floating Header entsprechend fixieren
90  offset = pageHeader.offset();
91
92  if (typeof offset !== 'undefined') {
93    offset = offset.top + pageHeader.innerHeight();
94  } else {
95    offset = 0;
96  }
97
98  if ((window.scrollY || document.documentElement.scrollTop) > offset) {
99    floatingHeader.addClass('fixed-position').css({
100      display: 'block',
101      position: 'fixed',
102      top: 0,
103      left: $('.container:first').offset().left,
104      right: $('.container:first').offset().left
105    });
106  }
107
108  $(window).bind('scroll', function () {
109    if ((window.scrollY || document.documentElement.scrollTop) > offset) {
110      floatingHeader.addClass('fixed-position').css({
111        display: 'block',
112        position: 'fixed',
113        top: 0,
114        left: $('.container:first').offset().left,
115        right: $('.container:first').offset().left
116      });
117
118      goToSlideNumber = 0;
119      floatingHeaderSubmenuItem.each(function (index, header) {
120        if (
121          $('#' + $(header).attr('data-scrolltoid')).offset().top - 60 <
122          (window.scrollY || document.documentElement.scrollTop)
123        ) {
124          goToSlideNumber = index;
125        }
126      });
127      // Submenu-Überschrift per Klasse aktiv setzen (wenn bestimmter Header erreicht wurde)
128      floatingHeaderSubmenuItem.removeClass('activeHeader');
129      floatingHeaderSubmenuItem.eq(goToSlideNumber).addClass('activeHeader');
130      // zur Slick-Slide des aktiven Headers springen
131      carousels.slick('slickGoTo', goToSlideNumber);
132    } else {
133      floatingHeader.removeClass('fixed-position').css({
134        display: 'none',
135        position: '',
136        top: '',
137        left: '',
138        right: ''
139      });
140    }
141  });
142}
143
144function animateValue(selector, endValue, duration) {
145  $(selector).each(function () {
146    $(this)
147      .prop('Counter', 0)
148      .animate(
149        {
150          Counter: endValue.toString()
151        },
152        {
153          duration: duration,
154          easing: 'linear',
155          step: function (now) {
156            $(this).text(Math.ceil(now));
157          }
158        }
159      );
160  });
161}
162
163// Play-Icon für Videos in Slick Slider
164function initVideoPlaySlick() {
165  var videoBoxes = $('.ps-slick-video');
166  $('.slick-slide.ps-slick-thumbnail-video img', videoBoxes).after(
167    '<span class="ps-slick-video-play-icon fa fa-play-circle"></span>'
168  );
169}
170
171function initVideoPlaySlickAll() {
172  var videoBoxes = $('.ps-slick-video');
173  $('.slick-slide img', videoBoxes).after(
174    '<span class="ps-slick-video-play-icon fa fa-play-circle"></span>'
175  );
176}
177
178/** Zeitleisten
179    aktivieren der korrekten Event-punkte
180*/
181function initZeitleiste() {
182  let element = $('.ps-zeitleiste'),
183    selectorMenuEntries = $('.ps-zeitleiste-menu li', element),
184    selectorMenuSelect = $('select.select2.ps-zeitleiste-menu', element),
185    selectorPoints = $('.ps-zeitleiste-ereignisse .ps-zeitleiste-point', element),
186    carouselElement = $('.carousel', element),
187    carousel = undefined;
188
189  if ($(carouselElement).length > 0) {
190    carousel = new bootstrap.Carousel(carouselElement, {
191      touch: true
192    });
193  }
194
195  if ($(element).length > 0) {
196    selectorMenuEntries.each((index, element) => {
197      $(element).on('click', (e) => {
198        preventDefaultEvent(e);
199        selectorMenuSelect.val(index).trigger('change');
200        carousel.to(index);
201        carousel.pause();
202        selectorPoints.removeClass('active');
203        $(selectorPoints[index]).addClass('active');
204      });
205    });
206
207    selectorPoints.each((index, element) => {
208      //Initial Active setzen
209      if ($(element).attr('class').search('active') > -1) {
210        $($('.carousel-item', carouselElement)[index]).addClass('active');
211        carousel.to(index);
212        carousel.pause();
213      }
214
215      //Click Event
216      $(element).on('click', (e) => {
217        selectorPoints.removeClass('active');
218        $(selectorPoints[index]).addClass('active');
219        carousel.to(index);
220        carousel.pause();
221      });
222    });
223
224    //Mobile Slider Touch
225    $(carouselElement).on('slide.bs.carousel', (e) => {
226      selectorMenuSelect.val($(e.relatedTarget).index()).trigger('change', false);
227      selectorPoints.removeClass('active');
228      $(selectorPoints[$(e.relatedTarget).index()]).addClass('active');
229    });
230
231    //Select2 Selection
232    selectorMenuSelect.on('change', (e, shouldChangeCarouselSlide = true) => {
233      const index = e.currentTarget.value;
234      const activeCarouselIndex = $($('.carousel-item.active', carouselElement)).index();
235      if (shouldChangeCarouselSlide && index !== activeCarouselIndex) {
236        carousel.to(index);
237        carousel.pause();
238        selectorPoints.removeClass('active');
239        $(selectorPoints[index]).addClass('active');
240      }
241    });
242  }
243}
244
245// https://kenwheeler.github.io/slick/
246// overwrites function "initGalleryWithPreviewSlider" in custom.js, needs to be overwritten due to Lightbox default value
247// Example: Array(3, 3, 3, 2) --> shown slides for different breakpoints
248// 1. Lightbox: shouldShowSlickLightbox: Anpassung für Teqfinder, hat nichts mit der 'Lightbox' zu tun
249// 2. Lightbox: jquery.magnific-popup Lightbox benötigt class="lightbox" (tennis-pressemitteilung.html)
250function initGalleryWithPreviewSlider(
251  isInfinite,
252  previewImagesToShow,
253  shouldShowArrows,
254  shouldShowSlickLightbox,
255  gallerySelector
256) {
257  // due to IE (not supporting default values for parameter)
258  isInfinite = isInfinite === undefined ? true : isInfinite;
259  previewImagesToShow = previewImagesToShow === undefined ? Array(6, 4, 3, 2) : previewImagesToShow;
260  shouldShowArrows = shouldShowArrows === undefined ? false : shouldShowArrows;
261  shouldShowSlickLightbox = shouldShowSlickLightbox === undefined ? false : shouldShowSlickLightbox;
262
263  if (gallerySelector) {
264    var carouselsWithPreviewNav = $(gallerySelector).find('.single-carousel.with-preview-nav');
265    var carouselsPreviewNav = $(gallerySelector).find('.preview-nav-carousel');
266  } else {
267    var carouselsWithPreviewNav = $('.single-carousel.with-preview-nav');
268    var carouselsPreviewNav = $('.preview-nav-carousel');
269  }
270  //Main-Carousel
271  initSlickNavFor(
272    carouselsWithPreviewNav,
273    Array(1, 1, 1, 1),
274    Array(1, 1, 1, 1),
275    Array(false, false, false, false),
276    Array(shouldShowArrows, shouldShowArrows, shouldShowArrows, shouldShowArrows),
277    (gallerySelector ? gallerySelector + ' ' : '') + '.preview-nav-carousel',
278    false,
279    isInfinite,
280    '.slick-single-carousel-btn-prev',
281    '.slick-single-carousel-btn-next'
282  );
283  //Preview-Carousel
284  initSlickNavFor(
285    carouselsPreviewNav,
286    previewImagesToShow,
287    Array(1, 1, 1, 1),
288    Array(false, false, false, false),
289    Array(false, false, false, false),
290    (gallerySelector ? gallerySelector + ' ' : '') + '.single-carousel.with-preview-nav',
291    true,
292    isInfinite,
293    null, //selector prev
294    null, //selector next
295    null, //center mode
296    false, //adaptive height not working
297    false //variable width not working
298  );
299  initResponsiveDots(carouselsWithPreviewNav);
300
301  if (!isInfinite) {
302    initPreviewGalleryAdjustment(carouselsPreviewNav);
303    initSliderCounterPosition(carouselsPreviewNav, true);
304  }
305
306  // slide to clicked preview nav slide
307  $((gallerySelector ? gallerySelector + ' ' : '') + '.preview-nav-carousel').on(
308    'click',
309    '.slick-slide',
310    function (e) {
311      const $slide = $(e.target).closest('.slick-slide');
312      const index = $(this).data('slick-index');
313      if ($slide.length && !$slide.hasClass('slick-cloned') && typeof index !== 'undefined') {
314        $(
315          (gallerySelector ? gallerySelector + ' ' : '') + '.single-carousel.with-preview-nav'
316        ).slick('slickGoTo', index);
317      }
318    }
319  );
320
321  if (shouldShowSlickLightbox) {
322    $(carouselsWithPreviewNav)
323      .find('.slick-slide')
324      .on('click', function () {
325        initSlickLightboxGallery();
326      });
327
328    $(carouselsWithPreviewNav)
329      .parent()
330      .find('.close-fullscreen')
331      .on('click', function () {
332        destroySlickLightboxGallery();
333      });
334  }
335}
336
337function initSlickNavFor(
338  carousels,
339  arrSlidesToShow,
340  arrSlidesToScroll,
341  arrDots,
342  arrArrows,
343  asNavForSelector,
344  isNavSlider,
345  isInfinite,
346  prevArrowSelector,
347  nextArrowSelector,
348  centerModeState,
349  adaptiveHeightState,
350  variableWidthState
351) {
352  if (typeof carousels.slick === 'function') {
353    var slickOptions = {
354      slidesToShow: arrSlidesToShow[0],
355      slidesToScroll: arrSlidesToScroll[0],
356      infinite: isInfinite,
357      dots: arrDots[0],
358      arrows: arrArrows[0],
359      variableWidth: false,
360      asNavFor: asNavForSelector,
361      //focusOnSelect conflicts with inifinite
362      //focusOnSelect: isNavSlider ? true : false,
363      responsive: [
364        {
365          breakpoint: 1030,
366          settings: {
367            slidesToShow: arrSlidesToShow[1],
368            slidesToScroll: arrSlidesToScroll[1],
369            dots: arrDots[1],
370            arrows: arrArrows[1]
371          }
372        },
373        {
374          breakpoint: 770,
375          settings: {
376            slidesToShow: arrSlidesToShow[2],
377            slidesToScroll: arrSlidesToScroll[2],
378            dots: arrDots[2],
379            arrows: arrArrows[2]
380          }
381        },
382        {
383          breakpoint: 480,
384          settings: {
385            slidesToShow: arrSlidesToShow[3],
386            slidesToScroll: arrSlidesToScroll[3],
387            dots: arrDots[3],
388            arrows: arrArrows[3]
389          }
390        }
391      ]
392    };
393
394    if (typeof centerModeState === 'boolean') {
395      slickOptions.centerMode = centerModeState;
396    } else {
397      // null or no value for this mode
398      slickOptions.centerMode =
399        isNavSlider &&
400        $(carousels).find('.slick-slide:not(.slick-cloned)').length >= 5 &&
401        isInfinite
402          ? true
403          : false;
404    }
405
406    if (typeof prevArrowSelector !== 'undefined' && prevArrowSelector !== null) {
407      slickOptions.prevArrow = prevArrowSelector;
408    }
409
410    if (typeof nextArrowSelector !== 'undefined' && nextArrowSelector !== null) {
411      slickOptions.nextArrow = nextArrowSelector;
412    }
413
414    if (typeof adaptiveHeightState === 'boolean') {
415      slickOptions.adaptiveHeight = adaptiveHeightState;
416    }
417
418    if (typeof variableWidthState === 'boolean') {
419      slickOptions.variableWidth = variableWidthState;
420    }
421
422    carousels.slick(slickOptions);
423  } else {
424    console.log('Slick Slider konnte nicht initialisiert werden. Ist das JS eingebunden?');
425  }
426}
427
428function initTournamentProgressCircle(circleSelector = 'circle.progress-ring-circle') {
429  let circles = document.querySelectorAll(circleSelector);
430
431  circles.forEach((circle) => {
432    let radius = circle.r.baseVal.value;
433    let circumference = radius * 2 * Math.PI;
434
435    $(circleSelector).data('circumference', circumference);
436
437    circle.style.strokeDasharray = `${circumference} ${circumference}`;
438    circle.style.strokeDashoffset = `${circumference}`;
439  });
440}
441
442function setTournamentProgressCircle(percent, circleSelector = 'circle.progress-ring-circle') {
443  let circles = document.querySelectorAll(circleSelector);
444
445  circles.forEach((circle) => {
446    let circumference = $(circleSelector).data('circumference');
447    const offset = circumference - (percent / 100) * circumference;
448    circle.style.strokeDashoffset = offset;
449  });
450}
451
452function initLiveTicker() {
453  let liveTicker = $('.live-ticker-light-container');
454  let offset = liveTicker.offset().top;
455
456  $(window).on('scroll', function () {
457    if ($(window).scrollTop() > offset) {
458      liveTicker.addClass('sticky');
459    } else {
460      liveTicker.removeClass('sticky');
461    }
462  });
463}
464
465// overwrites function "initLightbox" in custom.js, needs to be overwritten due to Lightbox Gallery Selector ('.row .slick-slide:not(.slick-cloned) .slick-slide a.lightbox') default value
466/**
467 * mit lightbox zu verarbeitende Bilder (werden auch gleich mit prev/next navigation initialisiert)
468 * <a href="<Bild-URL>" data-text="<Bild-Caption>" class="lightbox"><img /></a>
469 */
470var lightBoxOpen = false;
471var videoStart = true;
472var soundStart = true;
473var videoId = '';
474var soundId = '';
475function initLightbox(dialog) {
476  // the selector for a gallery, if not all images should show up in the same gallery
477  var enabledGallery = true;
478  var imageLightbox = [];
479  var delegate = '';
480
481  function lightboxEffect(element) {
482    $(element).magnificPopup({
483      //imageLightbox.magnificPopup({
484      delegate: delegate,
485      type: 'image',
486      closeMarkup: '<button title="%title%" class="mfp-close psicon-cross"></button>',
487      closeOnBgClick: true,
488      image: {
489        titleSrc: function (item) {
490          var source = item.el.attr('data-text');
491          if (typeof source === 'undefined') {
492            return '';
493          }
494          if (source.charAt(0) === '#') {
495            return $(source).html();
496          } else {
497            return item.el.attr('data-text');
498          }
499        }
500      },
501      gallery: {
502        titleSrc: 'data-text',
503        enabled: enabledGallery,
504        navigateByImgClick: enabledGallery,
505        tCounter: '%curr%&nbsp;/&nbsp;%total%',
506        preload: [1, 1]
507      },
508      callbacks: {
509        imageLoadComplete: function () {
510          var footerHeight = $('.mfp-figure figcaption .mfp-bottom-bar').outerHeight();
511          var topHeight = parseInt($('.mfp-figure').css('margin-top'), 10);
512          var displayHeight = document.documentElement.clientHeight;
513          var imageHeight = displayHeight * 0.8 - footerHeight - topHeight;
514          $('.mfp-figure .mfp-img').css(
515            'max-height',
516            (imageHeight > displayHeight / 2 ? imageHeight : displayHeight / 2) + 'px'
517          );
518          $('.mfp-figure figcaption').css({ height: footerHeight + 'px' });
519          initTooltips();
520        },
521        change: function (item) {
522          var url = $(this.content).attr('data-url');
523          var autoplay = false;
524          var attachmentid = '';
525          if (videoId && typeof jwplayer('ContentVideoPlayer' + videoId).pause === 'function') {
526            jwplayer('ContentVideoPlayer' + videoId).pause();
527          }
528          if (url !== undefined) {
529            var width = Number($(this.content).attr('data-width'));
530            var height = Number($(this.content).attr('data-height'));
531            var image = $(this.content).attr('data-image');
532            var vttfile = $(this.content).attr('data-vttfile');
533            var pid = $(this.content).attr('data-pid');
534            autoplay = false;
535            attachmentid = $(this.content).attr('data-attachmentid');
536            $('.mfp-counter', this.content).html(
537              this.currItem.index + 1 + '&nbsp;/&nbsp' + this.items.length
538            );
539            $('p', this.content).css('max-width', width);
540            videoId = attachmentid;
541            var video = $('.jwplayer', this.content).length;
542            if (video === 0) {
543              if (window.innerWidth > width) {
544                $('.video-container', $(this.content)).css({
545                  width: width,
546                  height: height
547                });
548              } else {
549                $('.video-container', $(this.content)).css({
550                  width: '100%',
551                  height: '100%'
552                });
553              }
554              setTimeout(function () {
555                initVideoPlayer(
556                  url,
557                  width,
558                  height,
559                  image,
560                  autoplay,
561                  attachmentid,
562                  '',
563                  pid,
564                  '&embedded=1',
565                  '',
566                  vttfile
567                );
568              }, 100);
569            }
570            initTooltips('.mfp-container ');
571          } else {
572            videoId = '';
573            url = $(this.content).attr('data-sound-url');
574            if (url !== undefined) {
575              attachmentid = $(this.content).attr('data-attachmentid');
576              autoplay = false;
577              soundId = attachmentid;
578              var sound = $('.jwplayer', this.content).length;
579              if (sound === 0) {
580                setTimeout(function () {
581                  initSoundPlayer(url, autoplay, attachmentid);
582                }, 100);
583              }
584            } else {
585              soundId = '';
586            }
587          }
588
589          // display title accordiongly, interpret it as html not as a string (with hmtl tags)
590          const $popup = $.magnificPopup.instance.contentContainer;
591          let source = $.magnificPopup.instance.currItem.el.attr('data-text');
592          let title = '';
593          if (typeof source === 'undefined') {
594            title = '';
595          }
596          if (source && source.charAt(0) === '#') {
597            title = $(source).html();
598          } else {
599            title = item.el.attr('data-text');
600          }
601          $popup.find('.mfp-title').html(title);
602          $popup
603            .find('.mfp-counter', this.content)
604            .html(this.currItem.index + 1 + '&nbsp;/&nbsp' + this.items.length);
605          // prepare tooltips for initialization (not inside jwplayer lightbox content div)
606          const tooltips = $popup.find('> div:not([data-url]) [data-target-tooltip-id]');
607          if (tooltips.length > 0) {
608            for (let i = 0; i < tooltips.length; i++) {
609              tooltips[i].removeAttribute('data-target-tooltip-id');
610            }
611          }
612        },
613        resize: function () {
614          var footerHeight = $('.mfp-figure figcaption .mfp-bottom-bar').outerHeight();
615          var topHeight = parseInt($('.mfp-figure').css('margin-top'), 10);
616          var displayHeight = window.innerHeight;
617          var width = Number($(this.content).attr('data-width'));
618          var height = Number($(this.content).attr('data-height'));
619          if (window.innerWidth >= width) {
620            $('.video-container', $(this.content)).css({
621              width: width,
622              height: height
623            });
624          } else {
625            $('.video-container', $(this.content)).css({
626              width: '100%',
627              height: '100%'
628            });
629          }
630          $('.mfp-figure .mfp-img').css(
631            'max-height',
632            displayHeight * 0.8 - footerHeight - topHeight + 'px'
633          );
634          $('.mfp-figure figcaption').css({ height: footerHeight + 'px' });
635        },
636        open: function () {
637          setTimeout(function () {
638            if (videoId && typeof jwplayer('ContentVideoPlayer' + videoId).play === 'function') {
639              jwplayer('ContentVideoPlayer' + videoId).play(videoStart);
640              videoStart = true;
641            }
642          }, 200);
643          setTimeout(function () {
644            if (soundId && typeof jwplayer('ContentVideoPlayer' + videoId).play === 'function') {
645              jwplayer('ContentSoundPlayer' + soundId).play(soundStart);
646              soundStart = true;
647            }
648          }, 200);
649          // Hammer: custom_old.js
650        },
651        close: function () {
652          if (videoId && typeof jwplayer('ContentVideoPlayer' + videoId).pause === 'function') {
653            jwplayer('ContentVideoPlayer' + videoId).pause();
654          }
655        }
656      }
657    });
658  }
659
660  if (dialog !== true) {
661    imageLightbox = $('.row .slick-slide:not(.slick-cloned) .slick-slide a.lightbox'); //different galleries for each row (must have lightbox-elements)
662    if (imageLightbox.length === 0) {
663      imageLightbox = $('.ui-tabs-panel .ui-tabs-panel'); //different galleries for each panel
664    } else {
665      imageLightbox = $('.row  .slick-slide:not(.slick-cloned) .slick-slide a.lightbox').closest(
666        '.row'
667      ); //different galleries for each row (if there are rows with lightbox-elements)
668    }
669    delegate = '.slick-slide:not(.slick-cloned) .slick-slide a.lightbox'; //element with the image-link
670  }
671
672  if (imageLightbox.length === 0 || dialog) {
673    //no gallery-groups available or dialog-mode
674    imageLightbox = $('.lightbox');
675    delegate = '';
676  }
677
678  if (dialog === true) {
679    enabledGallery = false;
680  }
681
682  if (imageLightbox.length > 0) {
683    if (delegate !== '') {
684      $(imageLightbox).each(function () {
685        // for each gallery
686        lightboxEffect(this);
687        galleries.push(this);
688      });
689    } else {
690      //there is only one gallery with all lightbox-elements
691      lightboxEffect(imageLightbox);
692      galleries.push(imageLightbox);
693    }
694  }
695}
696
697function setPressReleaseItemsFullyClickable() {
698  const items = document.querySelectorAll('.press-release-item');
699  if (items.length === 0) return;
700  for (let i = 0; i < items.length; i++) {
701    const item = items[i];
702    const href = item.querySelector('.press-release-item-content [href]')?.getAttribute('href');
703    if (!href || href.trim() === '' || href === '#') continue;
704    item.style.cursor = 'pointer';
705    item.addEventListener('click', () => {
706      window.location.href = href;
707    });
708  }
709}

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.