{"version":3,"sources":["jsdelivr-header.js","/npm/resemblejs@4.0.0/resemble.js"],"names":[],"mappings":"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","file":"/npm/resemblejs@4.0.0/resemble.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/resemblejs@4.0.0/resemble.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\nJames Cryer / Huddle\nURL: https://github.com/Huddle/Resemble.js\n*/\n\nvar naiveFallback = function () {\n    // ISC (c) 2011-2019 https://github.com/medikoo/es5-ext/blob/master/global.js\n    if (typeof self === \"object\" && self) {\n        return self;\n    }\n    if (typeof window === \"object\" && window) {\n        return window;\n    }\n    throw new Error(\"Unable to resolve global `this`\");\n};\n\nvar getGlobalThis = function () {\n    // ISC (c) 2011-2019 https://github.com/medikoo/es5-ext/blob/master/global.js\n    // Fallback to standard globalThis if available\n    if (typeof globalThis === \"object\" && globalThis) {\n        return globalThis;\n    }\n\n    try {\n        Object.defineProperty(Object.prototype, \"__global__\", {\n            get: function () {\n                return this;\n            },\n            configurable: true\n        });\n    } catch (error) {\n        return naiveFallback();\n    }\n    try {\n        // eslint-disable-next-line no-undef\n        if (!__global__) {\n            return naiveFallback();\n        }\n        return __global__; // eslint-disable-line no-undef\n    } finally {\n        delete Object.prototype.__global__;\n    }\n};\n\nvar isNode = function () {\n    const globalPolyfill = getGlobalThis();\n    return typeof globalPolyfill.process !== \"undefined\" && globalPolyfill.process.versions && globalPolyfill.process.versions.node;\n};\n\n(function (root, factory) {\n    \"use strict\";\n    if (typeof define === \"function\" && define.amd) {\n        define([], factory);\n    } else if (typeof module === \"object\" && module.exports) {\n        module.exports = factory();\n    } else {\n        root.resemble = factory();\n    }\n})(this /* eslint-disable-line no-invalid-this*/, function () {\n    \"use strict\";\n\n    var Img;\n    var Canvas;\n    var loadNodeCanvasImage;\n\n    if (isNode()) {\n        Canvas = require(\"canvas\"); // eslint-disable-line global-require\n        Img = Canvas.Image;\n        loadNodeCanvasImage = Canvas.loadImage;\n    } else {\n        Img = Image;\n    }\n\n    function createCanvas(width, height) {\n        if (isNode()) {\n            return Canvas.createCanvas(width, height);\n        }\n\n        var cnvs = document.createElement(\"canvas\");\n        cnvs.width = width;\n        cnvs.height = height;\n        return cnvs;\n    }\n\n    var oldGlobalSettings = {};\n    var globalOutputSettings = oldGlobalSettings;\n\n    var resemble = function (fileData) {\n        var pixelTransparency = 1;\n\n        var errorPixelColor = {\n            // Color for Error Pixels. Between 0 and 255.\n            red: 255,\n            green: 0,\n            blue: 255,\n            alpha: 255\n        };\n\n        var targetPix = { r: 0, g: 0, b: 0, a: 0 }; // isAntialiased\n\n        var errorPixelTransform = {\n            flat: function (px, offset) {\n                px[offset] = errorPixelColor.red;\n                px[offset + 1] = errorPixelColor.green;\n                px[offset + 2] = errorPixelColor.blue;\n                px[offset + 3] = errorPixelColor.alpha;\n            },\n            movement: function (px, offset, d1, d2) {\n                px[offset] = (d2.r * (errorPixelColor.red / 255) + errorPixelColor.red) / 2;\n                px[offset + 1] = (d2.g * (errorPixelColor.green / 255) + errorPixelColor.green) / 2;\n                px[offset + 2] = (d2.b * (errorPixelColor.blue / 255) + errorPixelColor.blue) / 2;\n                px[offset + 3] = d2.a;\n            },\n            flatDifferenceIntensity: function (px, offset, d1, d2) {\n                px[offset] = errorPixelColor.red;\n                px[offset + 1] = errorPixelColor.green;\n                px[offset + 2] = errorPixelColor.blue;\n                px[offset + 3] = colorsDistance(d1, d2);\n            },\n            movementDifferenceIntensity: function (px, offset, d1, d2) {\n                var ratio = (colorsDistance(d1, d2) / 255) * 0.8;\n\n                px[offset] = (1 - ratio) * (d2.r * (errorPixelColor.red / 255)) + ratio * errorPixelColor.red;\n                px[offset + 1] = (1 - ratio) * (d2.g * (errorPixelColor.green / 255)) + ratio * errorPixelColor.green;\n                px[offset + 2] = (1 - ratio) * (d2.b * (errorPixelColor.blue / 255)) + ratio * errorPixelColor.blue;\n                px[offset + 3] = d2.a;\n            },\n            diffOnly: function (px, offset, d1, d2) {\n                px[offset] = d2.r;\n                px[offset + 1] = d2.g;\n                px[offset + 2] = d2.b;\n                px[offset + 3] = d2.a;\n            }\n        };\n\n        var errorPixel = errorPixelTransform.flat;\n        var errorType;\n        var boundingBoxes;\n        var ignoredBoxes;\n        var ignoreAreasColoredWith;\n        var largeImageThreshold = 1200;\n        var useCrossOrigin = true;\n        var data = {};\n        var images = [];\n        var updateCallbackArray = [];\n\n        var tolerance = {\n            // between 0 and 255\n            red: 16,\n            green: 16,\n            blue: 16,\n            alpha: 16,\n            minBrightness: 16,\n            maxBrightness: 240\n        };\n\n        var ignoreAntialiasing = false;\n        var ignoreColors = false;\n        var scaleToSameSize = false;\n        var compareOnly = false;\n        var returnEarlyThreshold;\n\n        function colorsDistance(c1, c2) {\n            return (Math.abs(c1.r - c2.r) + Math.abs(c1.g - c2.g) + Math.abs(c1.b - c2.b)) / 3;\n        }\n\n        function withinBoundingBox(x, y, width, height, box) {\n            return x > (box.left || 0) && x < (box.right || width) && y > (box.top || 0) && y < (box.bottom || height);\n        }\n\n        function withinComparedArea(x, y, width, height, pixel2) {\n            var isIncluded = true;\n            var i;\n            var boundingBox;\n            var ignoredBox;\n            var selected;\n            var ignored;\n\n            if (boundingBoxes instanceof Array) {\n                selected = false;\n                for (i = 0; i < boundingBoxes.length; i++) {\n                    boundingBox = boundingBoxes[i];\n                    if (withinBoundingBox(x, y, width, height, boundingBox)) {\n                        selected = true;\n                        break;\n                    }\n                }\n            }\n            if (ignoredBoxes instanceof Array) {\n                ignored = true;\n                for (i = 0; i < ignoredBoxes.length; i++) {\n                    ignoredBox = ignoredBoxes[i];\n                    if (withinBoundingBox(x, y, width, height, ignoredBox)) {\n                        ignored = false;\n                        break;\n                    }\n                }\n            }\n\n            if (ignoreAreasColoredWith) {\n                return colorsDistance(pixel2, ignoreAreasColoredWith) !== 0;\n            }\n\n            if (selected === undefined && ignored === undefined) {\n                return true;\n            }\n            if (selected === false && ignored === true) {\n                return false;\n            }\n            if (selected === true || ignored === true) {\n                isIncluded = true;\n            }\n            if (selected === false || ignored === false) {\n                isIncluded = false;\n            }\n            return isIncluded;\n        }\n\n        function triggerDataUpdate() {\n            var len = updateCallbackArray.length;\n            var i;\n            for (i = 0; i < len; i++) {\n                if (typeof updateCallbackArray[i] === \"function\") {\n                    updateCallbackArray[i](data);\n                }\n            }\n        }\n\n        function loop(w, h, callback) {\n            var x;\n            var y;\n\n            for (x = 0; x < w; x++) {\n                for (y = 0; y < h; y++) {\n                    callback(x, y);\n                }\n            }\n        }\n\n        function parseImage(sourceImageData, width, height) {\n            var pixelCount = 0;\n            var redTotal = 0;\n            var greenTotal = 0;\n            var blueTotal = 0;\n            var alphaTotal = 0;\n            var brightnessTotal = 0;\n            var whiteTotal = 0;\n            var blackTotal = 0;\n\n            loop(width, height, function (horizontalPos, verticalPos) {\n                var offset = (verticalPos * width + horizontalPos) * 4;\n                var red = sourceImageData[offset];\n                var green = sourceImageData[offset + 1];\n                var blue = sourceImageData[offset + 2];\n                var alpha = sourceImageData[offset + 3];\n                var brightness = getBrightness(red, green, blue);\n\n                if (red === green && red === blue && alpha) {\n                    if (red === 0) {\n                        blackTotal++;\n                    } else if (red === 255) {\n                        whiteTotal++;\n                    }\n                }\n\n                pixelCount++;\n\n                redTotal += (red / 255) * 100;\n                greenTotal += (green / 255) * 100;\n                blueTotal += (blue / 255) * 100;\n                alphaTotal += ((255 - alpha) / 255) * 100;\n                brightnessTotal += (brightness / 255) * 100;\n            });\n\n            data.red = Math.floor(redTotal / pixelCount);\n            data.green = Math.floor(greenTotal / pixelCount);\n            data.blue = Math.floor(blueTotal / pixelCount);\n            data.alpha = Math.floor(alphaTotal / pixelCount);\n            data.brightness = Math.floor(brightnessTotal / pixelCount);\n            data.white = Math.floor((whiteTotal / pixelCount) * 100);\n            data.black = Math.floor((blackTotal / pixelCount) * 100);\n\n            triggerDataUpdate();\n        }\n\n        function onLoadImage(hiddenImage, callback) {\n            // don't assign to hiddenImage, see https://github.com/Huddle/Resemble.js/pull/87/commits/300d43352a2845aad289b254bfbdc7cd6a37e2d7\n            var width = hiddenImage.width;\n            var height = hiddenImage.height;\n\n            if (scaleToSameSize && images.length === 1) {\n                width = images[0].width;\n                height = images[0].height;\n            }\n\n            var hiddenCanvas = createCanvas(width, height);\n            var imageData;\n\n            hiddenCanvas.getContext(\"2d\").drawImage(hiddenImage, 0, 0, width, height);\n            imageData = hiddenCanvas.getContext(\"2d\").getImageData(0, 0, width, height);\n\n            images.push(imageData);\n\n            callback(imageData, width, height);\n        }\n\n        function loadImageData(fileDataForImage, callback) {\n            var fileReader;\n            var hiddenImage = new Img();\n\n            if (!hiddenImage.setAttribute) {\n                hiddenImage.setAttribute = function setAttribute() {};\n            }\n\n            if (useCrossOrigin) {\n                hiddenImage.setAttribute(\"crossorigin\", \"anonymous\");\n            }\n\n            hiddenImage.onerror = function (err) {\n                hiddenImage.onload = null;\n                hiddenImage.onerror = null; // fixes pollution between calls\n                images.push({ error: err ? err + \"\" : \"Image load error.\" });\n                callback();\n            };\n\n            hiddenImage.onload = function () {\n                hiddenImage.onload = null; // fixes pollution between calls\n                hiddenImage.onerror = null;\n                onLoadImage(hiddenImage, callback);\n            };\n\n            if (typeof fileDataForImage === \"string\") {\n                hiddenImage.src = fileDataForImage;\n                if (!isNode() && hiddenImage.complete && hiddenImage.naturalWidth > 0) {\n                    hiddenImage.onload();\n                }\n            } else if (\n                typeof fileDataForImage.data !== \"undefined\" &&\n                typeof fileDataForImage.width === \"number\" &&\n                typeof fileDataForImage.height === \"number\"\n            ) {\n                images.push(fileDataForImage);\n\n                callback(fileDataForImage, fileDataForImage.width, fileDataForImage.height);\n            } else if (typeof Buffer !== \"undefined\" && fileDataForImage instanceof Buffer) {\n                // If we have Buffer, assume we're on Node+Canvas and its supported\n                // hiddenImage.src = fileDataForImage;\n\n                loadNodeCanvasImage(fileDataForImage)\n                    .then(function (image) {\n                        hiddenImage.onload = null; // fixes pollution between calls\n                        hiddenImage.onerror = null;\n                        onLoadImage(image, callback);\n                    })\n                    .catch(function (err) {\n                        images.push({\n                            error: err ? err + \"\" : \"Image load error.\"\n                        });\n                        callback();\n                    });\n            } else {\n                fileReader = new FileReader();\n                fileReader.onload = function (event) {\n                    hiddenImage.src = event.target.result;\n                };\n                fileReader.readAsDataURL(fileDataForImage);\n            }\n        }\n\n        function isColorSimilar(a, b, color) {\n            var absDiff = Math.abs(a - b);\n\n            if (typeof a === \"undefined\") {\n                return false;\n            }\n            if (typeof b === \"undefined\") {\n                return false;\n            }\n\n            if (a === b) {\n                return true;\n            } else if (absDiff < tolerance[color]) {\n                return true;\n            }\n            return false;\n        }\n\n        function isPixelBrightnessSimilar(d1, d2) {\n            var alpha = isColorSimilar(d1.a, d2.a, \"alpha\");\n            var brightness = isColorSimilar(d1.brightness, d2.brightness, \"minBrightness\");\n            return brightness && alpha;\n        }\n\n        function getBrightness(r, g, b) {\n            return 0.3 * r + 0.59 * g + 0.11 * b;\n        }\n\n        function isRGBSame(d1, d2) {\n            var red = d1.r === d2.r;\n            var green = d1.g === d2.g;\n            var blue = d1.b === d2.b;\n            return red && green && blue;\n        }\n\n        function isRGBSimilar(d1, d2) {\n            var red = isColorSimilar(d1.r, d2.r, \"red\");\n            var green = isColorSimilar(d1.g, d2.g, \"green\");\n            var blue = isColorSimilar(d1.b, d2.b, \"blue\");\n            var alpha = isColorSimilar(d1.a, d2.a, \"alpha\");\n\n            return red && green && blue && alpha;\n        }\n\n        function isContrasting(d1, d2) {\n            return Math.abs(d1.brightness - d2.brightness) > tolerance.maxBrightness;\n        }\n\n        function getHue(red, green, blue) {\n            var r = red / 255;\n            var g = green / 255;\n            var b = blue / 255;\n            var max = Math.max(r, g, b);\n            var min = Math.min(r, g, b);\n            var h;\n            var d;\n\n            if (max === min) {\n                h = 0; // achromatic\n            } else {\n                d = max - min;\n                switch (max) {\n                    case r:\n                        h = (g - b) / d + (g < b ? 6 : 0);\n                        break;\n                    case g:\n                        h = (b - r) / d + 2;\n                        break;\n                    case b:\n                        h = (r - g) / d + 4;\n                        break;\n                    default:\n                        h /= 6;\n                }\n            }\n\n            return h;\n        }\n\n        function isAntialiased(sourcePix, pix, cacheSet, verticalPos, horizontalPos, width) {\n            var offset;\n            var distance = 1;\n            var i;\n            var j;\n            var hasHighContrastSibling = 0;\n            var hasSiblingWithDifferentHue = 0;\n            var hasEquivalentSibling = 0;\n\n            addHueInfo(sourcePix);\n\n            for (i = distance * -1; i <= distance; i++) {\n                for (j = distance * -1; j <= distance; j++) {\n                    if (i === 0 && j === 0) {\n                        // ignore source pixel\n                    } else {\n                        offset = ((verticalPos + j) * width + (horizontalPos + i)) * 4;\n\n                        if (!getPixelInfo(targetPix, pix, offset, cacheSet)) {\n                            continue;\n                        }\n\n                        addBrightnessInfo(targetPix);\n                        addHueInfo(targetPix);\n\n                        if (isContrasting(sourcePix, targetPix)) {\n                            hasHighContrastSibling++;\n                        }\n\n                        if (isRGBSame(sourcePix, targetPix)) {\n                            hasEquivalentSibling++;\n                        }\n\n                        if (Math.abs(targetPix.h - sourcePix.h) > 0.3) {\n                            hasSiblingWithDifferentHue++;\n                        }\n\n                        if (hasSiblingWithDifferentHue > 1 || hasHighContrastSibling > 1) {\n                            return true;\n                        }\n                    }\n                }\n            }\n\n            if (hasEquivalentSibling < 2) {\n                return true;\n            }\n\n            return false;\n        }\n\n        function copyPixel(px, offset, pix) {\n            if (errorType === \"diffOnly\") {\n                return;\n            }\n\n            px[offset] = pix.r; // r\n            px[offset + 1] = pix.g; // g\n            px[offset + 2] = pix.b; // b\n            px[offset + 3] = pix.a * pixelTransparency; // a\n        }\n\n        function copyGrayScalePixel(px, offset, pix) {\n            if (errorType === \"diffOnly\") {\n                return;\n            }\n\n            px[offset] = pix.brightness; // r\n            px[offset + 1] = pix.brightness; // g\n            px[offset + 2] = pix.brightness; // b\n            px[offset + 3] = pix.a * pixelTransparency; // a\n        }\n\n        function getPixelInfo(dst, pix, offset) {\n            if (pix.length > offset) {\n                dst.r = pix[offset];\n                dst.g = pix[offset + 1];\n                dst.b = pix[offset + 2];\n                dst.a = pix[offset + 3];\n\n                return true;\n            }\n\n            return false;\n        }\n\n        function addBrightnessInfo(pix) {\n            pix.brightness = getBrightness(pix.r, pix.g, pix.b); // 'corrected' lightness\n        }\n\n        function addHueInfo(pix) {\n            pix.h = getHue(pix.r, pix.g, pix.b);\n        }\n\n        function analyseImages(img1, img2, width, height) {\n            var data1 = img1.data;\n            var data2 = img2.data;\n            var hiddenCanvas;\n            var context;\n            var imgd;\n            var pix;\n\n            if (!compareOnly) {\n                hiddenCanvas = createCanvas(width, height);\n\n                context = hiddenCanvas.getContext(\"2d\");\n                imgd = context.createImageData(width, height);\n                pix = imgd.data;\n            }\n\n            var mismatchCount = 0;\n            var diffBounds = {\n                top: height,\n                left: width,\n                bottom: 0,\n                right: 0\n            };\n            var updateBounds = function (x, y) {\n                diffBounds.left = Math.min(x, diffBounds.left);\n                diffBounds.right = Math.max(x, diffBounds.right);\n                diffBounds.top = Math.min(y, diffBounds.top);\n                diffBounds.bottom = Math.max(y, diffBounds.bottom);\n            };\n\n            var time = Date.now();\n\n            var skip;\n\n            if (!!largeImageThreshold && ignoreAntialiasing && (width > largeImageThreshold || height > largeImageThreshold)) {\n                skip = 6;\n            }\n\n            var pixel1 = { r: 0, g: 0, b: 0, a: 0 };\n            var pixel2 = { r: 0, g: 0, b: 0, a: 0 };\n\n            var skipTheRest = false;\n\n            loop(width, height, function (horizontalPos, verticalPos) {\n                if (skipTheRest) {\n                    return;\n                }\n\n                if (skip) {\n                    // only skip if the image isn't small\n                    if (verticalPos % skip === 0 || horizontalPos % skip === 0) {\n                        return;\n                    }\n                }\n\n                var offset = (verticalPos * width + horizontalPos) * 4;\n                if (!getPixelInfo(pixel1, data1, offset, 1) || !getPixelInfo(pixel2, data2, offset, 2)) {\n                    return;\n                }\n\n                var isWithinComparedArea = withinComparedArea(horizontalPos, verticalPos, width, height, pixel2);\n\n                if (ignoreColors) {\n                    addBrightnessInfo(pixel1);\n                    addBrightnessInfo(pixel2);\n\n                    if (isPixelBrightnessSimilar(pixel1, pixel2) || !isWithinComparedArea) {\n                        if (!compareOnly) {\n                            copyGrayScalePixel(pix, offset, pixel2);\n                        }\n                    } else {\n                        if (!compareOnly) {\n                            errorPixel(pix, offset, pixel1, pixel2);\n                        }\n\n                        mismatchCount++;\n                        updateBounds(horizontalPos, verticalPos);\n                    }\n                    return;\n                }\n\n                if (isRGBSimilar(pixel1, pixel2) || !isWithinComparedArea) {\n                    if (!compareOnly) {\n                        copyPixel(pix, offset, pixel1);\n                    }\n                } else if (\n                    ignoreAntialiasing &&\n                    (addBrightnessInfo(pixel1), // jit pixel info augmentation looks a little weird, sorry.\n                    addBrightnessInfo(pixel2),\n                    isAntialiased(pixel1, data1, 1, verticalPos, horizontalPos, width) || isAntialiased(pixel2, data2, 2, verticalPos, horizontalPos, width))\n                ) {\n                    if (isPixelBrightnessSimilar(pixel1, pixel2) || !isWithinComparedArea) {\n                        if (!compareOnly) {\n                            copyGrayScalePixel(pix, offset, pixel2);\n                        }\n                    } else {\n                        if (!compareOnly) {\n                            errorPixel(pix, offset, pixel1, pixel2);\n                        }\n\n                        mismatchCount++;\n                        updateBounds(horizontalPos, verticalPos);\n                    }\n                } else {\n                    if (!compareOnly) {\n                        errorPixel(pix, offset, pixel1, pixel2);\n                    }\n\n                    mismatchCount++;\n                    updateBounds(horizontalPos, verticalPos);\n                }\n\n                if (compareOnly) {\n                    var currentMisMatchPercent = (mismatchCount / (height * width)) * 100;\n\n                    if (currentMisMatchPercent > returnEarlyThreshold) {\n                        skipTheRest = true;\n                    }\n                }\n            });\n\n            data.rawMisMatchPercentage = (mismatchCount / (height * width)) * 100;\n            data.misMatchPercentage = data.rawMisMatchPercentage.toFixed(2);\n            data.diffBounds = diffBounds;\n            data.analysisTime = Date.now() - time;\n\n            data.getImageDataUrl = function (text) {\n                if (compareOnly) {\n                    throw Error(\"No diff image available - ran in compareOnly mode\");\n                }\n\n                var barHeight = 0;\n\n                if (text) {\n                    barHeight = addLabel(text, context, hiddenCanvas);\n                }\n\n                context.putImageData(imgd, 0, barHeight);\n\n                return hiddenCanvas.toDataURL(\"image/png\");\n            };\n\n            if (!compareOnly && hiddenCanvas.toBuffer) {\n                data.getBuffer = function (includeOriginal) {\n                    if (includeOriginal) {\n                        var imageWidth = hiddenCanvas.width + 2;\n                        hiddenCanvas.width = imageWidth * 3;\n                        context.putImageData(img1, 0, 0);\n                        context.putImageData(img2, imageWidth, 0);\n                        context.putImageData(imgd, imageWidth * 2, 0);\n                    } else {\n                        context.putImageData(imgd, 0, 0);\n                    }\n                    return hiddenCanvas.toBuffer();\n                };\n            }\n        }\n\n        function addLabel(text, context, hiddenCanvas) {\n            var textPadding = 2;\n\n            context.font = \"12px sans-serif\";\n\n            var textWidth = context.measureText(text).width + textPadding * 2;\n            var barHeight = 22;\n\n            if (textWidth > hiddenCanvas.width) {\n                hiddenCanvas.width = textWidth;\n            }\n\n            hiddenCanvas.height += barHeight;\n\n            context.fillStyle = \"#666\";\n            context.fillRect(0, 0, hiddenCanvas.width, barHeight - 4);\n            context.fillStyle = \"#fff\";\n            context.fillRect(0, barHeight - 4, hiddenCanvas.width, 4);\n\n            context.fillStyle = \"#fff\";\n            context.textBaseline = \"top\";\n            context.font = \"12px sans-serif\";\n            context.fillText(text, textPadding, 1);\n\n            return barHeight;\n        }\n\n        function normalise(img, w, h) {\n            var c;\n            var context;\n\n            if (img.height < h || img.width < w) {\n                c = createCanvas(w, h);\n                context = c.getContext(\"2d\");\n                context.putImageData(img, 0, 0);\n                return context.getImageData(0, 0, w, h);\n            }\n\n            return img;\n        }\n\n        function outputSettings(options) {\n            var key;\n\n            if (options.errorColor) {\n                for (key in options.errorColor) {\n                    if (options.errorColor.hasOwnProperty(key)) {\n                        errorPixelColor[key] = options.errorColor[key] === void 0 ? errorPixelColor[key] : options.errorColor[key];\n                    }\n                }\n            }\n\n            if (options.errorType && errorPixelTransform[options.errorType]) {\n                errorPixel = errorPixelTransform[options.errorType];\n                errorType = options.errorType;\n            }\n\n            if (options.errorPixel && typeof options.errorPixel === \"function\") {\n                errorPixel = options.errorPixel;\n            }\n\n            pixelTransparency = isNaN(Number(options.transparency)) ? pixelTransparency : options.transparency;\n\n            if (options.largeImageThreshold !== undefined) {\n                largeImageThreshold = options.largeImageThreshold;\n            }\n\n            if (options.useCrossOrigin !== undefined) {\n                useCrossOrigin = options.useCrossOrigin;\n            }\n\n            if (options.boundingBox !== undefined) {\n                boundingBoxes = [options.boundingBox];\n            }\n\n            if (options.ignoredBox !== undefined) {\n                ignoredBoxes = [options.ignoredBox];\n            }\n\n            if (options.boundingBoxes !== undefined) {\n                boundingBoxes = options.boundingBoxes;\n            }\n\n            if (options.ignoredBoxes !== undefined) {\n                ignoredBoxes = options.ignoredBoxes;\n            }\n\n            if (options.ignoreAreasColoredWith !== undefined) {\n                ignoreAreasColoredWith = options.ignoreAreasColoredWith;\n            }\n        }\n\n        function compare(one, two) {\n            if (globalOutputSettings !== oldGlobalSettings) {\n                outputSettings(globalOutputSettings);\n            }\n\n            function onceWeHaveBoth() {\n                var width;\n                var height;\n                if (images.length === 2) {\n                    if (images[0].error || images[1].error) {\n                        data = {};\n                        data.error = images[0].error ? images[0].error : images[1].error;\n                        triggerDataUpdate();\n                        return;\n                    }\n                    width = images[0].width > images[1].width ? images[0].width : images[1].width;\n                    height = images[0].height > images[1].height ? images[0].height : images[1].height;\n\n                    if (images[0].width === images[1].width && images[0].height === images[1].height) {\n                        data.isSameDimensions = true;\n                    } else {\n                        data.isSameDimensions = false;\n                    }\n\n                    data.dimensionDifference = {\n                        width: images[0].width - images[1].width,\n                        height: images[0].height - images[1].height\n                    };\n\n                    analyseImages(normalise(images[0], width, height), normalise(images[1], width, height), width, height);\n\n                    triggerDataUpdate();\n                }\n            }\n\n            images = [];\n            loadImageData(one, onceWeHaveBoth);\n            loadImageData(two, onceWeHaveBoth);\n        }\n\n        function getCompareApi(param) {\n            var secondFileData;\n            var hasMethod = typeof param === \"function\";\n\n            if (!hasMethod) {\n                // assume it's file data\n                secondFileData = param;\n            }\n\n            var self = {\n                setReturnEarlyThreshold: function (threshold) {\n                    if (threshold) {\n                        compareOnly = true;\n                        returnEarlyThreshold = threshold;\n                    }\n                    return self;\n                },\n                scaleToSameSize: function () {\n                    scaleToSameSize = true;\n\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                useOriginalSize: function () {\n                    scaleToSameSize = false;\n\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                ignoreNothing: function () {\n                    tolerance.red = 0;\n                    tolerance.green = 0;\n                    tolerance.blue = 0;\n                    tolerance.alpha = 0;\n                    tolerance.minBrightness = 0;\n                    tolerance.maxBrightness = 255;\n\n                    ignoreAntialiasing = false;\n                    ignoreColors = false;\n\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                ignoreLess: function () {\n                    tolerance.red = 16;\n                    tolerance.green = 16;\n                    tolerance.blue = 16;\n                    tolerance.alpha = 16;\n                    tolerance.minBrightness = 16;\n                    tolerance.maxBrightness = 240;\n\n                    ignoreAntialiasing = false;\n                    ignoreColors = false;\n\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                ignoreAntialiasing: function () {\n                    tolerance.red = 32;\n                    tolerance.green = 32;\n                    tolerance.blue = 32;\n                    tolerance.alpha = 32;\n                    tolerance.minBrightness = 64;\n                    tolerance.maxBrightness = 96;\n\n                    ignoreAntialiasing = true;\n                    ignoreColors = false;\n\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                ignoreColors: function () {\n                    tolerance.alpha = 16;\n                    tolerance.minBrightness = 16;\n                    tolerance.maxBrightness = 240;\n\n                    ignoreAntialiasing = false;\n                    ignoreColors = true;\n\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                ignoreAlpha: function () {\n                    tolerance.red = 16;\n                    tolerance.green = 16;\n                    tolerance.blue = 16;\n                    tolerance.alpha = 255;\n                    tolerance.minBrightness = 16;\n                    tolerance.maxBrightness = 240;\n\n                    ignoreAntialiasing = false;\n                    ignoreColors = false;\n\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                repaint: function () {\n                    if (hasMethod) {\n                        param();\n                    }\n                    return self;\n                },\n                outputSettings: function (options) {\n                    outputSettings(options);\n                    return self;\n                },\n                onComplete: function (callback) {\n                    updateCallbackArray.push(callback);\n\n                    var wrapper = function () {\n                        compare(fileData, secondFileData);\n                    };\n\n                    wrapper();\n\n                    return getCompareApi(wrapper);\n                },\n                setupCustomTolerance: function (customSettings) {\n                    for (var property in tolerance) {\n                        if (!customSettings.hasOwnProperty(property)) {\n                            continue;\n                        }\n\n                        tolerance[property] = customSettings[property];\n                    }\n                }\n            };\n\n            return self;\n        }\n\n        var rootSelf = {\n            onComplete: function (callback) {\n                updateCallbackArray.push(callback);\n                loadImageData(fileData, function (imageData, width, height) {\n                    parseImage(imageData.data, width, height);\n                });\n            },\n            compareTo: function (secondFileData) {\n                return getCompareApi(secondFileData);\n            },\n            outputSettings: function (options) {\n                outputSettings(options);\n                return rootSelf;\n            }\n        };\n\n        return rootSelf;\n    };\n\n    function setGlobalOutputSettings(settings) {\n        globalOutputSettings = settings;\n        return resemble;\n    }\n\n    function applyIgnore(api, ignore, customTolerance) {\n        switch (ignore) {\n            case \"nothing\":\n                api.ignoreNothing();\n                break;\n            case \"less\":\n                api.ignoreLess();\n                break;\n            case \"antialiasing\":\n                api.ignoreAntialiasing();\n                break;\n            case \"colors\":\n                api.ignoreColors();\n                break;\n            case \"alpha\":\n                api.ignoreAlpha();\n                break;\n            default:\n                throw new Error(\"Invalid ignore: \" + ignore);\n        }\n\n        api.setupCustomTolerance(customTolerance);\n    }\n\n    resemble.compare = function (image1, image2, options, cb) {\n        var callback;\n        var opt;\n\n        if (typeof options === \"function\") {\n            callback = options;\n            opt = {};\n        } else {\n            callback = cb;\n            opt = options || {};\n        }\n\n        var res = resemble(image1);\n        var compare;\n\n        if (opt.output) {\n            res.outputSettings(opt.output);\n        }\n\n        compare = res.compareTo(image2);\n\n        if (opt.returnEarlyThreshold) {\n            compare.setReturnEarlyThreshold(opt.returnEarlyThreshold);\n        }\n\n        if (opt.scaleToSameSize) {\n            compare.scaleToSameSize();\n        }\n\n        var toleranceSettings = opt.tolerance || {};\n        if (typeof opt.ignore === \"string\") {\n            applyIgnore(compare, opt.ignore, toleranceSettings);\n        } else if (opt.ignore && opt.ignore.forEach) {\n            opt.ignore.forEach(function (v) {\n                applyIgnore(compare, v, toleranceSettings);\n            });\n        }\n\n        compare.onComplete(function (data) {\n            if (data.error) {\n                callback(data.error);\n            } else {\n                callback(null, data);\n            }\n        });\n    };\n\n    resemble.outputSettings = setGlobalOutputSettings;\n    return resemble;\n});\n"]}