PageSourceSearch

https://app.insites.com/js/nibbler.js?bc=5e1c869f82077e369862acc90a050bea1f56cca7

js insites.com collected 2026-09-24 09:41:40 UTC 25,435 bytes, 788 lines download raw bytes

1var locked = false;
2var currentpercent = 0;
3var startprogress = 30;
4var lastprogval = 0;
5var samecount = 0;
6var errmsg = false;
7var retest = false;
8var normTestId = "";
9var focussed = false;
10var focussedkw = false;
11var currenttab = "";
12
13var tables = [];
14
15/**
16 * A selection of IE handling functions. They're not used
17 */
18// He who wrote this function should be shot. It's difficult to know if it's still used though
19var ie = (function () {
20    var undef, v = 3, div = document.createElement('div');
21
22    while (
23      div.innerHTML = '<!--[if gt IE '+(++v)+']><i></i><![endif]-->',
24        div.getElementsByTagName('i')[0]
25      );
26
27    return v > 4 ? v : undef;
28}());
29
30function isIE()
31{
32    return getIeVersion()!==false;
33}
34
35function getIeVersion()
36{
37    // Test UserAgent for testing that this works against IE8
38    //var userAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)";
39    var expression = new RegExp(/MSIE (.*?);/);
40    var matches = window.navigator.userAgent.match(expression);
41
42    if (matches) {
43        return Math.floor(matches[1]);
44    } else {
45        return false;
46    }
47}
48
49/**
50 * Loader
51 *
52 * This fires all our initial on page stuff
53 */
54function loader() {
55    if ( isIE() && getIeVersion() < 9) {
56        $('body').html(
57            '<div style="width: 300px; border: 2px solid #333; padding: 10px; margin: 20px auto 0;">' +
58            '<h1>Out of date browser</h1>' +
59            '<p>It looks like you\'re using an out of date browser (IE 8 or lower).  In order to work correctly, Insites requires a modern web browser.</p>' +
60            '<p><a href="https://browser-update.org/update.html">Learn how to update your browser</a></p>' +
61            '</div>'
62        );
63        return;
64    }
65
66    setupImageLoaders();
67    setupPriorityTabs();
68    $('#report').each(reportSetup);
69    setTimeout(checkDynamicImages, 3000);
70
71    // Used by the mobile view
72    //--not sure if this is the best place to put this, it's a plugin that collapses menu items into a "more" tab
73    if (!window.sfIframeView && $(window).width() < 768) {
74        //--do this for mobile only
75        try {
76            $('.block-tabs.summary__tabs').tabdrop();
77        } catch (e) {
78        }
79    }
80}
81
82/**
83 * Nova report tabs: keep the strip to one row (ENG-10723).
84 *
85 * summary-header.phtml renders every tab in the strip and mirrors each one in
86 * the "..." menu. This measures the strip and hides the trailing tabs that
87 * don't fit the bar's current width, showing their menu entries instead, and
88 * does it again whenever the bar's width changes: a window resize, the side
89 * nav collapsing, the web font arriving. A fixed count can't do that, and a
90 * strip that wraps spills out of the bar and pushes the alert below it sideways.
91 *
92 * Classic-UI strips have no .summary__tabs--priority class and keep their
93 * server-side fixed count. Below 768px the tabs are the fixed mobile bar
94 * (tabdrop), so everything is left visible.
95 */
96function setupPriorityTabs()
97{
98    var strip = document.querySelector('ul.summary__tabs--priority');
99    if (!strip || typeof window.matchMedia !== 'function') {
100        return;
101    }
102
103    var desktop = window.matchMedia('(min-width: 768px)');
104    var scheduled = false;
105
106    function layout() {
107        scheduled = false;
108
109        var more = strip.querySelector('li.tabs-overflow-menu-button');
110        var moreButton = more ? more.querySelector('.tabs-overflow-button') : null;
111        if (!more) {
112            return;
113        }
114
115        var tabs = Array.prototype.slice.call(strip.children).filter(function (li) {
116            return li.hasAttribute('data-tab-id');
117        });
118        var items = {};
119        Array.prototype.forEach.call(more.querySelectorAll('.overflow-tab-item[data-tab-id]'), function (item) {
120            items[item.getAttribute('data-tab-id')] = item;
121        });
122
123        // Start from everything shown, so the measurements are of the full strip.
124        tabs.forEach(function (li) {
125            li.classList.remove('tab-overflowed');
126        });
127        Object.keys(items).forEach(function (id) {
128            items[id].classList.remove('overflow-tab-item--shown');
129        });
130        more.classList.remove('is-empty');
131        more.classList.remove('active');
132        if (moreButton) {
133            moreButton.classList.remove('active');
134        }
135
136        if (!desktop.matches) {
137            more.classList.add('is-empty');
138            return;
139        }
140
141        // Only the tabs the desktop strip shows; mobile-only ones are display:none.
142        var visible = tabs.filter(function (li) {
143            return li.offsetParent !== null;
144        });
145        var widths = visible.map(function (li) {
146            return li.getBoundingClientRect().width;
147        });
148        var total = widths.reduce(function (sum, w) { return sum + w; }, 0);
149        var available = strip.clientWidth;
150
151        // Half a pixel of slack for sub-pixel rounding.
152        if (total <= available + 0.5) {
153            more.classList.add('is-empty');
154            return;
155        }
156
157        var fit = available - more.getBoundingClientRect().width;
158        var used = 0;
159        var overflowActive = false;
160        visible.forEach(function (li, i) {
161            used += widths[i];
162            if (used <= fit + 0.5) {
163                return;
164            }
165            // Once one tab is out, everything after it is too, keeping the order.
166            li.classList.add('tab-overflowed');
167            var id = li.getAttribute('data-tab-id');
168            if (items[id]) {
169                items[id].classList.add('overflow-tab-item--shown');
170            }
171            if (li.classList.contains('active')) {
172                overflowActive = true;
173            }
174        });
175
176        if (overflowActive) {
177            more.classList.add('active');
178            if (moreButton) {
179                moreButton.classList.add('active');
180            }
181        }
182    }
183
184    function schedule() {
185        if (scheduled) {
186            return;
187        }
188        scheduled = true;
189        window.requestAnimationFrame(layout);
190    }
191
192    layout();
193
194    if (typeof window.ResizeObserver === 'function') {
195        new ResizeObserver(schedule).observe(strip);
196    } else {
197        window.addEventListener('resize', schedule);
198    }
199    if (typeof desktop.addEventListener === 'function') {
200        desktop.addEventListener('change', schedule);
201    } else if (typeof desktop.addListener === 'function') {
202        desktop.addListener(schedule);
203    }
204    if (document.fonts && document.fonts.ready) {
205        document.fonts.ready.then(schedule);
206    }
207}
208
209function imageExists(image_url, callback)
210{
211    var img = new Image();
212    img.onload = function() { callback(image_url, true); };
213    img.onerror = function() { callback(image_url, false); };
214    img.src = image_url;
215}
216
217function setupImageLoaders()
218{
219    $('*[data-imagewhenready]').each(function() {
220        var imageurl = $(this).attr('data-imagewhenready');
221        imageExists(imageurl, function(imageurl, exists) {
222            if(exists)
223            {
224                $('*[data-imagewhenready="'+imageurl+'"]').after('<img src="'+imageurl+'">');
225                $('*[data-imagewhenready="'+imageurl+'"]').remove();
226            }
227        });
228    });
229    if($('*[data-imagewhenready]').length > 0)
230    {
231        setTimeout(setupImageLoaders, 10000);
232    }
233}
234
235function doSetCaretPosition (oField, iCaretPos) {
236
237    // IE Support
238    if (isIE() && document.selection) {
239        // Set focus on the element
240        oField.focus ();
241
242        // Create empty selection range
243        var oSel = document.selection.createRange ();
244
245        // Move selection start and end to 0 position
246        oSel.moveStart ('character', -oField.value.length);
247
248        // Move selection start and end to desired position
249        oSel.moveStart ('character', iCaretPos);
250        oSel.moveEnd ('character', 0);
251        oSel.select ();
252    }
253
254    // Firefox support
255    else if (oField.selectionStart || oField.selectionStart == '0') {
256        oField.selectionStart = iCaretPos;
257        oField.selectionEnd = iCaretPos;
258        oField.focus ();
259    }
260    else {}
261}
262
263function closeHelp()
264{
265    $(this).parents('.report-help-popup').slideToggle(400, function(){ $.waypoints('refresh'); });
266    return false;
267}
268
269function switchHelp()
270{
271    $(this).parent().siblings('.report-help-popup').slideToggle(400, function(){ $.waypoints('refresh'); });
272    return false;
273}
274
275function checkDynamicImages()
276{
277    $('.image-dynamic-load').each(function() {
278        var idfield = $(this).attr("id").replace("p_", "");
279        $(this).after(
280          '<img id="'+idfield+'" style="display: none;" '+
281                'src="'+$(this).data('src')+'" '+
282                'alt="'+$(this).data('alt')+'" '+
283                'width="'+$(this).data('width')+'" '+
284                'height="'+$(this).data('height')+'" '+
285                'class="'+$(this).attr('class')+'" />');
286
287        $(this).siblings('#'+idfield).load(function(){
288            $(this).show();
289            $(this).removeClass('image-dynamic-load');
290            $('#p_'+$(this).attr("id")).remove();
291        });
292        $(this).siblings('#'+idfield).error(function(){
293            $(this).remove();
294        });
295    });
296
297    //If there are any left, then run this again
298    if($('.image-dynamic-load').length > 0){
299        setTimeout(checkDynamicImages, 6000);
300    }
301}
302
303var reportSetup = function() {
304
305    function sidebarCTA() {
306        $('#inboundSidebarCta').detach().appendTo('.sidebar');
307    }
308
309    function oldDetailScrolling() {
310        // if #hash in url, trigger a click on its related link.
311        var hash = window.location.hash;
312        if (hash) {
313            $('a[href=' + hash + ']').trigger('click');
314        }
315
316        var tabs = $('.report-tab'),
317            selectedLinks = $('.nav-sidebar li a, .nav-sidebar li');
318
319        var $sidebarReport = $(".sidebar--report"),
320          $report = $("#report"),
321          sidebarReportHeight = $sidebarReport.height();
322
323        $(window).on('scroll', _.throttle(function () {
324            var reportHeight = $report.height();
325            var reportOffset = $report.offset();
326            var reportEnd = reportHeight + reportOffset.top;
327            var overscrollSidebarTop = reportHeight - sidebarReportHeight;
328
329            if (sidebarReportHeight + window.scrollY > reportEnd) {
330                $sidebarReport.removeClass("sidebar--fixed");
331                $sidebarReport.css("top", overscrollSidebarTop + "px");
332            } else if (sidebarReportHeight < window.innerHeight && $report.offset().top - 5 < window.scrollY) {
333                $sidebarReport.addClass("sidebar--fixed");
334                $sidebarReport.css("top", "");
335            } else {
336                $sidebarReport.removeClass("sidebar--fixed");
337                $sidebarReport.css("top", "");
338            }
339
340            tabs.each(function (idx, tab) {
341                tab = $(tab);
342                if (tab.offset().top > window.scrollY) {
343                    var id = tab.attr('id');
344                    var link = $('a[href="#' + id + '"]');
345                    selectedLinks.removeClass('selected');
346                    link.addClass('selected');
347                    link.parent().addClass('selected');
348                    return false; // break loop
349                }
350            });
351        }, 50));
352    }
353
354    function changeReportTab() {
355        var currenttab,
356          nohash;
357
358        $('.nav-sidebar--tests li a').each(function () {
359            if (!window._report.presentationmode) {
360                $($(this).attr("href")).addClass('hidden-sm hidden-md hidden-lg');
361            }
362            $(this).parent().removeClass("selected");
363        });
364        currenttab = $(this).attr('href');
365        nohash = currenttab.replace("#", "");
366
367        if (typeof window._isIE === 'undefined') {
368            history.pushState(null, null, currenttab);
369        }
370
371        if (window._report.presentationmode) {
372            scrollToAnchor(nohash);
373        }
374
375        $("#Nav_" + nohash).addClass("selected").parent().addClass("selected");
376
377        if (!window._report.presentationmode) {
378            $(currenttab).removeClass('hidden-sm hidden-md hidden-lg');
379        }
380
381        $(this).blur();
382        return false;
383    }
384
385    function oldDetailSideMenu() {
386        $('.nav-sidebar--tests li a').click(changeReportTab);
387        $('.reportablink').click(changeReportTab);
388
389        if (window.location.hash) {
390            $(window.location.hash).removeClass('hidden-sm hidden-md hidden-lg');
391            $("#Nav_" + window.location.hash.replace("#", "")).addClass("selected");
392            window.scrollTo(0, 0);         // execute it straight away
393            setTimeout(function () {
394                window.scrollTo(0, 0);     // run it a bit later also for browser compatibility
395            }, 1);
396        } else {
397            var id = $('.report-tab').first().removeClass('hidden-sm hidden-md hidden-lg').attr('id');
398            $("#Nav_" + id).addClass("selected").parent().addClass("selected");
399        }
400
401
402        if (window._report.presentationmode) {
403            $('#report .report-tab').each(function () {
404                $(this).waypoint(function (direction) {
405                    var sel;
406                    if (direction == "down") {
407                        sel = $(this).attr('id');
408                    } else {
409                        sel = $(this).prev().attr('id')
410                    }
411                    $('#report-navigation li').removeClass('selectedoption');
412                    if ($('#report-navigation #Nav_' + sel).length != 1) {
413                        sel = "summary";
414                    }
415                    $('#report-navigation #Nav_' + sel).addClass('selectedoption');
416                }, {offset: '10%'});
417            });
418        }
419
420        makeTables();
421        $('.report-tab ul ul').each(function () {
422            $(this).before(' <span class="report-showsolution link-expand">' + strings['Show recommendations'] + '</a>');
423            $(this).parent().find('.report-showsolution').click(expandPoint);
424            $(this).hide();
425        });
426        setupHelp();
427
428
429        function makeTables() {
430            $(".multiUrl").each(function () {
431                var conts = $(this).html(),
432                  urls = conts.split(","),
433                  newcontent = "";
434
435                for (var x = 0; x < urls.length; x++) {
436                    if (x != 0) {
437                        newcontent = newcontent + "<br />";
438                    }
439                    newcontent = newcontent + "<a class=\"url\" href=\"" + urls[x] + "\">" + shortenURL(urls[x]) + "</a>";
440                }
441                $(this).html(newcontent);
442            });
443
444            $(".data").each(function () {
445                var id = $(this).attr("id");
446                var autohide = $("#l" + id).hasClass('autohide');
447                tables[tables.length] = [id, id, makeTable(id, autohide)];
448            });
449        };
450
451        function makeTable(tableId, autohide) {
452            var x, i;
453            //Get the headers from the table
454            var hdrs = $("#" + tableId + " thead tr td").get();
455            var rows = $("#" + tableId + " tbody tr").get();
456            var byCol = [];
457
458            for (x = 0; x < rows.length; x++) {
459                for (i = 0; i < rows[x].children.length; i++) {
460                    if (byCol[i] === undefined) {
461                        byCol[i] = [];
462                    }
463                    byCol[i].push(rows[x].children[i].innerHTML);
464                }
465            }
466
467            var myColumnDefs = [];
468
469            var myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get(tableId));
470            myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
471            myDataSource.responseSchema = {};
472            myDataSource.responseSchema.fields = [];
473            var sortBy = "";
474            var len = hdrs.length;
475
476            for (i = 0; i < len; i++) {
477                var hdr = hdrs[i];
478                var cntnt = $(hdr).html();
479
480                myColumnDefs[i] = {
481                    key: cntnt,
482                    label: cntnt,
483                    sortable: (tableId != "testsTable")
484                };
485
486                myDataSource.responseSchema.fields[i] = {
487                    key: cntnt
488                };
489
490                var isNum = true;
491                if (byCol[i] != undefined) {
492                    for (x = 0; x < byCol[i].length; x++) {
493                        if (isNaN(parseFloat(byCol[i][x])) || !isFinite(byCol[i][x])) {
494                            isNum = false;
495                            break;
496                        }
497                    }
498                }
499
500                if (isNum) {
501                    myDataSource.responseSchema.fields[i]["parser"] = "number";
502                }
503
504                if (i == hdrs.length - 1) {
505                    sortBy = cntnt;
506                }
507            }
508
509            var oConfigs = {};
510
511            if (tableId != "testsTable") {
512                var pag = new YAHOO.widget.Paginator(
513                  {
514                      rowsPerPage: 10,
515                      alwaysVisible: false
516                  }
517                );
518                oConfigs = {
519                    paginator: pag
520                };
521            }
522            else {
523
524            }
525
526            var myDataTable = new YAHOO.widget.DataView("c" + tableId, myColumnDefs, myDataSource, oConfigs);
527            myDataTable.subscribe('renderEvent', function () {
528
529
530            });
531
532            if ($("#t" + tableId).parents('.solution').length == 0 && autohide) {
533                titleText = $("#t" + tableId).hide().html();
534                $("#l" + tableId).html("<a id=\"sh" + tableId + "\" class=\"link-expand\" href=\"#\" onclick=\"return switchTable('" + tableId + "', '" + titleText + "');\">" + titleText + "</a>");
535                $("#c" + tableId).hide();
536            }
537
538            return myDataTable;
539        }
540
541        function setupHelp() {
542            $('.report-help-link a').click(doHelp);
543        }
544
545        function doHelp() {
546            $.ajax({
547                url: $(this).attr("href"),
548                context: this,
549                success: function (data) {
550                    //Copy the contribution text from the test into the help div.
551                    var element = $(this).parents('.report-tab').find('.score-contrib');
552                    var contributionText = '';
553                    if (element.length > 0) {
554                        contributionText = '<p class="text-right"><strong>' + element.html() + '</strong></p>';
555                    }
556                    $(this).parent().after('<div class="report-help-popup"><div class="report-help-popup-inner">
556' + data + contributionText + '<p class="closehelp"><a href="#"><span>' + strings['Close help'] + '</span></a></p></div></div>');
557                    $(this).parent().siblings('.report-help-popup').find('.closehelp a').click(closeHelp);
558                    $(this).parent().siblings('.report-help-popup').slideDown(400, function () {
559                        $.waypoints('refresh');
560                    });
561                }
562            });
563            $(this).unbind();
564            $(this).click(switchHelp);
565            return false;
566        }
567
568        function expandPoint() {
569            if ($(this).hasClass('link-expand')) {
570                $(this).siblings('ul').slideDown(400, function () {
571                    $.waypoints('refresh');
572                });
573                $(this).html(strings['Close recommendations']);
574                $(this).removeClass('link-expand');
575                $(this).addClass('link-collapse');
576            } else {
577                $(this).siblings('ul').slideUp(400, function () {
578                    $.waypoints('refresh');
579                });
580                $(this).html(strings['Show recommendations']);
581                $(this).removeClass('link-collapse');
582                $(this).addClass('link-expand');
583            }
584        }
585    }
586
587    return function(){
588        sidebarCTA();
589
590        // If it's not in presentation mode, we want to hide things by default
591        if (window._report && !window._report.presentationmode) {
592            $('.report-tab').addClass('hidden-sm hidden-md hidden-lg');
593        }
594    }
595}();
596
597
598function downloadPDF()
599{
600    _gaq.push(['_trackEvent', 'Report', $(this).attr('id'), $('#report-header h1 a').html()]);
601}
602
603function scrollToAnchor(aid){
604    var aTag = $("#"+aid);
605    $('html,body').animate({scrollTop: aTag.offset().top -30},800, "swing");
606}
607
608function expandRecommendations()
609{
610    $(this).parent().children('li ul').parent().each(hideRecommendations);
611    $(this).unbind('click').click(hideRecommendations).children('ul').slideDown(400, function(){ $.waypoints('refresh'); });
612    $(this).animate({backgroundColor: '#EEEEEE'});
613    $(this).children('.report-showsolution').html(strings['Hide solution']);
614    return false;
615}
616function hideRecommendations()
617{
618    $(this).unbind('click').click(expandRecommendations).children('ul').slideUp(400, function(){ $.waypoints('refresh'); });
619    $(this).animate({backgroundColor: '#FFFFFF'});
620    $(this).children('.report-showsolution').html(strings['Show solution']);
621}
622
623
624function switchTable(tableId)
625{
626    if($("#sh"+tableId).hasClass("link-expand"))
627    {
628        $("#sh"+tableId).removeClass("link-expand").addClass("link-collapse").blur();
629    } else {
630        $("#sh"+tableId).removeClass("link-collapse").addClass("link-expand").blur();
631    }
632
633    $("#c"+tableId).slideToggle("slow");
634    return false;
635}
636
637function shortenURL(url)
638{
639    //return url;
640    var myregexp = new RegExp(/(https?):\/\/([-\w\.]+)+(:\d+)?(\/(([\w\/_\-\.]*)(\?\S+)?)?)?/gi),
641        matches = myregexp.exec(url),
642        prefix = ".../",
643        thisurl = $("#reporturl").attr("href"),
644        paramstring,
645        newstr,
646        pathstring,
647        newparamstring,
648        newpathstring;
649
650    if(matches != null) {
651        if(thisurl == matches[1] + "://" +  matches[2]) {
652            prefix = "/";
653        } else {
654            prefix = matches[2] + "/";
655        }
656
657        if(matches[7] != null) {
658            paramstring = matches[7];
659        } else {
660            paramstring = "";
661        }
662
663        if(matches[6] != null) {
664            pathstring = matches[6];
665        } else {
666            pathstring = "";
667        }
668        newstr = prefix + pathstring + paramstring;
669        if(newstr.length == 0) {
670            return url;
671        }
672
673        if(newstr.length <= 30) {
674            return newstr;// + "1";
675        }
676
677        if(pathstring.substr(pathstring.length-1, 1) == "/") {
678            pathstring = pathstring.substr(0, pathstring.length-1);
679        }
680
681        newparamstring = firstandlast(paramstring, "&");
682        newpathstring = firstandlast(pathstring, "/");
683
684        newstr = prefix + newpathstring +  newparamstring;
685        if(newstr.length <= 40) {
686            return newstr;// + "2";
687        }
688
689        newparamstring = justlast(paramstring, "&");
690        newpathstring = justlast(pathstring, "/");
691
692        newstr = prefix + newpathstring +  newparamstring;
693        return newstr;// + "3";
694    }
695}
696
697function firstandlast(string, seperator)
698{
699    var parts = string.split(seperator);
700
701    if(parts.length >= 3)
702    {
703        return parts[0]+seperator+"..."+seperator+parts[parts.length-1];
704    } else {
705        return string;
706    }
707}
708
709function justlast(string, seperator)
710{
711    var parts = string.split(seperator);
712
713    if(parts.length >= 3)
714    {
715        return "..."+seperator+parts[parts.length-1];
716    } else {
717        return string;
718    }
719}
720
721function formatCurrency(num)
722{
723    return parseFloat(num, 10).toLocaleString(window._hsSettings.locale.alt, {
724        style: "currency",
725        currency: window._hsSettings.currencyCode,
726        minimumFractionDigits: 2,
727        maximumFractionDigits: 2
728    });
729}
730
731
732$.fn.setCursorPosition = function(position){
733    if(this.length == 0) return this;
734    return $(this).setSelection(position, position);
735};
736
737$.fn.setSelection = function(selectionStart, selectionEnd) {
738    if(this.length == 0) return this;
739    input = this[0];
740
741    if (input.createTextRange) {
742        var range = input.createTextRange();
743        range.collapse(true);
744        range.moveEnd('character', selectionEnd);
745        range.moveStart('character', selectionStart);
746        range.select();
747    } else if (input.setSelectionRange) {
748        input.focus();
749        input.setSelectionRange(selectionStart, selectionEnd);
750    }
751
752    return this;
753};
754
755$.fn.focusEnd = function(){
756    this.setCursorPosition(this.val().length);
757    return this;
758};
759
760/**
761 * Event Abstraction that fires events to both Intercom and Google Analytics
762 * @param event
763 * @param metadata
764 */
765function addEvent(event, metadata)
766{
767    if(typeof ga !== 'undefined') {
768        ga('silktide.send', 'event', 'UserInteraction', event);
769    }
770    if (window.Intercom !== undefined) {
771      if (metadata && metadata instanceof Object) {
772        Intercom('trackEvent', event, metadata);
773      } else {
774        Intercom('trackEvent', event);
775      }
776    }
777}
778
779/**
780 * A stupid global function that GoogleMaps will call if permission was denied for that API key
781 * I don't know why they did it this way, but so be it.
782 */
783function gm_authFailure() {
784  window.gmapsPermissionDenied = true;
785}
786
787
788$(document).ready(loader);

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.