{"version":3,"file":"exif-reader.js","mappings":"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","sources":["webpack://ExifReader/webpack/universalModuleDefinition","webpack://ExifReader/webpack/bootstrap","webpack://ExifReader/webpack/runtime/define property getters","webpack://ExifReader/webpack/runtime/hasOwnProperty shorthand","webpack://ExifReader/webpack/runtime/make namespace object","webpack://ExifReader/./src/utils.js","webpack://ExifReader/./src/dataview.js","webpack://ExifReader/./src/tag-names-utils.js","webpack://ExifReader/./src/byte-order.js","webpack://ExifReader/./src/image-header-jpeg.js","webpack://ExifReader/./src/image-header-png.js","webpack://ExifReader/./src/image-header-heic.js","webpack://ExifReader/./src/image-header-webp.js","webpack://ExifReader/./src/image-header.js","webpack://ExifReader/./src/image-header-tiff.js","webpack://ExifReader/./src/types.js","webpack://ExifReader/./src/tag-names-common.js","webpack://ExifReader/./src/tag-names-gps-ifd.js","webpack://ExifReader/./src/tag-names-interoperability-ifd.js","webpack://ExifReader/./src/tag-names-mpf-ifd.js","webpack://ExifReader/./src/tag-names.js","webpack://ExifReader/./src/tag-names-0th-ifd.js","webpack://ExifReader/./src/tag-names-exif-ifd.js","webpack://ExifReader/./src/tags.js","webpack://ExifReader/./src/file-tags.js","webpack://ExifReader/./src/jfif-tags.js","webpack://ExifReader/./src/iptc-tag-names.js","webpack://ExifReader/./src/text-decoder.js","webpack://ExifReader/./src/tag-decoder.js","webpack://ExifReader/./src/iptc-tags.js","webpack://ExifReader/./src/xmp-tag-names.js","webpack://ExifReader/./src/xmp-tags.js","webpack://ExifReader/./src/dom-parser.js","webpack://ExifReader/./src/icc-tag-names.js","webpack://ExifReader/./src/icc-tags.js","webpack://ExifReader/./src/png-file-tags.js","webpack://ExifReader/./src/thumbnail.js","webpack://ExifReader/./src/errors.js","webpack://ExifReader/./src/exif-reader.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ExifReader\"] = factory();\n\telse\n\t\troot[\"ExifReader\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n chars.push(dataView.getUint8(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getUnicodeStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i += 2) {\n chars.push(dataView.getUint16(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getStringValueFromArray(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getCharacterArray(string) {\n return string.split('').map((character) => character.charCodeAt(0));\n}\n\nexport function objectAssign() {\n for (let i = 1; i < arguments.length; i++) {\n for (const property in arguments[i]) {\n arguments[0][property] = arguments[i][property];\n }\n }\n\n return arguments[0];\n}\n\nexport function deferInit(object, key, initializer) {\n let initialized = false;\n Object.defineProperty(object, key, {\n get() {\n if (!initialized) {\n initialized = true;\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value: initializer.apply(object),\n writable: true\n });\n }\n return object[key];\n },\n configurable: true,\n enumerable: true\n });\n}\n\nexport function getBase64Image(image) {\n if (typeof btoa !== 'undefined') {\n // IE11- does not implement reduce on the Uint8Array prototype.\n return btoa(Array.prototype.reduce.call(new Uint8Array(image), (data, byte) => data + String.fromCharCode(byte), ''));\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== undefined) { // eslint-disable-line no-undef\n return Buffer.from(image).toString('base64'); // eslint-disable-line no-undef\n }\n return (new Buffer(image)).toString('base64'); // eslint-disable-line no-undef\n}\n","export default class DataView {\n constructor(buffer) {\n if (bufferTypeIsUnsupported(buffer)) {\n throw new Error('DataView: Passed buffer type is unsupported.');\n }\n\n this.buffer = buffer;\n this.byteLength = this.buffer.length;\n }\n\n getUint8(offset) {\n return this.buffer.readUInt8(offset);\n }\n\n getUint16(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt16LE(offset);\n }\n return this.buffer.readUInt16BE(offset);\n }\n\n getUint32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt32LE(offset);\n }\n return this.buffer.readUInt32BE(offset);\n }\n\n getInt32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readInt32LE(offset);\n }\n return this.buffer.readInt32BE(offset);\n }\n}\n\nfunction bufferTypeIsUnsupported(buffer) {\n return typeof buffer !== 'object'\n || buffer.length === undefined\n || buffer.readUInt8 === undefined\n || buffer.readUInt16LE === undefined\n || buffer.readUInt16BE === undefined\n || buffer.readUInt32LE === undefined\n || buffer.readUInt32BE === undefined\n || buffer.readInt32LE === undefined\n || buffer.readInt32BE === undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringValue(value) {\n return value.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getEncodedString(value) {\n if (value.length >= 8) {\n const encoding = getStringValue(value.slice(0, 8));\n\n if (encoding === 'ASCII\\x00\\x00\\x00') {\n return getStringValue(value.slice(8));\n } else if (encoding === 'JIS\\x00\\x00\\x00\\x00\\x00') {\n return '[JIS encoded text]';\n } else if (encoding === 'UNICODE\\x00') {\n return '[Unicode encoded text]';\n } else if (encoding === '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00') {\n return '[Undefined encoding]';\n }\n }\n\n return 'Undefined';\n}\n\nexport function getCalculatedGpsValue(value) {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nconst LITTLE_ENDIAN = 0x4949;\nconst BIG_ENDIAN = 0x4d4d;\n\nexport default {\n BIG_ENDIAN,\n LITTLE_ENDIAN,\n getByteOrder\n};\n\nfunction getByteOrder(dataView, tiffHeaderOffset) {\n if (dataView.getUint16(tiffHeaderOffset) === LITTLE_ENDIAN) {\n return LITTLE_ENDIAN;\n } else if (dataView.getUint16(tiffHeaderOffset) === BIG_ENDIAN) {\n return BIG_ENDIAN;\n }\n throw new Error('Illegal byte order value. Faulty image.');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isJpegFile,\n findJpegOffsets\n};\n\nconst MIN_JPEG_DATA_BUFFER_LENGTH = 2;\nconst JPEG_ID = 0xffd8;\nconst JPEG_ID_SIZE = 2;\nconst APP_ID_OFFSET = 4;\nconst APP_MARKER_SIZE = 2;\nconst JFIF_DATA_OFFSET = 2; // From start of APP0 marker.\nconst TIFF_HEADER_OFFSET = 10; // From start of APP1 marker.\nconst IPTC_DATA_OFFSET = 18; // From start of APP13 marker.\nconst XMP_DATA_OFFSET = 33; // From start of APP1 marker.\nconst XMP_EXTENDED_DATA_OFFSET = 79; // From start of APP1 marker including GUID, total length, and offset.\nconst APP2_ICC_DATA_OFFSET = 18; // From start of APP2 marker including marker and chunk/chunk total numbers.\nconst MPF_DATA_OFFSET = 8;\n\nconst APP2_ICC_IDENTIFIER = 'ICC_PROFILE\\0';\nconst ICC_CHUNK_NUMBER_OFFSET = APP_ID_OFFSET + APP2_ICC_IDENTIFIER.length;\nconst ICC_TOTAL_CHUNKS_OFFSET = ICC_CHUNK_NUMBER_OFFSET + 1;\n\nconst APP2_MPF_IDENTIFIER = 'MPF\\0';\n\nconst SOF0_MARKER = 0xffc0;\nconst SOF2_MARKER = 0xffc2;\nconst DHT_MARKER = 0xffc4;\nconst DQT_MARKER = 0xffdb;\nconst DRI_MARKER = 0xffdd;\nconst SOS_MARKER = 0xffda;\n\nconst APP0_MARKER = 0xffe0;\nconst APP1_MARKER = 0xffe1;\nconst APP2_MARKER = 0xffe2;\nconst APP13_MARKER = 0xffed;\nconst APP15_MARKER = 0xffef;\nconst COMMENT_MARKER = 0xfffe;\n\nconst APP0_JFIF_IDENTIFIER = 'JFIF';\nconst APP1_EXIF_IDENTIFIER = 'Exif';\nconst APP1_XMP_IDENTIFIER = 'http://ns.adobe.com/xap/1.0/\\x00';\nconst APP1_XMP_EXTENDED_IDENTIFIER = 'http://ns.adobe.com/xmp/extension/\\x00';\nconst APP13_IPTC_IDENTIFIER = 'Photoshop 3.0';\n\nfunction isJpegFile(dataView) {\n return !!dataView && (dataView.byteLength >= MIN_JPEG_DATA_BUFFER_LENGTH) && (dataView.getUint16(0) === JPEG_ID);\n}\n\nfunction findJpegOffsets(dataView) {\n let appMarkerPosition = JPEG_ID_SIZE;\n let fieldLength;\n let sof0DataOffset;\n let sof2DataOffset;\n let jfifDataOffset;\n let tiffHeaderOffset;\n let iptcDataOffset;\n let xmpChunks;\n let iccChunks;\n let mpfDataOffset;\n\n while (appMarkerPosition + APP_ID_OFFSET + 5 <= dataView.byteLength) {\n if (Constants.USE_FILE && isSOF0Marker(dataView, appMarkerPosition)) {\n sof0DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_FILE && isSOF2Marker(dataView, appMarkerPosition)) {\n sof2DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_JFIF && isApp0JfifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n jfifDataOffset = appMarkerPosition + JFIF_DATA_OFFSET;\n } else if (Constants.USE_EXIF && isApp1ExifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n tiffHeaderOffset = appMarkerPosition + TIFF_HEADER_OFFSET;\n } else if (Constants.USE_XMP && isApp1XmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_XMP && isApp1ExtendedXmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getExtendedXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_IPTC && isApp13PhotoshopMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n iptcDataOffset = appMarkerPosition + IPTC_DATA_OFFSET;\n } else if (Constants.USE_ICC && isApp2ICCMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n const iccDataOffset = appMarkerPosition + APP2_ICC_DATA_OFFSET;\n const iccDataLength = fieldLength - (APP2_ICC_DATA_OFFSET - APP_MARKER_SIZE);\n\n const iccChunkNumber = dataView.getUint8(appMarkerPosition + ICC_CHUNK_NUMBER_OFFSET);\n const iccChunksTotal = dataView.getUint8(appMarkerPosition + ICC_TOTAL_CHUNKS_OFFSET);\n if (!iccChunks) {\n iccChunks = [];\n }\n iccChunks.push({offset: iccDataOffset, length: iccDataLength, chunkNumber: iccChunkNumber, chunksTotal: iccChunksTotal});\n } else if (Constants.USE_MPF && isApp2MPFMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n mpfDataOffset = appMarkerPosition + MPF_DATA_OFFSET;\n } else if (isAppMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n } else {\n break;\n }\n appMarkerPosition += APP_MARKER_SIZE + fieldLength;\n }\n\n return {\n hasAppMarkers: appMarkerPosition > JPEG_ID_SIZE,\n fileDataOffset: sof0DataOffset || sof2DataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset\n };\n}\n\nfunction isSOF0Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF0_MARKER);\n}\n\nfunction isSOF2Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF2_MARKER);\n}\n\nfunction isApp2ICCMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_ICC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_ICC_IDENTIFIER);\n}\n\nfunction isApp2MPFMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_MPF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_MPF_IDENTIFIER);\n}\n\nfunction isApp0JfifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP0_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP0_JFIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1ExifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_EXIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1XmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_IDENTIFIER;\n}\n\nfunction isApp1ExtendedXmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isExtendedXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isExtendedXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_EXTENDED_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_EXTENDED_IDENTIFIER;\n}\n\nfunction getXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_DATA_OFFSET,\n length: fieldLength - (XMP_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction getExtendedXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_EXTENDED_DATA_OFFSET,\n length: fieldLength - (XMP_EXTENDED_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction isApp13PhotoshopMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP13_IPTC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP13_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP13_IPTC_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isAppMarker(dataView, appMarkerPosition) {\n const appMarker = dataView.getUint16(appMarkerPosition);\n return ((appMarker >= APP0_MARKER) && (appMarker <= APP15_MARKER))\n || (appMarker === COMMENT_MARKER)\n || (appMarker === SOF0_MARKER)\n || (appMarker === SOF2_MARKER)\n || (appMarker === DHT_MARKER)\n || (appMarker === DQT_MARKER)\n || (appMarker === DRI_MARKER)\n || (appMarker === SOS_MARKER);\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isPngFile,\n findPngOffsets\n};\n\nconst PNG_ID = '\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a';\nconst PNG_CHUNK_LENGTH_SIZE = 4;\nconst PNG_CHUNK_TYPE_SIZE = 4;\nconst PNG_CHUNK_LENGTH_OFFSET = 0;\nconst PNG_CHUNK_TYPE_OFFSET = PNG_CHUNK_LENGTH_SIZE;\nconst PNG_CHUNK_DATA_OFFSET = PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE;\nconst PNG_XMP_PREFIX = 'XML:com.adobe.xmp\\x00';\n\nfunction isPngFile(dataView) {\n return !!dataView && getStringFromDataView(dataView, 0, PNG_ID.length) === PNG_ID;\n}\n\nfunction findPngOffsets(dataView) {\n const PNG_CRC_SIZE = 4;\n\n const offsets = {\n hasAppMarkers: false\n };\n\n let offset = PNG_ID.length;\n\n while (offset + PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE <= dataView.byteLength) {\n if (Constants.USE_PNG_FILE && isPngImageHeaderChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.pngHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_XMP && isPngXmpChunk(dataView, offset)) {\n const dataOffset = getPngXmpDataOffset(dataView, offset);\n if (dataOffset !== undefined) {\n offsets.hasAppMarkers = true;\n offsets.xmpChunks = [{\n dataOffset,\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET) - (dataOffset - (offset + PNG_CHUNK_DATA_OFFSET))\n }];\n }\n }\n\n offset += dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET)\n + PNG_CHUNK_LENGTH_SIZE\n + PNG_CHUNK_TYPE_SIZE\n + PNG_CRC_SIZE;\n }\n\n return offsets;\n}\n\nfunction isPngImageHeaderChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_IMAGE_HEADER = 'IHDR';\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_IMAGE_HEADER;\n}\n\nfunction isPngXmpChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_INTERNATIONAL_TEXT = 'iTXt';\n return (getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_INTERNATIONAL_TEXT)\n && (getStringFromDataView(dataView, offset + PNG_CHUNK_DATA_OFFSET, PNG_XMP_PREFIX.length) === PNG_XMP_PREFIX);\n}\n\nfunction getPngXmpDataOffset(dataView, offset) {\n const COMPRESSION_FLAG_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n offset += PNG_CHUNK_DATA_OFFSET + PNG_XMP_PREFIX.length + COMPRESSION_FLAG_SIZE + COMPRESSION_METHOD_SIZE;\n\n let numberOfNullSeparators = 0;\n while (numberOfNullSeparators < 2 && offset < dataView.byteLength) {\n if (dataView.getUint8(offset) === 0x00) {\n numberOfNullSeparators++;\n }\n offset++;\n }\n if (numberOfNullSeparators < 2) {\n return undefined;\n }\n return offset;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isHeicFile,\n findHeicOffsets\n};\n\nfunction isHeicFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n const HEIC_ID = 'ftyp';\n const HEIC_ID_OFFSET = 4;\n const HEIC_MAJOR_BRANDS = ['heic', 'heix', 'hevc', 'hevx', 'heim', 'heis', 'hevm', 'hevs', 'mif1'];\n const HEIC_MAJOR_BRAND_LENGTH = 4;\n\n const heicMajorBrand = getStringFromDataView(dataView, HEIC_ID_OFFSET + HEIC_ID.length, HEIC_MAJOR_BRAND_LENGTH);\n\n return (getStringFromDataView(dataView, HEIC_ID_OFFSET, HEIC_ID.length) === HEIC_ID)\n && (HEIC_MAJOR_BRANDS.indexOf(heicMajorBrand) !== -1);\n}\n\nfunction findHeicOffsets(dataView) {\n if (Constants.USE_EXIF || Constants.USE_ICC) {\n const {offset: metaOffset, length: metaLength} = findMetaAtom(dataView);\n if (metaOffset === undefined) {\n return {hasAppMarkers: false};\n }\n\n const metaEndOffset = Math.min(metaOffset + metaLength, dataView.byteLength);\n const {exifItemOffset, ilocOffset, colrOffset} = findMetaItems(dataView, metaOffset, metaEndOffset);\n\n const exifOffset = findExifOffset(dataView, exifItemOffset, ilocOffset, metaEndOffset);\n const iccChunks = findIccChunks(dataView, colrOffset, metaEndOffset);\n return {\n hasAppMarkers: (exifOffset !== undefined) || (iccChunks !== undefined),\n tiffHeaderOffset: exifOffset,\n iccChunks\n };\n }\n\n return {hasAppMarkers: false};\n}\n\nfunction findMetaAtom(dataView) {\n const ATOM_LENGTH_SIZE = 4;\n const ATOM_TYPE_SIZE = 4;\n const ATOM_MIN_LENGTH = 8;\n const ATOM_TYPE_OFFSET = 4;\n\n let offset = 0;\n\n while (offset + ATOM_LENGTH_SIZE + ATOM_TYPE_SIZE <= dataView.byteLength) {\n const atomLength = getAtomLength(dataView, offset);\n if (atomLength >= ATOM_MIN_LENGTH) {\n const atomType = getStringFromDataView(dataView, offset + ATOM_TYPE_OFFSET, ATOM_TYPE_SIZE);\n if (atomType === 'meta') {\n return {\n offset,\n length: atomLength\n };\n }\n }\n\n offset += atomLength;\n }\n\n return {\n offset: undefined,\n length: 0\n };\n}\n\nfunction getAtomLength(dataView, offset) {\n const ATOM_EXTENDED_SIZE_LOW_OFFSET = 12;\n\n const atomLength = dataView.getUint32(offset);\n if (extendsToEndOfFile(atomLength)) {\n return dataView.byteLength - offset;\n }\n if (hasExtendedSize(atomLength)) {\n if (hasEmptyHighBits(dataView, offset)) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return dataView.getUint32(offset + ATOM_EXTENDED_SIZE_LOW_OFFSET);\n }\n }\n\n return atomLength;\n}\n\nfunction extendsToEndOfFile(atomLength) {\n return atomLength === 0;\n}\n\nfunction hasExtendedSize(atomLength) {\n return atomLength === 1;\n}\n\nfunction hasEmptyHighBits(dataView, offset) {\n const ATOM_EXTENDED_SIZE_OFFSET = 8;\n return dataView.getUint32(offset + ATOM_EXTENDED_SIZE_OFFSET) === 0;\n}\n\nfunction findMetaItems(dataView, offset, metaEndOffset) {\n const STRING_SIZE = 4;\n const ITEM_INDEX_REL_OFFSET = -4;\n const offsets = {\n ilocOffset: undefined,\n exifItemOffset: undefined,\n colrOffset: undefined\n };\n\n while ((offset + STRING_SIZE <= metaEndOffset)\n && (!offsets.ilocOffset || !offsets.exifItemOffset || !offsets.colrOffset)) {\n const itemName = getStringFromDataView(dataView, offset, STRING_SIZE);\n if (Constants.USE_EXIF && (itemName === 'iloc')) {\n offsets.ilocOffset = offset;\n } else if (Constants.USE_EXIF && (itemName === 'Exif')) {\n offsets.exifItemOffset = offset + ITEM_INDEX_REL_OFFSET;\n } else if (Constants.USE_ICC && (itemName === 'colr')) {\n offsets.colrOffset = offset + ITEM_INDEX_REL_OFFSET;\n }\n\n offset++;\n }\n\n return offsets;\n}\n\nfunction findExifOffset(dataView, exifItemOffset, offset, metaEndOffset) {\n const EXIF_ITEM_OFFSET_SIZE = 2;\n const ILOC_DATA_OFFSET = 12;\n const EXIF_POINTER_OFFSET = 8;\n const EXIF_POINTER_SIZE = 4;\n const EXIF_PREFIX_LENGTH_OFFSET = 4;\n const ILOC_ITEM_SIZE = 16;\n\n if (!offset || !exifItemOffset || (exifItemOffset + EXIF_ITEM_OFFSET_SIZE > metaEndOffset)) {\n return undefined;\n }\n\n const exifItemIndex = dataView.getUint16(exifItemOffset);\n offset += ILOC_DATA_OFFSET;\n\n while (offset + ILOC_ITEM_SIZE <= metaEndOffset) {\n const itemIndex = dataView.getUint16(offset);\n if (itemIndex === exifItemIndex) {\n const exifPointer = dataView.getUint32(offset + EXIF_POINTER_OFFSET);\n if (exifPointer + EXIF_POINTER_SIZE <= dataView.byteLength) {\n const exifOffset = dataView.getUint32(exifPointer);\n const prefixLength = exifOffset + EXIF_PREFIX_LENGTH_OFFSET;\n return exifPointer + prefixLength;\n }\n }\n offset += ILOC_ITEM_SIZE;\n }\n\n return undefined;\n}\n\nfunction findIccChunks(dataView, offset, metaEndOffset) {\n const ITEM_TYPE_OFFSET = 8;\n const ITEM_TYPE_SIZE = 4;\n const ITEM_CONTENT_OFFSET = 12;\n\n if (!offset || (offset + ITEM_CONTENT_OFFSET > metaEndOffset)) {\n return undefined;\n }\n\n const colorType = getStringFromDataView(dataView, offset + ITEM_TYPE_OFFSET, ITEM_TYPE_SIZE);\n if ((colorType !== 'prof') && (colorType !== 'rICC')) {\n return undefined;\n }\n\n return [{\n offset: offset + ITEM_CONTENT_OFFSET,\n length: getAtomLength(dataView, offset) - ITEM_CONTENT_OFFSET,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isWebpFile,\n findOffsets\n};\n\nfunction isWebpFile(dataView) {\n const RIFF_ID_OFFSET = 0;\n const RIFF_ID = 'RIFF';\n const WEBP_MARKER_OFFSET = 8;\n const WEBP_MARKER = 'WEBP';\n\n return !!dataView && getStringFromDataView(dataView, RIFF_ID_OFFSET, RIFF_ID.length) === RIFF_ID\n && getStringFromDataView(dataView, WEBP_MARKER_OFFSET, WEBP_MARKER.length) === WEBP_MARKER;\n}\n\nfunction findOffsets(dataView) {\n const SUB_CHUNK_START_OFFSET = 12;\n const CHUNK_SIZE_OFFSET = 4;\n const EXIF_IDENTIFIER = 'Exif\\x00\\x00';\n const CHUNK_HEADER_SIZE = 8;\n\n let offset = SUB_CHUNK_START_OFFSET;\n let hasAppMarkers = false;\n let tiffHeaderOffset;\n let xmpChunks;\n let iccChunks;\n\n while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) {\n const chunkId = getStringFromDataView(dataView, offset, 4);\n const chunkSize = dataView.getUint32(offset + CHUNK_SIZE_OFFSET, true);\n\n if (Constants.USE_EXIF && (chunkId === 'EXIF')) {\n hasAppMarkers = true;\n if (getStringFromDataView(dataView, offset + CHUNK_HEADER_SIZE, EXIF_IDENTIFIER.length) === EXIF_IDENTIFIER) {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE + EXIF_IDENTIFIER.length;\n } else {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE;\n }\n } else if (Constants.USE_XMP && (chunkId === 'XMP ')) {\n hasAppMarkers = true;\n xmpChunks = [{\n dataOffset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize\n }];\n } else if (Constants.USE_ICC && (chunkId === 'ICCP')) {\n hasAppMarkers = true;\n iccChunks = [{\n offset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n }\n\n offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1);\n }\n\n return {\n hasAppMarkers,\n tiffHeaderOffset,\n xmpChunks,\n iccChunks\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport Tiff from './image-header-tiff.js';\nimport Jpeg from './image-header-jpeg.js';\nimport Png from './image-header-png.js';\nimport Heic from './image-header-heic.js';\nimport Webp from './image-header-webp.js';\n\nexport default {\n parseAppMarkers\n};\n\nfunction parseAppMarkers(dataView) {\n if (Constants.USE_TIFF && Tiff.isTiffFile(dataView)) {\n return Tiff.findTiffOffsets();\n }\n\n if (Constants.USE_JPEG && Jpeg.isJpegFile(dataView)) {\n return Jpeg.findJpegOffsets(dataView);\n }\n\n if (Constants.USE_PNG && Png.isPngFile(dataView)) {\n return Png.findPngOffsets(dataView);\n }\n\n if (Constants.USE_HEIC && Heic.isHeicFile(dataView)) {\n return Heic.findHeicOffsets(dataView);\n }\n\n if (Constants.USE_WEBP && Webp.isWebpFile(dataView)) {\n return Webp.findOffsets(dataView);\n }\n\n throw new Error('Invalid image format');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\nimport Constants from './constants.js';\n\nexport default {\n isTiffFile,\n findTiffOffsets\n};\n\nfunction isTiffFile(dataView) {\n const MIN_TIFF_DATA_BUFFER_LENGTH = 4;\n\n return !!dataView && (dataView.byteLength >= MIN_TIFF_DATA_BUFFER_LENGTH) && hasTiffMarker(dataView);\n}\n\nfunction hasTiffMarker(dataView) {\n const TIFF_ID = 0x2a;\n const TIFF_ID_OFFSET = 2;\n\n const littleEndian = dataView.getUint16(0) === ByteOrder.LITTLE_ENDIAN;\n return dataView.getUint16(TIFF_ID_OFFSET, littleEndian) === TIFF_ID;\n}\n\nfunction findTiffOffsets() {\n const TIFF_FILE_HEADER_OFFSET = 0;\n\n if (Constants.USE_EXIF) {\n return {\n hasAppMarkers: true,\n tiffHeaderOffset: TIFF_FILE_HEADER_OFFSET\n };\n }\n return {};\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\n\nconst typeSizes = {\n 1: 1, // BYTE\n 2: 1, // ASCII\n 3: 2, // SHORT\n 4: 4, // LONG\n 5: 8, // RATIONAL\n 7: 1, // UNDEFINED\n 9: 4, // SLONG\n 10: 8, // SRATIONAL\n 13: 4 // IFD\n};\n\nconst tagTypes = {\n 'BYTE': 1,\n 'ASCII': 2,\n 'SHORT': 3,\n 'LONG': 4,\n 'RATIONAL': 5,\n 'UNDEFINED': 7,\n 'SLONG': 9,\n 'SRATIONAL': 10,\n 'IFD': 13\n};\n\nexport default {\n getAsciiValue,\n getByteAt,\n getAsciiAt,\n getShortAt,\n getLongAt,\n getRationalAt,\n getUndefinedAt,\n getSlongAt,\n getSrationalAt,\n getIfdPointerAt,\n typeSizes,\n tagTypes,\n getTypeSize\n};\n\nfunction getAsciiValue(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode));\n}\n\nfunction getByteAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getAsciiAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getShortAt(dataView, offset, byteOrder) {\n return dataView.getUint16(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getLongAt(dataView, offset, byteOrder) {\n return dataView.getUint32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getRationalAt(dataView, offset, byteOrder) {\n return [getLongAt(dataView, offset, byteOrder), getLongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getUndefinedAt(dataView, offset) {\n return getByteAt(dataView, offset);\n}\n\nfunction getSlongAt(dataView, offset, byteOrder) {\n return dataView.getInt32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getSrationalAt(dataView, offset, byteOrder) {\n return [getSlongAt(dataView, offset, byteOrder), getSlongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getIfdPointerAt(dataView, offset, byteOrder) {\n return getLongAt(dataView, offset, byteOrder);\n}\n\nfunction getTypeSize(typeName) {\n if (tagTypes[typeName] === undefined) {\n throw new Error('No such type found.');\n }\n\n return typeSizes[tagTypes[typeName]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n 'LightSource': (value) => {\n if (value === 1) {\n return 'Daylight';\n } else if (value === 2) {\n return 'Fluorescent';\n } else if (value === 3) {\n return 'Tungsten (incandescent light)';\n } else if (value === 4) {\n return 'Flash';\n } else if (value === 9) {\n return 'Fine weather';\n } else if (value === 10) {\n return 'Cloudy weather';\n } else if (value === 11) {\n return 'Shade';\n } else if (value === 12) {\n return 'Daylight fluorescent (D 5700 – 7100K)';\n } else if (value === 13) {\n return 'Day white fluorescent (N 4600 – 5400K)';\n } else if (value === 14) {\n return 'Cool white fluorescent (W 3900 – 4500K)';\n } else if (value === 15) {\n return 'White fluorescent (WW 3200 – 3700K)';\n } else if (value === 17) {\n return 'Standard light A';\n } else if (value === 18) {\n return 'Standard light B';\n } else if (value === 19) {\n return 'Standard light C';\n } else if (value === 20) {\n return 'D55';\n } else if (value === 21) {\n return 'D65';\n } else if (value === 22) {\n return 'D75';\n } else if (value === 23) {\n return 'D50';\n } else if (value === 24) {\n return 'ISO studio tungsten';\n } else if (value === 255) {\n return 'Other light source';\n }\n return 'Unknown';\n }\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getEncodedString, getCalculatedGpsValue} from './tag-names-utils.js';\n\nexport default {\n 0x0000: {\n 'name': 'GPSVersionID',\n 'description': (value) => {\n if (value[0] === 2 && value[1] === 2 && value[2] === 0 && value[3] === 0) {\n return 'Version 2.2';\n }\n return 'Unknown';\n }\n },\n 0x0001: {\n 'name': 'GPSLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0002: {\n 'name': 'GPSLatitude',\n 'description': getCalculatedGpsValue\n },\n 0x0003: {\n 'name': 'GPSLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0004: {\n 'name': 'GPSLongitude',\n 'description': getCalculatedGpsValue\n },\n 0x0005: {\n 'name': 'GPSAltitudeRef',\n 'description': (value) => {\n if (value === 0) {\n return 'Sea level';\n } else if (value === 1) {\n return 'Sea level reference (negative value)';\n }\n return 'Unknown';\n }\n },\n 0x0006: {\n 'name': 'GPSAltitude',\n 'description': (value) => {\n return (value[0] / value[1]) + ' m';\n }\n },\n 0x0007: {\n 'name': 'GPSTimeStamp',\n 'description': (values) => {\n return values.map(([numerator, denominator]) => {\n const num = numerator / denominator;\n if (/^\\d(\\.|$)/.test(`${num}`)) {\n return `0${num}`;\n }\n return num;\n }).join(':');\n }\n },\n 0x0008: 'GPSSatellites',\n 0x0009: {\n 'name': 'GPSStatus',\n 'description': (value) => {\n const status = value.join('');\n if (status === 'A') {\n return 'Measurement in progress';\n } else if (status === 'V') {\n return 'Measurement Interoperability';\n }\n return 'Unknown';\n }\n },\n 0x000a: {\n 'name': 'GPSMeasureMode',\n 'description': (value) => {\n const mode = value.join('');\n if (mode === '2') {\n return '2-dimensional measurement';\n } else if (mode === '3') {\n return '3-dimensional measurement';\n }\n return 'Unknown';\n }\n },\n 0x000b: 'GPSDOP',\n 0x000c: {\n 'name': 'GPSSpeedRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers per hour';\n } else if (ref === 'M') {\n return 'Miles per hour';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x000d: 'GPSSpeed',\n 0x000e: {\n 'name': 'GPSTrackRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x000f: 'GPSTrack',\n 0x0010: {\n 'name': 'GPSImgDirectionRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0011: 'GPSImgDirection',\n 0x0012: 'GPSMapDatum',\n 0x0013: {\n 'name': 'GPSDestLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0014: {\n 'name': 'GPSDestLatitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0015: {\n 'name': 'GPSDestLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0016: {\n 'name': 'GPSDestLongitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0017: {\n 'name': 'GPSDestBearingRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0018: 'GPSDestBearing',\n 0x0019: {\n 'name': 'GPSDestDistanceRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers';\n } else if (ref === 'M') {\n return 'Miles';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x001a: 'GPSDestDistance',\n 0x001b: {\n 'name': 'GPSProcessingMethod',\n 'description': getEncodedString\n },\n 0x001c: {\n 'name': 'GPSAreaInformation',\n 'description': getEncodedString\n },\n 0x001d: 'GPSDateStamp',\n 0x001e: {\n 'name': 'GPSDifferential',\n 'description': (value) => {\n if (value === 0) {\n return 'Measurement without differential correction';\n } else if (value === 1) {\n return 'Differential correction applied';\n }\n return 'Unknown';\n }\n },\n 0x001f: 'GPSHPositioningError'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0x0001: 'InteroperabilityIndex',\n 0x0002: {\n name: 'InteroperabilityVersion',\n description: (value) => getStringValue(value)\n },\n 0x1000: 'RelatedImageFileFormat',\n 0x1001: 'RelatedImageWidth',\n 0x1002: 'RelatedImageHeight'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0xb000: {\n 'name': 'MPFVersion',\n 'description': (value) => getStringValue(value)\n },\n 0xb001: 'NumberOfImages',\n 0xb002: 'MPEntry',\n 0xb003: 'ImageUIDList',\n 0xb004: 'TotalFrames'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport Constants from './constants.js';\nimport TagNames0thIfd from './tag-names-0th-ifd.js';\nimport TagNamesExifIfd from './tag-names-exif-ifd.js';\nimport TagNamesGpsIfd from './tag-names-gps-ifd.js';\nimport TagNamesInteroperabilityIfd from './tag-names-interoperability-ifd.js';\nimport TagNamesMpfIfd from './tag-names-mpf-ifd.js';\n\nconst tagNames0thExifIfds = objectAssign({}, TagNames0thIfd, TagNamesExifIfd);\n\nexport default {\n '0th': tagNames0thExifIfds,\n 'exif': tagNames0thExifIfds,\n 'gps': TagNamesGpsIfd,\n 'interoperability': TagNamesInteroperabilityIfd,\n 'mpf': Constants.USE_MPF ? TagNamesMpfIfd : {},\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x000b: 'ProcessingSoftware',\n 0x00fe: {\n name: 'SubfileType',\n description: (value) => ({\n 0x0: 'Full-resolution image',\n 0x1: 'Reduced-resolution image',\n 0x2: 'Single page of multi-page image',\n 0x3: 'Single page of multi-page reduced-resolution image',\n 0x4: 'Transparency mask',\n 0x5: 'Transparency mask of reduced-resolution image',\n 0x6: 'Transparency mask of multi-page image',\n 0x7: 'Transparency mask of reduced-resolution multi-page image',\n 0x10001: 'Alternate reduced-resolution image',\n 0xffffffff: 'Invalid'\n })[value] || 'Unknown'\n },\n 0x00ff: {\n name: 'OldSubfileType',\n description: (value) => ({\n 0: 'Full-resolution image',\n 1: 'Reduced-resolution image',\n 2: 'Single page of multi-page image'\n })[value] || 'Unknown'\n },\n 0x0100: 'ImageWidth',\n 0x0101: 'ImageLength',\n 0x0102: 'BitsPerSample',\n 0x0103: 'Compression',\n 0x0106: 'PhotometricInterpretation',\n 0x0107: {\n name: 'Thresholding',\n description: (value) => ({\n 1: 'No dithering or halftoning',\n 2: 'Ordered dither or halfton',\n 3: 'Randomized dither'\n })[value] || 'Unknown'\n },\n 0x0108: 'CellWidth',\n 0x0109: 'CellLength',\n 0x010a: {\n name: 'FillOrder',\n description: (value) => ({\n 1: 'Normal',\n 2: 'Reversed'\n })[value] || 'Unknown'\n },\n 0x010d: 'DocumentName',\n 0x010e: 'ImageDescription',\n 0x010f: 'Make',\n 0x0110: 'Model',\n 0x0111: 'StripOffsets',\n 0x0112: {\n name: 'Orientation',\n description: (value) => {\n if (value === 1) {\n return 'top-left';\n }\n if (value === 2) {\n return 'top-right';\n }\n if (value === 3) {\n return 'bottom-right';\n }\n if (value === 4) {\n return 'bottom-left';\n }\n if (value === 5) {\n return 'left-top';\n }\n if (value === 6) {\n return 'right-top';\n }\n if (value === 7) {\n return 'right-bottom';\n }\n if (value === 8) {\n return 'left-bottom';\n }\n return 'Undefined';\n }\n },\n 0x0115: 'SamplesPerPixel',\n 0x0116: 'RowsPerStrip',\n 0x0117: 'StripByteCounts',\n 0x0118: 'MinSampleValue',\n 0x0119: 'MaxSampleValue',\n 0x011a: {\n 'name': 'XResolution',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011b: {\n 'name': 'YResolution',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011c: 'PlanarConfiguration',\n 0x011d: 'PageName',\n 0x011e: {\n 'name': 'XPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011f: {\n 'name': 'YPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x0122: {\n name: 'GrayResponseUnit',\n description: (value) => ({\n 1: '0.1',\n 2: '0.001',\n 3: '0.0001',\n 4: '1e-05',\n 5: '1e-06'\n })[value] || 'Unknown'\n },\n 0x0128: {\n name: 'ResolutionUnit',\n description: (value) => {\n if (value === 2) {\n return 'inches';\n }\n if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n }\n },\n 0x0129: 'PageNumber',\n 0x012d: 'TransferFunction',\n 0x0131: 'Software',\n 0x0132: 'DateTime',\n 0x013b: 'Artist',\n 0x013c: 'HostComputer',\n 0x013d: 'Predictor',\n 0x013e: {\n 'name': 'WhitePoint',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x013f: {\n 'name': 'PrimaryChromaticities',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x0141: 'HalftoneHints',\n 0x0142: 'TileWidth',\n 0x0143: 'TileLength',\n 0x014a: 'A100DataOffset',\n 0x014c: {\n name: 'InkSet',\n description: (value) => ({\n 1: 'CMYK',\n 2: 'Not CMYK'\n })[value] || 'Unknown'\n },\n 0x0151: 'TargetPrinter',\n 0x0152: {\n name: 'ExtraSamples',\n description: (value) => ({\n 0: 'Unspecified',\n 1: 'Associated Alpha',\n 2: 'Unassociated Alpha',\n })[value] || 'Unknown'\n },\n 0x0153: {\n name: 'SampleFormat',\n description: (value) => {\n const formats = {\n 1: 'Unsigned',\n 2: 'Signed',\n 3: 'Float',\n 4: 'Undefined',\n 5: 'Complex int',\n 6: 'Complex float',\n };\n if (!Array.isArray(value)) {\n return 'Unknown';\n }\n return value.map((sample) => formats[sample] || 'Unknown').join(', ');\n }\n },\n 0x0201: 'JPEGInterchangeFormat',\n 0x0202: 'JPEGInterchangeFormatLength',\n 0x0211: {\n 'name': 'YCbCrCoefficients',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join('/');\n }\n },\n 0x0212: 'YCbCrSubSampling',\n 0x0213: {\n name: 'YCbCrPositioning',\n description: (value) => {\n if (value === 1) {\n return 'centered';\n }\n if (value === 2) {\n return 'co-sited';\n }\n return 'undefined ' + value;\n }\n },\n 0x0214: {\n 'name': 'ReferenceBlackWhite',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join(', ');\n }\n },\n 0x02bc: 'ApplicationNotes',\n 0x4746: 'Rating',\n 0x4749: 'RatingPercent',\n 0x8298: {\n name: 'Copyright',\n description: (value) => value.join('; ')\n },\n 0x830e: 'PixelScale',\n 0x83bb: 'IPTC-NAA',\n 0x8480: 'IntergraphMatrix',\n 0x8482: 'ModelTiePoint',\n 0x8546: 'SEMInfo',\n 0x85d8: 'ModelTransform',\n 0x8649: 'PhotoshopSettings',\n 0x8769: 'Exif IFD Pointer',\n 0x8773: 'ICC_Profile',\n 0x87af: 'GeoTiffDirectory',\n 0x87b0: 'GeoTiffDoubleParams',\n 0x87b1: 'GeoTiffAsciiParams',\n 0x8825: 'GPS Info IFD Pointer',\n 0x9c9b: 'XPTitle',\n 0x9c9c: 'XPComment',\n 0x9c9d: 'XPAuthor',\n 0x9c9e: 'XPKeywords',\n 0x9c9f: 'XPSubject',\n 0xa480: 'GDALMetadata',\n 0xa481: 'GDALNoData',\n 0xc4a5: 'PrintIM',\n 0xc613: 'DNGBackwardVersion',\n 0xc614: 'UniqueCameraModel',\n 0xc615: 'LocalizedCameraModel',\n 0xc621: 'ColorMatrix1',\n 0xc622: 'ColorMatrix2',\n 0xc623: 'CameraCalibration1',\n 0xc624: 'CameraCalibration2',\n 0xc625: 'ReductionMatrix1',\n 0xc626: 'ReductionMatrix2',\n 0xc627: 'AnalogBalance',\n 0xc628: 'AsShotNeutral',\n 0xc629: 'AsShotWhiteXY',\n 0xc62a: 'BaselineExposure',\n 0xc62b: 'BaselineNoise',\n 0xc62c: 'BaselineSharpness',\n 0xc62e: 'LinearResponseLimit',\n 0xc62f: 'CameraSerialNumber',\n 0xc630: 'DNGLensInfo',\n 0xc633: 'ShadowScale',\n 0xc635: {\n name: 'MakerNoteSafety',\n description: (value) => ({\n 0: 'Unsafe',\n 1: 'Safe'\n })[value] || 'Unknown'\n },\n 0xc65a: {\n name: 'CalibrationIlluminant1',\n description: TagNamesCommon['LightSource']\n },\n 0xc65b: {\n name: 'CalibrationIlluminant2',\n description: TagNamesCommon['LightSource']\n },\n 0xc65d: 'RawDataUniqueID',\n 0xc68b: 'OriginalRawFileName',\n 0xc68c: 'OriginalRawFileData',\n 0xc68f: 'AsShotICCProfile',\n 0xc690: 'AsShotPreProfileMatrix',\n 0xc691: 'CurrentICCProfile',\n 0xc692: 'CurrentPreProfileMatrix',\n 0xc6bf: 'ColorimetricReference',\n 0xc6c5: 'SRawType',\n 0xc6d2: 'PanasonicTitle',\n 0xc6d3: 'PanasonicTitle2',\n 0xc6f3: 'CameraCalibrationSig',\n 0xc6f4: 'ProfileCalibrationSig',\n 0xc6f5: 'ProfileIFD',\n 0xc6f6: 'AsShotProfileName',\n 0xc6f8: 'ProfileName',\n 0xc6f9: 'ProfileHueSatMapDims',\n 0xc6fa: 'ProfileHueSatMapData1',\n 0xc6fb: 'ProfileHueSatMapData2',\n 0xc6fc: 'ProfileToneCurve',\n 0xc6fd: {\n name: 'ProfileEmbedPolicy',\n description: (value) => ({\n 0: 'Allow Copying',\n 1: 'Embed if Used',\n 2: 'Never Embed',\n 3: 'No Restrictions'\n })[value] || 'Unknown'\n },\n 0xc6fe: 'ProfileCopyright',\n 0xc714: 'ForwardMatrix1',\n 0xc715: 'ForwardMatrix2',\n 0xc716: 'PreviewApplicationName',\n 0xc717: 'PreviewApplicationVersion',\n 0xc718: 'PreviewSettingsName',\n 0xc719: 'PreviewSettingsDigest',\n 0xc71a: {\n name: 'PreviewColorSpace',\n description: (value) => ({\n 1: 'Gray Gamma 2.2',\n 2: 'sRGB',\n 3: 'Adobe RGB',\n 4: 'ProPhoto RGB'\n })[value] || 'Unknown'\n },\n 0xc71b: 'PreviewDateTime',\n 0xc71c: 'RawImageDigest',\n 0xc71d: 'OriginalRawFileDigest',\n 0xc725: 'ProfileLookTableDims',\n 0xc726: 'ProfileLookTableData',\n 0xc763: 'TimeCodes',\n 0xc764: 'FrameRate',\n 0xc772: 'TStop',\n 0xc789: 'ReelName',\n 0xc791: 'OriginalDefaultFinalSize',\n 0xc792: 'OriginalBestQualitySize',\n 0xc793: 'OriginalDefaultCropSize',\n 0xc7a1: 'CameraLabel',\n 0xc7a3: {\n name: 'ProfileHueSatMapEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a4: {\n name: 'ProfileLookTableEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a5: 'BaselineExposureOffset',\n 0xc7a6: {\n name: 'DefaultBlackRender',\n description: (value) => ({\n 0: 'Auto',\n 1: 'None'\n })[value] || 'Unknown'\n },\n 0xc7a7: 'NewRawImageDigest',\n 0xc7a8: 'RawToPreviewGain'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue, getEncodedString} from './tag-names-utils.js';\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x829a: {\n 'name': 'ExposureTime',\n 'description': (value) => {\n if (value[0] !== 0) {\n return `1/${Math.round(value[1] / value[0])}`;\n }\n return `0/${value[1]}`;\n }\n },\n 0x829d: {\n 'name': 'FNumber',\n 'description': (value) => `f/${value[0] / value[1]}`\n },\n 0x8822: {\n 'name': 'ExposureProgram',\n 'description': (value) => {\n if (value === 0) {\n return 'Undefined';\n } else if (value === 1) {\n return 'Manual';\n } else if (value === 2) {\n return 'Normal program';\n } else if (value === 3) {\n return 'Aperture priority';\n } else if (value === 4) {\n return 'Shutter priority';\n } else if (value === 5) {\n return 'Creative program';\n } else if (value === 6) {\n return 'Action program';\n } else if (value === 7) {\n return 'Portrait mode';\n } else if (value === 8) {\n return 'Landscape mode';\n } else if (value === 9) {\n return 'Bulb';\n }\n return 'Unknown';\n }\n },\n 0x8824: 'SpectralSensitivity',\n 0x8827: 'ISOSpeedRatings',\n 0x8828: {\n 'name': 'OECF',\n 'description': () => '[Raw OECF table data]'\n },\n 0x882a: 'TimeZoneOffset',\n 0x882b: 'SelfTimerMode',\n 0x8830: {\n name: 'SensitivityType',\n description: (value) => ({\n 1: 'Standard Output Sensitivity',\n 2: 'Recommended Exposure Index',\n 3: 'ISO Speed',\n 4: 'Standard Output Sensitivity and Recommended Exposure Index',\n 5: 'Standard Output Sensitivity and ISO Speed',\n 6: 'Recommended Exposure Index and ISO Speed',\n 7: 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed'\n })[value] || 'Unknown'\n },\n 0x8831: 'StandardOutputSensitivity',\n 0x8832: 'RecommendedExposureIndex',\n 0x8833: 'ISOSpeed',\n 0x8834: 'ISOSpeedLatitudeyyy',\n 0x8835: 'ISOSpeedLatitudezzz',\n 0x9000: {\n 'name': 'ExifVersion',\n 'description': (value) => getStringValue(value)\n },\n 0x9003: 'DateTimeOriginal',\n 0x9004: 'DateTimeDigitized',\n 0x9009: 'GooglePlusUploadCode',\n 0x9010: 'OffsetTime',\n 0x9011: 'OffsetTimeOriginal',\n 0x9012: 'OffsetTimeDigitized',\n 0x9101: {\n 'name': 'ComponentsConfiguration',\n 'description': (value) => {\n return value.map((character) => {\n if (character === 0x31) {\n return 'Y';\n } else if (character === 0x32) {\n return 'Cb';\n } else if (character === 0x33) {\n return 'Cr';\n } else if (character === 0x34) {\n return 'R';\n } else if (character === 0x35) {\n return 'G';\n } else if (character === 0x36) {\n return 'B';\n }\n }).join('');\n }\n },\n 0x9102: 'CompressedBitsPerPixel',\n 0x9201: {\n 'name': 'ShutterSpeedValue',\n 'description': (value) => {\n return `1/${Math.round(Math.pow(2, value[0] / value[1]))}`;\n }\n },\n 0x9202: {\n 'name': 'ApertureValue',\n 'description': (value) => {\n return Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2);\n }\n },\n 0x9203: 'BrightnessValue',\n 0x9204: 'ExposureBiasValue',\n 0x9205: {\n 'name': 'MaxApertureValue',\n 'description': (value) => {\n return Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2);\n }\n },\n 0x9206: {\n 'name': 'SubjectDistance',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9207: {\n 'name': 'MeteringMode',\n 'description': (value) => {\n if (value === 1) {\n return 'Average';\n } else if (value === 2) {\n return 'CenterWeightedAverage';\n } else if (value === 3) {\n return 'Spot';\n } else if (value === 4) {\n return 'MultiSpot';\n } else if (value === 5) {\n return 'Pattern';\n } else if (value === 6) {\n return 'Partial';\n } else if (value === 255) {\n return 'Other';\n }\n return 'Unknown';\n }\n },\n 0x9208: {\n 'name': 'LightSource',\n description: TagNamesCommon['LightSource']\n },\n 0x9209: {\n 'name': 'Flash',\n 'description': (value) => {\n if (value === 0x00) {\n return 'Flash did not fire';\n } else if (value === 0x01) {\n return 'Flash fired';\n } else if (value === 0x05) {\n return 'Strobe return light not detected';\n } else if (value === 0x07) {\n return 'Strobe return light detected';\n } else if (value === 0x09) {\n return 'Flash fired, compulsory flash mode';\n } else if (value === 0x0d) {\n return 'Flash fired, compulsory flash mode, return light not detected';\n } else if (value === 0x0f) {\n return 'Flash fired, compulsory flash mode, return light detected';\n } else if (value === 0x10) {\n return 'Flash did not fire, compulsory flash mode';\n } else if (value === 0x18) {\n return 'Flash did not fire, auto mode';\n } else if (value === 0x19) {\n return 'Flash fired, auto mode';\n } else if (value === 0x1d) {\n return 'Flash fired, auto mode, return light not detected';\n } else if (value === 0x1f) {\n return 'Flash fired, auto mode, return light detected';\n } else if (value === 0x20) {\n return 'No flash function';\n } else if (value === 0x41) {\n return 'Flash fired, red-eye reduction mode';\n } else if (value === 0x45) {\n return 'Flash fired, red-eye reduction mode, return light not detected';\n } else if (value === 0x47) {\n return 'Flash fired, red-eye reduction mode, return light detected';\n } else if (value === 0x49) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode';\n } else if (value === 0x4d) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected';\n } else if (value === 0x4f) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected';\n } else if (value === 0x59) {\n return 'Flash fired, auto mode, red-eye reduction mode';\n } else if (value === 0x5d) {\n return 'Flash fired, auto mode, return light not detected, red-eye reduction mode';\n } else if (value === 0x5f) {\n return 'Flash fired, auto mode, return light detected, red-eye reduction mode';\n }\n return 'Unknown';\n }\n },\n 0x920a: {\n 'name': 'FocalLength',\n 'description': (value) => (value[0] / value[1]) + ' mm'\n },\n 0x9211: 'ImageNumber',\n 0x9212: {\n name: 'SecurityClassification',\n description: (value) => ({\n 'C': 'Confidential',\n 'R': 'Restricted',\n 'S': 'Secret',\n 'T': 'Top Secret',\n 'U': 'Unclassified'\n })[value] || 'Unknown'\n },\n 0x9213: 'ImageHistory',\n 0x9214: {\n 'name': 'SubjectArea',\n 'description': (value) => {\n if (value.length === 2) {\n return `Location; X: ${value[0]}, Y: ${value[1]}`;\n } else if (value.length === 3) {\n return `Circle; X: ${value[0]}, Y: ${value[1]}, diameter: ${value[2]}`;\n } else if (value.length === 4) {\n return `Rectangle; X: ${value[0]}, Y: ${value[1]}, width: ${value[2]}, height: ${value[3]}`;\n }\n return 'Unknown';\n }\n },\n 0x927c: {\n 'name': 'MakerNote',\n 'description': () => '[Raw maker note data]'\n },\n 0x9286: {\n 'name': 'UserComment',\n 'description': getEncodedString\n },\n 0x9290: 'SubSecTime',\n 0x9291: 'SubSecTimeOriginal',\n 0x9292: 'SubSecTimeDigitized',\n 0x9400: {\n 'name': 'AmbientTemperature',\n 'description': (value) => (value[0] / value[1]) + ' °C'\n },\n 0x9401: {\n 'name': 'Humidity',\n 'description': (value) => (value[0] / value[1]) + ' %'\n },\n 0x9402: {\n 'name': 'Pressure',\n 'description': (value) => (value[0] / value[1]) + ' hPa'\n },\n 0x9403: {\n 'name': 'WaterDepth',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9404: {\n 'name': 'Acceleration',\n 'description': (value) => (value[0] / value[1]) + ' mGal'\n },\n 0x9405: {\n 'name': 'CameraElevationAngle',\n 'description': (value) => (value[0] / value[1]) + ' °'\n },\n 0xa000: {\n 'name': 'FlashpixVersion',\n 'description': (value) => value.map((charCode) => String.fromCharCode(charCode)).join('')\n },\n 0xa001: {\n 'name': 'ColorSpace',\n 'description': (value) => {\n if (value === 1) {\n return 'sRGB';\n } else if (value === 0xffff) {\n return 'Uncalibrated';\n }\n return 'Unknown';\n }\n },\n 0xa002: 'PixelXDimension',\n 0xa003: 'PixelYDimension',\n 0xa004: 'RelatedSoundFile',\n 0xa005: 'Interoperability IFD Pointer',\n 0xa20b: 'FlashEnergy',\n 0xa20c: {\n 'name': 'SpatialFrequencyResponse',\n 'description': () => '[Raw SFR table data]'\n },\n 0xa20e: 'FocalPlaneXResolution',\n 0xa20f: 'FocalPlaneYResolution',\n 0xa210: {\n 'name': 'FocalPlaneResolutionUnit',\n 'description': (value) => {\n if (value === 2) {\n return 'inches';\n } else if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n }\n },\n 0xa214: {\n 'name': 'SubjectLocation',\n 'description': ([x, y]) => `X: ${x}, Y: ${y}`\n },\n 0xa215: 'ExposureIndex',\n 0xa217: {\n 'name': 'SensingMethod',\n 'description': (value) => {\n if (value === 1) {\n return 'Undefined';\n } else if (value === 2) {\n return 'One-chip color area sensor';\n } else if (value === 3) {\n return 'Two-chip color area sensor';\n } else if (value === 4) {\n return 'Three-chip color area sensor';\n } else if (value === 5) {\n return 'Color sequential area sensor';\n } else if (value === 7) {\n return 'Trilinear sensor';\n } else if (value === 8) {\n return 'Color sequential linear sensor';\n }\n return 'Unknown';\n }\n },\n 0xa300: {\n 'name': 'FileSource',\n 'description': (value) => {\n if (value === 3) {\n return 'DSC';\n }\n return 'Unknown';\n }\n },\n 0xa301: {\n 'name': 'SceneType',\n 'description': (value) => {\n if (value === 1) {\n return 'A directly photographed image';\n }\n return 'Unknown';\n }\n },\n 0xa302: {\n 'name': 'CFAPattern',\n 'description': () => '[Raw CFA pattern table data]'\n },\n 0xa401: {\n 'name': 'CustomRendered',\n 'description': (value) => {\n if (value === 0) {\n return 'Normal process';\n } else if (value === 1) {\n return 'Custom process';\n }\n return 'Unknown';\n }\n },\n 0xa402: {\n 'name': 'ExposureMode',\n 'description': (value) => {\n if (value === 0) {\n return 'Auto exposure';\n } else if (value === 1) {\n return 'Manual exposure';\n } else if (value === 2) {\n return 'Auto bracket';\n }\n return 'Unknown';\n }\n },\n 0xa403: {\n 'name': 'WhiteBalance',\n 'description': (value) => {\n if (value === 0) {\n return 'Auto white balance';\n } else if (value === 1) {\n return 'Manual white balance';\n }\n return 'Unknown';\n }\n },\n 0xa404: {\n 'name': 'DigitalZoomRatio',\n 'description': (value) => {\n if (value[0] === 0) {\n return 'Digital zoom was not used';\n }\n return '' + (value[0] / value[1]);\n }\n },\n 0xa405: {\n 'name': 'FocalLengthIn35mmFilm',\n 'description': (value) => {\n if (value === 0) {\n return 'Unknown';\n }\n return value;\n }\n },\n 0xa406: {\n 'name': 'SceneCaptureType',\n 'description': (value) => {\n if (value === 0) {\n return 'Standard';\n } else if (value === 1) {\n return 'Landscape';\n } else if (value === 2) {\n return 'Portrait';\n } else if (value === 3) {\n return 'Night scene';\n }\n return 'Unknown';\n }\n },\n 0xa407: {\n 'name': 'GainControl',\n 'description': (value) => {\n if (value === 0) {\n return 'None';\n } else if (value === 1) {\n return 'Low gain up';\n } else if (value === 2) {\n return 'High gain up';\n } else if (value === 3) {\n return 'Low gain down';\n } else if (value === 4) {\n return 'High gain down';\n }\n return 'Unknown';\n }\n },\n 0xa408: {\n 'name': 'Contrast',\n 'description': (value) => {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n }\n },\n 0xa409: {\n 'name': 'Saturation',\n 'description': (value) => {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Low saturation';\n } else if (value === 2) {\n return 'High saturation';\n }\n return 'Unknown';\n }\n },\n 0xa40a: {\n 'name': 'Sharpness',\n 'description': (value) => {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n }\n },\n 0xa40b: {\n 'name': 'DeviceSettingDescription',\n 'description': () => '[Raw device settings table data]'\n },\n 0xa40c: {\n 'name': 'SubjectDistanceRange',\n 'description': (value) => {\n if (value === 1) {\n return 'Macro';\n } else if (value === 2) {\n return 'Close view';\n } else if (value === 3) {\n return 'Distant view';\n }\n return 'Unknown';\n }\n },\n 0xa420: 'ImageUniqueID',\n 0xa430: 'CameraOwnerName',\n 0xa431: 'BodySerialNumber',\n 0xa432: {\n 'name': 'LensSpecification',\n 'description': (value) => {\n const focalLengths = `${value[0][0] / value[0][1]}-${value[1][0] / value[1][1]} mm`;\n if (value[3][1] === 0) {\n return `${focalLengths} f/?`;\n }\n return `${focalLengths} f/${1 / ((value[2][1] / value[2][1]) / (value[3][0] / value[3][1]))}`;\n }\n },\n 0xa433: 'LensMake',\n 0xa434: 'LensModel',\n 0xa435: 'LensSerialNumber',\n 0xa460: {\n name: 'CompositeImage',\n description: (value) => ({\n 1: 'Not a Composite Image',\n 2: 'General Composite Image',\n 3: 'Composite Image Captured While Shooting',\n })[value] || 'Unknown'\n },\n 0xa461: 'SourceImageNumberOfCompositeImage',\n 0xa462: 'SourceExposureTimesOfCompositeImage',\n 0xa500: 'Gamma',\n 0xea1c: 'Padding',\n 0xea1d: 'OffsetSchema',\n 0xfde8: 'OwnerName',\n 0xfde9: 'SerialNumber',\n 0xfdea: 'Lens',\n 0xfe4c: 'RawFile',\n 0xfe4d: 'Converter',\n 0xfe4e: 'WhiteBalance',\n 0xfe51: 'Exposure',\n 0xfe52: 'Shadows',\n 0xfe53: 'Brightness',\n 0xfe54: 'Contrast',\n 0xfe55: 'Saturation',\n 0xfe56: 'Sharpness',\n 0xfe57: 'Smoothness',\n 0xfe58: 'MoireFilter'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport {objectAssign} from './utils.js';\nimport ByteOrder from './byte-order.js';\nimport Types from './types.js';\nimport TagNames from './tag-names.js';\nimport {deferInit, getBase64Image} from './utils.js';\n\nconst EXIF_IFD_POINTER_KEY = 'Exif IFD Pointer';\nconst GPS_INFO_IFD_POINTER_KEY = 'GPS Info IFD Pointer';\nconst INTEROPERABILITY_IFD_POINTER_KEY = 'Interoperability IFD Pointer';\n\nconst getTagValueAt = {\n 1: Types.getByteAt,\n 2: Types.getAsciiAt,\n 3: Types.getShortAt,\n 4: Types.getLongAt,\n 5: Types.getRationalAt,\n 7: Types.getUndefinedAt,\n 9: Types.getSlongAt,\n 10: Types.getSrationalAt,\n 13: Types.getIfdPointerAt\n};\n\nexport default {\n read,\n readMpf\n};\n\nfunction read(dataView, tiffHeaderOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, tiffHeaderOffset);\n let tags = read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n\n return tags;\n}\n\nfunction read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n return readIfd(dataView, '0th', tiffHeaderOffset, get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder), byteOrder, includeUnknown);\n}\n\nfunction get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder) {\n return tiffHeaderOffset + Types.getLongAt(dataView, tiffHeaderOffset + 4, byteOrder);\n}\n\nfunction readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[EXIF_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, 'exif', tiffHeaderOffset, tiffHeaderOffset + tags[EXIF_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[GPS_INFO_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, 'gps', tiffHeaderOffset, tiffHeaderOffset + tags[GPS_INFO_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[INTEROPERABILITY_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, 'interoperability', tiffHeaderOffset, tiffHeaderOffset + tags[INTEROPERABILITY_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readMpf(dataView, dataOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, dataOffset);\n const tags = readIfd(dataView, 'mpf', dataOffset, get0thIfdOffset(dataView, dataOffset, byteOrder), byteOrder, includeUnknown);\n return addMpfImages(dataView, dataOffset, tags, byteOrder);\n}\n\nfunction addMpfImages(dataView, dataOffset, tags, byteOrder) {\n const ENTRY_SIZE = 16;\n\n if (!tags['MPEntry']) {\n return tags;\n }\n\n const images = [];\n for (let i = 0; i < Math.ceil(tags['MPEntry'].value.length / ENTRY_SIZE); i++) {\n images[i] = {};\n\n const attributes = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageFlags'] = getImageFlags(attributes);\n images[i]['ImageFormat'] = getImageFormat(attributes);\n images[i]['ImageType'] = getImageType(attributes);\n\n const imageSize = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 4, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageSize'] = {\n value: imageSize,\n description: '' + imageSize\n };\n\n const imageOffset = isFirstIndividualImage(i) ? 0 : getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 8, Types.getTypeSize('LONG'), byteOrder) + dataOffset;\n images[i]['ImageOffset'] = {\n value: imageOffset,\n description: '' + imageOffset\n };\n\n const dependentImage1EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 12, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage1EntryNumber'] = {\n value: dependentImage1EntryNumber,\n description: '' + dependentImage1EntryNumber\n };\n\n const dependentImage2EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 14, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage2EntryNumber'] = {\n value: dependentImage2EntryNumber,\n description: '' + dependentImage2EntryNumber\n };\n\n images[i].image = dataView.buffer.slice(imageOffset, imageOffset + imageSize);\n deferInit(images[i], 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n tags['Images'] = images;\n\n return tags;\n}\n\nfunction getImageNumberValue(entries, offset, size, byteOrder) {\n if (byteOrder === ByteOrder.LITTLE_ENDIAN) {\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * i);\n }\n return value;\n }\n\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * (size - 1 - i));\n }\n return value;\n}\n\nfunction getImageFlags(attributes) {\n const flags = [\n (attributes >> 31) & 0x1,\n (attributes >> 30) & 0x1,\n (attributes >> 29) & 0x1\n ];\n\n const flagsDescription = [];\n\n if (flags[0]) {\n flagsDescription.push('Dependent Parent Image');\n }\n if (flags[1]) {\n flagsDescription.push('Dependent Child Image');\n }\n if (flags[2]) {\n flagsDescription.push('Representative Image');\n }\n\n return {\n value: flags,\n description: flagsDescription.join(', ') || 'None'\n };\n}\n\nfunction getImageFormat(attributes) {\n const imageFormat = attributes >> 24 & 0x7;\n return {\n value: imageFormat,\n description: imageFormat === 0 ? 'JPEG' : 'Unknown'\n };\n}\n\nfunction getImageType(attributes) {\n const type = attributes & 0xffffff;\n const descriptions = {\n 0x30000: 'Baseline MP Primary Image',\n 0x10001: 'Large Thumbnail (VGA equivalent)',\n 0x10002: 'Large Thumbnail (Full HD equivalent)',\n 0x20001: 'Multi-Frame Image (Panorama)',\n 0x20002: 'Multi-Frame Image (Disparity)',\n 0x20003: 'Multi-Frame Image (Multi-Angle)',\n 0x0: 'Undefined',\n };\n\n return {\n value: type,\n description: descriptions[type] || 'Unknown'\n };\n}\n\nfunction isFirstIndividualImage(i) {\n return i === 0;\n}\n\nfunction readIfd(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const FIELD_COUNT_SIZE = Types.getTypeSize('SHORT');\n const FIELD_SIZE = 12;\n\n const tags = {};\n const numberOfFields = getNumberOfFields(dataView, offset, byteOrder);\n\n offset += FIELD_COUNT_SIZE;\n for (let fieldIndex = 0; fieldIndex < numberOfFields; fieldIndex++) {\n if (offset + FIELD_SIZE > dataView.byteLength) {\n break;\n }\n\n const tag = readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown);\n if (tag !== undefined) {\n tags[tag.name] = {\n 'id': tag.id,\n 'value': tag.value,\n 'description': tag.description\n };\n }\n\n offset += FIELD_SIZE;\n }\n\n if (Constants.USE_THUMBNAIL && (offset < dataView.byteLength - Types.getTypeSize('LONG'))) {\n const nextIfdOffset = Types.getLongAt(dataView, offset, byteOrder);\n if (nextIfdOffset !== 0) {\n tags['Thumbnail'] = readIfd(dataView, ifdType, tiffHeaderOffset, tiffHeaderOffset + nextIfdOffset, byteOrder, true);\n }\n }\n\n return tags;\n}\n\nfunction getNumberOfFields(dataView, offset, byteOrder) {\n if (offset + Types.getTypeSize('SHORT') <= dataView.byteLength) {\n return Types.getShortAt(dataView, offset, byteOrder);\n }\n return 0;\n}\n\nfunction readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const TAG_CODE_IPTC_NAA = 0x83bb;\n const TAG_TYPE_OFFSET = Types.getTypeSize('SHORT');\n const TAG_COUNT_OFFSET = TAG_TYPE_OFFSET + Types.getTypeSize('SHORT');\n const TAG_VALUE_OFFSET = TAG_COUNT_OFFSET + Types.getTypeSize('LONG');\n\n const tagCode = Types.getShortAt(dataView, offset, byteOrder);\n const tagType = Types.getShortAt(dataView, offset + TAG_TYPE_OFFSET, byteOrder);\n const tagCount = Types.getLongAt(dataView, offset + TAG_COUNT_OFFSET, byteOrder);\n let tagValue;\n\n if (Types.typeSizes[tagType] === undefined || (!includeUnknown && TagNames[ifdType][tagCode] === undefined)) {\n return undefined;\n }\n\n if (tagValueFitsInOffsetSlot(tagType, tagCount)) {\n tagValue = getTagValue(dataView, offset + TAG_VALUE_OFFSET, tagType, tagCount, byteOrder);\n } else {\n const tagValueOffset = Types.getLongAt(dataView, offset + TAG_VALUE_OFFSET, byteOrder);\n if (tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount)) {\n const forceByteType = tagCode === TAG_CODE_IPTC_NAA;\n tagValue = getTagValue(dataView, tiffHeaderOffset + tagValueOffset, tagType, tagCount, byteOrder, forceByteType);\n } else {\n tagValue = '';\n }\n }\n\n if (tagType === Types.tagTypes['ASCII']) {\n tagValue = splitNullSeparatedAsciiString(tagValue);\n tagValue = decodeAsciiValue(tagValue);\n }\n\n let tagName = `undefined-${tagCode}`;\n let tagDescription = tagValue;\n\n if (TagNames[ifdType][tagCode] !== undefined) {\n if ((TagNames[ifdType][tagCode]['name'] !== undefined) && (TagNames[ifdType][tagCode]['description'] !== undefined)) {\n tagName = TagNames[ifdType][tagCode]['name'];\n try {\n tagDescription = TagNames[ifdType][tagCode]['description'](tagValue);\n } catch (error) {\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n } else if ((tagType === Types.tagTypes['RATIONAL']) || (tagType === Types.tagTypes['SRATIONAL'])) {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = '' + (tagValue[0] / tagValue[1]);\n } else {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n }\n\n return {\n id: tagCode,\n name: tagName,\n value: tagValue,\n description: tagDescription\n };\n}\n\nfunction tagValueFitsInOffsetSlot(tagType, tagCount) {\n return Types.typeSizes[tagType] * tagCount <= Types.getTypeSize('LONG');\n}\n\nfunction getTagValue(dataView, offset, type, count, byteOrder, forceByteType = false) {\n let value = [];\n\n if (forceByteType) {\n count = count * Types.typeSizes[type];\n type = Types.tagTypes['BYTE'];\n }\n for (let valueIndex = 0; valueIndex < count; valueIndex++) {\n value.push(getTagValueAt[type](dataView, offset, byteOrder));\n offset += Types.typeSizes[type];\n }\n\n if (type === Types.tagTypes['ASCII']) {\n value = Types.getAsciiValue(value);\n } else if (value.length === 1) {\n value = value[0];\n }\n\n return value;\n}\n\nfunction tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount) {\n return tiffHeaderOffset + tagValueOffset + Types.typeSizes[tagType] * tagCount <= dataView.byteLength;\n}\n\nfunction splitNullSeparatedAsciiString(string) {\n const tagValue = [];\n let i = 0;\n\n for (let j = 0; j < string.length; j++) {\n if (string[j] === '\\x00') {\n i++;\n continue;\n }\n if (tagValue[i] === undefined) {\n tagValue[i] = '';\n }\n tagValue[i] += string[j];\n }\n\n return tagValue;\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return asciiValue.map((value) => decodeURIComponent(escape(value)));\n } catch (error) {\n return asciiValue;\n }\n}\n\nfunction getDescriptionFromTagValue(tagValue) {\n if (tagValue instanceof Array) {\n return tagValue.join(', ');\n }\n return tagValue;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n const length = getLength(dataView, fileDataOffset);\n const numberOfColorComponents = getNumberOfColorComponents(dataView, fileDataOffset, length);\n return {\n 'Bits Per Sample': getDataPrecision(dataView, fileDataOffset, length),\n 'Image Height': getImageHeight(dataView, fileDataOffset, length),\n 'Image Width': getImageWidth(dataView, fileDataOffset, length),\n 'Color Components': numberOfColorComponents,\n 'Subsampling': numberOfColorComponents && getSubsampling(dataView, fileDataOffset, numberOfColorComponents.value, length)\n };\n}\n\nfunction getLength(dataView, fileDataOffset) {\n return Types.getShortAt(dataView, fileDataOffset);\n}\n\nfunction getDataPrecision(dataView, fileDataOffset, length) {\n const OFFSET = 2;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset, length) {\n const OFFSET = 3;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset, length) {\n const OFFSET = 5;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getNumberOfColorComponents(dataView, fileDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getSubsampling(dataView, fileDataOffset, numberOfColorComponents, length) {\n const OFFSET = 8;\n const SIZE = 3 * numberOfColorComponents;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const components = [];\n\n for (let i = 0; i < numberOfColorComponents; i++) {\n const componentOffset = fileDataOffset + OFFSET + i * 3;\n components.push([\n Types.getByteAt(dataView, componentOffset),\n Types.getByteAt(dataView, componentOffset + 1),\n Types.getByteAt(dataView, componentOffset + 2)\n ]);\n }\n\n return {\n value: components,\n description: components.length > 1 ? getComponentIds(components) + getSamplingType(components) : ''\n };\n}\n\nfunction getComponentIds(components) {\n const ids = {\n 0x01: 'Y',\n 0x02: 'Cb',\n 0x03: 'Cr',\n 0x04: 'I',\n 0x05: 'Q',\n };\n\n return components.map((compontent) => ids[compontent[0]]).join('');\n}\n\nfunction getSamplingType(components) {\n const types = {\n 0x11: '4:4:4 (1 1)',\n 0x12: '4:4:0 (1 2)',\n 0x14: '4:4:1 (1 4)',\n 0x21: '4:2:2 (2 1)',\n 0x22: '4:2:0 (2 2)',\n 0x24: '4:2:1 (2 4)',\n 0x41: '4:1:1 (4 1)',\n 0x42: '4:1:0 (4 2)'\n };\n\n if (components.length === 0 || components[0][1] === undefined || types[components[0][1]] === undefined) {\n return '';\n }\n\n return types[components[0][1]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, jfifDataOffset) {\n const length = getLength(dataView, jfifDataOffset);\n const thumbnailWidth = getThumbnailWidth(dataView, jfifDataOffset, length);\n const thumbnailHeight = getThumbnailHeight(dataView, jfifDataOffset, length);\n const tags = {\n 'JFIF Version': getVersion(dataView, jfifDataOffset, length),\n 'Resolution Unit': getResolutionUnit(dataView, jfifDataOffset, length),\n 'XResolution': getXResolution(dataView, jfifDataOffset, length),\n 'YResolution': getYResolution(dataView, jfifDataOffset, length),\n 'JFIF Thumbnail Width': thumbnailWidth,\n 'JFIF Thumbnail Height': thumbnailHeight\n };\n\n if (thumbnailWidth !== undefined && thumbnailHeight !== undefined) {\n const thumbnail = getThumbnail(dataView, jfifDataOffset, 3 * thumbnailWidth.value * thumbnailHeight.value, length);\n if (thumbnail) {\n tags['JFIF Thumbnail'] = thumbnail;\n }\n }\n\n for (const tagName in tags) {\n if (tags[tagName] === undefined) {\n delete tags[tagName];\n }\n }\n\n return tags;\n}\n\nfunction getLength(dataView, jfifDataOffset) {\n return Types.getShortAt(dataView, jfifDataOffset);\n}\n\nfunction getVersion(dataView, jfifDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const majorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n const minorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET + 1);\n return {\n value: majorVersion * 0x100 + minorVersion,\n description: majorVersion + '.' + minorVersion\n };\n}\n\nfunction getResolutionUnit(dataView, jfifDataOffset, length) {\n const OFFSET = 9;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: getResolutionUnitDescription(value)\n };\n}\n\nfunction getResolutionUnitDescription(value) {\n if (value === 0) {\n return 'None';\n }\n if (value === 1) {\n return 'inches';\n }\n if (value === 2) {\n return 'cm';\n }\n return 'Unknown';\n}\n\nfunction getXResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 10;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getYResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 12;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getThumbnailWidth(dataView, jfifDataOffset, length) {\n const OFFSET = 14;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnailHeight(dataView, jfifDataOffset, length) {\n const OFFSET = 15;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnail(dataView, jfifDataOffset, thumbnailLength, length) {\n const OFFSET = 16;\n\n if (thumbnailLength === 0 || OFFSET + thumbnailLength > length) {\n return undefined;\n }\n\n const value = dataView.buffer.slice(jfifDataOffset + OFFSET, jfifDataOffset + OFFSET + thumbnailLength);\n return {\n value,\n description: '<24-bit RGB pixel data>'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 'iptc': {\n 0x0100: {\n 'name': 'Model Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0105: {\n 'name': 'Destination',\n 'repeatable': true\n },\n 0x0114: {\n 'name': 'File Format',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0116: {\n 'name': 'File Format Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x011e: 'Service Identifier',\n 0x0128: 'Envelope Number',\n 0x0132: 'Product ID',\n 0x013c: 'Envelope Priority',\n 0x0146: {\n 'name': 'Date Sent',\n 'description': getCreationDate\n },\n 0x0150: {\n 'name': 'Time Sent',\n 'description': getCreationTime\n },\n 0x015a: {\n 'name': 'Coded Character Set',\n 'description': getEncodingName,\n 'encoding_name': getEncodingName,\n },\n 0x0164: 'UNO',\n 0x0178: {\n 'name': 'ARM Identifier',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x017a: {\n 'name': 'ARM Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0200: {\n 'name': 'Record Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0203: 'Object Type Reference',\n 0x0204: 'Object Attribute Reference',\n 0x0205: 'Object Name',\n 0x0207: 'Edit Status',\n 0x0208: {\n 'name': 'Editorial Update',\n 'description': (value) => {\n if (getStringValue(value) === '01') {\n return 'Additional Language';\n }\n return 'Unknown';\n }\n },\n 0x020a: 'Urgency',\n 0x020c: {\n 'name': 'Subject Reference',\n 'repeatable': true,\n 'description': (value) => {\n const parts = getStringValue(value).split(':');\n return parts[2] + (parts[3] ? '/' + parts[3] : '') + (parts[4] ? '/' + parts[4] : '');\n }\n },\n 0x020f: 'Category',\n 0x0214: {\n 'name': 'Supplemental Category',\n 'repeatable': true\n },\n 0x0216: 'Fixture Identifier',\n 0x0219: {\n 'name': 'Keywords',\n 'repeatable': true\n },\n 0x021a: {\n 'name': 'Content Location Code',\n 'repeatable': true\n },\n 0x021b: {\n 'name': 'Content Location Name',\n 'repeatable': true\n },\n 0x021e: 'Release Date',\n 0x0223: 'Release Time',\n 0x0225: 'Expiration Date',\n 0x0226: 'Expiration Time',\n 0x0228: 'Special Instructions',\n 0x022a: {\n 'name': 'Action Advised',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === '01') {\n return 'Object Kill';\n } else if (string === '02') {\n return 'Object Replace';\n } else if (string === '03') {\n return 'Object Append';\n } else if (string === '04') {\n return 'Object Reference';\n }\n return 'Unknown';\n }\n },\n 0x022d: {\n 'name': 'Reference Service',\n 'repeatable': true\n },\n 0x022f: {\n 'name': 'Reference Date',\n 'repeatable': true\n },\n 0x0232: {\n 'name': 'Reference Number',\n 'repeatable': true\n },\n 0x0237: {\n 'name': 'Date Created',\n 'description': getCreationDate\n },\n 0x023c: {\n 'name': 'Time Created',\n 'description': getCreationTime\n },\n 0x023e: {\n 'name': 'Digital Creation Date',\n 'description': getCreationDate\n },\n 0x023f: {\n 'name': 'Digital Creation Time',\n 'description': getCreationTime\n },\n 0x0241: 'Originating Program',\n 0x0246: 'Program Version',\n 0x024b: {\n 'name': 'Object Cycle',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'a') {\n return 'morning';\n } else if (string === 'p') {\n return 'evening';\n } else if (string === 'b') {\n return 'both';\n }\n return 'Unknown';\n }\n },\n 0x0250: {\n 'name': 'By-line',\n 'repeatable': true\n },\n 0x0255: {\n 'name': 'By-line Title',\n 'repeatable': true\n },\n 0x025a: 'City',\n 0x025c: 'Sub-location',\n 0x025f: 'Province/State',\n 0x0264: 'Country/Primary Location Code',\n 0x0265: 'Country/Primary Location Name',\n 0x0267: 'Original Transmission Reference',\n 0x0269: 'Headline',\n 0x026e: 'Credit',\n 0x0273: 'Source',\n 0x0274: 'Copyright Notice',\n 0x0276: {\n 'name': 'Contact',\n 'repeatable': true\n },\n 0x0278: 'Caption/Abstract',\n 0x027a: {\n 'name': 'Writer/Editor',\n 'repeatable': true\n },\n 0x027d: {\n 'name': 'Rasterized Caption',\n 'description': (value) => value\n },\n 0x0282: 'Image Type',\n 0x0283: {\n 'name': 'Image Orientation',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'P') {\n return 'Portrait';\n } else if (string === 'L') {\n return 'Landscape';\n } else if (string === 'S') {\n return 'Square';\n }\n return 'Unknown';\n }\n },\n 0x0287: 'Language Identifier',\n 0x0296: {\n 'name': 'Audio Type',\n 'description': (value) => {\n const stringValue = getStringValue(value);\n const character0 = stringValue.charAt(0);\n const character1 = stringValue.charAt(1);\n let description = '';\n\n if (character0 === '1') {\n description += 'Mono';\n } else if (character0 === '2') {\n description += 'Stereo';\n }\n\n if (character1 === 'A') {\n description += ', actuality';\n } else if (character1 === 'C') {\n description += ', question and answer session';\n } else if (character1 === 'M') {\n description += ', music, transmitted by itself';\n } else if (character1 === 'Q') {\n description += ', response to a question';\n } else if (character1 === 'R') {\n description += ', raw sound';\n } else if (character1 === 'S') {\n description += ', scener';\n } else if (character1 === 'V') {\n description += ', voicer';\n } else if (character1 === 'W') {\n description += ', wrap';\n }\n\n if (description !== '') {\n return description;\n }\n return stringValue;\n }\n },\n 0x0297: {\n 'name': 'Audio Sampling Rate',\n 'description': (value) => parseInt(getStringValue(value), 10) + ' Hz'\n },\n 0x0298: {\n 'name': 'Audio Sampling Resolution',\n 'description': (value) => {\n const bits = parseInt(getStringValue(value), 10);\n return bits + (bits === 1 ? ' bit' : ' bits');\n }\n },\n 0x0299: {\n 'name': 'Audio Duration',\n 'description': (value) => {\n const duration = getStringValue(value);\n if (duration.length >= 6) {\n return duration.substr(0, 2) + ':' + duration.substr(2, 2) + ':' + duration.substr(4, 2);\n }\n return duration;\n }\n },\n 0x029a: 'Audio Outcue',\n 0x02ba: 'Short Document ID',\n 0x02bb: 'Unique Document ID',\n 0x02bc: 'Owner ID',\n 0x02c8: {\n 'name': (value) => {\n if (value.length === 2) {\n return 'ObjectData Preview File Format';\n }\n return 'Record 2 destination';\n },\n 'description': (value) => {\n if (value.length === 2) {\n const intValue = (value[0] << 8) + value[1];\n if (intValue === 0) {\n return 'No ObjectData';\n } else if (intValue === 1) {\n return 'IPTC-NAA Digital Newsphoto Parameter Record';\n } else if (intValue === 2) {\n return 'IPTC7901 Recommended Message Format';\n } else if (intValue === 3) {\n return 'Tagged Image File Format (Adobe/Aldus Image data)';\n } else if (intValue === 4) {\n return 'Illustrator (Adobe Graphics data)';\n } else if (intValue === 5) {\n return 'AppleSingle (Apple Computer Inc)';\n } else if (intValue === 6) {\n return 'NAA 89-3 (ANPA 1312)';\n } else if (intValue === 7) {\n return 'MacBinary II';\n } else if (intValue === 8) {\n return 'IPTC Unstructured Character Oriented File Format (UCOFF)';\n } else if (intValue === 9) {\n return 'United Press International ANPA 1312 variant';\n } else if (intValue === 10) {\n return 'United Press International Down-Load Message';\n } else if (intValue === 11) {\n return 'JPEG File Interchange (JFIF)';\n } else if (intValue === 12) {\n return 'Photo-CD Image-Pac (Eastman Kodak)';\n } else if (intValue === 13) {\n return 'Microsoft Bit Mapped Graphics File [*.BMP]';\n } else if (intValue === 14) {\n return 'Digital Audio File [*.WAV] (Microsoft & Creative Labs)';\n } else if (intValue === 15) {\n return 'Audio plus Moving Video [*.AVI] (Microsoft)';\n } else if (intValue === 16) {\n return 'PC DOS/Windows Executable Files [*.COM][*.EXE]';\n } else if (intValue === 17) {\n return 'Compressed Binary File [*.ZIP] (PKWare Inc)';\n } else if (intValue === 18) {\n return 'Audio Interchange File Format AIFF (Apple Computer Inc)';\n } else if (intValue === 19) {\n return 'RIFF Wave (Microsoft Corporation)';\n } else if (intValue === 20) {\n return 'Freehand (Macromedia/Aldus)';\n } else if (intValue === 21) {\n return 'Hypertext Markup Language \"HTML\" (The Internet Society)';\n } else if (intValue === 22) {\n return 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC';\n } else if (intValue === 23) {\n return 'MPEG 2 Audio Layer 3, ISO/IEC';\n } else if (intValue === 24) {\n return 'Portable Document File (*.PDF) Adobe';\n } else if (intValue === 25) {\n return 'News Industry Text Format (NITF)';\n } else if (intValue === 26) {\n return 'Tape Archive (*.TAR)';\n } else if (intValue === 27) {\n return 'Tidningarnas Telegrambyrå NITF version (TTNITF DTD)';\n } else if (intValue === 28) {\n return 'Ritzaus Bureau NITF version (RBNITF DTD)';\n } else if (intValue === 29) {\n return 'Corel Draw [*.CDR]';\n }\n return `Unknown format ${intValue}`;\n }\n return getStringValue(value);\n }\n },\n 0x02c9: {\n 'name': 'ObjectData Preview File Format Version',\n 'description': (value, tags) => {\n // Format ID, Version ID, Version Description\n const formatVersions = {\n '00': {'00': '1'},\n '01': {'01': '1', '02': '2', '03': '3', '04': '4'},\n '02': {'04': '4'},\n '03': {'01': '5.0', '02': '6.0'},\n '04': {'01': '1.40'},\n '05': {'01': '2'},\n '06': {'01': '1'},\n '11': {'01': '1.02'},\n '20': {'01': '3.1', '02': '4.0', '03': '5.0', '04': '5.5'},\n '21': {'02': '2.0'}\n };\n const stringValue = getStringValue(value);\n\n if (tags['ObjectData Preview File Format']) {\n const objectDataPreviewFileFormat = getStringValue(tags['ObjectData Preview File Format'].value);\n if (formatVersions[objectDataPreviewFileFormat]\n && formatVersions[objectDataPreviewFileFormat][stringValue]) {\n return formatVersions[objectDataPreviewFileFormat][stringValue];\n }\n }\n\n return stringValue;\n }\n },\n 0x02ca: 'ObjectData Preview Data',\n 0x070a: {\n 'name': 'Size Mode',\n 'description': (value) => {\n return (value[0]).toString();\n }\n },\n 0x0714: {\n 'name': 'Max Subfile Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075a: {\n 'name': 'ObjectData Size Announced',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075f: {\n 'name': 'Maximum ObjectData Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n }\n }\n};\n\nfunction getCreationDate(value) {\n const date = getStringValue(value);\n\n if (date.length >= 8) {\n return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);\n }\n\n return date;\n}\n\nfunction getCreationTime(value) {\n const time = getStringValue(value);\n let parsedTime = time;\n\n if (time.length >= 6) {\n parsedTime = time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);\n if (time.length === 11) {\n parsedTime += time.substr(6, 1) + time.substr(7, 2) + ':' + time.substr(9, 2);\n }\n }\n\n return parsedTime;\n}\n\nfunction getEncodingName(value) {\n const string = getStringValue(value);\n if (string === '\\x1b%G') {\n return 'UTF-8';\n } else if (string === '\\x1b%5') {\n return 'Windows-1252';\n } else if (string === '\\x1b%/G') {\n return 'UTF-8 Level 1';\n } else if (string === '\\x1b%/H') {\n return 'UTF-8 Level 2';\n } else if (string === '\\x1b%/I') {\n return 'UTF-8 Level 3';\n } else if (string === '\\x1B/A') {\n return 'ISO-8859-1';\n } else if (string === '\\x1B/B') {\n return 'ISO-8859-2';\n } else if (string === '\\x1B/C') {\n return 'ISO-8859-3';\n } else if (string === '\\x1B/D') {\n return 'ISO-8859-4';\n } else if (string === '\\x1B/@') {\n return 'ISO-8859-5';\n } else if (string === '\\x1B/G') {\n return 'ISO-8859-6';\n } else if (string === '\\x1B/F') {\n return 'ISO-8859-7';\n } else if (string === '\\x1B/H') {\n return 'ISO-8859-8';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof TextDecoder !== 'undefined') {\n return TextDecoder;\n }\n\n return undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TextDecoder from './text-decoder.js';\n\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n decode,\n TAG_HEADER_SIZE\n};\n\nfunction decode(encoding, tagValue) {\n const Decoder = TextDecoder.get();\n if ((typeof Decoder !== 'undefined') && (encoding !== undefined)) {\n try {\n return new Decoder(encoding).decode(Uint8Array.from(tagValue));\n } catch (error) {\n // Pass through and fall back to ASCII decoding.\n }\n }\n\n const stringValue = tagValue.map((charCode) => String.fromCharCode(charCode)).join('');\n return decodeAsciiValue(stringValue);\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return decodeURIComponent(escape(asciiValue));\n } catch (error) {\n return asciiValue;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport IptcTagNames from './iptc-tag-names.js';\nimport TagDecoder from './tag-decoder.js';\n\nconst BYTES_8BIM = 0x3842494d;\nconst BYTES_8BIM_SIZE = 4;\nconst RESOURCE_BLOCK_HEADER_SIZE = BYTES_8BIM_SIZE + 8;\nconst NAA_RESOURCE_BLOCK_TYPE = 0x0404;\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n read\n};\n\nfunction read(dataView, dataOffset, includeUnknown) {\n try {\n if (Array.isArray(dataView)) {\n return parseTags(new DataView(Uint8Array.from(dataView).buffer), {size: dataView.length}, 0, includeUnknown);\n }\n const {naaBlock, dataOffset: newDataOffset} = getNaaResourceBlock(dataView, dataOffset);\n return parseTags(dataView, naaBlock, newDataOffset, includeUnknown);\n } catch (error) {\n return {};\n }\n}\n\nfunction getNaaResourceBlock(dataView, dataOffset) {\n while (dataOffset + RESOURCE_BLOCK_HEADER_SIZE <= dataView.byteLength) {\n const resourceBlock = getResourceBlock(dataView, dataOffset);\n if (isNaaResourceBlock(resourceBlock)) {\n return {naaBlock: resourceBlock, dataOffset: dataOffset + RESOURCE_BLOCK_HEADER_SIZE};\n }\n dataOffset += RESOURCE_BLOCK_HEADER_SIZE + resourceBlock.size + getBlockPadding(resourceBlock);\n }\n throw new Error('No IPTC NAA resource block.');\n}\n\nfunction getResourceBlock(dataView, dataOffset) {\n const RESOURCE_BLOCK_SIZE_OFFSET = 10;\n\n if (dataView.getUint32(dataOffset, false) !== BYTES_8BIM) {\n throw new Error('Not an IPTC resource block.');\n }\n\n return {\n type: dataView.getUint16(dataOffset + BYTES_8BIM_SIZE),\n size: dataView.getUint16(dataOffset + RESOURCE_BLOCK_SIZE_OFFSET)\n };\n}\n\nfunction isNaaResourceBlock(resourceBlock) {\n return resourceBlock.type === NAA_RESOURCE_BLOCK_TYPE;\n}\n\nfunction getBlockPadding(resourceBlock) {\n if (resourceBlock.size % 2 !== 0) {\n return 1;\n }\n return 0;\n}\n\nfunction parseTags(dataView, naaBlock, dataOffset, includeUnknown) {\n const tags = {};\n let encoding = undefined;\n\n const endOfBlockOffset = dataOffset + naaBlock['size'];\n\n while ((dataOffset < endOfBlockOffset) && (dataOffset < dataView.byteLength)) {\n const {tag, tagSize} = readTag(dataView, dataOffset, tags, encoding, includeUnknown);\n\n if (tag === null) {\n break;\n }\n\n if (tag) {\n if ('encoding' in tag) {\n encoding = tag.encoding;\n }\n\n if ((tags[tag.name] === undefined) || (tag['repeatable'] === undefined)) {\n tags[tag.name] = {\n id: tag.id,\n value: tag.value,\n description: tag.description\n };\n } else {\n if (!(tags[tag.name] instanceof Array)) {\n tags[tag.name] = [{\n id: tags[tag.name].id,\n value: tags[tag.name].value,\n description: tags[tag.name].description\n }];\n }\n tags[tag.name].push({\n id: tag.id,\n value: tag.value,\n description: tag.description\n });\n }\n }\n\n dataOffset += TAG_HEADER_SIZE + tagSize;\n }\n\n return tags;\n}\n\nfunction readTag(dataView, dataOffset, tags, encoding, includeUnknown) {\n const TAG_CODE_OFFSET = 1;\n const TAG_SIZE_OFFSET = 3;\n\n if (leadByteIsMissing(dataView, dataOffset)) {\n return {tag: null, tagSize: 0};\n }\n\n const tagCode = dataView.getUint16(dataOffset + TAG_CODE_OFFSET);\n const tagSize = dataView.getUint16(dataOffset + TAG_SIZE_OFFSET);\n\n if (!includeUnknown && !IptcTagNames['iptc'][tagCode]) {\n return {tag: undefined, tagSize};\n }\n\n const tagValue = getTagValue(dataView, dataOffset + TAG_HEADER_SIZE, tagSize);\n\n const tag = {\n id: tagCode,\n name: getTagName(IptcTagNames['iptc'][tagCode], tagCode, tagValue),\n value: tagValue,\n description: getTagDescription(IptcTagNames['iptc'][tagCode], tagValue, tags, encoding)\n };\n if (tagIsRepeatable(tagCode)) {\n tag['repeatable'] = true;\n }\n if (tagContainsEncoding(tagCode)) {\n tag['encoding'] = IptcTagNames['iptc'][tagCode]['encoding_name'](tagValue);\n }\n\n return {tag, tagSize};\n}\n\nfunction leadByteIsMissing(dataView, dataOffset) {\n const TAG_LEAD_BYTE = 0x1c;\n return dataView.getUint8(dataOffset) !== TAG_LEAD_BYTE;\n}\n\nfunction getTagValue(dataView, offset, size) {\n const value = [];\n\n for (let valueIndex = 0; valueIndex < size; valueIndex++) {\n value.push(dataView.getUint8(offset + valueIndex));\n }\n\n return value;\n}\n\nfunction getTagName(tag, tagCode, tagValue) {\n if (!tag) {\n return `undefined-${tagCode}`;\n }\n if (tagIsName(tag)) {\n return tag;\n }\n if (hasDynamicName(tag)) {\n return tag['name'](tagValue);\n }\n return tag['name'];\n}\n\nfunction tagIsName(tag) {\n return typeof tag === 'string';\n}\n\nfunction hasDynamicName(tag) {\n return typeof (tag['name']) === 'function';\n}\n\nfunction getTagDescription(tag, tagValue, tags, encoding) {\n if (hasDescriptionProperty(tag)) {\n try {\n return tag['description'](tagValue, tags);\n } catch (error) {\n // Fall through to next handler.\n }\n }\n if (tagValueIsText(tag, tagValue)) {\n return TagDecoder.decode(encoding, tagValue);\n }\n return tagValue;\n}\n\nfunction tagValueIsText(tag, tagValue) {\n return tag && tagValue instanceof Array;\n}\n\nfunction hasDescriptionProperty(tag) {\n return tag && tag['description'] !== undefined;\n}\n\nfunction tagIsRepeatable(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['repeatable'];\n}\n\nfunction tagContainsEncoding(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['encoding_name'] !== undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n 'tiff:Orientation'(value) {\n if (value === '1') {\n return 'Horizontal (normal)';\n }\n if (value === '2') {\n return 'Mirror horizontal';\n }\n if (value === '3') {\n return 'Rotate 180';\n }\n if (value === '4') {\n return 'Mirror vertical';\n }\n if (value === '5') {\n return 'Mirror horizontal and rotate 270 CW';\n }\n if (value === '6') {\n return 'Rotate 90 CW';\n }\n if (value === '7') {\n return 'Mirror horizontal and rotate 90 CW';\n }\n if (value === '8') {\n return 'Rotate 270 CW';\n }\n return value;\n },\n 'exif:GPSLatitude': calculateGPSValue,\n 'exif:GPSLongitude': calculateGPSValue\n};\n\nfunction calculateGPSValue(value) {\n const [degreesString, minutesString] = value.split(',');\n if ((degreesString !== undefined) && (minutesString !== undefined)) {\n const degrees = parseFloat(degreesString);\n const minutes = parseFloat(minutesString);\n const ref = minutesString.charAt(minutesString.length - 1);\n if ((!Number.isNaN(degrees)) && (!Number.isNaN(minutes))) {\n return '' + (degrees + minutes / 60) + ref;\n }\n }\n return value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView, objectAssign} from './utils.js';\nimport XmpTagNames from './xmp-tag-names.js';\nimport DOMParser from './dom-parser.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunks) {\n if (typeof dataView === 'string') {\n return readTags({}, dataView);\n }\n return extractCompleteChunks(dataView, chunks).reduce(readTags, {});\n}\n\n// The first chunk is always the regular XMP document. Then there is something\n// called extended XMP. The extended XMP is also a single XMP document but it\n// can be divided into multiple chunks that need to be combined into one.\nfunction extractCompleteChunks(dataView, chunks) {\n if (chunks.length === 0) {\n return [];\n }\n\n const completeChunks = [combineChunks(dataView, chunks.slice(0, 1))];\n if (chunks.length > 1) {\n completeChunks.push(combineChunks(dataView, chunks.slice(1)));\n }\n\n return completeChunks;\n}\n\nfunction combineChunks(dataView, chunks) {\n const totalLength = chunks.reduce((size, chunk) => size + chunk.length, 0);\n const combinedChunks = new Uint8Array(totalLength);\n let offset = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const slice = dataView.buffer.slice(chunk.dataOffset, chunk.dataOffset + chunk.length);\n combinedChunks.set(new Uint8Array(slice), offset);\n offset += chunk.length;\n }\n\n return new DataView(combinedChunks.buffer);\n}\n\nfunction readTags(tags, chunkDataView) {\n try {\n const {doc, raw} = getDocument(chunkDataView);\n tags._raw = (tags._raw || '') + raw;\n const rdf = getRDF(doc);\n\n return objectAssign(tags, parseXMPObject(convertToObject(rdf, true)));\n } catch (error) {\n return tags;\n }\n}\n\nfunction getDocument(chunkDataView) {\n const Parser = DOMParser.get();\n if (!Parser) {\n console.warn('Warning: DOMParser is not available. It is needed to be able to parse XMP tags.'); // eslint-disable-line no-console\n throw new Error();\n }\n\n const domParser = new Parser();\n const xmlString = typeof chunkDataView === 'string' ? chunkDataView : getStringFromDataView(chunkDataView, 0, chunkDataView.byteLength);\n const doc = domParser.parseFromString(trimXmlSource(xmlString), 'application/xml');\n\n if (doc.documentElement.nodeName === 'parsererror') {\n throw new Error(doc.documentElement.textContent);\n }\n\n return {\n doc,\n raw: xmlString,\n };\n}\n\nfunction trimXmlSource(xmlSource) {\n return xmlSource.replace(/^.+(<\\?xpacket begin)/, '$1').replace(/(<\\?xpacket end=\".*\"\\?>).+$/, '$1');\n}\n\nfunction getRDF(node) {\n for (let i = 0; i < node.childNodes.length; i++) {\n if (node.childNodes[i].tagName === 'x:xmpmeta') {\n return getRDF(node.childNodes[i]);\n }\n if (node.childNodes[i].tagName === 'rdf:RDF') {\n return node.childNodes[i];\n }\n }\n\n throw new Error();\n}\n\nfunction convertToObject(node, isTopNode = false) {\n const childNodes = getChildNodes(node);\n\n if (hasTextOnlyContent(childNodes)) {\n if (isTopNode) {\n return {};\n }\n return getTextValue(childNodes[0]);\n }\n\n return getElementsFromNodes(childNodes);\n}\n\nfunction getChildNodes(node) {\n const elements = [];\n\n for (let i = 0; i < node.childNodes.length; i++) {\n elements.push(node.childNodes[i]);\n }\n\n return elements;\n}\n\nfunction hasTextOnlyContent(nodes) {\n return (nodes.length === 1) && (nodes[0].nodeName === '#text');\n}\n\nfunction getTextValue(node) {\n return node.nodeValue;\n}\n\nfunction getElementsFromNodes(nodes) {\n const elements = {};\n\n nodes.forEach((node) => {\n if (isElement(node)) {\n const nodeElement = getElementFromNode(node);\n\n if (elements[node.nodeName] !== undefined) {\n if (!Array.isArray(elements[node.nodeName])) {\n elements[node.nodeName] = [elements[node.nodeName]];\n }\n elements[node.nodeName].push(nodeElement);\n } else {\n elements[node.nodeName] = nodeElement;\n }\n }\n });\n\n return elements;\n}\n\nfunction isElement(node) {\n return (node.nodeName) && (node.nodeName !== '#text');\n}\n\nfunction getElementFromNode(node) {\n return {\n attributes: getAttributes(node),\n value: convertToObject(node)\n };\n}\n\nfunction getAttributes(element) {\n const attributes = {};\n\n for (let i = 0; i < element.attributes.length; i++) {\n attributes[element.attributes[i].nodeName] = decodeURIComponent(escape(element.attributes[i].value));\n }\n\n return attributes;\n}\n\nfunction parseXMPObject(xmpObject) {\n const tags = {};\n\n if (typeof xmpObject === 'string') {\n return xmpObject;\n }\n\n for (const nodeName in xmpObject) {\n let nodes = xmpObject[nodeName];\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n nodes.forEach((node) => {\n objectAssign(tags, parseNodeAttributesAsTags(node.attributes));\n if (typeof node.value === 'object') {\n objectAssign(tags, parseNodeChildrenAsTags(node.value));\n }\n });\n }\n\n return tags;\n}\n\nfunction parseNodeAttributesAsTags(attributes) {\n const tags = {};\n\n for (const name in attributes) {\n if (isTagAttribute(name)) {\n tags[getLocalName(name)] = {\n value: attributes[name],\n attributes: {},\n description: getDescription(attributes[name], name)\n };\n }\n }\n\n return tags;\n}\n\nfunction isTagAttribute(name) {\n return (name !== 'rdf:parseType') && (!isNamespaceDefinition(name));\n}\n\nfunction isNamespaceDefinition(name) {\n return name.split(':')[0] === 'xmlns';\n}\n\nfunction getLocalName(name) {\n if (/^MicrosoftPhoto(_\\d+_)?:Rating$/i.test(name)) {\n return 'RatingPercent';\n }\n return name.split(':')[1];\n}\n\nfunction getDescription(value, name = undefined) {\n if (Array.isArray(value)) {\n return getDescriptionOfArray(value);\n }\n if (typeof value === 'object') {\n return getDescriptionOfObject(value);\n }\n\n try {\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value);\n }\n return decodeURIComponent(escape(value));\n } catch (error) {\n return value;\n }\n}\n\nfunction getDescriptionOfArray(value) {\n return value.map((item) => {\n if (item.value !== undefined) {\n return getDescription(item.value);\n }\n return getDescription(item);\n }).join(', ');\n}\n\nfunction getDescriptionOfObject(value) {\n const descriptions = [];\n\n for (const key in value) {\n descriptions.push(`${getClearTextKey(key)}: ${getDescription(value[key].value)}`);\n }\n\n return descriptions.join('; ');\n}\n\nfunction getClearTextKey(key) {\n if (key === 'CiAdrCity') {\n return 'CreatorCity';\n }\n if (key === 'CiAdrCtry') {\n return 'CreatorCountry';\n }\n if (key === 'CiAdrExtadr') {\n return 'CreatorAddress';\n }\n if (key === 'CiAdrPcode') {\n return 'CreatorPostalCode';\n }\n if (key === 'CiAdrRegion') {\n return 'CreatorRegion';\n }\n if (key === 'CiEmailWork') {\n return 'CreatorWorkEmail';\n }\n if (key === 'CiTelWork') {\n return 'CreatorWorkPhone';\n }\n if (key === 'CiUrlWork') {\n return 'CreatorWorkUrl';\n }\n return key;\n}\n\nfunction parseNodeChildrenAsTags(children) {\n const tags = {};\n\n for (const name in children) {\n if (!isNamespaceDefinition(name)) {\n tags[getLocalName(name)] = parseNodeAsTag(children[name], name);\n }\n }\n\n return tags;\n}\n\nfunction parseNodeAsTag(node, name) {\n if (hasNestedSimpleRdfDescription(node)) {\n return parseNodeAsSimpleRdfDescription(node, name);\n }\n if (hasNestedStructureRdfDescription(node)) {\n return parseNodeAsStructureRdfDescription(node, name);\n }\n if (isCompactStructure(node)) {\n return parseNodeAsCompactStructure(node, name);\n }\n if (isArray(node)) {\n return parseNodeAsArray(node, name);\n }\n return parseNodeAsSimpleValue(node, name);\n}\n\nfunction hasNestedSimpleRdfDescription(node) {\n return ((node.attributes['rdf:parseType'] === 'Resource') && (node.value['rdf:value'] !== undefined))\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] !== undefined));\n}\n\nfunction parseNodeAsSimpleRdfDescription(node, name) {\n const attributes = parseNodeAttributes(node);\n\n if (node.value['rdf:Description'] !== undefined) {\n node = node.value['rdf:Description'];\n }\n\n objectAssign(attributes, parseNodeAttributes(node), parseNodeChildrenAsAttributes(node));\n\n const value = parseRdfValue(node);\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseNodeAttributes(node) {\n const attributes = {};\n\n for (const name in node.attributes) {\n if ((name !== 'rdf:parseType') && (name !== 'rdf:resource') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.attributes[name];\n }\n }\n\n return attributes;\n}\n\nfunction parseNodeChildrenAsAttributes(node) {\n const attributes = {};\n\n for (const name in node.value) {\n if ((name !== 'rdf:value') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.value[name].value;\n }\n }\n\n return attributes;\n}\n\nfunction parseRdfValue(node) {\n return getURIValue(node.value['rdf:value']) || node.value['rdf:value'].value;\n}\n\nfunction hasNestedStructureRdfDescription(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] === undefined));\n}\n\nfunction parseNodeAsStructureRdfDescription(node, name) {\n const tag = {\n value: {},\n attributes: {}\n };\n\n if (node.value['rdf:Description'] !== undefined) {\n objectAssign(tag.value, parseNodeAttributesAsTags(node.value['rdf:Description'].attributes));\n objectAssign(tag.attributes, parseNodeAttributes(node));\n node = node.value['rdf:Description'];\n }\n\n objectAssign(tag.value, parseNodeChildrenAsTags(node.value));\n\n tag.description = getDescription(tag.value, name);\n\n return tag;\n}\n\nfunction isCompactStructure(node) {\n return (Object.keys(node.value).length === 0)\n && (node.attributes['xml:lang'] === undefined)\n && (node.attributes['rdf:resource'] === undefined);\n}\n\nfunction parseNodeAsCompactStructure(node, name) {\n const value = parseNodeAttributesAsTags(node.attributes);\n\n return {\n value,\n attributes: {},\n description: getDescription(value, name)\n };\n}\n\nfunction isArray(node) {\n return getArrayChild(node.value) !== undefined;\n}\n\nfunction getArrayChild(value) {\n return value['rdf:Bag'] || value['rdf:Seq'] || value['rdf:Alt'];\n}\n\nfunction parseNodeAsArray(node, name) {\n let items = getArrayChild(node.value).value['rdf:li'];\n const attributes = parseNodeAttributes(node);\n const value = [];\n\n if (items === undefined) {\n items = [];\n } else if (!Array.isArray(items)) {\n items = [items];\n }\n\n items.forEach((item) => {\n value.push(parseArrayValue(item));\n });\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseArrayValue(item) {\n if (hasNestedSimpleRdfDescription(item)) {\n return parseNodeAsSimpleRdfDescription(item);\n }\n if (hasNestedStructureRdfDescription(item)) {\n return parseNodeAsStructureRdfDescription(item).value;\n }\n if (isCompactStructure(item)) {\n return parseNodeAsCompactStructure(item).value;\n }\n\n return parseNodeAsSimpleValue(item);\n}\n\nfunction parseNodeAsSimpleValue(node, name) {\n const value = getURIValue(node) || parseXMPObject(node.value);\n\n return {\n value,\n attributes: parseNodeAttributes(node),\n description: getDescription(value, name)\n };\n}\n\nfunction getURIValue(node) {\n return node.attributes && node.attributes['rdf:resource'];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof DOMParser !== 'undefined') {\n return DOMParser;\n }\n try {\n return __non_webpack_require__('@xmldom/xmldom').DOMParser; // eslint-disable-line no-undef\n } catch (error) {\n return undefined;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport const iccTags = {\n 'desc': {\n 'name': 'ICC Description',\n },\n 'cprt': {\n 'name': 'ICC Copyright',\n },\n 'dmdd': {\n 'name': 'ICC Device Model Description',\n },\n 'vued': {\n 'name': 'ICC Viewing Conditions Description',\n },\n 'dmnd': {\n 'name': 'ICC Device Manufacturer for Display',\n },\n 'tech': {\n 'name': 'Technology',\n },\n};\n\nexport const iccProfile = {\n 4: {\n 'name': 'Preferred CMM type',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => value !== null ? toCompany(value) : '',\n },\n 8: {\n 'name': 'Profile Version',\n 'value': (dataView, offset) => {\n return (dataView.getUint8(offset)).toString(10) + '.'\n + (dataView.getUint8(offset + 1) >> 4).toString(10) + '.'\n + (dataView.getUint8(offset + 1) % 16).toString(10);\n }\n },\n 12: {\n 'name': 'Profile/Device class',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => {\n switch (value.toLowerCase()) {\n case 'scnr': return 'Input Device profile';\n case 'mntr': return 'Display Device profile';\n case 'prtr': return 'Output Device profile';\n case 'link': return 'DeviceLink profile';\n case 'abst': return 'Abstract profile';\n case 'spac': return 'ColorSpace profile';\n case 'nmcl': return 'NamedColor profile';\n case 'cenc': return 'ColorEncodingSpace profile';\n case 'mid ': return 'MultiplexIdentification profile';\n case 'mlnk': return 'MultiplexLink profile';\n case 'mvis': return 'MultiplexVisualization profile';\n default: return value;\n }\n }\n },\n 16: {\n 'name': 'Color Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 20: {\n 'name': 'Connection Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 24: {\n 'name': 'ICC Profile Date',\n 'value': (dataView, offset) => parseDate(dataView, offset).toISOString()\n },\n 36: {\n 'name': 'ICC Signature',\n 'value': (dataView, offset) => sliceToString(dataView.buffer.slice(offset, offset + 4))\n },\n 40: {\n 'name': 'Primary Platform',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 48: {\n 'name': 'Device Manufacturer',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 52: {\n 'name': 'Device Model Number',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 64: {\n 'name': 'Rendering Intent',\n 'value': (dataView, offset) => dataView.getUint32(offset),\n 'description': (value) => {\n switch (value) {\n case 0: return 'Perceptual';\n case 1: return 'Relative Colorimetric';\n case 2: return 'Saturation';\n case 3: return 'Absolute Colorimetric';\n default: return value;\n }\n }\n },\n\n 80: {\n 'name': 'Profile Creator',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n};\n\nfunction parseDate(dataView, offset) {\n const year = dataView.getUint16(offset);\n const month = dataView.getUint16(offset + 2) - 1;\n const day = dataView.getUint16(offset + 4);\n const hours = dataView.getUint16(offset + 6);\n const minutes = dataView.getUint16(offset + 8);\n const seconds = dataView.getUint16(offset + 10);\n return new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction toCompany(value) {\n switch (value.toLowerCase()) {\n case 'appl': return 'Apple';\n case 'adbe': return 'Adobe';\n case 'msft': return 'Microsoft';\n case 'sunw': return 'Sun Microsystems';\n case 'sgi': return 'Silicon Graphics';\n case 'tgnt': return 'Taligent';\n default: return value;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\nimport {iccTags, iccProfile} from './icc-tag-names.js';\nimport {getStringFromDataView, getUnicodeStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nconst PROFILE_HEADER_LENGTH = 84;\nconst ICC_TAG_COUNT_OFFSET = 128;\nconst ICC_SIGNATURE = 'acsp';\nconst TAG_TYPE_DESC = 'desc';\nconst TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE = 'mluc';\nconst TAG_TYPE_TEXT = 'text';\nconst TAG_TYPE_SIGNATURE = 'sig ';\nconst TAG_TABLE_SINGLE_TAG_DATA = 12;\n\n// ICC profile data can be longer than application segment max length of ~64k.\n// so it can be split into multiple APP2 segments. Each segment includes\n// total chunk count and chunk number.\n// Here we read all chunks into single continious array of bytes.\nfunction read(dataView, iccData) {\n try {\n const totalIccProfileLength = iccData.reduce((sum, icc) => sum + icc.length, 0);\n\n const iccBinaryData = new Uint8Array(totalIccProfileLength);\n let offset = 0;\n const buffer = getBuffer(dataView);\n\n for (let chunkNumber = 1; chunkNumber <= iccData.length; chunkNumber++) {\n const iccDataChunk = iccData.find((x) => x.chunkNumber === chunkNumber);\n if (!iccDataChunk) {\n throw new Error(`ICC chunk ${chunkNumber} not found`);\n }\n\n const data = buffer.slice(iccDataChunk.offset, iccDataChunk.offset + iccDataChunk.length);\n const chunkData = new Uint8Array(data);\n\n iccBinaryData.set(chunkData, offset);\n offset += chunkData.length;\n }\n\n return parseTags(new DataView(iccBinaryData.buffer));\n } catch (error) {\n return {};\n }\n}\n\nfunction getBuffer(dataView) {\n if (Array.isArray(dataView)) {\n return (new DataView(Uint8Array.from(dataView).buffer)).buffer;\n }\n return dataView.buffer;\n}\n\nfunction iccDoesNotHaveTagCount(buffer) {\n return buffer.length < (ICC_TAG_COUNT_OFFSET + 4);\n}\n\nfunction hasTagsData(buffer, tagHeaderOffset) {\n return buffer.length < tagHeaderOffset + TAG_TABLE_SINGLE_TAG_DATA;\n}\n\nexport function parseTags(dataView) {\n const buffer = dataView.buffer;\n\n const length = dataView.getUint32();\n if (dataView.byteLength !== length) {\n throw new Error('ICC profile length not matching');\n }\n\n if (dataView.length < PROFILE_HEADER_LENGTH) {\n throw new Error('ICC profile too short');\n }\n\n const tags = {};\n\n const iccProfileKeys = Object.keys(iccProfile);\n for (let i = 0; i < iccProfileKeys.length; i++) {\n const offset = iccProfileKeys[i];\n const profileEntry = iccProfile[offset];\n const value = profileEntry.value(dataView, parseInt(offset, 10));\n let description = value;\n if (profileEntry.description) {\n description = profileEntry.description(value);\n }\n\n tags[profileEntry.name] = {\n value,\n description\n };\n }\n\n const signature = sliceToString(buffer.slice(36, 40));\n if (signature !== ICC_SIGNATURE) {\n throw new Error('ICC profile: missing signature');\n }\n\n /* ICC data is incomplete but we have header parsed so lets return it */\n if (iccDoesNotHaveTagCount(buffer)) {\n return tags;\n }\n\n const tagCount = dataView.getUint32(128);\n let tagHeaderOffset = 132;\n\n for (let i = 0; i < tagCount; i++) {\n if (hasTagsData(buffer, tagHeaderOffset)) {\n // Tags are corrupted (offset too far), return what we parsed until now\n return tags;\n }\n const tagSignature = getStringFromDataView(dataView, tagHeaderOffset, 4);\n const tagOffset = dataView.getUint32(tagHeaderOffset + 4);\n const tagSize = dataView.getUint32(tagHeaderOffset + 8);\n\n if (tagOffset > buffer.length) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n const tagType = getStringFromDataView(dataView, tagOffset, 4);\n\n if (tagType === TAG_TYPE_DESC) {\n const tagValueSize = dataView.getUint32(tagOffset + 8);\n if (tagValueSize > tagSize) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n\n const val = sliceToString(buffer.slice(tagOffset + 12, tagOffset + tagValueSize + 11));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE) {\n const numRecords = dataView.getUint32(tagOffset + 8);\n const recordSize = dataView.getUint32(tagOffset + 12);\n let offset = tagOffset + 16;\n const val = [];\n for (let recordNum = 0; recordNum < numRecords; recordNum++) {\n const languageCode = getStringFromDataView(dataView, offset + 0, 2);\n const countryCode = getStringFromDataView(dataView, offset + 2, 2);\n const textLength = dataView.getUint32(offset + 4);\n const textOffset = dataView.getUint32(offset + 8);\n\n const text = getUnicodeStringFromDataView(dataView, tagOffset + textOffset, textLength);\n val.push({languageCode, countryCode, text});\n offset += recordSize;\n }\n if (numRecords === 1) {\n addTag(tags, tagSignature, val[0].text);\n } else {\n const valObj = {};\n for (let valIndex = 0; valIndex < val.length; valIndex++) {\n valObj[`${val[valIndex].languageCode}-${val[valIndex].countryCode}`] = val[valIndex].text;\n }\n addTag(tags, tagSignature, valObj);\n }\n } else if (tagType === TAG_TYPE_TEXT) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + tagSize - 7));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_SIGNATURE) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + 12));\n addTag(tags, tagSignature, val);\n }\n tagHeaderOffset = tagHeaderOffset + 12;\n }\n\n return tags;\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction addTag(tags, tagSignature, value) {\n if (iccTags[tagSignature]) {\n tags[iccTags[tagSignature].name] = {value, description: value};\n } else {\n tags[tagSignature] = {value, description: value};\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n return {\n 'Image Width': getImageWidth(dataView, fileDataOffset),\n 'Image Height': getImageHeight(dataView, fileDataOffset),\n 'Bit Depth': getBitDepth(dataView, fileDataOffset),\n 'Color Type': getColorType(dataView, fileDataOffset),\n 'Compression': getCompression(dataView, fileDataOffset),\n 'Filter': getFilter(dataView, fileDataOffset),\n 'Interlace': getInterlace(dataView, fileDataOffset)\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset) {\n const OFFSET = 0;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset) {\n const OFFSET = 4;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getBitDepth(dataView, fileDataOffset) {\n const OFFSET = 8;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}`\n };\n}\n\nfunction getColorType(dataView, fileDataOffset) {\n const OFFSET = 9;\n const SIZE = 1;\n const COLOR_TYPES = {\n 0: 'Grayscale',\n 2: 'RGB',\n 3: 'Palette',\n 4: 'Grayscale with Alpha',\n 6: 'RGB with Alpha'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: COLOR_TYPES[value] || 'Unknown'\n };\n}\n\nfunction getCompression(dataView, fileDataOffset) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Deflate/Inflate' : 'Unknown'\n };\n}\n\nfunction getFilter(dataView, fileDataOffset) {\n const OFFSET = 11;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Adaptive' : 'Unknown'\n };\n}\n\nfunction getInterlace(dataView, fileDataOffset) {\n const OFFSET = 12;\n const SIZE = 1;\n const INTERLACE_TYPES = {\n 0: 'Noninterlaced',\n 1: 'Adam7 Interlace'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: INTERLACE_TYPES[value] || 'Unknown'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {deferInit, getBase64Image} from './utils.js';\n\n// https://exiftool.org/TagNames/EXIF.html#Compression\nconst COMPRESSION_JPEG = [6, 7, 99];\n\nexport default {\n get,\n};\n\nfunction get(dataView, thumbnailTags, tiffHeaderOffset) {\n if (hasJpegThumbnail(thumbnailTags)) {\n thumbnailTags.type = 'image/jpeg';\n const offset = tiffHeaderOffset + thumbnailTags.JPEGInterchangeFormat.value;\n thumbnailTags.image = dataView.buffer.slice(offset, offset + thumbnailTags.JPEGInterchangeFormatLength.value);\n deferInit(thumbnailTags, 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n // There is a small possibility of thumbnails in TIFF format but they are\n // not stored as a self-contained image file and would be much more\n // difficult to extract.\n // https://exiftool.org/forum/index.php?topic=3273.msg14778#msg14778\n\n return thumbnailTags;\n}\n\nfunction hasJpegThumbnail(tags) {\n return tags && ((tags.Compression === undefined) || (COMPRESSION_JPEG.includes(tags.Compression.value)))\n && tags.JPEGInterchangeFormat && tags.JPEGInterchangeFormat.value\n && tags.JPEGInterchangeFormatLength && tags.JPEGInterchangeFormatLength.value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n/**\n * Thrown when no Exif metadata was found for the given image.\n *\n * @param {string} message The error message.\n */\nfunction MetadataMissingError(message) {\n this.name = 'MetadataMissingError';\n this.message = message || 'No Exif data';\n this.stack = (new Error()).stack;\n}\n\nMetadataMissingError.prototype = new Error;\n\nexport default {\n MetadataMissingError,\n};\n","/**\n * ExifReader\n * http://github.com/mattiasw/exifreader\n * Copyright (C) 2011-2021 Mattias Wallander \n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/* global Buffer, __non_webpack_require__ */\n\nimport {objectAssign} from './utils.js';\nimport DataViewWrapper from './dataview.js';\nimport Constants from './constants.js';\nimport {getStringValueFromArray} from './utils.js';\nimport {getCalculatedGpsValue} from './tag-names-utils.js';\nimport ImageHeader from './image-header.js';\nimport Tags from './tags.js';\nimport FileTags from './file-tags.js';\nimport JfifTags from './jfif-tags.js';\nimport IptcTags from './iptc-tags.js';\nimport XmpTags from './xmp-tags.js';\nimport IccTags from './icc-tags.js';\nimport PngFileTags from './png-file-tags.js';\nimport Thumbnail from './thumbnail.js';\nimport exifErrors from './errors.js';\n\nexport default {\n load,\n loadView,\n errors: exifErrors,\n};\n\nexport const errors = exifErrors;\n\nexport function load(data, options) {\n if (isFilePathOrURL(data)) {\n return loadFile(data).then((fileContents) => loadFromData(fileContents, options));\n }\n if (isBrowserFileObject(data)) {\n return loadFileObject(data).then((fileContents) => loadFromData(fileContents, options));\n }\n return loadFromData(data, options);\n}\n\nfunction isFilePathOrURL(data) {\n return typeof data === 'string';\n}\n\nfunction loadFile(filename) {\n if (typeof fetch !== 'undefined') {\n return browserFetchRemoteFile(filename);\n }\n\n if (/^https?:\\/\\//.test(filename)) {\n return nodeFetchRemoteFile(filename);\n }\n\n return loadLocalFile(filename);\n}\n\nfunction browserFetchRemoteFile(url) {\n return fetch(url).then((response) => response.arrayBuffer());\n}\n\nfunction nodeFetchRemoteFile(url) {\n return new Promise((resolve, reject) => {\n const get = requireNodeGet(url);\n get(url, (response) => {\n if ((response.statusCode >= 200) && (response.statusCode <= 299)) {\n const data = [];\n response.on('data', (chunk) => data.push(Buffer.from(chunk)));\n response.on('error', (error) => reject(error));\n response.on('end', () => resolve(Buffer.concat(data)));\n } else {\n reject(`Could not fetch file: ${response.statusCode} ${response.statusMessage}`);\n response.resume();\n }\n }).on('error', (error) => reject(error));\n });\n}\n\nfunction requireNodeGet(url) {\n if (/^https:\\/\\//.test(url)) {\n return __non_webpack_require__('https').get;\n }\n return __non_webpack_require__('http').get;\n}\n\nfunction loadLocalFile(filename) {\n return new Promise((resolve, reject) => {\n const fs = requireNodeFs();\n fs.open(filename, (error, fd) => {\n if (error) {\n reject(error);\n } else {\n fs.stat(filename, (error, stat) => {\n if (error) {\n reject(error);\n } else {\n const buffer = Buffer.alloc(stat.size);\n fs.read(fd, {buffer}, (error) => {\n if (error) {\n reject(error);\n } else {\n fs.close(fd, (error) => {\n if (error) {\n console.warn(`Could not close file ${filename}:`, error); // eslint-disable-line no-console\n }\n resolve(buffer);\n });\n }\n });\n }\n });\n }\n });\n });\n}\n\nfunction requireNodeFs() {\n try {\n return __non_webpack_require__('fs');\n } catch (error) {\n return undefined;\n }\n}\n\nfunction isBrowserFileObject(data) {\n return (typeof window !== 'undefined') && (typeof File !== 'undefined') && (data instanceof File);\n}\n\nfunction loadFileObject(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => resolve(readerEvent.target.result);\n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(file);\n });\n}\n\nfunction loadFromData(data, options) {\n if (isNodeBuffer(data)) {\n // File data read in Node can share the underlying buffer with other\n // data. Therefore it's safest to get a new one to avoid weird bugs.\n data = (new Uint8Array(data)).buffer;\n }\n return loadView(getDataView(data), options);\n}\n\nfunction isNodeBuffer(data) {\n try {\n return Buffer.isBuffer(data);\n } catch (error) {\n return false;\n }\n}\n\nfunction getDataView(data) {\n try {\n return new DataView(data);\n } catch (error) {\n return new DataViewWrapper(data);\n }\n}\n\nexport function loadView(dataView, {expanded = false, includeUnknown = false} = {expanded: false, includeUnknown: false}) {\n let foundMetaData = false;\n let tags = {};\n\n const {\n fileDataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset,\n pngHeaderOffset\n } = ImageHeader.parseAppMarkers(dataView);\n\n if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) {\n foundMetaData = true;\n const readTags = FileTags.read(dataView, fileDataOffset);\n if (expanded) {\n tags.file = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_JFIF && hasJfifData(jfifDataOffset)) {\n foundMetaData = true;\n const readTags = JfifTags.read(dataView, jfifDataOffset);\n if (expanded) {\n tags.jfif = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_EXIF && hasExifData(tiffHeaderOffset)) {\n foundMetaData = true;\n const readTags = Tags.read(dataView, tiffHeaderOffset, includeUnknown);\n if (readTags.Thumbnail) {\n tags.Thumbnail = readTags.Thumbnail;\n delete readTags.Thumbnail;\n }\n\n if (expanded) {\n tags.exif = readTags;\n addGpsGroup(tags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n\n if (Constants.USE_TIFF && Constants.USE_IPTC && readTags['IPTC-NAA'] && !hasIptcData(iptcDataOffset)) {\n const readIptcTags = IptcTags.read(readTags['IPTC-NAA'].value, 0, includeUnknown);\n if (expanded) {\n tags.iptc = readIptcTags;\n } else {\n tags = objectAssign({}, tags, readIptcTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_XMP && readTags['ApplicationNotes'] && !hasXmpData(xmpChunks)) {\n const readXmpTags = XmpTags.read(getStringValueFromArray(readTags['ApplicationNotes'].value));\n if (expanded) {\n tags.xmp = readXmpTags;\n } else {\n delete readXmpTags._raw;\n tags = objectAssign({}, tags, readXmpTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_ICC && readTags['ICC_Profile'] && !hasIccData(iccChunks)) {\n const readIccTags = IccTags.read(\n readTags['ICC_Profile'].value,\n [{\n offset: 0,\n length: readTags['ICC_Profile'].value.length,\n chunkNumber: 1,\n chunksTotal: 1\n }]\n );\n if (expanded) {\n tags.icc = readIccTags;\n } else {\n tags = objectAssign({}, tags, readIccTags);\n }\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_IPTC && hasIptcData(iptcDataOffset)) {\n foundMetaData = true;\n const readTags = IptcTags.read(dataView, iptcDataOffset, includeUnknown);\n if (expanded) {\n tags.iptc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_XMP && hasXmpData(xmpChunks)) {\n foundMetaData = true;\n const readTags = XmpTags.read(dataView, xmpChunks);\n if (expanded) {\n tags.xmp = readTags;\n } else {\n delete readTags._raw;\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if ((Constants.USE_JPEG || Constants.USE_WEBP) && Constants.USE_ICC && hasIccData(iccChunks)) {\n foundMetaData = true;\n const readTags = IccTags.read(dataView, iccChunks);\n if (expanded) {\n tags.icc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_MPF && hasMpfData(mpfDataOffset)) {\n foundMetaData = true;\n const readMpfTags = Tags.readMpf(dataView, mpfDataOffset, includeUnknown);\n if (expanded) {\n tags.mpf = readMpfTags;\n } else {\n tags = objectAssign({}, tags, readMpfTags);\n }\n }\n\n if (Constants.USE_PNG && Constants.USE_PNG_FILE && hasPngFileData(pngHeaderOffset)) {\n foundMetaData = true;\n const readTags = PngFileTags.read(dataView, pngHeaderOffset);\n if (expanded) {\n tags.pngFile = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP)\n && Constants.USE_EXIF\n && Constants.USE_THUMBNAIL\n && Thumbnail.get(dataView, tags.Thumbnail, tiffHeaderOffset);\n if (thumbnail) {\n foundMetaData = true;\n tags.Thumbnail = thumbnail;\n } else {\n delete tags.Thumbnail;\n }\n\n if (!foundMetaData) {\n throw new exifErrors.MetadataMissingError();\n }\n\n return tags;\n}\n\nfunction hasFileData(fileDataOffset) {\n return fileDataOffset !== undefined;\n}\n\nfunction hasJfifData(jfifDataOffset) {\n return jfifDataOffset !== undefined;\n}\n\nfunction hasExifData(tiffHeaderOffset) {\n return tiffHeaderOffset !== undefined;\n}\n\nfunction addGpsGroup(tags) {\n if (tags.exif) {\n if (tags.exif.GPSLatitude && tags.exif.GPSLatitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Latitude = getCalculatedGpsValue(tags.exif.GPSLatitude.value);\n if (tags.exif.GPSLatitudeRef.value.join('') === 'S') {\n tags.gps.Latitude = -tags.gps.Latitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSLongitude && tags.exif.GPSLongitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Longitude = getCalculatedGpsValue(tags.exif.GPSLongitude.value);\n if (tags.exif.GPSLongitudeRef.value.join('') === 'W') {\n tags.gps.Longitude = -tags.gps.Longitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSAltitude && tags.exif.GPSAltitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Altitude = tags.exif.GPSAltitude.value[0] / tags.exif.GPSAltitude.value[1];\n if (tags.exif.GPSAltitudeRef.value === 1) {\n tags.gps.Altitude = -tags.gps.Altitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n }\n}\n\nfunction hasIptcData(iptcDataOffset) {\n return iptcDataOffset !== undefined;\n}\n\nfunction hasXmpData(xmpChunks) {\n return Array.isArray(xmpChunks) && xmpChunks.length > 0;\n}\n\nfunction hasIccData(iccDataOffsets) {\n return Array.isArray(iccDataOffsets) && iccDataOffsets.length > 0;\n}\n\nfunction hasMpfData(mpfDataOffset) {\n return mpfDataOffset !== undefined;\n}\n\nfunction hasPngFileData(pngFileDataOffset) {\n return pngFileDataOffset !== undefined;\n}\n"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","getStringFromDataView","dataView","offset","length","chars","i","byteLength","push","getUint8","getStringValueFromArray","getUnicodeStringFromDataView","getUint16","charArray","map","charCode","String","fromCharCode","join","objectAssign","arguments","property","deferInit","object","initializer","initialized","configurable","apply","writable","getBase64Image","image","btoa","Array","reduce","Uint8Array","data","byte","Buffer","undefined","from","toString","DataView","buffer","readUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt32LE","readInt32BE","bufferTypeIsUnsupported","Error","littleEndian","getStringValue","getEncodedString","encoding","slice","getCalculatedGpsValue","LITTLE_ENDIAN","tiffHeaderOffset","APP1_MARKER","isSOF0Marker","appMarkerPosition","isSOF2Marker","isApp2ICCMarker","APP2_ICC_IDENTIFIER","isApp2MPFMarker","APP2_MPF_IDENTIFIER","isApp0JfifMarker","APP1_EXIF_IDENTIFIER","isApp1ExifMarker","isApp1XmpMarker","APP1_XMP_IDENTIFIER","isXmpIdentifier","isApp1ExtendedXmpMarker","APP1_XMP_EXTENDED_IDENTIFIER","isExtendedXmpIdentifier","getXmpChunkDetails","fieldLength","dataOffset","getExtendedXmpChunkDetails","isApp13PhotoshopMarker","APP13_IPTC_IDENTIFIER","isAppMarker","appMarker","PNG_ID","isPngImageHeaderChunk","isPngXmpChunk","PNG_CHUNK_LENGTH_SIZE","PNG_XMP_PREFIX","getPngXmpDataOffset","PNG_CHUNK_DATA_OFFSET","numberOfNullSeparators","getAtomLength","atomLength","getUint32","extendsToEndOfFile","hasExtendedSize","hasEmptyHighBits","ByteOrder","hasTiffMarker","Tiff","hasAppMarkers","Jpeg","sof0DataOffset","sof2DataOffset","jfifDataOffset","iptcDataOffset","xmpChunks","iccChunks","mpfDataOffset","iccDataOffset","iccDataLength","iccChunkNumber","APP_ID_OFFSET","iccChunksTotal","ICC_CHUNK_NUMBER_OFFSET","chunkNumber","chunksTotal","fileDataOffset","Png","offsets","pngHeaderOffset","heicMajorBrand","HEIC_ID_OFFSET","HEIC_ID","indexOf","Heic","findMetaAtom","metaOffset","metaLength","metaEndOffset","Math","min","ilocOffset","exifItemOffset","colrOffset","itemName","findMetaItems","exifOffset","exifItemIndex","exifPointer","findExifOffset","colorType","findIccChunks","RIFF_ID","WEBP_MARKER","Webp","chunkId","chunkSize","EXIF_IDENTIFIER","typeSizes","tagTypes","getAsciiValue","getByteAt","getAsciiAt","getShortAt","byteOrder","getLongAt","getRationalAt","getUndefinedAt","getSlongAt","getSrationalAt","getIfdPointerAt","getTypeSize","typeName","getInt32","ref","values","num","test","status","mode","name","description","tagNames0thExifIfds","round","formats","isArray","sample","TagNamesCommon","character","pow","sqrt","toFixed","x","y","focalLengths","TagNamesGpsIfd","TagNamesInteroperabilityIfd","TagNamesMpfIfd","getTagValueAt","Types","includeUnknown","tags","readIfd","get0thIfdOffset","read0thIfd","INTEROPERABILITY_IFD_POINTER_KEY","readInteroperabilityIfd","GPS_INFO_IFD_POINTER_KEY","readGpsIfd","EXIF_IFD_POINTER_KEY","readExifIfd","ENTRY_SIZE","images","ceil","attributes","getImageNumberValue","getImageFlags","getImageFormat","getImageType","imageSize","imageOffset","isFirstIndividualImage","dependentImage1EntryNumber","dependentImage2EntryNumber","addMpfImages","entries","size","flags","flagsDescription","imageFormat","type","ifdType","FIELD_COUNT_SIZE","numberOfFields","getNumberOfFields","fieldIndex","tag","readTag","id","nextIfdOffset","tagValue","TAG_TYPE_OFFSET","TAG_COUNT_OFFSET","TAG_VALUE_OFFSET","tagCode","tagType","tagCount","TagNames","tagValueFitsInOffsetSlot","getTagValue","tagValueOffset","tagValueFitsInDataView","asciiValue","decodeURIComponent","escape","error","decodeAsciiValue","string","j","splitNullSeparatedAsciiString","tagName","tagDescription","getDescriptionFromTagValue","count","forceByteType","valueIndex","getLength","numberOfColorComponents","OFFSET","getNumberOfColorComponents","getDataPrecision","getImageHeight","getImageWidth","getSubsampling","components","componentOffset","getComponentIds","getSamplingType","ids","compontent","types","thumbnailWidth","getThumbnailWidth","thumbnailHeight","getThumbnailHeight","getVersion","getResolutionUnit","getXResolution","getYResolution","thumbnail","thumbnailLength","getThumbnail","majorVersion","minorVersion","getResolutionUnitDescription","getCreationDate","getCreationTime","getEncodingName","parts","split","stringValue","character0","charAt","character1","parseInt","bits","duration","substr","intValue","formatVersions","objectDataPreviewFileFormat","n","date","time","parsedTime","Decoder","TextDecoder","decode","parseTags","BYTES_8BIM_SIZE","resourceBlock","getResourceBlock","isNaaResourceBlock","naaBlock","getBlockPadding","getNaaResourceBlock","endOfBlockOffset","tagSize","leadByteIsMissing","IptcTagNames","getTagName","getTagDescription","tagIsRepeatable","tagContainsEncoding","tagIsName","hasDynamicName","hasDescriptionProperty","tagValueIsText","TagDecoder","calculateGPSValue","degreesString","minutesString","degrees","parseFloat","minutes","Number","isNaN","chunks","readTags","completeChunks","combineChunks","extractCompleteChunks","totalLength","chunk","combinedChunks","set","chunkDataView","Parser","DOMParser","__non_webpack_require__","console","warn","domParser","xmlString","doc","parseFromString","replace","documentElement","nodeName","textContent","raw","getDocument","_raw","parseXMPObject","convertToObject","getRDF","node","childNodes","isTopNode","getChildNodes","hasTextOnlyContent","getTextValue","getElementsFromNodes","elements","nodes","nodeValue","forEach","isElement","nodeElement","getAttributes","getElementFromNode","element","xmpObject","parseNodeAttributesAsTags","parseNodeChildrenAsTags","isTagAttribute","getLocalName","getDescription","isNamespaceDefinition","getDescriptionOfArray","getDescriptionOfObject","XmpTagNames","item","descriptions","getClearTextKey","children","parseNodeAsTag","hasNestedSimpleRdfDescription","parseNodeAsSimpleRdfDescription","hasNestedStructureRdfDescription","parseNodeAsStructureRdfDescription","isCompactStructure","parseNodeAsCompactStructure","getArrayChild","items","parseNodeAttributes","parseNodeAsSimpleValue","parseArrayValue","parseNodeAsArray","parseNodeChildrenAsAttributes","getURIValue","parseRdfValue","keys","iccTags","iccProfile","toCompany","toLowerCase","year","month","day","hours","seconds","Date","UTC","parseDate","toISOString","iccData","totalIccProfileLength","sum","icc","iccBinaryData","getBuffer","iccDataChunk","find","chunkData","iccProfileKeys","profileEntry","sliceToString","ICC_SIGNATURE","ICC_TAG_COUNT_OFFSET","iccDoesNotHaveTagCount","tagHeaderOffset","hasTagsData","tagSignature","tagOffset","TAG_TYPE_DESC","tagValueSize","addTag","TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE","numRecords","recordSize","val","recordNum","languageCode","countryCode","textLength","textOffset","text","valObj","valIndex","TAG_TYPE_TEXT","TAG_TYPE_SIGNATURE","getBitDepth","getColorType","getCompression","getFilter","getInterlace","COMPRESSION_JPEG","thumbnailTags","Compression","includes","JPEGInterchangeFormat","JPEGInterchangeFormatLength","MetadataMissingError","message","stack","load","loadView","errors","exifErrors","options","isFilePathOrURL","filename","fetch","then","response","arrayBuffer","url","Promise","resolve","reject","requireNodeGet","statusCode","on","concat","statusMessage","resume","fs","requireNodeFs","open","fd","stat","alloc","read","close","loadLocalFile","fileContents","loadFromData","window","File","isBrowserFileObject","file","reader","FileReader","onload","readerEvent","target","result","onerror","readAsArrayBuffer","isBuffer","isNodeBuffer","DataViewWrapper","getDataView","expanded","foundMetaData","ImageHeader","hasFileData","FileTags","hasJfifData","JfifTags","jfif","hasExifData","Tags","Thumbnail","exif","addGpsGroup","hasIptcData","readIptcTags","IptcTags","iptc","hasXmpData","readXmpTags","XmpTags","xmp","hasIccData","readIccTags","IccTags","hasMpfData","readMpfTags","mpf","hasPngFileData","PngFileTags","pngFile","GPSLatitude","GPSLatitudeRef","gps","Latitude","GPSLongitude","GPSLongitudeRef","Longitude","GPSAltitude","GPSAltitudeRef","Altitude","iccDataOffsets","pngFileDataOffset"],"sourceRoot":""}