PageSourceSearch

https://statics.haiwainet.cn/tpl2021/2021-03-25/js/show2021.js

js haiwainet.cn collected 2026-09-24 19:38:11 UTC 48,945 bytes, 1,571 lines download raw bytes

1$(document).ready(function () {
2    //生成二维码
3    var locationHref = window.location.href;
4    var create_qrcode = function (text, typeNumber, errorCorrectLevel, table) {
5        var qr = qrcode23(typeNumber || 9, errorCorrectLevel || 'L');
6        qr.addData(text);
7        qr.make();
8        return qr.createTableTag();
9    };
10    $("#urlqr").html(create_qrcode(locationHref, 9, 'L'));
11    //20230825之前 生成二维码
12    // $("#urlqr").qrcode({
13    //   render: 'canvas',
14    //   width: 101,
15    //   height: 101,
16    //   text: locationHref
17    // });
18
19    //触屏版链接处理
20    if ($('.phone .chuping').is("a")) {
21        var reg = /\d+/ig;
22        var chuping_array = locationHref.match(reg);
23
24        var chuping_url = 'https://m.haiwainet.cn/middle/';
25        chuping_url += chuping_array[2];
26        chuping_url += '/';
27        chuping_url += chuping_array[0];
28        chuping_url += '/';
29        chuping_url += chuping_array[1];
30        chuping_url += '/content_';
31        chuping_url += chuping_array[3];
32        if (chuping_array[4] == null || chuping_array[4] == '') {
33            chuping_url += '_1.html';
34        } else {
35            chuping_url += '_';
36            chuping_url += chuping_array[4];
37            chuping_url += '.html';
38        }
39
40        $('.phone .chuping').attr('href', chuping_url);
41
42    }
43
44
45    //打开关闭腾讯弹窗
46    $('.tx').mouseover(function () {
47        var top = $(this).offset().top + 50;
48        var left = $(this).offset().left - 38;
49        $('.share-popup').css({ "top": top, "left": left });
50        $('.share-popup').show();
51    });
52    $('.tx').mouseout(function () {
53        $('.share-popup').hide();
54    });
55
56    /*内容中的视频样式功能替换*/
57    var videos = [];
58    $('video').each(function (i) {
59        if (!$(this).hasClass('video-js')) {
60            $(this).addClass('video-js')
61        }
62        if ($(this).not($(".hwwvideo"))) {
63            var videoSrc = $(this).attr('src');
64            var videoImgSrc = $(this).attr('poster') || $(".thumbImg img").attr('src') || '';
65            var idName = 'contentVideoBlock' + i;
66            var div = document.createElement('div');
67            div.id = idName;
68            div.class = "hwwvideo video-js";
69            div.style.width = '760px';
70            div.style.height = '427.5px';
71            div.style.marginTop = '10px';
72            div.style.marginLeft = 'auto';
73            div.style.marginRight = 'auto';
74            // div.style.marginLeft='-2em';
75
76            if ($(this).parent("div").length > 0) {
77                $(this).parent("div").after(div);
78                $(this).parent("div").remove();
79            } else {
80                $(this).after(div);
81                $(this).remove();
82            }
83
84            if (videoSrc.indexOf('.mp3') > -1) {
85                var audio = document.createElement('audio');
86                audio.className = "audio-js";
87                console.log(videoSrc);
88                audio.src = videoSrc;
89                audio.controls = true;
90                audio.preload = "none"
91                $(div).after(audio);
92                $(div).remove();
93                $(audio).parent().attr("style", '');
94            } else {
95                videos.push(videoObj(videoSrc, idName, videoImgSrc));
96            }
97
98        }
99    })
100    $('audio').each(function (i) {
101        var audio = document.createElement('audio');
102        var audioSrc = $(this).attr('src');
103        audio.className = "audio-js";
104        console.log(audioSrc);
105        audio.src = audioSrc;
106        audio.controls = true;
107        audio.preload = "none"
108
109        if ($(this).parent("div").length > 0) {
110            $(this).parent("div").after(audio);
111            $(this).parent("div").remove();
112        } else {
113            $(this).after(audio);
114            $(this).remove();
115            $(audio).parent().attr("style", '');
116        }
117    })
118    if ($("#videoBox").length > 0) {
119        $('#videoBox').css("textIndent", '2em');
120        var videoSrcS = $('#videoBox').attr('data-src');
121        var videoBoxPaster = $('#videoBox').attr('data-poster')
122        var videoAry = videoSrcS.split("|");
123        var box = document.getElementById("videoBox");
124        for (var i = 0; i < videoAry.length; i++) {
125            var videoblockName = 'videoblock' + i;
126            var div = document.createElement('div');
127            div.id = videoblockName;
128            div.style.width = '760px';
129            div.style.height = '427.5px';
130            div.style.marginTop = '10px';
131            div.style.marginLeft = 'auto';
132            div.style.marginRight = 'auto';
133            box.appendChild(div);
134            videos.push(videoObj(videoAry[i], videoblockName, videoBoxPaster));
135        }
136    };
137    createVideo(videos);
138
139    function videoObj(url, idName, poster) {
140        if (url.indexOf('xml') > -1) {
141            return {
142                el: idName,
143                ev: "web",
144                videoSrc: url,
145                sourceType: "video/mp4",
146                poster: poster,
147                type: "vms"
148            }
149        } else if (url.indexOf('.mp4') > -1) {
150            return {
151                el: idName,
152                ev: "web",
153                videoSrc: url,
154                sourceType: "video/mp4",
155                poster: poster,
156                type: "mp4"
157            }
158        }
159    }
160
161    /*浮动*/
162    var fixedShare = $('.share-box');
163    $(window).scroll(function () {
164        var scrollH = $(window).scrollTop();
165        if (scrollH > 150) {         //导航高度
166            fixedShare.addClass('fixedShare');
167            $("#floatIcon").show();
168        } else {
169            fixedShare.removeClass('fixedShare');
170            $("#floatIcon").hide();
171        }
172    });
173
174    /*内容加粗*/
175    // var P=$(".contentMain p");
176    // $(P).each(function(){
177    //   if($(this).text()!='' && $(this).find("strong").text()==$(this).text() ){
178    //     // $(this).addClass("indent0em");
179    //     $(this).css("text-indent","0");
180    //   }
181    // });
182
183    // logo 右侧下拉
184    $('.menu .download').hover(function () {
185        $(this).addClass("on");
186        $(this).find('div').slideDown('fast');
187    }, function () {
188        $(this).removeClass("on");
189        $(this).find('div').hide();
190    })
191
192    //返回顶部
193    $("#floatIcon .gotop").click(function () {
194        gotoTop();
195    })
196    function gotoTop() {
197        var speed = document.body.offsetHeight / 10 / 1000;
198        var acceleration = 0.1;
199        var stime = 10;
200        var y1 = 0;
201        var y2 = 0;
202        var y3 = 0;
203        if (document.documentElement) {
204            y1 = document.documentElement.scrollTop || 0;
205        }
206        if (document.body) {
207            y2 = document.body.scrollTop || 0;
208        }
209
210        var y3 = window.scrollY || 0;
211
212        // 滚动条到页面顶部的垂直距离
213        var y = Math.max(y1, Math.max(y2, y3));
214
215        // 滚动距离 = 目前距离 / 速度, 因为距离原来越小, 速度是大于 1 的数, 所以滚动距离会越来越小
216        var speeding = 1 + acceleration;
217        window.scrollTo(0, Math.floor(y / speeding));
218
219        // 如果距离不为零, 继续调用函数
220        if (y > 0) {
221            var run = "gotoTop(" + speed + ")";
222            0
223            t = setTimeout(function () {
224                gotoTop(speed)
225            }, stime);
226        }
227    }
228
229    //面包屑处理   >资讯 > 首页上线前测试 >
230    var catposAry = $(".catpos").html().split("&gt;");
231    var catposNew = catposAry.slice(0, 1);
232    $(".catpos").html('>' + catposNew);
233    $(".catpos").show();
234
235    //微信分享
236    var jsApiListArr = ["updateAppMessageShareData", "updateTimelineShareData", "onMenuShareWeibo", "onMenuShareQZone"]
237    $.ajax({
238        type: "get",
239        url: '//opa.haiwainet.cn/apis/weixin/signpackage/haiwainet?url=' + locationHref + '&format=jsonp',
240        async: false,
241        dataType: "jsonp",
242        callback: 'jsonpCallback',
243        success: function (msg) {
244            var data = msg['result']
245            var ImgTimestamp = Date.now();
246            wx.config({
247                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
248                appId: data['appId'], // 必填,公众号的唯一标识
249                timestamp: data['timestamp'], // 必填,生成签名的时间戳
250                nonceStr: data['nonceStr'], // 必填,生成签名的随机串
251                signature: data['signature'], // 必填,签名,见附录1
252                jsApiList: jsApiListArr  // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
253            });
254            shareImgN = 'https://statics.haiwainet.cn/images/logoS_20231121.jpg?v=' + ImgTimestamp;
255            shareTitle = $('h1').text();
256            shareDesc = '海外网_网上的人民日报海外版_全球华人的网上家园';
257            shareUrl = locationHref;
258            wx.ready(function () {
259                let share_con = {
260                    title: shareTitle, // 分享标题
261                    desc: shareDesc, // 分享描述
262                    link: shareUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
263                    imgUrl: shareImgN, // 分享图标
264                    success: function () {
265                        console.log("微信认证通过");
266                    },
267                }
268                wx.updateAppMessageShareData(share_con)
269                wx.updateTimelineShareData(share_con)
270                wx.onMenuShareQZone(share_con)
271                wx.onMenuShareWeibo(share_con)
272            })
273        }
274    });
275});
276var qrcode23 = function () {
277    var qrcode = function (typeNumber, errorCorrectLevel) {
278        var PAD0 = 0xEC;
279        var PAD1 = 0x11;
280        var _typeNumber = typeNumber;
281        var _errorCorrectLevel = QRErrorCorrectLevel[errorCorrectLevel];
282        var _modules = null;
283        var _moduleCount = 0;
284        var _dataCache = null;
285        var _dataList = new Array();
286        var _this = {};
287        var makeImpl = function (test, maskPattern) {
288            _moduleCount = _typeNumber * 4 + 17;
289            _modules = function (moduleCount) {
290                var modules = new Array(moduleCount);
291                for (var row = 0; row < moduleCount; row += 1) {
292                    modules[row] = new Array(moduleCount);
293                    for (var col = 0; col < moduleCount; col += 1) {
294                        modules[row][col] = null;
295                    }
296                }
297                return modules;
298            }(_moduleCount);
299
300            setupPositionProbePattern(0, 0);
301            setupPositionProbePattern(_moduleCount - 7, 0);
302            setupPositionProbePattern(0, _moduleCount - 7);
303            setupPositionAdjustPattern();
304            setupTimingPattern();
305            setupTypeInfo(test, maskPattern);
306
307            if (_typeNumber >= 7) {
308                setupTypeNumber(test);
309            }
310
311            if (_dataCache == null) {
312                _dataCache = createData(_typeNumber, _errorCorrectLevel, _dataList);
313            }
314
315            mapData(_dataCache, maskPattern);
316        };
317        var setupPositionProbePattern = function (row, col) {
318
319            for (var r = -1; r <= 7; r += 1) {
320
vendor: 8,687 bytes, lines 321-586
321                if (row + r <= -1 || _moduleCount <= row + r) continue;
322
323                for (var c = -1; c <= 7; c += 1) {
324
325                    if (col + c <= -1 || _moduleCount <= col + c) continue;
326
327                    if ((0 <= r && r <= 6 && (c == 0 || c == 6))
328                        || (0 <= c && c <= 6 && (r == 0 || r == 6))
329                        || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
330                        _modules[row + r][col + c] = true;
331                    } else {
332                        _modules[row + r][col + c] = false;
333                    }
334                }
335            }
336        };
337        var getBestMaskPattern = function () {
338
339            var minLostPoint = 0;
340            var pattern = 0;
341
342            for (var i = 0; i < 8; i += 1) {
343
344                makeImpl(true, i);
345
346                var lostPoint = QRUtil.getLostPoint(_this);
347
348                if (i == 0 || minLostPoint > lostPoint) {
349                    minLostPoint = lostPoint;
350                    pattern = i;
351                }
352            }
353
354            return pattern;
355        };
356        var setupTimingPattern = function () {
357
358            for (var r = 8; r < _moduleCount - 8; r += 1) {
359                if (_modules[r][6] != null) {
360                    continue;
361                }
362                _modules[r][6] = (r % 2 == 0);
363            }
364
365            for (var c = 8; c < _moduleCount - 8; c += 1) {
366                if (_modules[6][c] != null) {
367                    continue;
368                }
369                _modules[6][c] = (c % 2 == 0);
370            }
371        };
372        var setupPositionAdjustPattern = function () {
373
374            var pos = QRUtil.getPatternPosition(_typeNumber);
375
376            for (var i = 0; i < pos.length; i += 1) {
377
378                for (var j = 0; j < pos.length; j += 1) {
379
380                    var row = pos[i];
381                    var col = pos[j];
382
383                    if (_modules[row][col] != null) {
384                        continue;
385                    }
386
387                    for (var r = -2; r <= 2; r += 1) {
388
389                        for (var c = -2; c <= 2; c += 1) {
390
391                            if (r == -2 || r == 2 || c == -2 || c == 2
392                                || (r == 0 && c == 0)) {
393                                _modules[row + r][col + c] = true;
394                            } else {
395                                _modules[row + r][col + c] = false;
396                            }
397                        }
398                    }
399                }
400            }
401        };
402        var setupTypeNumber = function (test) {
403
404            var bits = QRUtil.getBCHTypeNumber(_typeNumber);
405
406            for (var i = 0; i < 18; i += 1) {
407                var mod = (!test && ((bits >> i) & 1) == 1);
408                _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
409            }
410
411            for (var i = 0; i < 18; i += 1) {
412                var mod = (!test && ((bits >> i) & 1) == 1);
413                _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
414            }
415        };
416        var setupTypeInfo = function (test, maskPattern) {
417
418            var data = (_errorCorrectLevel << 3) | maskPattern;
419            var bits = QRUtil.getBCHTypeInfo(data);
420
421            // vertical
422            for (var i = 0; i < 15; i += 1) {
423
424                var mod = (!test && ((bits >> i) & 1) == 1);
425
426                if (i < 6) {
427                    _modules[i][8] = mod;
428                } else if (i < 8) {
429                    _modules[i + 1][8] = mod;
430                } else {
431                    _modules[_moduleCount - 15 + i][8] = mod;
432                }
433            }
434
435            // horizontal
436            for (var i = 0; i < 15; i += 1) {
437
438                var mod = (!test && ((bits >> i) & 1) == 1);
439
440                if (i < 8) {
441                    _modules[8][_moduleCount - i - 1] = mod;
442                } else if (i < 9) {
443                    _modules[8][15 - i - 1 + 1] = mod;
444                } else {
445                    _modules[8][15 - i - 1] = mod;
446                }
447            }
448
449            // fixed module
450            _modules[_moduleCount - 8][8] = (!test);
451        };
452        var mapData = function (data, maskPattern) {
453
454            var inc = -1;
455            var row = _moduleCount - 1;
456            var bitIndex = 7;
457            var byteIndex = 0;
458            var maskFunc = QRUtil.getMaskFunction(maskPattern);
459
460            for (var col = _moduleCount - 1; col > 0; col -= 2) {
461
462                if (col == 6) col -= 1;
463
464                while (true) {
465
466                    for (var c = 0; c < 2; c += 1) {
467
468                        if (_modules[row][col - c] == null) {
469
470                            var dark = false;
471
472                            if (byteIndex < data.length) {
473                                dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
474                            }
475
476                            var mask = maskFunc(row, col - c);
477
478                            if (mask) {
479                                dark = !dark;
480                            }
481
482                            _modules[row][col - c] = dark;
483                            bitIndex -= 1;
484
485                            if (bitIndex == -1) {
486                                byteIndex += 1;
487                                bitIndex = 7;
488                            }
489                        }
490                    }
491
492                    row += inc;
493
494                    if (row < 0 || _moduleCount <= row) {
495                        row -= inc;
496                        inc = -inc;
497                        break;
498                    }
499                }
500            }
501        };
502        var createBytes = function (buffer, rsBlocks) {
503
504            var offset = 0;
505
506            var maxDcCount = 0;
507            var maxEcCount = 0;
508
509            var dcdata = new Array(rsBlocks.length);
510            var ecdata = new Array(rsBlocks.length);
511
512            for (var r = 0; r < rsBlocks.length; r += 1) {
513
514                var dcCount = rsBlocks[r].dataCount;
515                var ecCount = rsBlocks[r].totalCount - dcCount;
516
517                maxDcCount = Math.max(maxDcCount, dcCount);
518                maxEcCount = Math.max(maxEcCount, ecCount);
519
520                dcdata[r] = new Array(dcCount);
521
522                for (var i = 0; i < dcdata[r].length; i += 1) {
523                    dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
524                }
525                offset += dcCount;
526
527                var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
528                var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
529
530                var modPoly = rawPoly.mod(rsPoly);
531                ecdata[r] = new Array(rsPoly.getLength() - 1);
532                for (var i = 0; i < ecdata[r].length; i += 1) {
533                    var modIndex = i + modPoly.getLength() - ecdata[r].length;
534                    ecdata[r][i] = (modIndex >= 0) ? modPoly.getAt(modIndex) : 0;
535                }
536            }
537
538            var totalCodeCount = 0;
539            for (var i = 0; i < rsBlocks.length; i += 1) {
540                totalCodeCount += rsBlocks[i].totalCount;
541            }
542
543            var data = new Array(totalCodeCount);
544            var index = 0;
545
546            for (var i = 0; i < maxDcCount; i += 1) {
547                for (var r = 0; r < rsBlocks.length; r += 1) {
548                    if (i < dcdata[r].length) {
549                        data[index] = dcdata[r][i];
550                        index += 1;
551                    }
552                }
553            }
554
555            for (var i = 0; i < maxEcCount; i += 1) {
556                for (var r = 0; r < rsBlocks.length; r += 1) {
557                    if (i < ecdata[r].length) {
558                        data[index] = ecdata[r][i];
559                        index += 1;
560                    }
561                }
562            }
563
564            return data;
565        };
566        var createData = function (typeNumber, errorCorrectLevel, dataList) {
567
568            var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
569
570            var buffer = qrBitBuffer();
571
572            for (var i = 0; i < dataList.length; i += 1) {
573                var data = dataList[i];
574                buffer.put(data.getMode(), 4);
575                buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber));
576                data.write(buffer);
577            }
578
579            // calc num max data.
580            var totalDataCount = 0;
581            for (var i = 0; i < rsBlocks.length; i += 1) {
582                totalDataCount += rsBlocks[i].dataCount;
583            }
584
585            if (buffer.getLengthInBits() > totalDataCount * 8) {
586                throw new Error('code length overflow. ('
587                    + buffer.getLengthInBits()
588                    + '>'
589                    + totalDataCount * 8
590                    + ')');
591            }
592
593            // end code
594            if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
595                buffer.put(0, 4);
596            }
597
598            // padding
599            while (buffer.getLengthInBits() % 8 != 0) {
600                buffer.putBit(false);
601            }
602
603            // padding
604            while (true) {
605
606                if (buffer.getLengthInBits() >= totalDataCount * 8) {
607                    break;
608                }
609                buffer.put(PAD0, 8);
610
611                if (buffer.getLengthInBits() >= totalDataCount * 8) {
612                    break;
613                }
614                buffer.put(PAD1, 8);
615            }
616
617            return createBytes(buffer, rsBlocks);
618        };
619        _this.addData = function (data) {
620            var newData = qr8BitByte(data);
621            _dataList.push(newData);
622            _dataCache = null;
623        };
624        _this.isDark = function (row, col) {
625            if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
626                throw new Error(row + ',' + col);
627            }
628            return _modules[row][col];
629        };
630        _this.getModuleCount = function () {
631            return _moduleCount;
632        };
633        _this.make = function () {
634            makeImpl(false, getBestMaskPattern());
635        };
636        _this.createTableTag = function (cellSize, margin) {
637
638            cellSize = cellSize || 2;
639            margin = (typeof margin == 'undefined') ? 'auto' : margin;
640
641            var qrHtml = '';
642
643            qrHtml += '<table style="';
644            qrHtml += ' border-width: 0px; border-style: none;';
645            qrHtml += ' border-collapse: collapse;';
646            qrHtml += ' padding: 0px; margin:' + margin + ';';
647            qrHtml += '">';
648            qrHtml += '<tbody>';
649
650            for (var r = 0; r < _this.getModuleCount(); r += 1) {
651
652                qrHtml += '<tr>';
653
654                for (var c = 0; c < _this.getModuleCount(); c += 1) {
655                    qrHtml += '<td style="';
656                    qrHtml += ' border-width: 0px; border-style: none;';
657                    qrHtml += ' border-collapse: collapse;';
658                    qrHtml += ' padding: 0px; margin: 0px;';
659                    qrHtml += ' width: ' + cellSize + 'px;';
660                    qrHtml += ' height: ' + cellSize + 'px;';
661                    qrHtml += ' background-color: ';
662                    qrHtml += _this.isDark(r, c) ? '#000000' : '#ffffff';
663                    qrHtml += ';';
664                    qrHtml += '"/>';
665                }
666
667                qrHtml += '</tr>';
668            }
669
670            qrHtml += '</tbody>';
671            qrHtml += '</table>';
672
673            return qrHtml;
674        };
675        return _this;
676    };
677    qrcode.stringToBytes = function (s) {
678        var bytes = new Array();
679        for (var i = 0; i < s.length; i += 1) {
680            var c = s.charCodeAt(i);
681            bytes.push(c & 0xff);
682        }
683        return bytes;
684    };
685    qrcode.createStringToBytes = function (unicodeData, numChars) {
686
687        // create conversion map.
688
689        var unicodeMap = function () {
690
691            var bin = base64DecodeInputStream(unicodeData);
692            var read = function () {
693                var b = bin.read();
694                if (b == -1) throw new Error();
695                return b;
696            };
697
698            var count = 0;
699            var unicodeMap = {};
700            while (true) {
701                var b0 = bin.read();
702                if (b0 == -1) break;
703                var b1 = read();
704                var b2 = read();
705                var b3 = read();
706                var k = String.fromCharCode((b0 << 8) | b1);
707                var v = (b2 << 8) | b3;
708                unicodeMap[k] = v;
709                count += 1;
710            }
711            if (count != numChars) {
712                throw new Error(count + ' != ' + numChars);
713            }
714
715            return unicodeMap;
716        }();
717
718        var unknownChar = '?'.charCodeAt(0);
719
720        return function (s) {
721            var bytes = new Array();
722            for (var i = 0; i < s.length; i += 1) {
vendor: 17,416 bytes, lines 723-1310
723                var c = s.charCodeAt(i);
724                if (c < 128) {
725                    bytes.push(c);
726                } else {
727                    var b = unicodeMap[s.charAt(i)];
728                    if (typeof b == 'number') {
729                        if ((b & 0xff) == b) {
730                            // 1byte
731                            bytes.push(b);
732                        } else {
733                            // 2bytes
734                            bytes.push(b >>> 8);
735                            bytes.push(b & 0xff);
736                        }
737                    } else {
738                        bytes.push(unknownChar);
739                    }
740                }
741            }
742            return bytes;
743        };
744    };
745    var QRMode = {
746        MODE_NUMBER: 1 << 0,
747        MODE_ALPHA_NUM: 1 << 1,
748        MODE_8BIT_BYTE: 1 << 2,
749        MODE_KANJI: 1 << 3
750    };
751    var QRErrorCorrectLevel = {
752        L: 1,
753        M: 0,
754        Q: 3,
755        H: 2
756    };
757    var QRMaskPattern = {
758        PATTERN000: 0,
759        PATTERN001: 1,
760        PATTERN010: 2,
761        PATTERN011: 3,
762        PATTERN100: 4,
763        PATTERN101: 5,
764        PATTERN110: 6,
765        PATTERN111: 7
766    };
767    var QRUtil = function () {
768
769        var PATTERN_POSITION_TABLE = [
770            [],
771            [6, 18],
772            [6, 22],
773            [6, 26],
774            [6, 30],
775            [6, 34],
776            [6, 22, 38],
777            [6, 24, 42],
778            [6, 26, 46],
779            [6, 28, 50],
780            [6, 30, 54],
781            [6, 32, 58],
782            [6, 34, 62],
783            [6, 26, 46, 66],
784            [6, 26, 48, 70],
785            [6, 26, 50, 74],
786            [6, 30, 54, 78],
787            [6, 30, 56, 82],
788            [6, 30, 58, 86],
789            [6, 34, 62, 90],
790            [6, 28, 50, 72, 94],
791            [6, 26, 50, 74, 98],
792            [6, 30, 54, 78, 102],
793            [6, 28, 54, 80, 106],
794            [6, 32, 58, 84, 110],
795            [6, 30, 58, 86, 114],
796            [6, 34, 62, 90, 118],
797            [6, 26, 50, 74, 98, 122],
798            [6, 30, 54, 78, 102, 126],
799            [6, 26, 52, 78, 104, 130],
800            [6, 30, 56, 82, 108, 134],
801            [6, 34, 60, 86, 112, 138],
802            [6, 30, 58, 86, 114, 142],
803            [6, 34, 62, 90, 118, 146],
804            [6, 30, 54, 78, 102, 126, 150],
805            [6, 24, 50, 76, 102, 128, 154],
806            [6, 28, 54, 80, 106, 132, 158],
807            [6, 32, 58, 84, 110, 136, 162],
808            [6, 26, 54, 82, 110, 138, 166],
809            [6, 30, 58, 86, 114, 142, 170]
810        ];
811        var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
812        var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
813        var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
814
815        var _this = {};
816
817        var getBCHDigit = function (data) {
818            var digit = 0;
819            while (data != 0) {
820                digit += 1;
821                data >>>= 1;
822            }
823            return digit;
824        };
825
826        _this.getBCHTypeInfo = function (data) {
827            var d = data << 10;
828            while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
829                d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15)));
830            }
831            return ((data << 10) | d) ^ G15_MASK;
832        };
833
834        _this.getBCHTypeNumber = function (data) {
835            var d = data << 12;
836            while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
837                d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18)));
838            }
839            return (data << 12) | d;
840        };
841
842        _this.getPatternPosition = function (typeNumber) {
843            return PATTERN_POSITION_TABLE[typeNumber - 1];
844        };
845
846        _this.getMaskFunction = function (maskPattern) {
847
848            switch (maskPattern) {
849
850                case QRMaskPattern.PATTERN000:
851                    return function (i, j) { return (i + j) % 2 == 0; };
852                case QRMaskPattern.PATTERN001:
853                    return function (i, j) { return i % 2 == 0; };
854                case QRMaskPattern.PATTERN010:
855                    return function (i, j) { return j % 3 == 0; };
856                case QRMaskPattern.PATTERN011:
857                    return function (i, j) { return (i + j) % 3 == 0; };
858                case QRMaskPattern.PATTERN100:
859                    return function (i, j) { return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; };
860                case QRMaskPattern.PATTERN101:
861                    return function (i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };
862                case QRMaskPattern.PATTERN110:
863                    return function (i, j) { return ((i * j) % 2 + (i * j) % 3) % 2 == 0; };
864                case QRMaskPattern.PATTERN111:
865                    return function (i, j) { return ((i * j) % 3 + (i + j) % 2) % 2 == 0; };
866
867                default:
868                    throw new Error('bad maskPattern:' + maskPattern);
869            }
870        };
871
872        _this.getErrorCorrectPolynomial = function (errorCorrectLength) {
873            var a = qrPolynomial([1], 0);
874            for (var i = 0; i < errorCorrectLength; i += 1) {
875                a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0));
876            }
877            return a;
878        };
879
880        _this.getLengthInBits = function (mode, type) {
881
882            if (1 <= type && type < 10) {
883
884                // 1 - 9
885
886                switch (mode) {
887                    case QRMode.MODE_NUMBER: return 10;
888                    case QRMode.MODE_ALPHA_NUM: return 9;
889                    case QRMode.MODE_8BIT_BYTE: return 8;
890                    case QRMode.MODE_KANJI: return 8;
891                    default:
892                        throw new Error('mode:' + mode);
893                }
894
895            } else if (type < 27) {
896
897                // 10 - 26
898
899                switch (mode) {
900                    case QRMode.MODE_NUMBER: return 12;
901                    case QRMode.MODE_ALPHA_NUM: return 11;
902                    case QRMode.MODE_8BIT_BYTE: return 16;
903                    case QRMode.MODE_KANJI: return 10;
904                    default:
905                        throw new Error('mode:' + mode);
906                }
907
908            } else if (type < 41) {
909
910                // 27 - 40
911
912                switch (mode) {
913                    case QRMode.MODE_NUMBER: return 14;
914                    case QRMode.MODE_ALPHA_NUM: return 13;
915                    case QRMode.MODE_8BIT_BYTE: return 16;
916                    case QRMode.MODE_KANJI: return 12;
917                    default:
918                        throw new Error('mode:' + mode);
919                }
920
921            } else {
922                throw new Error('type:' + type);
923            }
924        };
925
926        _this.getLostPoint = function (qrcode) {
927
928            var moduleCount = qrcode.getModuleCount();
929
930            var lostPoint = 0;
931
932            // LEVEL1
933
934            for (var row = 0; row < moduleCount; row += 1) {
935                for (var col = 0; col < moduleCount; col += 1) {
936
937                    var sameCount = 0;
938                    var dark = qrcode.isDark(row, col);
939
940                    for (var r = -1; r <= 1; r += 1) {
941
942                        if (row + r < 0 || moduleCount <= row + r) {
943                            continue;
944                        }
945
946                        for (var c = -1; c <= 1; c += 1) {
947
948                            if (col + c < 0 || moduleCount <= col + c) {
949                                continue;
950                            }
951
952                            if (r == 0 && c == 0) {
953                                continue;
954                            }
955
956                            if (dark == qrcode.isDark(row + r, col + c)) {
957                                sameCount += 1;
958                            }
959                        }
960                    }
961
962                    if (sameCount > 5) {
963                        lostPoint += (3 + sameCount - 5);
964                    }
965                }
966            };
967
968            // LEVEL2
969
970            for (var row = 0; row < moduleCount - 1; row += 1) {
971                for (var col = 0; col < moduleCount - 1; col += 1) {
972                    var count = 0;
973                    if (qrcode.isDark(row, col)) count += 1;
974                    if (qrcode.isDark(row + 1, col)) count += 1;
975                    if (qrcode.isDark(row, col + 1)) count += 1;
976                    if (qrcode.isDark(row + 1, col + 1)) count += 1;
977                    if (count == 0 || count == 4) {
978                        lostPoint += 3;
979                    }
980                }
981            }
982
983            // LEVEL3
984
985            for (var row = 0; row < moduleCount; row += 1) {
986                for (var col = 0; col < moduleCount - 6; col += 1) {
987                    if (qrcode.isDark(row, col)
988                        && !qrcode.isDark(row, col + 1)
989                        && qrcode.isDark(row, col + 2)
990                        && qrcode.isDark(row, col + 3)
991                        && qrcode.isDark(row, col + 4)
992                        && !qrcode.isDark(row, col + 5)
993                        && qrcode.isDark(row, col + 6)) {
994                        lostPoint += 40;
995                    }
996                }
997            }
998
999            for (var col = 0; col < moduleCount; col += 1) {
1000                for (var row = 0; row < moduleCount - 6; row += 1) {
1001                    if (qrcode.isDark(row, col)
1002                        && !qrcode.isDark(row + 1, col)
1003                        && qrcode.isDark(row + 2, col)
1004                        && qrcode.isDark(row + 3, col)
1005                        && qrcode.isDark(row + 4, col)
1006                        && !qrcode.isDark(row + 5, col)
1007                        && qrcode.isDark(row + 6, col)) {
1008                        lostPoint += 40;
1009                    }
1010                }
1011            }
1012
1013            // LEVEL4
1014
1015            var darkCount = 0;
1016
1017            for (var col = 0; col < moduleCount; col += 1) {
1018                for (var row = 0; row < moduleCount; row += 1) {
1019                    if (qrcode.isDark(row, col)) {
1020                        darkCount += 1;
1021                    }
1022                }
1023            }
1024
1025            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
1026            lostPoint += ratio * 10;
1027
1028            return lostPoint;
1029        };
1030
1031        return _this;
1032    }();
1033    var QRMath = function () {
1034
1035        var EXP_TABLE = new Array(256);
1036        var LOG_TABLE = new Array(256);
1037
1038        // initialize tables
1039        for (var i = 0; i < 8; i += 1) {
1040            EXP_TABLE[i] = 1 << i;
1041        }
1042        for (var i = 8; i < 256; i += 1) {
1043            EXP_TABLE[i] = EXP_TABLE[i - 4]
1044                ^ EXP_TABLE[i - 5]
1045                ^ EXP_TABLE[i - 6]
1046                ^ EXP_TABLE[i - 8];
1047        }
1048        for (var i = 0; i < 255; i += 1) {
1049            LOG_TABLE[EXP_TABLE[i]] = i;
1050        }
1051
1052        var _this = {};
1053
1054        _this.glog = function (n) {
1055
1056            if (n < 1) {
1057                throw new Error('glog(' + n + ')');
1058            }
1059
1060            return LOG_TABLE[n];
1061        };
1062
1063        _this.gexp = function (n) {
1064
1065            while (n < 0) {
1066                n += 255;
1067            }
1068
1069            while (n >= 256) {
1070                n -= 255;
1071            }
1072
1073            return EXP_TABLE[n];
1074        };
1075
1076        return _this;
1077    }();
1078    function qrPolynomial(num, shift) {
1079
1080        if (typeof num.length == 'undefined') {
1081            throw new Error(num.length + '/' + shift);
1082        }
1083
1084        var _num = function () {
1085            var offset = 0;
1086            while (offset < num.length && num[offset] == 0) {
1087                offset += 1;
1088            }
1089            var _num = new Array(num.length - offset + shift);
1090            for (var i = 0; i < num.length - offset; i += 1) {
1091                _num[i] = num[i + offset];
1092            }
1093            return _num;
1094        }();
1095
1096        var _this = {};
1097
1098        _this.getAt = function (index) {
1099            return _num[index];
1100        };
1101
1102        _this.getLength = function () {
1103            return _num.length;
1104        };
1105
1106        _this.multiply = function (e) {
1107
1108            var num = new Array(_this.getLength() + e.getLength() - 1);
1109
1110            for (var i = 0; i < _this.getLength(); i += 1) {
1111                for (var j = 0; j < e.getLength(); j += 1) {
1112                    num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i)) + QRMath.glog(e.getAt(j)));
1113                }
1114            }
1115
1116            return qrPolynomial(num, 0);
1117        };
1118
1119        _this.mod = function (e) {
1120
1121            if (_this.getLength() - e.getLength() < 0) {
1122                return _this;
1123            }
1124
1125            var ratio = QRMath.glog(_this.getAt(0)) - QRMath.glog(e.getAt(0));
1126
1127            var num = new Array(_this.getLength());
1128            for (var i = 0; i < _this.getLength(); i += 1) {
1129                num[i] = _this.getAt(i);
1130            }
1131
1132            for (var i = 0; i < e.getLength(); i += 1) {
1133                num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i)) + ratio);
1134            }
1135
1136            // recursive call
1137            return qrPolynomial(num, 0).mod(e);
1138        };
1139
1140        return _this;
1141    };
1142    var QRRSBlock = function () {
1143
1144        var RS_BLOCK_TABLE = [
1145
1146            // L
1147            // M
1148            // Q
1149            // H
1150
1151            // 1
1152            [1, 26, 19],
1153            [1, 26, 16],
1154            [1, 26, 13],
1155            [1, 26, 9],
1156
1157            // 2
1158            [1, 44, 34],
1159            [1, 44, 28],
1160            [1, 44, 22],
1161            [1, 44, 16],
1162
1163            // 3
1164            [1, 70, 55],
1165            [1, 70, 44],
1166            [2, 35, 17],
1167            [2, 35, 13],
1168
1169            // 4
1170            [1, 100, 80],
1171            [2, 50, 32],
1172            [2, 50, 24],
1173            [4, 25, 9],
1174
1175            // 5
1176            [1, 134, 108],
1177            [2, 67, 43],
1178            [2, 33, 15, 2, 34, 16],
1179            [2, 33, 11, 2, 34, 12],
1180
1181            // 6
1182            [2, 86, 68],
1183            [4, 43, 27],
1184            [4, 43, 19],
1185            [4, 43, 15],
1186
1187            // 7
1188            [2, 98, 78],
1189            [4, 49, 31],
1190            [2, 32, 14, 4, 33, 15],
1191            [4, 39, 13, 1, 40, 14],
1192
1193            // 8
1194            [2, 121, 97],
1195            [2, 60, 38, 2, 61, 39],
1196            [4, 40, 18, 2, 41, 19],
1197            [4, 40, 14, 2, 41, 15],
1198
1199            // 9
1200            [2, 146, 116],
1201            [3, 58, 36, 2, 59, 37],
1202            [4, 36, 16, 4, 37, 17],
1203            [4, 36, 12, 4, 37, 13],
1204
1205            // 10
1206            [2, 86, 68, 2, 87, 69],
1207            [4, 69, 43, 1, 70, 44],
1208            [6, 43, 19, 2, 44, 20],
1209            [6, 43, 15, 2, 44, 16],
1210
1211            // 11
1212            [4, 101, 81],
1213            [1, 80, 50, 4, 81, 51],
1214            [4, 50, 22, 4, 51, 23],
1215            [3, 36, 12, 8, 37, 13],
1216
1217            // 12
1218            [2, 116, 92, 2, 117, 93],
1219            [6, 58, 36, 2, 59, 37],
1220            [4, 46, 20, 6, 47, 21],
1221            [7, 42, 14, 4, 43, 15],
1222
1223            // 13
1224            [4, 133, 107],
1225            [8, 59, 37, 1, 60, 38],
1226            [8, 44, 20, 4, 45, 21],
1227            [12, 33, 11, 4, 34, 12],
1228
1229            // 14
1230            [3, 145, 115, 1, 146, 116],
1231            [4, 64, 40, 5, 65, 41],
1232            [11, 36, 16, 5, 37, 17],
1233            [11, 36, 12, 5, 37, 13],
1234
1235            // 15
1236            [5, 109, 87, 1, 110, 88],
1237            [5, 65, 41, 5, 66, 42],
1238            [5, 54, 24, 7, 55, 25],
1239            [11, 36, 12, 7, 37, 13],
1240
1241            // 16
1242            [5, 122, 98, 1, 123, 99],
1243            [7, 73, 45, 3, 74, 46],
1244            [15, 43, 19, 2, 44, 20],
1245            [3, 45, 15, 13, 46, 16],
1246
1247            // 17
1248            [1, 135, 107, 5, 136, 108],
1249            [10, 74, 46, 1, 75, 47],
1250            [1, 50, 22, 15, 51, 23],
1251            [2, 42, 14, 17, 43, 15],
1252
1253            // 18
1254            [5, 150, 120, 1, 151, 121],
1255            [9, 69, 43, 4, 70, 44],
1256            [17, 50, 22, 1, 51, 23],
1257            [2, 42, 14, 19, 43, 15],
1258
1259            // 19
1260            [3, 141, 113, 4, 142, 114],
1261            [3, 70, 44, 11, 71, 45],
1262            [17, 47, 21, 4, 48, 22],
1263            [9, 39, 13, 16, 40, 14],
1264
1265            // 20
1266            [3, 135, 107, 5, 136, 108],
1267            [3, 67, 41, 13, 68, 42],
1268            [15, 54, 24, 5, 55, 25],
1269            [15, 43, 15, 10, 44, 16],
1270
1271            // 21
1272            [4, 144, 116, 4, 145, 117],
1273            [17, 68, 42],
1274            [17, 50, 22, 6, 51, 23],
1275            [19, 46, 16, 6, 47, 17],
1276
1277            // 22
1278            [2, 139, 111, 7, 140, 112],
1279            [17, 74, 46],
1280            [7, 54, 24, 16, 55, 25],
1281            [34, 37, 13],
1282
1283            // 23
1284            [4, 151, 121, 5, 152, 122],
1285            [4, 75, 47, 14, 76, 48],
1286            [11, 54, 24, 14, 55, 25],
1287            [16, 45, 15, 14, 46, 16],
1288
1289            // 24
1290            [6, 147, 117, 4, 148, 118],
1291            [6, 73, 45, 14, 74, 46],
1292            [11, 54, 24, 16, 55, 25],
1293            [30, 46, 16, 2, 47, 17],
1294
1295            // 25
1296            [8, 132, 106, 4, 133, 107],
1297            [8, 75, 47, 13, 76, 48],
1298            [7, 54, 24, 22, 55, 25],
1299            [22, 45, 15, 13, 46, 16],
1300
1301            // 26
1302            [10, 142, 114, 2, 143, 115],
1303            [19, 74, 46, 4, 75, 47],
1304            [28, 50, 22, 6, 51, 23],
1305            [33, 46, 16, 4, 47, 17],
1306
1307            // 27
1308            [8, 152, 122, 4, 153, 123],
1309            [22, 73, 45, 3, 74, 46],
1310            [8, 53, 23, 26, 54, 24],
1311            [12, 45, 15, 28, 46, 16],
1312
1313            // 28
1314            [3, 147, 117, 10, 148, 118],
1315            [3, 73, 45, 23, 74, 46],
1316            [4, 54, 24, 31, 55, 25],
1317            [11, 45, 15, 31, 46, 16],
1318
1319            // 29
1320            [7, 146, 116, 7, 147, 117],
1321            [21, 73, 45, 7, 74, 46],
1322            [1, 53, 23, 37, 54, 24],
1323            [19, 45, 15, 26, 46, 16],
1324
1325            // 30
1326            [5, 145, 115, 10, 146, 116],
1327            [19, 75, 47, 10, 76, 48],
1328            [15, 54, 24, 25, 55, 25],
1329            [23, 45, 15, 25, 46, 16],
1330
1331            // 31
1332            [13, 145, 115, 3, 146, 116],
1333            [2, 74, 46, 29, 75, 47],
1334            [42, 54, 24, 1, 55, 25],
1335            [23, 45, 15, 28, 46, 16],
1336
1337            // 32
1338            [17, 145, 115],
1339            [10, 74, 46, 23, 75, 47],
1340            [10, 54, 24, 35, 55, 25],
1341            [19, 45, 15, 35, 46, 16],
1342
1343            // 33
1344            [17, 145, 115, 1, 146, 116],
1345            [14, 74, 46, 21, 75, 47],
1346            [29, 54, 24, 19, 55, 25],
1347            [11, 45, 15, 46, 46, 16],
1348
1349            // 34
1350            [13, 145, 115, 6, 146, 116],
1351            [14, 74, 46, 23, 75, 47],
1352            [44, 54, 24, 7, 55, 25],
1353            [59, 46, 16, 1, 47, 17],
1354
1355            // 35
1356            [12, 151, 121, 7, 152, 122],
1357            [12, 75, 47, 26, 76, 48],
1358            [39, 54, 24, 14, 55, 25],
1359            [22, 45, 15, 41, 46, 16],
1360
1361            // 36
1362            [6, 151, 121, 14, 152, 122],
1363            [6, 75, 47, 34, 76, 48],
1364            [46, 54, 24, 10, 55, 25],
1365            [2, 45, 15, 64, 46, 16],
1366
1367            // 37
1368            [17, 152, 122, 4, 153, 123],
1369            [29, 74, 46, 14, 75, 47],
1370            [49, 54, 24, 10, 55, 25],
1371            [24, 45, 15, 46, 46, 16],
1372
1373            // 38
1374            [4, 152, 122, 18, 153, 123],
1375            [13, 74, 46, 32, 75, 47],
1376            [48, 54, 24, 14, 55, 25],
1377            [42, 45, 15, 32, 46, 16],
1378
1379            // 39
1380            [20, 147, 117, 4, 148, 118],
1381            [40, 75, 47, 7, 76, 48],
1382            [43, 54, 24, 22, 55, 25],
1383            [10, 45, 15, 67, 46, 16],
1384
1385            // 40
1386            [19, 148, 118, 6, 149, 119],
1387            [18, 75, 47, 31, 76, 48],
1388            [34, 54, 24, 34, 55, 25],
1389            [20, 45, 15, 61, 46, 16]
1390        ];
1391
1392        var qrRSBlock = function (totalCount, dataCount) {
1393            var _this = {};
1394            _this.totalCount = totalCount;
1395            _this.dataCount = dataCount;
1396            return _this;
1397        };
1398
1399        var _this = {};
1400
1401        var getRsBlockTable = function (typeNumber, errorCorrectLevel) {
1402
1403            switch (errorCorrectLevel) {
1404                case QRErrorCorrectLevel.L:
1405                    return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
1406                case QRErrorCorrectLevel.M:
1407                    return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
1408                case QRErrorCorrectLevel.Q:
1409                    return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
1410                case QRErrorCorrectLevel.H:
1411                    return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
1412                default:
1413                    return undefined;
1414            }
1415        };
1416
1417        _this.getRSBlocks = function (typeNumber, errorCorrectLevel) {
1418
1419            var rsBlock = getRsBlockTable(typeNumber, errorCorrectLevel);
1420
1421            if (typeof rsBlock == 'undefined') {
1422                throw new Error('bad rs block @ typeNumber:' + typeNumber +
1423                    '/errorCorrectLevel:' + errorCorrectLevel);
1424            }
1425
1426            var length = rsBlock.length / 3;
1427
1428            var list = new Array();
1429
1430            for (var i = 0; i < length; i += 1) {
1431
1432                var count = rsBlock[i * 3 + 0];
1433                var totalCount = rsBlock[i * 3 + 1];
1434                var dataCount = rsBlock[i * 3 + 2];
1435
1436                for (var j = 0; j < count; j += 1) {
1437                    list.push(qrRSBlock(totalCount, dataCount));
1438                }
1439            }
1440
1441            return list;
1442        };
1443
1444        return _this;
1445    }();
1446    var qrBitBuffer = function () {
1447
1448        var _buffer = new Array();
1449        var _length = 0;
1450
1451        var _this = {};
1452
1453        _this.getBuffer = function () {
1454            return _buffer;
1455        };
1456
1457        _this.getAt = function (index) {
1458            var bufIndex = Math.floor(index / 8);
1459            return ((_buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;
1460        };
1461
1462        _this.put = function (num, length) {
1463            for (var i = 0; i < length; i += 1) {
1464                _this.putBit(((num >>> (length - i - 1)) & 1) == 1);
1465            }
1466        };
1467
1468        _this.getLengthInBits = function () {
1469            return _length;
1470        };
1471
1472        _this.putBit = function (bit) {
1473
1474            var bufIndex = Math.floor(_length / 8);
1475            if (_buffer.length <= bufIndex) {
1476                _buffer.push(0);
1477            }
1478
1479            if (bit) {
1480                _buffer[bufIndex] |= (0x80 >>> (_length % 8));
1481            }
1482
1483            _length += 1;
1484        };
1485
1486        return _this;
1487    };
1488    var qr8BitByte = function (data) {
1489
1490        var _mode = QRMode.MODE_8BIT_BYTE;
1491        var _data = data;
1492        var _bytes = qrcode.stringToBytes(data);
1493
1494        var _this = {};
1495
1496        _this.getMode = function () {
1497            return _mode;
1498        };
1499
1500        _this.getLength = function (buffer) {
1501            return _bytes.length;
1502        };
1503
1504        _this.write = function (buffer) {
1505            for (var i = 0; i < _bytes.length; i += 1) {
1506                buffer.put(_bytes[i], 8);
1507            }
1508        };
1509
1510        return _this;
1511    };
1512    var base64DecodeInputStream = function (str) {
1513
1514        var _str = str;
1515        var _pos = 0;
1516        var _buffer = 0;
1517        var _buflen = 0;
1518
1519        var _this = {};
1520
1521        _this.read = function () {
1522
1523            while (_buflen < 8) {
1524
1525                if (_pos >= _str.length) {
1526                    if (_buflen == 0) {
1527                        return -1;
1528                    }
1529                    throw new Error('unexpected end of file./' + _buflen);
1530                }
1531
1532                var c = _str.charAt(_pos);
1533                _pos += 1;
1534
1535                if (c == '=') {
1536                    _buflen = 0;
1537                    return -1;
1538                } else if (c.match(/^\s$/)) {
1539                    // ignore if whitespace.
1540                    continue;
1541                }
1542
1543                _buffer = (_buffer << 6) | decode(c.charCodeAt(0));
1544                _buflen += 6;
1545            }
1546
1547            var n = (_buffer >>> (_buflen - 8)) & 0xff;
1548            _buflen -= 8;
1549            return n;
1550        };
1551
1552        var decode = function (c) {
1553            if (0x41 <= c && c <= 0x5a) {
1554                return c - 0x41;
1555            } else if (0x61 <= c && c <= 0x7a) {
1556                return c - 0x61 + 26;
1557            } else if (0x30 <= c && c <= 0x39) {
1558                return c - 0x30 + 52;
1559            } else if (c == 0x2b) {
1560                return 62;
1561            } else if (c == 0x2f) {
1562                return 63;
1563            } else {
1564                throw new Error('c:' + c);
1565            }
1566        };
1567
1568        return _this;
1569    };
1570    return qrcode;
1571}();

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.