{
  "version": 3,
  "sources": ["../../node_modules/localforage/dist/localforage.js", "../../src/app/workers/sync-worker/sync-worker-impl.ts", "../../src/app/util.ts", "../../src/app/services/crc.ts", "../../src/app/workers/sync-worker/sync.worker.ts"],
  "sourcesContent": ["/*!\n    localForage -- Offline Storage, Improved\n    Version 1.9.0\n    https://localforage.github.io/localForage\n    (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nvar Mutation = global.MutationObserver || global.WebKitMutationObserver;\n\nvar scheduleDrain;\n\n{\n  if (Mutation) {\n    var called = 0;\n    var observer = new Mutation(nextTick);\n    var element = global.document.createTextNode('');\n    observer.observe(element, {\n      characterData: true\n    });\n    scheduleDrain = function () {\n      element.data = (called = ++called % 2);\n    };\n  } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {\n    var channel = new global.MessageChannel();\n    channel.port1.onmessage = nextTick;\n    scheduleDrain = function () {\n      channel.port2.postMessage(0);\n    };\n  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n    scheduleDrain = function () {\n\n      // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n      // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n      var scriptEl = global.document.createElement('script');\n      scriptEl.onreadystatechange = function () {\n        nextTick();\n\n        scriptEl.onreadystatechange = null;\n        scriptEl.parentNode.removeChild(scriptEl);\n        scriptEl = null;\n      };\n      global.document.documentElement.appendChild(scriptEl);\n    };\n  } else {\n    scheduleDrain = function () {\n      setTimeout(nextTick, 0);\n    };\n  }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n  draining = true;\n  var i, oldQueue;\n  var len = queue.length;\n  while (len) {\n    oldQueue = queue;\n    queue = [];\n    i = -1;\n    while (++i < len) {\n      oldQueue[i]();\n    }\n    len = queue.length;\n  }\n  draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n  if (queue.push(task) === 1 && !draining) {\n    scheduleDrain();\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n  if (typeof resolver !== 'function') {\n    throw new TypeError('resolver must be a function');\n  }\n  this.state = PENDING;\n  this.queue = [];\n  this.outcome = void 0;\n  if (resolver !== INTERNAL) {\n    safelyResolveThenable(this, resolver);\n  }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n  return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n  if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n    typeof onRejected !== 'function' && this.state === REJECTED) {\n    return this;\n  }\n  var promise = new this.constructor(INTERNAL);\n  if (this.state !== PENDING) {\n    var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n    unwrap(promise, resolver, this.outcome);\n  } else {\n    this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n  }\n\n  return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n  this.promise = promise;\n  if (typeof onFulfilled === 'function') {\n    this.onFulfilled = onFulfilled;\n    this.callFulfilled = this.otherCallFulfilled;\n  }\n  if (typeof onRejected === 'function') {\n    this.onRejected = onRejected;\n    this.callRejected = this.otherCallRejected;\n  }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n  handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n  unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n  handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n  unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n  immediate(function () {\n    var returnValue;\n    try {\n      returnValue = func(value);\n    } catch (e) {\n      return handlers.reject(promise, e);\n    }\n    if (returnValue === promise) {\n      handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n    } else {\n      handlers.resolve(promise, returnValue);\n    }\n  });\n}\n\nhandlers.resolve = function (self, value) {\n  var result = tryCatch(getThen, value);\n  if (result.status === 'error') {\n    return handlers.reject(self, result.value);\n  }\n  var thenable = result.value;\n\n  if (thenable) {\n    safelyResolveThenable(self, thenable);\n  } else {\n    self.state = FULFILLED;\n    self.outcome = value;\n    var i = -1;\n    var len = self.queue.length;\n    while (++i < len) {\n      self.queue[i].callFulfilled(value);\n    }\n  }\n  return self;\n};\nhandlers.reject = function (self, error) {\n  self.state = REJECTED;\n  self.outcome = error;\n  var i = -1;\n  var len = self.queue.length;\n  while (++i < len) {\n    self.queue[i].callRejected(error);\n  }\n  return self;\n};\n\nfunction getThen(obj) {\n  // Make sure we only access the accessor once as required by the spec\n  var then = obj && obj.then;\n  if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n    return function appyThen() {\n      then.apply(obj, arguments);\n    };\n  }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n  // Either fulfill, reject or reject with error\n  var called = false;\n  function onError(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.reject(self, value);\n  }\n\n  function onSuccess(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.resolve(self, value);\n  }\n\n  function tryToUnwrap() {\n    thenable(onSuccess, onError);\n  }\n\n  var result = tryCatch(tryToUnwrap);\n  if (result.status === 'error') {\n    onError(result.value);\n  }\n}\n\nfunction tryCatch(func, value) {\n  var out = {};\n  try {\n    out.value = func(value);\n    out.status = 'success';\n  } catch (e) {\n    out.status = 'error';\n    out.value = e;\n  }\n  return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n  if (value instanceof this) {\n    return value;\n  }\n  return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n  var promise = new this(INTERNAL);\n  return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var values = new Array(len);\n  var resolved = 0;\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    allResolver(iterable[i], i);\n  }\n  return promise;\n  function allResolver(value, i) {\n    self.resolve(value).then(resolveFromAll, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n    function resolveFromAll(outValue) {\n      values[i] = outValue;\n      if (++resolved === len && !called) {\n        called = true;\n        handlers.resolve(promise, values);\n      }\n    }\n  }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    resolver(iterable[i]);\n  }\n  return promise;\n  function resolver(value) {\n    self.resolve(value).then(function (response) {\n      if (!called) {\n        called = true;\n        handlers.resolve(promise, response);\n      }\n    }, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n  }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n  global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n    /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n    try {\n        if (typeof indexedDB !== 'undefined') {\n            return indexedDB;\n        }\n        if (typeof webkitIndexedDB !== 'undefined') {\n            return webkitIndexedDB;\n        }\n        if (typeof mozIndexedDB !== 'undefined') {\n            return mozIndexedDB;\n        }\n        if (typeof OIndexedDB !== 'undefined') {\n            return OIndexedDB;\n        }\n        if (typeof msIndexedDB !== 'undefined') {\n            return msIndexedDB;\n        }\n    } catch (e) {\n        return;\n    }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n    try {\n        // Initialize IndexedDB; fall back to vendor-prefixed versions\n        // if needed.\n        if (!idb || !idb.open) {\n            return false;\n        }\n        // We mimic PouchDB here;\n        //\n        // We test for openDatabase because IE Mobile identifies itself\n        // as Safari. Oh the lulz...\n        var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n        var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n        // Safari <10.1 does not meet our requirements for IDB support\n        // (see: https://github.com/pouchdb/pouchdb/issues/5572).\n        // Safari 10.1 shipped with fetch, we can use that to detect it.\n        // Note: this creates issues with `window.fetch` polyfills and\n        // overrides; see:\n        // https://github.com/localForage/localForage/issues/856\n        return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n        // some outdated implementations of IDB that appear on Samsung\n        // and HTC Android devices <4.4 are missing IDBKeyRange\n        // See: https://github.com/mozilla/localForage/issues/128\n        // See: https://github.com/mozilla/localForage/issues/272\n        typeof IDBKeyRange !== 'undefined';\n    } catch (e) {\n        return false;\n    }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n    /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n    parts = parts || [];\n    properties = properties || {};\n    try {\n        return new Blob(parts, properties);\n    } catch (e) {\n        if (e.name !== 'TypeError') {\n            throw e;\n        }\n        var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n        var builder = new Builder();\n        for (var i = 0; i < parts.length; i += 1) {\n            builder.append(parts[i]);\n        }\n        return builder.getBlob(properties.type);\n    }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n    // In the \"nopromises\" build this will just throw if you don't have\n    // a global promise object, but it would throw anyway later.\n    _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n    if (callback) {\n        promise.then(function (result) {\n            callback(null, result);\n        }, function (error) {\n            callback(error);\n        });\n    }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n    if (typeof callback === 'function') {\n        promise.then(callback);\n    }\n\n    if (typeof errorCallback === 'function') {\n        promise[\"catch\"](errorCallback);\n    }\n}\n\nfunction normalizeKey(key) {\n    // Cast the key to a string, as that's all we can set as a key.\n    if (typeof key !== 'string') {\n        console.warn(key + ' used as a key, but it is not a string.');\n        key = String(key);\n    }\n\n    return key;\n}\n\nfunction getCallback() {\n    if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n        return arguments[arguments.length - 1];\n    }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n    var length = bin.length;\n    var buf = new ArrayBuffer(length);\n    var arr = new Uint8Array(buf);\n    for (var i = 0; i < length; i++) {\n        arr[i] = bin.charCodeAt(i);\n    }\n    return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n    return new Promise$1(function (resolve) {\n        var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n        var blob = createBlob(['']);\n        txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n        txn.onabort = function (e) {\n            // If the transaction aborts now its due to not being able to\n            // write to the database, likely due to the disk being full\n            e.preventDefault();\n            e.stopPropagation();\n            resolve(false);\n        };\n\n        txn.oncomplete = function () {\n            var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n            var matchedEdge = navigator.userAgent.match(/Edge\\//);\n            // MS Edge pretends to be Chrome 42:\n            // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n            resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n        };\n    })[\"catch\"](function () {\n        return false; // error, so assume unsupported\n    });\n}\n\nfunction _checkBlobSupport(idb) {\n    if (typeof supportsBlobs === 'boolean') {\n        return Promise$1.resolve(supportsBlobs);\n    }\n    return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n        supportsBlobs = value;\n        return supportsBlobs;\n    });\n}\n\nfunction _deferReadiness(dbInfo) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Create a deferred object representing the current database operation.\n    var deferredOperation = {};\n\n    deferredOperation.promise = new Promise$1(function (resolve, reject) {\n        deferredOperation.resolve = resolve;\n        deferredOperation.reject = reject;\n    });\n\n    // Enqueue the deferred operation.\n    dbContext.deferredOperations.push(deferredOperation);\n\n    // Chain its promise to the database readiness.\n    if (!dbContext.dbReady) {\n        dbContext.dbReady = deferredOperation.promise;\n    } else {\n        dbContext.dbReady = dbContext.dbReady.then(function () {\n            return deferredOperation.promise;\n        });\n    }\n}\n\nfunction _advanceReadiness(dbInfo) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Dequeue a deferred operation.\n    var deferredOperation = dbContext.deferredOperations.pop();\n\n    // Resolve its promise (which is part of the database readiness\n    // chain of promises).\n    if (deferredOperation) {\n        deferredOperation.resolve();\n        return deferredOperation.promise;\n    }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Dequeue a deferred operation.\n    var deferredOperation = dbContext.deferredOperations.pop();\n\n    // Reject its promise (which is part of the database readiness\n    // chain of promises).\n    if (deferredOperation) {\n        deferredOperation.reject(err);\n        return deferredOperation.promise;\n    }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n    return new Promise$1(function (resolve, reject) {\n        dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n        if (dbInfo.db) {\n            if (upgradeNeeded) {\n                _deferReadiness(dbInfo);\n                dbInfo.db.close();\n            } else {\n                return resolve(dbInfo.db);\n            }\n        }\n\n        var dbArgs = [dbInfo.name];\n\n        if (upgradeNeeded) {\n            dbArgs.push(dbInfo.version);\n        }\n\n        var openreq = idb.open.apply(idb, dbArgs);\n\n        if (upgradeNeeded) {\n            openreq.onupgradeneeded = function (e) {\n                var db = openreq.result;\n                try {\n                    db.createObjectStore(dbInfo.storeName);\n                    if (e.oldVersion <= 1) {\n                        // Added when support for blob shims was added\n                        db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n                    }\n                } catch (ex) {\n                    if (ex.name === 'ConstraintError') {\n                        console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n                    } else {\n                        throw ex;\n                    }\n                }\n            };\n        }\n\n        openreq.onerror = function (e) {\n            e.preventDefault();\n            reject(openreq.error);\n        };\n\n        openreq.onsuccess = function () {\n            resolve(openreq.result);\n            _advanceReadiness(dbInfo);\n        };\n    });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n    return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n    return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n    if (!dbInfo.db) {\n        return true;\n    }\n\n    var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n    var isDowngrade = dbInfo.version < dbInfo.db.version;\n    var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n    if (isDowngrade) {\n        // If the version is not the default one\n        // then warn for impossible downgrade.\n        if (dbInfo.version !== defaultVersion) {\n            console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n        }\n        // Align the versions to prevent errors.\n        dbInfo.version = dbInfo.db.version;\n    }\n\n    if (isUpgrade || isNewStore) {\n        // If the store is new then increment the version (if needed).\n        // This will trigger an \"upgradeneeded\" event which is required\n        // for creating a store.\n        if (isNewStore) {\n            var incVersion = dbInfo.db.version + 1;\n            if (incVersion > dbInfo.version) {\n                dbInfo.version = incVersion;\n            }\n        }\n\n        return true;\n    }\n\n    return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n    return new Promise$1(function (resolve, reject) {\n        var reader = new FileReader();\n        reader.onerror = reject;\n        reader.onloadend = function (e) {\n            var base64 = btoa(e.target.result || '');\n            resolve({\n                __local_forage_encoded_blob: true,\n                data: base64,\n                type: blob.type\n            });\n        };\n        reader.readAsBinaryString(blob);\n    });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n    var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n    return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n    return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n    var self = this;\n\n    var promise = self._initReady().then(function () {\n        var dbContext = dbContexts[self._dbInfo.name];\n\n        if (dbContext && dbContext.dbReady) {\n            return dbContext.dbReady;\n        }\n    });\n\n    executeTwoCallbacks(promise, callback, callback);\n    return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n    _deferReadiness(dbInfo);\n\n    var dbContext = dbContexts[dbInfo.name];\n    var forages = dbContext.forages;\n\n    for (var i = 0; i < forages.length; i++) {\n        var forage = forages[i];\n        if (forage._dbInfo.db) {\n            forage._dbInfo.db.close();\n            forage._dbInfo.db = null;\n        }\n    }\n    dbInfo.db = null;\n\n    return _getOriginalConnection(dbInfo).then(function (db) {\n        dbInfo.db = db;\n        if (_isUpgradeNeeded(dbInfo)) {\n            // Reopen the database for upgrading.\n            return _getUpgradedConnection(dbInfo);\n        }\n        return db;\n    }).then(function (db) {\n        // store the latest db reference\n        // in case the db was upgraded\n        dbInfo.db = dbContext.db = db;\n        for (var i = 0; i < forages.length; i++) {\n            forages[i]._dbInfo.db = db;\n        }\n    })[\"catch\"](function (err) {\n        _rejectReadiness(dbInfo, err);\n        throw err;\n    });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n    if (retries === undefined) {\n        retries = 1;\n    }\n\n    try {\n        var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n        callback(null, tx);\n    } catch (err) {\n        if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n            return Promise$1.resolve().then(function () {\n                if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n                    // increase the db version, to create the new ObjectStore\n                    if (dbInfo.db) {\n                        dbInfo.version = dbInfo.db.version + 1;\n                    }\n                    // Reopen the database for upgrading.\n                    return _getUpgradedConnection(dbInfo);\n                }\n            }).then(function () {\n                return _tryReconnect(dbInfo).then(function () {\n                    createTransaction(dbInfo, mode, callback, retries - 1);\n                });\n            })[\"catch\"](callback);\n        }\n\n        callback(err);\n    }\n}\n\nfunction createDbContext() {\n    return {\n        // Running localForages sharing a database.\n        forages: [],\n        // Shared database.\n        db: null,\n        // Database readiness (promise).\n        dbReady: null,\n        // Deferred operations on the database.\n        deferredOperations: []\n    };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n    var self = this;\n    var dbInfo = {\n        db: null\n    };\n\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = options[i];\n        }\n    }\n\n    // Get the current context of the database;\n    var dbContext = dbContexts[dbInfo.name];\n\n    // ...or create a new context.\n    if (!dbContext) {\n        dbContext = createDbContext();\n        // Register the new context in the global container.\n        dbContexts[dbInfo.name] = dbContext;\n    }\n\n    // Register itself as a running localForage in the current context.\n    dbContext.forages.push(self);\n\n    // Replace the default `ready()` function with the specialized one.\n    if (!self._initReady) {\n        self._initReady = self.ready;\n        self.ready = _fullyReady;\n    }\n\n    // Create an array of initialization states of the related localForages.\n    var initPromises = [];\n\n    function ignoreErrors() {\n        // Don't handle errors here,\n        // just makes sure related localForages aren't pending.\n        return Promise$1.resolve();\n    }\n\n    for (var j = 0; j < dbContext.forages.length; j++) {\n        var forage = dbContext.forages[j];\n        if (forage !== self) {\n            // Don't wait for itself...\n            initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n        }\n    }\n\n    // Take a snapshot of the related localForages.\n    var forages = dbContext.forages.slice(0);\n\n    // Initialize the connection process only when\n    // all the related localForages aren't pending.\n    return Promise$1.all(initPromises).then(function () {\n        dbInfo.db = dbContext.db;\n        // Get the connection or open a new one without upgrade.\n        return _getOriginalConnection(dbInfo);\n    }).then(function (db) {\n        dbInfo.db = db;\n        if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n            // Reopen the database for upgrading.\n            return _getUpgradedConnection(dbInfo);\n        }\n        return db;\n    }).then(function (db) {\n        dbInfo.db = dbContext.db = db;\n        self._dbInfo = dbInfo;\n        // Share the final connection amongst related localForages.\n        for (var k = 0; k < forages.length; k++) {\n            var forage = forages[k];\n            if (forage !== self) {\n                // Self is already up-to-date.\n                forage._dbInfo.db = dbInfo.db;\n                forage._dbInfo.version = dbInfo.version;\n            }\n        }\n    });\n}\n\nfunction getItem(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.get(key);\n\n                    req.onsuccess = function () {\n                        var value = req.result;\n                        if (value === undefined) {\n                            value = null;\n                        }\n                        if (_isEncodedBlob(value)) {\n                            value = _decodeBlob(value);\n                        }\n                        resolve(value);\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.openCursor();\n                    var iterationNumber = 1;\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n\n                        if (cursor) {\n                            var value = cursor.value;\n                            if (_isEncodedBlob(value)) {\n                                value = _decodeBlob(value);\n                            }\n                            var result = iterator(value, cursor.key, iterationNumber++);\n\n                            // when the iterator callback returns any\n                            // (non-`undefined`) value, then we stop\n                            // the iteration immediately\n                            if (result !== void 0) {\n                                resolve(result);\n                            } else {\n                                cursor[\"continue\"]();\n                            }\n                        } else {\n                            resolve();\n                        }\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n\n    return promise;\n}\n\nfunction setItem(key, value, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        var dbInfo;\n        self.ready().then(function () {\n            dbInfo = self._dbInfo;\n            if (toString.call(value) === '[object Blob]') {\n                return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n                    if (blobSupport) {\n                        return value;\n                    }\n                    return _encodeBlob(value);\n                });\n            }\n            return value;\n        }).then(function (value) {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n\n                    // The reason we don't _save_ null is because IE 10 does\n                    // not support saving the `null` type in IndexedDB. How\n                    // ironic, given the bug below!\n                    // See: https://github.com/mozilla/localForage/issues/161\n                    if (value === null) {\n                        value = undefined;\n                    }\n\n                    var req = store.put(value, key);\n\n                    transaction.oncomplete = function () {\n                        // Cast to undefined so the value passed to\n                        // callback/promise is the same as what one would get out\n                        // of `getItem()` later. This leads to some weirdness\n                        // (setItem('foo', undefined) will return `null`), but\n                        // it's not my fault localStorage is our baseline and that\n                        // it's weird.\n                        if (value === undefined) {\n                            value = null;\n                        }\n\n                        resolve(value);\n                    };\n                    transaction.onabort = transaction.onerror = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction removeItem(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    // We use a Grunt task to make this safe for IE and some\n                    // versions of Android (including those used by Cordova).\n                    // Normally IE won't like `.delete()` and will insist on\n                    // using `['delete']()`, but we have a build step that\n                    // fixes this for us now.\n                    var req = store[\"delete\"](key);\n                    transaction.oncomplete = function () {\n                        resolve();\n                    };\n\n                    transaction.onerror = function () {\n                        reject(req.error);\n                    };\n\n                    // The request will be also be aborted if we've exceeded our storage\n                    // space.\n                    transaction.onabort = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction clear(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.clear();\n\n                    transaction.oncomplete = function () {\n                        resolve();\n                    };\n\n                    transaction.onabort = transaction.onerror = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction length(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.count();\n\n                    req.onsuccess = function () {\n                        resolve(req.result);\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction key(n, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        if (n < 0) {\n            resolve(null);\n\n            return;\n        }\n\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var advanced = false;\n                    var req = store.openKeyCursor();\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n                        if (!cursor) {\n                            // this means there weren't enough keys\n                            resolve(null);\n\n                            return;\n                        }\n\n                        if (n === 0) {\n                            // We have the first key, return it if that's what they\n                            // wanted.\n                            resolve(cursor.key);\n                        } else {\n                            if (!advanced) {\n                                // Otherwise, ask the cursor to skip ahead n\n                                // records.\n                                advanced = true;\n                                cursor.advance(n);\n                            } else {\n                                // When we get here, we've got the nth key.\n                                resolve(cursor.key);\n                            }\n                        }\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.openKeyCursor();\n                    var keys = [];\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n\n                        if (!cursor) {\n                            resolve(keys);\n                            return;\n                        }\n\n                        keys.push(cursor.key);\n                        cursor[\"continue\"]();\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction dropInstance(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    var currentConfig = this.config();\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n        var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n            var dbContext = dbContexts[options.name];\n            var forages = dbContext.forages;\n            dbContext.db = db;\n            for (var i = 0; i < forages.length; i++) {\n                forages[i]._dbInfo.db = db;\n            }\n            return db;\n        });\n\n        if (!options.storeName) {\n            promise = dbPromise.then(function (db) {\n                _deferReadiness(options);\n\n                var dbContext = dbContexts[options.name];\n                var forages = dbContext.forages;\n\n                db.close();\n                for (var i = 0; i < forages.length; i++) {\n                    var forage = forages[i];\n                    forage._dbInfo.db = null;\n                }\n\n                var dropDBPromise = new Promise$1(function (resolve, reject) {\n                    var req = idb.deleteDatabase(options.name);\n\n                    req.onerror = req.onblocked = function (err) {\n                        var db = req.result;\n                        if (db) {\n                            db.close();\n                        }\n                        reject(err);\n                    };\n\n                    req.onsuccess = function () {\n                        var db = req.result;\n                        if (db) {\n                            db.close();\n                        }\n                        resolve(db);\n                    };\n                });\n\n                return dropDBPromise.then(function (db) {\n                    dbContext.db = db;\n                    for (var i = 0; i < forages.length; i++) {\n                        var _forage = forages[i];\n                        _advanceReadiness(_forage._dbInfo);\n                    }\n                })[\"catch\"](function (err) {\n                    (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n                    throw err;\n                });\n            });\n        } else {\n            promise = dbPromise.then(function (db) {\n                if (!db.objectStoreNames.contains(options.storeName)) {\n                    return;\n                }\n\n                var newVersion = db.version + 1;\n\n                _deferReadiness(options);\n\n                var dbContext = dbContexts[options.name];\n                var forages = dbContext.forages;\n\n                db.close();\n                for (var i = 0; i < forages.length; i++) {\n                    var forage = forages[i];\n                    forage._dbInfo.db = null;\n                    forage._dbInfo.version = newVersion;\n                }\n\n                var dropObjectPromise = new Promise$1(function (resolve, reject) {\n                    var req = idb.open(options.name, newVersion);\n\n                    req.onerror = function (err) {\n                        var db = req.result;\n                        db.close();\n                        reject(err);\n                    };\n\n                    req.onupgradeneeded = function () {\n                        var db = req.result;\n                        db.deleteObjectStore(options.storeName);\n                    };\n\n                    req.onsuccess = function () {\n                        var db = req.result;\n                        db.close();\n                        resolve(db);\n                    };\n                });\n\n                return dropObjectPromise.then(function (db) {\n                    dbContext.db = db;\n                    for (var j = 0; j < forages.length; j++) {\n                        var _forage2 = forages[j];\n                        _forage2._dbInfo.db = db;\n                        _advanceReadiness(_forage2._dbInfo);\n                    }\n                })[\"catch\"](function (err) {\n                    (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n                    throw err;\n                });\n            });\n        }\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar asyncStorage = {\n    _driver: 'asyncStorage',\n    _initStorage: _initStorage,\n    _support: isIndexedDBValid(),\n    iterate: iterate,\n    getItem: getItem,\n    setItem: setItem,\n    removeItem: removeItem,\n    clear: clear,\n    length: length,\n    key: key,\n    keys: keys,\n    dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n    return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n    // Fill the string into a ArrayBuffer.\n    var bufferLength = serializedString.length * 0.75;\n    var len = serializedString.length;\n    var i;\n    var p = 0;\n    var encoded1, encoded2, encoded3, encoded4;\n\n    if (serializedString[serializedString.length - 1] === '=') {\n        bufferLength--;\n        if (serializedString[serializedString.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n\n    var buffer = new ArrayBuffer(bufferLength);\n    var bytes = new Uint8Array(buffer);\n\n    for (i = 0; i < len; i += 4) {\n        encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n        encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n        encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n        encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n        /*jslint bitwise: true */\n        bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n        bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n        bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n    }\n    return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n    // base64-arraybuffer\n    var bytes = new Uint8Array(buffer);\n    var base64String = '';\n    var i;\n\n    for (i = 0; i < bytes.length; i += 3) {\n        /*jslint bitwise: true */\n        base64String += BASE_CHARS[bytes[i] >> 2];\n        base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n        base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n        base64String += BASE_CHARS[bytes[i + 2] & 63];\n    }\n\n    if (bytes.length % 3 === 2) {\n        base64String = base64String.substring(0, base64String.length - 1) + '=';\n    } else if (bytes.length % 3 === 1) {\n        base64String = base64String.substring(0, base64String.length - 2) + '==';\n    }\n\n    return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n    var valueType = '';\n    if (value) {\n        valueType = toString$1.call(value);\n    }\n\n    // Cannot use `value instanceof ArrayBuffer` or such here, as these\n    // checks fail when running the tests using casper.js...\n    //\n    // TODO: See why those tests fail and use a better solution.\n    if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n        // Convert binary arrays to a string and prefix the string with\n        // a special marker.\n        var buffer;\n        var marker = SERIALIZED_MARKER;\n\n        if (value instanceof ArrayBuffer) {\n            buffer = value;\n            marker += TYPE_ARRAYBUFFER;\n        } else {\n            buffer = value.buffer;\n\n            if (valueType === '[object Int8Array]') {\n                marker += TYPE_INT8ARRAY;\n            } else if (valueType === '[object Uint8Array]') {\n                marker += TYPE_UINT8ARRAY;\n            } else if (valueType === '[object Uint8ClampedArray]') {\n                marker += TYPE_UINT8CLAMPEDARRAY;\n            } else if (valueType === '[object Int16Array]') {\n                marker += TYPE_INT16ARRAY;\n            } else if (valueType === '[object Uint16Array]') {\n                marker += TYPE_UINT16ARRAY;\n            } else if (valueType === '[object Int32Array]') {\n                marker += TYPE_INT32ARRAY;\n            } else if (valueType === '[object Uint32Array]') {\n                marker += TYPE_UINT32ARRAY;\n            } else if (valueType === '[object Float32Array]') {\n                marker += TYPE_FLOAT32ARRAY;\n            } else if (valueType === '[object Float64Array]') {\n                marker += TYPE_FLOAT64ARRAY;\n            } else {\n                callback(new Error('Failed to get type for BinaryArray'));\n            }\n        }\n\n        callback(marker + bufferToString(buffer));\n    } else if (valueType === '[object Blob]') {\n        // Conver the blob to a binaryArray and then to a string.\n        var fileReader = new FileReader();\n\n        fileReader.onload = function () {\n            // Backwards-compatible prefix for the blob type.\n            var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n            callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n        };\n\n        fileReader.readAsArrayBuffer(value);\n    } else {\n        try {\n            callback(JSON.stringify(value));\n        } catch (e) {\n            console.error(\"Couldn't convert value into a JSON string: \", value);\n\n            callback(null, e);\n        }\n    }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n    // If we haven't marked this string as being specially serialized (i.e.\n    // something other than serialized JSON), we can just return it and be\n    // done with it.\n    if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n        return JSON.parse(value);\n    }\n\n    // The following code deals with deserializing some kind of Blob or\n    // TypedArray. First we separate out the type of data we're dealing\n    // with from the data itself.\n    var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n    var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n    var blobType;\n    // Backwards-compatible blob type serialization strategy.\n    // DBs created with older versions of localForage will simply not have the blob type.\n    if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n        var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n        blobType = matcher[1];\n        serializedString = serializedString.substring(matcher[0].length);\n    }\n    var buffer = stringToBuffer(serializedString);\n\n    // Return the right type based on the code/type set during\n    // serialization.\n    switch (type) {\n        case TYPE_ARRAYBUFFER:\n            return buffer;\n        case TYPE_BLOB:\n            return createBlob([buffer], { type: blobType });\n        case TYPE_INT8ARRAY:\n            return new Int8Array(buffer);\n        case TYPE_UINT8ARRAY:\n            return new Uint8Array(buffer);\n        case TYPE_UINT8CLAMPEDARRAY:\n            return new Uint8ClampedArray(buffer);\n        case TYPE_INT16ARRAY:\n            return new Int16Array(buffer);\n        case TYPE_UINT16ARRAY:\n            return new Uint16Array(buffer);\n        case TYPE_INT32ARRAY:\n            return new Int32Array(buffer);\n        case TYPE_UINT32ARRAY:\n            return new Uint32Array(buffer);\n        case TYPE_FLOAT32ARRAY:\n            return new Float32Array(buffer);\n        case TYPE_FLOAT64ARRAY:\n            return new Float64Array(buffer);\n        default:\n            throw new Error('Unkown type: ' + type);\n    }\n}\n\nvar localforageSerializer = {\n    serialize: serialize,\n    deserialize: deserialize,\n    stringToBuffer: stringToBuffer,\n    bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n    t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n    var self = this;\n    var dbInfo = {\n        db: null\n    };\n\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n        }\n    }\n\n    var dbInfoPromise = new Promise$1(function (resolve, reject) {\n        // Open the database; the openDatabase API will automatically\n        // create it for us if it doesn't exist.\n        try {\n            dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n        } catch (e) {\n            return reject(e);\n        }\n\n        // Create our key/value table if it doesn't exist.\n        dbInfo.db.transaction(function (t) {\n            createDbTable(t, dbInfo, function () {\n                self._dbInfo = dbInfo;\n                resolve();\n            }, function (t, error) {\n                reject(error);\n            });\n        }, reject);\n    });\n\n    dbInfo.serializer = localforageSerializer;\n    return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n    t.executeSql(sqlStatement, args, callback, function (t, error) {\n        if (error.code === error.SYNTAX_ERR) {\n            t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n                if (!results.rows.length) {\n                    // if the table is missing (was deleted)\n                    // re-create it table and retry\n                    createDbTable(t, dbInfo, function () {\n                        t.executeSql(sqlStatement, args, callback, errorCallback);\n                    }, errorCallback);\n                } else {\n                    errorCallback(t, error);\n                }\n            }, errorCallback);\n        } else {\n            errorCallback(t, error);\n        }\n    }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n                    var result = results.rows.length ? results.rows.item(0).value : null;\n\n                    // Check to see if this is serialized content we need to\n                    // unpack.\n                    if (result) {\n                        result = dbInfo.serializer.deserialize(result);\n                    }\n\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var rows = results.rows;\n                    var length = rows.length;\n\n                    for (var i = 0; i < length; i++) {\n                        var item = rows.item(i);\n                        var result = item.value;\n\n                        // Check to see if this is serialized content\n                        // we need to unpack.\n                        if (result) {\n                            result = dbInfo.serializer.deserialize(result);\n                        }\n\n                        result = iterator(result, item.key, i + 1);\n\n                        // void(0) prevents problems with redefinition\n                        // of `undefined`.\n                        if (result !== void 0) {\n                            resolve(result);\n                            return;\n                        }\n                    }\n\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            // The localStorage API doesn't return undefined values in an\n            // \"expected\" way, so undefined is always cast to null in all\n            // drivers. See: https://github.com/mozilla/localForage/pull/42\n            if (value === undefined) {\n                value = null;\n            }\n\n            // Save the original value to pass to the callback.\n            var originalValue = value;\n\n            var dbInfo = self._dbInfo;\n            dbInfo.serializer.serialize(value, function (value, error) {\n                if (error) {\n                    reject(error);\n                } else {\n                    dbInfo.db.transaction(function (t) {\n                        tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n                            resolve(originalValue);\n                        }, function (t, error) {\n                            reject(error);\n                        });\n                    }, function (sqlError) {\n                        // The transaction failed; check\n                        // to see if it's a quota error.\n                        if (sqlError.code === sqlError.QUOTA_ERR) {\n                            // We reject the callback outright for now, but\n                            // it's worth trying to re-run the transaction.\n                            // Even if the user accepts the prompt to use\n                            // more storage on Safari, this error will\n                            // be called.\n                            //\n                            // Try to re-run the transaction.\n                            if (retriesLeft > 0) {\n                                resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n                                return;\n                            }\n                            reject(sqlError);\n                        }\n                    });\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n    return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                // Ahhh, SQL makes this one soooooo easy.\n                tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var result = results.rows.item(0).c;\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n                    var result = results.rows.length ? results.rows.item(0).key : null;\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var keys = [];\n\n                    for (var i = 0; i < results.rows.length; i++) {\n                        keys.push(results.rows.item(i).key);\n                    }\n\n                    resolve(keys);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n    return new Promise$1(function (resolve, reject) {\n        db.transaction(function (t) {\n            t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n                var storeNames = [];\n\n                for (var i = 0; i < results.rows.length; i++) {\n                    storeNames.push(results.rows.item(i).name);\n                }\n\n                resolve({\n                    db: db,\n                    storeNames: storeNames\n                });\n            }, function (t, error) {\n                reject(error);\n            });\n        }, function (sqlError) {\n            reject(sqlError);\n        });\n    });\n}\n\nfunction dropInstance$1(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    var currentConfig = this.config();\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        promise = new Promise$1(function (resolve) {\n            var db;\n            if (options.name === currentConfig.name) {\n                // use the db reference of the current instance\n                db = self._dbInfo.db;\n            } else {\n                db = openDatabase(options.name, '', '', 0);\n            }\n\n            if (!options.storeName) {\n                // drop all database tables\n                resolve(getAllStoreNames(db));\n            } else {\n                resolve({\n                    db: db,\n                    storeNames: [options.storeName]\n                });\n            }\n        }).then(function (operationInfo) {\n            return new Promise$1(function (resolve, reject) {\n                operationInfo.db.transaction(function (t) {\n                    function dropTable(storeName) {\n                        return new Promise$1(function (resolve, reject) {\n                            t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n                                resolve();\n                            }, function (t, error) {\n                                reject(error);\n                            });\n                        });\n                    }\n\n                    var operations = [];\n                    for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n                        operations.push(dropTable(operationInfo.storeNames[i]));\n                    }\n\n                    Promise$1.all(operations).then(function () {\n                        resolve();\n                    })[\"catch\"](function (e) {\n                        reject(e);\n                    });\n                }, function (sqlError) {\n                    reject(sqlError);\n                });\n            });\n        });\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar webSQLStorage = {\n    _driver: 'webSQLStorage',\n    _initStorage: _initStorage$1,\n    _support: isWebSQLValid(),\n    iterate: iterate$1,\n    getItem: getItem$1,\n    setItem: setItem$1,\n    removeItem: removeItem$1,\n    clear: clear$1,\n    length: length$1,\n    key: key$1,\n    keys: keys$1,\n    dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n    try {\n        return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n        // in IE8 typeof localStorage.setItem === 'object'\n        !!localStorage.setItem;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n    var keyPrefix = options.name + '/';\n\n    if (options.storeName !== defaultConfig.storeName) {\n        keyPrefix += options.storeName + '/';\n    }\n    return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n    var localStorageTestKey = '_localforage_support_test';\n\n    try {\n        localStorage.setItem(localStorageTestKey, true);\n        localStorage.removeItem(localStorageTestKey);\n\n        return false;\n    } catch (e) {\n        return true;\n    }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n    return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n    var self = this;\n    var dbInfo = {};\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = options[i];\n        }\n    }\n\n    dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n    if (!_isLocalStorageUsable()) {\n        return Promise$1.reject();\n    }\n\n    self._dbInfo = dbInfo;\n    dbInfo.serializer = localforageSerializer;\n\n    return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var keyPrefix = self._dbInfo.keyPrefix;\n\n        for (var i = localStorage.length - 1; i >= 0; i--) {\n            var key = localStorage.key(i);\n\n            if (key.indexOf(keyPrefix) === 0) {\n                localStorage.removeItem(key);\n            }\n        }\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n        // If a result was found, parse it from the serialized\n        // string into a JS object. If result isn't truthy, the key\n        // is likely undefined and we'll pass it straight to the\n        // callback.\n        if (result) {\n            result = dbInfo.serializer.deserialize(result);\n        }\n\n        return result;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n    var self = this;\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var keyPrefix = dbInfo.keyPrefix;\n        var keyPrefixLength = keyPrefix.length;\n        var length = localStorage.length;\n\n        // We use a dedicated iterator instead of the `i` variable below\n        // so other keys we fetch in localStorage aren't counted in\n        // the `iterationNumber` argument passed to the `iterate()`\n        // callback.\n        //\n        // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n        var iterationNumber = 1;\n\n        for (var i = 0; i < length; i++) {\n            var key = localStorage.key(i);\n            if (key.indexOf(keyPrefix) !== 0) {\n                continue;\n            }\n            var value = localStorage.getItem(key);\n\n            // If a result was found, parse it from the serialized\n            // string into a JS object. If result isn't truthy, the\n            // key is likely undefined and we'll pass it straight\n            // to the iterator.\n            if (value) {\n                value = dbInfo.serializer.deserialize(value);\n            }\n\n            value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n            if (value !== void 0) {\n                return value;\n            }\n        }\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var result;\n        try {\n            result = localStorage.key(n);\n        } catch (error) {\n            result = null;\n        }\n\n        // Remove the prefix from the key, if a key is found.\n        if (result) {\n            result = result.substring(dbInfo.keyPrefix.length);\n        }\n\n        return result;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys$2(callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var length = localStorage.length;\n        var keys = [];\n\n        for (var i = 0; i < length; i++) {\n            var itemKey = localStorage.key(i);\n            if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n                keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n            }\n        }\n\n        return keys;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n    var self = this;\n    var promise = self.keys().then(function (keys) {\n        return keys.length;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        localStorage.removeItem(dbInfo.keyPrefix + key);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        // Convert undefined values to null.\n        // https://github.com/mozilla/localForage/pull/42\n        if (value === undefined) {\n            value = null;\n        }\n\n        // Save the original value to pass to the callback.\n        var originalValue = value;\n\n        return new Promise$1(function (resolve, reject) {\n            var dbInfo = self._dbInfo;\n            dbInfo.serializer.serialize(value, function (value, error) {\n                if (error) {\n                    reject(error);\n                } else {\n                    try {\n                        localStorage.setItem(dbInfo.keyPrefix + key, value);\n                        resolve(originalValue);\n                    } catch (e) {\n                        // localStorage capacity exceeded.\n                        // TODO: Make this a specific error/event.\n                        if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n                            reject(e);\n                        }\n                        reject(e);\n                    }\n                }\n            });\n        });\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        var currentConfig = this.config();\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        promise = new Promise$1(function (resolve) {\n            if (!options.storeName) {\n                resolve(options.name + '/');\n            } else {\n                resolve(_getKeyPrefix(options, self._defaultConfig));\n            }\n        }).then(function (keyPrefix) {\n            for (var i = localStorage.length - 1; i >= 0; i--) {\n                var key = localStorage.key(i);\n\n                if (key.indexOf(keyPrefix) === 0) {\n                    localStorage.removeItem(key);\n                }\n            }\n        });\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar localStorageWrapper = {\n    _driver: 'localStorageWrapper',\n    _initStorage: _initStorage$2,\n    _support: isLocalStorageValid(),\n    iterate: iterate$2,\n    getItem: getItem$2,\n    setItem: setItem$2,\n    removeItem: removeItem$2,\n    clear: clear$2,\n    length: length$2,\n    key: key$2,\n    keys: keys$2,\n    dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n    return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n    var len = array.length;\n    var i = 0;\n    while (i < len) {\n        if (sameValue(array[i], searchElement)) {\n            return true;\n        }\n        i++;\n    }\n\n    return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n    return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n    INDEXEDDB: asyncStorage,\n    WEBSQL: webSQLStorage,\n    LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n    description: '',\n    driver: DefaultDriverOrder.slice(),\n    name: 'localforage',\n    // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n    // we can use without a prompt.\n    size: 4980736,\n    storeName: 'keyvaluepairs',\n    version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n    localForageInstance[libraryMethod] = function () {\n        var _args = arguments;\n        return localForageInstance.ready().then(function () {\n            return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n        });\n    };\n}\n\nfunction extend() {\n    for (var i = 1; i < arguments.length; i++) {\n        var arg = arguments[i];\n\n        if (arg) {\n            for (var _key in arg) {\n                if (arg.hasOwnProperty(_key)) {\n                    if (isArray(arg[_key])) {\n                        arguments[0][_key] = arg[_key].slice();\n                    } else {\n                        arguments[0][_key] = arg[_key];\n                    }\n                }\n            }\n        }\n    }\n\n    return arguments[0];\n}\n\nvar LocalForage = function () {\n    function LocalForage(options) {\n        _classCallCheck(this, LocalForage);\n\n        for (var driverTypeKey in DefaultDrivers) {\n            if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n                var driver = DefaultDrivers[driverTypeKey];\n                var driverName = driver._driver;\n                this[driverTypeKey] = driverName;\n\n                if (!DefinedDrivers[driverName]) {\n                    // we don't need to wait for the promise,\n                    // since the default drivers can be defined\n                    // in a blocking manner\n                    this.defineDriver(driver);\n                }\n            }\n        }\n\n        this._defaultConfig = extend({}, DefaultConfig);\n        this._config = extend({}, this._defaultConfig, options);\n        this._driverSet = null;\n        this._initDriver = null;\n        this._ready = false;\n        this._dbInfo = null;\n\n        this._wrapLibraryMethodsWithReady();\n        this.setDriver(this._config.driver)[\"catch\"](function () {});\n    }\n\n    // Set any config values for localForage; can be called anytime before\n    // the first API call (e.g. `getItem`, `setItem`).\n    // We loop through options so we don't overwrite existing config\n    // values.\n\n\n    LocalForage.prototype.config = function config(options) {\n        // If the options argument is an object, we use it to set values.\n        // Otherwise, we return either a specified config value or all\n        // config values.\n        if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n            // If localforage is ready and fully initialized, we can't set\n            // any new configuration values. Instead, we return an error.\n            if (this._ready) {\n                return new Error(\"Can't call config() after localforage \" + 'has been used.');\n            }\n\n            for (var i in options) {\n                if (i === 'storeName') {\n                    options[i] = options[i].replace(/\\W/g, '_');\n                }\n\n                if (i === 'version' && typeof options[i] !== 'number') {\n                    return new Error('Database version must be a number.');\n                }\n\n                this._config[i] = options[i];\n            }\n\n            // after all config options are set and\n            // the driver option is used, try setting it\n            if ('driver' in options && options.driver) {\n                return this.setDriver(this._config.driver);\n            }\n\n            return true;\n        } else if (typeof options === 'string') {\n            return this._config[options];\n        } else {\n            return this._config;\n        }\n    };\n\n    // Used to define a custom driver, shared across all instances of\n    // localForage.\n\n\n    LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n        var promise = new Promise$1(function (resolve, reject) {\n            try {\n                var driverName = driverObject._driver;\n                var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n                // A driver name should be defined and not overlap with the\n                // library-defined, default drivers.\n                if (!driverObject._driver) {\n                    reject(complianceError);\n                    return;\n                }\n\n                var driverMethods = LibraryMethods.concat('_initStorage');\n                for (var i = 0, len = driverMethods.length; i < len; i++) {\n                    var driverMethodName = driverMethods[i];\n\n                    // when the property is there,\n                    // it should be a method even when optional\n                    var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n                    if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n                        reject(complianceError);\n                        return;\n                    }\n                }\n\n                var configureMissingMethods = function configureMissingMethods() {\n                    var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n                        return function () {\n                            var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n                            var promise = Promise$1.reject(error);\n                            executeCallback(promise, arguments[arguments.length - 1]);\n                            return promise;\n                        };\n                    };\n\n                    for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n                        var optionalDriverMethod = OptionalDriverMethods[_i];\n                        if (!driverObject[optionalDriverMethod]) {\n                            driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n                        }\n                    }\n                };\n\n                configureMissingMethods();\n\n                var setDriverSupport = function setDriverSupport(support) {\n                    if (DefinedDrivers[driverName]) {\n                        console.info('Redefining LocalForage driver: ' + driverName);\n                    }\n                    DefinedDrivers[driverName] = driverObject;\n                    DriverSupport[driverName] = support;\n                    // don't use a then, so that we can define\n                    // drivers that have simple _support methods\n                    // in a blocking manner\n                    resolve();\n                };\n\n                if ('_support' in driverObject) {\n                    if (driverObject._support && typeof driverObject._support === 'function') {\n                        driverObject._support().then(setDriverSupport, reject);\n                    } else {\n                        setDriverSupport(!!driverObject._support);\n                    }\n                } else {\n                    setDriverSupport(true);\n                }\n            } catch (e) {\n                reject(e);\n            }\n        });\n\n        executeTwoCallbacks(promise, callback, errorCallback);\n        return promise;\n    };\n\n    LocalForage.prototype.driver = function driver() {\n        return this._driver || null;\n    };\n\n    LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n        var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n        executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n        return getDriverPromise;\n    };\n\n    LocalForage.prototype.getSerializer = function getSerializer(callback) {\n        var serializerPromise = Promise$1.resolve(localforageSerializer);\n        executeTwoCallbacks(serializerPromise, callback);\n        return serializerPromise;\n    };\n\n    LocalForage.prototype.ready = function ready(callback) {\n        var self = this;\n\n        var promise = self._driverSet.then(function () {\n            if (self._ready === null) {\n                self._ready = self._initDriver();\n            }\n\n            return self._ready;\n        });\n\n        executeTwoCallbacks(promise, callback, callback);\n        return promise;\n    };\n\n    LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n        var self = this;\n\n        if (!isArray(drivers)) {\n            drivers = [drivers];\n        }\n\n        var supportedDrivers = this._getSupportedDrivers(drivers);\n\n        function setDriverToConfig() {\n            self._config.driver = self.driver();\n        }\n\n        function extendSelfWithDriver(driver) {\n            self._extend(driver);\n            setDriverToConfig();\n\n            self._ready = self._initStorage(self._config);\n            return self._ready;\n        }\n\n        function initDriver(supportedDrivers) {\n            return function () {\n                var currentDriverIndex = 0;\n\n                function driverPromiseLoop() {\n                    while (currentDriverIndex < supportedDrivers.length) {\n                        var driverName = supportedDrivers[currentDriverIndex];\n                        currentDriverIndex++;\n\n                        self._dbInfo = null;\n                        self._ready = null;\n\n                        return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n                    }\n\n                    setDriverToConfig();\n                    var error = new Error('No available storage method found.');\n                    self._driverSet = Promise$1.reject(error);\n                    return self._driverSet;\n                }\n\n                return driverPromiseLoop();\n            };\n        }\n\n        // There might be a driver initialization in progress\n        // so wait for it to finish in order to avoid a possible\n        // race condition to set _dbInfo\n        var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n            return Promise$1.resolve();\n        }) : Promise$1.resolve();\n\n        this._driverSet = oldDriverSetDone.then(function () {\n            var driverName = supportedDrivers[0];\n            self._dbInfo = null;\n            self._ready = null;\n\n            return self.getDriver(driverName).then(function (driver) {\n                self._driver = driver._driver;\n                setDriverToConfig();\n                self._wrapLibraryMethodsWithReady();\n                self._initDriver = initDriver(supportedDrivers);\n            });\n        })[\"catch\"](function () {\n            setDriverToConfig();\n            var error = new Error('No available storage method found.');\n            self._driverSet = Promise$1.reject(error);\n            return self._driverSet;\n        });\n\n        executeTwoCallbacks(this._driverSet, callback, errorCallback);\n        return this._driverSet;\n    };\n\n    LocalForage.prototype.supports = function supports(driverName) {\n        return !!DriverSupport[driverName];\n    };\n\n    LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n        extend(this, libraryMethodsAndProperties);\n    };\n\n    LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n        var supportedDrivers = [];\n        for (var i = 0, len = drivers.length; i < len; i++) {\n            var driverName = drivers[i];\n            if (this.supports(driverName)) {\n                supportedDrivers.push(driverName);\n            }\n        }\n        return supportedDrivers;\n    };\n\n    LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n        // Add a stub for each driver API method that delays the call to the\n        // corresponding driver method until localForage is ready. These stubs\n        // will be replaced by the driver methods as soon as the driver is\n        // loaded, so there is no performance impact.\n        for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n            callWhenReady(this, LibraryMethods[i]);\n        }\n    };\n\n    LocalForage.prototype.createInstance = function createInstance(options) {\n        return new LocalForage(options);\n    };\n\n    return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n", "import localforage from 'localforage';\nimport { getUsedAssets } from '../../util';\nimport { crc32 } from '../../services/crc';\nimport { FlatNotepad } from 'upad-parse/dist';\n\nconst ASSET_STORAGE = localforage.createInstance({\n\tname: 'MicroPad',\n\tstoreName: 'assets'\n});\n\nexport async function getAssetInfoImpl(notepad: FlatNotepad): Promise<{ assets: { [assetRef: string]: number } }> {\n\t// Setup access to our binary assets\n\tawait ASSET_STORAGE.ready();\n\n\tconst notepadAssets = Array.from(getUsedAssets(notepad));\n\n\t// Get assets from storage as byte arrays\n\tconst assetBlobs: Array<Blob | null> = await Promise.all(notepadAssets.map(uuid => ASSET_STORAGE.getItem<Blob>(uuid)))\n\n\tconst assets: Record<string, number> = {};\n\tfor (let i = 0; i < notepadAssets.length; ++i) {\n\t\tconst blob = assetBlobs[i];\n\t\tif (!blob || !blob.size) continue;\n\n\t\tassets[notepadAssets[i]] = crc32(new Uint8Array(await blob.arrayBuffer()));\n\t}\n\n\treturn { assets };\n}\n", "import { filter } from 'rxjs/operators';\nimport { SyntheticEvent } from 'react';\nimport { FlatNotepad } from 'upad-parse/dist';\nimport { ModalOptions } from 'react-materialize';\n\nexport const DEFAULT_MODAL_OPTIONS: ModalOptions = {\n\tonOpenEnd: (modal: HTMLElement) => {\n\t\twindow.MicroPadGlobals.currentModalId = modal.id;\n\t},\n\tonCloseEnd: () => {\n\t\tdelete window.MicroPadGlobals.currentModalId;\n\t}\n};\n\nexport const filterTruthy = <T>() => filter((a: T | undefined | null | false): a is T => !!a);\n\nexport const noEmit = () => filter((_a): _a is never => false);\n\nexport function isDev(includeNextDev: boolean = true): boolean {\n\t/* eslint-disable no-restricted-globals */\n\tconst params = new URLSearchParams(location.search);\n\treturn (\n\t\t!params.get('prod')\n\t\t&& (location.hostname === 'localhost' || location.hostname === '127.0.0.1' || (includeNextDev && location.hostname === 'next.getmicropad.com'))\n\t);\n\t/* eslint-enable no-restricted-globals */\n}\n\nexport function isMobile(): boolean {\n\treturn window.screen.width < 600;\n}\n\nexport function readFileInputEventAsText(event: SyntheticEvent<HTMLInputElement>): Promise<string> {\n\treturn new Promise(resolve => {\n\t\tconst file = event.currentTarget.files![0];\n\t\tconst reader = new FileReader();\n\n\t\treader.onload = () => resolve(reader.result as string);\n\n\t\treader.readAsText(file);\n\t});\n}\n\nexport function fixFileName(filename: string) {\n\treturn filename.replace(/[<>:;,?\"*|/\\\\]+/g, '_');\n}\n\n// Thanks to https://stackoverflow.com/a/105074\nexport function generateGuid(): string {\n\tfunction s4() {\n\t\treturn Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n\t}\n\treturn s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\n\nexport function getAsBase64(blob: Blob): Promise<string> {\n\treturn new Promise<string>(resolve => {\n\t\ttry {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = event => resolve((event.target as any).result);\n\t\t\treader.readAsDataURL(blob);\n\t\t} catch (e) {\n\t\t\tconsole.warn(e);\n\t\t\tresolve('');\n\t\t}\n\t});\n}\n\nexport function getBytes(blob: Blob): Promise<ArrayBuffer> {\n\treturn new Promise(resolve => {\n\t\ttry {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = event => resolve((event.target as any).result);\n\t\t\treader.readAsArrayBuffer(blob);\n\t\t} catch (e) {\n\t\t\tconsole.warn(e);\n\t\t\tresolve(new Uint8Array());\n\t\t}\n\t});\n}\n\nexport function getUsedAssets(notepad: FlatNotepad): Set<string> {\n\treturn new Set(\n\t\tObject.values(notepad.notes).map(n =>\n\t\t\tn.elements\n\t\t\t\t.map(e => e.args.ext)\n\t\t\t\t.filter((a?: string): a is string => !!a)\n\t\t)\n\t\t.reduce((used, cur) => used.concat(cur), [])\n\t);\n}\n\n/**\n * Safely travel through data that could be undefined\n */\nexport function elvis(obj: any): any {\n\tif (obj === undefined || obj === null) obj = { isUndefined: true };\n\n\treturn new Proxy(typeof obj === 'object' ? { ...obj } : obj, {\n\t\tget: (target: object, key: PropertyKey): any => {\n\t\t\t// Thanks to https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript\n\t\t\tconst res = target[key];\n\t\t\tif (!!res) return res instanceof Object ? elvis(res) : res;\n\n\t\t\treturn elvis(undefined);\n\t\t}\n\t});\n}\n\nexport function resolveElvis(obj: any): any {\n\treturn !!obj.isUndefined ? undefined : obj;\n}\n\n// Thanks to http://stackoverflow.com/a/12300351/998467\nexport function dataURItoBlob(dataURI: string) {\n\t// convert base64 to raw binary data held in a string\n\t// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this\n\tlet byteString = atob(dataURI.split(',')[1]);\n\n\t// separate out the mime component\n\tlet mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n\n\t// write the bytes of the string to an ArrayBuffer\n\tlet ab = new ArrayBuffer(byteString.length);\n\tlet ia = new Uint8Array(ab);\n\tfor (let i = 0; i < byteString.length; i++) {\n\t\tia[i] = byteString.charCodeAt(i);\n\t}\n\n\t// write the ArrayBuffer to a blob, and you're done\n\treturn new Blob([ab], { type: mimeString });\n}\n\n// Thanks to https://gist.github.com/nmsdvid/8807205\nexport function debounce(callback: (...args: any[]) => void, time: number) {\n\tlet interval;\n\treturn (...args) => {\n\t\tclearTimeout(interval);\n\t\tinterval = setTimeout(() => {\n\t\t\tinterval = null;\n\t\t\tcallback(...args);\n\t\t}, time);\n\t};\n}\n\nexport function unreachable() {\n\treturn new Error('Unreachable Error!');\n}\n\nexport function noop() {}\n\nexport function openModal(id: string) {\n\tconst modalEl = document.getElementById(id);\n\tif (!modalEl) {\n\t\tthrow new Error(`${id} is not a modal because it doesn't exist in th DOM.`);\n\t}\n\n\tM.Modal.getInstance(modalEl).open();\n}\n", "// Inspired by https://github.com/otherlab/typedarray-crc32\nconst CRC_TABLE = new Uint32Array([\n\t0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,\n\t0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,\n\t0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,\n\t0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,\n\t0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,\n\t0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n\t0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,\n\t0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,\n\t0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,\n\t0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,\n\t0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,\n\t0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n\t0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,\n\t0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,\n\t0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,\n\t0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,\n\t0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,\n\t0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n\t0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,\n\t0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,\n\t0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,\n\t0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,\n\t0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,\n\t0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n\t0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,\n\t0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,\n\t0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,\n\t0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n\t0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,\n\t0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n\t0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,\n\t0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,\n\t0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,\n\t0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,\n\t0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,\n\t0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n\t0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,\n\t0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,\n\t0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,\n\t0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,\n\t0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,\n\t0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n\t0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,\n\t0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,\n\t0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,\n\t0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,\n\t0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,\n\t0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n\t0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,\n\t0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,\n\t0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,\n\t0x2d02ef8d\n]);\n\nexport function crc32(data: Uint8Array): number {\n\tlet crc = -1;\n\tfor (let n = 0; n < data.length; ++n) {\n\t\tcrc = CRC_TABLE[(crc ^ data[n]) & 0xff] ^ (crc >>> 8);\n\t}\n\n\t// Send via >>> 0 to give us an unsigned value at the end\n\treturn (crc ^ -1) >>> 0;\n}\n", "import { getAssetInfoImpl } from './sync-worker-impl';\n\nonmessage = async message => {\n\tswitch (message.data?.type) {\n\t\tcase 'getAssetInfo':\n\t\t\tgetAssetInfo(message.data.flatNotepad)\n\t\t\t\t.then(data => respond(message.data.cid, data))\n\t\t\t\t.catch(error => respond(message.data.cid, { error }))\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown message: ${JSON.stringify(message.data)}`);\n\t}\n};\n\nfunction getAssetInfo(flatNotepad) {\n\treturn getAssetInfoImpl(flatNotepad);\n}\n\nfunction respond(cid, data) {\n\tpostMessage({ cid, ...data })\n}\n"],
  "mappings": "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,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,UAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,WAChD,SAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,UAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,UAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,WAChD,SAAY,WAAY,WAAY,WAAY,SAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,UAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,UAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,WAChD,SAAY,WAAY,WAAY,WAAY,SAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,UAAY,WAAY,WAAY,WAChD,UAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,SAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,UAAY,WAChD,WAAY,WAAY,UAAY,WAAY,WAChD,WAAY,UAAY,WAAY,WAAY,WAChD,YAGM,YAAe,EAA0B,CAC/C,GAAI,GAAM,GACV,OAAS,GAAI,EAAG,EAAI,EAAK,OAAQ,EAAE,EAClC,EAAM,GAAW,GAAM,EAAK,IAAM,KAAS,IAAQ,EAIpD,MAAQ,GAAM,MAAQ,EF1DvB,GAAM,IAAgB,WAAY,eAAe,CAChD,KAAM,WACN,UAAW,WAGZ,kBAAuC,EAA2E,CAEjH,KAAM,IAAc,QAEpB,GAAM,GAAgB,MAAM,KAAK,GAAc,IAGzC,EAAiC,KAAM,SAAQ,IAAI,EAAc,IAAI,GAAQ,GAAc,QAAc,KAEzG,EAAiC,GACvC,OAAS,GAAI,EAAG,EAAI,EAAc,OAAQ,EAAE,EAAG,CAC9C,GAAM,GAAO,EAAW,GACxB,AAAI,CAAC,GAAQ,CAAC,EAAK,MAEnB,GAAO,EAAc,IAAM,GAAM,GAAI,YAAW,KAAM,GAAK,iBAG5D,MAAO,CAAE,UGzBV,UAAY,KAAM,IAAW,CAF7B,MAGC,OAAQ,KAAQ,OAAR,cAAc,UAChB,eACJ,GAAa,EAAQ,KAAK,aACxB,KAAK,GAAQ,GAAQ,EAAQ,KAAK,IAAK,IACvC,MAAM,GAAS,GAAQ,EAAQ,KAAK,IAAK,CAAE,WAC7C,cAEA,KAAM,IAAI,OAAM,oBAAoB,KAAK,UAAU,EAAQ,WAI9D,YAAsB,EAAa,CAClC,MAAO,IAAiB,GAGzB,YAAiB,EAAK,EAAM,CAC3B,YAAY,IAAE,OAAQ",
  "names": []
}
