2969 lines
185 KiB
JavaScript
2969 lines
185 KiB
JavaScript
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
|
if you want to view the source visit the plugins github repository
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var obsidian = require('obsidian');
|
|
|
|
/******************************************************************************
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
***************************************************************************** */
|
|
|
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
}
|
|
|
|
// can-promise has a crash in some versions of react native that dont have
|
|
// standard global objects
|
|
// https://github.com/soldair/node-qrcode/issues/157
|
|
|
|
var canPromise = function () {
|
|
return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then
|
|
};
|
|
|
|
let toSJISFunction;
|
|
const CODEWORDS_COUNT = [
|
|
0, // Not used
|
|
26, 44, 70, 100, 134, 172, 196, 242, 292, 346,
|
|
404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,
|
|
1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,
|
|
2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706
|
|
];
|
|
|
|
/**
|
|
* Returns the QR Code size for the specified version
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @return {Number} size of QR code
|
|
*/
|
|
var getSymbolSize$1 = function getSymbolSize (version) {
|
|
if (!version) throw new Error('"version" cannot be null or undefined')
|
|
if (version < 1 || version > 40) throw new Error('"version" should be in range from 1 to 40')
|
|
return version * 4 + 17
|
|
};
|
|
|
|
/**
|
|
* Returns the total number of codewords used to store data and EC information.
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @return {Number} Data length in bits
|
|
*/
|
|
var getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {
|
|
return CODEWORDS_COUNT[version]
|
|
};
|
|
|
|
/**
|
|
* Encode data with Bose-Chaudhuri-Hocquenghem
|
|
*
|
|
* @param {Number} data Value to encode
|
|
* @return {Number} Encoded value
|
|
*/
|
|
var getBCHDigit = function (data) {
|
|
let digit = 0;
|
|
|
|
while (data !== 0) {
|
|
digit++;
|
|
data >>>= 1;
|
|
}
|
|
|
|
return digit
|
|
};
|
|
|
|
var setToSJISFunction = function setToSJISFunction (f) {
|
|
if (typeof f !== 'function') {
|
|
throw new Error('"toSJISFunc" is not a valid function.')
|
|
}
|
|
|
|
toSJISFunction = f;
|
|
};
|
|
|
|
var isKanjiModeEnabled = function () {
|
|
return typeof toSJISFunction !== 'undefined'
|
|
};
|
|
|
|
var toSJIS = function toSJIS (kanji) {
|
|
return toSJISFunction(kanji)
|
|
};
|
|
|
|
var utils$1 = {
|
|
getSymbolSize: getSymbolSize$1,
|
|
getSymbolTotalCodewords: getSymbolTotalCodewords,
|
|
getBCHDigit: getBCHDigit,
|
|
setToSJISFunction: setToSJISFunction,
|
|
isKanjiModeEnabled: isKanjiModeEnabled,
|
|
toSJIS: toSJIS
|
|
};
|
|
|
|
function createCommonjsModule(fn) {
|
|
var module = { exports: {} };
|
|
return fn(module, module.exports), module.exports;
|
|
}
|
|
|
|
var errorCorrectionLevel = createCommonjsModule(function (module, exports) {
|
|
exports.L = { bit: 1 };
|
|
exports.M = { bit: 0 };
|
|
exports.Q = { bit: 3 };
|
|
exports.H = { bit: 2 };
|
|
|
|
function fromString (string) {
|
|
if (typeof string !== 'string') {
|
|
throw new Error('Param is not a string')
|
|
}
|
|
|
|
const lcStr = string.toLowerCase();
|
|
|
|
switch (lcStr) {
|
|
case 'l':
|
|
case 'low':
|
|
return exports.L
|
|
|
|
case 'm':
|
|
case 'medium':
|
|
return exports.M
|
|
|
|
case 'q':
|
|
case 'quartile':
|
|
return exports.Q
|
|
|
|
case 'h':
|
|
case 'high':
|
|
return exports.H
|
|
|
|
default:
|
|
throw new Error('Unknown EC Level: ' + string)
|
|
}
|
|
}
|
|
|
|
exports.isValid = function isValid (level) {
|
|
return level && typeof level.bit !== 'undefined' &&
|
|
level.bit >= 0 && level.bit < 4
|
|
};
|
|
|
|
exports.from = function from (value, defaultValue) {
|
|
if (exports.isValid(value)) {
|
|
return value
|
|
}
|
|
|
|
try {
|
|
return fromString(value)
|
|
} catch (e) {
|
|
return defaultValue
|
|
}
|
|
};
|
|
});
|
|
|
|
function BitBuffer () {
|
|
this.buffer = [];
|
|
this.length = 0;
|
|
}
|
|
|
|
BitBuffer.prototype = {
|
|
|
|
get: function (index) {
|
|
const bufIndex = Math.floor(index / 8);
|
|
return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1
|
|
},
|
|
|
|
put: function (num, length) {
|
|
for (let i = 0; i < length; i++) {
|
|
this.putBit(((num >>> (length - i - 1)) & 1) === 1);
|
|
}
|
|
},
|
|
|
|
getLengthInBits: function () {
|
|
return this.length
|
|
},
|
|
|
|
putBit: function (bit) {
|
|
const bufIndex = Math.floor(this.length / 8);
|
|
if (this.buffer.length <= bufIndex) {
|
|
this.buffer.push(0);
|
|
}
|
|
|
|
if (bit) {
|
|
this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
|
|
}
|
|
|
|
this.length++;
|
|
}
|
|
};
|
|
|
|
var bitBuffer = BitBuffer;
|
|
|
|
/**
|
|
* Helper class to handle QR Code symbol modules
|
|
*
|
|
* @param {Number} size Symbol size
|
|
*/
|
|
function BitMatrix (size) {
|
|
if (!size || size < 1) {
|
|
throw new Error('BitMatrix size must be defined and greater than 0')
|
|
}
|
|
|
|
this.size = size;
|
|
this.data = new Uint8Array(size * size);
|
|
this.reservedBit = new Uint8Array(size * size);
|
|
}
|
|
|
|
/**
|
|
* Set bit value at specified location
|
|
* If reserved flag is set, this bit will be ignored during masking process
|
|
*
|
|
* @param {Number} row
|
|
* @param {Number} col
|
|
* @param {Boolean} value
|
|
* @param {Boolean} reserved
|
|
*/
|
|
BitMatrix.prototype.set = function (row, col, value, reserved) {
|
|
const index = row * this.size + col;
|
|
this.data[index] = value;
|
|
if (reserved) this.reservedBit[index] = true;
|
|
};
|
|
|
|
/**
|
|
* Returns bit value at specified location
|
|
*
|
|
* @param {Number} row
|
|
* @param {Number} col
|
|
* @return {Boolean}
|
|
*/
|
|
BitMatrix.prototype.get = function (row, col) {
|
|
return this.data[row * this.size + col]
|
|
};
|
|
|
|
/**
|
|
* Applies xor operator at specified location
|
|
* (used during masking process)
|
|
*
|
|
* @param {Number} row
|
|
* @param {Number} col
|
|
* @param {Boolean} value
|
|
*/
|
|
BitMatrix.prototype.xor = function (row, col, value) {
|
|
this.data[row * this.size + col] ^= value;
|
|
};
|
|
|
|
/**
|
|
* Check if bit at specified location is reserved
|
|
*
|
|
* @param {Number} row
|
|
* @param {Number} col
|
|
* @return {Boolean}
|
|
*/
|
|
BitMatrix.prototype.isReserved = function (row, col) {
|
|
return this.reservedBit[row * this.size + col]
|
|
};
|
|
|
|
var bitMatrix = BitMatrix;
|
|
|
|
/**
|
|
* Alignment pattern are fixed reference pattern in defined positions
|
|
* in a matrix symbology, which enables the decode software to re-synchronise
|
|
* the coordinate mapping of the image modules in the event of moderate amounts
|
|
* of distortion of the image.
|
|
*
|
|
* Alignment patterns are present only in QR Code symbols of version 2 or larger
|
|
* and their number depends on the symbol version.
|
|
*/
|
|
|
|
var alignmentPattern = createCommonjsModule(function (module, exports) {
|
|
const getSymbolSize = utils$1.getSymbolSize;
|
|
|
|
/**
|
|
* Calculate the row/column coordinates of the center module of each alignment pattern
|
|
* for the specified QR Code version.
|
|
*
|
|
* The alignment patterns are positioned symmetrically on either side of the diagonal
|
|
* running from the top left corner of the symbol to the bottom right corner.
|
|
*
|
|
* Since positions are simmetrical only half of the coordinates are returned.
|
|
* Each item of the array will represent in turn the x and y coordinate.
|
|
* @see {@link getPositions}
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @return {Array} Array of coordinate
|
|
*/
|
|
exports.getRowColCoords = function getRowColCoords (version) {
|
|
if (version === 1) return []
|
|
|
|
const posCount = Math.floor(version / 7) + 2;
|
|
const size = getSymbolSize(version);
|
|
const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2;
|
|
const positions = [size - 7]; // Last coord is always (size - 7)
|
|
|
|
for (let i = 1; i < posCount - 1; i++) {
|
|
positions[i] = positions[i - 1] - intervals;
|
|
}
|
|
|
|
positions.push(6); // First coord is always 6
|
|
|
|
return positions.reverse()
|
|
};
|
|
|
|
/**
|
|
* Returns an array containing the positions of each alignment pattern.
|
|
* Each array's element represent the center point of the pattern as (x, y) coordinates
|
|
*
|
|
* Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}
|
|
* and filtering out the items that overlaps with finder pattern
|
|
*
|
|
* @example
|
|
* For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.
|
|
* The alignment patterns, therefore, are to be centered on (row, column)
|
|
* positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).
|
|
* Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns
|
|
* and are not therefore used for alignment patterns.
|
|
*
|
|
* let pos = getPositions(7)
|
|
* // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @return {Array} Array of coordinates
|
|
*/
|
|
exports.getPositions = function getPositions (version) {
|
|
const coords = [];
|
|
const pos = exports.getRowColCoords(version);
|
|
const posLength = pos.length;
|
|
|
|
for (let i = 0; i < posLength; i++) {
|
|
for (let j = 0; j < posLength; j++) {
|
|
// Skip if position is occupied by finder patterns
|
|
if ((i === 0 && j === 0) || // top-left
|
|
(i === 0 && j === posLength - 1) || // bottom-left
|
|
(i === posLength - 1 && j === 0)) { // top-right
|
|
continue
|
|
}
|
|
|
|
coords.push([pos[i], pos[j]]);
|
|
}
|
|
}
|
|
|
|
return coords
|
|
};
|
|
});
|
|
|
|
const getSymbolSize = utils$1.getSymbolSize;
|
|
const FINDER_PATTERN_SIZE = 7;
|
|
|
|
/**
|
|
* Returns an array containing the positions of each finder pattern.
|
|
* Each array's element represent the top-left point of the pattern as (x, y) coordinates
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @return {Array} Array of coordinates
|
|
*/
|
|
var getPositions = function getPositions (version) {
|
|
const size = getSymbolSize(version);
|
|
|
|
return [
|
|
// top-left
|
|
[0, 0],
|
|
// top-right
|
|
[size - FINDER_PATTERN_SIZE, 0],
|
|
// bottom-left
|
|
[0, size - FINDER_PATTERN_SIZE]
|
|
]
|
|
};
|
|
|
|
var finderPattern = {
|
|
getPositions: getPositions
|
|
};
|
|
|
|
/**
|
|
* Data mask pattern reference
|
|
* @type {Object}
|
|
*/
|
|
|
|
var maskPattern = createCommonjsModule(function (module, exports) {
|
|
exports.Patterns = {
|
|
PATTERN000: 0,
|
|
PATTERN001: 1,
|
|
PATTERN010: 2,
|
|
PATTERN011: 3,
|
|
PATTERN100: 4,
|
|
PATTERN101: 5,
|
|
PATTERN110: 6,
|
|
PATTERN111: 7
|
|
};
|
|
|
|
/**
|
|
* Weighted penalty scores for the undesirable features
|
|
* @type {Object}
|
|
*/
|
|
const PenaltyScores = {
|
|
N1: 3,
|
|
N2: 3,
|
|
N3: 40,
|
|
N4: 10
|
|
};
|
|
|
|
/**
|
|
* Check if mask pattern value is valid
|
|
*
|
|
* @param {Number} mask Mask pattern
|
|
* @return {Boolean} true if valid, false otherwise
|
|
*/
|
|
exports.isValid = function isValid (mask) {
|
|
return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7
|
|
};
|
|
|
|
/**
|
|
* Returns mask pattern from a value.
|
|
* If value is not valid, returns undefined
|
|
*
|
|
* @param {Number|String} value Mask pattern value
|
|
* @return {Number} Valid mask pattern or undefined
|
|
*/
|
|
exports.from = function from (value) {
|
|
return exports.isValid(value) ? parseInt(value, 10) : undefined
|
|
};
|
|
|
|
/**
|
|
* Find adjacent modules in row/column with the same color
|
|
* and assign a penalty value.
|
|
*
|
|
* Points: N1 + i
|
|
* i is the amount by which the number of adjacent modules of the same color exceeds 5
|
|
*/
|
|
exports.getPenaltyN1 = function getPenaltyN1 (data) {
|
|
const size = data.size;
|
|
let points = 0;
|
|
let sameCountCol = 0;
|
|
let sameCountRow = 0;
|
|
let lastCol = null;
|
|
let lastRow = null;
|
|
|
|
for (let row = 0; row < size; row++) {
|
|
sameCountCol = sameCountRow = 0;
|
|
lastCol = lastRow = null;
|
|
|
|
for (let col = 0; col < size; col++) {
|
|
let module = data.get(row, col);
|
|
if (module === lastCol) {
|
|
sameCountCol++;
|
|
} else {
|
|
if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5);
|
|
lastCol = module;
|
|
sameCountCol = 1;
|
|
}
|
|
|
|
module = data.get(col, row);
|
|
if (module === lastRow) {
|
|
sameCountRow++;
|
|
} else {
|
|
if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5);
|
|
lastRow = module;
|
|
sameCountRow = 1;
|
|
}
|
|
}
|
|
|
|
if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5);
|
|
if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5);
|
|
}
|
|
|
|
return points
|
|
};
|
|
|
|
/**
|
|
* Find 2x2 blocks with the same color and assign a penalty value
|
|
*
|
|
* Points: N2 * (m - 1) * (n - 1)
|
|
*/
|
|
exports.getPenaltyN2 = function getPenaltyN2 (data) {
|
|
const size = data.size;
|
|
let points = 0;
|
|
|
|
for (let row = 0; row < size - 1; row++) {
|
|
for (let col = 0; col < size - 1; col++) {
|
|
const last = data.get(row, col) +
|
|
data.get(row, col + 1) +
|
|
data.get(row + 1, col) +
|
|
data.get(row + 1, col + 1);
|
|
|
|
if (last === 4 || last === 0) points++;
|
|
}
|
|
}
|
|
|
|
return points * PenaltyScores.N2
|
|
};
|
|
|
|
/**
|
|
* Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,
|
|
* preceded or followed by light area 4 modules wide
|
|
*
|
|
* Points: N3 * number of pattern found
|
|
*/
|
|
exports.getPenaltyN3 = function getPenaltyN3 (data) {
|
|
const size = data.size;
|
|
let points = 0;
|
|
let bitsCol = 0;
|
|
let bitsRow = 0;
|
|
|
|
for (let row = 0; row < size; row++) {
|
|
bitsCol = bitsRow = 0;
|
|
for (let col = 0; col < size; col++) {
|
|
bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col);
|
|
if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++;
|
|
|
|
bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row);
|
|
if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++;
|
|
}
|
|
}
|
|
|
|
return points * PenaltyScores.N3
|
|
};
|
|
|
|
/**
|
|
* Calculate proportion of dark modules in entire symbol
|
|
*
|
|
* Points: N4 * k
|
|
*
|
|
* k is the rating of the deviation of the proportion of dark modules
|
|
* in the symbol from 50% in steps of 5%
|
|
*/
|
|
exports.getPenaltyN4 = function getPenaltyN4 (data) {
|
|
let darkCount = 0;
|
|
const modulesCount = data.data.length;
|
|
|
|
for (let i = 0; i < modulesCount; i++) darkCount += data.data[i];
|
|
|
|
const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10);
|
|
|
|
return k * PenaltyScores.N4
|
|
};
|
|
|
|
/**
|
|
* Return mask value at given position
|
|
*
|
|
* @param {Number} maskPattern Pattern reference value
|
|
* @param {Number} i Row
|
|
* @param {Number} j Column
|
|
* @return {Boolean} Mask value
|
|
*/
|
|
function getMaskAt (maskPattern, i, j) {
|
|
switch (maskPattern) {
|
|
case exports.Patterns.PATTERN000: return (i + j) % 2 === 0
|
|
case exports.Patterns.PATTERN001: return i % 2 === 0
|
|
case exports.Patterns.PATTERN010: return j % 3 === 0
|
|
case exports.Patterns.PATTERN011: return (i + j) % 3 === 0
|
|
case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0
|
|
case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0
|
|
case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0
|
|
case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0
|
|
|
|
default: throw new Error('bad maskPattern:' + maskPattern)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Apply a mask pattern to a BitMatrix
|
|
*
|
|
* @param {Number} pattern Pattern reference number
|
|
* @param {BitMatrix} data BitMatrix data
|
|
*/
|
|
exports.applyMask = function applyMask (pattern, data) {
|
|
const size = data.size;
|
|
|
|
for (let col = 0; col < size; col++) {
|
|
for (let row = 0; row < size; row++) {
|
|
if (data.isReserved(row, col)) continue
|
|
data.xor(row, col, getMaskAt(pattern, row, col));
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Returns the best mask pattern for data
|
|
*
|
|
* @param {BitMatrix} data
|
|
* @return {Number} Mask pattern reference number
|
|
*/
|
|
exports.getBestMask = function getBestMask (data, setupFormatFunc) {
|
|
const numPatterns = Object.keys(exports.Patterns).length;
|
|
let bestPattern = 0;
|
|
let lowerPenalty = Infinity;
|
|
|
|
for (let p = 0; p < numPatterns; p++) {
|
|
setupFormatFunc(p);
|
|
exports.applyMask(p, data);
|
|
|
|
// Calculate penalty
|
|
const penalty =
|
|
exports.getPenaltyN1(data) +
|
|
exports.getPenaltyN2(data) +
|
|
exports.getPenaltyN3(data) +
|
|
exports.getPenaltyN4(data);
|
|
|
|
// Undo previously applied mask
|
|
exports.applyMask(p, data);
|
|
|
|
if (penalty < lowerPenalty) {
|
|
lowerPenalty = penalty;
|
|
bestPattern = p;
|
|
}
|
|
}
|
|
|
|
return bestPattern
|
|
};
|
|
});
|
|
|
|
const EC_BLOCKS_TABLE = [
|
|
// L M Q H
|
|
1, 1, 1, 1,
|
|
1, 1, 1, 1,
|
|
1, 1, 2, 2,
|
|
1, 2, 2, 4,
|
|
1, 2, 4, 4,
|
|
2, 4, 4, 4,
|
|
2, 4, 6, 5,
|
|
2, 4, 6, 6,
|
|
2, 5, 8, 8,
|
|
4, 5, 8, 8,
|
|
4, 5, 8, 11,
|
|
4, 8, 10, 11,
|
|
4, 9, 12, 16,
|
|
4, 9, 16, 16,
|
|
6, 10, 12, 18,
|
|
6, 10, 17, 16,
|
|
6, 11, 16, 19,
|
|
6, 13, 18, 21,
|
|
7, 14, 21, 25,
|
|
8, 16, 20, 25,
|
|
8, 17, 23, 25,
|
|
9, 17, 23, 34,
|
|
9, 18, 25, 30,
|
|
10, 20, 27, 32,
|
|
12, 21, 29, 35,
|
|
12, 23, 34, 37,
|
|
12, 25, 34, 40,
|
|
13, 26, 35, 42,
|
|
14, 28, 38, 45,
|
|
15, 29, 40, 48,
|
|
16, 31, 43, 51,
|
|
17, 33, 45, 54,
|
|
18, 35, 48, 57,
|
|
19, 37, 51, 60,
|
|
19, 38, 53, 63,
|
|
20, 40, 56, 66,
|
|
21, 43, 59, 70,
|
|
22, 45, 62, 74,
|
|
24, 47, 65, 77,
|
|
25, 49, 68, 81
|
|
];
|
|
|
|
const EC_CODEWORDS_TABLE = [
|
|
// L M Q H
|
|
7, 10, 13, 17,
|
|
10, 16, 22, 28,
|
|
15, 26, 36, 44,
|
|
20, 36, 52, 64,
|
|
26, 48, 72, 88,
|
|
36, 64, 96, 112,
|
|
40, 72, 108, 130,
|
|
48, 88, 132, 156,
|
|
60, 110, 160, 192,
|
|
72, 130, 192, 224,
|
|
80, 150, 224, 264,
|
|
96, 176, 260, 308,
|
|
104, 198, 288, 352,
|
|
120, 216, 320, 384,
|
|
132, 240, 360, 432,
|
|
144, 280, 408, 480,
|
|
168, 308, 448, 532,
|
|
180, 338, 504, 588,
|
|
196, 364, 546, 650,
|
|
224, 416, 600, 700,
|
|
224, 442, 644, 750,
|
|
252, 476, 690, 816,
|
|
270, 504, 750, 900,
|
|
300, 560, 810, 960,
|
|
312, 588, 870, 1050,
|
|
336, 644, 952, 1110,
|
|
360, 700, 1020, 1200,
|
|
390, 728, 1050, 1260,
|
|
420, 784, 1140, 1350,
|
|
450, 812, 1200, 1440,
|
|
480, 868, 1290, 1530,
|
|
510, 924, 1350, 1620,
|
|
540, 980, 1440, 1710,
|
|
570, 1036, 1530, 1800,
|
|
570, 1064, 1590, 1890,
|
|
600, 1120, 1680, 1980,
|
|
630, 1204, 1770, 2100,
|
|
660, 1260, 1860, 2220,
|
|
720, 1316, 1950, 2310,
|
|
750, 1372, 2040, 2430
|
|
];
|
|
|
|
/**
|
|
* Returns the number of error correction block that the QR Code should contain
|
|
* for the specified version and error correction level.
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @param {Number} errorCorrectionLevel Error correction level
|
|
* @return {Number} Number of error correction blocks
|
|
*/
|
|
var getBlocksCount = function getBlocksCount (version, errorCorrectionLevel$1) {
|
|
switch (errorCorrectionLevel$1) {
|
|
case errorCorrectionLevel.L:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]
|
|
case errorCorrectionLevel.M:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]
|
|
case errorCorrectionLevel.Q:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]
|
|
case errorCorrectionLevel.H:
|
|
return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]
|
|
default:
|
|
return undefined
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Returns the number of error correction codewords to use for the specified
|
|
* version and error correction level.
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @param {Number} errorCorrectionLevel Error correction level
|
|
* @return {Number} Number of error correction codewords
|
|
*/
|
|
var getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel$1) {
|
|
switch (errorCorrectionLevel$1) {
|
|
case errorCorrectionLevel.L:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]
|
|
case errorCorrectionLevel.M:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]
|
|
case errorCorrectionLevel.Q:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]
|
|
case errorCorrectionLevel.H:
|
|
return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]
|
|
default:
|
|
return undefined
|
|
}
|
|
};
|
|
|
|
var errorCorrectionCode = {
|
|
getBlocksCount: getBlocksCount,
|
|
getTotalCodewordsCount: getTotalCodewordsCount
|
|
};
|
|
|
|
const EXP_TABLE = new Uint8Array(512);
|
|
const LOG_TABLE = new Uint8Array(256)
|
|
/**
|
|
* Precompute the log and anti-log tables for faster computation later
|
|
*
|
|
* For each possible value in the galois field 2^8, we will pre-compute
|
|
* the logarithm and anti-logarithm (exponential) of this value
|
|
*
|
|
* ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}
|
|
*/
|
|
;(function initTables () {
|
|
let x = 1;
|
|
for (let i = 0; i < 255; i++) {
|
|
EXP_TABLE[i] = x;
|
|
LOG_TABLE[x] = i;
|
|
|
|
x <<= 1; // multiply by 2
|
|
|
|
// The QR code specification says to use byte-wise modulo 100011101 arithmetic.
|
|
// This means that when a number is 256 or larger, it should be XORed with 0x11D.
|
|
if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)
|
|
x ^= 0x11D;
|
|
}
|
|
}
|
|
|
|
// Optimization: double the size of the anti-log table so that we don't need to mod 255 to
|
|
// stay inside the bounds (because we will mainly use this table for the multiplication of
|
|
// two GF numbers, no more).
|
|
// @see {@link mul}
|
|
for (let i = 255; i < 512; i++) {
|
|
EXP_TABLE[i] = EXP_TABLE[i - 255];
|
|
}
|
|
}());
|
|
|
|
/**
|
|
* Returns log value of n inside Galois Field
|
|
*
|
|
* @param {Number} n
|
|
* @return {Number}
|
|
*/
|
|
var log = function log (n) {
|
|
if (n < 1) throw new Error('log(' + n + ')')
|
|
return LOG_TABLE[n]
|
|
};
|
|
|
|
/**
|
|
* Returns anti-log value of n inside Galois Field
|
|
*
|
|
* @param {Number} n
|
|
* @return {Number}
|
|
*/
|
|
var exp = function exp (n) {
|
|
return EXP_TABLE[n]
|
|
};
|
|
|
|
/**
|
|
* Multiplies two number inside Galois Field
|
|
*
|
|
* @param {Number} x
|
|
* @param {Number} y
|
|
* @return {Number}
|
|
*/
|
|
var mul = function mul (x, y) {
|
|
if (x === 0 || y === 0) return 0
|
|
|
|
// should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized
|
|
// @see {@link initTables}
|
|
return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]
|
|
};
|
|
|
|
var galoisField = {
|
|
log: log,
|
|
exp: exp,
|
|
mul: mul
|
|
};
|
|
|
|
var polynomial = createCommonjsModule(function (module, exports) {
|
|
/**
|
|
* Multiplies two polynomials inside Galois Field
|
|
*
|
|
* @param {Uint8Array} p1 Polynomial
|
|
* @param {Uint8Array} p2 Polynomial
|
|
* @return {Uint8Array} Product of p1 and p2
|
|
*/
|
|
exports.mul = function mul (p1, p2) {
|
|
const coeff = new Uint8Array(p1.length + p2.length - 1);
|
|
|
|
for (let i = 0; i < p1.length; i++) {
|
|
for (let j = 0; j < p2.length; j++) {
|
|
coeff[i + j] ^= galoisField.mul(p1[i], p2[j]);
|
|
}
|
|
}
|
|
|
|
return coeff
|
|
};
|
|
|
|
/**
|
|
* Calculate the remainder of polynomials division
|
|
*
|
|
* @param {Uint8Array} divident Polynomial
|
|
* @param {Uint8Array} divisor Polynomial
|
|
* @return {Uint8Array} Remainder
|
|
*/
|
|
exports.mod = function mod (divident, divisor) {
|
|
let result = new Uint8Array(divident);
|
|
|
|
while ((result.length - divisor.length) >= 0) {
|
|
const coeff = result[0];
|
|
|
|
for (let i = 0; i < divisor.length; i++) {
|
|
result[i] ^= galoisField.mul(divisor[i], coeff);
|
|
}
|
|
|
|
// remove all zeros from buffer head
|
|
let offset = 0;
|
|
while (offset < result.length && result[offset] === 0) offset++;
|
|
result = result.slice(offset);
|
|
}
|
|
|
|
return result
|
|
};
|
|
|
|
/**
|
|
* Generate an irreducible generator polynomial of specified degree
|
|
* (used by Reed-Solomon encoder)
|
|
*
|
|
* @param {Number} degree Degree of the generator polynomial
|
|
* @return {Uint8Array} Buffer containing polynomial coefficients
|
|
*/
|
|
exports.generateECPolynomial = function generateECPolynomial (degree) {
|
|
let poly = new Uint8Array([1]);
|
|
for (let i = 0; i < degree; i++) {
|
|
poly = exports.mul(poly, new Uint8Array([1, galoisField.exp(i)]));
|
|
}
|
|
|
|
return poly
|
|
};
|
|
});
|
|
|
|
function ReedSolomonEncoder (degree) {
|
|
this.genPoly = undefined;
|
|
this.degree = degree;
|
|
|
|
if (this.degree) this.initialize(this.degree);
|
|
}
|
|
|
|
/**
|
|
* Initialize the encoder.
|
|
* The input param should correspond to the number of error correction codewords.
|
|
*
|
|
* @param {Number} degree
|
|
*/
|
|
ReedSolomonEncoder.prototype.initialize = function initialize (degree) {
|
|
// create an irreducible generator polynomial
|
|
this.degree = degree;
|
|
this.genPoly = polynomial.generateECPolynomial(this.degree);
|
|
};
|
|
|
|
/**
|
|
* Encodes a chunk of data
|
|
*
|
|
* @param {Uint8Array} data Buffer containing input data
|
|
* @return {Uint8Array} Buffer containing encoded data
|
|
*/
|
|
ReedSolomonEncoder.prototype.encode = function encode (data) {
|
|
if (!this.genPoly) {
|
|
throw new Error('Encoder not initialized')
|
|
}
|
|
|
|
// Calculate EC for this data block
|
|
// extends data size to data+genPoly size
|
|
const paddedData = new Uint8Array(data.length + this.degree);
|
|
paddedData.set(data);
|
|
|
|
// The error correction codewords are the remainder after dividing the data codewords
|
|
// by a generator polynomial
|
|
const remainder = polynomial.mod(paddedData, this.genPoly);
|
|
|
|
// return EC data blocks (last n byte, where n is the degree of genPoly)
|
|
// If coefficients number in remainder are less than genPoly degree,
|
|
// pad with 0s to the left to reach the needed number of coefficients
|
|
const start = this.degree - remainder.length;
|
|
if (start > 0) {
|
|
const buff = new Uint8Array(this.degree);
|
|
buff.set(remainder, start);
|
|
|
|
return buff
|
|
}
|
|
|
|
return remainder
|
|
};
|
|
|
|
var reedSolomonEncoder = ReedSolomonEncoder;
|
|
|
|
/**
|
|
* Check if QR Code version is valid
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @return {Boolean} true if valid version, false otherwise
|
|
*/
|
|
var isValid = function isValid (version) {
|
|
return !isNaN(version) && version >= 1 && version <= 40
|
|
};
|
|
|
|
var versionCheck = {
|
|
isValid: isValid
|
|
};
|
|
|
|
const numeric = '[0-9]+';
|
|
const alphanumeric = '[A-Z $%*+\\-./:]+';
|
|
let kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +
|
|
'[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +
|
|
'[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +
|
|
'[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+';
|
|
kanji = kanji.replace(/u/g, '\\u');
|
|
|
|
const byte = '(?:(?![A-Z0-9 $%*+\\-./:]|' + kanji + ')(?:.|[\r\n]))+';
|
|
|
|
var KANJI = new RegExp(kanji, 'g');
|
|
var BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\-./:]+', 'g');
|
|
var BYTE = new RegExp(byte, 'g');
|
|
var NUMERIC = new RegExp(numeric, 'g');
|
|
var ALPHANUMERIC = new RegExp(alphanumeric, 'g');
|
|
|
|
const TEST_KANJI = new RegExp('^' + kanji + '$');
|
|
const TEST_NUMERIC = new RegExp('^' + numeric + '$');
|
|
const TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\-./:]+$');
|
|
|
|
var testKanji = function testKanji (str) {
|
|
return TEST_KANJI.test(str)
|
|
};
|
|
|
|
var testNumeric = function testNumeric (str) {
|
|
return TEST_NUMERIC.test(str)
|
|
};
|
|
|
|
var testAlphanumeric = function testAlphanumeric (str) {
|
|
return TEST_ALPHANUMERIC.test(str)
|
|
};
|
|
|
|
var regex = {
|
|
KANJI: KANJI,
|
|
BYTE_KANJI: BYTE_KANJI,
|
|
BYTE: BYTE,
|
|
NUMERIC: NUMERIC,
|
|
ALPHANUMERIC: ALPHANUMERIC,
|
|
testKanji: testKanji,
|
|
testNumeric: testNumeric,
|
|
testAlphanumeric: testAlphanumeric
|
|
};
|
|
|
|
var mode = createCommonjsModule(function (module, exports) {
|
|
/**
|
|
* Numeric mode encodes data from the decimal digit set (0 - 9)
|
|
* (byte values 30HEX to 39HEX).
|
|
* Normally, 3 data characters are represented by 10 bits.
|
|
*
|
|
* @type {Object}
|
|
*/
|
|
exports.NUMERIC = {
|
|
id: 'Numeric',
|
|
bit: 1 << 0,
|
|
ccBits: [10, 12, 14]
|
|
};
|
|
|
|
/**
|
|
* Alphanumeric mode encodes data from a set of 45 characters,
|
|
* i.e. 10 numeric digits (0 - 9),
|
|
* 26 alphabetic characters (A - Z),
|
|
* and 9 symbols (SP, $, %, *, +, -, ., /, :).
|
|
* Normally, two input characters are represented by 11 bits.
|
|
*
|
|
* @type {Object}
|
|
*/
|
|
exports.ALPHANUMERIC = {
|
|
id: 'Alphanumeric',
|
|
bit: 1 << 1,
|
|
ccBits: [9, 11, 13]
|
|
};
|
|
|
|
/**
|
|
* In byte mode, data is encoded at 8 bits per character.
|
|
*
|
|
* @type {Object}
|
|
*/
|
|
exports.BYTE = {
|
|
id: 'Byte',
|
|
bit: 1 << 2,
|
|
ccBits: [8, 16, 16]
|
|
};
|
|
|
|
/**
|
|
* The Kanji mode efficiently encodes Kanji characters in accordance with
|
|
* the Shift JIS system based on JIS X 0208.
|
|
* The Shift JIS values are shifted from the JIS X 0208 values.
|
|
* JIS X 0208 gives details of the shift coded representation.
|
|
* Each two-byte character value is compacted to a 13-bit binary codeword.
|
|
*
|
|
* @type {Object}
|
|
*/
|
|
exports.KANJI = {
|
|
id: 'Kanji',
|
|
bit: 1 << 3,
|
|
ccBits: [8, 10, 12]
|
|
};
|
|
|
|
/**
|
|
* Mixed mode will contain a sequences of data in a combination of any of
|
|
* the modes described above
|
|
*
|
|
* @type {Object}
|
|
*/
|
|
exports.MIXED = {
|
|
bit: -1
|
|
};
|
|
|
|
/**
|
|
* Returns the number of bits needed to store the data length
|
|
* according to QR Code specifications.
|
|
*
|
|
* @param {Mode} mode Data mode
|
|
* @param {Number} version QR Code version
|
|
* @return {Number} Number of bits
|
|
*/
|
|
exports.getCharCountIndicator = function getCharCountIndicator (mode, version) {
|
|
if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)
|
|
|
|
if (!versionCheck.isValid(version)) {
|
|
throw new Error('Invalid version: ' + version)
|
|
}
|
|
|
|
if (version >= 1 && version < 10) return mode.ccBits[0]
|
|
else if (version < 27) return mode.ccBits[1]
|
|
return mode.ccBits[2]
|
|
};
|
|
|
|
/**
|
|
* Returns the most efficient mode to store the specified data
|
|
*
|
|
* @param {String} dataStr Input data string
|
|
* @return {Mode} Best mode
|
|
*/
|
|
exports.getBestModeForData = function getBestModeForData (dataStr) {
|
|
if (regex.testNumeric(dataStr)) return exports.NUMERIC
|
|
else if (regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC
|
|
else if (regex.testKanji(dataStr)) return exports.KANJI
|
|
else return exports.BYTE
|
|
};
|
|
|
|
/**
|
|
* Return mode name as string
|
|
*
|
|
* @param {Mode} mode Mode object
|
|
* @returns {String} Mode name
|
|
*/
|
|
exports.toString = function toString (mode) {
|
|
if (mode && mode.id) return mode.id
|
|
throw new Error('Invalid mode')
|
|
};
|
|
|
|
/**
|
|
* Check if input param is a valid mode object
|
|
*
|
|
* @param {Mode} mode Mode object
|
|
* @returns {Boolean} True if valid mode, false otherwise
|
|
*/
|
|
exports.isValid = function isValid (mode) {
|
|
return mode && mode.bit && mode.ccBits
|
|
};
|
|
|
|
/**
|
|
* Get mode object from its name
|
|
*
|
|
* @param {String} string Mode name
|
|
* @returns {Mode} Mode object
|
|
*/
|
|
function fromString (string) {
|
|
if (typeof string !== 'string') {
|
|
throw new Error('Param is not a string')
|
|
}
|
|
|
|
const lcStr = string.toLowerCase();
|
|
|
|
switch (lcStr) {
|
|
case 'numeric':
|
|
return exports.NUMERIC
|
|
case 'alphanumeric':
|
|
return exports.ALPHANUMERIC
|
|
case 'kanji':
|
|
return exports.KANJI
|
|
case 'byte':
|
|
return exports.BYTE
|
|
default:
|
|
throw new Error('Unknown mode: ' + string)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns mode from a value.
|
|
* If value is not a valid mode, returns defaultValue
|
|
*
|
|
* @param {Mode|String} value Encoding mode
|
|
* @param {Mode} defaultValue Fallback value
|
|
* @return {Mode} Encoding mode
|
|
*/
|
|
exports.from = function from (value, defaultValue) {
|
|
if (exports.isValid(value)) {
|
|
return value
|
|
}
|
|
|
|
try {
|
|
return fromString(value)
|
|
} catch (e) {
|
|
return defaultValue
|
|
}
|
|
};
|
|
});
|
|
|
|
var version = createCommonjsModule(function (module, exports) {
|
|
// Generator polynomial used to encode version information
|
|
const G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
|
|
const G18_BCH = utils$1.getBCHDigit(G18);
|
|
|
|
function getBestVersionForDataLength (mode, length, errorCorrectionLevel) {
|
|
for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {
|
|
if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {
|
|
return currentVersion
|
|
}
|
|
}
|
|
|
|
return undefined
|
|
}
|
|
|
|
function getReservedBitsCount (mode$1, version) {
|
|
// Character count indicator + mode indicator bits
|
|
return mode.getCharCountIndicator(mode$1, version) + 4
|
|
}
|
|
|
|
function getTotalBitsFromDataArray (segments, version) {
|
|
let totalBits = 0;
|
|
|
|
segments.forEach(function (data) {
|
|
const reservedBits = getReservedBitsCount(data.mode, version);
|
|
totalBits += reservedBits + data.getBitsLength();
|
|
});
|
|
|
|
return totalBits
|
|
}
|
|
|
|
function getBestVersionForMixedData (segments, errorCorrectionLevel) {
|
|
for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {
|
|
const length = getTotalBitsFromDataArray(segments, currentVersion);
|
|
if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode.MIXED)) {
|
|
return currentVersion
|
|
}
|
|
}
|
|
|
|
return undefined
|
|
}
|
|
|
|
/**
|
|
* Returns version number from a value.
|
|
* If value is not a valid version, returns defaultValue
|
|
*
|
|
* @param {Number|String} value QR Code version
|
|
* @param {Number} defaultValue Fallback value
|
|
* @return {Number} QR Code version number
|
|
*/
|
|
exports.from = function from (value, defaultValue) {
|
|
if (versionCheck.isValid(value)) {
|
|
return parseInt(value, 10)
|
|
}
|
|
|
|
return defaultValue
|
|
};
|
|
|
|
/**
|
|
* Returns how much data can be stored with the specified QR code version
|
|
* and error correction level
|
|
*
|
|
* @param {Number} version QR Code version (1-40)
|
|
* @param {Number} errorCorrectionLevel Error correction level
|
|
* @param {Mode} mode Data mode
|
|
* @return {Number} Quantity of storable data
|
|
*/
|
|
exports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode$1) {
|
|
if (!versionCheck.isValid(version)) {
|
|
throw new Error('Invalid QR Code version')
|
|
}
|
|
|
|
// Use Byte mode as default
|
|
if (typeof mode$1 === 'undefined') mode$1 = mode.BYTE;
|
|
|
|
// Total codewords for this QR code version (Data + Error correction)
|
|
const totalCodewords = utils$1.getSymbolTotalCodewords(version);
|
|
|
|
// Total number of error correction codewords
|
|
const ecTotalCodewords = errorCorrectionCode.getTotalCodewordsCount(version, errorCorrectionLevel);
|
|
|
|
// Total number of data codewords
|
|
const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8;
|
|
|
|
if (mode$1 === mode.MIXED) return dataTotalCodewordsBits
|
|
|
|
const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode$1, version);
|
|
|
|
// Return max number of storable codewords
|
|
switch (mode$1) {
|
|
case mode.NUMERIC:
|
|
return Math.floor((usableBits / 10) * 3)
|
|
|
|
case mode.ALPHANUMERIC:
|
|
return Math.floor((usableBits / 11) * 2)
|
|
|
|
case mode.KANJI:
|
|
return Math.floor(usableBits / 13)
|
|
|
|
case mode.BYTE:
|
|
default:
|
|
return Math.floor(usableBits / 8)
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Returns the minimum version needed to contain the amount of data
|
|
*
|
|
* @param {Segment} data Segment of data
|
|
* @param {Number} [errorCorrectionLevel=H] Error correction level
|
|
* @param {Mode} mode Data mode
|
|
* @return {Number} QR Code version
|
|
*/
|
|
exports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel$1) {
|
|
let seg;
|
|
|
|
const ecl = errorCorrectionLevel.from(errorCorrectionLevel$1, errorCorrectionLevel.M);
|
|
|
|
if (Array.isArray(data)) {
|
|
if (data.length > 1) {
|
|
return getBestVersionForMixedData(data, ecl)
|
|
}
|
|
|
|
if (data.length === 0) {
|
|
return 1
|
|
}
|
|
|
|
seg = data[0];
|
|
} else {
|
|
seg = data;
|
|
}
|
|
|
|
return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)
|
|
};
|
|
|
|
/**
|
|
* Returns version information with relative error correction bits
|
|
*
|
|
* The version information is included in QR Code symbols of version 7 or larger.
|
|
* It consists of an 18-bit sequence containing 6 data bits,
|
|
* with 12 error correction bits calculated using the (18, 6) Golay code.
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @return {Number} Encoded version info bits
|
|
*/
|
|
exports.getEncodedBits = function getEncodedBits (version) {
|
|
if (!versionCheck.isValid(version) || version < 7) {
|
|
throw new Error('Invalid QR Code version')
|
|
}
|
|
|
|
let d = version << 12;
|
|
|
|
while (utils$1.getBCHDigit(d) - G18_BCH >= 0) {
|
|
d ^= (G18 << (utils$1.getBCHDigit(d) - G18_BCH));
|
|
}
|
|
|
|
return (version << 12) | d
|
|
};
|
|
});
|
|
|
|
const G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
|
|
const G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
|
|
const G15_BCH = utils$1.getBCHDigit(G15);
|
|
|
|
/**
|
|
* Returns format information with relative error correction bits
|
|
*
|
|
* The format information is a 15-bit sequence containing 5 data bits,
|
|
* with 10 error correction bits calculated using the (15, 5) BCH code.
|
|
*
|
|
* @param {Number} errorCorrectionLevel Error correction level
|
|
* @param {Number} mask Mask pattern
|
|
* @return {Number} Encoded format information bits
|
|
*/
|
|
var getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {
|
|
const data = ((errorCorrectionLevel.bit << 3) | mask);
|
|
let d = data << 10;
|
|
|
|
while (utils$1.getBCHDigit(d) - G15_BCH >= 0) {
|
|
d ^= (G15 << (utils$1.getBCHDigit(d) - G15_BCH));
|
|
}
|
|
|
|
// xor final data with mask pattern in order to ensure that
|
|
// no combination of Error Correction Level and data mask pattern
|
|
// will result in an all-zero data string
|
|
return ((data << 10) | d) ^ G15_MASK
|
|
};
|
|
|
|
var formatInfo = {
|
|
getEncodedBits: getEncodedBits
|
|
};
|
|
|
|
function NumericData (data) {
|
|
this.mode = mode.NUMERIC;
|
|
this.data = data.toString();
|
|
}
|
|
|
|
NumericData.getBitsLength = function getBitsLength (length) {
|
|
return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)
|
|
};
|
|
|
|
NumericData.prototype.getLength = function getLength () {
|
|
return this.data.length
|
|
};
|
|
|
|
NumericData.prototype.getBitsLength = function getBitsLength () {
|
|
return NumericData.getBitsLength(this.data.length)
|
|
};
|
|
|
|
NumericData.prototype.write = function write (bitBuffer) {
|
|
let i, group, value;
|
|
|
|
// The input data string is divided into groups of three digits,
|
|
// and each group is converted to its 10-bit binary equivalent.
|
|
for (i = 0; i + 3 <= this.data.length; i += 3) {
|
|
group = this.data.substr(i, 3);
|
|
value = parseInt(group, 10);
|
|
|
|
bitBuffer.put(value, 10);
|
|
}
|
|
|
|
// If the number of input digits is not an exact multiple of three,
|
|
// the final one or two digits are converted to 4 or 7 bits respectively.
|
|
const remainingNum = this.data.length - i;
|
|
if (remainingNum > 0) {
|
|
group = this.data.substr(i);
|
|
value = parseInt(group, 10);
|
|
|
|
bitBuffer.put(value, remainingNum * 3 + 1);
|
|
}
|
|
};
|
|
|
|
var numericData = NumericData;
|
|
|
|
/**
|
|
* Array of characters available in alphanumeric mode
|
|
*
|
|
* As per QR Code specification, to each character
|
|
* is assigned a value from 0 to 44 which in this case coincides
|
|
* with the array index
|
|
*
|
|
* @type {Array}
|
|
*/
|
|
const ALPHA_NUM_CHARS = [
|
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
' ', '$', '%', '*', '+', '-', '.', '/', ':'
|
|
];
|
|
|
|
function AlphanumericData (data) {
|
|
this.mode = mode.ALPHANUMERIC;
|
|
this.data = data;
|
|
}
|
|
|
|
AlphanumericData.getBitsLength = function getBitsLength (length) {
|
|
return 11 * Math.floor(length / 2) + 6 * (length % 2)
|
|
};
|
|
|
|
AlphanumericData.prototype.getLength = function getLength () {
|
|
return this.data.length
|
|
};
|
|
|
|
AlphanumericData.prototype.getBitsLength = function getBitsLength () {
|
|
return AlphanumericData.getBitsLength(this.data.length)
|
|
};
|
|
|
|
AlphanumericData.prototype.write = function write (bitBuffer) {
|
|
let i;
|
|
|
|
// Input data characters are divided into groups of two characters
|
|
// and encoded as 11-bit binary codes.
|
|
for (i = 0; i + 2 <= this.data.length; i += 2) {
|
|
// The character value of the first character is multiplied by 45
|
|
let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45;
|
|
|
|
// The character value of the second digit is added to the product
|
|
value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1]);
|
|
|
|
// The sum is then stored as 11-bit binary number
|
|
bitBuffer.put(value, 11);
|
|
}
|
|
|
|
// If the number of input data characters is not a multiple of two,
|
|
// the character value of the final character is encoded as a 6-bit binary number.
|
|
if (this.data.length % 2) {
|
|
bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6);
|
|
}
|
|
};
|
|
|
|
var alphanumericData = AlphanumericData;
|
|
|
|
var encodeUtf8 = function encodeUtf8 (input) {
|
|
var result = [];
|
|
var size = input.length;
|
|
|
|
for (var index = 0; index < size; index++) {
|
|
var point = input.charCodeAt(index);
|
|
|
|
if (point >= 0xD800 && point <= 0xDBFF && size > index + 1) {
|
|
var second = input.charCodeAt(index + 1);
|
|
|
|
if (second >= 0xDC00 && second <= 0xDFFF) {
|
|
// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
|
|
point = (point - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
|
|
index += 1;
|
|
}
|
|
}
|
|
|
|
// US-ASCII
|
|
if (point < 0x80) {
|
|
result.push(point);
|
|
continue
|
|
}
|
|
|
|
// 2-byte UTF-8
|
|
if (point < 0x800) {
|
|
result.push((point >> 6) | 192);
|
|
result.push((point & 63) | 128);
|
|
continue
|
|
}
|
|
|
|
// 3-byte UTF-8
|
|
if (point < 0xD800 || (point >= 0xE000 && point < 0x10000)) {
|
|
result.push((point >> 12) | 224);
|
|
result.push(((point >> 6) & 63) | 128);
|
|
result.push((point & 63) | 128);
|
|
continue
|
|
}
|
|
|
|
// 4-byte UTF-8
|
|
if (point >= 0x10000 && point <= 0x10FFFF) {
|
|
result.push((point >> 18) | 240);
|
|
result.push(((point >> 12) & 63) | 128);
|
|
result.push(((point >> 6) & 63) | 128);
|
|
result.push((point & 63) | 128);
|
|
continue
|
|
}
|
|
|
|
// Invalid character
|
|
result.push(0xEF, 0xBF, 0xBD);
|
|
}
|
|
|
|
return new Uint8Array(result).buffer
|
|
};
|
|
|
|
function ByteData (data) {
|
|
this.mode = mode.BYTE;
|
|
if (typeof (data) === 'string') {
|
|
data = encodeUtf8(data);
|
|
}
|
|
this.data = new Uint8Array(data);
|
|
}
|
|
|
|
ByteData.getBitsLength = function getBitsLength (length) {
|
|
return length * 8
|
|
};
|
|
|
|
ByteData.prototype.getLength = function getLength () {
|
|
return this.data.length
|
|
};
|
|
|
|
ByteData.prototype.getBitsLength = function getBitsLength () {
|
|
return ByteData.getBitsLength(this.data.length)
|
|
};
|
|
|
|
ByteData.prototype.write = function (bitBuffer) {
|
|
for (let i = 0, l = this.data.length; i < l; i++) {
|
|
bitBuffer.put(this.data[i], 8);
|
|
}
|
|
};
|
|
|
|
var byteData = ByteData;
|
|
|
|
function KanjiData (data) {
|
|
this.mode = mode.KANJI;
|
|
this.data = data;
|
|
}
|
|
|
|
KanjiData.getBitsLength = function getBitsLength (length) {
|
|
return length * 13
|
|
};
|
|
|
|
KanjiData.prototype.getLength = function getLength () {
|
|
return this.data.length
|
|
};
|
|
|
|
KanjiData.prototype.getBitsLength = function getBitsLength () {
|
|
return KanjiData.getBitsLength(this.data.length)
|
|
};
|
|
|
|
KanjiData.prototype.write = function (bitBuffer) {
|
|
let i;
|
|
|
|
// In the Shift JIS system, Kanji characters are represented by a two byte combination.
|
|
// These byte values are shifted from the JIS X 0208 values.
|
|
// JIS X 0208 gives details of the shift coded representation.
|
|
for (i = 0; i < this.data.length; i++) {
|
|
let value = utils$1.toSJIS(this.data[i]);
|
|
|
|
// For characters with Shift JIS values from 0x8140 to 0x9FFC:
|
|
if (value >= 0x8140 && value <= 0x9FFC) {
|
|
// Subtract 0x8140 from Shift JIS value
|
|
value -= 0x8140;
|
|
|
|
// For characters with Shift JIS values from 0xE040 to 0xEBBF
|
|
} else if (value >= 0xE040 && value <= 0xEBBF) {
|
|
// Subtract 0xC140 from Shift JIS value
|
|
value -= 0xC140;
|
|
} else {
|
|
throw new Error(
|
|
'Invalid SJIS character: ' + this.data[i] + '\n' +
|
|
'Make sure your charset is UTF-8')
|
|
}
|
|
|
|
// Multiply most significant byte of result by 0xC0
|
|
// and add least significant byte to product
|
|
value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff);
|
|
|
|
// Convert result to a 13-bit binary string
|
|
bitBuffer.put(value, 13);
|
|
}
|
|
};
|
|
|
|
var kanjiData = KanjiData;
|
|
|
|
var dijkstra_1 = createCommonjsModule(function (module) {
|
|
|
|
/******************************************************************************
|
|
* Created 2008-08-19.
|
|
*
|
|
* Dijkstra path-finding functions. Adapted from the Dijkstar Python project.
|
|
*
|
|
* Copyright (C) 2008
|
|
* Wyatt Baldwin <self@wyattbaldwin.com>
|
|
* All rights reserved
|
|
*
|
|
* Licensed under the MIT license.
|
|
*
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*****************************************************************************/
|
|
var dijkstra = {
|
|
single_source_shortest_paths: function(graph, s, d) {
|
|
// Predecessor map for each node that has been encountered.
|
|
// node ID => predecessor node ID
|
|
var predecessors = {};
|
|
|
|
// Costs of shortest paths from s to all nodes encountered.
|
|
// node ID => cost
|
|
var costs = {};
|
|
costs[s] = 0;
|
|
|
|
// Costs of shortest paths from s to all nodes encountered; differs from
|
|
// `costs` in that it provides easy access to the node that currently has
|
|
// the known shortest path from s.
|
|
// XXX: Do we actually need both `costs` and `open`?
|
|
var open = dijkstra.PriorityQueue.make();
|
|
open.push(s, 0);
|
|
|
|
var closest,
|
|
u, v,
|
|
cost_of_s_to_u,
|
|
adjacent_nodes,
|
|
cost_of_e,
|
|
cost_of_s_to_u_plus_cost_of_e,
|
|
cost_of_s_to_v,
|
|
first_visit;
|
|
while (!open.empty()) {
|
|
// In the nodes remaining in graph that have a known cost from s,
|
|
// find the node, u, that currently has the shortest path from s.
|
|
closest = open.pop();
|
|
u = closest.value;
|
|
cost_of_s_to_u = closest.cost;
|
|
|
|
// Get nodes adjacent to u...
|
|
adjacent_nodes = graph[u] || {};
|
|
|
|
// ...and explore the edges that connect u to those nodes, updating
|
|
// the cost of the shortest paths to any or all of those nodes as
|
|
// necessary. v is the node across the current edge from u.
|
|
for (v in adjacent_nodes) {
|
|
if (adjacent_nodes.hasOwnProperty(v)) {
|
|
// Get the cost of the edge running from u to v.
|
|
cost_of_e = adjacent_nodes[v];
|
|
|
|
// Cost of s to u plus the cost of u to v across e--this is *a*
|
|
// cost from s to v that may or may not be less than the current
|
|
// known cost to v.
|
|
cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;
|
|
|
|
// If we haven't visited v yet OR if the current known cost from s to
|
|
// v is greater than the new cost we just found (cost of s to u plus
|
|
// cost of u to v across e), update v's cost in the cost list and
|
|
// update v's predecessor in the predecessor list (it's now u).
|
|
cost_of_s_to_v = costs[v];
|
|
first_visit = (typeof costs[v] === 'undefined');
|
|
if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {
|
|
costs[v] = cost_of_s_to_u_plus_cost_of_e;
|
|
open.push(v, cost_of_s_to_u_plus_cost_of_e);
|
|
predecessors[v] = u;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {
|
|
var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');
|
|
throw new Error(msg);
|
|
}
|
|
|
|
return predecessors;
|
|
},
|
|
|
|
extract_shortest_path_from_predecessor_list: function(predecessors, d) {
|
|
var nodes = [];
|
|
var u = d;
|
|
while (u) {
|
|
nodes.push(u);
|
|
predecessors[u];
|
|
u = predecessors[u];
|
|
}
|
|
nodes.reverse();
|
|
return nodes;
|
|
},
|
|
|
|
find_path: function(graph, s, d) {
|
|
var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);
|
|
return dijkstra.extract_shortest_path_from_predecessor_list(
|
|
predecessors, d);
|
|
},
|
|
|
|
/**
|
|
* A very naive priority queue implementation.
|
|
*/
|
|
PriorityQueue: {
|
|
make: function (opts) {
|
|
var T = dijkstra.PriorityQueue,
|
|
t = {},
|
|
key;
|
|
opts = opts || {};
|
|
for (key in T) {
|
|
if (T.hasOwnProperty(key)) {
|
|
t[key] = T[key];
|
|
}
|
|
}
|
|
t.queue = [];
|
|
t.sorter = opts.sorter || T.default_sorter;
|
|
return t;
|
|
},
|
|
|
|
default_sorter: function (a, b) {
|
|
return a.cost - b.cost;
|
|
},
|
|
|
|
/**
|
|
* Add a new item to the queue and ensure the highest priority element
|
|
* is at the front of the queue.
|
|
*/
|
|
push: function (value, cost) {
|
|
var item = {value: value, cost: cost};
|
|
this.queue.push(item);
|
|
this.queue.sort(this.sorter);
|
|
},
|
|
|
|
/**
|
|
* Return the highest priority element in the queue.
|
|
*/
|
|
pop: function () {
|
|
return this.queue.shift();
|
|
},
|
|
|
|
empty: function () {
|
|
return this.queue.length === 0;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
// node.js module exports
|
|
{
|
|
module.exports = dijkstra;
|
|
}
|
|
});
|
|
|
|
var segments = createCommonjsModule(function (module, exports) {
|
|
/**
|
|
* Returns UTF8 byte length
|
|
*
|
|
* @param {String} str Input string
|
|
* @return {Number} Number of byte
|
|
*/
|
|
function getStringByteLength (str) {
|
|
return unescape(encodeURIComponent(str)).length
|
|
}
|
|
|
|
/**
|
|
* Get a list of segments of the specified mode
|
|
* from a string
|
|
*
|
|
* @param {Mode} mode Segment mode
|
|
* @param {String} str String to process
|
|
* @return {Array} Array of object with segments data
|
|
*/
|
|
function getSegments (regex, mode, str) {
|
|
const segments = [];
|
|
let result;
|
|
|
|
while ((result = regex.exec(str)) !== null) {
|
|
segments.push({
|
|
data: result[0],
|
|
index: result.index,
|
|
mode: mode,
|
|
length: result[0].length
|
|
});
|
|
}
|
|
|
|
return segments
|
|
}
|
|
|
|
/**
|
|
* Extracts a series of segments with the appropriate
|
|
* modes from a string
|
|
*
|
|
* @param {String} dataStr Input string
|
|
* @return {Array} Array of object with segments data
|
|
*/
|
|
function getSegmentsFromString (dataStr) {
|
|
const numSegs = getSegments(regex.NUMERIC, mode.NUMERIC, dataStr);
|
|
const alphaNumSegs = getSegments(regex.ALPHANUMERIC, mode.ALPHANUMERIC, dataStr);
|
|
let byteSegs;
|
|
let kanjiSegs;
|
|
|
|
if (utils$1.isKanjiModeEnabled()) {
|
|
byteSegs = getSegments(regex.BYTE, mode.BYTE, dataStr);
|
|
kanjiSegs = getSegments(regex.KANJI, mode.KANJI, dataStr);
|
|
} else {
|
|
byteSegs = getSegments(regex.BYTE_KANJI, mode.BYTE, dataStr);
|
|
kanjiSegs = [];
|
|
}
|
|
|
|
const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs);
|
|
|
|
return segs
|
|
.sort(function (s1, s2) {
|
|
return s1.index - s2.index
|
|
})
|
|
.map(function (obj) {
|
|
return {
|
|
data: obj.data,
|
|
mode: obj.mode,
|
|
length: obj.length
|
|
}
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Returns how many bits are needed to encode a string of
|
|
* specified length with the specified mode
|
|
*
|
|
* @param {Number} length String length
|
|
* @param {Mode} mode Segment mode
|
|
* @return {Number} Bit length
|
|
*/
|
|
function getSegmentBitsLength (length, mode$1) {
|
|
switch (mode$1) {
|
|
case mode.NUMERIC:
|
|
return numericData.getBitsLength(length)
|
|
case mode.ALPHANUMERIC:
|
|
return alphanumericData.getBitsLength(length)
|
|
case mode.KANJI:
|
|
return kanjiData.getBitsLength(length)
|
|
case mode.BYTE:
|
|
return byteData.getBitsLength(length)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Merges adjacent segments which have the same mode
|
|
*
|
|
* @param {Array} segs Array of object with segments data
|
|
* @return {Array} Array of object with segments data
|
|
*/
|
|
function mergeSegments (segs) {
|
|
return segs.reduce(function (acc, curr) {
|
|
const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null;
|
|
if (prevSeg && prevSeg.mode === curr.mode) {
|
|
acc[acc.length - 1].data += curr.data;
|
|
return acc
|
|
}
|
|
|
|
acc.push(curr);
|
|
return acc
|
|
}, [])
|
|
}
|
|
|
|
/**
|
|
* Generates a list of all possible nodes combination which
|
|
* will be used to build a segments graph.
|
|
*
|
|
* Nodes are divided by groups. Each group will contain a list of all the modes
|
|
* in which is possible to encode the given text.
|
|
*
|
|
* For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.
|
|
* The group for '12345' will contain then 3 objects, one for each
|
|
* possible encoding mode.
|
|
*
|
|
* Each node represents a possible segment.
|
|
*
|
|
* @param {Array} segs Array of object with segments data
|
|
* @return {Array} Array of object with segments data
|
|
*/
|
|
function buildNodes (segs) {
|
|
const nodes = [];
|
|
for (let i = 0; i < segs.length; i++) {
|
|
const seg = segs[i];
|
|
|
|
switch (seg.mode) {
|
|
case mode.NUMERIC:
|
|
nodes.push([seg,
|
|
{ data: seg.data, mode: mode.ALPHANUMERIC, length: seg.length },
|
|
{ data: seg.data, mode: mode.BYTE, length: seg.length }
|
|
]);
|
|
break
|
|
case mode.ALPHANUMERIC:
|
|
nodes.push([seg,
|
|
{ data: seg.data, mode: mode.BYTE, length: seg.length }
|
|
]);
|
|
break
|
|
case mode.KANJI:
|
|
nodes.push([seg,
|
|
{ data: seg.data, mode: mode.BYTE, length: getStringByteLength(seg.data) }
|
|
]);
|
|
break
|
|
case mode.BYTE:
|
|
nodes.push([
|
|
{ data: seg.data, mode: mode.BYTE, length: getStringByteLength(seg.data) }
|
|
]);
|
|
}
|
|
}
|
|
|
|
return nodes
|
|
}
|
|
|
|
/**
|
|
* Builds a graph from a list of nodes.
|
|
* All segments in each node group will be connected with all the segments of
|
|
* the next group and so on.
|
|
*
|
|
* At each connection will be assigned a weight depending on the
|
|
* segment's byte length.
|
|
*
|
|
* @param {Array} nodes Array of object with segments data
|
|
* @param {Number} version QR Code version
|
|
* @return {Object} Graph of all possible segments
|
|
*/
|
|
function buildGraph (nodes, version) {
|
|
const table = {};
|
|
const graph = { start: {} };
|
|
let prevNodeIds = ['start'];
|
|
|
|
for (let i = 0; i < nodes.length; i++) {
|
|
const nodeGroup = nodes[i];
|
|
const currentNodeIds = [];
|
|
|
|
for (let j = 0; j < nodeGroup.length; j++) {
|
|
const node = nodeGroup[j];
|
|
const key = '' + i + j;
|
|
|
|
currentNodeIds.push(key);
|
|
table[key] = { node: node, lastCount: 0 };
|
|
graph[key] = {};
|
|
|
|
for (let n = 0; n < prevNodeIds.length; n++) {
|
|
const prevNodeId = prevNodeIds[n];
|
|
|
|
if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {
|
|
graph[prevNodeId][key] =
|
|
getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -
|
|
getSegmentBitsLength(table[prevNodeId].lastCount, node.mode);
|
|
|
|
table[prevNodeId].lastCount += node.length;
|
|
} else {
|
|
if (table[prevNodeId]) table[prevNodeId].lastCount = node.length;
|
|
|
|
graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +
|
|
4 + mode.getCharCountIndicator(node.mode, version); // switch cost
|
|
}
|
|
}
|
|
}
|
|
|
|
prevNodeIds = currentNodeIds;
|
|
}
|
|
|
|
for (let n = 0; n < prevNodeIds.length; n++) {
|
|
graph[prevNodeIds[n]].end = 0;
|
|
}
|
|
|
|
return { map: graph, table: table }
|
|
}
|
|
|
|
/**
|
|
* Builds a segment from a specified data and mode.
|
|
* If a mode is not specified, the more suitable will be used.
|
|
*
|
|
* @param {String} data Input data
|
|
* @param {Mode | String} modesHint Data mode
|
|
* @return {Segment} Segment
|
|
*/
|
|
function buildSingleSegment (data, modesHint) {
|
|
let mode$1;
|
|
const bestMode = mode.getBestModeForData(data);
|
|
|
|
mode$1 = mode.from(modesHint, bestMode);
|
|
|
|
// Make sure data can be encoded
|
|
if (mode$1 !== mode.BYTE && mode$1.bit < bestMode.bit) {
|
|
throw new Error('"' + data + '"' +
|
|
' cannot be encoded with mode ' + mode.toString(mode$1) +
|
|
'.\n Suggested mode is: ' + mode.toString(bestMode))
|
|
}
|
|
|
|
// Use Mode.BYTE if Kanji support is disabled
|
|
if (mode$1 === mode.KANJI && !utils$1.isKanjiModeEnabled()) {
|
|
mode$1 = mode.BYTE;
|
|
}
|
|
|
|
switch (mode$1) {
|
|
case mode.NUMERIC:
|
|
return new numericData(data)
|
|
|
|
case mode.ALPHANUMERIC:
|
|
return new alphanumericData(data)
|
|
|
|
case mode.KANJI:
|
|
return new kanjiData(data)
|
|
|
|
case mode.BYTE:
|
|
return new byteData(data)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Builds a list of segments from an array.
|
|
* Array can contain Strings or Objects with segment's info.
|
|
*
|
|
* For each item which is a string, will be generated a segment with the given
|
|
* string and the more appropriate encoding mode.
|
|
*
|
|
* For each item which is an object, will be generated a segment with the given
|
|
* data and mode.
|
|
* Objects must contain at least the property "data".
|
|
* If property "mode" is not present, the more suitable mode will be used.
|
|
*
|
|
* @param {Array} array Array of objects with segments data
|
|
* @return {Array} Array of Segments
|
|
*/
|
|
exports.fromArray = function fromArray (array) {
|
|
return array.reduce(function (acc, seg) {
|
|
if (typeof seg === 'string') {
|
|
acc.push(buildSingleSegment(seg, null));
|
|
} else if (seg.data) {
|
|
acc.push(buildSingleSegment(seg.data, seg.mode));
|
|
}
|
|
|
|
return acc
|
|
}, [])
|
|
};
|
|
|
|
/**
|
|
* Builds an optimized sequence of segments from a string,
|
|
* which will produce the shortest possible bitstream.
|
|
*
|
|
* @param {String} data Input string
|
|
* @param {Number} version QR Code version
|
|
* @return {Array} Array of segments
|
|
*/
|
|
exports.fromString = function fromString (data, version) {
|
|
const segs = getSegmentsFromString(data);
|
|
|
|
const nodes = buildNodes(segs);
|
|
const graph = buildGraph(nodes, version);
|
|
const path = dijkstra_1.find_path(graph.map, 'start', 'end');
|
|
|
|
const optimizedSegs = [];
|
|
for (let i = 1; i < path.length - 1; i++) {
|
|
optimizedSegs.push(graph.table[path[i]].node);
|
|
}
|
|
|
|
return exports.fromArray(mergeSegments(optimizedSegs))
|
|
};
|
|
|
|
/**
|
|
* Splits a string in various segments with the modes which
|
|
* best represent their content.
|
|
* The produced segments are far from being optimized.
|
|
* The output of this function is only used to estimate a QR Code version
|
|
* which may contain the data.
|
|
*
|
|
* @param {string} data Input string
|
|
* @return {Array} Array of segments
|
|
*/
|
|
exports.rawSplit = function rawSplit (data) {
|
|
return exports.fromArray(
|
|
getSegmentsFromString(data)
|
|
)
|
|
};
|
|
});
|
|
|
|
/**
|
|
* QRCode for JavaScript
|
|
*
|
|
* modified by Ryan Day for nodejs support
|
|
* Copyright (c) 2011 Ryan Day
|
|
*
|
|
* Licensed under the MIT license:
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
*
|
|
//---------------------------------------------------------------------
|
|
// QRCode for JavaScript
|
|
//
|
|
// Copyright (c) 2009 Kazuhiko Arase
|
|
//
|
|
// URL: http://www.d-project.com/
|
|
//
|
|
// Licensed under the MIT license:
|
|
// http://www.opensource.org/licenses/mit-license.php
|
|
//
|
|
// The word "QR Code" is registered trademark of
|
|
// DENSO WAVE INCORPORATED
|
|
// http://www.denso-wave.com/qrcode/faqpatent-e.html
|
|
//
|
|
//---------------------------------------------------------------------
|
|
*/
|
|
|
|
/**
|
|
* Add finder patterns bits to matrix
|
|
*
|
|
* @param {BitMatrix} matrix Modules matrix
|
|
* @param {Number} version QR Code version
|
|
*/
|
|
function setupFinderPattern (matrix, version) {
|
|
const size = matrix.size;
|
|
const pos = finderPattern.getPositions(version);
|
|
|
|
for (let i = 0; i < pos.length; i++) {
|
|
const row = pos[i][0];
|
|
const col = pos[i][1];
|
|
|
|
for (let r = -1; r <= 7; r++) {
|
|
if (row + r <= -1 || size <= row + r) continue
|
|
|
|
for (let c = -1; c <= 7; c++) {
|
|
if (col + c <= -1 || size <= col + c) continue
|
|
|
|
if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||
|
|
(c >= 0 && c <= 6 && (r === 0 || r === 6)) ||
|
|
(r >= 2 && r <= 4 && c >= 2 && c <= 4)) {
|
|
matrix.set(row + r, col + c, true, true);
|
|
} else {
|
|
matrix.set(row + r, col + c, false, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add timing pattern bits to matrix
|
|
*
|
|
* Note: this function must be called before {@link setupAlignmentPattern}
|
|
*
|
|
* @param {BitMatrix} matrix Modules matrix
|
|
*/
|
|
function setupTimingPattern (matrix) {
|
|
const size = matrix.size;
|
|
|
|
for (let r = 8; r < size - 8; r++) {
|
|
const value = r % 2 === 0;
|
|
matrix.set(r, 6, value, true);
|
|
matrix.set(6, r, value, true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add alignment patterns bits to matrix
|
|
*
|
|
* Note: this function must be called after {@link setupTimingPattern}
|
|
*
|
|
* @param {BitMatrix} matrix Modules matrix
|
|
* @param {Number} version QR Code version
|
|
*/
|
|
function setupAlignmentPattern (matrix, version) {
|
|
const pos = alignmentPattern.getPositions(version);
|
|
|
|
for (let i = 0; i < pos.length; i++) {
|
|
const row = pos[i][0];
|
|
const col = pos[i][1];
|
|
|
|
for (let r = -2; r <= 2; r++) {
|
|
for (let c = -2; c <= 2; c++) {
|
|
if (r === -2 || r === 2 || c === -2 || c === 2 ||
|
|
(r === 0 && c === 0)) {
|
|
matrix.set(row + r, col + c, true, true);
|
|
} else {
|
|
matrix.set(row + r, col + c, false, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add version info bits to matrix
|
|
*
|
|
* @param {BitMatrix} matrix Modules matrix
|
|
* @param {Number} version QR Code version
|
|
*/
|
|
function setupVersionInfo (matrix, version$1) {
|
|
const size = matrix.size;
|
|
const bits = version.getEncodedBits(version$1);
|
|
let row, col, mod;
|
|
|
|
for (let i = 0; i < 18; i++) {
|
|
row = Math.floor(i / 3);
|
|
col = i % 3 + size - 8 - 3;
|
|
mod = ((bits >> i) & 1) === 1;
|
|
|
|
matrix.set(row, col, mod, true);
|
|
matrix.set(col, row, mod, true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add format info bits to matrix
|
|
*
|
|
* @param {BitMatrix} matrix Modules matrix
|
|
* @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level
|
|
* @param {Number} maskPattern Mask pattern reference value
|
|
*/
|
|
function setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {
|
|
const size = matrix.size;
|
|
const bits = formatInfo.getEncodedBits(errorCorrectionLevel, maskPattern);
|
|
let i, mod;
|
|
|
|
for (i = 0; i < 15; i++) {
|
|
mod = ((bits >> i) & 1) === 1;
|
|
|
|
// vertical
|
|
if (i < 6) {
|
|
matrix.set(i, 8, mod, true);
|
|
} else if (i < 8) {
|
|
matrix.set(i + 1, 8, mod, true);
|
|
} else {
|
|
matrix.set(size - 15 + i, 8, mod, true);
|
|
}
|
|
|
|
// horizontal
|
|
if (i < 8) {
|
|
matrix.set(8, size - i - 1, mod, true);
|
|
} else if (i < 9) {
|
|
matrix.set(8, 15 - i - 1 + 1, mod, true);
|
|
} else {
|
|
matrix.set(8, 15 - i - 1, mod, true);
|
|
}
|
|
}
|
|
|
|
// fixed module
|
|
matrix.set(size - 8, 8, 1, true);
|
|
}
|
|
|
|
/**
|
|
* Add encoded data bits to matrix
|
|
*
|
|
* @param {BitMatrix} matrix Modules matrix
|
|
* @param {Uint8Array} data Data codewords
|
|
*/
|
|
function setupData (matrix, data) {
|
|
const size = matrix.size;
|
|
let inc = -1;
|
|
let row = size - 1;
|
|
let bitIndex = 7;
|
|
let byteIndex = 0;
|
|
|
|
for (let col = size - 1; col > 0; col -= 2) {
|
|
if (col === 6) col--;
|
|
|
|
while (true) {
|
|
for (let c = 0; c < 2; c++) {
|
|
if (!matrix.isReserved(row, col - c)) {
|
|
let dark = false;
|
|
|
|
if (byteIndex < data.length) {
|
|
dark = (((data[byteIndex] >>> bitIndex) & 1) === 1);
|
|
}
|
|
|
|
matrix.set(row, col - c, dark);
|
|
bitIndex--;
|
|
|
|
if (bitIndex === -1) {
|
|
byteIndex++;
|
|
bitIndex = 7;
|
|
}
|
|
}
|
|
}
|
|
|
|
row += inc;
|
|
|
|
if (row < 0 || size <= row) {
|
|
row -= inc;
|
|
inc = -inc;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create encoded codewords from data input
|
|
*
|
|
* @param {Number} version QR Code version
|
|
* @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level
|
|
* @param {ByteData} data Data input
|
|
* @return {Uint8Array} Buffer containing encoded codewords
|
|
*/
|
|
function createData (version, errorCorrectionLevel, segments) {
|
|
// Prepare data buffer
|
|
const buffer = new bitBuffer();
|
|
|
|
segments.forEach(function (data) {
|
|
// prefix data with mode indicator (4 bits)
|
|
buffer.put(data.mode.bit, 4);
|
|
|
|
// Prefix data with character count indicator.
|
|
// The character count indicator is a string of bits that represents the
|
|
// number of characters that are being encoded.
|
|
// The character count indicator must be placed after the mode indicator
|
|
// and must be a certain number of bits long, depending on the QR version
|
|
// and data mode
|
|
// @see {@link Mode.getCharCountIndicator}.
|
|
buffer.put(data.getLength(), mode.getCharCountIndicator(data.mode, version));
|
|
|
|
// add binary data sequence to buffer
|
|
data.write(buffer);
|
|
});
|
|
|
|
// Calculate required number of bits
|
|
const totalCodewords = utils$1.getSymbolTotalCodewords(version);
|
|
const ecTotalCodewords = errorCorrectionCode.getTotalCodewordsCount(version, errorCorrectionLevel);
|
|
const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8;
|
|
|
|
// Add a terminator.
|
|
// If the bit string is shorter than the total number of required bits,
|
|
// a terminator of up to four 0s must be added to the right side of the string.
|
|
// If the bit string is more than four bits shorter than the required number of bits,
|
|
// add four 0s to the end.
|
|
if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {
|
|
buffer.put(0, 4);
|
|
}
|
|
|
|
// If the bit string is fewer than four bits shorter, add only the number of 0s that
|
|
// are needed to reach the required number of bits.
|
|
|
|
// After adding the terminator, if the number of bits in the string is not a multiple of 8,
|
|
// pad the string on the right with 0s to make the string's length a multiple of 8.
|
|
while (buffer.getLengthInBits() % 8 !== 0) {
|
|
buffer.putBit(0);
|
|
}
|
|
|
|
// Add pad bytes if the string is still shorter than the total number of required bits.
|
|
// Extend the buffer to fill the data capacity of the symbol corresponding to
|
|
// the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)
|
|
// and 00010001 (0x11) alternately.
|
|
const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8;
|
|
for (let i = 0; i < remainingByte; i++) {
|
|
buffer.put(i % 2 ? 0x11 : 0xEC, 8);
|
|
}
|
|
|
|
return createCodewords(buffer, version, errorCorrectionLevel)
|
|
}
|
|
|
|
/**
|
|
* Encode input data with Reed-Solomon and return codewords with
|
|
* relative error correction bits
|
|
*
|
|
* @param {BitBuffer} bitBuffer Data to encode
|
|
* @param {Number} version QR Code version
|
|
* @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level
|
|
* @return {Uint8Array} Buffer containing encoded codewords
|
|
*/
|
|
function createCodewords (bitBuffer, version, errorCorrectionLevel) {
|
|
// Total codewords for this QR code version (Data + Error correction)
|
|
const totalCodewords = utils$1.getSymbolTotalCodewords(version);
|
|
|
|
// Total number of error correction codewords
|
|
const ecTotalCodewords = errorCorrectionCode.getTotalCodewordsCount(version, errorCorrectionLevel);
|
|
|
|
// Total number of data codewords
|
|
const dataTotalCodewords = totalCodewords - ecTotalCodewords;
|
|
|
|
// Total number of blocks
|
|
const ecTotalBlocks = errorCorrectionCode.getBlocksCount(version, errorCorrectionLevel);
|
|
|
|
// Calculate how many blocks each group should contain
|
|
const blocksInGroup2 = totalCodewords % ecTotalBlocks;
|
|
const blocksInGroup1 = ecTotalBlocks - blocksInGroup2;
|
|
|
|
const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks);
|
|
|
|
const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks);
|
|
const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1;
|
|
|
|
// Number of EC codewords is the same for both groups
|
|
const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1;
|
|
|
|
// Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount
|
|
const rs = new reedSolomonEncoder(ecCount);
|
|
|
|
let offset = 0;
|
|
const dcData = new Array(ecTotalBlocks);
|
|
const ecData = new Array(ecTotalBlocks);
|
|
let maxDataSize = 0;
|
|
const buffer = new Uint8Array(bitBuffer.buffer);
|
|
|
|
// Divide the buffer into the required number of blocks
|
|
for (let b = 0; b < ecTotalBlocks; b++) {
|
|
const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2;
|
|
|
|
// extract a block of data from buffer
|
|
dcData[b] = buffer.slice(offset, offset + dataSize);
|
|
|
|
// Calculate EC codewords for this data block
|
|
ecData[b] = rs.encode(dcData[b]);
|
|
|
|
offset += dataSize;
|
|
maxDataSize = Math.max(maxDataSize, dataSize);
|
|
}
|
|
|
|
// Create final data
|
|
// Interleave the data and error correction codewords from each block
|
|
const data = new Uint8Array(totalCodewords);
|
|
let index = 0;
|
|
let i, r;
|
|
|
|
// Add data codewords
|
|
for (i = 0; i < maxDataSize; i++) {
|
|
for (r = 0; r < ecTotalBlocks; r++) {
|
|
if (i < dcData[r].length) {
|
|
data[index++] = dcData[r][i];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Apped EC codewords
|
|
for (i = 0; i < ecCount; i++) {
|
|
for (r = 0; r < ecTotalBlocks; r++) {
|
|
data[index++] = ecData[r][i];
|
|
}
|
|
}
|
|
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Build QR Code symbol
|
|
*
|
|
* @param {String} data Input string
|
|
* @param {Number} version QR Code version
|
|
* @param {ErrorCorretionLevel} errorCorrectionLevel Error level
|
|
* @param {MaskPattern} maskPattern Mask pattern
|
|
* @return {Object} Object containing symbol data
|
|
*/
|
|
function createSymbol (data, version$1, errorCorrectionLevel, maskPattern$1) {
|
|
let segments$1;
|
|
|
|
if (Array.isArray(data)) {
|
|
segments$1 = segments.fromArray(data);
|
|
} else if (typeof data === 'string') {
|
|
let estimatedVersion = version$1;
|
|
|
|
if (!estimatedVersion) {
|
|
const rawSegments = segments.rawSplit(data);
|
|
|
|
// Estimate best version that can contain raw splitted segments
|
|
estimatedVersion = version.getBestVersionForData(rawSegments, errorCorrectionLevel);
|
|
}
|
|
|
|
// Build optimized segments
|
|
// If estimated version is undefined, try with the highest version
|
|
segments$1 = segments.fromString(data, estimatedVersion || 40);
|
|
} else {
|
|
throw new Error('Invalid data')
|
|
}
|
|
|
|
// Get the min version that can contain data
|
|
const bestVersion = version.getBestVersionForData(segments$1, errorCorrectionLevel);
|
|
|
|
// If no version is found, data cannot be stored
|
|
if (!bestVersion) {
|
|
throw new Error('The amount of data is too big to be stored in a QR Code')
|
|
}
|
|
|
|
// If not specified, use min version as default
|
|
if (!version$1) {
|
|
version$1 = bestVersion;
|
|
|
|
// Check if the specified version can contain the data
|
|
} else if (version$1 < bestVersion) {
|
|
throw new Error('\n' +
|
|
'The chosen QR Code version cannot contain this amount of data.\n' +
|
|
'Minimum version required to store current data is: ' + bestVersion + '.\n'
|
|
)
|
|
}
|
|
|
|
const dataBits = createData(version$1, errorCorrectionLevel, segments$1);
|
|
|
|
// Allocate matrix buffer
|
|
const moduleCount = utils$1.getSymbolSize(version$1);
|
|
const modules = new bitMatrix(moduleCount);
|
|
|
|
// Add function modules
|
|
setupFinderPattern(modules, version$1);
|
|
setupTimingPattern(modules);
|
|
setupAlignmentPattern(modules, version$1);
|
|
|
|
// Add temporary dummy bits for format info just to set them as reserved.
|
|
// This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}
|
|
// since the masking operation must be performed only on the encoding region.
|
|
// These blocks will be replaced with correct values later in code.
|
|
setupFormatInfo(modules, errorCorrectionLevel, 0);
|
|
|
|
if (version$1 >= 7) {
|
|
setupVersionInfo(modules, version$1);
|
|
}
|
|
|
|
// Add data codewords
|
|
setupData(modules, dataBits);
|
|
|
|
if (isNaN(maskPattern$1)) {
|
|
// Find best mask pattern
|
|
maskPattern$1 = maskPattern.getBestMask(modules,
|
|
setupFormatInfo.bind(null, modules, errorCorrectionLevel));
|
|
}
|
|
|
|
// Apply mask pattern
|
|
maskPattern.applyMask(maskPattern$1, modules);
|
|
|
|
// Replace format info bits with correct values
|
|
setupFormatInfo(modules, errorCorrectionLevel, maskPattern$1);
|
|
|
|
return {
|
|
modules: modules,
|
|
version: version$1,
|
|
errorCorrectionLevel: errorCorrectionLevel,
|
|
maskPattern: maskPattern$1,
|
|
segments: segments$1
|
|
}
|
|
}
|
|
|
|
/**
|
|
* QR Code
|
|
*
|
|
* @param {String | Array} data Input data
|
|
* @param {Object} options Optional configurations
|
|
* @param {Number} options.version QR Code version
|
|
* @param {String} options.errorCorrectionLevel Error correction level
|
|
* @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis
|
|
*/
|
|
var create = function create (data, options) {
|
|
if (typeof data === 'undefined' || data === '') {
|
|
throw new Error('No input text')
|
|
}
|
|
|
|
let errorCorrectionLevel$1 = errorCorrectionLevel.M;
|
|
let version$1;
|
|
let mask;
|
|
|
|
if (typeof options !== 'undefined') {
|
|
// Use higher error correction level as default
|
|
errorCorrectionLevel$1 = errorCorrectionLevel.from(options.errorCorrectionLevel, errorCorrectionLevel.M);
|
|
version$1 = version.from(options.version);
|
|
mask = maskPattern.from(options.maskPattern);
|
|
|
|
if (options.toSJISFunc) {
|
|
utils$1.setToSJISFunction(options.toSJISFunc);
|
|
}
|
|
}
|
|
|
|
return createSymbol(data, version$1, errorCorrectionLevel$1, mask)
|
|
};
|
|
|
|
var qrcode = {
|
|
create: create
|
|
};
|
|
|
|
var utils = createCommonjsModule(function (module, exports) {
|
|
function hex2rgba (hex) {
|
|
if (typeof hex === 'number') {
|
|
hex = hex.toString();
|
|
}
|
|
|
|
if (typeof hex !== 'string') {
|
|
throw new Error('Color should be defined as hex string')
|
|
}
|
|
|
|
let hexCode = hex.slice().replace('#', '').split('');
|
|
if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {
|
|
throw new Error('Invalid hex color: ' + hex)
|
|
}
|
|
|
|
// Convert from short to long form (fff -> ffffff)
|
|
if (hexCode.length === 3 || hexCode.length === 4) {
|
|
hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {
|
|
return [c, c]
|
|
}));
|
|
}
|
|
|
|
// Add default alpha value
|
|
if (hexCode.length === 6) hexCode.push('F', 'F');
|
|
|
|
const hexValue = parseInt(hexCode.join(''), 16);
|
|
|
|
return {
|
|
r: (hexValue >> 24) & 255,
|
|
g: (hexValue >> 16) & 255,
|
|
b: (hexValue >> 8) & 255,
|
|
a: hexValue & 255,
|
|
hex: '#' + hexCode.slice(0, 6).join('')
|
|
}
|
|
}
|
|
|
|
exports.getOptions = function getOptions (options) {
|
|
if (!options) options = {};
|
|
if (!options.color) options.color = {};
|
|
|
|
const margin = typeof options.margin === 'undefined' ||
|
|
options.margin === null ||
|
|
options.margin < 0
|
|
? 4
|
|
: options.margin;
|
|
|
|
const width = options.width && options.width >= 21 ? options.width : undefined;
|
|
const scale = options.scale || 4;
|
|
|
|
return {
|
|
width: width,
|
|
scale: width ? 4 : scale,
|
|
margin: margin,
|
|
color: {
|
|
dark: hex2rgba(options.color.dark || '#000000ff'),
|
|
light: hex2rgba(options.color.light || '#ffffffff')
|
|
},
|
|
type: options.type,
|
|
rendererOpts: options.rendererOpts || {}
|
|
}
|
|
};
|
|
|
|
exports.getScale = function getScale (qrSize, opts) {
|
|
return opts.width && opts.width >= qrSize + opts.margin * 2
|
|
? opts.width / (qrSize + opts.margin * 2)
|
|
: opts.scale
|
|
};
|
|
|
|
exports.getImageWidth = function getImageWidth (qrSize, opts) {
|
|
const scale = exports.getScale(qrSize, opts);
|
|
return Math.floor((qrSize + opts.margin * 2) * scale)
|
|
};
|
|
|
|
exports.qrToImageData = function qrToImageData (imgData, qr, opts) {
|
|
const size = qr.modules.size;
|
|
const data = qr.modules.data;
|
|
const scale = exports.getScale(size, opts);
|
|
const symbolSize = Math.floor((size + opts.margin * 2) * scale);
|
|
const scaledMargin = opts.margin * scale;
|
|
const palette = [opts.color.light, opts.color.dark];
|
|
|
|
for (let i = 0; i < symbolSize; i++) {
|
|
for (let j = 0; j < symbolSize; j++) {
|
|
let posDst = (i * symbolSize + j) * 4;
|
|
let pxColor = opts.color.light;
|
|
|
|
if (i >= scaledMargin && j >= scaledMargin &&
|
|
i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {
|
|
const iSrc = Math.floor((i - scaledMargin) / scale);
|
|
const jSrc = Math.floor((j - scaledMargin) / scale);
|
|
pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0];
|
|
}
|
|
|
|
imgData[posDst++] = pxColor.r;
|
|
imgData[posDst++] = pxColor.g;
|
|
imgData[posDst++] = pxColor.b;
|
|
imgData[posDst] = pxColor.a;
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
var canvas = createCommonjsModule(function (module, exports) {
|
|
function clearCanvas (ctx, canvas, size) {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
|
|
if (!canvas.style) canvas.style = {};
|
|
canvas.height = size;
|
|
canvas.width = size;
|
|
canvas.style.height = size + 'px';
|
|
canvas.style.width = size + 'px';
|
|
}
|
|
|
|
function getCanvasElement () {
|
|
try {
|
|
return document.createElement('canvas')
|
|
} catch (e) {
|
|
throw new Error('You need to specify a canvas element')
|
|
}
|
|
}
|
|
|
|
exports.render = function render (qrData, canvas, options) {
|
|
let opts = options;
|
|
let canvasEl = canvas;
|
|
|
|
if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {
|
|
opts = canvas;
|
|
canvas = undefined;
|
|
}
|
|
|
|
if (!canvas) {
|
|
canvasEl = getCanvasElement();
|
|
}
|
|
|
|
opts = utils.getOptions(opts);
|
|
const size = utils.getImageWidth(qrData.modules.size, opts);
|
|
|
|
const ctx = canvasEl.getContext('2d');
|
|
const image = ctx.createImageData(size, size);
|
|
utils.qrToImageData(image.data, qrData, opts);
|
|
|
|
clearCanvas(ctx, canvasEl, size);
|
|
ctx.putImageData(image, 0, 0);
|
|
|
|
return canvasEl
|
|
};
|
|
|
|
exports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {
|
|
let opts = options;
|
|
|
|
if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {
|
|
opts = canvas;
|
|
canvas = undefined;
|
|
}
|
|
|
|
if (!opts) opts = {};
|
|
|
|
const canvasEl = exports.render(qrData, canvas, opts);
|
|
|
|
const type = opts.type || 'image/png';
|
|
const rendererOpts = opts.rendererOpts || {};
|
|
|
|
return canvasEl.toDataURL(type, rendererOpts.quality)
|
|
};
|
|
});
|
|
|
|
function getColorAttrib (color, attrib) {
|
|
const alpha = color.a / 255;
|
|
const str = attrib + '="' + color.hex + '"';
|
|
|
|
return alpha < 1
|
|
? str + ' ' + attrib + '-opacity="' + alpha.toFixed(2).slice(1) + '"'
|
|
: str
|
|
}
|
|
|
|
function svgCmd (cmd, x, y) {
|
|
let str = cmd + x;
|
|
if (typeof y !== 'undefined') str += ' ' + y;
|
|
|
|
return str
|
|
}
|
|
|
|
function qrToPath (data, size, margin) {
|
|
let path = '';
|
|
let moveBy = 0;
|
|
let newRow = false;
|
|
let lineLength = 0;
|
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
const col = Math.floor(i % size);
|
|
const row = Math.floor(i / size);
|
|
|
|
if (!col && !newRow) newRow = true;
|
|
|
|
if (data[i]) {
|
|
lineLength++;
|
|
|
|
if (!(i > 0 && col > 0 && data[i - 1])) {
|
|
path += newRow
|
|
? svgCmd('M', col + margin, 0.5 + row + margin)
|
|
: svgCmd('m', moveBy, 0);
|
|
|
|
moveBy = 0;
|
|
newRow = false;
|
|
}
|
|
|
|
if (!(col + 1 < size && data[i + 1])) {
|
|
path += svgCmd('h', lineLength);
|
|
lineLength = 0;
|
|
}
|
|
} else {
|
|
moveBy++;
|
|
}
|
|
}
|
|
|
|
return path
|
|
}
|
|
|
|
var render = function render (qrData, options, cb) {
|
|
const opts = utils.getOptions(options);
|
|
const size = qrData.modules.size;
|
|
const data = qrData.modules.data;
|
|
const qrcodesize = size + opts.margin * 2;
|
|
|
|
const bg = !opts.color.light.a
|
|
? ''
|
|
: '<path ' + getColorAttrib(opts.color.light, 'fill') +
|
|
' d="M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z"/>';
|
|
|
|
const path =
|
|
'<path ' + getColorAttrib(opts.color.dark, 'stroke') +
|
|
' d="' + qrToPath(data, size, opts.margin) + '"/>';
|
|
|
|
const viewBox = 'viewBox="' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '"';
|
|
|
|
const width = !opts.width ? '' : 'width="' + opts.width + '" height="' + opts.width + '" ';
|
|
|
|
const svgTag = '<svg xmlns="http://www.w3.org/2000/svg" ' + width + viewBox + ' shape-rendering="crispEdges">' + bg + path + '</svg>\n';
|
|
|
|
if (typeof cb === 'function') {
|
|
cb(null, svgTag);
|
|
}
|
|
|
|
return svgTag
|
|
};
|
|
|
|
var svgTag = {
|
|
render: render
|
|
};
|
|
|
|
function renderCanvas (renderFunc, canvas, text, opts, cb) {
|
|
const args = [].slice.call(arguments, 1);
|
|
const argsNum = args.length;
|
|
const isLastArgCb = typeof args[argsNum - 1] === 'function';
|
|
|
|
if (!isLastArgCb && !canPromise()) {
|
|
throw new Error('Callback required as last argument')
|
|
}
|
|
|
|
if (isLastArgCb) {
|
|
if (argsNum < 2) {
|
|
throw new Error('Too few arguments provided')
|
|
}
|
|
|
|
if (argsNum === 2) {
|
|
cb = text;
|
|
text = canvas;
|
|
canvas = opts = undefined;
|
|
} else if (argsNum === 3) {
|
|
if (canvas.getContext && typeof cb === 'undefined') {
|
|
cb = opts;
|
|
opts = undefined;
|
|
} else {
|
|
cb = opts;
|
|
opts = text;
|
|
text = canvas;
|
|
canvas = undefined;
|
|
}
|
|
}
|
|
} else {
|
|
if (argsNum < 1) {
|
|
throw new Error('Too few arguments provided')
|
|
}
|
|
|
|
if (argsNum === 1) {
|
|
text = canvas;
|
|
canvas = opts = undefined;
|
|
} else if (argsNum === 2 && !canvas.getContext) {
|
|
opts = text;
|
|
text = canvas;
|
|
canvas = undefined;
|
|
}
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
try {
|
|
const data = qrcode.create(text, opts);
|
|
resolve(renderFunc(data, canvas, opts));
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
})
|
|
}
|
|
|
|
try {
|
|
const data = qrcode.create(text, opts);
|
|
cb(null, renderFunc(data, canvas, opts));
|
|
} catch (e) {
|
|
cb(e);
|
|
}
|
|
}
|
|
var toCanvas = renderCanvas.bind(null, canvas.render);
|
|
renderCanvas.bind(null, canvas.renderToDataURL);
|
|
|
|
// only svg for now.
|
|
renderCanvas.bind(null, function (data, _, opts) {
|
|
return svgTag.render(data, opts)
|
|
});
|
|
|
|
class QrCodePlugin extends obsidian.Plugin {
|
|
constructor() {
|
|
super(...arguments);
|
|
/**
|
|
* Function for processing Content-only QR code blocks
|
|
*/
|
|
this.postprocessorRaw = (content, el, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
const destination = document.createElement('canvas');
|
|
if (content.endsWith("\n")) {
|
|
// Obsidian gives an unpretty linebreak at the end. Don't encode it in our QR Code!
|
|
content = content.substring(0, content.length - 1);
|
|
}
|
|
toCanvas(destination, content);
|
|
el.appendChild(destination);
|
|
return;
|
|
});
|
|
/**
|
|
* Function for processing JSON like QR code blocks
|
|
*/
|
|
this.postprocessorComplex = (content, el, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
const destination = document.createElement('canvas');
|
|
let [text, parameters] = this.readParameters(content);
|
|
toCanvas(destination, text, parameters);
|
|
el.appendChild(destination);
|
|
return;
|
|
});
|
|
}
|
|
readParameters(jsonString) {
|
|
let params = JSON.parse(jsonString);
|
|
var options = {};
|
|
options.color = { light: "#ffffff", dark: "#000000" };
|
|
options.errorCorrectionLevel = 'M';
|
|
if (params.width !== undefined) {
|
|
options.width = params.width;
|
|
}
|
|
if (params.errorCorrectionLevel !== undefined) {
|
|
options.errorCorrectionLevel = params.errorCorrectionLevel;
|
|
}
|
|
if (params.margin !== undefined) {
|
|
options.margin = params.margin;
|
|
}
|
|
if (params.dark !== undefined) {
|
|
options.color.dark = params.dark;
|
|
}
|
|
if (params.light !== undefined) {
|
|
options.color.light = params.light;
|
|
}
|
|
return [params.text, options];
|
|
}
|
|
onload() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
console.log('loading plugin');
|
|
this.registerMarkdownCodeBlockProcessor('qrcode', this.postprocessorRaw);
|
|
this.registerMarkdownCodeBlockProcessor('qrcode-complex', this.postprocessorComplex);
|
|
});
|
|
}
|
|
onunload() {
|
|
console.log('unloading plugin');
|
|
}
|
|
}
|
|
|
|
module.exports = QrCodePlugin;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2Nhbi1wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvZXJyb3ItY29ycmVjdGlvbi1sZXZlbC5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvYml0LWJ1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvYml0LW1hdHJpeC5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvYWxpZ25tZW50LXBhdHRlcm4uanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2ZpbmRlci1wYXR0ZXJuLmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9tYXNrLXBhdHRlcm4uanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2Vycm9yLWNvcnJlY3Rpb24tY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvZ2Fsb2lzLWZpZWxkLmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9wb2x5bm9taWFsLmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9yZWVkLXNvbG9tb24tZW5jb2Rlci5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvdmVyc2lvbi1jaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvcmVnZXguanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL21vZGUuanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL3ZlcnNpb24uanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2Zvcm1hdC1pbmZvLmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9udW1lcmljLWRhdGEuanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2FscGhhbnVtZXJpYy1kYXRhLmpzIiwibm9kZV9tb2R1bGVzL2VuY29kZS11dGY4L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvY29yZS9ieXRlLWRhdGEuanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL2thbmppLWRhdGEuanMiLCJub2RlX21vZHVsZXMvZGlqa3N0cmFqcy9kaWprc3RyYS5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2NvcmUvc2VnbWVudHMuanMiLCJub2RlX21vZHVsZXMvcXJjb2RlL2xpYi9jb3JlL3FyY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL3JlbmRlcmVyL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvcmVuZGVyZXIvY2FudmFzLmpzIiwibm9kZV9tb2R1bGVzL3FyY29kZS9saWIvcmVuZGVyZXIvc3ZnLXRhZy5qcyIsIm5vZGVfbW9kdWxlcy9xcmNvZGUvbGliL2Jyb3dzZXIuanMiLCJtYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJnZXRTeW1ib2xTaXplIiwicmVxdWlyZSQkMCIsImVycm9yQ29ycmVjdGlvbkxldmVsIiwiRUNMZXZlbCIsIkdGIiwiUG9seW5vbWlhbCIsIlZlcnNpb25DaGVjayIsIlJlZ2V4IiwiVXRpbHMiLCJtb2RlIiwiTW9kZSIsIkVDQ29kZSIsIk51bWVyaWNEYXRhIiwiQWxwaGFudW1lcmljRGF0YSIsIkthbmppRGF0YSIsIkJ5dGVEYXRhIiwiZGlqa3N0cmEiLCJGaW5kZXJQYXR0ZXJuIiwiQWxpZ25tZW50UGF0dGVybiIsInZlcnNpb24iLCJWZXJzaW9uIiwiRm9ybWF0SW5mbyIsIkJpdEJ1ZmZlciIsIlJlZWRTb2xvbW9uRW5jb2RlciIsIm1hc2tQYXR0ZXJuIiwic2VnbWVudHMiLCJTZWdtZW50cyIsIkJpdE1hdHJpeCIsIk1hc2tQYXR0ZXJuIiwiUVJDb2Rl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QUksRUFBQztBQUN6QyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksRUFBQztBQUNoRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtBQUMvRCxFQUFFLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUc7QUFDckMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQUs7QUFDMUIsRUFBRSxJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUk7QUFDOUMsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDOUMsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3pDLEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxNQUFLO0FBQzNDLEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FB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QUFFLENBQUMsRUFBRSxDQUFDO0FBQ1osRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ1osRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ1osRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ1osRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ1osRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ1osRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2QsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQixFQUFDO0FBQ0Q7QUFDQSxNQUFNLGtCQUFrQixHQUFHO0FBQzNCO0FBQ0EsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNoQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ2hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRztBQUNqQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDbEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ2xCLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztBQUNuQixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDbkIsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ25CLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztBQUNuQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDcEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ3BCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztBQUNwQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDcEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ3BCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztBQUNwQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDcEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ3BCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztBQUNwQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDcEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ3BCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztBQUNwQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7QUFDckIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO0FBQ3JCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSTtBQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUk7QUFDdEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJO0FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSTtBQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUk7QUFDdEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJO0FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSTtBQUN0QixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7QUFDdkIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO0FBQ3ZCLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtBQUN2QixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7QUFDdkIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO0FBQ3ZCLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtBQUN2QixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7QUFDdkIsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUEsY0FBc0IsR0FBRyxTQUFTLGNBQWMsRUFBRSxPQUFPLEVBQUVDLHNCQUFv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QU0sQ0FBQyxLQUFJO0FBQzFCLEVBQUUsTUFBTSxHQUFHLEdBQUdDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFDO0FBQ2pEO0FBQ0EsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7QUFDekIsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ3pCO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsUUFBUTtBQUNwRDtBQUNBLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLFFBQVEsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLFFBQVE7QUFDdEQ7QUFDQSxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUks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RTtBQUNmLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUM7QUFDakMsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUN0QixNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQztBQUNyQyxLQUFLLE1BQU07QUFDWCxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUM7QUFDN0MsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNmLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQztBQUM1QyxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUM7QUFDOUMsS0FBSyxNQUFNO0FBQ1gsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFDO0FBQzFDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDO0FBQ2xDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDbEMsRUFB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
|