{"version":3,"sources":["webpack://ExifReader/webpack/universalModuleDefinition","webpack://ExifReader/webpack/bootstrap","webpack://ExifReader/./src/dom-parser.js","webpack://ExifReader/./src/utils.js","webpack://ExifReader/./src/dataview.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.js","webpack://ExifReader/./src/image-header-tiff.js","webpack://ExifReader/./src/byte-order.js","webpack://ExifReader/./src/types.js","webpack://ExifReader/./src/tag-names-common.js","webpack://ExifReader/./src/tag-names-utils.js","webpack://ExifReader/./src/tag-names-gps-ifd.js","webpack://ExifReader/./src/tag-names-interoperability-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/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/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"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","DOMParser","eval","error","getStringFromDataView","dataView","offset","length","chars","byteLength","push","getUint8","getStringValueFromArray","getUnicodeStringFromDataView","getUint16","charArray","map","charCode","String","fromCharCode","join","objectAssign","arguments","DataView","buffer","undefined","readUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt32LE","readInt32BE","bufferTypeIsUnsupported","Error","littleEndian","isSOF0Marker","appMarkerPosition","isSOF2Marker","isApp2ICCMarker","APP2_ICC_IDENTIFIER","isApp1ExifMarker","APP1_EXIF_IDENTIFIER","isApp1XmpMarker","APP1_XMP_IDENTIFIER","isXmpIdentifier","isApp1ExtendedXmpMarker","APP1_XMP_EXTENDED_IDENTIFIER","isExtendedXmpIdentifier","getXmpChunkDetails","fieldLength","dataOffset","getExtendedXmpChunkDetails","isApp13PhotoshopMarker","APP13_IPTC_IDENTIFIER","isAppMarker","appMarker","isPngImageHeaderChunk","isPngXmpChunk","PNG_CHUNK_LENGTH_SIZE","PNG_XMP_PREFIX","getPngXmpDataOffset","PNG_CHUNK_DATA_OFFSET","numberOfNullSeparators","getAtomLength","atomLength","getUint32","extendsToEndOfFile","hasExtendedSize","hasEmptyHighBits","hasTiffMarker","Tiff","hasAppMarkers","tiffHeaderOffset","Jpeg","sof0DataOffset","sof2DataOffset","iptcDataOffset","xmpChunks","iccChunks","iccDataOffset","iccDataLength","iccChunkNumber","APP_ID_OFFSET","iccChunksTotal","ICC_CHUNK_NUMBER_OFFSET","chunkNumber","chunksTotal","fileDataOffset","PNG_ID","Png","offsets","pngHeaderOffset","heicMajorBrand","HEIC_ID_OFFSET","HEIC_ID","indexOf","Heic","findMetaAtom","metaOffset","metaLength","metaEndOffset","Math","min","exifItemOffset","ilocOffset","findExifItemAndIloc","exifOffset","exifItemIndex","exifPointer","findExifOffset","typeSizes","1","2","3","4","5","7","9","10","13","tagTypes","getAsciiValue","getByteAt","getAsciiAt","getShortAt","byteOrder","getLongAt","getRationalAt","getUndefinedAt","getSlongAt","getSrationalAt","getIfdPointerAt","getTypeSize","typeName","getInt32","getStringValue","getEncodedString","encoding","slice","0","ref","values","num","test","status","description","tagNames0thExifIfds","round","formats","6","Array","isArray","sample","TagNamesCommon","character","pow","sqrt","toFixed","x","y","focalLengths","TagNamesGpsIfd","TagNamesInteroperabilityIfd","getTagValueAt","Types","ByteOrder","tags","readIfd","get0thIfdOffset","read0thIfd","readInteroperabilityIfd","readGpsIfd","readExifIfd","ifdType","FIELD_COUNT_SIZE","numberOfFields","getNumberOfFields","fieldIndex","tag","readTag","id","nextIfdOffset","tagValue","TAG_TYPE_OFFSET","TAG_COUNT_OFFSET","TAG_VALUE_OFFSET","tagCode","tagType","tagCount","tagValueFitsInOffsetSlot","getTagValue","tagValueOffset","tagValueFitsInDataView","asciiValue","decodeURIComponent","escape","decodeAsciiValue","string","j","splitNullSeparatedAsciiString","tagName","tagDescription","TagNames","getDescriptionFromTagValue","type","count","forceByteType","valueIndex","getLength","numberOfColorComponents","OFFSET","getNumberOfColorComponents","getDataPrecision","getImageHeight","getImageWidth","getSubsampling","components","componentOffset","getComponentIds","getSamplingType","ids","compontent","types","getCreationDate","getCreationTime","getEncodingName","parts","split","stringValue","character0","charAt","character1","parseInt","bits","duration","substr","intValue","formatVersions","objectDataPreviewFileFormat","toString","date","time","parsedTime","Decoder","TextDecoder","decode","Uint8Array","from","parseTags","size","BYTES_8BIM_SIZE","resourceBlock","getResourceBlock","isNaaResourceBlock","naaBlock","getBlockPadding","getNaaResourceBlock","endOfBlockOffset","tagSize","leadByteIsMissing","getTagName","IptcTagNames","getTagDescription","tagIsRepeatable","tagContainsEncoding","tagIsName","hasDynamicName","hasDescriptionProperty","tagValueIsText","TagDecoder","calculateGPSValue","degreesString","minutesString","degrees","parseFloat","minutes","Number","isNaN","chunks","readTags","completeChunks","combineChunks","extractCompleteChunks","reduce","totalLength","chunk","combinedChunks","set","chunkDataView","parseXMPObject","convertToObject","getRDF","node","childNodes","Parser","console","warn","domParser","xmlString","doc","parseFromString","replace","documentElement","nodeName","textContent","getDocument","isTopNode","getChildNodes","hasTextOnlyContent","getTextValue","getElementsFromNodes","elements","nodes","nodeValue","forEach","isElement","nodeElement","attributes","getAttributes","getElementFromNode","element","xmpObject","parseNodeAttributesAsTags","parseNodeChildrenAsTags","isTagAttribute","getLocalName","getDescription","isNamespaceDefinition","getDescriptionOfArray","getDescriptionOfObject","XmpTagNames","item","descriptions","getClearTextKey","children","parseNodeAsTag","hasNestedSimpleRdfDescription","parseNodeAsSimpleRdfDescription","hasNestedStructureRdfDescription","parseNodeAttributes","parseNodeAsStructureRdfDescription","keys","isCompactStructure","parseNodeAsCompactStructure","getArrayChild","items","hasNestedArrayValue","parseArrayValue","parseNodeAsArray","getURIValue","parseNodeAsSimpleValue","parseNodeChildrenAsAttributes","parseRdfValue","iccTags","iccProfile","toCompany","8","12","toLowerCase","16","20","24","year","month","day","hours","seconds","Date","UTC","parseDate","toISOString","36","apply","40","48","52","64","80","iccData","totalIccProfileLength","sum","icc","iccBinaryData","iccDataChunk","find","data","chunkData","iccProfileKeys","profileEntry","sliceToString","ICC_TAG_COUNT_OFFSET","iccDoesNotHaveTagCount","tagHeaderOffset","hasTagsData","tagSignature","tagOffset","tagValueSize","addTag","numRecords","recordSize","val","recordNum","languageCode","countryCode","textLength","textOffset","text","valObj","valIndex","getBitDepth","getColorType","getCompression","getFilter","getInterlace","thumbnailTags","Compression","JPEGInterchangeFormat","JPEGInterchangeFormatLength","image","initializer","btoa","byte","Buffer","initialized","configurable","writable","MetadataMissingError","message","stack","errors","load","loadView","exifErrors","options","expanded","isNodeBuffer","getDataView","isBuffer","DataViewWrapper","foundMetaData","ImageHeader","hasFileData","FileTags","file","hasExifData","Tags","Thumbnail","exif","hasIptcData","readIptcTags","IptcTags","iptc","hasXmpData","readXmpTags","XmpTags","xmp","hasIccData","IccTags","hasPngFileData","PngFileTags","pngFile","thumbnail","iccDataOffsets","pngFileDataOffset"],"mappings":"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","file":"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 "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\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 eval('require')('xmldom').DOMParser; // This stops Webpack from replacing the require with a generic import and bundling the module.\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\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","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\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 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.\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 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 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.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 tiffHeaderOffset;\n let iptcDataOffset;\n let xmpChunks;\n let iccChunks;\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_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 (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 tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks\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 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 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 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) {\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} = findExifItemAndIloc(dataView, metaOffset, metaEndOffset);\n if ((exifItemOffset === undefined) || (ilocOffset === undefined)) {\n return {hasAppMarkers: false};\n }\n\n const exifOffset = findExifOffset(dataView, exifItemOffset, ilocOffset, metaEndOffset);\n return {\n hasAppMarkers: exifOffset !== undefined,\n tiffHeaderOffset: exifOffset\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 findExifItemAndIloc(dataView, offset, metaEndOffset) {\n const STRING_SIZE = 4;\n const EXIF_ITEM_INDEX_REL_OFFSET = -4;\n const offsets = {\n exifItemOffset: undefined,\n ilocOffset: undefined\n };\n\n while ((offset + STRING_SIZE <= metaEndOffset)\n && (!offsets.exifItemOffset || !offsets.ilocOffset)) {\n if (getStringFromDataView(dataView, offset, STRING_SIZE) === 'Exif') {\n offsets.exifItemOffset = offset + EXIF_ITEM_INDEX_REL_OFFSET;\n } else if (getStringFromDataView(dataView, offset, STRING_SIZE) === 'iloc') {\n offsets.ilocOffset = 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 (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","/* 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';\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 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.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\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 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\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","/* 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} 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': (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 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': (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 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 {objectAssign} from './utils.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';\n\nconst tagNames0thExifIfds = objectAssign({}, TagNames0thIfd, TagNamesExifIfd);\n\nexport default {\n '0th': tagNames0thExifIfds,\n 'exif': tagNames0thExifIfds,\n 'gps': TagNamesGpsIfd,\n 'interoperability': TagNamesInteroperabilityIfd\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 {objectAssign} from './utils.js';\nimport ByteOrder from './byte-order.js';\nimport Types from './types.js';\nimport TagNames from './tag-names.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};\n\nfunction read(dataView, tiffHeaderOffset) {\n const byteOrder = ByteOrder.getByteOrder(dataView, tiffHeaderOffset);\n let tags = read0thIfd(dataView, tiffHeaderOffset, byteOrder);\n tags = readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder);\n tags = readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder);\n tags = readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder);\n\n return tags;\n}\n\nfunction read0thIfd(dataView, tiffHeaderOffset, byteOrder) {\n return readIfd(dataView, '0th', tiffHeaderOffset, get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder), byteOrder);\n}\n\nfunction get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder) {\n return tiffHeaderOffset + Types.getLongAt(dataView, tiffHeaderOffset + 4, byteOrder);\n}\n\nfunction readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder) {\n if (tags[EXIF_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, 'exif', tiffHeaderOffset, tiffHeaderOffset + tags[EXIF_IFD_POINTER_KEY].value, byteOrder));\n }\n\n return tags;\n}\n\nfunction readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder) {\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));\n }\n\n return tags;\n}\n\nfunction readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder) {\n if (tags[INTEROPERABILITY_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, 'interoperability', tiffHeaderOffset, tiffHeaderOffset + tags[INTEROPERABILITY_IFD_POINTER_KEY].value, byteOrder));\n }\n\n return tags;\n}\n\nfunction readIfd(dataView, ifdType, tiffHeaderOffset, offset, byteOrder) {\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);\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 (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);\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) {\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) {\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 {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) {\n try {\n if (Array.isArray(dataView)) {\n return parseTags(new DataView(Uint8Array.from(dataView).buffer), {size: dataView.length}, 0);\n }\n const {naaBlock, dataOffset: newDataOffset} = getNaaResourceBlock(dataView, dataOffset);\n return parseTags(dataView, naaBlock, newDataOffset);\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) {\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);\n\n if (tag === null) {\n break;\n }\n\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 dataOffset += TAG_HEADER_SIZE + tagSize;\n }\n\n return tags;\n}\n\nfunction readTag(dataView, dataOffset, tags, encoding) {\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 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 = getDocument(chunkDataView);\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 doc;\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 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)}: ${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 } else if (hasNestedStructureRdfDescription(node)) {\n return parseNodeAsStructureRdfDescription(node, name);\n } else if (isCompactStructure(node)) {\n return parseNodeAsCompactStructure(node, name);\n } else 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['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\n if (hasNestedArrayValue(item)) {\n return parseNodeChildrenAsTags(item.value);\n }\n\n return {\n value: item.value,\n attributes: parseNodeAttributes(item),\n description: getDescription(item.value)\n };\n}\n\nfunction hasNestedArrayValue(node) {\n return node.attributes['rdf:parseType'] === 'Resource';\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\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 = dataView.buffer;\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 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} from './utils.js';\n\nconst COMPRESSION_JPEG = 6;\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) || (tags.Compression.value === COMPRESSION_JPEG))\n && tags.JPEGInterchangeFormat && tags.JPEGInterchangeFormat.value\n && tags.JPEGInterchangeFormatLength && tags.JPEGInterchangeFormatLength.value;\n}\n\nfunction 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","/* 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-2020 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\nimport {objectAssign} from './utils.js';\nimport DataViewWrapper from './dataview.js';\nimport Constants from './constants.js';\nimport {getStringValueFromArray} from './utils.js';\nimport ImageHeader from './image-header.js';\nimport Tags from './tags.js';\nimport FileTags from './file-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 = {expanded: false}) {\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); // eslint-disable-line no-undef\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, options = {expanded: false}) {\n let foundMetaData = false;\n let tags = {};\n\n const {fileDataOffset, tiffHeaderOffset, iptcDataOffset, xmpChunks, iccChunks, pngHeaderOffset} = 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 (options.expanded) {\n tags.file = 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);\n if (readTags.Thumbnail) {\n tags.Thumbnail = readTags.Thumbnail;\n delete readTags.Thumbnail;\n }\n\n if (options.expanded) {\n tags.exif = readTags;\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);\n if (options.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 (options.expanded) {\n tags.xmp = readXmpTags;\n } else {\n tags = objectAssign({}, tags, readXmpTags);\n }\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_IPTC && hasIptcData(iptcDataOffset)) {\n foundMetaData = true;\n const readTags = IptcTags.read(dataView, iptcDataOffset);\n if (options.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 (options.expanded) {\n tags.xmp = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_ICC && hasIccData(iccChunks)) {\n foundMetaData = true;\n const readTags = IccTags.read(dataView, iccChunks);\n if (options.expanded) {\n tags.icc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\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 (options.expanded) {\n tags.pngFile = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n const thumbnail = Constants.USE_JPEG\n && Constants.USE_EXIF\n && Constants.USE_THUMBNAIL\n && Thumbnail.get(dataView, tags.Thumbnail, tiffHeaderOffset);\n if (thumbnail) {\n tags.Thumbnail = thumbnail;\n foundMetaData = true;\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 hasExifData(tiffHeaderOffset) {\n return tiffHeaderOffset !== undefined;\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 hasPngFileData(pngFileDataOffset) {\n return pngFileDataOffset !== undefined;\n}\n"],"sourceRoot":""}