{"version":3,"file":"firebase.js","sources":["../../node_modules/whatwg-fetch/fetch.js","../polyfill/dist/index.esm.js","../../node_modules/tslib/tslib.es6.js","../util/dist/index.esm.js","../app/dist/index.esm.js","../logger/dist/index.esm.js","app/index.js","../auth/dist/auth.js","../database/dist/index.esm.js","../messaging/dist/index.esm.js","../storage/dist/index.esm.js","index.js"],"sourcesContent":["(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n","import 'whatwg-fetch';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function() {\n fn.apply(thisArg, arguments);\n };\n}\n\nfunction Promise(fn) {\n if (!(this instanceof Promise))\n throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n this._state = 0;\n this._handled = false;\n this._value = undefined;\n this._deferreds = [];\n\n doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise._immediateFn(function() {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\n\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self)\n throw new TypeError('A promise cannot be resolved with itself.');\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = newValue.then;\n if (newValue instanceof Promise) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\n\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\n\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise._immediateFn(function() {\n if (!self._handled) {\n Promise._unhandledRejectionFn(self._value);\n }\n });\n }\n\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(\n function(value) {\n if (done) return;\n done = true;\n resolve(self, value);\n },\n function(reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n }\n );\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n var prom = new this.constructor(noop);\n\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\n\nPromise.prototype['finally'] = function(callback) {\n var constructor = this.constructor;\n return this.then(\n function(value) {\n return constructor.resolve(callback()).then(function() {\n return value;\n });\n },\n function(reason) {\n return constructor.resolve(callback()).then(function() {\n return constructor.reject(reason);\n });\n }\n );\n};\n\nPromise.all = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!arr || typeof arr.length === 'undefined')\n throw new TypeError('Promise.all accepts an array');\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n try {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n reject\n );\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.resolve = function(value) {\n if (value && typeof value === 'object' && value.constructor === Promise) {\n return value;\n }\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n};\n\nPromise.reject = function(value) {\n return new Promise(function(resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function(values) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, len = values.length; i < len; i++) {\n values[i].then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n (typeof setImmediate === 'function' &&\n function(fn) {\n setImmediate(fn);\n }) ||\n function(fn) {\n setTimeoutFunc(fn, 0);\n };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nvar globalNS = (function() {\n // the only reliable means to get the global object is\n // `Function('return this')()`\n // However, this causes CSP violations in Chrome apps.\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('unable to locate global object');\n})();\n\nif (!globalNS.Promise) {\n globalNS.Promise = Promise;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar _global = createCommonjsModule(function (module) {\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n});\n\nvar _core = createCommonjsModule(function (module) {\nvar core = module.exports = { version: '2.5.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n});\nvar _core_1 = _core.version;\n\nvar _isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\nvar _anObject = function (it) {\n if (!_isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n\nvar _fails = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n\n// Thank's IE8 for his funny defineProperty\nvar _descriptors = !_fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\nvar document = _global.document;\n// typeof document.createElement is 'object' in old IE\nvar is = _isObject(document) && _isObject(document.createElement);\nvar _domCreate = function (it) {\n return is ? document.createElement(it) : {};\n};\n\nvar _ie8DomDefine = !_descriptors && !_fails(function () {\n return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\n\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nvar _toPrimitive = function (it, S) {\n if (!_isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\nvar dP = Object.defineProperty;\n\nvar f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n _anObject(O);\n P = _toPrimitive(P, true);\n _anObject(Attributes);\n if (_ie8DomDefine) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\nvar _objectDp = {\n\tf: f\n};\n\nvar _propertyDesc = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\nvar _hide = _descriptors ? function (object, key, value) {\n return _objectDp.f(object, key, _propertyDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\nvar hasOwnProperty = {}.hasOwnProperty;\nvar _has = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\nvar id = 0;\nvar px = Math.random();\nvar _uid = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\nvar _redefine = createCommonjsModule(function (module) {\nvar SRC = _uid('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n_core.inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) _has(val, 'name') || _hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === _global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n _hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n _hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n});\n\nvar _aFunction = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n\n// optional / simple context binding\n\nvar _ctx = function (fn, that, length) {\n _aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;\n // extend global\n if (target) _redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) _hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\n_global.core = _core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nvar _export = $export;\n\nvar toString = {}.toString;\n\nvar _cof = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\n// eslint-disable-next-line no-prototype-builtins\nvar _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return _cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n// 7.2.1 RequireObjectCoercible(argument)\nvar _defined = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n// 7.1.13 ToObject(argument)\n\nvar _toObject = function (it) {\n return Object(_defined(it));\n};\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nvar _toInteger = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n// 7.1.15 ToLength\n\nvar min = Math.min;\nvar _toLength = function (it) {\n return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n// 7.2.2 IsArray(argument)\n\nvar _isArray = Array.isArray || function isArray(arg) {\n return _cof(arg) == 'Array';\n};\n\nvar SHARED = '__core-js_shared__';\nvar store = _global[SHARED] || (_global[SHARED] = {});\nvar _shared = function (key) {\n return store[key] || (store[key] = {});\n};\n\nvar _wks = createCommonjsModule(function (module) {\nvar store = _shared('wks');\n\nvar Symbol = _global.Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n});\n\nvar SPECIES = _wks('species');\n\nvar _arraySpeciesConstructor = function (original) {\n var C;\n if (_isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;\n if (_isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\n\n\nvar _arraySpeciesCreate = function (original, length) {\n return new (_arraySpeciesConstructor(original))(length);\n};\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\n\n\n\n\n\nvar _arrayMethods = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || _arraySpeciesCreate;\n return function ($this, callbackfn, that) {\n var O = _toObject($this);\n var self = _iobject(O);\n var f = _ctx(callbackfn, that, 3);\n var length = _toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = _wks('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) _hide(ArrayProto, UNSCOPABLES, {});\nvar _addToUnscopables = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\n\nvar $find = _arrayMethods(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n_export(_export.P + _export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n_addToUnscopables(KEY);\n\nvar find = _core.Array.find;\n\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\n\nvar $find$1 = _arrayMethods(6);\nvar KEY$1 = 'findIndex';\nvar forced$1 = true;\n// Shouldn't skip holes\nif (KEY$1 in []) Array(1)[KEY$1](function () { forced$1 = false; });\n_export(_export.P + _export.F * forced$1, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n_addToUnscopables(KEY$1);\n\nvar findIndex = _core.Array.findIndex;\n\n// 7.2.8 IsRegExp(argument)\n\n\nvar MATCH = _wks('match');\nvar _isRegexp = function (it) {\n var isRegExp;\n return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp');\n};\n\n// helper for String#{startsWith, endsWith, includes}\n\n\n\nvar _stringContext = function (that, searchString, NAME) {\n if (_isRegexp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(_defined(that));\n};\n\nvar MATCH$1 = _wks('match');\nvar _failsIsRegexp = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH$1] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n_export(_export.P + _export.F * _failsIsRegexp(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = _stringContext(this, searchString, STARTS_WITH);\n var index = _toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n\nvar startsWith = _core.String.startsWith;\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","import { __extends } from 'tslib';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\r\n */\r\nvar CONSTANTS = {\r\n /**\r\n * @define {boolean} Whether this is the client Node.js SDK.\r\n */\r\n NODE_CLIENT: false,\r\n /**\r\n * @define {boolean} Whether this is the Admin Node.js SDK.\r\n */\r\n NODE_ADMIN: false,\r\n /**\r\n * Firebase SDK Version\r\n */\r\n SDK_VERSION: '${JSCORE_VERSION}'\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws an error if the provided assertion is falsy\r\n * @param {*} assertion The assertion to be tested for falsiness\r\n * @param {!string} message The message to display if the check fails\r\n */\r\nvar assert = function (assertion, message) {\r\n if (!assertion) {\r\n throw assertionError(message);\r\n }\r\n};\r\n/**\r\n * Returns an Error object suitable for throwing.\r\n * @param {string} message\r\n * @return {!Error}\r\n */\r\nvar assertionError = function (message) {\r\n return new Error('Firebase Database (' +\r\n CONSTANTS.SDK_VERSION +\r\n ') INTERNAL ASSERT FAILED: ' +\r\n message);\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar stringToByteArray = function (str) {\r\n // TODO(user): Use native implementations if/when available\r\n var out = [], p = 0;\r\n for (var i = 0; i < str.length; i++) {\r\n var c = str.charCodeAt(i);\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if ((c & 0xfc00) == 0xd800 &&\r\n i + 1 < str.length &&\r\n (str.charCodeAt(i + 1) & 0xfc00) == 0xdc00) {\r\n // Surrogate Pair\r\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Turns an array of numbers into the string given by the concatenation of the\r\n * characters to which the numbers correspond.\r\n * @param {Array} bytes Array of numbers representing characters.\r\n * @return {string} Stringification of the array.\r\n */\r\nvar byteArrayToString = function (bytes) {\r\n // TODO(user): Use native implementations if/when available\r\n var out = [], pos = 0, c = 0;\r\n while (pos < bytes.length) {\r\n var c1 = bytes[pos++];\r\n if (c1 < 128) {\r\n out[c++] = String.fromCharCode(c1);\r\n }\r\n else if (c1 > 191 && c1 < 224) {\r\n var c2 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\r\n }\r\n else if (c1 > 239 && c1 < 365) {\r\n // Surrogate Pair\r\n var c2 = bytes[pos++];\r\n var c3 = bytes[pos++];\r\n var c4 = bytes[pos++];\r\n var u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\r\n 0x10000;\r\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\r\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\r\n }\r\n else {\r\n var c2 = bytes[pos++];\r\n var c3 = bytes[pos++];\r\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\r\n }\r\n }\r\n return out.join('');\r\n};\r\n// Static lookup maps, lazily populated by init_()\r\nvar base64 = {\r\n /**\r\n * Maps bytes to characters.\r\n * @type {Object}\r\n * @private\r\n */\r\n byteToCharMap_: null,\r\n /**\r\n * Maps characters to bytes.\r\n * @type {Object}\r\n * @private\r\n */\r\n charToByteMap_: null,\r\n /**\r\n * Maps bytes to websafe characters.\r\n * @type {Object}\r\n * @private\r\n */\r\n byteToCharMapWebSafe_: null,\r\n /**\r\n * Maps websafe characters to bytes.\r\n * @type {Object}\r\n * @private\r\n */\r\n charToByteMapWebSafe_: null,\r\n /**\r\n * Our default alphabet, shared between\r\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\r\n * @type {string}\r\n */\r\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n /**\r\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\r\n * @type {string}\r\n */\r\n get ENCODED_VALS() {\r\n return this.ENCODED_VALS_BASE + '+/=';\r\n },\r\n /**\r\n * Our websafe alphabet.\r\n * @type {string}\r\n */\r\n get ENCODED_VALS_WEBSAFE() {\r\n return this.ENCODED_VALS_BASE + '-_.';\r\n },\r\n /**\r\n * Whether this browser supports the atob and btoa functions. This extension\r\n * started at Mozilla but is now implemented by many browsers. We use the\r\n * ASSUME_* variables to avoid pulling in the full useragent detection library\r\n * but still allowing the standard per-browser compilations.\r\n *\r\n * @type {boolean}\r\n */\r\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n /**\r\n * Base64-encode an array of bytes.\r\n *\r\n * @param {Array|Uint8Array} input An array of bytes (numbers with\r\n * value in [0, 255]) to encode.\r\n * @param {boolean=} opt_webSafe Boolean indicating we should use the\r\n * alternative alphabet.\r\n * @return {string} The base64 encoded string.\r\n */\r\n encodeByteArray: function (input, opt_webSafe) {\r\n if (!Array.isArray(input)) {\r\n throw Error('encodeByteArray takes an array as a parameter');\r\n }\r\n this.init_();\r\n var byteToCharMap = opt_webSafe\r\n ? this.byteToCharMapWebSafe_\r\n : this.byteToCharMap_;\r\n var output = [];\r\n for (var i = 0; i < input.length; i += 3) {\r\n var byte1 = input[i];\r\n var haveByte2 = i + 1 < input.length;\r\n var byte2 = haveByte2 ? input[i + 1] : 0;\r\n var haveByte3 = i + 2 < input.length;\r\n var byte3 = haveByte3 ? input[i + 2] : 0;\r\n var outByte1 = byte1 >> 2;\r\n var outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n var outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n var outByte4 = byte3 & 0x3f;\r\n if (!haveByte3) {\r\n outByte4 = 64;\r\n if (!haveByte2) {\r\n outByte3 = 64;\r\n }\r\n }\r\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\r\n }\r\n return output.join('');\r\n },\r\n /**\r\n * Base64-encode a string.\r\n *\r\n * @param {string} input A string to encode.\r\n * @param {boolean=} opt_webSafe If true, we should use the\r\n * alternative alphabet.\r\n * @return {string} The base64 encoded string.\r\n */\r\n encodeString: function (input, opt_webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !opt_webSafe) {\r\n return btoa(input);\r\n }\r\n return this.encodeByteArray(stringToByteArray(input), opt_webSafe);\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * @param {string} input to decode.\r\n * @param {boolean=} opt_webSafe True if we should use the\r\n * alternative alphabet.\r\n * @return {string} string representing the decoded value.\r\n */\r\n decodeString: function (input, opt_webSafe) {\r\n // Shortcut for Mozilla browsers that implement\r\n // a native base64 encoder in the form of \"btoa/atob\"\r\n if (this.HAS_NATIVE_SUPPORT && !opt_webSafe) {\r\n return atob(input);\r\n }\r\n return byteArrayToString(this.decodeStringToByteArray(input, opt_webSafe));\r\n },\r\n /**\r\n * Base64-decode a string.\r\n *\r\n * In base-64 decoding, groups of four characters are converted into three\r\n * bytes. If the encoder did not apply padding, the input length may not\r\n * be a multiple of 4.\r\n *\r\n * In this case, the last group will have fewer than 4 characters, and\r\n * padding will be inferred. If the group has one or two characters, it decodes\r\n * to one byte. If the group has three characters, it decodes to two bytes.\r\n *\r\n * @param {string} input Input to decode.\r\n * @param {boolean=} opt_webSafe True if we should use the web-safe alphabet.\r\n * @return {!Array} bytes representing the decoded value.\r\n */\r\n decodeStringToByteArray: function (input, opt_webSafe) {\r\n this.init_();\r\n var charToByteMap = opt_webSafe\r\n ? this.charToByteMapWebSafe_\r\n : this.charToByteMap_;\r\n var output = [];\r\n for (var i = 0; i < input.length;) {\r\n var byte1 = charToByteMap[input.charAt(i++)];\r\n var haveByte2 = i < input.length;\r\n var byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n ++i;\r\n var haveByte3 = i < input.length;\r\n var byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n var haveByte4 = i < input.length;\r\n var byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n ++i;\r\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n throw Error();\r\n }\r\n var outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n output.push(outByte1);\r\n if (byte3 != 64) {\r\n var outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n output.push(outByte2);\r\n if (byte4 != 64) {\r\n var outByte3 = ((byte3 << 6) & 0xc0) | byte4;\r\n output.push(outByte3);\r\n }\r\n }\r\n }\r\n return output;\r\n },\r\n /**\r\n * Lazy static initialization function. Called before\r\n * accessing any of the static map variables.\r\n * @private\r\n */\r\n init_: function () {\r\n if (!this.byteToCharMap_) {\r\n this.byteToCharMap_ = {};\r\n this.charToByteMap_ = {};\r\n this.byteToCharMapWebSafe_ = {};\r\n this.charToByteMapWebSafe_ = {};\r\n // We want quick mappings back and forth, so we precompute two maps.\r\n for (var i = 0; i < this.ENCODED_VALS.length; i++) {\r\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\r\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\r\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\r\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\r\n // Be forgiving when decoding and correctly decode both encodings.\r\n if (i >= this.ENCODED_VALS_BASE.length) {\r\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\r\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\r\n }\r\n }\r\n }\r\n }\r\n};\r\n/**\r\n * URL-safe base64 encoding\r\n * @param {!string} str\r\n * @return {!string}\r\n */\r\nvar base64Encode = function (str) {\r\n var utf8Bytes = stringToByteArray(str);\r\n return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 decoding\r\n *\r\n * NOTE: DO NOT use the global atob() function - it does NOT support the\r\n * base64Url variant encoding.\r\n *\r\n * @param {string} str To be decoded\r\n * @return {?string} Decoded result, if possible\r\n */\r\nvar base64Decode = function (str) {\r\n try {\r\n return base64.decodeString(str, true);\r\n }\r\n catch (e) {\r\n console.error('base64Decode failed: ', e);\r\n }\r\n return null;\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Do a deep-copy of basic JavaScript Objects or Arrays.\r\n */\r\nfunction deepCopy(value) {\r\n return deepExtend(undefined, value);\r\n}\r\n/**\r\n * Copy properties from source to target (recursively allows extension\r\n * of Objects and Arrays). Scalar values in the target are over-written.\r\n * If target is undefined, an object of the appropriate type will be created\r\n * (and returned).\r\n *\r\n * We recursively copy all child properties of plain Objects in the source- so\r\n * that namespace- like dictionaries are merged.\r\n *\r\n * Note that the target can be a function, in which case the properties in\r\n * the source Object are copied onto it as static properties of the Function.\r\n */\r\nfunction deepExtend(target, source) {\r\n if (!(source instanceof Object)) {\r\n return source;\r\n }\r\n switch (source.constructor) {\r\n case Date:\r\n // Treat Dates like scalars; if the target date object had any child\r\n // properties - they will be lost!\r\n var dateValue = source;\r\n return new Date(dateValue.getTime());\r\n case Object:\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n break;\r\n case Array:\r\n // Always copy the array source and overwrite the target.\r\n target = [];\r\n break;\r\n default:\r\n // Not a plain Object - treat it as a scalar.\r\n return source;\r\n }\r\n for (var prop in source) {\r\n if (!source.hasOwnProperty(prop)) {\r\n continue;\r\n }\r\n target[prop] = deepExtend(target[prop], source[prop]);\r\n }\r\n return target;\r\n}\r\n// TODO: Really needed (for JSCompiler type checking)?\r\nfunction patchProperty(obj, prop, value) {\r\n obj[prop] = value;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Deferred = /** @class */ (function () {\r\n function Deferred() {\r\n var _this = this;\r\n this.promise = new Promise(function (resolve, reject) {\r\n _this.resolve = resolve;\r\n _this.reject = reject;\r\n });\r\n }\r\n /**\r\n * Our API internals are not promiseified and cannot because our callback APIs have subtle expectations around\r\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\r\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\r\n * @param {((?function(?(Error)): (?|undefined))| (?function(?(Error),?=): (?|undefined)))=} callback\r\n * @return {!function(?(Error), ?=)}\r\n */\r\n Deferred.prototype.wrapCallback = function (callback) {\r\n var _this = this;\r\n return function (error, value) {\r\n if (error) {\r\n _this.reject(error);\r\n }\r\n else {\r\n _this.resolve(value);\r\n }\r\n if (typeof callback === 'function') {\r\n // Attaching noop handler just in case developer wasn't expecting\r\n // promises\r\n _this.promise.catch(function () { });\r\n // Some of our callbacks don't expect a value and our own tests\r\n // assert that the parameter length is 1\r\n if (callback.length === 1) {\r\n callback(error);\r\n }\r\n else {\r\n callback(error, value);\r\n }\r\n }\r\n };\r\n };\r\n return Deferred;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns navigator.userAgent string or '' if it's not defined.\r\n * @return {string} user agent string\r\n */\r\nvar getUA = function () {\r\n if (typeof navigator !== 'undefined' &&\r\n typeof navigator['userAgent'] === 'string') {\r\n return navigator['userAgent'];\r\n }\r\n else {\r\n return '';\r\n }\r\n};\r\n/**\r\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\r\n *\r\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap in the Ripple emulator) nor\r\n * Cordova `onDeviceReady`, which would normally wait for a callback.\r\n *\r\n * @return {boolean} isMobileCordova\r\n */\r\nvar isMobileCordova = function () {\r\n return (typeof window !== 'undefined' &&\r\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\r\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\r\n};\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return {boolean} True if ReactNative environment is detected.\r\n */\r\nvar isReactNative = function () {\r\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n};\r\n/**\r\n * Detect Node.js.\r\n *\r\n * @return {boolean} True if Node.js environment is detected.\r\n */\r\nvar isNodeSdk = function () {\r\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n};\n\nvar ERROR_NAME = 'FirebaseError';\r\nvar captureStackTrace = Error\r\n .captureStackTrace;\r\n// Export for faking in tests\r\nfunction patchCapture(captureFake) {\r\n var result = captureStackTrace;\r\n captureStackTrace = captureFake;\r\n return result;\r\n}\r\nvar FirebaseError = /** @class */ (function () {\r\n function FirebaseError(code, message) {\r\n this.code = code;\r\n this.message = message;\r\n // We want the stack value, if implemented by Error\r\n if (captureStackTrace) {\r\n // Patches this.stack, omitted calls above ErrorFactory#create\r\n captureStackTrace(this, ErrorFactory.prototype.create);\r\n }\r\n else {\r\n var err_1 = Error.apply(this, arguments);\r\n this.name = ERROR_NAME;\r\n // Make non-enumerable getter for the property.\r\n Object.defineProperty(this, 'stack', {\r\n get: function () {\r\n return err_1.stack;\r\n }\r\n });\r\n }\r\n }\r\n return FirebaseError;\r\n}());\r\n// Back-door inheritance\r\nFirebaseError.prototype = Object.create(Error.prototype);\r\nFirebaseError.prototype.constructor = FirebaseError;\r\nFirebaseError.prototype.name = ERROR_NAME;\r\nvar ErrorFactory = /** @class */ (function () {\r\n function ErrorFactory(service, serviceName, errors) {\r\n this.service = service;\r\n this.serviceName = serviceName;\r\n this.errors = errors;\r\n // Matches {$name}, by default.\r\n this.pattern = /\\{\\$([^}]+)}/g;\r\n // empty\r\n }\r\n ErrorFactory.prototype.create = function (code, data) {\r\n if (data === undefined) {\r\n data = {};\r\n }\r\n var template = this.errors[code];\r\n var fullCode = this.service + '/' + code;\r\n var message;\r\n if (template === undefined) {\r\n message = 'Error';\r\n }\r\n else {\r\n message = template.replace(this.pattern, function (match, key) {\r\n var value = data[key];\r\n return value !== undefined ? value.toString() : '<' + key + '?>';\r\n });\r\n }\r\n // Service: Error message (service/code).\r\n message = this.serviceName + ': ' + message + ' (' + fullCode + ').';\r\n var err = new FirebaseError(fullCode, message);\r\n // Populate the Error object with message parts for programmatic\r\n // accesses (e.g., e.file).\r\n for (var prop in data) {\r\n if (!data.hasOwnProperty(prop) || prop.slice(-1) === '_') {\r\n continue;\r\n }\r\n err[prop] = data[prop];\r\n }\r\n return err;\r\n };\r\n return ErrorFactory;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Evaluates a JSON string into a javascript object.\r\n *\r\n * @param {string} str A string containing JSON.\r\n * @return {*} The javascript object representing the specified JSON.\r\n */\r\nfunction jsonEval(str) {\r\n return JSON.parse(str);\r\n}\r\n/**\r\n * Returns JSON representing a javascript object.\r\n * @param {*} data Javascript object to be stringified.\r\n * @return {string} The JSON contents of the object.\r\n */\r\nfunction stringify(data) {\r\n return JSON.stringify(data);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Decodes a Firebase auth. token into constituent parts.\r\n *\r\n * Notes:\r\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n *\r\n * @param {?string} token\r\n * @return {{header: *, claims: *, data: *, signature: string}}\r\n */\r\nvar decode = function (token) {\r\n var header = {}, claims = {}, data = {}, signature = '';\r\n try {\r\n var parts = token.split('.');\r\n header = jsonEval(base64Decode(parts[0]) || '');\r\n claims = jsonEval(base64Decode(parts[1]) || '');\r\n signature = parts[2];\r\n data = claims['d'] || {};\r\n delete claims['d'];\r\n }\r\n catch (e) { }\r\n return {\r\n header: header,\r\n claims: claims,\r\n data: data,\r\n signature: signature\r\n };\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\r\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n *\r\n * @param {?string} token\r\n * @return {boolean}\r\n */\r\nvar isValidTimestamp = function (token) {\r\n var claims = decode(token).claims, now = Math.floor(new Date().getTime() / 1000), validSince, validUntil;\r\n if (typeof claims === 'object') {\r\n if (claims.hasOwnProperty('nbf')) {\r\n validSince = claims['nbf'];\r\n }\r\n else if (claims.hasOwnProperty('iat')) {\r\n validSince = claims['iat'];\r\n }\r\n if (claims.hasOwnProperty('exp')) {\r\n validUntil = claims['exp'];\r\n }\r\n else {\r\n // token will expire after 24h by default\r\n validUntil = validSince + 86400;\r\n }\r\n }\r\n return (now && validSince && validUntil && now >= validSince && now <= validUntil);\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\r\n *\r\n * Notes:\r\n * - May return null if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n *\r\n * @param {?string} token\r\n * @return {?number}\r\n */\r\nvar issuedAtTime = function (token) {\r\n var claims = decode(token).claims;\r\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\r\n return claims['iat'];\r\n }\r\n return null;\r\n};\r\n/**\r\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time and non-empty\r\n * signature.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n *\r\n * @param {?string} token\r\n * @return {boolean}\r\n */\r\nvar isValidFormat = function (token) {\r\n var decoded = decode(token), claims = decoded.claims;\r\n return (!!decoded.signature &&\r\n !!claims &&\r\n typeof claims === 'object' &&\r\n claims.hasOwnProperty('iat'));\r\n};\r\n/**\r\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\r\n *\r\n * Notes:\r\n * - May return a false negative if there's no native base64 decoding support.\r\n * - Doesn't check if the token is actually valid.\r\n *\r\n * @param {?string} token\r\n * @return {boolean}\r\n */\r\nvar isAdmin = function (token) {\r\n var claims = decode(token).claims;\r\n return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// See http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/\r\nvar contains = function (obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n};\r\nvar safeGet = function (obj, key) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key))\r\n return obj[key];\r\n // else return undefined.\r\n};\r\n/**\r\n * Enumerates the keys/values in an object, excluding keys defined on the prototype.\r\n *\r\n * @param {?Object.} obj Object to enumerate.\r\n * @param {!function(K, V)} fn Function to call for each key and value.\r\n * @template K,V\r\n */\r\nvar forEach = function (obj, fn) {\r\n for (var key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n fn(key, obj[key]);\r\n }\r\n }\r\n};\r\n/**\r\n * Copies all the (own) properties from one object to another.\r\n * @param {!Object} objTo\r\n * @param {!Object} objFrom\r\n * @return {!Object} objTo\r\n */\r\nvar extend = function (objTo, objFrom) {\r\n forEach(objFrom, function (key, value) {\r\n objTo[key] = value;\r\n });\r\n return objTo;\r\n};\r\n/**\r\n * Returns a clone of the specified object.\r\n * @param {!Object} obj\r\n * @return {!Object} cloned obj.\r\n */\r\nvar clone = function (obj) {\r\n return extend({}, obj);\r\n};\r\n/**\r\n * Returns true if obj has typeof \"object\" and is not null. Unlike goog.isObject(), does not return true\r\n * for functions.\r\n *\r\n * @param obj {*} A potential object.\r\n * @returns {boolean} True if it's an object.\r\n */\r\nvar isNonNullObject = function (obj) {\r\n return typeof obj === 'object' && obj !== null;\r\n};\r\nvar isEmpty = function (obj) {\r\n for (var key in obj) {\r\n return false;\r\n }\r\n return true;\r\n};\r\nvar getCount = function (obj) {\r\n var rv = 0;\r\n for (var key in obj) {\r\n rv++;\r\n }\r\n return rv;\r\n};\r\nvar map = function (obj, f, opt_obj) {\r\n var res = {};\r\n for (var key in obj) {\r\n res[key] = f.call(opt_obj, obj[key], key, obj);\r\n }\r\n return res;\r\n};\r\nvar findKey = function (obj, fn, opt_this) {\r\n for (var key in obj) {\r\n if (fn.call(opt_this, obj[key], key, obj)) {\r\n return key;\r\n }\r\n }\r\n return undefined;\r\n};\r\nvar findValue = function (obj, fn, opt_this) {\r\n var key = findKey(obj, fn, opt_this);\r\n return key && obj[key];\r\n};\r\nvar getAnyKey = function (obj) {\r\n for (var key in obj) {\r\n return key;\r\n }\r\n};\r\nvar getValues = function (obj) {\r\n var res = [];\r\n var i = 0;\r\n for (var key in obj) {\r\n res[i++] = obj[key];\r\n }\r\n return res;\r\n};\r\n/**\r\n * Tests whether every key/value pair in an object pass the test implemented\r\n * by the provided function\r\n *\r\n * @param {?Object.} obj Object to test.\r\n * @param {!function(K, V)} fn Function to call for each key and value.\r\n * @template K,V\r\n */\r\nvar every = function (obj, fn) {\r\n for (var key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n if (!fn(key, obj[key])) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a params\r\n * object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n *\r\n * @param {!Object} querystringParams\r\n * @return {string}\r\n */\r\nvar querystring = function (querystringParams) {\r\n var params = [];\r\n forEach(querystringParams, function (key, value) {\r\n if (Array.isArray(value)) {\r\n value.forEach(function (arrayVal) {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\r\n });\r\n }\r\n else {\r\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\r\n }\r\n });\r\n return params.length ? '&' + params.join('&') : '';\r\n};\r\n/**\r\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object (e.g. {arg: 'val', arg2: 'val2'})\r\n *\r\n * @param {string} querystring\r\n * @return {!Object}\r\n */\r\nvar querystringDecode = function (querystring) {\r\n var obj = {};\r\n var tokens = querystring.replace(/^\\?/, '').split('&');\r\n tokens.forEach(function (token) {\r\n if (token) {\r\n var key = token.split('=');\r\n obj[key[0]] = key[1];\r\n }\r\n });\r\n return obj;\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Copyright 2011 The Closure Library Authors. All Rights Reserved.\r\n//\r\n// Licensed under the Apache License, Version 2.0 (the \"License\");\r\n// you may not use this file except in compliance with the License.\r\n// You may obtain a copy of the License at\r\n//\r\n// http://www.apache.org/licenses/LICENSE-2.0\r\n//\r\n// Unless required by applicable law or agreed to in writing, software\r\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\r\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n// See the License for the specific language governing permissions and\r\n// limitations under the License.\r\n/**\r\n * @fileoverview Abstract cryptographic hash interface.\r\n *\r\n * See Sha1 and Md5 for sample implementations.\r\n *\r\n */\r\n/**\r\n * Create a cryptographic hash instance.\r\n *\r\n * @constructor\r\n * @struct\r\n */\r\nvar Hash = /** @class */ (function () {\r\n function Hash() {\r\n /**\r\n * The block size for the hasher.\r\n * @type {number}\r\n */\r\n this.blockSize = -1;\r\n }\r\n return Hash;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview SHA-1 cryptographic hash.\r\n * Variable names follow the notation in FIPS PUB 180-3:\r\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\r\n *\r\n * Usage:\r\n * var sha1 = new sha1();\r\n * sha1.update(bytes);\r\n * var hash = sha1.digest();\r\n *\r\n * Performance:\r\n * Chrome 23: ~400 Mbit/s\r\n * Firefox 16: ~250 Mbit/s\r\n *\r\n */\r\n/**\r\n * SHA-1 cryptographic hash constructor.\r\n *\r\n * The properties declared here are discussed in the above algorithm document.\r\n * @constructor\r\n * @extends {Hash}\r\n * @final\r\n * @struct\r\n */\r\nvar Sha1 = /** @class */ (function (_super) {\r\n __extends(Sha1, _super);\r\n function Sha1() {\r\n var _this = _super.call(this) || this;\r\n /**\r\n * Holds the previous values of accumulated variables a-e in the compress_\r\n * function.\r\n * @type {!Array}\r\n * @private\r\n */\r\n _this.chain_ = [];\r\n /**\r\n * A buffer holding the partially computed hash result.\r\n * @type {!Array}\r\n * @private\r\n */\r\n _this.buf_ = [];\r\n /**\r\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\r\n * as the message schedule in the docs.\r\n * @type {!Array}\r\n * @private\r\n */\r\n _this.W_ = [];\r\n /**\r\n * Contains data needed to pad messages less than 64 bytes.\r\n * @type {!Array}\r\n * @private\r\n */\r\n _this.pad_ = [];\r\n /**\r\n * @private {number}\r\n */\r\n _this.inbuf_ = 0;\r\n /**\r\n * @private {number}\r\n */\r\n _this.total_ = 0;\r\n _this.blockSize = 512 / 8;\r\n _this.pad_[0] = 128;\r\n for (var i = 1; i < _this.blockSize; ++i) {\r\n _this.pad_[i] = 0;\r\n }\r\n _this.reset();\r\n return _this;\r\n }\r\n Sha1.prototype.reset = function () {\r\n this.chain_[0] = 0x67452301;\r\n this.chain_[1] = 0xefcdab89;\r\n this.chain_[2] = 0x98badcfe;\r\n this.chain_[3] = 0x10325476;\r\n this.chain_[4] = 0xc3d2e1f0;\r\n this.inbuf_ = 0;\r\n this.total_ = 0;\r\n };\r\n /**\r\n * Internal compress helper function.\r\n * @param {!Array|!Uint8Array|string} buf Block to compress.\r\n * @param {number=} opt_offset Offset of the block in the buffer.\r\n * @private\r\n */\r\n Sha1.prototype.compress_ = function (buf, opt_offset) {\r\n if (!opt_offset) {\r\n opt_offset = 0;\r\n }\r\n var W = this.W_;\r\n // get 16 big endian words\r\n if (typeof buf === 'string') {\r\n for (var i = 0; i < 16; i++) {\r\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\r\n // have a bug that turns the post-increment ++ operator into pre-increment\r\n // during JIT compilation. We have code that depends heavily on SHA-1 for\r\n // correctness and which is affected by this bug, so I've removed all uses\r\n // of post-increment ++ in which the result value is used. We can revert\r\n // this change once the Safari bug\r\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\r\n // most clients have been updated.\r\n W[i] =\r\n (buf.charCodeAt(opt_offset) << 24) |\r\n (buf.charCodeAt(opt_offset + 1) << 16) |\r\n (buf.charCodeAt(opt_offset + 2) << 8) |\r\n buf.charCodeAt(opt_offset + 3);\r\n opt_offset += 4;\r\n }\r\n }\r\n else {\r\n for (var i = 0; i < 16; i++) {\r\n W[i] =\r\n (buf[opt_offset] << 24) |\r\n (buf[opt_offset + 1] << 16) |\r\n (buf[opt_offset + 2] << 8) |\r\n buf[opt_offset + 3];\r\n opt_offset += 4;\r\n }\r\n }\r\n // expand to 80 words\r\n for (var i = 16; i < 80; i++) {\r\n var t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\r\n }\r\n var a = this.chain_[0];\r\n var b = this.chain_[1];\r\n var c = this.chain_[2];\r\n var d = this.chain_[3];\r\n var e = this.chain_[4];\r\n var f, k;\r\n // TODO(user): Try to unroll this loop to speed up the computation.\r\n for (var i = 0; i < 80; i++) {\r\n if (i < 40) {\r\n if (i < 20) {\r\n f = d ^ (b & (c ^ d));\r\n k = 0x5a827999;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0x6ed9eba1;\r\n }\r\n }\r\n else {\r\n if (i < 60) {\r\n f = (b & c) | (d & (b | c));\r\n k = 0x8f1bbcdc;\r\n }\r\n else {\r\n f = b ^ c ^ d;\r\n k = 0xca62c1d6;\r\n }\r\n }\r\n var t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\r\n e = d;\r\n d = c;\r\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\r\n b = a;\r\n a = t;\r\n }\r\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\r\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\r\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\r\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\r\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\r\n };\r\n Sha1.prototype.update = function (bytes, opt_length) {\r\n // TODO(johnlenz): tighten the function signature and remove this check\r\n if (bytes == null) {\r\n return;\r\n }\r\n if (opt_length === undefined) {\r\n opt_length = bytes.length;\r\n }\r\n var lengthMinusBlock = opt_length - this.blockSize;\r\n var n = 0;\r\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n var buf = this.buf_;\r\n var inbuf = this.inbuf_;\r\n // The outer while loop should execute at most twice.\r\n while (n < opt_length) {\r\n // When we have no data in the block to top up, we can directly process the\r\n // input buffer (assuming it contains sufficient data). This gives ~25%\r\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\r\n // the data is provided in large chunks (or in multiples of 64 bytes).\r\n if (inbuf == 0) {\r\n while (n <= lengthMinusBlock) {\r\n this.compress_(bytes, n);\r\n n += this.blockSize;\r\n }\r\n }\r\n if (typeof bytes === 'string') {\r\n while (n < opt_length) {\r\n buf[inbuf] = bytes.charCodeAt(n);\r\n ++inbuf;\r\n ++n;\r\n if (inbuf == this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n while (n < opt_length) {\r\n buf[inbuf] = bytes[n];\r\n ++inbuf;\r\n ++n;\r\n if (inbuf == this.blockSize) {\r\n this.compress_(buf);\r\n inbuf = 0;\r\n // Jump to the outer loop so we use the full-block optimization.\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.inbuf_ = inbuf;\r\n this.total_ += opt_length;\r\n };\r\n /** @override */\r\n Sha1.prototype.digest = function () {\r\n var digest = [];\r\n var totalBits = this.total_ * 8;\r\n // Add pad 0x80 0x00*.\r\n if (this.inbuf_ < 56) {\r\n this.update(this.pad_, 56 - this.inbuf_);\r\n }\r\n else {\r\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\r\n }\r\n // Add # bits.\r\n for (var i = this.blockSize - 1; i >= 56; i--) {\r\n this.buf_[i] = totalBits & 255;\r\n totalBits /= 256; // Don't use bit-shifting here!\r\n }\r\n this.compress_(this.buf_);\r\n var n = 0;\r\n for (var i = 0; i < 5; i++) {\r\n for (var j = 24; j >= 0; j -= 8) {\r\n digest[n] = (this.chain_[i] >> j) & 255;\r\n ++n;\r\n }\r\n }\r\n return digest;\r\n };\r\n return Sha1;\r\n}(Hash));\n\n/**\r\n * Helper to make a Subscribe function (just like Promise helps make a\r\n * Thenable).\r\n *\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\nfunction createSubscribe(executor, onNoObservers) {\r\n var proxy = new ObserverProxy(executor, onNoObservers);\r\n return proxy.subscribe.bind(proxy);\r\n}\r\n/**\r\n * Implement fan-out for any number of Observers attached via a subscribe\r\n * function.\r\n */\r\nvar ObserverProxy = /** @class */ (function () {\r\n /**\r\n * @param executor Function which can make calls to a single Observer\r\n * as a proxy.\r\n * @param onNoObservers Callback when count of Observers goes to zero.\r\n */\r\n function ObserverProxy(executor, onNoObservers) {\r\n var _this = this;\r\n this.observers = [];\r\n this.unsubscribes = [];\r\n this.observerCount = 0;\r\n // Micro-task scheduling by calling task.then().\r\n this.task = Promise.resolve();\r\n this.finalized = false;\r\n this.onNoObservers = onNoObservers;\r\n // Call the executor asynchronously so subscribers that are called\r\n // synchronously after the creation of the subscribe function\r\n // can still receive the very first value generated in the executor.\r\n this.task\r\n .then(function () {\r\n executor(_this);\r\n })\r\n .catch(function (e) {\r\n _this.error(e);\r\n });\r\n }\r\n ObserverProxy.prototype.next = function (value) {\r\n this.forEachObserver(function (observer) {\r\n observer.next(value);\r\n });\r\n };\r\n ObserverProxy.prototype.error = function (error) {\r\n this.forEachObserver(function (observer) {\r\n observer.error(error);\r\n });\r\n this.close(error);\r\n };\r\n ObserverProxy.prototype.complete = function () {\r\n this.forEachObserver(function (observer) {\r\n observer.complete();\r\n });\r\n this.close();\r\n };\r\n /**\r\n * Subscribe function that can be used to add an Observer to the fan-out list.\r\n *\r\n * - We require that no event is sent to a subscriber sychronously to their\r\n * call to subscribe().\r\n */\r\n ObserverProxy.prototype.subscribe = function (nextOrObserver, error, complete) {\r\n var _this = this;\r\n var observer;\r\n if (nextOrObserver === undefined &&\r\n error === undefined &&\r\n complete === undefined) {\r\n throw new Error('Missing Observer.');\r\n }\r\n // Assemble an Observer object when passed as callback functions.\r\n if (implementsAnyMethods(nextOrObserver, ['next', 'error', 'complete'])) {\r\n observer = nextOrObserver;\r\n }\r\n else {\r\n observer = {\r\n next: nextOrObserver,\r\n error: error,\r\n complete: complete\r\n };\r\n }\r\n if (observer.next === undefined) {\r\n observer.next = noop;\r\n }\r\n if (observer.error === undefined) {\r\n observer.error = noop;\r\n }\r\n if (observer.complete === undefined) {\r\n observer.complete = noop;\r\n }\r\n var unsub = this.unsubscribeOne.bind(this, this.observers.length);\r\n // Attempt to subscribe to a terminated Observable - we\r\n // just respond to the Observer with the final error or complete\r\n // event.\r\n if (this.finalized) {\r\n this.task.then(function () {\r\n try {\r\n if (_this.finalError) {\r\n observer.error(_this.finalError);\r\n }\r\n else {\r\n observer.complete();\r\n }\r\n }\r\n catch (e) {\r\n // nothing\r\n }\r\n return;\r\n });\r\n }\r\n this.observers.push(observer);\r\n return unsub;\r\n };\r\n // Unsubscribe is synchronous - we guarantee that no events are sent to\r\n // any unsubscribed Observer.\r\n ObserverProxy.prototype.unsubscribeOne = function (i) {\r\n if (this.observers === undefined || this.observers[i] === undefined) {\r\n return;\r\n }\r\n delete this.observers[i];\r\n this.observerCount -= 1;\r\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\r\n this.onNoObservers(this);\r\n }\r\n };\r\n ObserverProxy.prototype.forEachObserver = function (fn) {\r\n if (this.finalized) {\r\n // Already closed by previous event....just eat the additional values.\r\n return;\r\n }\r\n // Since sendOne calls asynchronously - there is no chance that\r\n // this.observers will become undefined.\r\n for (var i = 0; i < this.observers.length; i++) {\r\n this.sendOne(i, fn);\r\n }\r\n };\r\n // Call the Observer via one of it's callback function. We are careful to\r\n // confirm that the observe has not been unsubscribed since this asynchronous\r\n // function had been queued.\r\n ObserverProxy.prototype.sendOne = function (i, fn) {\r\n var _this = this;\r\n // Execute the callback asynchronously\r\n this.task.then(function () {\r\n if (_this.observers !== undefined && _this.observers[i] !== undefined) {\r\n try {\r\n fn(_this.observers[i]);\r\n }\r\n catch (e) {\r\n // Ignore exceptions raised in Observers or missing methods of an\r\n // Observer.\r\n // Log error to console. b/31404806\r\n if (typeof console !== 'undefined' && console.error) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n });\r\n };\r\n ObserverProxy.prototype.close = function (err) {\r\n var _this = this;\r\n if (this.finalized) {\r\n return;\r\n }\r\n this.finalized = true;\r\n if (err !== undefined) {\r\n this.finalError = err;\r\n }\r\n // Proxy is no longer needed - garbage collect references\r\n this.task.then(function () {\r\n _this.observers = undefined;\r\n _this.onNoObservers = undefined;\r\n });\r\n };\r\n return ObserverProxy;\r\n}());\r\n/** Turn synchronous function into one called asynchronously. */\r\nfunction async(fn, onError) {\r\n return function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n Promise.resolve(true)\r\n .then(function () {\r\n fn.apply(void 0, args);\r\n })\r\n .catch(function (error) {\r\n if (onError) {\r\n onError(error);\r\n }\r\n });\r\n };\r\n}\r\n/**\r\n * Return true if the object passed in implements any of the named methods.\r\n */\r\nfunction implementsAnyMethods(obj, methods) {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n for (var _i = 0, methods_1 = methods; _i < methods_1.length; _i++) {\r\n var method = methods_1[_i];\r\n if (method in obj && typeof obj[method] === 'function') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction noop() {\r\n // do nothing\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Check to make sure the appropriate number of arguments are provided for a public function.\r\n * Throws an error if it fails.\r\n *\r\n * @param {!string} fnName The function name\r\n * @param {!number} minCount The minimum number of arguments to allow for the function call\r\n * @param {!number} maxCount The maximum number of argument to allow for the function call\r\n * @param {!number} argCount The actual number of arguments provided.\r\n */\r\nvar validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n var argError;\r\n if (argCount < minCount) {\r\n argError = 'at least ' + minCount;\r\n }\r\n else if (argCount > maxCount) {\r\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\r\n }\r\n if (argError) {\r\n var error = fnName +\r\n ' failed: Was called with ' +\r\n argCount +\r\n (argCount === 1 ? ' argument.' : ' arguments.') +\r\n ' Expects ' +\r\n argError +\r\n '.';\r\n throw new Error(error);\r\n }\r\n};\r\n/**\r\n * Generates a string to prefix an error message about failed argument validation\r\n *\r\n * @param {!string} fnName The function name\r\n * @param {!number} argumentNumber The index of the argument\r\n * @param {boolean} optional Whether or not the argument is optional\r\n * @return {!string} The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argumentNumber, optional) {\r\n var argName = '';\r\n switch (argumentNumber) {\r\n case 1:\r\n argName = optional ? 'first' : 'First';\r\n break;\r\n case 2:\r\n argName = optional ? 'second' : 'Second';\r\n break;\r\n case 3:\r\n argName = optional ? 'third' : 'Third';\r\n break;\r\n case 4:\r\n argName = optional ? 'fourth' : 'Fourth';\r\n break;\r\n default:\r\n throw new Error('errorPrefix called with argumentNumber > 4. Need to update it?');\r\n }\r\n var error = fnName + ' failed: ';\r\n error += argName + ' argument ';\r\n return error;\r\n}\r\n/**\r\n * @param {!string} fnName\r\n * @param {!number} argumentNumber\r\n * @param {!string} namespace\r\n * @param {boolean} optional\r\n */\r\nfunction validateNamespace(fnName, argumentNumber, namespace, optional) {\r\n if (optional && !namespace)\r\n return;\r\n if (typeof namespace !== 'string') {\r\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'must be a valid firebase namespace.');\r\n }\r\n}\r\nfunction validateCallback(fnName, argumentNumber, callback, optional) {\r\n if (optional && !callback)\r\n return;\r\n if (typeof callback !== 'function')\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'must be a valid function.');\r\n}\r\nfunction validateContextObject(fnName, argumentNumber, context, optional) {\r\n if (optional && !context)\r\n return;\r\n if (typeof context !== 'object' || context === null)\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'must be a valid context object.');\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\r\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\r\n// so it's been modified.\r\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\r\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\r\n// use 2 characters in Javascript. All 4-byte UTF-8 characters begin with a first\r\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\r\n// pair).\r\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\r\n/**\r\n * @param {string} str\r\n * @return {Array}\r\n */\r\nvar stringToByteArray$1 = function (str) {\r\n var out = [], p = 0;\r\n for (var i = 0; i < str.length; i++) {\r\n var c = str.charCodeAt(i);\r\n // Is this the lead surrogate in a surrogate pair?\r\n if (c >= 0xd800 && c <= 0xdbff) {\r\n var high = c - 0xd800; // the high 10 bits.\r\n i++;\r\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n var low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\r\n c = 0x10000 + (high << 10) + low;\r\n }\r\n if (c < 128) {\r\n out[p++] = c;\r\n }\r\n else if (c < 2048) {\r\n out[p++] = (c >> 6) | 192;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else if (c < 65536) {\r\n out[p++] = (c >> 12) | 224;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n else {\r\n out[p++] = (c >> 18) | 240;\r\n out[p++] = ((c >> 12) & 63) | 128;\r\n out[p++] = ((c >> 6) & 63) | 128;\r\n out[p++] = (c & 63) | 128;\r\n }\r\n }\r\n return out;\r\n};\r\n/**\r\n * Calculate length without actually converting; useful for doing cheaper validation.\r\n * @param {string} str\r\n * @return {number}\r\n */\r\nvar stringLength = function (str) {\r\n var p = 0;\r\n for (var i = 0; i < str.length; i++) {\r\n var c = str.charCodeAt(i);\r\n if (c < 128) {\r\n p++;\r\n }\r\n else if (c < 2048) {\r\n p += 2;\r\n }\r\n else if (c >= 0xd800 && c <= 0xdbff) {\r\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\r\n p += 4;\r\n i++; // skip trail surrogate.\r\n }\r\n else {\r\n p += 3;\r\n }\r\n }\r\n return p;\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\n\nexport { assert, assertionError, base64, base64Decode, base64Encode, CONSTANTS, deepCopy, deepExtend, patchProperty, Deferred, getUA, isMobileCordova, isNodeSdk, isReactNative, ErrorFactory, FirebaseError, patchCapture, jsonEval, stringify, decode, isAdmin, issuedAtTime, isValidFormat, isValidTimestamp, clone, contains, every, extend, findKey, findValue, forEach, getAnyKey, getCount, getValues, isEmpty, isNonNullObject, map, safeGet, querystring, querystringDecode, Sha1, async, createSubscribe, errorPrefix, validateArgCount, validateCallback, validateContextObject, validateNamespace, stringLength, stringToByteArray$1 as stringToByteArray };\n","import { createSubscribe, deepCopy, deepExtend, ErrorFactory, patchProperty } from '@firebase/util';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar contains = function (obj, key) {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n};\r\nvar DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\n// An array to capture listeners before the true auth functions\r\n// exist\r\nvar tokenListeners = [];\r\n/**\r\n * Global context object for a collection of services using\r\n * a shared authentication state.\r\n */\r\nvar FirebaseAppImpl = /** @class */ (function () {\r\n function FirebaseAppImpl(options, config, firebase_) {\r\n this.firebase_ = firebase_;\r\n this.isDeleted_ = false;\r\n this.services_ = {};\r\n this.name_ = config.name;\r\n this._automaticDataCollectionEnabled =\r\n config.automaticDataCollectionEnabled || false;\r\n this.options_ = deepCopy(options);\r\n this.INTERNAL = {\r\n getUid: function () { return null; },\r\n getToken: function () { return Promise.resolve(null); },\r\n addAuthTokenListener: function (callback) {\r\n tokenListeners.push(callback);\r\n // Make sure callback is called, asynchronously, in the absence of the auth module\r\n setTimeout(function () { return callback(null); }, 0);\r\n },\r\n removeAuthTokenListener: function (callback) {\r\n tokenListeners = tokenListeners.filter(function (listener) { return listener !== callback; });\r\n }\r\n };\r\n }\r\n Object.defineProperty(FirebaseAppImpl.prototype, \"automaticDataCollectionEnabled\", {\r\n get: function () {\r\n this.checkDestroyed_();\r\n return this._automaticDataCollectionEnabled;\r\n },\r\n set: function (val) {\r\n this.checkDestroyed_();\r\n this._automaticDataCollectionEnabled = val;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseAppImpl.prototype, \"name\", {\r\n get: function () {\r\n this.checkDestroyed_();\r\n return this.name_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseAppImpl.prototype, \"options\", {\r\n get: function () {\r\n this.checkDestroyed_();\r\n return this.options_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n FirebaseAppImpl.prototype.delete = function () {\r\n var _this = this;\r\n return new Promise(function (resolve) {\r\n _this.checkDestroyed_();\r\n resolve();\r\n })\r\n .then(function () {\r\n _this.firebase_.INTERNAL.removeApp(_this.name_);\r\n var services = [];\r\n Object.keys(_this.services_).forEach(function (serviceKey) {\r\n Object.keys(_this.services_[serviceKey]).forEach(function (instanceKey) {\r\n services.push(_this.services_[serviceKey][instanceKey]);\r\n });\r\n });\r\n return Promise.all(services.map(function (service) {\r\n return service.INTERNAL.delete();\r\n }));\r\n })\r\n .then(function () {\r\n _this.isDeleted_ = true;\r\n _this.services_ = {};\r\n });\r\n };\r\n /**\r\n * Return a service instance associated with this app (creating it\r\n * on demand), identified by the passed instanceIdentifier.\r\n *\r\n * NOTE: Currently storage is the only one that is leveraging this\r\n * functionality. They invoke it by calling:\r\n *\r\n * ```javascript\r\n * firebase.app().storage('STORAGE BUCKET ID')\r\n * ```\r\n *\r\n * The service name is passed to this already\r\n * @internal\r\n */\r\n FirebaseAppImpl.prototype._getService = function (name, instanceIdentifier) {\r\n if (instanceIdentifier === void 0) { instanceIdentifier = DEFAULT_ENTRY_NAME; }\r\n this.checkDestroyed_();\r\n if (!this.services_[name]) {\r\n this.services_[name] = {};\r\n }\r\n if (!this.services_[name][instanceIdentifier]) {\r\n /**\r\n * If a custom instance has been defined (i.e. not '[DEFAULT]')\r\n * then we will pass that instance on, otherwise we pass `null`\r\n */\r\n var instanceSpecifier = instanceIdentifier !== DEFAULT_ENTRY_NAME\r\n ? instanceIdentifier\r\n : undefined;\r\n var service = this.firebase_.INTERNAL.factories[name](this, this.extendApp.bind(this), instanceSpecifier);\r\n this.services_[name][instanceIdentifier] = service;\r\n }\r\n return this.services_[name][instanceIdentifier];\r\n };\r\n /**\r\n * Callback function used to extend an App instance at the time\r\n * of service instance creation.\r\n */\r\n FirebaseAppImpl.prototype.extendApp = function (props) {\r\n var _this = this;\r\n // Copy the object onto the FirebaseAppImpl prototype\r\n deepExtend(this, props);\r\n /**\r\n * If the app has overwritten the addAuthTokenListener stub, forward\r\n * the active token listeners on to the true fxn.\r\n *\r\n * TODO: This function is required due to our current module\r\n * structure. Once we are able to rely strictly upon a single module\r\n * implementation, this code should be refactored and Auth should\r\n * provide these stubs and the upgrade logic\r\n */\r\n if (props.INTERNAL && props.INTERNAL.addAuthTokenListener) {\r\n tokenListeners.forEach(function (listener) {\r\n _this.INTERNAL.addAuthTokenListener(listener);\r\n });\r\n tokenListeners = [];\r\n }\r\n };\r\n /**\r\n * This function will throw an Error if the App has already been deleted -\r\n * use before performing API actions on the App.\r\n */\r\n FirebaseAppImpl.prototype.checkDestroyed_ = function () {\r\n if (this.isDeleted_) {\r\n error('app-deleted', { name: this.name_ });\r\n }\r\n };\r\n return FirebaseAppImpl;\r\n}());\r\n// Prevent dead-code elimination of these methods w/o invalid property\r\n// copying.\r\n(FirebaseAppImpl.prototype.name && FirebaseAppImpl.prototype.options) ||\r\n FirebaseAppImpl.prototype.delete ||\r\n console.log('dc');\r\n/**\r\n * Return a firebase namespace object.\r\n *\r\n * In production, this will be called exactly once and the result\r\n * assigned to the 'firebase' global. It may be called multiple times\r\n * in unit tests.\r\n */\r\nfunction createFirebaseNamespace() {\r\n var apps_ = {};\r\n var factories = {};\r\n var appHooks = {};\r\n // A namespace is a plain JavaScript Object.\r\n var namespace = {\r\n // Hack to prevent Babel from modifying the object returned\r\n // as the firebase namespace.\r\n __esModule: true,\r\n initializeApp: initializeApp,\r\n app: app,\r\n apps: null,\r\n Promise: Promise,\r\n SDK_VERSION: '4.13.0',\r\n INTERNAL: {\r\n registerService: registerService,\r\n createFirebaseNamespace: createFirebaseNamespace,\r\n extendNamespace: extendNamespace,\r\n createSubscribe: createSubscribe,\r\n ErrorFactory: ErrorFactory,\r\n removeApp: removeApp,\r\n factories: factories,\r\n useAsService: useAsService,\r\n Promise: Promise,\r\n deepExtend: deepExtend\r\n }\r\n };\r\n // Inject a circular default export to allow Babel users who were previously\r\n // using:\r\n //\r\n // import firebase from 'firebase';\r\n // which becomes: var firebase = require('firebase').default;\r\n //\r\n // instead of\r\n //\r\n // import * as firebase from 'firebase';\r\n // which becomes: var firebase = require('firebase');\r\n patchProperty(namespace, 'default', namespace);\r\n // firebase.apps is a read-only getter.\r\n Object.defineProperty(namespace, 'apps', {\r\n get: getApps\r\n });\r\n /**\r\n * Called by App.delete() - but before any services associated with the App\r\n * are deleted.\r\n */\r\n function removeApp(name) {\r\n var app = apps_[name];\r\n callAppHooks(app, 'delete');\r\n delete apps_[name];\r\n }\r\n /**\r\n * Get the App object for a given name (or DEFAULT).\r\n */\r\n function app(name) {\r\n name = name || DEFAULT_ENTRY_NAME;\r\n if (!contains(apps_, name)) {\r\n error('no-app', { name: name });\r\n }\r\n return apps_[name];\r\n }\r\n patchProperty(app, 'App', FirebaseAppImpl);\r\n function initializeApp(options, rawConfig) {\r\n if (rawConfig === void 0) { rawConfig = {}; }\r\n if (typeof rawConfig !== 'object' || rawConfig === null) {\r\n var name_1 = rawConfig;\r\n rawConfig = { name: name_1 };\r\n }\r\n var config = rawConfig;\r\n if (config.name === undefined) {\r\n config.name = DEFAULT_ENTRY_NAME;\r\n }\r\n var name = config.name;\r\n if (typeof name !== 'string' || !name) {\r\n error('bad-app-name', { name: name + '' });\r\n }\r\n if (contains(apps_, name)) {\r\n error('duplicate-app', { name: name });\r\n }\r\n var app = new FirebaseAppImpl(options, config, namespace);\r\n apps_[name] = app;\r\n callAppHooks(app, 'create');\r\n return app;\r\n }\r\n /*\r\n * Return an array of all the non-deleted FirebaseApps.\r\n */\r\n function getApps() {\r\n // Make a copy so caller cannot mutate the apps list.\r\n return Object.keys(apps_).map(function (name) { return apps_[name]; });\r\n }\r\n /*\r\n * Register a Firebase Service.\r\n *\r\n * firebase.INTERNAL.registerService()\r\n *\r\n * TODO: Implement serviceProperties.\r\n */\r\n function registerService(name, createService, serviceProperties, appHook, allowMultipleInstances) {\r\n // Cannot re-register a service that already exists\r\n if (factories[name]) {\r\n error('duplicate-service', { name: name });\r\n }\r\n // Capture the service factory for later service instantiation\r\n factories[name] = createService;\r\n // Capture the appHook, if passed\r\n if (appHook) {\r\n appHooks[name] = appHook;\r\n // Run the **new** app hook on all existing apps\r\n getApps().forEach(function (app) {\r\n appHook('create', app);\r\n });\r\n }\r\n // The Service namespace is an accessor function ...\r\n var serviceNamespace = function (appArg) {\r\n if (appArg === void 0) { appArg = app(); }\r\n if (typeof appArg[name] !== 'function') {\r\n // Invalid argument.\r\n // This happens in the following case: firebase.storage('gs:/')\r\n error('invalid-app-argument', { name: name });\r\n }\r\n // Forward service instance lookup to the FirebaseApp.\r\n return appArg[name]();\r\n };\r\n // ... and a container for service-level properties.\r\n if (serviceProperties !== undefined) {\r\n deepExtend(serviceNamespace, serviceProperties);\r\n }\r\n // Monkey-patch the serviceNamespace onto the firebase namespace\r\n namespace[name] = serviceNamespace;\r\n // Patch the FirebaseAppImpl prototype\r\n FirebaseAppImpl.prototype[name] = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var serviceFxn = this._getService.bind(this, name);\r\n return serviceFxn.apply(this, allowMultipleInstances ? args : []);\r\n };\r\n return serviceNamespace;\r\n }\r\n /**\r\n * Patch the top-level firebase namespace with additional properties.\r\n *\r\n * firebase.INTERNAL.extendNamespace()\r\n */\r\n function extendNamespace(props) {\r\n deepExtend(namespace, props);\r\n }\r\n function callAppHooks(app, eventName) {\r\n Object.keys(factories).forEach(function (serviceName) {\r\n // Ignore virtual services\r\n var factoryName = useAsService(app, serviceName);\r\n if (factoryName === null) {\r\n return;\r\n }\r\n if (appHooks[factoryName]) {\r\n appHooks[factoryName](eventName, app);\r\n }\r\n });\r\n }\r\n // Map the requested service to a registered service name\r\n // (used to map auth to serverAuth service when needed).\r\n function useAsService(app, name) {\r\n if (name === 'serverAuth') {\r\n return null;\r\n }\r\n var useService = name;\r\n var options = app.options;\r\n return useService;\r\n }\r\n return namespace;\r\n}\r\nfunction error(code, args) {\r\n throw appErrors.create(code, args);\r\n}\r\n// TypeScript does not support non-string indexes!\r\n// let errors: {[code: AppError: string} = {\r\nvar errors = {\r\n 'no-app': \"No Firebase App '{$name}' has been created - \" +\r\n 'call Firebase App.initializeApp()',\r\n 'bad-app-name': \"Illegal App name: '{$name}\",\r\n 'duplicate-app': \"Firebase App named '{$name}' already exists\",\r\n 'app-deleted': \"Firebase App named '{$name}' already deleted\",\r\n 'duplicate-service': \"Firebase service named '{$name}' already registered\",\r\n 'sa-not-supported': 'Initializing the Firebase SDK with a service ' +\r\n 'account is only allowed in a Node.js environment. On client ' +\r\n 'devices, you should instead initialize the SDK with an api key and ' +\r\n 'auth domain',\r\n 'invalid-app-argument': 'firebase.{$name}() takes either no argument or a ' +\r\n 'Firebase App instance.'\r\n};\r\nvar appErrors = new ErrorFactory('app', 'Firebase', errors);\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar firebase = createFirebaseNamespace();\n\nexport default firebase;\nexport { firebase };\n","/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A container for all of the Logger instances\r\n */\r\nvar instances = [];\r\n/**\r\n * The JS SDK supports 5 log levels and also allows a user the ability to\r\n * silence the logs altogether.\r\n *\r\n * The order is a follows:\r\n * DEBUG < VERBOSE < INFO < WARN < ERROR\r\n *\r\n * All of the log types above the current log level will be captured (i.e. if\r\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\r\n * `VERBOSE` logs will not)\r\n */\r\nvar LogLevel;\r\n(function (LogLevel) {\r\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\r\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\r\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\r\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\r\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\r\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\r\n})(LogLevel || (LogLevel = {}));\r\n/**\r\n * The default log level\r\n */\r\nvar defaultLogLevel = LogLevel.INFO;\r\n/**\r\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\r\n * messages on to their corresponding console counterparts (if the log method\r\n * is supported by the current log level)\r\n */\r\nvar defaultLogHandler = function (instance, logType) {\r\n var args = [];\r\n for (var _i = 2; _i < arguments.length; _i++) {\r\n args[_i - 2] = arguments[_i];\r\n }\r\n if (logType < instance.logLevel)\r\n return;\r\n var now = new Date().toISOString();\r\n switch (logType) {\r\n /**\r\n * By default, `console.debug` is not displayed in the developer console (in\r\n * chrome). To avoid forcing users to have to opt-in to these logs twice\r\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\r\n * logs to the `console.log` function.\r\n */\r\n case LogLevel.DEBUG:\r\n console.log.apply(console, [\"[\" + now + \"] \" + instance.name + \":\"].concat(args));\r\n break;\r\n case LogLevel.VERBOSE:\r\n console.log.apply(console, [\"[\" + now + \"] \" + instance.name + \":\"].concat(args));\r\n break;\r\n case LogLevel.INFO:\r\n console.info.apply(console, [\"[\" + now + \"] \" + instance.name + \":\"].concat(args));\r\n break;\r\n case LogLevel.WARN:\r\n console.warn.apply(console, [\"[\" + now + \"] \" + instance.name + \":\"].concat(args));\r\n break;\r\n case LogLevel.ERROR:\r\n console.error.apply(console, [\"[\" + now + \"] \" + instance.name + \":\"].concat(args));\r\n break;\r\n default:\r\n throw new Error(\"Attempted to log a message with an invalid logType (value: \" + logType + \")\");\r\n }\r\n};\r\nvar Logger = /** @class */ (function () {\r\n /**\r\n * Gives you an instance of a Logger to capture messages according to\r\n * Firebase's logging scheme.\r\n *\r\n * @param name The name that the logs will be associated with\r\n */\r\n function Logger(name) {\r\n this.name = name;\r\n /**\r\n * The log level of the given Logger instance.\r\n */\r\n this._logLevel = defaultLogLevel;\r\n /**\r\n * The log handler for the Logger instance.\r\n */\r\n this._logHandler = defaultLogHandler;\r\n /**\r\n * Capture the current instance for later use\r\n */\r\n instances.push(this);\r\n }\r\n Object.defineProperty(Logger.prototype, \"logLevel\", {\r\n get: function () {\r\n return this._logLevel;\r\n },\r\n set: function (val) {\r\n if (!(val in LogLevel)) {\r\n throw new TypeError('Invalid value assigned to `logLevel`');\r\n }\r\n this._logLevel = val;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Logger.prototype, \"logHandler\", {\r\n get: function () {\r\n return this._logHandler;\r\n },\r\n set: function (val) {\r\n if (typeof val !== 'function') {\r\n throw new TypeError('Value assigned to `logHandler` must be a function');\r\n }\r\n this._logHandler = val;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * The functions below are all based on the `console` interface\r\n */\r\n Logger.prototype.debug = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this._logHandler.apply(this, [this, LogLevel.DEBUG].concat(args));\r\n };\r\n Logger.prototype.log = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this._logHandler.apply(this, [this, LogLevel.VERBOSE].concat(args));\r\n };\r\n Logger.prototype.info = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this._logHandler.apply(this, [this, LogLevel.INFO].concat(args));\r\n };\r\n Logger.prototype.warn = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this._logHandler.apply(this, [this, LogLevel.WARN].concat(args));\r\n };\r\n Logger.prototype.error = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this._logHandler.apply(this, [this, LogLevel.ERROR].concat(args));\r\n };\r\n return Logger;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction setLogLevel(level) {\r\n instances.forEach(function (inst) {\r\n inst.logLevel = level;\r\n });\r\n}\n\nexport { setLogLevel, Logger, LogLevel };\n","/**\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nrequire('@firebase/polyfill');\nmodule.exports = require('@firebase/app').default;\n","(function() {\n var firebase = require('@firebase/app').default;\n var g,aa=aa||{},k=this;function l(a){return\"string\"==typeof a}function ba(a){return\"boolean\"==typeof a}function ca(){}\nfunction da(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"null\";\nelse if(\"function\"==b&&\"undefined\"==typeof a.call)return\"object\";return b}function ea(a){return null===a}function fa(a){return\"array\"==da(a)}function ha(a){var b=da(a);return\"array\"==b||\"object\"==b&&\"number\"==typeof a.length}function n(a){return\"function\"==da(a)}function q(a){var b=typeof a;return\"object\"==b&&null!=a||\"function\"==b}var ia=\"closure_uid_\"+(1E9*Math.random()>>>0),ja=0;function ka(a,b,c){return a.call.apply(a.bind,arguments)}\nfunction la(a,b,c){if(!a)throw Error();if(2a.b&&(a.b++,b.next=a.a,a.a=b)};function ua(){this.b=this.a=null}var wa=new sa(function(){return new va},function(a){a.reset()});ua.prototype.add=function(a,b){var c=wa.get();c.set(a,b);this.b?this.b.next=c:this.a=c;this.b=c};function xa(){var a=ya,b=null;a.a&&(b=a.a,a.a=a.a.next,a.a||(a.b=null),b.next=null);return b}function va(){this.next=this.b=this.a=null}va.prototype.set=function(a,b){this.a=a;this.b=b;this.next=null};va.prototype.reset=function(){this.next=this.b=this.a=null};var za=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if(l(a))return l(b)&&1==b.length?a.indexOf(b,0):-1;for(var c=0;cb?null:l(a)?a.charAt(b):a[b]}function Fa(a,b){return 0<=za(a,b)}function Ga(a,b){b=za(a,b);var c;(c=0<=b)&&Array.prototype.splice.call(a,b,1);return c}function w(a,b){var c=0;Aa(a,function(d,e){b.call(void 0,d,e,a)&&1==Array.prototype.splice.call(a,e,1).length&&c++})}function Ha(a){return Array.prototype.concat.apply([],arguments)}\nfunction Ia(a){var b=a.length;if(0\")&&(a=a.replace(Pa,\">\"));-1!=a.indexOf('\"')&&(a=a.replace(Qa,\""\"));-1!=a.indexOf(\"'\")&&(a=a.replace(Ra,\"'\"));-1!=a.indexOf(\"\\x00\")&&(a=a.replace(Sa,\"�\"));return a}var Na=/&/g,Oa=//g,Qa=/\"/g,Ra=/'/g,Sa=/\\x00/g,Ma=/[\\x00&<>\"']/;function x(a,b){return-1!=a.indexOf(b)}function Ta(a,b){return ab?1:0};var Ua;a:{var Va=k.navigator;if(Va){var Wa=Va.userAgent;if(Wa){Ua=Wa;break a}}Ua=\"\"}function y(a){return x(Ua,a)};function Xa(a,b){for(var c in a)b.call(void 0,a[c],c,a)}function Ya(a){for(var b in a)return!1;return!0}function Za(a){var b={},c;for(c in a)b[c]=a[c];return b}var $a=\"constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf\".split(\" \");function ab(a,b){for(var c,d,e=1;eparseFloat(Tb)){Sb=String(Vb);break a}}Sb=Tb}var Lb={};\nfunction Wb(a){return Kb(a,function(){for(var b=0,c=Ka(String(Sb)).split(\".\"),d=Ka(String(a)).split(\".\"),e=Math.max(c.length,d.length),f=0;0==b&&f=a.keyCode)a.keyCode=-1}catch(b){}};cc.prototype.f=function(){return this.a};var ec=\"closure_listenable_\"+(1E6*Math.random()|0),fc=0;function gc(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.La=e;this.key=++fc;this.ma=this.Ha=!1}function hc(a){a.ma=!0;a.listener=null;a.proxy=null;a.src=null;a.La=null};function jc(a){this.src=a;this.a={};this.b=0}jc.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.a[f];a||(a=this.a[f]=[],this.b++);var h=kc(a,b,d,e);-1d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(h){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.b;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.b=d[e];var f=Ac(d[e],a,!0,b);c=c&&f}for(e=0;e>>0);function rc(a){if(n(a))return a;a[Cc]||(a[Cc]=function(b){return a.handleEvent(b)});return a[Cc]};function G(){Fb.call(this);this.u=new jc(this);this.Mb=this;this.Ta=null}t(G,Fb);G.prototype[ec]=!0;G.prototype.addEventListener=function(a,b,c,d){pc(this,a,b,c,d)};G.prototype.removeEventListener=function(a,b,c,d){F(this,a,b,c,d)};\nG.prototype.dispatchEvent=function(a){var b,c=this.Ta;if(c)for(b=[];c;c=c.Ta)b.push(c);c=this.Mb;var d=a.type||a;if(l(a))a=new D(a,c);else if(a instanceof D)a.target=a.target||c;else{var e=a;a=new D(d,c);ab(a,e)}e=!0;if(b)for(var f=b.length-1;0<=f;f--){var h=a.b=b[f];e=Dc(h,d,!0,a)&&e}h=a.b=c;e=Dc(h,d,!0,a)&&e;e=Dc(h,d,!1,a)&&e;if(b)for(f=0;fb)throw Error(\"Bad port number \"+b);a.j=b}else a.j=null}function Tc(a,b,c){b instanceof Sc?(a.a=b,$c(a.a,a.f)):(c||(b=Vc(b,ad)),a.a=new Sc(b,a.f))}function H(a,b,c){a.a.set(b,c)}function bd(a,b){return a.a.get(b)}function cd(a){return a instanceof Pc?new Pc(a):new Pc(a,void 0)}function dd(a,b){var c=new Pc(null,void 0);Qc(c,\"https\");a&&(c.b=a);b&&(c.g=b);return c}\nfunction Uc(a,b){return a?b?decodeURI(a.replace(/%25/g,\"%2525\")):decodeURIComponent(a):\"\"}function Vc(a,b,c){return l(a)?(a=encodeURI(a).replace(b,ed),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,\"%$1\")),a):null}function ed(a){a=a.charCodeAt(0);return\"%\"+(a>>4&15).toString(16)+(a&15).toString(16)}var Wc=/[#\\/\\?@]/g,Yc=/[#\\?:]/g,Xc=/[#\\?]/g,ad=/[#\\?@]/g,Zc=/#/g;function Sc(a,b){this.b=this.a=null;this.c=a||null;this.f=!!b}\nfunction fd(a){a.a||(a.a=new Kc,a.b=0,a.c&&Oc(a.c,function(b,c){a.add(decodeURIComponent(b.replace(/\\+/g,\" \")),c)}))}function gd(a){var b=Hc(a);if(\"undefined\"==typeof b)throw Error(\"Keys are undefined\");var c=new Sc(null,void 0);a=Gc(a);for(var d=0;d2*a.c&&Lc(a)))}g.clear=function(){this.a=this.c=null;this.b=0};function kd(a,b){fd(a);b=id(a,b);return Mc(a.a.b,b)}g.forEach=function(a,b){fd(this);this.a.forEach(function(c,d){v(c,function(c){a.call(b,c,d,this)},this)},this)};g.U=function(){fd(this);for(var a=this.a.S(),b=this.a.U(),c=[],d=0;d\");Gd(\"\");Gd(\"
\");function Hd(a){var b=document;return l(a)?b.getElementById(a):a}function Id(a,b){Xa(b,function(b,d){b&&b.la&&(b=b.ja());\"style\"==d?a.style.cssText=b:\"class\"==d?a.className=b:\"for\"==d?a.htmlFor=b:Jd.hasOwnProperty(d)?a.setAttribute(Jd[d],b):0==d.lastIndexOf(\"aria-\",0)||0==d.lastIndexOf(\"data-\",0)?a.setAttribute(d,b):a[d]=b})}\nvar Jd={cellpadding:\"cellPadding\",cellspacing:\"cellSpacing\",colspan:\"colSpan\",frameborder:\"frameBorder\",height:\"height\",maxlength:\"maxLength\",nonce:\"nonce\",role:\"role\",rowspan:\"rowSpan\",type:\"type\",usemap:\"useMap\",valign:\"vAlign\",width:\"width\"};\nfunction Kd(a,b,c){var d=arguments,e=document,f=String(d[0]),h=d[1];if(!ld&&h&&(h.name||h.type)){f=[\"<\",f];h.name&&f.push(' name=\"',La(h.name),'\"');if(h.type){f.push(' type=\"',La(h.type),'\"');var m={};ab(m,h);delete m.type;h=m}f.push(\">\");f=f.join(\"\")}f=e.createElement(f);h&&(l(h)?f.className=h:fa(h)?f.className=h.join(\" \"):Id(f,h));2a?!1:!C||!Xb||9',a=Gd(a),h.document.write(Fd(a)),h.document.close())):(h=d.open(zd(b),c,h))&&a.noopener&&(h.opener=null);if(h)try{h.focus()}catch(m){}return h}\nfunction de(a){return new z(function(b){function c(){Fc(2E3).then(function(){if(!a||a.closed)b();else return c()})}return c()})}var ee=/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;function fe(){var a=null;return(new z(function(b){\"complete\"==k.document.readyState?b():(a=function(){b()},qc(window,\"load\",a))})).m(function(b){F(window,\"load\",a);throw b;})}\nfunction ge(){return he(void 0)?fe().then(function(){return new z(function(a,b){var c=k.document,d=setTimeout(function(){b(Error(\"Cordova framework is not ready.\"))},1E3);c.addEventListener(\"deviceready\",function(){clearTimeout(d);a()},!1)})}):B(Error(\"Cordova must run in an Android or iOS file scheme.\"))}function he(a){a=a||I();return!(\"file:\"!==ie()||!a.toLowerCase().match(/iphone|ipad|ipod|android/))}function je(){var a=k.window;try{return!(!a||a==a.top)}catch(b){return!1}}\nfunction ke(){return\"object\"!==typeof k.window&&\"function\"===typeof k.importScripts}function le(){return firebase.INTERNAL.hasOwnProperty(\"reactNative\")?\"ReactNative\":firebase.INTERNAL.hasOwnProperty(\"node\")?\"Node\":ke()?\"Worker\":\"Browser\"}function me(){var a=le();return\"ReactNative\"===a||\"Node\"===a}var ce=\"Firefox\",Zd=\"Chrome\";\nfunction Yd(a){var b=a.toLowerCase();if(x(b,\"opera/\")||x(b,\"opr/\")||x(b,\"opios/\"))return\"Opera\";if(x(b,\"iemobile\"))return\"IEMobile\";if(x(b,\"msie\")||x(b,\"trident/\"))return\"IE\";if(x(b,\"edge/\"))return\"Edge\";if(x(b,\"firefox/\"))return ce;if(x(b,\"silk/\"))return\"Silk\";if(x(b,\"blackberry\"))return\"Blackberry\";if(x(b,\"webos\"))return\"Webos\";if(!x(b,\"safari/\")||x(b,\"chrome/\")||x(b,\"crios/\")||x(b,\"android\"))if(!x(b,\"chrome/\")&&!x(b,\"crios/\")||x(b,\"edge/\")){if(x(b,\"android\"))return\"Android\";if((a=a.match(/([a-zA-Z\\d\\.]+)\\/[a-zA-Z\\d\\.]*$/))&&\n2==a.length)return a[1]}else return Zd;else return\"Safari\";return\"Other\"}var ne={Qc:\"FirebaseCore-web\",Sc:\"FirebaseUI-web\"};function oe(a,b){b=b||[];var c=[],d={},e;for(e in ne)d[ne[e]]=!0;for(e=0;eb)throw Error(\"Short delay should be less than long delay!\");this.a=a;this.c=b;a=I();b=le();this.b=$d(a)||\"ReactNative\"===b}\nze.prototype.get=function(){var a=k.navigator;return(a&&\"boolean\"===typeof a.onLine&&(se()||\"chrome-extension:\"===ie()||\"undefined\"!==typeof a.connection)?a.onLine:1)?this.b?this.c:this.a:Math.min(5E3,this.a)};function Ae(){var a=k.document;return a&&\"undefined\"!==typeof a.visibilityState?\"visible\"==a.visibilityState:!0}\nfunction Be(){var a=k.document,b=null;return Ae()||!a?A():(new z(function(c){b=function(){Ae()&&(a.removeEventListener(\"visibilitychange\",b,!1),c())};a.addEventListener(\"visibilitychange\",b,!1)})).m(function(c){a.removeEventListener(\"visibilitychange\",b,!1);throw c;})}function Ce(a){try{var b=new Date(parseInt(a,10));if(!isNaN(b.getTime())&&!/[^0-9]/.test(a))return b.toUTCString()}catch(c){}return null}function De(){return!(!J(\"fireauth.oauthhelper\",k)&&!J(\"fireauth.iframe\",k))};var Ee={};var Fe;try{var Ge={};Object.defineProperty(Ge,\"abcd\",{configurable:!0,enumerable:!0,value:1});Object.defineProperty(Ge,\"abcd\",{configurable:!0,enumerable:!0,value:2});Fe=2==Ge.abcd}catch(a){Fe=!1}function K(a,b,c){Fe?Object.defineProperty(a,b,{configurable:!0,enumerable:!0,value:c}):a[b]=c}function L(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&K(a,c,b[c])}function He(a){var b={};L(b,a);return b}function Ie(a){var b={},c;for(c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}\nfunction Je(a,b){if(!b||!b.length)return!0;if(!a)return!1;for(var c=0;c>4);64!=h&&(b(f<<4&240|h>>2),64!=m&&b(h<<6&192|m))}}\nfunction mf(){if(!hf){hf={};jf={};for(var a=0;65>a;a++)hf[a]=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".charAt(a),jf[hf[a]]=a,62<=a&&(jf[\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.\".charAt(a)]=a)}};function nf(a){this.c=a.sub;na();this.a=a.provider_id||a.firebase&&a.firebase.sign_in_provider||null;this.b=!!a.is_anonymous||\"anonymous\"==this.a}nf.prototype.f=function(){return this.b};function of(a){return(a=pf(a))&&a.sub&&a.iss&&a.aud&&a.exp?new nf(a):null}function pf(a){if(!a)return null;a=a.split(\".\");if(3!=a.length)return null;a=a[1];for(var b=(4-a.length%4)%4,c=0;c Auth section -> Sign in method tab.\",a):\"http\"==d||\"https\"==d?c=Ja(\"This domain (%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.\",a):b=\"operation-not-supported-in-this-environment\";\nM.call(this,b,c)}t(og,M);function pg(a,b,c){M.call(this,a,c);a=b||{};a.ub&&K(this,\"email\",a.ub);a.Z&&K(this,\"phoneNumber\",a.Z);a.credential&&K(this,\"credential\",a.credential)}t(pg,M);pg.prototype.C=function(){var a={code:this.code,message:this.message};this.email&&(a.email=this.email);this.phoneNumber&&(a.phoneNumber=this.phoneNumber);var b=this.credential&&this.credential.C();b&&ab(a,b);return a};pg.prototype.toJSON=function(){return this.C()};\nfunction qg(a){if(a.code){var b=a.code||\"\";0==b.indexOf(Ue)&&(b=b.substring(Ue.length));var c={credential:ig(a)};if(a.email)c.ub=a.email;else if(a.phoneNumber)c.Z=a.phoneNumber;else return new M(b,a.message||void 0);return new pg(b,c,a.message)}return null};var rg=/^[+a-zA-Z0-9_.!#$%&'*\\/=?^`{|}~-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z0-9]{2,63}$/;function sg(){}sg.prototype.c=null;function tg(a){return a.c||(a.c=a.b())};var ug;function vg(){}t(vg,sg);vg.prototype.a=function(){var a=wg(this);return a?new ActiveXObject(a):new XMLHttpRequest};vg.prototype.b=function(){var a={};wg(this)&&(a[0]=!0,a[1]=!0);return a};\nfunction wg(a){if(!a.f&&\"undefined\"==typeof XMLHttpRequest&&\"undefined\"!=typeof ActiveXObject){for(var b=[\"MSXML2.XMLHTTP.6.0\",\"MSXML2.XMLHTTP.3.0\",\"MSXML2.XMLHTTP\",\"Microsoft.XMLHTTP\"],c=0;c=Ig(this).value)for(n(b)&&(b=b()),a=new Ag(a,String(b),this.f),c&&(a.a=c),c=this;c;)c=c.a};var Jg={},Kg=null;\nfunction Lg(a){Kg||(Kg=new Cg(\"\"),Jg[\"\"]=Kg,Kg.c=Gg);var b;if(!(b=Jg[a])){b=new Cg(a);var c=a.lastIndexOf(\".\"),d=a.substr(c+1);c=Lg(a.substr(0,c));c.b||(c.b={});c.b[d]=b;b.a=c;Jg[a]=b}return b};function Q(a,b){a&&a.log(Hg,b,void 0)};function Mg(a){this.f=a}t(Mg,sg);Mg.prototype.a=function(){return new Ng(this.f)};Mg.prototype.b=function(a){return function(){return a}}({});function Ng(a){G.call(this);this.j=a;this.readyState=Og;this.status=0;this.responseText=this.statusText=\"\";this.onreadystatechange=null;this.g=new Headers;this.b=null;this.h=\"GET\";this.c=\"\";this.a=!1;this.f=Lg(\"goog.net.FetchXmlHttp\")}t(Ng,G);var Og=0;g=Ng.prototype;\ng.open=function(a,b){if(this.readyState!=Og)throw this.abort(),Error(\"Error reopening a connection\");this.h=a;this.c=b;this.readyState=1;Pg(this)};g.send=function(a){if(1!=this.readyState)throw this.abort(),Error(\"need to call open() first. \");this.a=!0;var b={headers:this.g,method:this.h,credentials:void 0,cache:void 0};a&&(b.body=a);this.j.fetch(new Request(this.c,b)).then(this.ec.bind(this),this.Ab.bind(this))};\ng.abort=function(){this.responseText=\"\";this.g=new Headers;this.status=0;1<=this.readyState&&this.a&&4!=this.readyState&&(this.readyState=4,this.a=!1,Pg(this));this.readyState=Og};g.ec=function(a){this.a&&(this.b||(this.b=a.headers,this.readyState=2,Pg(this)),this.a&&(this.readyState=3,Pg(this),this.a&&a.text().then(this.dc.bind(this,a),this.Ab.bind(this))))};g.dc=function(a,b){this.a&&(this.status=a.status,this.statusText=a.statusText,this.responseText=b,this.readyState=4,Pg(this))};\ng.Ab=function(a){var b=this.f;b&&b.log(Fg,\"Failed to fetch url \"+this.c,a instanceof Error?a:Error(a));this.a&&(this.readyState=4,Pg(this))};g.setRequestHeader=function(a,b){this.g.append(a,b)};g.getResponseHeader=function(a){return this.b?this.b.get(a.toLowerCase())||\"\":((a=this.f)&&a.log(Fg,\"Attempting to get response header but no headers have been received for url: \"+this.c,void 0),\"\")};\ng.getAllResponseHeaders=function(){if(!this.b){var a=this.f;a&&a.log(Fg,\"Attempting to get all response headers but no headers have been received for url: \"+this.c,void 0);return\"\"}a=[];for(var b=this.b.entries(),c=b.next();!c.done;)c=c.value,a.push(c[0]+\": \"+c[1]),c=b.next();return a.join(\"\\r\\n\")};function Pg(a){a.onreadystatechange&&a.onreadystatechange.call(a)};function Qg(a){G.call(this);this.headers=new Kc;this.D=a||null;this.c=!1;this.B=this.a=null;this.h=this.N=this.l=\"\";this.f=this.I=this.j=this.G=!1;this.g=0;this.s=null;this.o=Rg;this.v=this.O=!1}t(Qg,G);var Rg=\"\";Qg.prototype.b=Lg(\"goog.net.XhrIo\");var Sg=/^https?$/i,Tg=[\"POST\",\"PUT\"];\nfunction Ug(a,b,c,d,e){if(a.a)throw Error(\"[goog.net.XhrIo] Object is active with another request=\"+a.l+\"; newUri=\"+b);c=c?c.toUpperCase():\"GET\";a.l=b;a.h=\"\";a.N=c;a.G=!1;a.c=!0;a.a=a.D?a.D.a():ug.a();a.B=a.D?tg(a.D):tg(ug);a.a.onreadystatechange=r(a.Db,a);try{Q(a.b,Vg(a,\"Opening Xhr\")),a.I=!0,a.a.open(c,String(b),!0),a.I=!1}catch(h){Q(a.b,Vg(a,\"Error opening Xhr: \"+h.message));Wg(a,h);return}b=d||\"\";var f=new Kc(a.headers);e&&Ic(e,function(a,b){f.set(b,a)});e=Da(f.U());d=k.FormData&&b instanceof\nk.FormData;!Fa(Tg,c)||e||d||f.set(\"Content-Type\",\"application/x-www-form-urlencoded;charset=utf-8\");f.forEach(function(a,b){this.a.setRequestHeader(b,a)},a);a.o&&(a.a.responseType=a.o);\"withCredentials\"in a.a&&a.a.withCredentials!==a.O&&(a.a.withCredentials=a.O);try{Xg(a),0=b.l&&b.cancel())}this.v?this.v.call(this.s,this):this.u=!0;this.a||(a=new fh(this),gh(this),hh(this,!1,a))}};eh.prototype.o=function(a,b){this.j=!1;hh(this,a,b)};function hh(a,b,c){a.a=!0;a.c=c;a.f=!b;ih(a)}\nfunction gh(a){if(a.a){if(!a.u)throw new jh(a);a.u=!1}}eh.prototype.D=function(){gh(this);hh(this,!0,null)};function kh(a,b){lh(a,null,b,void 0)}function lh(a,b,c,d){a.g.push([b,c,d]);a.a&&ih(a)}eh.prototype.then=function(a,b,c){var d,e,f=new z(function(a,b){d=a;e=b});lh(this,d,function(a){a instanceof fh?f.cancel():e(a)});return f.then(a,b,c)};oa(eh);function mh(a){return Ca(a.g,function(a){return n(a[1])})}\nfunction ih(a){if(a.h&&a.a&&mh(a)){var b=a.h,c=nh[b];c&&(k.clearTimeout(c.a),delete nh[b]);a.h=0}a.b&&(a.b.l--,delete a.b);b=a.c;for(var d=c=!1;a.g.length&&!a.j;){var e=a.g.shift(),f=e[0],h=e[1];e=e[2];if(f=a.f?h:f)try{var m=f.call(e||a.s,b);void 0!==m&&(a.f=a.f&&(m==b||m instanceof Error),a.c=b=m);if(pa(b)||\"function\"===typeof k.Promise&&b instanceof k.Promise)d=!0,a.j=!0}catch(p){b=p,a.f=!0,mh(a)||(c=!0)}}a.c=b;d&&(m=r(a.o,a,!0),d=r(a.o,a,!1),b instanceof eh?(lh(b,m,d),b.B=!0):b.then(m,d));c&&(b=\nnew oh(b),nh[b.a]=b,a.h=b.a)}function jh(){u.call(this)}t(jh,u);jh.prototype.message=\"Deferred has already fired\";jh.prototype.name=\"AlreadyCalledError\";function fh(){u.call(this)}t(fh,u);fh.prototype.message=\"Deferred was canceled\";fh.prototype.name=\"CanceledError\";function oh(a){this.a=k.setTimeout(r(this.c,this),0);this.b=a}oh.prototype.c=function(){delete nh[this.a];throw this.b;};var nh={};function ph(a){var b={},c=b.document||document,d=sd(a),e=document.createElement(\"SCRIPT\"),f={Fb:e,Fa:void 0},h=new eh(qh,f),m=null,p=null!=b.timeout?b.timeout:5E3;0b;b++){e=c[b-15]|0;d=c[b-2]|0;var f=(c[b-16]|0)+((e>>>7|e<<25)^(e>>>18|e<<14)^e>>>3)|0,h=(c[b-7]|0)+((d>>>17|d<<15)^(d>>>19|d<<13)^d>>>10)|0;c[b]=f+h|0}d=a.a[0]|0;e=a.a[1]|0;var m=a.a[2]|0,p=a.a[3]|0,E=a.a[4]|0,ic=a.a[5]|0,Jc=a.a[6]|0;f=a.a[7]|0;for(b=0;64>b;b++){var El=((d>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10))+(d&e^d&m^e&m)|0;h=E&ic^~E&Jc;f=f+((E>>>6|E<<26)^(E>>>11|E<<21)^(E>>>\n25|E<<7))|0;h=h+(Gj[b]|0)|0;h=f+(h+(c[b]|0)|0)|0;f=Jc;Jc=ic;ic=E;E=p+h|0;p=m;m=e;e=d;d=h+El|0}a.a[0]=a.a[0]+d|0;a.a[1]=a.a[1]+e|0;a.a[2]=a.a[2]+m|0;a.a[3]=a.a[3]+p|0;a.a[4]=a.a[4]+E|0;a.a[5]=a.a[5]+ic|0;a.a[6]=a.a[6]+Jc|0;a.a[7]=a.a[7]+f|0}\nfunction Nj(a,b,c){void 0===c&&(c=b.length);var d=0,e=a.c;if(l(b))for(;d=f&&f==(f|0)))throw Error(\"message must be a byte array\");a.f[e++]=f;e==a.b&&(Mj(a),e=0)}else throw Error(\"message must be string or array\");a.c=e;a.g+=c}\nvar Hj=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,\n4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function Oj(){Ej.call(this,8,Pj)}t(Oj,Ej);var Pj=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];function Qj(a,b,c,d,e){this.u=a;this.j=b;this.l=c;this.o=d||null;this.s=e||null;this.h=b+\":\"+c;this.v=new Cj;this.g=new zj(this.h);this.f=null;this.b=[];this.a=this.c=null}function Rj(a){return new M(\"invalid-cordova-configuration\",a)}g=Qj.prototype;\ng.ea=function(){return this.ya?this.ya:this.ya=ge().then(function(){if(\"function\"!==typeof J(\"universalLinks.subscribe\",k))throw Rj(\"cordova-universal-links-plugin is not installed\");if(\"undefined\"===typeof J(\"BuildInfo.packageName\",k))throw Rj(\"cordova-plugin-buildinfo is not installed\");if(\"function\"!==typeof J(\"cordova.plugins.browsertab.openUrl\",k))throw Rj(\"cordova-plugin-browsertab is not installed\");if(\"function\"!==typeof J(\"cordova.InAppBrowser.open\",k))throw Rj(\"cordova-plugin-inappbrowser is not installed\");\n},function(){throw new M(\"cordova-not-ready\");})};function Sj(){for(var a=20,b=[];0b.c?Nj(b,Lj,56-b.c):Nj(b,Lj,b.b-(b.c-56));for(var d=63;56<=d;d--)b.f[d]=c&255,c/=256;Mj(b);for(d=c=0;d>e&255;return gf(a)}\ng.Da=function(a,b){b(new M(\"operation-not-supported-in-this-environment\"));return A()};g.xb=function(){return B(new M(\"operation-not-supported-in-this-environment\"))};g.Lb=function(){return!1};g.Gb=function(){return!0};g.Bb=function(){return!0};\ng.Ba=function(a,b,c){if(this.c)return B(new M(\"redirect-operation-pending\"));var d=this,e=k.document,f=null,h=null,m=null,p=null;return this.c=A().then(function(){jg(b);return Uj(d)}).then(function(){return Vj(d,a,b,c)}).then(function(){return(new z(function(a,b){h=function(){var b=J(\"cordova.plugins.browsertab.close\",k);a();\"function\"===typeof b&&b();d.a&&\"function\"===typeof d.a.close&&(d.a.close(),d.a=null);return!1};d.va(h);m=function(){f||(f=Fc(2E3).then(function(){b(new M(\"redirect-cancelled-by-user\"))}))};\np=function(){Ae()&&m()};e.addEventListener(\"resume\",m,!1);I().toLowerCase().match(/android/)||e.addEventListener(\"visibilitychange\",p,!1)})).m(function(a){return Wj(d).then(function(){throw a;})})}).ha(function(){m&&e.removeEventListener(\"resume\",m,!1);p&&e.removeEventListener(\"visibilitychange\",p,!1);f&&f.cancel();h&&d.Ja(h);d.c=null})};\nfunction Vj(a,b,c,d){var e=Sj(),f=new kg(b,d,null,e,new M(\"no-auth-event\")),h=J(\"BuildInfo.packageName\",k);if(\"string\"!==typeof h)throw new M(\"invalid-cordova-configuration\");var m=J(\"BuildInfo.displayName\",k),p={};if(I().toLowerCase().match(/iphone|ipad|ipod/))p.ibi=h;else if(I().toLowerCase().match(/android/))p.apn=h;else return B(new M(\"operation-not-supported-in-this-environment\"));m&&(p.appDisplayName=m);e=Tj(e);p.sessionId=e;var E=Oi(a.u,a.j,a.l,b,c,null,d,a.o,p,a.s);return a.ea().then(function(){var b=\na.h;return a.v.a.set(Aj,f.C(),b)}).then(function(){var b=J(\"cordova.plugins.browsertab.isAvailable\",k);if(\"function\"!==typeof b)throw new M(\"invalid-cordova-configuration\");var c=null;b(function(b){if(b){c=J(\"cordova.plugins.browsertab.openUrl\",k);if(\"function\"!==typeof c)throw new M(\"invalid-cordova-configuration\");c(E)}else{c=J(\"cordova.InAppBrowser.open\",k);if(\"function\"!==typeof c)throw new M(\"invalid-cordova-configuration\");b=I();b=!(!b.match(/(iPad|iPhone|iPod).*OS 7_\\d/i)&&!b.match(/(iPad|iPhone|iPod).*OS 8_\\d/i));\na.a=c(E,b?\"_blank\":\"_system\",\"location=yes\")}})})}function Xj(a,b){for(var c=0;ca.f&&(a.a=a.f);return b}function Bk(a,b){a.stop();a.b=Fc(Ck(a,b)).then(function(){return Be()}).then(function(){return a.h()}).then(function(){Bk(a,!0)}).m(function(b){a.j(b)&&Bk(a,!1)})}\nAk.prototype.stop=function(){this.b&&(this.b.cancel(),this.b=null)};function Dk(a){this.f=a;this.b=this.a=null;this.c=0}Dk.prototype.C=function(){return{apiKey:this.f.b,refreshToken:this.a,accessToken:this.b,expirationTime:this.c}};function Ek(a,b){var c=b[Gf],d=b.refreshToken;b=Fk(b.expiresIn);a.b=c;a.c=b;a.a=d}function Fk(a){return na()+1E3*parseInt(a,10)}\nfunction Gk(a,b){return Jh(a.f,b).then(function(b){a.b=b.access_token;a.c=Fk(b.expires_in);a.a=b.refresh_token;return{accessToken:a.b,expirationTime:a.c,refreshToken:a.a}}).m(function(b){\"auth/user-token-expired\"==b.code&&(a.a=null);throw b;})}Dk.prototype.getToken=function(a){a=!!a;return this.b&&!this.a?B(new M(\"user-token-expired\")):a||!this.b||na()>this.c-3E4?this.a?Gk(this,{grant_type:\"refresh_token\",refresh_token:this.a}):A(null):A({accessToken:this.b,expirationTime:this.c,refreshToken:this.a})};function Hk(a,b){this.a=a||null;this.b=b||null;L(this,{lastSignInTime:Ce(b||null),creationTime:Ce(a||null)})}function Ik(a){return new Hk(a.a,a.b)}Hk.prototype.C=function(){return{lastLoginAt:this.b,createdAt:this.a}};function Jk(a,b,c,d,e,f){L(this,{uid:a,displayName:d||null,photoURL:e||null,email:c||null,phoneNumber:f||null,providerId:b})}function Kk(a,b){D.call(this,a);for(var c in b)this[c]=b[c]}t(Kk,D);\nfunction Lk(a,b,c){this.D=[];this.G=a.apiKey;this.s=a.appName;this.B=a.authDomain||null;a=firebase.SDK_VERSION?oe(firebase.SDK_VERSION):null;this.b=new xh(this.G,ui(vi),a);this.h=new Dk(this.b);Mk(this,b[Gf]);Ek(this.h,b);K(this,\"refreshToken\",this.h.a);Nk(this,c||{});G.call(this);this.I=!1;this.B&&re()&&(this.a=qk(this.B,this.G,this.s));this.N=[];this.j=null;this.l=Ok(this);this.V=r(this.Ga,this);var d=this;this.ia=null;this.sa=function(a){d.na(a.g)};this.X=null;this.O=[];this.ra=function(a){Pk(d,\na.c)};this.W=null}t(Lk,G);Lk.prototype.na=function(a){this.ia=a;Dh(this.b,a)};Lk.prototype.ca=function(){return this.ia};function Qk(a,b){a.X&&F(a.X,\"languageCodeChanged\",a.sa);(a.X=b)&&pc(b,\"languageCodeChanged\",a.sa)}function Pk(a,b){a.O=b;Eh(a.b,firebase.SDK_VERSION?oe(firebase.SDK_VERSION,a.O):null)}Lk.prototype.Ka=function(){return Ia(this.O)};function Rk(a,b){a.W&&F(a.W,\"frameworkChanged\",a.ra);(a.W=b)&&pc(b,\"frameworkChanged\",a.ra)}Lk.prototype.Ga=function(){this.l.b&&(this.l.stop(),this.l.start())};\nfunction Sk(a){try{return firebase.app(a.s).auth()}catch(b){throw new M(\"internal-error\",\"No firebase.auth.Auth instance is available for the Firebase App '\"+a.s+\"'!\");}}function Ok(a){return new Ak(function(){return a.F(!0)},function(a){return a&&\"auth/network-request-failed\"==a.code?!0:!1},function(){var b=a.h.c-na()-3E5;return 0this.s&&(this.s=0);0==this.s&&U(this)&&Uk(U(this));this.removeAuthTokenListener(a)};\ng.addAuthTokenListener=function(a){var b=this;this.o.push(a);T(this,this.j.then(function(){b.l||Fa(b.o,a)&&a(Ul(b))}))};g.removeAuthTokenListener=function(a){w(this.o,function(b){return b==a})};function Tl(a,b){a.I.push(b);T(a,a.j.then(function(){!a.l&&Fa(a.I,b)&&a.O!==a.getUid()&&(a.O=a.getUid(),b(Ul(a)))}))}\ng.delete=function(){this.l=!0;for(var a=0;ae||e>=lm.length)throw new M(\"internal-error\",\n\"Argument validator received an unsupported number of arguments.\");c=lm[e];d=(d?\"\":c+\" argument \")+(b.name?'\"'+b.name+'\" ':\"\")+\"must be \"+b.K+\".\";break a}d=null}}if(d)throw new M(\"argument-error\",a+\" failed: \"+d);}var lm=\"First Second Third Fourth Fifth Sixth Seventh Eighth Ninth\".split(\" \");function V(a,b){return{name:a||\"\",K:\"a valid string\",optional:!!b,M:l}}function mm(){return{name:\"opt_forceRefresh\",K:\"a boolean\",optional:!0,M:ba}}\nfunction W(a,b){return{name:a||\"\",K:\"a valid object\",optional:!!b,M:q}}function nm(a,b){return{name:a||\"\",K:\"a function\",optional:!!b,M:n}}function om(a,b){return{name:a||\"\",K:\"null\",optional:!!b,M:ea}}function pm(){return{name:\"\",K:\"an HTML element\",optional:!1,M:function(a){return!!(a&&a instanceof Element)}}}function qm(){return{name:\"auth\",K:\"an instance of Firebase Auth\",optional:!0,M:function(a){return!!(a&&a instanceof Gl)}}}\nfunction rm(){return{name:\"app\",K:\"an instance of Firebase App\",optional:!0,M:function(a){return!!(a&&a instanceof firebase.app.App)}}}function sm(a){return{name:a?a+\"Credential\":\"credential\",K:a?\"a valid \"+a+\" credential\":\"a valid credential\",optional:!1,M:function(b){if(!b)return!1;var c=!a||b.providerId===a;return!(!b.xa||!c)}}}\nfunction tm(){return{name:\"authProvider\",K:\"a valid Auth provider\",optional:!1,M:function(a){return!!(a&&a.providerId&&a.hasOwnProperty&&a.hasOwnProperty(\"isOAuthProvider\"))}}}function um(){return{name:\"applicationVerifier\",K:\"an implementation of firebase.auth.ApplicationVerifier\",optional:!1,M:function(a){return!!(a&&l(a.type)&&n(a.verify))}}}function X(a,b,c,d){return{name:c||\"\",K:a.K+\" or \"+b.K,optional:!!d,M:function(c){return a.M(c)||b.M(c)}}};function Y(a,b){for(var c in b){var d=b[c].name;a[d]=vm(d,a[c],b[c].i)}}function Z(a,b,c,d){a[b]=vm(b,c,d)}function vm(a,b,c){function d(){var a=Array.prototype.slice.call(arguments);km(e,c,a);return b.apply(this,a)}if(!c)return b;var e=wm(a),f;for(f in b)d[f]=b[f];for(f in b.prototype)d.prototype[f]=b.prototype[f];return d}function wm(a){a=a.split(\".\");return a[a.length-1]};Y(Gl.prototype,{Ua:{name:\"applyActionCode\",i:[V(\"code\")]},Ia:{name:\"checkActionCode\",i:[V(\"code\")]},Wa:{name:\"confirmPasswordReset\",i:[V(\"code\"),V(\"newPassword\")]},Sb:{name:\"createUserWithEmailAndPassword\",i:[V(\"email\"),V(\"password\")]},sb:{name:\"createUserAndRetrieveDataWithEmailAndPassword\",i:[V(\"email\"),V(\"password\")]},Vb:{name:\"fetchProvidersForEmail\",i:[V(\"email\")]},Wb:{name:\"fetchSignInMethodsForEmail\",i:[V(\"email\")]},da:{name:\"getRedirectResult\",i:[]},kc:{name:\"isSignInWithEmailLink\",i:[V(\"emailLink\")]},\nrc:{name:\"onAuthStateChanged\",i:[X(W(),nm(),\"nextOrObserver\"),nm(\"opt_error\",!0),nm(\"opt_completed\",!0)]},sc:{name:\"onIdTokenChanged\",i:[X(W(),nm(),\"nextOrObserver\"),nm(\"opt_error\",!0),nm(\"opt_completed\",!0)]},gb:{name:\"sendPasswordResetEmail\",i:[V(\"email\"),X(W(\"opt_actionCodeSettings\",!0),om(null,!0),\"opt_actionCodeSettings\",!0)]},hb:{name:\"sendSignInLinkToEmail\",i:[V(\"email\"),W(\"actionCodeSettings\")]},ib:{name:\"setPersistence\",i:[V(\"persistence\")]},Oa:{name:\"signInAndRetrieveDataWithCredential\",\ni:[sm()]},jb:{name:\"signInAnonymously\",i:[]},Jb:{name:\"signInAnonymouslyAndRetrieveData\",i:[]},Bc:{name:\"signInWithCredential\",i:[sm()]},Cc:{name:\"signInWithCustomToken\",i:[V(\"token\")]},Hb:{name:\"signInAndRetrieveDataWithCustomToken\",i:[V(\"token\")]},Dc:{name:\"signInWithEmailAndPassword\",i:[V(\"email\"),V(\"password\")]},Ec:{name:\"signInWithEmailLink\",i:[V(\"email\"),V(\"emailLink\",!0)]},Ib:{name:\"signInAndRetrieveDataWithEmailAndPassword\",i:[V(\"email\"),V(\"password\")]},Fc:{name:\"signInWithPhoneNumber\",i:[V(\"phoneNumber\"),\num()]},Gc:{name:\"signInWithPopup\",i:[tm()]},Hc:{name:\"signInWithRedirect\",i:[tm()]},kb:{name:\"signOut\",i:[]},toJSON:{name:\"toJSON\",i:[V(null,!0)]},Oc:{name:\"useDeviceLanguage\",i:[]},Pc:{name:\"verifyPasswordResetCode\",i:[V(\"code\")]}});(function(a,b){for(var c in b){var d=b[c].name;if(d!==c){var e=b[c].Rb;Object.defineProperty(a,d,{get:function(){return this[c]},set:function(a){km(d,[e],[a],!0);this[c]=a},enumerable:!0})}}})(Gl.prototype,{lc:{name:\"languageCode\",Rb:X(V(),om(),\"languageCode\")}});\nGl.Persistence=oj;Gl.Persistence.LOCAL=\"local\";Gl.Persistence.SESSION=\"session\";Gl.Persistence.NONE=\"none\";\nY(Lk.prototype,{\"delete\":{name:\"delete\",i:[]},ac:{name:\"getIdTokenResult\",i:[mm()]},F:{name:\"getIdToken\",i:[mm()]},getToken:{name:\"getToken\",i:[mm()]},$a:{name:\"linkAndRetrieveDataWithCredential\",i:[sm()]},mc:{name:\"linkWithCredential\",i:[sm()]},nc:{name:\"linkWithPhoneNumber\",i:[V(\"phoneNumber\"),um()]},oc:{name:\"linkWithPopup\",i:[tm()]},pc:{name:\"linkWithRedirect\",i:[tm()]},bb:{name:\"reauthenticateAndRetrieveDataWithCredential\",i:[sm()]},vc:{name:\"reauthenticateWithCredential\",i:[sm()]},wc:{name:\"reauthenticateWithPhoneNumber\",\ni:[V(\"phoneNumber\"),um()]},xc:{name:\"reauthenticateWithPopup\",i:[tm()]},yc:{name:\"reauthenticateWithRedirect\",i:[tm()]},reload:{name:\"reload\",i:[]},fb:{name:\"sendEmailVerification\",i:[X(W(\"opt_actionCodeSettings\",!0),om(null,!0),\"opt_actionCodeSettings\",!0)]},toJSON:{name:\"toJSON\",i:[V(null,!0)]},Mc:{name:\"unlink\",i:[V(\"provider\")]},mb:{name:\"updateEmail\",i:[V(\"email\")]},nb:{name:\"updatePassword\",i:[V(\"password\")]},Nc:{name:\"updatePhoneNumber\",i:[sm(\"phone\")]},ob:{name:\"updateProfile\",i:[W(\"profile\")]}});\nY(z.prototype,{ha:{name:\"finally\"},m:{name:\"catch\"},then:{name:\"then\"}});Y(xk.prototype,{confirm:{name:\"confirm\",i:[V(\"verificationCode\")]}});Z(O,\"credential\",function(a,b){return new Vf(a,b)},[V(\"email\"),V(\"password\")]);Y(Nf.prototype,{ta:{name:\"addScope\",i:[V(\"scope\")]},Ca:{name:\"setCustomParameters\",i:[W(\"customOAuthParameters\")]}});Z(Nf,\"credential\",Of,[X(V(),W(),\"token\")]);Z(O,\"credentialWithLink\",$f,[V(\"email\"),V(\"emailLink\")]);\nY(Pf.prototype,{ta:{name:\"addScope\",i:[V(\"scope\")]},Ca:{name:\"setCustomParameters\",i:[W(\"customOAuthParameters\")]}});Z(Pf,\"credential\",Qf,[X(V(),W(),\"token\")]);Y(Rf.prototype,{ta:{name:\"addScope\",i:[V(\"scope\")]},Ca:{name:\"setCustomParameters\",i:[W(\"customOAuthParameters\")]}});Z(Rf,\"credential\",Sf,[X(V(),X(W(),om()),\"idToken\"),X(V(),om(),\"accessToken\",!0)]);Y(Tf.prototype,{Ca:{name:\"setCustomParameters\",i:[W(\"customOAuthParameters\")]}});Z(Tf,\"credential\",Uf,[X(V(),W(),\"token\"),V(\"secret\",!0)]);\nY(N.prototype,{ta:{name:\"addScope\",i:[V(\"scope\")]},credential:{name:\"credential\",i:[X(V(),om(),\"idToken\",!0),X(V(),om(),\"accessToken\",!0)]},Ca:{name:\"setCustomParameters\",i:[W(\"customOAuthParameters\")]}});Z(fg,\"credential\",hg,[V(\"verificationId\"),V(\"verificationCode\")]);Y(fg.prototype,{Sa:{name:\"verifyPhoneNumber\",i:[V(\"phoneNumber\"),um()]}});Y(M.prototype,{toJSON:{name:\"toJSON\",i:[V(null,!0)]}});Y(pg.prototype,{toJSON:{name:\"toJSON\",i:[V(null,!0)]}});\nY(og.prototype,{toJSON:{name:\"toJSON\",i:[V(null,!0)]}});Y(jm.prototype,{clear:{name:\"clear\",i:[]},render:{name:\"render\",i:[]},verify:{name:\"verify\",i:[]}});\n(function(){if(\"undefined\"!==typeof firebase&&firebase.INTERNAL&&firebase.INTERNAL.registerService){var a={Auth:Gl,Error:M};Z(a,\"EmailAuthProvider\",O,[]);Z(a,\"FacebookAuthProvider\",Nf,[]);Z(a,\"GithubAuthProvider\",Pf,[]);Z(a,\"GoogleAuthProvider\",Rf,[]);Z(a,\"TwitterAuthProvider\",Tf,[]);Z(a,\"OAuthProvider\",N,[V(\"providerId\")]);Z(a,\"PhoneAuthProvider\",fg,[qm()]);Z(a,\"RecaptchaVerifier\",jm,[X(V(),pm(),\"recaptchaContainer\"),W(\"recaptchaParameters\",!0),rm()]);firebase.INTERNAL.registerService(\"auth\",function(a,\nc){a=new Gl(a);c({INTERNAL:{getUid:r(a.getUid,a),getToken:r(a.$b,a),addAuthTokenListener:r(a.Qb,a),removeAuthTokenListener:r(a.zc,a)}});return a},a,function(a,c){if(\"create\"===a)try{c.auth()}catch(d){}});firebase.INTERNAL.extendNamespace({User:Lk})}else throw Error(\"Cannot find the firebase namespace; be sure to include firebase-app.js before this library.\");})();\n}).call(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {});\n","import { jsonEval, stringify, contains, assert, forEach, base64, Sha1, stringToByteArray, isNodeSdk, stringLength, safeGet, errorPrefix, validateArgCount, validateCallback, Deferred, assertionError, clone, map, getCount, getAnyKey, every, validateContextObject, isEmpty, getValues, findValue, findKey, deepCopy, isMobileCordova, base64Encode, CONSTANTS, isAdmin, isValidFormat, isReactNative, querystring } from '@firebase/util';\nimport { Logger, LogLevel } from '@firebase/logger';\nimport { __awaiter, __generator, __extends } from 'tslib';\nimport firebase from '@firebase/app';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Wraps a DOM Storage object and:\r\n * - automatically encode objects as JSON strings before storing them to allow us to store arbitrary types.\r\n * - prefixes names with \"firebase:\" to avoid collisions with app data.\r\n *\r\n * We automatically (see storage.js) create two such wrappers, one for sessionStorage,\r\n * and one for localStorage.\r\n *\r\n * @constructor\r\n */\r\nvar DOMStorageWrapper = /** @class */ (function () {\r\n /**\r\n * @param {Storage} domStorage_ The underlying storage object (e.g. localStorage or sessionStorage)\r\n */\r\n function DOMStorageWrapper(domStorage_) {\r\n this.domStorage_ = domStorage_;\r\n // Use a prefix to avoid collisions with other stuff saved by the app.\r\n this.prefix_ = 'firebase:';\r\n }\r\n /**\r\n * @param {string} key The key to save the value under\r\n * @param {?Object} value The value being stored, or null to remove the key.\r\n */\r\n DOMStorageWrapper.prototype.set = function (key, value) {\r\n if (value == null) {\r\n this.domStorage_.removeItem(this.prefixedName_(key));\r\n }\r\n else {\r\n this.domStorage_.setItem(this.prefixedName_(key), stringify(value));\r\n }\r\n };\r\n /**\r\n * @param {string} key\r\n * @return {*} The value that was stored under this key, or null\r\n */\r\n DOMStorageWrapper.prototype.get = function (key) {\r\n var storedVal = this.domStorage_.getItem(this.prefixedName_(key));\r\n if (storedVal == null) {\r\n return null;\r\n }\r\n else {\r\n return jsonEval(storedVal);\r\n }\r\n };\r\n /**\r\n * @param {string} key\r\n */\r\n DOMStorageWrapper.prototype.remove = function (key) {\r\n this.domStorage_.removeItem(this.prefixedName_(key));\r\n };\r\n /**\r\n * @param {string} name\r\n * @return {string}\r\n */\r\n DOMStorageWrapper.prototype.prefixedName_ = function (name) {\r\n return this.prefix_ + name;\r\n };\r\n DOMStorageWrapper.prototype.toString = function () {\r\n return this.domStorage_.toString();\r\n };\r\n return DOMStorageWrapper;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An in-memory storage implementation that matches the API of DOMStorageWrapper\r\n * (TODO: create interface for both to implement).\r\n *\r\n * @constructor\r\n */\r\nvar MemoryStorage = /** @class */ (function () {\r\n function MemoryStorage() {\r\n this.cache_ = {};\r\n this.isInMemoryStorage = true;\r\n }\r\n MemoryStorage.prototype.set = function (key, value) {\r\n if (value == null) {\r\n delete this.cache_[key];\r\n }\r\n else {\r\n this.cache_[key] = value;\r\n }\r\n };\r\n MemoryStorage.prototype.get = function (key) {\r\n if (contains(this.cache_, key)) {\r\n return this.cache_[key];\r\n }\r\n return null;\r\n };\r\n MemoryStorage.prototype.remove = function (key) {\r\n delete this.cache_[key];\r\n };\r\n return MemoryStorage;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Helper to create a DOMStorageWrapper or else fall back to MemoryStorage.\r\n * TODO: Once MemoryStorage and DOMStorageWrapper have a shared interface this method annotation should change\r\n * to reflect this type\r\n *\r\n * @param {string} domStorageName Name of the underlying storage object\r\n * (e.g. 'localStorage' or 'sessionStorage').\r\n * @return {?} Turning off type information until a common interface is defined.\r\n */\r\nvar createStoragefor = function (domStorageName) {\r\n try {\r\n // NOTE: just accessing \"localStorage\" or \"window['localStorage']\" may throw a security exception,\r\n // so it must be inside the try/catch.\r\n if (typeof window !== 'undefined' &&\r\n typeof window[domStorageName] !== 'undefined') {\r\n // Need to test cache. Just because it's here doesn't mean it works\r\n var domStorage = window[domStorageName];\r\n domStorage.setItem('firebase:sentinel', 'cache');\r\n domStorage.removeItem('firebase:sentinel');\r\n return new DOMStorageWrapper(domStorage);\r\n }\r\n }\r\n catch (e) { }\r\n // Failed to create wrapper. Just return in-memory storage.\r\n // TODO: log?\r\n return new MemoryStorage();\r\n};\r\n/** A storage object that lasts across sessions */\r\nvar PersistentStorage = createStoragefor('localStorage');\r\n/** A storage object that only lasts one session */\r\nvar SessionStorage = createStoragefor('sessionStorage');\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar logClient = new Logger('@firebase/database');\r\n/**\r\n * Returns a locally-unique ID (generated by just incrementing up from 0 each time its called).\r\n * @type {function(): number} Generated ID.\r\n */\r\nvar LUIDGenerator = (function () {\r\n var id = 1;\r\n return function () {\r\n return id++;\r\n };\r\n})();\r\n/**\r\n * Sha1 hash of the input string\r\n * @param {!string} str The string to hash\r\n * @return {!string} The resulting hash\r\n */\r\nvar sha1 = function (str) {\r\n var utf8Bytes = stringToByteArray(str);\r\n var sha1 = new Sha1();\r\n sha1.update(utf8Bytes);\r\n var sha1Bytes = sha1.digest();\r\n return base64.encodeByteArray(sha1Bytes);\r\n};\r\n/**\r\n * @param {...*} var_args\r\n * @return {string}\r\n * @private\r\n */\r\nvar buildLogMessage_ = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var message = '';\r\n for (var i = 0; i < var_args.length; i++) {\r\n if (Array.isArray(var_args[i]) ||\r\n (var_args[i] &&\r\n typeof var_args[i] === 'object' &&\r\n typeof var_args[i].length === 'number')) {\r\n message += buildLogMessage_.apply(null, var_args[i]);\r\n }\r\n else if (typeof var_args[i] === 'object') {\r\n message += stringify(var_args[i]);\r\n }\r\n else {\r\n message += var_args[i];\r\n }\r\n message += ' ';\r\n }\r\n return message;\r\n};\r\n/**\r\n * Use this for all debug messages in Firebase.\r\n * @type {?function(string)}\r\n */\r\nvar logger = null;\r\n/**\r\n * Flag to check for log availability on first log message\r\n * @type {boolean}\r\n * @private\r\n */\r\nvar firstLog_ = true;\r\n/**\r\n * The implementation of Firebase.enableLogging (defined here to break dependencies)\r\n * @param {boolean|?function(string)} logger_ A flag to turn on logging, or a custom logger\r\n * @param {boolean=} persistent Whether or not to persist logging settings across refreshes\r\n */\r\nvar enableLogging = function (logger_, persistent) {\r\n assert(!persistent || (logger_ === true || logger_ === false), \"Can't turn on custom loggers persistently.\");\r\n if (logger_ === true) {\r\n logClient.logLevel = LogLevel.VERBOSE;\r\n logger = logClient.log.bind(logClient);\r\n if (persistent)\r\n SessionStorage.set('logging_enabled', true);\r\n }\r\n else if (typeof logger_ === 'function') {\r\n logger = logger_;\r\n }\r\n else {\r\n logger = null;\r\n SessionStorage.remove('logging_enabled');\r\n }\r\n};\r\n/**\r\n *\r\n * @param {...(string|Arguments)} var_args\r\n */\r\nvar log = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n if (firstLog_ === true) {\r\n firstLog_ = false;\r\n if (logger === null && SessionStorage.get('logging_enabled') === true)\r\n enableLogging(true);\r\n }\r\n if (logger) {\r\n var message = buildLogMessage_.apply(null, var_args);\r\n logger(message);\r\n }\r\n};\r\n/**\r\n * @param {!string} prefix\r\n * @return {function(...[*])}\r\n */\r\nvar logWrapper = function (prefix) {\r\n return function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n log.apply(void 0, [prefix].concat(var_args));\r\n };\r\n};\r\n/**\r\n * @param {...string} var_args\r\n */\r\nvar error = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var message = 'FIREBASE INTERNAL ERROR: ' + buildLogMessage_.apply(void 0, var_args);\r\n logClient.error(message);\r\n};\r\n/**\r\n * @param {...string} var_args\r\n */\r\nvar fatal = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var message = \"FIREBASE FATAL ERROR: \" + buildLogMessage_.apply(void 0, var_args);\r\n logClient.error(message);\r\n throw new Error(message);\r\n};\r\n/**\r\n * @param {...*} var_args\r\n */\r\nvar warn = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var message = 'FIREBASE WARNING: ' + buildLogMessage_.apply(void 0, var_args);\r\n logClient.warn(message);\r\n};\r\n/**\r\n * Logs a warning if the containing page uses https. Called when a call to new Firebase\r\n * does not use https.\r\n */\r\nvar warnIfPageIsSecure = function () {\r\n // Be very careful accessing browser globals. Who knows what may or may not exist.\r\n if (typeof window !== 'undefined' &&\r\n window.location &&\r\n window.location.protocol &&\r\n window.location.protocol.indexOf('https:') !== -1) {\r\n warn('Insecure Firebase access from a secure page. ' +\r\n 'Please use https in calls to new Firebase().');\r\n }\r\n};\r\n/**\r\n * Returns true if data is NaN, or +/- Infinity.\r\n * @param {*} data\r\n * @return {boolean}\r\n */\r\nvar isInvalidJSONNumber = function (data) {\r\n return (typeof data === 'number' &&\r\n (data != data || // NaN\r\n data == Number.POSITIVE_INFINITY ||\r\n data == Number.NEGATIVE_INFINITY));\r\n};\r\n/**\r\n * @param {function()} fn\r\n */\r\nvar executeWhenDOMReady = function (fn) {\r\n if (isNodeSdk() || document.readyState === 'complete') {\r\n fn();\r\n }\r\n else {\r\n // Modeled after jQuery. Try DOMContentLoaded and onreadystatechange (which\r\n // fire before onload), but fall back to onload.\r\n var called_1 = false;\r\n var wrappedFn_1 = function () {\r\n if (!document.body) {\r\n setTimeout(wrappedFn_1, Math.floor(10));\r\n return;\r\n }\r\n if (!called_1) {\r\n called_1 = true;\r\n fn();\r\n }\r\n };\r\n if (document.addEventListener) {\r\n document.addEventListener('DOMContentLoaded', wrappedFn_1, false);\r\n // fallback to onload.\r\n window.addEventListener('load', wrappedFn_1, false);\r\n }\r\n else if (document.attachEvent) {\r\n // IE.\r\n document.attachEvent('onreadystatechange', function () {\r\n if (document.readyState === 'complete')\r\n wrappedFn_1();\r\n });\r\n // fallback to onload.\r\n window.attachEvent('onload', wrappedFn_1);\r\n // jQuery has an extra hack for IE that we could employ (based on\r\n // http://javascript.nwbox.com/IEContentLoaded/) But it looks really old.\r\n // I'm hoping we don't need it.\r\n }\r\n }\r\n};\r\n/**\r\n * Minimum key name. Invalid for actual data, used as a marker to sort before any valid names\r\n * @type {!string}\r\n */\r\nvar MIN_NAME = '[MIN_NAME]';\r\n/**\r\n * Maximum key name. Invalid for actual data, used as a marker to sort above any valid names\r\n * @type {!string}\r\n */\r\nvar MAX_NAME = '[MAX_NAME]';\r\n/**\r\n * Compares valid Firebase key names, plus min and max name\r\n * @param {!string} a\r\n * @param {!string} b\r\n * @return {!number}\r\n */\r\nvar nameCompare = function (a, b) {\r\n if (a === b) {\r\n return 0;\r\n }\r\n else if (a === MIN_NAME || b === MAX_NAME) {\r\n return -1;\r\n }\r\n else if (b === MIN_NAME || a === MAX_NAME) {\r\n return 1;\r\n }\r\n else {\r\n var aAsInt = tryParseInt(a), bAsInt = tryParseInt(b);\r\n if (aAsInt !== null) {\r\n if (bAsInt !== null) {\r\n return aAsInt - bAsInt == 0 ? a.length - b.length : aAsInt - bAsInt;\r\n }\r\n else {\r\n return -1;\r\n }\r\n }\r\n else if (bAsInt !== null) {\r\n return 1;\r\n }\r\n else {\r\n return a < b ? -1 : 1;\r\n }\r\n }\r\n};\r\n/**\r\n * @param {!string} a\r\n * @param {!string} b\r\n * @return {!number} comparison result.\r\n */\r\nvar stringCompare = function (a, b) {\r\n if (a === b) {\r\n return 0;\r\n }\r\n else if (a < b) {\r\n return -1;\r\n }\r\n else {\r\n return 1;\r\n }\r\n};\r\n/**\r\n * @param {string} key\r\n * @param {Object} obj\r\n * @return {*}\r\n */\r\nvar requireKey = function (key, obj) {\r\n if (obj && key in obj) {\r\n return obj[key];\r\n }\r\n else {\r\n throw new Error('Missing required key (' + key + ') in object: ' + stringify(obj));\r\n }\r\n};\r\n/**\r\n * @param {*} obj\r\n * @return {string}\r\n */\r\nvar ObjectToUniqueKey = function (obj) {\r\n if (typeof obj !== 'object' || obj === null)\r\n return stringify(obj);\r\n var keys = [];\r\n for (var k in obj) {\r\n keys.push(k);\r\n }\r\n // Export as json, but with the keys sorted.\r\n keys.sort();\r\n var key = '{';\r\n for (var i = 0; i < keys.length; i++) {\r\n if (i !== 0)\r\n key += ',';\r\n key += stringify(keys[i]);\r\n key += ':';\r\n key += ObjectToUniqueKey(obj[keys[i]]);\r\n }\r\n key += '}';\r\n return key;\r\n};\r\n/**\r\n * Splits a string into a number of smaller segments of maximum size\r\n * @param {!string} str The string\r\n * @param {!number} segsize The maximum number of chars in the string.\r\n * @return {Array.} The string, split into appropriately-sized chunks\r\n */\r\nvar splitStringBySize = function (str, segsize) {\r\n var len = str.length;\r\n if (len <= segsize) {\r\n return [str];\r\n }\r\n var dataSegs = [];\r\n for (var c = 0; c < len; c += segsize) {\r\n if (c + segsize > len) {\r\n dataSegs.push(str.substring(c, len));\r\n }\r\n else {\r\n dataSegs.push(str.substring(c, c + segsize));\r\n }\r\n }\r\n return dataSegs;\r\n};\r\n/**\r\n * Apply a function to each (key, value) pair in an object or\r\n * apply a function to each (index, value) pair in an array\r\n * @param {!(Object|Array)} obj The object or array to iterate over\r\n * @param {function(?, ?)} fn The function to apply\r\n */\r\nvar each = function (obj, fn) {\r\n if (Array.isArray(obj)) {\r\n for (var i = 0; i < obj.length; ++i) {\r\n fn(i, obj[i]);\r\n }\r\n }\r\n else {\r\n /**\r\n * in the conversion of code we removed the goog.object.forEach\r\n * function which did a value,key callback. We standardized on\r\n * a single impl that does a key, value callback. So we invert\r\n * to not have to touch the `each` code points\r\n */\r\n forEach(obj, function (key, val) { return fn(val, key); });\r\n }\r\n};\r\n/**\r\n * Borrowed from http://hg.secondlife.com/llsd/src/tip/js/typedarray.js (MIT License)\r\n * I made one modification at the end and removed the NaN / Infinity\r\n * handling (since it seemed broken [caused an overflow] and we don't need it). See MJL comments.\r\n * @param {!number} v A double\r\n * @return {string}\r\n */\r\nvar doubleToIEEE754String = function (v) {\r\n assert(!isInvalidJSONNumber(v), 'Invalid JSON number'); // MJL\r\n var ebits = 11, fbits = 52;\r\n var bias = (1 << (ebits - 1)) - 1, s, e, f, ln, i, bits, str;\r\n // Compute sign, exponent, fraction\r\n // Skip NaN / Infinity handling --MJL.\r\n if (v === 0) {\r\n e = 0;\r\n f = 0;\r\n s = 1 / v === -Infinity ? 1 : 0;\r\n }\r\n else {\r\n s = v < 0;\r\n v = Math.abs(v);\r\n if (v >= Math.pow(2, 1 - bias)) {\r\n // Normalized\r\n ln = Math.min(Math.floor(Math.log(v) / Math.LN2), bias);\r\n e = ln + bias;\r\n f = Math.round(v * Math.pow(2, fbits - ln) - Math.pow(2, fbits));\r\n }\r\n else {\r\n // Denormalized\r\n e = 0;\r\n f = Math.round(v / Math.pow(2, 1 - bias - fbits));\r\n }\r\n }\r\n // Pack sign, exponent, fraction\r\n bits = [];\r\n for (i = fbits; i; i -= 1) {\r\n bits.push(f % 2 ? 1 : 0);\r\n f = Math.floor(f / 2);\r\n }\r\n for (i = ebits; i; i -= 1) {\r\n bits.push(e % 2 ? 1 : 0);\r\n e = Math.floor(e / 2);\r\n }\r\n bits.push(s ? 1 : 0);\r\n bits.reverse();\r\n str = bits.join('');\r\n // Return the data as a hex string. --MJL\r\n var hexByteString = '';\r\n for (i = 0; i < 64; i += 8) {\r\n var hexByte = parseInt(str.substr(i, 8), 2).toString(16);\r\n if (hexByte.length === 1)\r\n hexByte = '0' + hexByte;\r\n hexByteString = hexByteString + hexByte;\r\n }\r\n return hexByteString.toLowerCase();\r\n};\r\n/**\r\n * Used to detect if we're in a Chrome content script (which executes in an\r\n * isolated environment where long-polling doesn't work).\r\n * @return {boolean}\r\n */\r\nvar isChromeExtensionContentScript = function () {\r\n return !!(typeof window === 'object' &&\r\n window['chrome'] &&\r\n window['chrome']['extension'] &&\r\n !/^chrome/.test(window.location.href));\r\n};\r\n/**\r\n * Used to detect if we're in a Windows 8 Store app.\r\n * @return {boolean}\r\n */\r\nvar isWindowsStoreApp = function () {\r\n // Check for the presence of a couple WinRT globals\r\n return typeof Windows === 'object' && typeof Windows.UI === 'object';\r\n};\r\n/**\r\n * Converts a server error code to a Javascript Error\r\n * @param {!string} code\r\n * @param {!Query} query\r\n * @return {Error}\r\n */\r\nvar errorForServerCode = function (code, query) {\r\n var reason = 'Unknown Error';\r\n if (code === 'too_big') {\r\n reason =\r\n 'The data requested exceeds the maximum size ' +\r\n 'that can be accessed with a single request.';\r\n }\r\n else if (code == 'permission_denied') {\r\n reason = \"Client doesn't have permission to access the desired data.\";\r\n }\r\n else if (code == 'unavailable') {\r\n reason = 'The service is unavailable';\r\n }\r\n var error = new Error(code + ' at ' + query.path.toString() + ': ' + reason);\r\n error.code = code.toUpperCase();\r\n return error;\r\n};\r\n/**\r\n * Used to test for integer-looking strings\r\n * @type {RegExp}\r\n * @private\r\n */\r\nvar INTEGER_REGEXP_ = new RegExp('^-?\\\\d{1,10}$');\r\n/**\r\n * If the string contains a 32-bit integer, return it. Else return null.\r\n * @param {!string} str\r\n * @return {?number}\r\n */\r\nvar tryParseInt = function (str) {\r\n if (INTEGER_REGEXP_.test(str)) {\r\n var intVal = Number(str);\r\n if (intVal >= -2147483648 && intVal <= 2147483647) {\r\n return intVal;\r\n }\r\n }\r\n return null;\r\n};\r\n/**\r\n * Helper to run some code but catch any exceptions and re-throw them later.\r\n * Useful for preventing user callbacks from breaking internal code.\r\n *\r\n * Re-throwing the exception from a setTimeout is a little evil, but it's very\r\n * convenient (we don't have to try to figure out when is a safe point to\r\n * re-throw it), and the behavior seems reasonable:\r\n *\r\n * * If you aren't pausing on exceptions, you get an error in the console with\r\n * the correct stack trace.\r\n * * If you're pausing on all exceptions, the debugger will pause on your\r\n * exception and then again when we rethrow it.\r\n * * If you're only pausing on uncaught exceptions, the debugger will only pause\r\n * on us re-throwing it.\r\n *\r\n * @param {!function()} fn The code to guard.\r\n */\r\nvar exceptionGuard = function (fn) {\r\n try {\r\n fn();\r\n }\r\n catch (e) {\r\n // Re-throw exception when it's safe.\r\n setTimeout(function () {\r\n // It used to be that \"throw e\" would result in a good console error with\r\n // relevant context, but as of Chrome 39, you just get the firebase.js\r\n // file/line number where we re-throw it, which is useless. So we log\r\n // e.stack explicitly.\r\n var stack = e.stack || '';\r\n warn('Exception was thrown by user callback.', stack);\r\n throw e;\r\n }, Math.floor(0));\r\n }\r\n};\r\n/**\r\n * @return {boolean} true if we think we're currently being crawled.\r\n */\r\nvar beingCrawled = function () {\r\n var userAgent = (typeof window === 'object' &&\r\n window['navigator'] &&\r\n window['navigator']['userAgent']) ||\r\n '';\r\n // For now we whitelist the most popular crawlers. We should refine this to be the set of crawlers we\r\n // believe to support JavaScript/AJAX rendering.\r\n // NOTE: Google Webmaster Tools doesn't really belong, but their \"This is how a visitor to your website\r\n // would have seen the page\" is flaky if we don't treat it as a crawler.\r\n return (userAgent.search(/googlebot|google webmaster tools|bingbot|yahoo! slurp|baiduspider|yandexbot|duckduckbot/i) >= 0);\r\n};\r\n/**\r\n * Same as setTimeout() except on Node.JS it will /not/ prevent the process from exiting.\r\n *\r\n * It is removed with clearTimeout() as normal.\r\n *\r\n * @param {Function} fn Function to run.\r\n * @param {number} time Milliseconds to wait before running.\r\n * @return {number|Object} The setTimeout() return value.\r\n */\r\nvar setTimeoutNonBlocking = function (fn, time) {\r\n var timeout = setTimeout(fn, time);\r\n if (typeof timeout === 'object' && timeout['unref']) {\r\n timeout['unref']();\r\n }\r\n return timeout;\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An immutable object representing a parsed path. It's immutable so that you\r\n * can pass them around to other functions without worrying about them changing\r\n * it.\r\n */\r\nvar Path = /** @class */ (function () {\r\n /**\r\n * @param {string|Array.} pathOrString Path string to parse,\r\n * or another path, or the raw tokens array\r\n * @param {number=} pieceNum\r\n */\r\n function Path(pathOrString, pieceNum) {\r\n if (pieceNum === void 0) {\r\n this.pieces_ = pathOrString.split('/');\r\n // Remove empty pieces.\r\n var copyTo = 0;\r\n for (var i = 0; i < this.pieces_.length; i++) {\r\n if (this.pieces_[i].length > 0) {\r\n this.pieces_[copyTo] = this.pieces_[i];\r\n copyTo++;\r\n }\r\n }\r\n this.pieces_.length = copyTo;\r\n this.pieceNum_ = 0;\r\n }\r\n else {\r\n this.pieces_ = pathOrString;\r\n this.pieceNum_ = pieceNum;\r\n }\r\n }\r\n Object.defineProperty(Path, \"Empty\", {\r\n /**\r\n * Singleton to represent an empty path\r\n *\r\n * @const\r\n */\r\n get: function () {\r\n return new Path('');\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Path.prototype.getFront = function () {\r\n if (this.pieceNum_ >= this.pieces_.length)\r\n return null;\r\n return this.pieces_[this.pieceNum_];\r\n };\r\n /**\r\n * @return {number} The number of segments in this path\r\n */\r\n Path.prototype.getLength = function () {\r\n return this.pieces_.length - this.pieceNum_;\r\n };\r\n /**\r\n * @return {!Path}\r\n */\r\n Path.prototype.popFront = function () {\r\n var pieceNum = this.pieceNum_;\r\n if (pieceNum < this.pieces_.length) {\r\n pieceNum++;\r\n }\r\n return new Path(this.pieces_, pieceNum);\r\n };\r\n /**\r\n * @return {?string}\r\n */\r\n Path.prototype.getBack = function () {\r\n if (this.pieceNum_ < this.pieces_.length)\r\n return this.pieces_[this.pieces_.length - 1];\r\n return null;\r\n };\r\n Path.prototype.toString = function () {\r\n var pathString = '';\r\n for (var i = this.pieceNum_; i < this.pieces_.length; i++) {\r\n if (this.pieces_[i] !== '')\r\n pathString += '/' + this.pieces_[i];\r\n }\r\n return pathString || '/';\r\n };\r\n Path.prototype.toUrlEncodedString = function () {\r\n var pathString = '';\r\n for (var i = this.pieceNum_; i < this.pieces_.length; i++) {\r\n if (this.pieces_[i] !== '')\r\n pathString += '/' + encodeURIComponent(String(this.pieces_[i]));\r\n }\r\n return pathString || '/';\r\n };\r\n /**\r\n * Shallow copy of the parts of the path.\r\n *\r\n * @param {number=} begin\r\n * @return {!Array}\r\n */\r\n Path.prototype.slice = function (begin) {\r\n if (begin === void 0) { begin = 0; }\r\n return this.pieces_.slice(this.pieceNum_ + begin);\r\n };\r\n /**\r\n * @return {?Path}\r\n */\r\n Path.prototype.parent = function () {\r\n if (this.pieceNum_ >= this.pieces_.length)\r\n return null;\r\n var pieces = [];\r\n for (var i = this.pieceNum_; i < this.pieces_.length - 1; i++)\r\n pieces.push(this.pieces_[i]);\r\n return new Path(pieces, 0);\r\n };\r\n /**\r\n * @param {string|!Path} childPathObj\r\n * @return {!Path}\r\n */\r\n Path.prototype.child = function (childPathObj) {\r\n var pieces = [];\r\n for (var i = this.pieceNum_; i < this.pieces_.length; i++)\r\n pieces.push(this.pieces_[i]);\r\n if (childPathObj instanceof Path) {\r\n for (var i = childPathObj.pieceNum_; i < childPathObj.pieces_.length; i++) {\r\n pieces.push(childPathObj.pieces_[i]);\r\n }\r\n }\r\n else {\r\n var childPieces = childPathObj.split('/');\r\n for (var i = 0; i < childPieces.length; i++) {\r\n if (childPieces[i].length > 0)\r\n pieces.push(childPieces[i]);\r\n }\r\n }\r\n return new Path(pieces, 0);\r\n };\r\n /**\r\n * @return {boolean} True if there are no segments in this path\r\n */\r\n Path.prototype.isEmpty = function () {\r\n return this.pieceNum_ >= this.pieces_.length;\r\n };\r\n /**\r\n * @param {!Path} outerPath\r\n * @param {!Path} innerPath\r\n * @return {!Path} The path from outerPath to innerPath\r\n */\r\n Path.relativePath = function (outerPath, innerPath) {\r\n var outer = outerPath.getFront(), inner = innerPath.getFront();\r\n if (outer === null) {\r\n return innerPath;\r\n }\r\n else if (outer === inner) {\r\n return Path.relativePath(outerPath.popFront(), innerPath.popFront());\r\n }\r\n else {\r\n throw new Error('INTERNAL ERROR: innerPath (' +\r\n innerPath +\r\n ') is not within ' +\r\n 'outerPath (' +\r\n outerPath +\r\n ')');\r\n }\r\n };\r\n /**\r\n * @param {!Path} left\r\n * @param {!Path} right\r\n * @return {number} -1, 0, 1 if left is less, equal, or greater than the right.\r\n */\r\n Path.comparePaths = function (left, right) {\r\n var leftKeys = left.slice();\r\n var rightKeys = right.slice();\r\n for (var i = 0; i < leftKeys.length && i < rightKeys.length; i++) {\r\n var cmp = nameCompare(leftKeys[i], rightKeys[i]);\r\n if (cmp !== 0)\r\n return cmp;\r\n }\r\n if (leftKeys.length === rightKeys.length)\r\n return 0;\r\n return leftKeys.length < rightKeys.length ? -1 : 1;\r\n };\r\n /**\r\n *\r\n * @param {Path} other\r\n * @return {boolean} true if paths are the same.\r\n */\r\n Path.prototype.equals = function (other) {\r\n if (this.getLength() !== other.getLength()) {\r\n return false;\r\n }\r\n for (var i = this.pieceNum_, j = other.pieceNum_; i <= this.pieces_.length; i++, j++) {\r\n if (this.pieces_[i] !== other.pieces_[j]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n /**\r\n *\r\n * @param {!Path} other\r\n * @return {boolean} True if this path is a parent (or the same as) other\r\n */\r\n Path.prototype.contains = function (other) {\r\n var i = this.pieceNum_;\r\n var j = other.pieceNum_;\r\n if (this.getLength() > other.getLength()) {\r\n return false;\r\n }\r\n while (i < this.pieces_.length) {\r\n if (this.pieces_[i] !== other.pieces_[j]) {\r\n return false;\r\n }\r\n ++i;\r\n ++j;\r\n }\r\n return true;\r\n };\r\n return Path;\r\n}()); // end Path\r\n/**\r\n * Dynamic (mutable) path used to count path lengths.\r\n *\r\n * This class is used to efficiently check paths for valid\r\n * length (in UTF8 bytes) and depth (used in path validation).\r\n *\r\n * Throws Error exception if path is ever invalid.\r\n *\r\n * The definition of a path always begins with '/'.\r\n */\r\nvar ValidationPath = /** @class */ (function () {\r\n /**\r\n * @param {!Path} path Initial Path.\r\n * @param {string} errorPrefix_ Prefix for any error messages.\r\n */\r\n function ValidationPath(path, errorPrefix_) {\r\n this.errorPrefix_ = errorPrefix_;\r\n /** @type {!Array} */\r\n this.parts_ = path.slice();\r\n /** @type {number} Initialize to number of '/' chars needed in path. */\r\n this.byteLength_ = Math.max(1, this.parts_.length);\r\n for (var i = 0; i < this.parts_.length; i++) {\r\n this.byteLength_ += stringLength(this.parts_[i]);\r\n }\r\n this.checkValid_();\r\n }\r\n Object.defineProperty(ValidationPath, \"MAX_PATH_DEPTH\", {\r\n /** @const {number} Maximum key depth. */\r\n get: function () {\r\n return 32;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValidationPath, \"MAX_PATH_LENGTH_BYTES\", {\r\n /** @const {number} Maximum number of (UTF8) bytes in a Firebase path. */\r\n get: function () {\r\n return 768;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /** @param {string} child */\r\n ValidationPath.prototype.push = function (child) {\r\n // Count the needed '/'\r\n if (this.parts_.length > 0) {\r\n this.byteLength_ += 1;\r\n }\r\n this.parts_.push(child);\r\n this.byteLength_ += stringLength(child);\r\n this.checkValid_();\r\n };\r\n ValidationPath.prototype.pop = function () {\r\n var last = this.parts_.pop();\r\n this.byteLength_ -= stringLength(last);\r\n // Un-count the previous '/'\r\n if (this.parts_.length > 0) {\r\n this.byteLength_ -= 1;\r\n }\r\n };\r\n ValidationPath.prototype.checkValid_ = function () {\r\n if (this.byteLength_ > ValidationPath.MAX_PATH_LENGTH_BYTES) {\r\n throw new Error(this.errorPrefix_ +\r\n 'has a key path longer than ' +\r\n ValidationPath.MAX_PATH_LENGTH_BYTES +\r\n ' bytes (' +\r\n this.byteLength_ +\r\n ').');\r\n }\r\n if (this.parts_.length > ValidationPath.MAX_PATH_DEPTH) {\r\n throw new Error(this.errorPrefix_ +\r\n 'path specified exceeds the maximum depth that can be written (' +\r\n ValidationPath.MAX_PATH_DEPTH +\r\n ') or object contains a cycle ' +\r\n this.toErrorString());\r\n }\r\n };\r\n /**\r\n * String for use in error messages - uses '.' notation for path.\r\n *\r\n * @return {string}\r\n */\r\n ValidationPath.prototype.toErrorString = function () {\r\n if (this.parts_.length == 0) {\r\n return '';\r\n }\r\n return \"in property '\" + this.parts_.join('.') + \"'\";\r\n };\r\n return ValidationPath;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar PROTOCOL_VERSION = '5';\r\nvar VERSION_PARAM = 'v';\r\nvar TRANSPORT_SESSION_PARAM = 's';\r\nvar REFERER_PARAM = 'r';\r\nvar FORGE_REF = 'f';\r\nvar FORGE_DOMAIN = 'firebaseio.com';\r\nvar LAST_SESSION_PARAM = 'ls';\r\nvar WEBSOCKET = 'websocket';\r\nvar LONG_POLLING = 'long_polling';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A class that holds metadata about a Repo object\r\n *\r\n * @constructor\r\n */\r\nvar RepoInfo = /** @class */ (function () {\r\n /**\r\n * @param {string} host Hostname portion of the url for the repo\r\n * @param {boolean} secure Whether or not this repo is accessed over ssl\r\n * @param {string} namespace The namespace represented by the repo\r\n * @param {boolean} webSocketOnly Whether to prefer websockets over all other transports (used by Nest).\r\n * @param {string=} persistenceKey Override the default session persistence storage key\r\n */\r\n function RepoInfo(host, secure, namespace, webSocketOnly, persistenceKey) {\r\n if (persistenceKey === void 0) { persistenceKey = ''; }\r\n this.secure = secure;\r\n this.namespace = namespace;\r\n this.webSocketOnly = webSocketOnly;\r\n this.persistenceKey = persistenceKey;\r\n this.host = host.toLowerCase();\r\n this.domain = this.host.substr(this.host.indexOf('.') + 1);\r\n this.internalHost = PersistentStorage.get('host:' + host) || this.host;\r\n }\r\n RepoInfo.prototype.needsQueryParam = function () {\r\n return this.host !== this.internalHost || this.isCustomHost();\r\n };\r\n RepoInfo.prototype.isCacheableHost = function () {\r\n return this.internalHost.substr(0, 2) === 's-';\r\n };\r\n RepoInfo.prototype.isDemoHost = function () {\r\n return this.domain === 'firebaseio-demo.com';\r\n };\r\n RepoInfo.prototype.isCustomHost = function () {\r\n return (this.domain !== 'firebaseio.com' && this.domain !== 'firebaseio-demo.com');\r\n };\r\n RepoInfo.prototype.updateHost = function (newHost) {\r\n if (newHost !== this.internalHost) {\r\n this.internalHost = newHost;\r\n if (this.isCacheableHost()) {\r\n PersistentStorage.set('host:' + this.host, this.internalHost);\r\n }\r\n }\r\n };\r\n /**\r\n * Returns the websocket URL for this repo\r\n * @param {string} type of connection\r\n * @param {Object} params list\r\n * @return {string} The URL for this repo\r\n */\r\n RepoInfo.prototype.connectionURL = function (type, params) {\r\n assert(typeof type === 'string', 'typeof type must == string');\r\n assert(typeof params === 'object', 'typeof params must == object');\r\n var connURL;\r\n if (type === WEBSOCKET) {\r\n connURL =\r\n (this.secure ? 'wss://' : 'ws://') + this.internalHost + '/.ws?';\r\n }\r\n else if (type === LONG_POLLING) {\r\n connURL =\r\n (this.secure ? 'https://' : 'http://') + this.internalHost + '/.lp?';\r\n }\r\n else {\r\n throw new Error('Unknown connection type: ' + type);\r\n }\r\n if (this.needsQueryParam()) {\r\n params['ns'] = this.namespace;\r\n }\r\n var pairs = [];\r\n forEach(params, function (key, value) {\r\n pairs.push(key + '=' + value);\r\n });\r\n return connURL + pairs.join('&');\r\n };\r\n /** @return {string} */\r\n RepoInfo.prototype.toString = function () {\r\n var str = this.toURLString();\r\n if (this.persistenceKey) {\r\n str += '<' + this.persistenceKey + '>';\r\n }\r\n return str;\r\n };\r\n /** @return {string} */\r\n RepoInfo.prototype.toURLString = function () {\r\n return (this.secure ? 'https://' : 'http://') + this.host;\r\n };\r\n return RepoInfo;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param {!string} pathString\r\n * @return {string}\r\n */\r\nfunction decodePath(pathString) {\r\n var pathStringDecoded = '';\r\n var pieces = pathString.split('/');\r\n for (var i = 0; i < pieces.length; i++) {\r\n if (pieces[i].length > 0) {\r\n var piece = pieces[i];\r\n try {\r\n piece = decodeURIComponent(piece.replace(/\\+/g, ' '));\r\n }\r\n catch (e) { }\r\n pathStringDecoded += '/' + piece;\r\n }\r\n }\r\n return pathStringDecoded;\r\n}\r\n/**\r\n * @param {!string} queryString\r\n * @return {!{[key:string]:string}} key value hash\r\n */\r\nfunction decodeQuery(queryString) {\r\n var results = {};\r\n if (queryString.startsWith('?')) {\r\n queryString = queryString.substring(1);\r\n }\r\n for (var _i = 0, _a = queryString.split('&'); _i < _a.length; _i++) {\r\n var segment = _a[_i];\r\n if (segment.length === 0) {\r\n continue;\r\n }\r\n var kv = segment.split('=');\r\n if (kv.length === 2) {\r\n results[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\r\n }\r\n else {\r\n warn(\"Invalid query segment '\" + segment + \"' in query '\" + queryString + \"'\");\r\n }\r\n }\r\n return results;\r\n}\r\n/**\r\n *\r\n * @param {!string} dataURL\r\n * @return {{repoInfo: !RepoInfo, path: !Path}}\r\n */\r\nvar parseRepoInfo = function (dataURL) {\r\n var parsedUrl = parseURL(dataURL), namespace = parsedUrl.subdomain;\r\n if (parsedUrl.domain === 'firebase') {\r\n fatal(parsedUrl.host +\r\n ' is no longer supported. ' +\r\n 'Please use .firebaseio.com instead');\r\n }\r\n // Catch common error of uninitialized namespace value.\r\n if ((!namespace || namespace == 'undefined') &&\r\n parsedUrl.domain !== 'localhost') {\r\n fatal('Cannot parse Firebase url. Please use https://.firebaseio.com');\r\n }\r\n if (!parsedUrl.secure) {\r\n warnIfPageIsSecure();\r\n }\r\n var webSocketOnly = parsedUrl.scheme === 'ws' || parsedUrl.scheme === 'wss';\r\n return {\r\n repoInfo: new RepoInfo(parsedUrl.host, parsedUrl.secure, namespace, webSocketOnly),\r\n path: new Path(parsedUrl.pathString)\r\n };\r\n};\r\n/**\r\n *\r\n * @param {!string} dataURL\r\n * @return {{host: string, port: number, domain: string, subdomain: string, secure: boolean, scheme: string, pathString: string}}\r\n */\r\nvar parseURL = function (dataURL) {\r\n // Default to empty strings in the event of a malformed string.\r\n var host = '', domain = '', subdomain = '', pathString = '';\r\n // Always default to SSL, unless otherwise specified.\r\n var secure = true, scheme = 'https', port = 443;\r\n // Don't do any validation here. The caller is responsible for validating the result of parsing.\r\n if (typeof dataURL === 'string') {\r\n // Parse scheme.\r\n var colonInd = dataURL.indexOf('//');\r\n if (colonInd >= 0) {\r\n scheme = dataURL.substring(0, colonInd - 1);\r\n dataURL = dataURL.substring(colonInd + 2);\r\n }\r\n // Parse host, path, and query string.\r\n var slashInd = dataURL.indexOf('/');\r\n if (slashInd === -1) {\r\n slashInd = dataURL.length;\r\n }\r\n var questionMarkInd = dataURL.indexOf('?');\r\n if (questionMarkInd === -1) {\r\n questionMarkInd = dataURL.length;\r\n }\r\n host = dataURL.substring(0, Math.min(slashInd, questionMarkInd));\r\n if (slashInd < questionMarkInd) {\r\n // For pathString, questionMarkInd will always come after slashInd\r\n pathString = decodePath(dataURL.substring(slashInd, questionMarkInd));\r\n }\r\n var queryParams = decodeQuery(dataURL.substring(Math.min(dataURL.length, questionMarkInd)));\r\n // If we have a port, use scheme for determining if it's secure.\r\n colonInd = host.indexOf(':');\r\n if (colonInd >= 0) {\r\n secure = scheme === 'https' || scheme === 'wss';\r\n port = parseInt(host.substring(colonInd + 1), 10);\r\n }\r\n else {\r\n colonInd = dataURL.length;\r\n }\r\n var parts = host.split('.');\r\n if (parts.length === 3) {\r\n // Normalize namespaces to lowercase to share storage / connection.\r\n domain = parts[1];\r\n subdomain = parts[0].toLowerCase();\r\n }\r\n else if (parts.length === 2) {\r\n domain = parts[0];\r\n }\r\n else if (parts[0].slice(0, colonInd).toLowerCase() === 'localhost') {\r\n domain = 'localhost';\r\n }\r\n // Support `ns` query param if subdomain not already set\r\n if (subdomain === '' && 'ns' in queryParams) {\r\n subdomain = queryParams['ns'];\r\n }\r\n }\r\n return {\r\n host: host,\r\n port: port,\r\n domain: domain,\r\n subdomain: subdomain,\r\n secure: secure,\r\n scheme: scheme,\r\n pathString: pathString\r\n };\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * True for invalid Firebase keys\r\n * @type {RegExp}\r\n * @private\r\n */\r\nvar INVALID_KEY_REGEX_ = /[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * True for invalid Firebase paths.\r\n * Allows '/' in paths.\r\n * @type {RegExp}\r\n * @private\r\n */\r\nvar INVALID_PATH_REGEX_ = /[\\[\\].#$\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * Maximum number of characters to allow in leaf value\r\n * @type {number}\r\n * @private\r\n */\r\nvar MAX_LEAF_SIZE_ = 10 * 1024 * 1024;\r\n/**\r\n * @param {*} key\r\n * @return {boolean}\r\n */\r\nvar isValidKey = function (key) {\r\n return (typeof key === 'string' && key.length !== 0 && !INVALID_KEY_REGEX_.test(key));\r\n};\r\n/**\r\n * @param {string} pathString\r\n * @return {boolean}\r\n */\r\nvar isValidPathString = function (pathString) {\r\n return (typeof pathString === 'string' &&\r\n pathString.length !== 0 &&\r\n !INVALID_PATH_REGEX_.test(pathString));\r\n};\r\n/**\r\n * @param {string} pathString\r\n * @return {boolean}\r\n */\r\nvar isValidRootPathString = function (pathString) {\r\n if (pathString) {\r\n // Allow '/.info/' at the beginning.\r\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\r\n }\r\n return isValidPathString(pathString);\r\n};\r\n/**\r\n * @param {*} priority\r\n * @return {boolean}\r\n */\r\nvar isValidPriority = function (priority) {\r\n return (priority === null ||\r\n typeof priority === 'string' ||\r\n (typeof priority === 'number' && !isInvalidJSONNumber(priority)) ||\r\n (priority && typeof priority === 'object' && contains(priority, '.sv')));\r\n};\r\n/**\r\n * Pre-validate a datum passed as an argument to Firebase function.\r\n *\r\n * @param {string} fnName\r\n * @param {number} argumentNumber\r\n * @param {*} data\r\n * @param {!Path} path\r\n * @param {boolean} optional\r\n */\r\nvar validateFirebaseDataArg = function (fnName, argumentNumber, data, path, optional) {\r\n if (optional && data === undefined)\r\n return;\r\n validateFirebaseData(errorPrefix(fnName, argumentNumber, optional), data, path);\r\n};\r\n/**\r\n * Validate a data object client-side before sending to server.\r\n *\r\n * @param {string} errorPrefix\r\n * @param {*} data\r\n * @param {!Path|!ValidationPath} path_\r\n */\r\nvar validateFirebaseData = function (errorPrefix$$1, data, path_) {\r\n var path = path_ instanceof Path ? new ValidationPath(path_, errorPrefix$$1) : path_;\r\n if (data === undefined) {\r\n throw new Error(errorPrefix$$1 + 'contains undefined ' + path.toErrorString());\r\n }\r\n if (typeof data === 'function') {\r\n throw new Error(errorPrefix$$1 +\r\n 'contains a function ' +\r\n path.toErrorString() +\r\n ' with contents = ' +\r\n data.toString());\r\n }\r\n if (isInvalidJSONNumber(data)) {\r\n throw new Error(errorPrefix$$1 + 'contains ' + data.toString() + ' ' + path.toErrorString());\r\n }\r\n // Check max leaf size, but try to avoid the utf8 conversion if we can.\r\n if (typeof data === 'string' &&\r\n data.length > MAX_LEAF_SIZE_ / 3 &&\r\n stringLength(data) > MAX_LEAF_SIZE_) {\r\n throw new Error(errorPrefix$$1 +\r\n 'contains a string greater than ' +\r\n MAX_LEAF_SIZE_ +\r\n ' utf8 bytes ' +\r\n path.toErrorString() +\r\n \" ('\" +\r\n data.substring(0, 50) +\r\n \"...')\");\r\n }\r\n // TODO = Perf = Consider combining the recursive validation of keys into NodeFromJSON\r\n // to save extra walking of large objects.\r\n if (data && typeof data === 'object') {\r\n var hasDotValue_1 = false, hasActualChild_1 = false;\r\n forEach(data, function (key, value) {\r\n if (key === '.value') {\r\n hasDotValue_1 = true;\r\n }\r\n else if (key !== '.priority' && key !== '.sv') {\r\n hasActualChild_1 = true;\r\n if (!isValidKey(key)) {\r\n throw new Error(errorPrefix$$1 +\r\n ' contains an invalid key (' +\r\n key +\r\n ') ' +\r\n path.toErrorString() +\r\n '. Keys must be non-empty strings ' +\r\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');\r\n }\r\n }\r\n path.push(key);\r\n validateFirebaseData(errorPrefix$$1, value, path);\r\n path.pop();\r\n });\r\n if (hasDotValue_1 && hasActualChild_1) {\r\n throw new Error(errorPrefix$$1 +\r\n ' contains \".value\" child ' +\r\n path.toErrorString() +\r\n ' in addition to actual children.');\r\n }\r\n }\r\n};\r\n/**\r\n * Pre-validate paths passed in the firebase function.\r\n *\r\n * @param {string} errorPrefix\r\n * @param {Array} mergePaths\r\n */\r\nvar validateFirebaseMergePaths = function (errorPrefix$$1, mergePaths) {\r\n var i, curPath;\r\n for (i = 0; i < mergePaths.length; i++) {\r\n curPath = mergePaths[i];\r\n var keys = curPath.slice();\r\n for (var j = 0; j < keys.length; j++) {\r\n if (keys[j] === '.priority' && j === keys.length - 1) {\r\n // .priority is OK\r\n }\r\n else if (!isValidKey(keys[j])) {\r\n throw new Error(errorPrefix$$1 +\r\n 'contains an invalid key (' +\r\n keys[j] +\r\n ') in path ' +\r\n curPath.toString() +\r\n '. Keys must be non-empty strings ' +\r\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');\r\n }\r\n }\r\n }\r\n // Check that update keys are not descendants of each other.\r\n // We rely on the property that sorting guarantees that ancestors come\r\n // right before descendants.\r\n mergePaths.sort(Path.comparePaths);\r\n var prevPath = null;\r\n for (i = 0; i < mergePaths.length; i++) {\r\n curPath = mergePaths[i];\r\n if (prevPath !== null && prevPath.contains(curPath)) {\r\n throw new Error(errorPrefix$$1 +\r\n 'contains a path ' +\r\n prevPath.toString() +\r\n ' that is ancestor of another path ' +\r\n curPath.toString());\r\n }\r\n prevPath = curPath;\r\n }\r\n};\r\n/**\r\n * pre-validate an object passed as an argument to firebase function (\r\n * must be an object - e.g. for firebase.update()).\r\n *\r\n * @param {string} fnName\r\n * @param {number} argumentNumber\r\n * @param {*} data\r\n * @param {!Path} path\r\n * @param {boolean} optional\r\n */\r\nvar validateFirebaseMergeDataArg = function (fnName, argumentNumber, data, path, optional) {\r\n if (optional && data === undefined)\r\n return;\r\n var errorPrefix$$1 = errorPrefix(fnName, argumentNumber, optional);\r\n if (!(data && typeof data === 'object') || Array.isArray(data)) {\r\n throw new Error(errorPrefix$$1 + ' must be an object containing the children to replace.');\r\n }\r\n var mergePaths = [];\r\n forEach(data, function (key, value) {\r\n var curPath = new Path(key);\r\n validateFirebaseData(errorPrefix$$1, value, path.child(curPath));\r\n if (curPath.getBack() === '.priority') {\r\n if (!isValidPriority(value)) {\r\n throw new Error(errorPrefix$$1 +\r\n \"contains an invalid value for '\" +\r\n curPath.toString() +\r\n \"', which must be a valid \" +\r\n 'Firebase priority (a string, finite number, server value, or null).');\r\n }\r\n }\r\n mergePaths.push(curPath);\r\n });\r\n validateFirebaseMergePaths(errorPrefix$$1, mergePaths);\r\n};\r\nvar validatePriority = function (fnName, argumentNumber, priority, optional) {\r\n if (optional && priority === undefined)\r\n return;\r\n if (isInvalidJSONNumber(priority))\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'is ' +\r\n priority.toString() +\r\n ', but must be a valid Firebase priority (a string, finite number, ' +\r\n 'server value, or null).');\r\n // Special case to allow importing data with a .sv.\r\n if (!isValidPriority(priority))\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'must be a valid Firebase priority ' +\r\n '(a string, finite number, server value, or null).');\r\n};\r\nvar validateEventType = function (fnName, argumentNumber, eventType, optional) {\r\n if (optional && eventType === undefined)\r\n return;\r\n switch (eventType) {\r\n case 'value':\r\n case 'child_added':\r\n case 'child_removed':\r\n case 'child_changed':\r\n case 'child_moved':\r\n break;\r\n default:\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'must be a valid event type = \"value\", \"child_added\", \"child_removed\", ' +\r\n '\"child_changed\", or \"child_moved\".');\r\n }\r\n};\r\nvar validateKey = function (fnName, argumentNumber, key, optional) {\r\n if (optional && key === undefined)\r\n return;\r\n if (!isValidKey(key))\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'was an invalid key = \"' +\r\n key +\r\n '\". Firebase keys must be non-empty strings and ' +\r\n 'can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\").');\r\n};\r\nvar validatePathString = function (fnName, argumentNumber, pathString, optional) {\r\n if (optional && pathString === undefined)\r\n return;\r\n if (!isValidPathString(pathString))\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) +\r\n 'was an invalid path = \"' +\r\n pathString +\r\n '\". Paths must be non-empty strings and ' +\r\n 'can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\"');\r\n};\r\nvar validateRootPathString = function (fnName, argumentNumber, pathString, optional) {\r\n if (pathString) {\r\n // Allow '/.info/' at the beginning.\r\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\r\n }\r\n validatePathString(fnName, argumentNumber, pathString, optional);\r\n};\r\nvar validateWritablePath = function (fnName, path) {\r\n if (path.getFront() === '.info') {\r\n throw new Error(fnName + \" failed = Can't modify data under /.info/\");\r\n }\r\n};\r\nvar validateUrl = function (fnName, argumentNumber, parsedUrl) {\r\n // TODO = Validate server better.\r\n var pathString = parsedUrl.path.toString();\r\n if (!(typeof parsedUrl.repoInfo.host === 'string') ||\r\n parsedUrl.repoInfo.host.length === 0 ||\r\n (!isValidKey(parsedUrl.repoInfo.namespace) &&\r\n parsedUrl.repoInfo.host.split(':')[0] !== 'localhost') ||\r\n (pathString.length !== 0 && !isValidRootPathString(pathString))) {\r\n throw new Error(errorPrefix(fnName, argumentNumber, false) +\r\n 'must be a valid firebase URL and ' +\r\n 'the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".');\r\n }\r\n};\r\nvar validateBoolean = function (fnName, argumentNumber, bool, optional) {\r\n if (optional && bool === undefined)\r\n return;\r\n if (typeof bool !== 'boolean')\r\n throw new Error(errorPrefix(fnName, argumentNumber, optional) + 'must be a boolean.');\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @constructor\r\n */\r\nvar OnDisconnect = /** @class */ (function () {\r\n /**\r\n * @param {!Repo} repo_\r\n * @param {!Path} path_\r\n */\r\n function OnDisconnect(repo_, path_) {\r\n this.repo_ = repo_;\r\n this.path_ = path_;\r\n }\r\n /**\r\n * @param {function(?Error)=} onComplete\r\n * @return {!firebase.Promise}\r\n */\r\n OnDisconnect.prototype.cancel = function (onComplete) {\r\n validateArgCount('OnDisconnect.cancel', 0, 1, arguments.length);\r\n validateCallback('OnDisconnect.cancel', 1, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo_.onDisconnectCancel(this.path_, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {function(?Error)=} onComplete\r\n * @return {!firebase.Promise}\r\n */\r\n OnDisconnect.prototype.remove = function (onComplete) {\r\n validateArgCount('OnDisconnect.remove', 0, 1, arguments.length);\r\n validateWritablePath('OnDisconnect.remove', this.path_);\r\n validateCallback('OnDisconnect.remove', 1, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo_.onDisconnectSet(this.path_, null, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {*} value\r\n * @param {function(?Error)=} onComplete\r\n * @return {!firebase.Promise}\r\n */\r\n OnDisconnect.prototype.set = function (value, onComplete) {\r\n validateArgCount('OnDisconnect.set', 1, 2, arguments.length);\r\n validateWritablePath('OnDisconnect.set', this.path_);\r\n validateFirebaseDataArg('OnDisconnect.set', 1, value, this.path_, false);\r\n validateCallback('OnDisconnect.set', 2, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo_.onDisconnectSet(this.path_, value, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {*} value\r\n * @param {number|string|null} priority\r\n * @param {function(?Error)=} onComplete\r\n * @return {!firebase.Promise}\r\n */\r\n OnDisconnect.prototype.setWithPriority = function (value, priority, onComplete) {\r\n validateArgCount('OnDisconnect.setWithPriority', 2, 3, arguments.length);\r\n validateWritablePath('OnDisconnect.setWithPriority', this.path_);\r\n validateFirebaseDataArg('OnDisconnect.setWithPriority', 1, value, this.path_, false);\r\n validatePriority('OnDisconnect.setWithPriority', 2, priority, false);\r\n validateCallback('OnDisconnect.setWithPriority', 3, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo_.onDisconnectSetWithPriority(this.path_, value, priority, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {!Object} objectToMerge\r\n * @param {function(?Error)=} onComplete\r\n * @return {!firebase.Promise}\r\n */\r\n OnDisconnect.prototype.update = function (objectToMerge, onComplete) {\r\n validateArgCount('OnDisconnect.update', 1, 2, arguments.length);\r\n validateWritablePath('OnDisconnect.update', this.path_);\r\n if (Array.isArray(objectToMerge)) {\r\n var newObjectToMerge = {};\r\n for (var i = 0; i < objectToMerge.length; ++i) {\r\n newObjectToMerge['' + i] = objectToMerge[i];\r\n }\r\n objectToMerge = newObjectToMerge;\r\n warn('Passing an Array to firebase.database.onDisconnect().update() is deprecated. Use set() if you want to overwrite the ' +\r\n 'existing data, or an Object with integer keys if you really do want to only update some of the children.');\r\n }\r\n validateFirebaseMergeDataArg('OnDisconnect.update', 1, objectToMerge, this.path_, false);\r\n validateCallback('OnDisconnect.update', 2, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo_.onDisconnectUpdate(this.path_, objectToMerge, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n return OnDisconnect;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar TransactionResult = /** @class */ (function () {\r\n /**\r\n * A type for the resolve value of Firebase.transaction.\r\n * @constructor\r\n * @dict\r\n * @param {boolean} committed\r\n * @param {DataSnapshot} snapshot\r\n */\r\n function TransactionResult(committed, snapshot) {\r\n this.committed = committed;\r\n this.snapshot = snapshot;\r\n }\r\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\r\n // for end-users\r\n TransactionResult.prototype.toJSON = function () {\r\n validateArgCount('TransactionResult.toJSON', 0, 1, arguments.length);\r\n return { committed: this.committed, snapshot: this.snapshot.toJSON() };\r\n };\r\n return TransactionResult;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Fancy ID generator that creates 20-character string identifiers with the\r\n * following properties:\r\n *\r\n * 1. They're based on timestamp so that they sort *after* any existing ids.\r\n * 2. They contain 72-bits of random data after the timestamp so that IDs won't\r\n * collide with other clients' IDs.\r\n * 3. They sort *lexicographically* (so the timestamp is converted to characters\r\n * that will sort properly).\r\n * 4. They're monotonically increasing. Even if you generate more than one in\r\n * the same timestamp, the latter ones will sort after the former ones. We do\r\n * this by using the previous random bits but \"incrementing\" them by 1 (only\r\n * in the case of a timestamp collision).\r\n */\r\nvar nextPushId = (function () {\r\n // Modeled after base64 web-safe chars, but ordered by ASCII.\r\n var PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\r\n // Timestamp of last push, used to prevent local collisions if you push twice\r\n // in one ms.\r\n var lastPushTime = 0;\r\n // We generate 72-bits of randomness which get turned into 12 characters and\r\n // appended to the timestamp to prevent collisions with other clients. We\r\n // store the last characters we generated because in the event of a collision,\r\n // we'll use those same characters except \"incremented\" by one.\r\n var lastRandChars = [];\r\n return function (now) {\r\n var duplicateTime = now === lastPushTime;\r\n lastPushTime = now;\r\n var i;\r\n var timeStampChars = new Array(8);\r\n for (i = 7; i >= 0; i--) {\r\n timeStampChars[i] = PUSH_CHARS.charAt(now % 64);\r\n // NOTE: Can't use << here because javascript will convert to int and lose\r\n // the upper bits.\r\n now = Math.floor(now / 64);\r\n }\r\n assert(now === 0, 'Cannot push at time == 0');\r\n var id = timeStampChars.join('');\r\n if (!duplicateTime) {\r\n for (i = 0; i < 12; i++) {\r\n lastRandChars[i] = Math.floor(Math.random() * 64);\r\n }\r\n }\r\n else {\r\n // If the timestamp hasn't changed since last push, use the same random\r\n // number, except incremented by 1.\r\n for (i = 11; i >= 0 && lastRandChars[i] === 63; i--) {\r\n lastRandChars[i] = 0;\r\n }\r\n lastRandChars[i]++;\r\n }\r\n for (i = 0; i < 12; i++) {\r\n id += PUSH_CHARS.charAt(lastRandChars[i]);\r\n }\r\n assert(id.length === 20, 'nextPushId: Length should be 20.');\r\n return id;\r\n };\r\n})();\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n *\r\n * @param {!string} name\r\n * @param {!Node} node\r\n * @constructor\r\n * @struct\r\n */\r\nvar NamedNode = /** @class */ (function () {\r\n function NamedNode(name, node) {\r\n this.name = name;\r\n this.node = node;\r\n }\r\n /**\r\n *\r\n * @param {!string} name\r\n * @param {!Node} node\r\n * @return {NamedNode}\r\n */\r\n NamedNode.Wrap = function (name, node) {\r\n return new NamedNode(name, node);\r\n };\r\n return NamedNode;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n *\r\n * @constructor\r\n */\r\nvar Index = /** @class */ (function () {\r\n function Index() {\r\n }\r\n /**\r\n * @return {function(!NamedNode, !NamedNode):number} A standalone comparison function for\r\n * this index\r\n */\r\n Index.prototype.getCompare = function () {\r\n return this.compare.bind(this);\r\n };\r\n /**\r\n * Given a before and after value for a node, determine if the indexed value has changed. Even if they are different,\r\n * it's possible that the changes are isolated to parts of the snapshot that are not indexed.\r\n *\r\n * @param {!Node} oldNode\r\n * @param {!Node} newNode\r\n * @return {boolean} True if the portion of the snapshot being indexed changed between oldNode and newNode\r\n */\r\n Index.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n var oldWrapped = new NamedNode(MIN_NAME, oldNode);\r\n var newWrapped = new NamedNode(MIN_NAME, newNode);\r\n return this.compare(oldWrapped, newWrapped) !== 0;\r\n };\r\n /**\r\n * @return {!NamedNode} a node wrapper that will sort equal to or less than\r\n * any other node wrapper, using this index\r\n */\r\n Index.prototype.minPost = function () {\r\n return NamedNode.MIN;\r\n };\r\n return Index;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __EMPTY_NODE;\r\nvar KeyIndex = /** @class */ (function (_super) {\r\n __extends(KeyIndex, _super);\r\n function KeyIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Object.defineProperty(KeyIndex, \"__EMPTY_NODE\", {\r\n get: function () {\r\n return __EMPTY_NODE;\r\n },\r\n set: function (val) {\r\n __EMPTY_NODE = val;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @inheritDoc\r\n */\r\n KeyIndex.prototype.compare = function (a, b) {\r\n return nameCompare(a.name, b.name);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n KeyIndex.prototype.isDefinedOn = function (node) {\r\n // We could probably return true here (since every node has a key), but it's never called\r\n // so just leaving unimplemented for now.\r\n throw assertionError('KeyIndex.isDefinedOn not expected to be called.');\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n KeyIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return false; // The key for a node never changes.\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n KeyIndex.prototype.minPost = function () {\r\n return NamedNode.MIN;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n KeyIndex.prototype.maxPost = function () {\r\n // TODO: This should really be created once and cached in a static property, but\r\n // NamedNode isn't defined yet, so I can't use it in a static. Bleh.\r\n return new NamedNode(MAX_NAME, __EMPTY_NODE);\r\n };\r\n /**\r\n * @param {*} indexValue\r\n * @param {string} name\r\n * @return {!NamedNode}\r\n */\r\n KeyIndex.prototype.makePost = function (indexValue, name) {\r\n assert(typeof indexValue === 'string', 'KeyIndex indexValue must always be a string.');\r\n // We just use empty node, but it'll never be compared, since our comparator only looks at name.\r\n return new NamedNode(indexValue, __EMPTY_NODE);\r\n };\r\n /**\r\n * @return {!string} String representation for inclusion in a query spec\r\n */\r\n KeyIndex.prototype.toString = function () {\r\n return '.key';\r\n };\r\n return KeyIndex;\r\n}(Index));\r\nvar KEY_INDEX = new KeyIndex();\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar MAX_NODE;\r\nfunction setMaxNode(val) {\r\n MAX_NODE = val;\r\n}\r\n/**\r\n * @param {(!string|!number)} priority\r\n * @return {!string}\r\n */\r\nvar priorityHashText = function (priority) {\r\n if (typeof priority === 'number')\r\n return 'number:' + doubleToIEEE754String(priority);\r\n else\r\n return 'string:' + priority;\r\n};\r\n/**\r\n * Validates that a priority snapshot Node is valid.\r\n *\r\n * @param {!Node} priorityNode\r\n */\r\nvar validatePriorityNode = function (priorityNode) {\r\n if (priorityNode.isLeafNode()) {\r\n var val = priorityNode.val();\r\n assert(typeof val === 'string' ||\r\n typeof val === 'number' ||\r\n (typeof val === 'object' && contains(val, '.sv')), 'Priority must be a string or number.');\r\n }\r\n else {\r\n assert(priorityNode === MAX_NODE || priorityNode.isEmpty(), 'priority of unexpected type.');\r\n }\r\n // Don't call getPriority() on MAX_NODE to avoid hitting assertion.\r\n assert(priorityNode === MAX_NODE || priorityNode.getPriority().isEmpty(), \"Priority nodes can't have a priority of their own.\");\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __childrenNodeConstructor;\r\n/**\r\n * LeafNode is a class for storing leaf nodes in a DataSnapshot. It\r\n * implements Node and stores the value of the node (a string,\r\n * number, or boolean) accessible via getValue().\r\n */\r\nvar LeafNode = /** @class */ (function () {\r\n /**\r\n * @implements {Node}\r\n * @param {!(string|number|boolean|Object)} value_ The value to store in this leaf node.\r\n * The object type is possible in the event of a deferred value\r\n * @param {!Node=} priorityNode_ The priority of this node.\r\n */\r\n function LeafNode(value_, priorityNode_) {\r\n if (priorityNode_ === void 0) { priorityNode_ = LeafNode.__childrenNodeConstructor.EMPTY_NODE; }\r\n this.value_ = value_;\r\n this.priorityNode_ = priorityNode_;\r\n this.lazyHash_ = null;\r\n assert(this.value_ !== undefined && this.value_ !== null, \"LeafNode shouldn't be created with null/undefined value.\");\r\n validatePriorityNode(this.priorityNode_);\r\n }\r\n Object.defineProperty(LeafNode, \"__childrenNodeConstructor\", {\r\n get: function () {\r\n return __childrenNodeConstructor;\r\n },\r\n set: function (val) {\r\n __childrenNodeConstructor = val;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /** @inheritDoc */\r\n LeafNode.prototype.isLeafNode = function () {\r\n return true;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getPriority = function () {\r\n return this.priorityNode_;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updatePriority = function (newPriorityNode) {\r\n return new LeafNode(this.value_, newPriorityNode);\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getImmediateChild = function (childName) {\r\n // Hack to treat priority as a regular child\r\n if (childName === '.priority') {\r\n return this.priorityNode_;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getChild = function (path) {\r\n if (path.isEmpty()) {\r\n return this;\r\n }\r\n else if (path.getFront() === '.priority') {\r\n return this.priorityNode_;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LeafNode.prototype.hasChild = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.getPredecessorChildName = function (childName, childNode) {\r\n return null;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updateImmediateChild = function (childName, newChildNode) {\r\n if (childName === '.priority') {\r\n return this.updatePriority(newChildNode);\r\n }\r\n else if (newChildNode.isEmpty() && childName !== '.priority') {\r\n return this;\r\n }\r\n else {\r\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateImmediateChild(childName, newChildNode).updatePriority(this.priorityNode_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.updateChild = function (path, newChildNode) {\r\n var front = path.getFront();\r\n if (front === null) {\r\n return newChildNode;\r\n }\r\n else if (newChildNode.isEmpty() && front !== '.priority') {\r\n return this;\r\n }\r\n else {\r\n assert(front !== '.priority' || path.getLength() === 1, '.priority must be the last token in a path');\r\n return this.updateImmediateChild(front, LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateChild(path.popFront(), newChildNode));\r\n }\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.numChildren = function () {\r\n return 0;\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.forEachChild = function (index, action) {\r\n return false;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LeafNode.prototype.val = function (exportFormat) {\r\n if (exportFormat && !this.getPriority().isEmpty())\r\n return {\r\n '.value': this.getValue(),\r\n '.priority': this.getPriority().val()\r\n };\r\n else\r\n return this.getValue();\r\n };\r\n /** @inheritDoc */\r\n LeafNode.prototype.hash = function () {\r\n if (this.lazyHash_ === null) {\r\n var toHash = '';\r\n if (!this.priorityNode_.isEmpty())\r\n toHash +=\r\n 'priority:' +\r\n priorityHashText(this.priorityNode_.val()) +\r\n ':';\r\n var type = typeof this.value_;\r\n toHash += type + ':';\r\n if (type === 'number') {\r\n toHash += doubleToIEEE754String(this.value_);\r\n }\r\n else {\r\n toHash += this.value_;\r\n }\r\n this.lazyHash_ = sha1(toHash);\r\n }\r\n return this.lazyHash_;\r\n };\r\n /**\r\n * Returns the value of the leaf node.\r\n * @return {Object|string|number|boolean} The value of the node.\r\n */\r\n LeafNode.prototype.getValue = function () {\r\n return this.value_;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LeafNode.prototype.compareTo = function (other) {\r\n if (other === LeafNode.__childrenNodeConstructor.EMPTY_NODE) {\r\n return 1;\r\n }\r\n else if (other instanceof LeafNode.__childrenNodeConstructor) {\r\n return -1;\r\n }\r\n else {\r\n assert(other.isLeafNode(), 'Unknown node type');\r\n return this.compareToLeafNode_(other);\r\n }\r\n };\r\n /**\r\n * Comparison specifically for two leaf nodes\r\n * @param {!LeafNode} otherLeaf\r\n * @return {!number}\r\n * @private\r\n */\r\n LeafNode.prototype.compareToLeafNode_ = function (otherLeaf) {\r\n var otherLeafType = typeof otherLeaf.value_;\r\n var thisLeafType = typeof this.value_;\r\n var otherIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(otherLeafType);\r\n var thisIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(thisLeafType);\r\n assert(otherIndex >= 0, 'Unknown leaf type: ' + otherLeafType);\r\n assert(thisIndex >= 0, 'Unknown leaf type: ' + thisLeafType);\r\n if (otherIndex === thisIndex) {\r\n // Same type, compare values\r\n if (thisLeafType === 'object') {\r\n // Deferred value nodes are all equal, but we should also never get to this point...\r\n return 0;\r\n }\r\n else {\r\n // Note that this works because true > false, all others are number or string comparisons\r\n if (this.value_ < otherLeaf.value_) {\r\n return -1;\r\n }\r\n else if (this.value_ === otherLeaf.value_) {\r\n return 0;\r\n }\r\n else {\r\n return 1;\r\n }\r\n }\r\n }\r\n else {\r\n return thisIndex - otherIndex;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LeafNode.prototype.withIndex = function () {\r\n return this;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LeafNode.prototype.isIndexed = function () {\r\n return true;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LeafNode.prototype.equals = function (other) {\r\n /**\r\n * @inheritDoc\r\n */\r\n if (other === this) {\r\n return true;\r\n }\r\n else if (other.isLeafNode()) {\r\n var otherLeaf = other;\r\n return (this.value_ === otherLeaf.value_ &&\r\n this.priorityNode_.equals(otherLeaf.priorityNode_));\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n /**\r\n * The sort order for comparing leaf nodes of different types. If two leaf nodes have\r\n * the same type, the comparison falls back to their value\r\n * @type {Array.}\r\n * @const\r\n */\r\n LeafNode.VALUE_TYPE_ORDER = ['object', 'boolean', 'number', 'string'];\r\n return LeafNode;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar nodeFromJSON;\r\nvar MAX_NODE$1;\r\nfunction setNodeFromJSON(val) {\r\n nodeFromJSON = val;\r\n}\r\nfunction setMaxNode$1(val) {\r\n MAX_NODE$1 = val;\r\n}\r\n/**\r\n * @constructor\r\n * @extends {Index}\r\n * @private\r\n */\r\nvar PriorityIndex = /** @class */ (function (_super) {\r\n __extends(PriorityIndex, _super);\r\n function PriorityIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n PriorityIndex.prototype.compare = function (a, b) {\r\n var aPriority = a.node.getPriority();\r\n var bPriority = b.node.getPriority();\r\n var indexCmp = aPriority.compareTo(bPriority);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PriorityIndex.prototype.isDefinedOn = function (node) {\r\n return !node.getPriority().isEmpty();\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PriorityIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return !oldNode.getPriority().equals(newNode.getPriority());\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PriorityIndex.prototype.minPost = function () {\r\n return NamedNode.MIN;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PriorityIndex.prototype.maxPost = function () {\r\n return new NamedNode(MAX_NAME, new LeafNode('[PRIORITY-POST]', MAX_NODE$1));\r\n };\r\n /**\r\n * @param {*} indexValue\r\n * @param {string} name\r\n * @return {!NamedNode}\r\n */\r\n PriorityIndex.prototype.makePost = function (indexValue, name) {\r\n var priorityNode = nodeFromJSON(indexValue);\r\n return new NamedNode(name, new LeafNode('[PRIORITY-POST]', priorityNode));\r\n };\r\n /**\r\n * @return {!string} String representation for inclusion in a query spec\r\n */\r\n PriorityIndex.prototype.toString = function () {\r\n return '.priority';\r\n };\r\n return PriorityIndex;\r\n}(Index));\r\nvar PRIORITY_INDEX = new PriorityIndex();\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An iterator over an LLRBNode.\r\n */\r\nvar SortedMapIterator = /** @class */ (function () {\r\n /**\r\n * @template K, V, T\r\n * @param {LLRBNode|LLRBEmptyNode} node Node to iterate.\r\n * @param {?K} startKey\r\n * @param {function(K, K): number} comparator\r\n * @param {boolean} isReverse_ Whether or not to iterate in reverse\r\n * @param {(function(K, V):T)=} resultGenerator_\r\n */\r\n function SortedMapIterator(node, startKey, comparator, isReverse_, resultGenerator_) {\r\n if (resultGenerator_ === void 0) { resultGenerator_ = null; }\r\n this.isReverse_ = isReverse_;\r\n this.resultGenerator_ = resultGenerator_;\r\n /** @private\r\n * @type {Array.}\r\n */\r\n this.nodeStack_ = [];\r\n var cmp = 1;\r\n while (!node.isEmpty()) {\r\n node = node;\r\n cmp = startKey ? comparator(node.key, startKey) : 1;\r\n // flip the comparison if we're going in reverse\r\n if (isReverse_)\r\n cmp *= -1;\r\n if (cmp < 0) {\r\n // This node is less than our start key. ignore it\r\n if (this.isReverse_) {\r\n node = node.left;\r\n }\r\n else {\r\n node = node.right;\r\n }\r\n }\r\n else if (cmp === 0) {\r\n // This node is exactly equal to our start key. Push it on the stack, but stop iterating;\r\n this.nodeStack_.push(node);\r\n break;\r\n }\r\n else {\r\n // This node is greater than our start key, add it to the stack and move to the next one\r\n this.nodeStack_.push(node);\r\n if (this.isReverse_) {\r\n node = node.right;\r\n }\r\n else {\r\n node = node.left;\r\n }\r\n }\r\n }\r\n }\r\n SortedMapIterator.prototype.getNext = function () {\r\n if (this.nodeStack_.length === 0)\r\n return null;\r\n var node = this.nodeStack_.pop();\r\n var result;\r\n if (this.resultGenerator_)\r\n result = this.resultGenerator_(node.key, node.value);\r\n else\r\n result = { key: node.key, value: node.value };\r\n if (this.isReverse_) {\r\n node = node.left;\r\n while (!node.isEmpty()) {\r\n this.nodeStack_.push(node);\r\n node = node.right;\r\n }\r\n }\r\n else {\r\n node = node.right;\r\n while (!node.isEmpty()) {\r\n this.nodeStack_.push(node);\r\n node = node.left;\r\n }\r\n }\r\n return result;\r\n };\r\n SortedMapIterator.prototype.hasNext = function () {\r\n return this.nodeStack_.length > 0;\r\n };\r\n SortedMapIterator.prototype.peek = function () {\r\n if (this.nodeStack_.length === 0)\r\n return null;\r\n var node = this.nodeStack_[this.nodeStack_.length - 1];\r\n if (this.resultGenerator_) {\r\n return this.resultGenerator_(node.key, node.value);\r\n }\r\n else {\r\n return { key: node.key, value: node.value };\r\n }\r\n };\r\n return SortedMapIterator;\r\n}());\r\n/**\r\n * Represents a node in a Left-leaning Red-Black tree.\r\n */\r\nvar LLRBNode = /** @class */ (function () {\r\n /**\r\n * @template K, V\r\n * @param {!K} key Key associated with this node.\r\n * @param {!V} value Value associated with this node.\r\n * @param {?boolean} color Whether this node is red.\r\n * @param {?(LLRBNode|LLRBEmptyNode)=} left Left child.\r\n * @param {?(LLRBNode|LLRBEmptyNode)=} right Right child.\r\n */\r\n function LLRBNode(key, value, color, left, right) {\r\n this.key = key;\r\n this.value = value;\r\n this.color = color != null ? color : LLRBNode.RED;\r\n this.left =\r\n left != null ? left : SortedMap.EMPTY_NODE;\r\n this.right =\r\n right != null ? right : SortedMap.EMPTY_NODE;\r\n }\r\n /**\r\n * Returns a copy of the current node, optionally replacing pieces of it.\r\n *\r\n * @param {?K} key New key for the node, or null.\r\n * @param {?V} value New value for the node, or null.\r\n * @param {?boolean} color New color for the node, or null.\r\n * @param {?LLRBNode|LLRBEmptyNode} left New left child for the node, or null.\r\n * @param {?LLRBNode|LLRBEmptyNode} right New right child for the node, or null.\r\n * @return {!LLRBNode} The node copy.\r\n */\r\n LLRBNode.prototype.copy = function (key, value, color, left, right) {\r\n return new LLRBNode(key != null ? key : this.key, value != null ? value : this.value, color != null ? color : this.color, left != null ? left : this.left, right != null ? right : this.right);\r\n };\r\n /**\r\n * @return {number} The total number of nodes in the tree.\r\n */\r\n LLRBNode.prototype.count = function () {\r\n return this.left.count() + 1 + this.right.count();\r\n };\r\n /**\r\n * @return {boolean} True if the tree is empty.\r\n */\r\n LLRBNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n /**\r\n * Traverses the tree in key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param {function(!K, !V):*} action Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @return {*} The first truthy value returned by action, or the last falsey\r\n * value returned by action\r\n */\r\n LLRBNode.prototype.inorderTraversal = function (action) {\r\n return (this.left.inorderTraversal(action) ||\r\n action(this.key, this.value) ||\r\n this.right.inorderTraversal(action));\r\n };\r\n /**\r\n * Traverses the tree in reverse key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param {function(!Object, !Object)} action Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @return {*} True if traversal was aborted.\r\n */\r\n LLRBNode.prototype.reverseTraversal = function (action) {\r\n return (this.right.reverseTraversal(action) ||\r\n action(this.key, this.value) ||\r\n this.left.reverseTraversal(action));\r\n };\r\n /**\r\n * @return {!Object} The minimum node in the tree.\r\n * @private\r\n */\r\n LLRBNode.prototype.min_ = function () {\r\n if (this.left.isEmpty()) {\r\n return this;\r\n }\r\n else {\r\n return this.left.min_();\r\n }\r\n };\r\n /**\r\n * @return {!K} The maximum key in the tree.\r\n */\r\n LLRBNode.prototype.minKey = function () {\r\n return this.min_().key;\r\n };\r\n /**\r\n * @return {!K} The maximum key in the tree.\r\n */\r\n LLRBNode.prototype.maxKey = function () {\r\n if (this.right.isEmpty()) {\r\n return this.key;\r\n }\r\n else {\r\n return this.right.maxKey();\r\n }\r\n };\r\n /**\r\n *\r\n * @param {!Object} key Key to insert.\r\n * @param {!Object} value Value to insert.\r\n * @param {Comparator} comparator Comparator.\r\n * @return {!LLRBNode} New tree, with the key/value added.\r\n */\r\n LLRBNode.prototype.insert = function (key, value, comparator) {\r\n var cmp, n;\r\n n = this;\r\n cmp = comparator(key, n.key);\r\n if (cmp < 0) {\r\n n = n.copy(null, null, null, n.left.insert(key, value, comparator), null);\r\n }\r\n else if (cmp === 0) {\r\n n = n.copy(null, value, null, null, null);\r\n }\r\n else {\r\n n = n.copy(null, null, null, null, n.right.insert(key, value, comparator));\r\n }\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @private\r\n * @return {!LLRBNode|LLRBEmptyNode} New tree, with the minimum key removed.\r\n */\r\n LLRBNode.prototype.removeMin_ = function () {\r\n if (this.left.isEmpty()) {\r\n return SortedMap.EMPTY_NODE;\r\n }\r\n var n = this;\r\n if (!n.left.isRed_() && !n.left.left.isRed_())\r\n n = n.moveRedLeft_();\r\n n = n.copy(null, null, null, n.left.removeMin_(), null);\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @param {!Object} key The key of the item to remove.\r\n * @param {Comparator} comparator Comparator.\r\n * @return {!LLRBNode|LLRBEmptyNode} New tree, with the specified item removed.\r\n */\r\n LLRBNode.prototype.remove = function (key, comparator) {\r\n var n, smallest;\r\n n = this;\r\n if (comparator(key, n.key) < 0) {\r\n if (!n.left.isEmpty() && !n.left.isRed_() && !n.left.left.isRed_()) {\r\n n = n.moveRedLeft_();\r\n }\r\n n = n.copy(null, null, null, n.left.remove(key, comparator), null);\r\n }\r\n else {\r\n if (n.left.isRed_())\r\n n = n.rotateRight_();\r\n if (!n.right.isEmpty() && !n.right.isRed_() && !n.right.left.isRed_()) {\r\n n = n.moveRedRight_();\r\n }\r\n if (comparator(key, n.key) === 0) {\r\n if (n.right.isEmpty()) {\r\n return SortedMap.EMPTY_NODE;\r\n }\r\n else {\r\n smallest = n.right.min_();\r\n n = n.copy(smallest.key, smallest.value, null, null, n.right.removeMin_());\r\n }\r\n }\r\n n = n.copy(null, null, null, null, n.right.remove(key, comparator));\r\n }\r\n return n.fixUp_();\r\n };\r\n /**\r\n * @private\r\n * @return {boolean} Whether this is a RED node.\r\n */\r\n LLRBNode.prototype.isRed_ = function () {\r\n return this.color;\r\n };\r\n /**\r\n * @private\r\n * @return {!LLRBNode} New tree after performing any needed rotations.\r\n */\r\n LLRBNode.prototype.fixUp_ = function () {\r\n var n = this;\r\n if (n.right.isRed_() && !n.left.isRed_())\r\n n = n.rotateLeft_();\r\n if (n.left.isRed_() && n.left.left.isRed_())\r\n n = n.rotateRight_();\r\n if (n.left.isRed_() && n.right.isRed_())\r\n n = n.colorFlip_();\r\n return n;\r\n };\r\n /**\r\n * @private\r\n * @return {!LLRBNode} New tree, after moveRedLeft.\r\n */\r\n LLRBNode.prototype.moveRedLeft_ = function () {\r\n var n = this.colorFlip_();\r\n if (n.right.left.isRed_()) {\r\n n = n.copy(null, null, null, null, n.right.rotateRight_());\r\n n = n.rotateLeft_();\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @private\r\n * @return {!LLRBNode} New tree, after moveRedRight.\r\n */\r\n LLRBNode.prototype.moveRedRight_ = function () {\r\n var n = this.colorFlip_();\r\n if (n.left.left.isRed_()) {\r\n n = n.rotateRight_();\r\n n = n.colorFlip_();\r\n }\r\n return n;\r\n };\r\n /**\r\n * @private\r\n * @return {!LLRBNode} New tree, after rotateLeft.\r\n */\r\n LLRBNode.prototype.rotateLeft_ = function () {\r\n var nl = this.copy(null, null, LLRBNode.RED, null, this.right.left);\r\n return this.right.copy(null, null, this.color, nl, null);\r\n };\r\n /**\r\n * @private\r\n * @return {!LLRBNode} New tree, after rotateRight.\r\n */\r\n LLRBNode.prototype.rotateRight_ = function () {\r\n var nr = this.copy(null, null, LLRBNode.RED, this.left.right, null);\r\n return this.left.copy(null, null, this.color, null, nr);\r\n };\r\n /**\r\n * @private\r\n * @return {!LLRBNode} New tree, after colorFlip.\r\n */\r\n LLRBNode.prototype.colorFlip_ = function () {\r\n var left = this.left.copy(null, null, !this.left.color, null, null);\r\n var right = this.right.copy(null, null, !this.right.color, null, null);\r\n return this.copy(null, null, !this.color, left, right);\r\n };\r\n /**\r\n * For testing.\r\n *\r\n * @private\r\n * @return {boolean} True if all is well.\r\n */\r\n LLRBNode.prototype.checkMaxDepth_ = function () {\r\n var blackDepth = this.check_();\r\n return Math.pow(2.0, blackDepth) <= this.count() + 1;\r\n };\r\n /**\r\n * @private\r\n * @return {number} Not sure what this returns exactly. :-).\r\n */\r\n LLRBNode.prototype.check_ = function () {\r\n var blackDepth;\r\n if (this.isRed_() && this.left.isRed_()) {\r\n throw new Error('Red node has red child(' + this.key + ',' + this.value + ')');\r\n }\r\n if (this.right.isRed_()) {\r\n throw new Error('Right child of (' + this.key + ',' + this.value + ') is red');\r\n }\r\n blackDepth = this.left.check_();\r\n if (blackDepth !== this.right.check_()) {\r\n throw new Error('Black depths differ');\r\n }\r\n else {\r\n return blackDepth + (this.isRed_() ? 0 : 1);\r\n }\r\n };\r\n LLRBNode.RED = true;\r\n LLRBNode.BLACK = false;\r\n return LLRBNode;\r\n}());\r\n/**\r\n * Represents an empty node (a leaf node in the Red-Black Tree).\r\n */\r\nvar LLRBEmptyNode = /** @class */ (function () {\r\n function LLRBEmptyNode() {\r\n }\r\n /**\r\n * Returns a copy of the current node.\r\n *\r\n * @return {!LLRBEmptyNode} The node copy.\r\n */\r\n LLRBEmptyNode.prototype.copy = function (key, value, color, left, right) {\r\n return this;\r\n };\r\n /**\r\n * Returns a copy of the tree, with the specified key/value added.\r\n *\r\n * @param {!K} key Key to be added.\r\n * @param {!V} value Value to be added.\r\n * @param {Comparator} comparator Comparator.\r\n * @return {!LLRBNode} New tree, with item added.\r\n */\r\n LLRBEmptyNode.prototype.insert = function (key, value, comparator) {\r\n return new LLRBNode(key, value, null);\r\n };\r\n /**\r\n * Returns a copy of the tree, with the specified key removed.\r\n *\r\n * @param {!K} key The key to remove.\r\n * @param {Comparator} comparator Comparator.\r\n * @return {!LLRBEmptyNode} New tree, with item removed.\r\n */\r\n LLRBEmptyNode.prototype.remove = function (key, comparator) {\r\n return this;\r\n };\r\n /**\r\n * @return {number} The total number of nodes in the tree.\r\n */\r\n LLRBEmptyNode.prototype.count = function () {\r\n return 0;\r\n };\r\n /**\r\n * @return {boolean} True if the tree is empty.\r\n */\r\n LLRBEmptyNode.prototype.isEmpty = function () {\r\n return true;\r\n };\r\n /**\r\n * Traverses the tree in key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param {function(!K, !V):*} action Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @return {boolean} True if traversal was aborted.\r\n */\r\n LLRBEmptyNode.prototype.inorderTraversal = function (action) {\r\n return false;\r\n };\r\n /**\r\n * Traverses the tree in reverse key order and calls the specified action function\r\n * for each node.\r\n *\r\n * @param {function(!K, !V)} action Callback function to be called for each\r\n * node. If it returns true, traversal is aborted.\r\n * @return {boolean} True if traversal was aborted.\r\n */\r\n LLRBEmptyNode.prototype.reverseTraversal = function (action) {\r\n return false;\r\n };\r\n /**\r\n * @return {null}\r\n */\r\n LLRBEmptyNode.prototype.minKey = function () {\r\n return null;\r\n };\r\n /**\r\n * @return {null}\r\n */\r\n LLRBEmptyNode.prototype.maxKey = function () {\r\n return null;\r\n };\r\n /**\r\n * @private\r\n * @return {number} Not sure what this returns exactly. :-).\r\n */\r\n LLRBEmptyNode.prototype.check_ = function () {\r\n return 0;\r\n };\r\n /**\r\n * @private\r\n * @return {boolean} Whether this node is red.\r\n */\r\n LLRBEmptyNode.prototype.isRed_ = function () {\r\n return false;\r\n };\r\n return LLRBEmptyNode;\r\n}());\r\n/**\r\n * An immutable sorted map implementation, based on a Left-leaning Red-Black\r\n * tree.\r\n */\r\nvar SortedMap = /** @class */ (function () {\r\n /**\r\n * @template K, V\r\n * @param {function(K, K):number} comparator_ Key comparator.\r\n * @param {LLRBNode=} root_ (Optional) Root node for the map.\r\n */\r\n function SortedMap(comparator_, root_) {\r\n if (root_ === void 0) { root_ = SortedMap.EMPTY_NODE; }\r\n this.comparator_ = comparator_;\r\n this.root_ = root_;\r\n }\r\n /**\r\n * Returns a copy of the map, with the specified key/value added or replaced.\r\n * (TODO: We should perhaps rename this method to 'put')\r\n *\r\n * @param {!K} key Key to be added.\r\n * @param {!V} value Value to be added.\r\n * @return {!SortedMap.} New map, with item added.\r\n */\r\n SortedMap.prototype.insert = function (key, value) {\r\n return new SortedMap(this.comparator_, this.root_\r\n .insert(key, value, this.comparator_)\r\n .copy(null, null, LLRBNode.BLACK, null, null));\r\n };\r\n /**\r\n * Returns a copy of the map, with the specified key removed.\r\n *\r\n * @param {!K} key The key to remove.\r\n * @return {!SortedMap.} New map, with item removed.\r\n */\r\n SortedMap.prototype.remove = function (key) {\r\n return new SortedMap(this.comparator_, this.root_\r\n .remove(key, this.comparator_)\r\n .copy(null, null, LLRBNode.BLACK, null, null));\r\n };\r\n /**\r\n * Returns the value of the node with the given key, or null.\r\n *\r\n * @param {!K} key The key to look up.\r\n * @return {?V} The value of the node with the given key, or null if the\r\n * key doesn't exist.\r\n */\r\n SortedMap.prototype.get = function (key) {\r\n var cmp;\r\n var node = this.root_;\r\n while (!node.isEmpty()) {\r\n cmp = this.comparator_(key, node.key);\r\n if (cmp === 0) {\r\n return node.value;\r\n }\r\n else if (cmp < 0) {\r\n node = node.left;\r\n }\r\n else if (cmp > 0) {\r\n node = node.right;\r\n }\r\n }\r\n return null;\r\n };\r\n /**\r\n * Returns the key of the item *before* the specified key, or null if key is the first item.\r\n * @param {K} key The key to find the predecessor of\r\n * @return {?K} The predecessor key.\r\n */\r\n SortedMap.prototype.getPredecessorKey = function (key) {\r\n var cmp, node = this.root_, rightParent = null;\r\n while (!node.isEmpty()) {\r\n cmp = this.comparator_(key, node.key);\r\n if (cmp === 0) {\r\n if (!node.left.isEmpty()) {\r\n node = node.left;\r\n while (!node.right.isEmpty())\r\n node = node.right;\r\n return node.key;\r\n }\r\n else if (rightParent) {\r\n return rightParent.key;\r\n }\r\n else {\r\n return null; // first item.\r\n }\r\n }\r\n else if (cmp < 0) {\r\n node = node.left;\r\n }\r\n else if (cmp > 0) {\r\n rightParent = node;\r\n node = node.right;\r\n }\r\n }\r\n throw new Error('Attempted to find predecessor key for a nonexistent key. What gives?');\r\n };\r\n /**\r\n * @return {boolean} True if the map is empty.\r\n */\r\n SortedMap.prototype.isEmpty = function () {\r\n return this.root_.isEmpty();\r\n };\r\n /**\r\n * @return {number} The total number of nodes in the map.\r\n */\r\n SortedMap.prototype.count = function () {\r\n return this.root_.count();\r\n };\r\n /**\r\n * @return {?K} The minimum key in the map.\r\n */\r\n SortedMap.prototype.minKey = function () {\r\n return this.root_.minKey();\r\n };\r\n /**\r\n * @return {?K} The maximum key in the map.\r\n */\r\n SortedMap.prototype.maxKey = function () {\r\n return this.root_.maxKey();\r\n };\r\n /**\r\n * Traverses the map in key order and calls the specified action function\r\n * for each key/value pair.\r\n *\r\n * @param {function(!K, !V):*} action Callback function to be called\r\n * for each key/value pair. If action returns true, traversal is aborted.\r\n * @return {*} The first truthy value returned by action, or the last falsey\r\n * value returned by action\r\n */\r\n SortedMap.prototype.inorderTraversal = function (action) {\r\n return this.root_.inorderTraversal(action);\r\n };\r\n /**\r\n * Traverses the map in reverse key order and calls the specified action function\r\n * for each key/value pair.\r\n *\r\n * @param {function(!Object, !Object)} action Callback function to be called\r\n * for each key/value pair. If action returns true, traversal is aborted.\r\n * @return {*} True if the traversal was aborted.\r\n */\r\n SortedMap.prototype.reverseTraversal = function (action) {\r\n return this.root_.reverseTraversal(action);\r\n };\r\n /**\r\n * Returns an iterator over the SortedMap.\r\n * @template T\r\n * @param {(function(K, V):T)=} resultGenerator\r\n * @return {SortedMapIterator.} The iterator.\r\n */\r\n SortedMap.prototype.getIterator = function (resultGenerator) {\r\n return new SortedMapIterator(this.root_, null, this.comparator_, false, resultGenerator);\r\n };\r\n SortedMap.prototype.getIteratorFrom = function (key, resultGenerator) {\r\n return new SortedMapIterator(this.root_, key, this.comparator_, false, resultGenerator);\r\n };\r\n SortedMap.prototype.getReverseIteratorFrom = function (key, resultGenerator) {\r\n return new SortedMapIterator(this.root_, key, this.comparator_, true, resultGenerator);\r\n };\r\n SortedMap.prototype.getReverseIterator = function (resultGenerator) {\r\n return new SortedMapIterator(this.root_, null, this.comparator_, true, resultGenerator);\r\n };\r\n /**\r\n * Always use the same empty node, to reduce memory.\r\n * @const\r\n */\r\n SortedMap.EMPTY_NODE = new LLRBEmptyNode();\r\n return SortedMap;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar LOG_2 = Math.log(2);\r\n/**\r\n * @constructor\r\n */\r\nvar Base12Num = /** @class */ (function () {\r\n /**\r\n * @param {number} length\r\n */\r\n function Base12Num(length) {\r\n var logBase2 = function (num) {\r\n return parseInt((Math.log(num) / LOG_2), 10);\r\n };\r\n var bitMask = function (bits) { return parseInt(Array(bits + 1).join('1'), 2); };\r\n this.count = logBase2(length + 1);\r\n this.current_ = this.count - 1;\r\n var mask = bitMask(this.count);\r\n this.bits_ = (length + 1) & mask;\r\n }\r\n /**\r\n * @return {boolean}\r\n */\r\n Base12Num.prototype.nextBitIsOne = function () {\r\n //noinspection JSBitwiseOperatorUsage\r\n var result = !(this.bits_ & (0x1 << this.current_));\r\n this.current_--;\r\n return result;\r\n };\r\n return Base12Num;\r\n}());\r\n/**\r\n * Takes a list of child nodes and constructs a SortedSet using the given comparison\r\n * function\r\n *\r\n * Uses the algorithm described in the paper linked here:\r\n * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.1458\r\n *\r\n * @template K, V\r\n * @param {Array.} childList Unsorted list of children\r\n * @param {function(!NamedNode, !NamedNode):number} cmp The comparison method to be used\r\n * @param {(function(NamedNode):K)=} keyFn An optional function to extract K from a node wrapper, if K's\r\n * type is not NamedNode\r\n * @param {(function(K, K):number)=} mapSortFn An optional override for comparator used by the generated sorted map\r\n * @return {SortedMap.}\r\n */\r\nvar buildChildSet = function (childList, cmp, keyFn, mapSortFn) {\r\n childList.sort(cmp);\r\n var buildBalancedTree = function (low, high) {\r\n var length = high - low;\r\n var namedNode;\r\n var key;\r\n if (length == 0) {\r\n return null;\r\n }\r\n else if (length == 1) {\r\n namedNode = childList[low];\r\n key = keyFn ? keyFn(namedNode) : namedNode;\r\n return new LLRBNode(key, namedNode.node, LLRBNode.BLACK, null, null);\r\n }\r\n else {\r\n var middle = parseInt((length / 2), 10) + low;\r\n var left = buildBalancedTree(low, middle);\r\n var right = buildBalancedTree(middle + 1, high);\r\n namedNode = childList[middle];\r\n key = keyFn ? keyFn(namedNode) : namedNode;\r\n return new LLRBNode(key, namedNode.node, LLRBNode.BLACK, left, right);\r\n }\r\n };\r\n var buildFrom12Array = function (base12) {\r\n var node = null;\r\n var root = null;\r\n var index = childList.length;\r\n var buildPennant = function (chunkSize, color) {\r\n var low = index - chunkSize;\r\n var high = index;\r\n index -= chunkSize;\r\n var childTree = buildBalancedTree(low + 1, high);\r\n var namedNode = childList[low];\r\n var key = keyFn ? keyFn(namedNode) : namedNode;\r\n attachPennant(new LLRBNode(key, namedNode.node, color, null, childTree));\r\n };\r\n var attachPennant = function (pennant) {\r\n if (node) {\r\n node.left = pennant;\r\n node = pennant;\r\n }\r\n else {\r\n root = pennant;\r\n node = pennant;\r\n }\r\n };\r\n for (var i = 0; i < base12.count; ++i) {\r\n var isOne = base12.nextBitIsOne();\r\n // The number of nodes taken in each slice is 2^(arr.length - (i + 1))\r\n var chunkSize = Math.pow(2, base12.count - (i + 1));\r\n if (isOne) {\r\n buildPennant(chunkSize, LLRBNode.BLACK);\r\n }\r\n else {\r\n // current == 2\r\n buildPennant(chunkSize, LLRBNode.BLACK);\r\n buildPennant(chunkSize, LLRBNode.RED);\r\n }\r\n }\r\n return root;\r\n };\r\n var base12 = new Base12Num(childList.length);\r\n var root = buildFrom12Array(base12);\r\n return new SortedMap(mapSortFn || cmp, root);\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar _defaultIndexMap;\r\nvar fallbackObject = {};\r\n/**\r\n *\r\n * @param {Object.>} indexes\r\n * @param {Object.} indexSet\r\n * @constructor\r\n */\r\nvar IndexMap = /** @class */ (function () {\r\n function IndexMap(indexes_, indexSet_) {\r\n this.indexes_ = indexes_;\r\n this.indexSet_ = indexSet_;\r\n }\r\n Object.defineProperty(IndexMap, \"Default\", {\r\n /**\r\n * The default IndexMap for nodes without a priority\r\n * @type {!IndexMap}\r\n * @const\r\n */\r\n get: function () {\r\n assert(fallbackObject && PRIORITY_INDEX, 'ChildrenNode.ts has not been loaded');\r\n _defaultIndexMap =\r\n _defaultIndexMap ||\r\n new IndexMap({ '.priority': fallbackObject }, { '.priority': PRIORITY_INDEX });\r\n return _defaultIndexMap;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n *\r\n * @param {!string} indexKey\r\n * @return {?SortedMap.}\r\n */\r\n IndexMap.prototype.get = function (indexKey) {\r\n var sortedMap = safeGet(this.indexes_, indexKey);\r\n if (!sortedMap)\r\n throw new Error('No index defined for ' + indexKey);\r\n if (sortedMap === fallbackObject) {\r\n // The index exists, but it falls back to just name comparison. Return null so that the calling code uses the\r\n // regular child map\r\n return null;\r\n }\r\n else {\r\n return sortedMap;\r\n }\r\n };\r\n /**\r\n * @param {!Index} indexDefinition\r\n * @return {boolean}\r\n */\r\n IndexMap.prototype.hasIndex = function (indexDefinition) {\r\n return contains(this.indexSet_, indexDefinition.toString());\r\n };\r\n /**\r\n * @param {!Index} indexDefinition\r\n * @param {!SortedMap.} existingChildren\r\n * @return {!IndexMap}\r\n */\r\n IndexMap.prototype.addIndex = function (indexDefinition, existingChildren) {\r\n assert(indexDefinition !== KEY_INDEX, \"KeyIndex always exists and isn't meant to be added to the IndexMap.\");\r\n var childList = [];\r\n var sawIndexedValue = false;\r\n var iter = existingChildren.getIterator(NamedNode.Wrap);\r\n var next = iter.getNext();\r\n while (next) {\r\n sawIndexedValue =\r\n sawIndexedValue || indexDefinition.isDefinedOn(next.node);\r\n childList.push(next);\r\n next = iter.getNext();\r\n }\r\n var newIndex;\r\n if (sawIndexedValue) {\r\n newIndex = buildChildSet(childList, indexDefinition.getCompare());\r\n }\r\n else {\r\n newIndex = fallbackObject;\r\n }\r\n var indexName = indexDefinition.toString();\r\n var newIndexSet = clone(this.indexSet_);\r\n newIndexSet[indexName] = indexDefinition;\r\n var newIndexes = clone(this.indexes_);\r\n newIndexes[indexName] = newIndex;\r\n return new IndexMap(newIndexes, newIndexSet);\r\n };\r\n /**\r\n * Ensure that this node is properly tracked in any indexes that we're maintaining\r\n * @param {!NamedNode} namedNode\r\n * @param {!SortedMap.} existingChildren\r\n * @return {!IndexMap}\r\n */\r\n IndexMap.prototype.addToIndexes = function (namedNode, existingChildren) {\r\n var _this = this;\r\n var newIndexes = map(this.indexes_, function (indexedChildren, indexName) {\r\n var index = safeGet(_this.indexSet_, indexName);\r\n assert(index, 'Missing index implementation for ' + indexName);\r\n if (indexedChildren === fallbackObject) {\r\n // Check to see if we need to index everything\r\n if (index.isDefinedOn(namedNode.node)) {\r\n // We need to build this index\r\n var childList = [];\r\n var iter = existingChildren.getIterator(NamedNode.Wrap);\r\n var next = iter.getNext();\r\n while (next) {\r\n if (next.name != namedNode.name) {\r\n childList.push(next);\r\n }\r\n next = iter.getNext();\r\n }\r\n childList.push(namedNode);\r\n return buildChildSet(childList, index.getCompare());\r\n }\r\n else {\r\n // No change, this remains a fallback\r\n return fallbackObject;\r\n }\r\n }\r\n else {\r\n var existingSnap = existingChildren.get(namedNode.name);\r\n var newChildren = indexedChildren;\r\n if (existingSnap) {\r\n newChildren = newChildren.remove(new NamedNode(namedNode.name, existingSnap));\r\n }\r\n return newChildren.insert(namedNode, namedNode.node);\r\n }\r\n });\r\n return new IndexMap(newIndexes, this.indexSet_);\r\n };\r\n /**\r\n * Create a new IndexMap instance with the given value removed\r\n * @param {!NamedNode} namedNode\r\n * @param {!SortedMap.} existingChildren\r\n * @return {!IndexMap}\r\n */\r\n IndexMap.prototype.removeFromIndexes = function (namedNode, existingChildren) {\r\n var newIndexes = map(this.indexes_, function (indexedChildren) {\r\n if (indexedChildren === fallbackObject) {\r\n // This is the fallback. Just return it, nothing to do in this case\r\n return indexedChildren;\r\n }\r\n else {\r\n var existingSnap = existingChildren.get(namedNode.name);\r\n if (existingSnap) {\r\n return indexedChildren.remove(new NamedNode(namedNode.name, existingSnap));\r\n }\r\n else {\r\n // No record of this child\r\n return indexedChildren;\r\n }\r\n }\r\n });\r\n return new IndexMap(newIndexes, this.indexSet_);\r\n };\r\n return IndexMap;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction NAME_ONLY_COMPARATOR(left, right) {\r\n return nameCompare(left.name, right.name);\r\n}\r\nfunction NAME_COMPARATOR(left, right) {\r\n return nameCompare(left, right);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// TODO: For memory savings, don't store priorityNode_ if it's empty.\r\nvar EMPTY_NODE;\r\n/**\r\n * ChildrenNode is a class for storing internal nodes in a DataSnapshot\r\n * (i.e. nodes with children). It implements Node and stores the\r\n * list of children in the children property, sorted by child name.\r\n *\r\n * @constructor\r\n * @implements {Node}\r\n */\r\nvar ChildrenNode = /** @class */ (function () {\r\n /**\r\n *\r\n * @param {!SortedMap.} children_ List of children\r\n * of this node..\r\n * @param {?Node} priorityNode_ The priority of this node (as a snapshot node).\r\n * @param {!IndexMap} indexMap_\r\n */\r\n function ChildrenNode(children_, priorityNode_, indexMap_) {\r\n this.children_ = children_;\r\n this.priorityNode_ = priorityNode_;\r\n this.indexMap_ = indexMap_;\r\n this.lazyHash_ = null;\r\n /**\r\n * Note: The only reason we allow null priority is for EMPTY_NODE, since we can't use\r\n * EMPTY_NODE as the priority of EMPTY_NODE. We might want to consider making EMPTY_NODE its own\r\n * class instead of an empty ChildrenNode.\r\n */\r\n if (this.priorityNode_) {\r\n validatePriorityNode(this.priorityNode_);\r\n }\r\n if (this.children_.isEmpty()) {\r\n assert(!this.priorityNode_ || this.priorityNode_.isEmpty(), 'An empty node cannot have a priority');\r\n }\r\n }\r\n Object.defineProperty(ChildrenNode, \"EMPTY_NODE\", {\r\n get: function () {\r\n return (EMPTY_NODE ||\r\n (EMPTY_NODE = new ChildrenNode(new SortedMap(NAME_COMPARATOR), null, IndexMap.Default)));\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.isLeafNode = function () {\r\n return false;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getPriority = function () {\r\n return this.priorityNode_ || EMPTY_NODE;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updatePriority = function (newPriorityNode) {\r\n if (this.children_.isEmpty()) {\r\n // Don't allow priorities on empty nodes\r\n return this;\r\n }\r\n else {\r\n return new ChildrenNode(this.children_, newPriorityNode, this.indexMap_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getImmediateChild = function (childName) {\r\n // Hack to treat priority as a regular child\r\n if (childName === '.priority') {\r\n return this.getPriority();\r\n }\r\n else {\r\n var child = this.children_.get(childName);\r\n return child === null ? EMPTY_NODE : child;\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getChild = function (path) {\r\n var front = path.getFront();\r\n if (front === null)\r\n return this;\r\n return this.getImmediateChild(front).getChild(path.popFront());\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.hasChild = function (childName) {\r\n return this.children_.get(childName) !== null;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updateImmediateChild = function (childName, newChildNode) {\r\n assert(newChildNode, 'We should always be passing snapshot nodes');\r\n if (childName === '.priority') {\r\n return this.updatePriority(newChildNode);\r\n }\r\n else {\r\n var namedNode = new NamedNode(childName, newChildNode);\r\n var newChildren = void 0, newIndexMap = void 0, newPriority = void 0;\r\n if (newChildNode.isEmpty()) {\r\n newChildren = this.children_.remove(childName);\r\n newIndexMap = this.indexMap_.removeFromIndexes(namedNode, this.children_);\r\n }\r\n else {\r\n newChildren = this.children_.insert(childName, newChildNode);\r\n newIndexMap = this.indexMap_.addToIndexes(namedNode, this.children_);\r\n }\r\n newPriority = newChildren.isEmpty() ? EMPTY_NODE : this.priorityNode_;\r\n return new ChildrenNode(newChildren, newPriority, newIndexMap);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.updateChild = function (path, newChildNode) {\r\n var front = path.getFront();\r\n if (front === null) {\r\n return newChildNode;\r\n }\r\n else {\r\n assert(path.getFront() !== '.priority' || path.getLength() === 1, '.priority must be the last token in a path');\r\n var newImmediateChild = this.getImmediateChild(front).updateChild(path.popFront(), newChildNode);\r\n return this.updateImmediateChild(front, newImmediateChild);\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.isEmpty = function () {\r\n return this.children_.isEmpty();\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.numChildren = function () {\r\n return this.children_.count();\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.val = function (exportFormat) {\r\n if (this.isEmpty())\r\n return null;\r\n var obj = {};\r\n var numKeys = 0, maxKey = 0, allIntegerKeys = true;\r\n this.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n obj[key] = childNode.val(exportFormat);\r\n numKeys++;\r\n if (allIntegerKeys && ChildrenNode.INTEGER_REGEXP_.test(key)) {\r\n maxKey = Math.max(maxKey, Number(key));\r\n }\r\n else {\r\n allIntegerKeys = false;\r\n }\r\n });\r\n if (!exportFormat && allIntegerKeys && maxKey < 2 * numKeys) {\r\n // convert to array.\r\n var array = [];\r\n for (var key in obj)\r\n array[key] = obj[key];\r\n return array;\r\n }\r\n else {\r\n if (exportFormat && !this.getPriority().isEmpty()) {\r\n obj['.priority'] = this.getPriority().val();\r\n }\r\n return obj;\r\n }\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.hash = function () {\r\n if (this.lazyHash_ === null) {\r\n var toHash_1 = '';\r\n if (!this.getPriority().isEmpty())\r\n toHash_1 +=\r\n 'priority:' +\r\n priorityHashText(this.getPriority().val()) +\r\n ':';\r\n this.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n var childHash = childNode.hash();\r\n if (childHash !== '')\r\n toHash_1 += ':' + key + ':' + childHash;\r\n });\r\n this.lazyHash_ = toHash_1 === '' ? '' : sha1(toHash_1);\r\n }\r\n return this.lazyHash_;\r\n };\r\n /** @inheritDoc */\r\n ChildrenNode.prototype.getPredecessorChildName = function (childName, childNode, index) {\r\n var idx = this.resolveIndex_(index);\r\n if (idx) {\r\n var predecessor = idx.getPredecessorKey(new NamedNode(childName, childNode));\r\n return predecessor ? predecessor.name : null;\r\n }\r\n else {\r\n return this.children_.getPredecessorKey(childName);\r\n }\r\n };\r\n /**\r\n * @param {!Index} indexDefinition\r\n * @return {?string}\r\n */\r\n ChildrenNode.prototype.getFirstChildName = function (indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n var minKey = idx.minKey();\r\n return minKey && minKey.name;\r\n }\r\n else {\r\n return this.children_.minKey();\r\n }\r\n };\r\n /**\r\n * @param {!Index} indexDefinition\r\n * @return {?NamedNode}\r\n */\r\n ChildrenNode.prototype.getFirstChild = function (indexDefinition) {\r\n var minKey = this.getFirstChildName(indexDefinition);\r\n if (minKey) {\r\n return new NamedNode(minKey, this.children_.get(minKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * Given an index, return the key name of the largest value we have, according to that index\r\n * @param {!Index} indexDefinition\r\n * @return {?string}\r\n */\r\n ChildrenNode.prototype.getLastChildName = function (indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n var maxKey = idx.maxKey();\r\n return maxKey && maxKey.name;\r\n }\r\n else {\r\n return this.children_.maxKey();\r\n }\r\n };\r\n /**\r\n * @param {!Index} indexDefinition\r\n * @return {?NamedNode}\r\n */\r\n ChildrenNode.prototype.getLastChild = function (indexDefinition) {\r\n var maxKey = this.getLastChildName(indexDefinition);\r\n if (maxKey) {\r\n return new NamedNode(maxKey, this.children_.get(maxKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildrenNode.prototype.forEachChild = function (index, action) {\r\n var idx = this.resolveIndex_(index);\r\n if (idx) {\r\n return idx.inorderTraversal(function (wrappedNode) {\r\n return action(wrappedNode.name, wrappedNode.node);\r\n });\r\n }\r\n else {\r\n return this.children_.inorderTraversal(action);\r\n }\r\n };\r\n /**\r\n * @param {!Index} indexDefinition\r\n * @return {SortedMapIterator}\r\n */\r\n ChildrenNode.prototype.getIterator = function (indexDefinition) {\r\n return this.getIteratorFrom(indexDefinition.minPost(), indexDefinition);\r\n };\r\n /**\r\n *\r\n * @param {!NamedNode} startPost\r\n * @param {!Index} indexDefinition\r\n * @return {!SortedMapIterator}\r\n */\r\n ChildrenNode.prototype.getIteratorFrom = function (startPost, indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n return idx.getIteratorFrom(startPost, function (key) { return key; });\r\n }\r\n else {\r\n var iterator = this.children_.getIteratorFrom(startPost.name, NamedNode.Wrap);\r\n var next = iterator.peek();\r\n while (next != null && indexDefinition.compare(next, startPost) < 0) {\r\n iterator.getNext();\r\n next = iterator.peek();\r\n }\r\n return iterator;\r\n }\r\n };\r\n /**\r\n * @param {!Index} indexDefinition\r\n * @return {!SortedMapIterator}\r\n */\r\n ChildrenNode.prototype.getReverseIterator = function (indexDefinition) {\r\n return this.getReverseIteratorFrom(indexDefinition.maxPost(), indexDefinition);\r\n };\r\n /**\r\n * @param {!NamedNode} endPost\r\n * @param {!Index} indexDefinition\r\n * @return {!SortedMapIterator}\r\n */\r\n ChildrenNode.prototype.getReverseIteratorFrom = function (endPost, indexDefinition) {\r\n var idx = this.resolveIndex_(indexDefinition);\r\n if (idx) {\r\n return idx.getReverseIteratorFrom(endPost, function (key) {\r\n return key;\r\n });\r\n }\r\n else {\r\n var iterator = this.children_.getReverseIteratorFrom(endPost.name, NamedNode.Wrap);\r\n var next = iterator.peek();\r\n while (next != null && indexDefinition.compare(next, endPost) > 0) {\r\n iterator.getNext();\r\n next = iterator.peek();\r\n }\r\n return iterator;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildrenNode.prototype.compareTo = function (other) {\r\n if (this.isEmpty()) {\r\n if (other.isEmpty()) {\r\n return 0;\r\n }\r\n else {\r\n return -1;\r\n }\r\n }\r\n else if (other.isLeafNode() || other.isEmpty()) {\r\n return 1;\r\n }\r\n else if (other === MAX_NODE$2) {\r\n return -1;\r\n }\r\n else {\r\n // Must be another node with children.\r\n return 0;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildrenNode.prototype.withIndex = function (indexDefinition) {\r\n if (indexDefinition === KEY_INDEX ||\r\n this.indexMap_.hasIndex(indexDefinition)) {\r\n return this;\r\n }\r\n else {\r\n var newIndexMap = this.indexMap_.addIndex(indexDefinition, this.children_);\r\n return new ChildrenNode(this.children_, this.priorityNode_, newIndexMap);\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildrenNode.prototype.isIndexed = function (index) {\r\n return index === KEY_INDEX || this.indexMap_.hasIndex(index);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildrenNode.prototype.equals = function (other) {\r\n if (other === this) {\r\n return true;\r\n }\r\n else if (other.isLeafNode()) {\r\n return false;\r\n }\r\n else {\r\n var otherChildrenNode = other;\r\n if (!this.getPriority().equals(otherChildrenNode.getPriority())) {\r\n return false;\r\n }\r\n else if (this.children_.count() === otherChildrenNode.children_.count()) {\r\n var thisIter = this.getIterator(PRIORITY_INDEX);\r\n var otherIter = otherChildrenNode.getIterator(PRIORITY_INDEX);\r\n var thisCurrent = thisIter.getNext();\r\n var otherCurrent = otherIter.getNext();\r\n while (thisCurrent && otherCurrent) {\r\n if (thisCurrent.name !== otherCurrent.name ||\r\n !thisCurrent.node.equals(otherCurrent.node)) {\r\n return false;\r\n }\r\n thisCurrent = thisIter.getNext();\r\n otherCurrent = otherIter.getNext();\r\n }\r\n return thisCurrent === null && otherCurrent === null;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n };\r\n /**\r\n * Returns a SortedMap ordered by index, or null if the default (by-key) ordering can be used\r\n * instead.\r\n *\r\n * @private\r\n * @param {!Index} indexDefinition\r\n * @return {?SortedMap.}\r\n */\r\n ChildrenNode.prototype.resolveIndex_ = function (indexDefinition) {\r\n if (indexDefinition === KEY_INDEX) {\r\n return null;\r\n }\r\n else {\r\n return this.indexMap_.get(indexDefinition.toString());\r\n }\r\n };\r\n /**\r\n * @private\r\n * @type {RegExp}\r\n */\r\n ChildrenNode.INTEGER_REGEXP_ = /^(0|[1-9]\\d*)$/;\r\n return ChildrenNode;\r\n}());\r\n/**\r\n * @constructor\r\n * @extends {ChildrenNode}\r\n * @private\r\n */\r\nvar MaxNode = /** @class */ (function (_super) {\r\n __extends(MaxNode, _super);\r\n function MaxNode() {\r\n return _super.call(this, new SortedMap(NAME_COMPARATOR), ChildrenNode.EMPTY_NODE, IndexMap.Default) || this;\r\n }\r\n MaxNode.prototype.compareTo = function (other) {\r\n if (other === this) {\r\n return 0;\r\n }\r\n else {\r\n return 1;\r\n }\r\n };\r\n MaxNode.prototype.equals = function (other) {\r\n // Not that we every compare it, but MAX_NODE is only ever equal to itself\r\n return other === this;\r\n };\r\n MaxNode.prototype.getPriority = function () {\r\n return this;\r\n };\r\n MaxNode.prototype.getImmediateChild = function (childName) {\r\n return ChildrenNode.EMPTY_NODE;\r\n };\r\n MaxNode.prototype.isEmpty = function () {\r\n return false;\r\n };\r\n return MaxNode;\r\n}(ChildrenNode));\r\n/**\r\n * Marker that will sort higher than any other snapshot.\r\n * @type {!MAX_NODE}\r\n * @const\r\n */\r\nvar MAX_NODE$2 = new MaxNode();\r\nObject.defineProperties(NamedNode, {\r\n MIN: {\r\n value: new NamedNode(MIN_NAME, ChildrenNode.EMPTY_NODE)\r\n },\r\n MAX: {\r\n value: new NamedNode(MAX_NAME, MAX_NODE$2)\r\n }\r\n});\r\n/**\r\n * Reference Extensions\r\n */\r\nKeyIndex.__EMPTY_NODE = ChildrenNode.EMPTY_NODE;\r\nLeafNode.__childrenNodeConstructor = ChildrenNode;\r\nsetMaxNode(MAX_NODE$2);\r\nsetMaxNode$1(MAX_NODE$2);\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar USE_HINZE = true;\r\n/**\r\n * Constructs a snapshot node representing the passed JSON and returns it.\r\n * @param {*} json JSON to create a node for.\r\n * @param {?string|?number=} priority Optional priority to use. This will be ignored if the\r\n * passed JSON contains a .priority property.\r\n * @return {!Node}\r\n */\r\nfunction nodeFromJSON$1(json, priority) {\r\n if (priority === void 0) { priority = null; }\r\n if (json === null) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n if (typeof json === 'object' && '.priority' in json) {\r\n priority = json['.priority'];\r\n }\r\n assert(priority === null ||\r\n typeof priority === 'string' ||\r\n typeof priority === 'number' ||\r\n (typeof priority === 'object' && '.sv' in priority), 'Invalid priority type found: ' + typeof priority);\r\n if (typeof json === 'object' && '.value' in json && json['.value'] !== null) {\r\n json = json['.value'];\r\n }\r\n // Valid leaf nodes include non-objects or server-value wrapper objects\r\n if (typeof json !== 'object' || '.sv' in json) {\r\n var jsonLeaf = json;\r\n return new LeafNode(jsonLeaf, nodeFromJSON$1(priority));\r\n }\r\n if (!(json instanceof Array) && USE_HINZE) {\r\n var children_1 = [];\r\n var childrenHavePriority_1 = false;\r\n var hinzeJsonObj_1 = json;\r\n forEach(hinzeJsonObj_1, function (key, child) {\r\n if (typeof key !== 'string' || key.substring(0, 1) !== '.') {\r\n // Ignore metadata nodes\r\n var childNode = nodeFromJSON$1(hinzeJsonObj_1[key]);\r\n if (!childNode.isEmpty()) {\r\n childrenHavePriority_1 =\r\n childrenHavePriority_1 || !childNode.getPriority().isEmpty();\r\n children_1.push(new NamedNode(key, childNode));\r\n }\r\n }\r\n });\r\n if (children_1.length == 0) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n var childSet = buildChildSet(children_1, NAME_ONLY_COMPARATOR, function (namedNode) { return namedNode.name; }, NAME_COMPARATOR);\r\n if (childrenHavePriority_1) {\r\n var sortedChildSet = buildChildSet(children_1, PRIORITY_INDEX.getCompare());\r\n return new ChildrenNode(childSet, nodeFromJSON$1(priority), new IndexMap({ '.priority': sortedChildSet }, { '.priority': PRIORITY_INDEX }));\r\n }\r\n else {\r\n return new ChildrenNode(childSet, nodeFromJSON$1(priority), IndexMap.Default);\r\n }\r\n }\r\n else {\r\n var node_1 = ChildrenNode.EMPTY_NODE;\r\n var jsonObj_1 = json;\r\n forEach(jsonObj_1, function (key, childData) {\r\n if (contains(jsonObj_1, key)) {\r\n if (key.substring(0, 1) !== '.') {\r\n // ignore metadata nodes.\r\n var childNode = nodeFromJSON$1(childData);\r\n if (childNode.isLeafNode() || !childNode.isEmpty())\r\n node_1 = node_1.updateImmediateChild(key, childNode);\r\n }\r\n }\r\n });\r\n return node_1.updatePriority(nodeFromJSON$1(priority));\r\n }\r\n}\r\nsetNodeFromJSON(nodeFromJSON$1);\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @constructor\r\n * @extends {Index}\r\n * @private\r\n */\r\nvar ValueIndex = /** @class */ (function (_super) {\r\n __extends(ValueIndex, _super);\r\n function ValueIndex() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueIndex.prototype.compare = function (a, b) {\r\n var indexCmp = a.node.compareTo(b.node);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueIndex.prototype.isDefinedOn = function (node) {\r\n return true;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueIndex.prototype.indexedValueChanged = function (oldNode, newNode) {\r\n return !oldNode.equals(newNode);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueIndex.prototype.minPost = function () {\r\n return NamedNode.MIN;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueIndex.prototype.maxPost = function () {\r\n return NamedNode.MAX;\r\n };\r\n /**\r\n * @param {*} indexValue\r\n * @param {string} name\r\n * @return {!NamedNode}\r\n */\r\n ValueIndex.prototype.makePost = function (indexValue, name) {\r\n var valueNode = nodeFromJSON$1(indexValue);\r\n return new NamedNode(name, valueNode);\r\n };\r\n /**\r\n * @return {!string} String representation for inclusion in a query spec\r\n */\r\n ValueIndex.prototype.toString = function () {\r\n return '.value';\r\n };\r\n return ValueIndex;\r\n}(Index));\r\nvar VALUE_INDEX = new ValueIndex();\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param {!Path} indexPath\r\n * @constructor\r\n * @extends {Index}\r\n */\r\nvar PathIndex = /** @class */ (function (_super) {\r\n __extends(PathIndex, _super);\r\n function PathIndex(indexPath_) {\r\n var _this = _super.call(this) || this;\r\n _this.indexPath_ = indexPath_;\r\n assert(!indexPath_.isEmpty() && indexPath_.getFront() !== '.priority', \"Can't create PathIndex with empty path or .priority key\");\r\n return _this;\r\n }\r\n /**\r\n * @param {!Node} snap\r\n * @return {!Node}\r\n * @protected\r\n */\r\n PathIndex.prototype.extractChild = function (snap) {\r\n return snap.getChild(this.indexPath_);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PathIndex.prototype.isDefinedOn = function (node) {\r\n return !node.getChild(this.indexPath_).isEmpty();\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PathIndex.prototype.compare = function (a, b) {\r\n var aChild = this.extractChild(a.node);\r\n var bChild = this.extractChild(b.node);\r\n var indexCmp = aChild.compareTo(bChild);\r\n if (indexCmp === 0) {\r\n return nameCompare(a.name, b.name);\r\n }\r\n else {\r\n return indexCmp;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PathIndex.prototype.makePost = function (indexValue, name) {\r\n var valueNode = nodeFromJSON$1(indexValue);\r\n var node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, valueNode);\r\n return new NamedNode(name, node);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PathIndex.prototype.maxPost = function () {\r\n var node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, MAX_NODE$2);\r\n return new NamedNode(MAX_NAME, node);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PathIndex.prototype.toString = function () {\r\n return this.indexPath_.slice().join('/');\r\n };\r\n return PathIndex;\r\n}(Index));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Class representing a firebase data snapshot. It wraps a SnapshotNode and\r\n * surfaces the public methods (val, forEach, etc.) we want to expose.\r\n */\r\nvar DataSnapshot = /** @class */ (function () {\r\n /**\r\n * @param {!Node} node_ A SnapshotNode to wrap.\r\n * @param {!Reference} ref_ The ref of the location this snapshot came from.\r\n * @param {!Index} index_ The iteration order for this snapshot\r\n */\r\n function DataSnapshot(node_, ref_, index_) {\r\n this.node_ = node_;\r\n this.ref_ = ref_;\r\n this.index_ = index_;\r\n }\r\n /**\r\n * Retrieves the snapshot contents as JSON. Returns null if the snapshot is\r\n * empty.\r\n *\r\n * @return {*} JSON representation of the DataSnapshot contents, or null if empty.\r\n */\r\n DataSnapshot.prototype.val = function () {\r\n validateArgCount('DataSnapshot.val', 0, 0, arguments.length);\r\n return this.node_.val();\r\n };\r\n /**\r\n * Returns the snapshot contents as JSON, including priorities of node. Suitable for exporting\r\n * the entire node contents.\r\n * @return {*} JSON representation of the DataSnapshot contents, or null if empty.\r\n */\r\n DataSnapshot.prototype.exportVal = function () {\r\n validateArgCount('DataSnapshot.exportVal', 0, 0, arguments.length);\r\n return this.node_.val(true);\r\n };\r\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\r\n // for end-users\r\n DataSnapshot.prototype.toJSON = function () {\r\n // Optional spacer argument is unnecessary because we're depending on recursion rather than stringifying the content\r\n validateArgCount('DataSnapshot.toJSON', 0, 1, arguments.length);\r\n return this.exportVal();\r\n };\r\n /**\r\n * Returns whether the snapshot contains a non-null value.\r\n *\r\n * @return {boolean} Whether the snapshot contains a non-null value, or is empty.\r\n */\r\n DataSnapshot.prototype.exists = function () {\r\n validateArgCount('DataSnapshot.exists', 0, 0, arguments.length);\r\n return !this.node_.isEmpty();\r\n };\r\n /**\r\n * Returns a DataSnapshot of the specified child node's contents.\r\n *\r\n * @param {!string} childPathString Path to a child.\r\n * @return {!DataSnapshot} DataSnapshot for child node.\r\n */\r\n DataSnapshot.prototype.child = function (childPathString) {\r\n validateArgCount('DataSnapshot.child', 0, 1, arguments.length);\r\n // Ensure the childPath is a string (can be a number)\r\n childPathString = String(childPathString);\r\n validatePathString('DataSnapshot.child', 1, childPathString, false);\r\n var childPath = new Path(childPathString);\r\n var childRef = this.ref_.child(childPath);\r\n return new DataSnapshot(this.node_.getChild(childPath), childRef, PRIORITY_INDEX);\r\n };\r\n /**\r\n * Returns whether the snapshot contains a child at the specified path.\r\n *\r\n * @param {!string} childPathString Path to a child.\r\n * @return {boolean} Whether the child exists.\r\n */\r\n DataSnapshot.prototype.hasChild = function (childPathString) {\r\n validateArgCount('DataSnapshot.hasChild', 1, 1, arguments.length);\r\n validatePathString('DataSnapshot.hasChild', 1, childPathString, false);\r\n var childPath = new Path(childPathString);\r\n return !this.node_.getChild(childPath).isEmpty();\r\n };\r\n /**\r\n * Returns the priority of the object, or null if no priority was set.\r\n *\r\n * @return {string|number|null} The priority.\r\n */\r\n DataSnapshot.prototype.getPriority = function () {\r\n validateArgCount('DataSnapshot.getPriority', 0, 0, arguments.length);\r\n // typecast here because we never return deferred values or internal priorities (MAX_PRIORITY)\r\n return this.node_.getPriority().val();\r\n };\r\n /**\r\n * Iterates through child nodes and calls the specified action for each one.\r\n *\r\n * @param {function(!DataSnapshot)} action Callback function to be called\r\n * for each child.\r\n * @return {boolean} True if forEach was canceled by action returning true for\r\n * one of the child nodes.\r\n */\r\n DataSnapshot.prototype.forEach = function (action) {\r\n var _this = this;\r\n validateArgCount('DataSnapshot.forEach', 1, 1, arguments.length);\r\n validateCallback('DataSnapshot.forEach', 1, action, false);\r\n if (this.node_.isLeafNode())\r\n return false;\r\n var childrenNode = this.node_;\r\n // Sanitize the return value to a boolean. ChildrenNode.forEachChild has a weird return type...\r\n return !!childrenNode.forEachChild(this.index_, function (key, node) {\r\n return action(new DataSnapshot(node, _this.ref_.child(key), PRIORITY_INDEX));\r\n });\r\n };\r\n /**\r\n * Returns whether this DataSnapshot has children.\r\n * @return {boolean} True if the DataSnapshot contains 1 or more child nodes.\r\n */\r\n DataSnapshot.prototype.hasChildren = function () {\r\n validateArgCount('DataSnapshot.hasChildren', 0, 0, arguments.length);\r\n if (this.node_.isLeafNode())\r\n return false;\r\n else\r\n return !this.node_.isEmpty();\r\n };\r\n Object.defineProperty(DataSnapshot.prototype, \"key\", {\r\n get: function () {\r\n return this.ref_.getKey();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Returns the number of children for this DataSnapshot.\r\n * @return {number} The number of children that this DataSnapshot contains.\r\n */\r\n DataSnapshot.prototype.numChildren = function () {\r\n validateArgCount('DataSnapshot.numChildren', 0, 0, arguments.length);\r\n return this.node_.numChildren();\r\n };\r\n /**\r\n * @return {Reference} The Firebase reference for the location this snapshot's data came from.\r\n */\r\n DataSnapshot.prototype.getRef = function () {\r\n validateArgCount('DataSnapshot.ref', 0, 0, arguments.length);\r\n return this.ref_;\r\n };\r\n Object.defineProperty(DataSnapshot.prototype, \"ref\", {\r\n get: function () {\r\n return this.getRef();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return DataSnapshot;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Encapsulates the data needed to raise an event\r\n * @implements {Event}\r\n */\r\nvar DataEvent = /** @class */ (function () {\r\n /**\r\n * @param {!string} eventType One of: value, child_added, child_changed, child_moved, child_removed\r\n * @param {!EventRegistration} eventRegistration The function to call to with the event data. User provided\r\n * @param {!DataSnapshot} snapshot The data backing the event\r\n * @param {?string=} prevName Optional, the name of the previous child for child_* events.\r\n */\r\n function DataEvent(eventType, eventRegistration, snapshot, prevName) {\r\n this.eventType = eventType;\r\n this.eventRegistration = eventRegistration;\r\n this.snapshot = snapshot;\r\n this.prevName = prevName;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n DataEvent.prototype.getPath = function () {\r\n var ref = this.snapshot.getRef();\r\n if (this.eventType === 'value') {\r\n return ref.path;\r\n }\r\n else {\r\n return ref.getParent().path;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n DataEvent.prototype.getEventType = function () {\r\n return this.eventType;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n DataEvent.prototype.getEventRunner = function () {\r\n return this.eventRegistration.getEventRunner(this);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n DataEvent.prototype.toString = function () {\r\n return (this.getPath().toString() +\r\n ':' +\r\n this.eventType +\r\n ':' +\r\n stringify(this.snapshot.exportVal()));\r\n };\r\n return DataEvent;\r\n}());\r\nvar CancelEvent = /** @class */ (function () {\r\n /**\r\n * @param {EventRegistration} eventRegistration\r\n * @param {Error} error\r\n * @param {!Path} path\r\n */\r\n function CancelEvent(eventRegistration, error, path) {\r\n this.eventRegistration = eventRegistration;\r\n this.error = error;\r\n this.path = path;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n CancelEvent.prototype.getPath = function () {\r\n return this.path;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n CancelEvent.prototype.getEventType = function () {\r\n return 'cancel';\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n CancelEvent.prototype.getEventRunner = function () {\r\n return this.eventRegistration.getEventRunner(this);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n CancelEvent.prototype.toString = function () {\r\n return this.path.toString() + ':cancel';\r\n };\r\n return CancelEvent;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Represents registration for 'value' events.\r\n */\r\nvar ValueEventRegistration = /** @class */ (function () {\r\n /**\r\n * @param {?function(!DataSnapshot)} callback_\r\n * @param {?function(Error)} cancelCallback_\r\n * @param {?Object} context_\r\n */\r\n function ValueEventRegistration(callback_, cancelCallback_, context_) {\r\n this.callback_ = callback_;\r\n this.cancelCallback_ = cancelCallback_;\r\n this.context_ = context_;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueEventRegistration.prototype.respondsTo = function (eventType) {\r\n return eventType === 'value';\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueEventRegistration.prototype.createEvent = function (change, query) {\r\n var index = query.getQueryParams().getIndex();\r\n return new DataEvent('value', this, new DataSnapshot(change.snapshotNode, query.getRef(), index));\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueEventRegistration.prototype.getEventRunner = function (eventData) {\r\n var ctx = this.context_;\r\n if (eventData.getEventType() === 'cancel') {\r\n assert(this.cancelCallback_, 'Raising a cancel event on a listener with no cancel callback');\r\n var cancelCB_1 = this.cancelCallback_;\r\n return function () {\r\n // We know that error exists, we checked above that this is a cancel event\r\n cancelCB_1.call(ctx, eventData.error);\r\n };\r\n }\r\n else {\r\n var cb_1 = this.callback_;\r\n return function () {\r\n cb_1.call(ctx, eventData.snapshot);\r\n };\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueEventRegistration.prototype.createCancelEvent = function (error, path) {\r\n if (this.cancelCallback_) {\r\n return new CancelEvent(this, error, path);\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueEventRegistration.prototype.matches = function (other) {\r\n if (!(other instanceof ValueEventRegistration)) {\r\n return false;\r\n }\r\n else if (!other.callback_ || !this.callback_) {\r\n // If no callback specified, we consider it to match any callback.\r\n return true;\r\n }\r\n else {\r\n return (other.callback_ === this.callback_ && other.context_ === this.context_);\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ValueEventRegistration.prototype.hasAnyCallback = function () {\r\n return this.callback_ !== null;\r\n };\r\n return ValueEventRegistration;\r\n}());\r\n/**\r\n * Represents the registration of 1 or more child_xxx events.\r\n *\r\n * Currently, it is always exactly 1 child_xxx event, but the idea is we might let you\r\n * register a group of callbacks together in the future.\r\n *\r\n * @constructor\r\n * @implements {EventRegistration}\r\n */\r\nvar ChildEventRegistration = /** @class */ (function () {\r\n /**\r\n * @param {?Object.} callbacks_\r\n * @param {?function(Error)} cancelCallback_\r\n * @param {Object=} context_\r\n */\r\n function ChildEventRegistration(callbacks_, cancelCallback_, context_) {\r\n this.callbacks_ = callbacks_;\r\n this.cancelCallback_ = cancelCallback_;\r\n this.context_ = context_;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildEventRegistration.prototype.respondsTo = function (eventType) {\r\n var eventToCheck = eventType === 'children_added' ? 'child_added' : eventType;\r\n eventToCheck =\r\n eventToCheck === 'children_removed' ? 'child_removed' : eventToCheck;\r\n return contains(this.callbacks_, eventToCheck);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildEventRegistration.prototype.createCancelEvent = function (error, path) {\r\n if (this.cancelCallback_) {\r\n return new CancelEvent(this, error, path);\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildEventRegistration.prototype.createEvent = function (change, query) {\r\n assert(change.childName != null, 'Child events should have a childName.');\r\n var ref = query.getRef().child(/** @type {!string} */ (change.childName));\r\n var index = query.getQueryParams().getIndex();\r\n return new DataEvent(change.type, this, new DataSnapshot(change.snapshotNode, ref, index), change.prevName);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildEventRegistration.prototype.getEventRunner = function (eventData) {\r\n var ctx = this.context_;\r\n if (eventData.getEventType() === 'cancel') {\r\n assert(this.cancelCallback_, 'Raising a cancel event on a listener with no cancel callback');\r\n var cancelCB_2 = this.cancelCallback_;\r\n return function () {\r\n // We know that error exists, we checked above that this is a cancel event\r\n cancelCB_2.call(ctx, eventData.error);\r\n };\r\n }\r\n else {\r\n var cb_2 = this.callbacks_[eventData.eventType];\r\n return function () {\r\n cb_2.call(ctx, eventData.snapshot, eventData.prevName);\r\n };\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildEventRegistration.prototype.matches = function (other) {\r\n if (other instanceof ChildEventRegistration) {\r\n if (!this.callbacks_ || !other.callbacks_) {\r\n return true;\r\n }\r\n else if (this.context_ === other.context_) {\r\n var otherCount = getCount(other.callbacks_);\r\n var thisCount = getCount(this.callbacks_);\r\n if (otherCount === thisCount) {\r\n // If count is 1, do an exact match on eventType, if either is defined but null, it's a match.\r\n // If event types don't match, not a match\r\n // If count is not 1, exact match across all\r\n if (otherCount === 1) {\r\n var otherKey /** @type {!string} */ = getAnyKey(other.callbacks_);\r\n var thisKey /** @type {!string} */ = getAnyKey(this.callbacks_);\r\n return (thisKey === otherKey &&\r\n (!other.callbacks_[otherKey] ||\r\n !this.callbacks_[thisKey] ||\r\n other.callbacks_[otherKey] === this.callbacks_[thisKey]));\r\n }\r\n else {\r\n // Exact match on each key.\r\n return every(this.callbacks_, function (eventType, cb) { return other.callbacks_[eventType] === cb; });\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n ChildEventRegistration.prototype.hasAnyCallback = function () {\r\n return this.callbacks_ !== null;\r\n };\r\n return ChildEventRegistration;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __referenceConstructor;\r\n/**\r\n * A Query represents a filter to be applied to a firebase location. This object purely represents the\r\n * query expression (and exposes our public API to build the query). The actual query logic is in ViewBase.js.\r\n *\r\n * Since every Firebase reference is a query, Firebase inherits from this object.\r\n */\r\nvar Query = /** @class */ (function () {\r\n function Query(repo, path, queryParams_, orderByCalled_) {\r\n this.repo = repo;\r\n this.path = path;\r\n this.queryParams_ = queryParams_;\r\n this.orderByCalled_ = orderByCalled_;\r\n }\r\n Object.defineProperty(Query, \"__referenceConstructor\", {\r\n get: function () {\r\n assert(__referenceConstructor, 'Reference.ts has not been loaded');\r\n return __referenceConstructor;\r\n },\r\n set: function (val) {\r\n __referenceConstructor = val;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Validates start/end values for queries.\r\n * @param {!QueryParams} params\r\n * @private\r\n */\r\n Query.validateQueryEndpoints_ = function (params) {\r\n var startNode = null;\r\n var endNode = null;\r\n if (params.hasStart()) {\r\n startNode = params.getIndexStartValue();\r\n }\r\n if (params.hasEnd()) {\r\n endNode = params.getIndexEndValue();\r\n }\r\n if (params.getIndex() === KEY_INDEX) {\r\n var tooManyArgsError = 'Query: When ordering by key, you may only pass one argument to ' +\r\n 'startAt(), endAt(), or equalTo().';\r\n var wrongArgTypeError = 'Query: When ordering by key, the argument passed to startAt(), endAt(),' +\r\n 'or equalTo() must be a string.';\r\n if (params.hasStart()) {\r\n var startName = params.getIndexStartName();\r\n if (startName != MIN_NAME) {\r\n throw new Error(tooManyArgsError);\r\n }\r\n else if (typeof startNode !== 'string') {\r\n throw new Error(wrongArgTypeError);\r\n }\r\n }\r\n if (params.hasEnd()) {\r\n var endName = params.getIndexEndName();\r\n if (endName != MAX_NAME) {\r\n throw new Error(tooManyArgsError);\r\n }\r\n else if (typeof endNode !== 'string') {\r\n throw new Error(wrongArgTypeError);\r\n }\r\n }\r\n }\r\n else if (params.getIndex() === PRIORITY_INDEX) {\r\n if ((startNode != null && !isValidPriority(startNode)) ||\r\n (endNode != null && !isValidPriority(endNode))) {\r\n throw new Error('Query: When ordering by priority, the first argument passed to startAt(), ' +\r\n 'endAt(), or equalTo() must be a valid priority value (null, a number, or a string).');\r\n }\r\n }\r\n else {\r\n assert(params.getIndex() instanceof PathIndex ||\r\n params.getIndex() === VALUE_INDEX, 'unknown index type.');\r\n if ((startNode != null && typeof startNode === 'object') ||\r\n (endNode != null && typeof endNode === 'object')) {\r\n throw new Error('Query: First argument passed to startAt(), endAt(), or equalTo() cannot be ' +\r\n 'an object.');\r\n }\r\n }\r\n };\r\n /**\r\n * Validates that limit* has been called with the correct combination of parameters\r\n * @param {!QueryParams} params\r\n * @private\r\n */\r\n Query.validateLimit_ = function (params) {\r\n if (params.hasStart() &&\r\n params.hasEnd() &&\r\n params.hasLimit() &&\r\n !params.hasAnchoredLimit()) {\r\n throw new Error(\"Query: Can't combine startAt(), endAt(), and limit(). Use limitToFirst() or limitToLast() instead.\");\r\n }\r\n };\r\n /**\r\n * Validates that no other order by call has been made\r\n * @param {!string} fnName\r\n * @private\r\n */\r\n Query.prototype.validateNoPreviousOrderByCall_ = function (fnName) {\r\n if (this.orderByCalled_ === true) {\r\n throw new Error(fnName + \": You can't combine multiple orderBy calls.\");\r\n }\r\n };\r\n /**\r\n * @return {!QueryParams}\r\n */\r\n Query.prototype.getQueryParams = function () {\r\n return this.queryParams_;\r\n };\r\n /**\r\n * @return {!Reference}\r\n */\r\n Query.prototype.getRef = function () {\r\n validateArgCount('Query.ref', 0, 0, arguments.length);\r\n // This is a slight hack. We cannot goog.require('fb.api.Firebase'), since Firebase requires fb.api.Query.\r\n // However, we will always export 'Firebase' to the global namespace, so it's guaranteed to exist by the time this\r\n // method gets called.\r\n return new Query.__referenceConstructor(this.repo, this.path);\r\n };\r\n /**\r\n * @param {!string} eventType\r\n * @param {!function(DataSnapshot, string=)} callback\r\n * @param {(function(Error)|Object)=} cancelCallbackOrContext\r\n * @param {Object=} context\r\n * @return {!function(DataSnapshot, string=)}\r\n */\r\n Query.prototype.on = function (eventType, callback, cancelCallbackOrContext, context) {\r\n validateArgCount('Query.on', 2, 4, arguments.length);\r\n validateEventType('Query.on', 1, eventType, false);\r\n validateCallback('Query.on', 2, callback, false);\r\n var ret = Query.getCancelAndContextArgs_('Query.on', cancelCallbackOrContext, context);\r\n if (eventType === 'value') {\r\n this.onValueEvent(callback, ret.cancel, ret.context);\r\n }\r\n else {\r\n var callbacks = {};\r\n callbacks[eventType] = callback;\r\n this.onChildEvent(callbacks, ret.cancel, ret.context);\r\n }\r\n return callback;\r\n };\r\n /**\r\n * @param {!function(!DataSnapshot)} callback\r\n * @param {?function(Error)} cancelCallback\r\n * @param {?Object} context\r\n * @protected\r\n */\r\n Query.prototype.onValueEvent = function (callback, cancelCallback, context) {\r\n var container = new ValueEventRegistration(callback, cancelCallback || null, context || null);\r\n this.repo.addEventCallbackForQuery(this, container);\r\n };\r\n /**\r\n * @param {!Object.} callbacks\r\n * @param {?function(Error)} cancelCallback\r\n * @param {?Object} context\r\n * @protected\r\n */\r\n Query.prototype.onChildEvent = function (callbacks, cancelCallback, context) {\r\n var container = new ChildEventRegistration(callbacks, cancelCallback, context);\r\n this.repo.addEventCallbackForQuery(this, container);\r\n };\r\n /**\r\n * @param {string=} eventType\r\n * @param {(function(!DataSnapshot, ?string=))=} callback\r\n * @param {Object=} context\r\n */\r\n Query.prototype.off = function (eventType, callback, context) {\r\n validateArgCount('Query.off', 0, 3, arguments.length);\r\n validateEventType('Query.off', 1, eventType, true);\r\n validateCallback('Query.off', 2, callback, true);\r\n validateContextObject('Query.off', 3, context, true);\r\n var container = null;\r\n var callbacks = null;\r\n if (eventType === 'value') {\r\n var valueCallback = callback || null;\r\n container = new ValueEventRegistration(valueCallback, null, context || null);\r\n }\r\n else if (eventType) {\r\n if (callback) {\r\n callbacks = {};\r\n callbacks[eventType] = callback;\r\n }\r\n container = new ChildEventRegistration(callbacks, null, context || null);\r\n }\r\n this.repo.removeEventCallbackForQuery(this, container);\r\n };\r\n /**\r\n * Attaches a listener, waits for the first event, and then removes the listener\r\n * @param {!string} eventType\r\n * @param {!function(!DataSnapshot, string=)} userCallback\r\n * @param cancelOrContext\r\n * @param context\r\n * @return {!firebase.Promise}\r\n */\r\n Query.prototype.once = function (eventType, userCallback, cancelOrContext, context) {\r\n var _this = this;\r\n validateArgCount('Query.once', 1, 4, arguments.length);\r\n validateEventType('Query.once', 1, eventType, false);\r\n validateCallback('Query.once', 2, userCallback, true);\r\n var ret = Query.getCancelAndContextArgs_('Query.once', cancelOrContext, context);\r\n // TODO: Implement this more efficiently (in particular, use 'get' wire protocol for 'value' event)\r\n // TODO: consider actually wiring the callbacks into the promise. We cannot do this without a breaking change\r\n // because the API currently expects callbacks will be called synchronously if the data is cached, but this is\r\n // against the Promise specification.\r\n var firstCall = true;\r\n var deferred = new Deferred();\r\n // A dummy error handler in case a user wasn't expecting promises\r\n deferred.promise.catch(function () { });\r\n var onceCallback = function (snapshot) {\r\n // NOTE: Even though we unsubscribe, we may get called multiple times if a single action (e.g. set() with JSON)\r\n // triggers multiple events (e.g. child_added or child_changed).\r\n if (firstCall) {\r\n firstCall = false;\r\n _this.off(eventType, onceCallback);\r\n if (userCallback) {\r\n userCallback.bind(ret.context)(snapshot);\r\n }\r\n deferred.resolve(snapshot);\r\n }\r\n };\r\n this.on(eventType, onceCallback, \r\n /*cancel=*/ function (err) {\r\n _this.off(eventType, onceCallback);\r\n if (ret.cancel)\r\n ret.cancel.bind(ret.context)(err);\r\n deferred.reject(err);\r\n });\r\n return deferred.promise;\r\n };\r\n /**\r\n * Set a limit and anchor it to the start of the window.\r\n * @param {!number} limit\r\n * @return {!Query}\r\n */\r\n Query.prototype.limitToFirst = function (limit) {\r\n validateArgCount('Query.limitToFirst', 1, 1, arguments.length);\r\n if (typeof limit !== 'number' ||\r\n Math.floor(limit) !== limit ||\r\n limit <= 0) {\r\n throw new Error('Query.limitToFirst: First argument must be a positive integer.');\r\n }\r\n if (this.queryParams_.hasLimit()) {\r\n throw new Error('Query.limitToFirst: Limit was already set (by another call to limit, ' +\r\n 'limitToFirst, or limitToLast).');\r\n }\r\n return new Query(this.repo, this.path, this.queryParams_.limitToFirst(limit), this.orderByCalled_);\r\n };\r\n /**\r\n * Set a limit and anchor it to the end of the window.\r\n * @param {!number} limit\r\n * @return {!Query}\r\n */\r\n Query.prototype.limitToLast = function (limit) {\r\n validateArgCount('Query.limitToLast', 1, 1, arguments.length);\r\n if (typeof limit !== 'number' ||\r\n Math.floor(limit) !== limit ||\r\n limit <= 0) {\r\n throw new Error('Query.limitToLast: First argument must be a positive integer.');\r\n }\r\n if (this.queryParams_.hasLimit()) {\r\n throw new Error('Query.limitToLast: Limit was already set (by another call to limit, ' +\r\n 'limitToFirst, or limitToLast).');\r\n }\r\n return new Query(this.repo, this.path, this.queryParams_.limitToLast(limit), this.orderByCalled_);\r\n };\r\n /**\r\n * Given a child path, return a new query ordered by the specified grandchild path.\r\n * @param {!string} path\r\n * @return {!Query}\r\n */\r\n Query.prototype.orderByChild = function (path) {\r\n validateArgCount('Query.orderByChild', 1, 1, arguments.length);\r\n if (path === '$key') {\r\n throw new Error('Query.orderByChild: \"$key\" is invalid. Use Query.orderByKey() instead.');\r\n }\r\n else if (path === '$priority') {\r\n throw new Error('Query.orderByChild: \"$priority\" is invalid. Use Query.orderByPriority() instead.');\r\n }\r\n else if (path === '$value') {\r\n throw new Error('Query.orderByChild: \"$value\" is invalid. Use Query.orderByValue() instead.');\r\n }\r\n validatePathString('Query.orderByChild', 1, path, false);\r\n this.validateNoPreviousOrderByCall_('Query.orderByChild');\r\n var parsedPath = new Path(path);\r\n if (parsedPath.isEmpty()) {\r\n throw new Error('Query.orderByChild: cannot pass in empty path. Use Query.orderByValue() instead.');\r\n }\r\n var index = new PathIndex(parsedPath);\r\n var newParams = this.queryParams_.orderBy(index);\r\n Query.validateQueryEndpoints_(newParams);\r\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\r\n };\r\n /**\r\n * Return a new query ordered by the KeyIndex\r\n * @return {!Query}\r\n */\r\n Query.prototype.orderByKey = function () {\r\n validateArgCount('Query.orderByKey', 0, 0, arguments.length);\r\n this.validateNoPreviousOrderByCall_('Query.orderByKey');\r\n var newParams = this.queryParams_.orderBy(KEY_INDEX);\r\n Query.validateQueryEndpoints_(newParams);\r\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\r\n };\r\n /**\r\n * Return a new query ordered by the PriorityIndex\r\n * @return {!Query}\r\n */\r\n Query.prototype.orderByPriority = function () {\r\n validateArgCount('Query.orderByPriority', 0, 0, arguments.length);\r\n this.validateNoPreviousOrderByCall_('Query.orderByPriority');\r\n var newParams = this.queryParams_.orderBy(PRIORITY_INDEX);\r\n Query.validateQueryEndpoints_(newParams);\r\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\r\n };\r\n /**\r\n * Return a new query ordered by the ValueIndex\r\n * @return {!Query}\r\n */\r\n Query.prototype.orderByValue = function () {\r\n validateArgCount('Query.orderByValue', 0, 0, arguments.length);\r\n this.validateNoPreviousOrderByCall_('Query.orderByValue');\r\n var newParams = this.queryParams_.orderBy(VALUE_INDEX);\r\n Query.validateQueryEndpoints_(newParams);\r\n return new Query(this.repo, this.path, newParams, /*orderByCalled=*/ true);\r\n };\r\n /**\r\n * @param {number|string|boolean|null} value\r\n * @param {?string=} name\r\n * @return {!Query}\r\n */\r\n Query.prototype.startAt = function (value, name) {\r\n if (value === void 0) { value = null; }\r\n validateArgCount('Query.startAt', 0, 2, arguments.length);\r\n validateFirebaseDataArg('Query.startAt', 1, value, this.path, true);\r\n validateKey('Query.startAt', 2, name, true);\r\n var newParams = this.queryParams_.startAt(value, name);\r\n Query.validateLimit_(newParams);\r\n Query.validateQueryEndpoints_(newParams);\r\n if (this.queryParams_.hasStart()) {\r\n throw new Error('Query.startAt: Starting point was already set (by another call to startAt ' +\r\n 'or equalTo).');\r\n }\r\n // Calling with no params tells us to start at the beginning.\r\n if (value === undefined) {\r\n value = null;\r\n name = null;\r\n }\r\n return new Query(this.repo, this.path, newParams, this.orderByCalled_);\r\n };\r\n /**\r\n * @param {number|string|boolean|null} value\r\n * @param {?string=} name\r\n * @return {!Query}\r\n */\r\n Query.prototype.endAt = function (value, name) {\r\n if (value === void 0) { value = null; }\r\n validateArgCount('Query.endAt', 0, 2, arguments.length);\r\n validateFirebaseDataArg('Query.endAt', 1, value, this.path, true);\r\n validateKey('Query.endAt', 2, name, true);\r\n var newParams = this.queryParams_.endAt(value, name);\r\n Query.validateLimit_(newParams);\r\n Query.validateQueryEndpoints_(newParams);\r\n if (this.queryParams_.hasEnd()) {\r\n throw new Error('Query.endAt: Ending point was already set (by another call to endAt or ' +\r\n 'equalTo).');\r\n }\r\n return new Query(this.repo, this.path, newParams, this.orderByCalled_);\r\n };\r\n /**\r\n * Load the selection of children with exactly the specified value, and, optionally,\r\n * the specified name.\r\n * @param {number|string|boolean|null} value\r\n * @param {string=} name\r\n * @return {!Query}\r\n */\r\n Query.prototype.equalTo = function (value, name) {\r\n validateArgCount('Query.equalTo', 1, 2, arguments.length);\r\n validateFirebaseDataArg('Query.equalTo', 1, value, this.path, false);\r\n validateKey('Query.equalTo', 2, name, true);\r\n if (this.queryParams_.hasStart()) {\r\n throw new Error('Query.equalTo: Starting point was already set (by another call to startAt or ' +\r\n 'equalTo).');\r\n }\r\n if (this.queryParams_.hasEnd()) {\r\n throw new Error('Query.equalTo: Ending point was already set (by another call to endAt or ' +\r\n 'equalTo).');\r\n }\r\n return this.startAt(value, name).endAt(value, name);\r\n };\r\n /**\r\n * @return {!string} URL for this location.\r\n */\r\n Query.prototype.toString = function () {\r\n validateArgCount('Query.toString', 0, 0, arguments.length);\r\n return this.repo.toString() + this.path.toUrlEncodedString();\r\n };\r\n // Do not create public documentation. This is intended to make JSON serialization work but is otherwise unnecessary\r\n // for end-users.\r\n Query.prototype.toJSON = function () {\r\n // An optional spacer argument is unnecessary for a string.\r\n validateArgCount('Query.toJSON', 0, 1, arguments.length);\r\n return this.toString();\r\n };\r\n /**\r\n * An object representation of the query parameters used by this Query.\r\n * @return {!Object}\r\n */\r\n Query.prototype.queryObject = function () {\r\n return this.queryParams_.getQueryObject();\r\n };\r\n /**\r\n * @return {!string}\r\n */\r\n Query.prototype.queryIdentifier = function () {\r\n var obj = this.queryObject();\r\n var id = ObjectToUniqueKey(obj);\r\n return id === '{}' ? 'default' : id;\r\n };\r\n /**\r\n * Return true if this query and the provided query are equivalent; otherwise, return false.\r\n * @param {Query} other\r\n * @return {boolean}\r\n */\r\n Query.prototype.isEqual = function (other) {\r\n validateArgCount('Query.isEqual', 1, 1, arguments.length);\r\n if (!(other instanceof Query)) {\r\n var error$$1 = 'Query.isEqual failed: First argument must be an instance of firebase.database.Query.';\r\n throw new Error(error$$1);\r\n }\r\n var sameRepo = this.repo === other.repo;\r\n var samePath = this.path.equals(other.path);\r\n var sameQueryIdentifier = this.queryIdentifier() === other.queryIdentifier();\r\n return sameRepo && samePath && sameQueryIdentifier;\r\n };\r\n /**\r\n * Helper used by .on and .once to extract the context and or cancel arguments.\r\n * @param {!string} fnName The function name (on or once)\r\n * @param {(function(Error)|Object)=} cancelOrContext\r\n * @param {Object=} context\r\n * @return {{cancel: ?function(Error), context: ?Object}}\r\n * @private\r\n */\r\n Query.getCancelAndContextArgs_ = function (fnName, cancelOrContext, context) {\r\n var ret = { cancel: null, context: null };\r\n if (cancelOrContext && context) {\r\n ret.cancel = cancelOrContext;\r\n validateCallback(fnName, 3, ret.cancel, true);\r\n ret.context = context;\r\n validateContextObject(fnName, 4, ret.context, true);\r\n }\r\n else if (cancelOrContext) {\r\n // we have either a cancel callback or a context.\r\n if (typeof cancelOrContext === 'object' && cancelOrContext !== null) {\r\n // it's a context!\r\n ret.context = cancelOrContext;\r\n }\r\n else if (typeof cancelOrContext === 'function') {\r\n ret.cancel = cancelOrContext;\r\n }\r\n else {\r\n throw new Error(errorPrefix(fnName, 3, true) +\r\n ' must either be a cancel callback or a context object.');\r\n }\r\n }\r\n return ret;\r\n };\r\n Object.defineProperty(Query.prototype, \"ref\", {\r\n get: function () {\r\n return this.getRef();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Query;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Implements a set with a count of elements.\r\n *\r\n * @template K, V\r\n */\r\nvar CountedSet = /** @class */ (function () {\r\n function CountedSet() {\r\n this.set = {};\r\n }\r\n /**\r\n * @param {!K} item\r\n * @param {V} val\r\n */\r\n CountedSet.prototype.add = function (item, val) {\r\n this.set[item] = val !== null ? val : true;\r\n };\r\n /**\r\n * @param {!K} key\r\n * @return {boolean}\r\n */\r\n CountedSet.prototype.contains = function (key) {\r\n return contains(this.set, key);\r\n };\r\n /**\r\n * @param {!K} item\r\n * @return {V}\r\n */\r\n CountedSet.prototype.get = function (item) {\r\n return this.contains(item) ? this.set[item] : undefined;\r\n };\r\n /**\r\n * @param {!K} item\r\n */\r\n CountedSet.prototype.remove = function (item) {\r\n delete this.set[item];\r\n };\r\n /**\r\n * Deletes everything in the set\r\n */\r\n CountedSet.prototype.clear = function () {\r\n this.set = {};\r\n };\r\n /**\r\n * True if there's nothing in the set\r\n * @return {boolean}\r\n */\r\n CountedSet.prototype.isEmpty = function () {\r\n return isEmpty(this.set);\r\n };\r\n /**\r\n * @return {number} The number of items in the set\r\n */\r\n CountedSet.prototype.count = function () {\r\n return getCount(this.set);\r\n };\r\n /**\r\n * Run a function on each k,v pair in the set\r\n * @param {function(K, V)} fn\r\n */\r\n CountedSet.prototype.each = function (fn) {\r\n forEach(this.set, function (k, v) { return fn(k, v); });\r\n };\r\n /**\r\n * Mostly for debugging\r\n * @return {Array.} The keys present in this CountedSet\r\n */\r\n CountedSet.prototype.keys = function () {\r\n var keys = [];\r\n forEach(this.set, function (k) {\r\n keys.push(k);\r\n });\r\n return keys;\r\n };\r\n return CountedSet;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Helper class to store a sparse set of snapshots.\r\n *\r\n * @constructor\r\n */\r\nvar SparseSnapshotTree = /** @class */ (function () {\r\n function SparseSnapshotTree() {\r\n /**\r\n * @private\r\n * @type {Node}\r\n */\r\n this.value_ = null;\r\n /**\r\n * @private\r\n * @type {CountedSet}\r\n */\r\n this.children_ = null;\r\n }\r\n /**\r\n * Gets the node stored at the given path if one exists.\r\n *\r\n * @param {!Path} path Path to look up snapshot for.\r\n * @return {?Node} The retrieved node, or null.\r\n */\r\n SparseSnapshotTree.prototype.find = function (path) {\r\n if (this.value_ != null) {\r\n return this.value_.getChild(path);\r\n }\r\n else if (!path.isEmpty() && this.children_ != null) {\r\n var childKey = path.getFront();\r\n path = path.popFront();\r\n if (this.children_.contains(childKey)) {\r\n var childTree = this.children_.get(childKey);\r\n return childTree.find(path);\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * Stores the given node at the specified path. If there is already a node\r\n * at a shallower path, it merges the new data into that snapshot node.\r\n *\r\n * @param {!Path} path Path to look up snapshot for.\r\n * @param {!Node} data The new data, or null.\r\n */\r\n SparseSnapshotTree.prototype.remember = function (path, data) {\r\n if (path.isEmpty()) {\r\n this.value_ = data;\r\n this.children_ = null;\r\n }\r\n else if (this.value_ !== null) {\r\n this.value_ = this.value_.updateChild(path, data);\r\n }\r\n else {\r\n if (this.children_ == null) {\r\n this.children_ = new CountedSet();\r\n }\r\n var childKey = path.getFront();\r\n if (!this.children_.contains(childKey)) {\r\n this.children_.add(childKey, new SparseSnapshotTree());\r\n }\r\n var child = this.children_.get(childKey);\r\n path = path.popFront();\r\n child.remember(path, data);\r\n }\r\n };\r\n /**\r\n * Purge the data at path from the cache.\r\n *\r\n * @param {!Path} path Path to look up snapshot for.\r\n * @return {boolean} True if this node should now be removed.\r\n */\r\n SparseSnapshotTree.prototype.forget = function (path) {\r\n if (path.isEmpty()) {\r\n this.value_ = null;\r\n this.children_ = null;\r\n return true;\r\n }\r\n else {\r\n if (this.value_ !== null) {\r\n if (this.value_.isLeafNode()) {\r\n // We're trying to forget a node that doesn't exist\r\n return false;\r\n }\r\n else {\r\n var value = this.value_;\r\n this.value_ = null;\r\n var self_1 = this;\r\n value.forEachChild(PRIORITY_INDEX, function (key, tree) {\r\n self_1.remember(new Path(key), tree);\r\n });\r\n return this.forget(path);\r\n }\r\n }\r\n else if (this.children_ !== null) {\r\n var childKey = path.getFront();\r\n path = path.popFront();\r\n if (this.children_.contains(childKey)) {\r\n var safeToRemove = this.children_.get(childKey).forget(path);\r\n if (safeToRemove) {\r\n this.children_.remove(childKey);\r\n }\r\n }\r\n if (this.children_.isEmpty()) {\r\n this.children_ = null;\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n };\r\n /**\r\n * Recursively iterates through all of the stored tree and calls the\r\n * callback on each one.\r\n *\r\n * @param {!Path} prefixPath Path to look up node for.\r\n * @param {!Function} func The function to invoke for each tree.\r\n */\r\n SparseSnapshotTree.prototype.forEachTree = function (prefixPath, func) {\r\n if (this.value_ !== null) {\r\n func(prefixPath, this.value_);\r\n }\r\n else {\r\n this.forEachChild(function (key, tree) {\r\n var path = new Path(prefixPath.toString() + '/' + key);\r\n tree.forEachTree(path, func);\r\n });\r\n }\r\n };\r\n /**\r\n * Iterates through each immediate child and triggers the callback.\r\n *\r\n * @param {!Function} func The function to invoke for each child.\r\n */\r\n SparseSnapshotTree.prototype.forEachChild = function (func) {\r\n if (this.children_ !== null) {\r\n this.children_.each(function (key, tree) {\r\n func(key, tree);\r\n });\r\n }\r\n };\r\n return SparseSnapshotTree;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Generate placeholders for deferred values.\r\n * @param {?Object} values\r\n * @return {!Object}\r\n */\r\nvar generateWithValues = function (values) {\r\n values = values || {};\r\n values['timestamp'] = values['timestamp'] || new Date().getTime();\r\n return values;\r\n};\r\n/**\r\n * Value to use when firing local events. When writing server values, fire\r\n * local events with an approximate value, otherwise return value as-is.\r\n * @param {(Object|string|number|boolean)} value\r\n * @param {!Object} serverValues\r\n * @return {!(string|number|boolean)}\r\n */\r\nvar resolveDeferredValue = function (value, serverValues) {\r\n if (!value || typeof value !== 'object') {\r\n return value;\r\n }\r\n else {\r\n assert('.sv' in value, 'Unexpected leaf node or priority contents');\r\n return serverValues[value['.sv']];\r\n }\r\n};\r\n/**\r\n * Recursively replace all deferred values and priorities in the tree with the\r\n * specified generated replacement values.\r\n * @param {!SparseSnapshotTree} tree\r\n * @param {!Object} serverValues\r\n * @return {!SparseSnapshotTree}\r\n */\r\nvar resolveDeferredValueTree = function (tree, serverValues) {\r\n var resolvedTree = new SparseSnapshotTree();\r\n tree.forEachTree(new Path(''), function (path, node) {\r\n resolvedTree.remember(path, resolveDeferredValueSnapshot(node, serverValues));\r\n });\r\n return resolvedTree;\r\n};\r\n/**\r\n * Recursively replace all deferred values and priorities in the node with the\r\n * specified generated replacement values. If there are no server values in the node,\r\n * it'll be returned as-is.\r\n * @param {!Node} node\r\n * @param {!Object} serverValues\r\n * @return {!Node}\r\n */\r\nvar resolveDeferredValueSnapshot = function (node, serverValues) {\r\n var rawPri = node.getPriority().val();\r\n var priority = resolveDeferredValue(rawPri, serverValues);\r\n var newNode;\r\n if (node.isLeafNode()) {\r\n var leafNode = node;\r\n var value = resolveDeferredValue(leafNode.getValue(), serverValues);\r\n if (value !== leafNode.getValue() ||\r\n priority !== leafNode.getPriority().val()) {\r\n return new LeafNode(value, nodeFromJSON$1(priority));\r\n }\r\n else {\r\n return node;\r\n }\r\n }\r\n else {\r\n var childrenNode = node;\r\n newNode = childrenNode;\r\n if (priority !== childrenNode.getPriority().val()) {\r\n newNode = newNode.updatePriority(new LeafNode(priority));\r\n }\r\n childrenNode.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n var newChildNode = resolveDeferredValueSnapshot(childNode, serverValues);\r\n if (newChildNode !== childNode) {\r\n newNode = newNode.updateImmediateChild(childName, newChildNode);\r\n }\r\n });\r\n return newNode;\r\n }\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n *\r\n * @enum\r\n */\r\nvar OperationType;\r\n(function (OperationType) {\r\n OperationType[OperationType[\"OVERWRITE\"] = 0] = \"OVERWRITE\";\r\n OperationType[OperationType[\"MERGE\"] = 1] = \"MERGE\";\r\n OperationType[OperationType[\"ACK_USER_WRITE\"] = 2] = \"ACK_USER_WRITE\";\r\n OperationType[OperationType[\"LISTEN_COMPLETE\"] = 3] = \"LISTEN_COMPLETE\";\r\n})(OperationType || (OperationType = {}));\r\n/**\r\n * @param {boolean} fromUser\r\n * @param {boolean} fromServer\r\n * @param {?string} queryId\r\n * @param {boolean} tagged\r\n * @constructor\r\n */\r\nvar OperationSource = /** @class */ (function () {\r\n function OperationSource(fromUser, fromServer, queryId, tagged) {\r\n this.fromUser = fromUser;\r\n this.fromServer = fromServer;\r\n this.queryId = queryId;\r\n this.tagged = tagged;\r\n assert(!tagged || fromServer, 'Tagged queries must be from server.');\r\n }\r\n /**\r\n * @const\r\n * @type {!OperationSource}\r\n */\r\n OperationSource.User = new OperationSource(\r\n /*fromUser=*/ true, false, null, \r\n /*tagged=*/ false);\r\n /**\r\n * @const\r\n * @type {!OperationSource}\r\n */\r\n OperationSource.Server = new OperationSource(false, \r\n /*fromServer=*/ true, null, \r\n /*tagged=*/ false);\r\n /**\r\n * @param {string} queryId\r\n * @return {!OperationSource}\r\n */\r\n OperationSource.forServerTaggedQuery = function (queryId) {\r\n return new OperationSource(false, \r\n /*fromServer=*/ true, queryId, \r\n /*tagged=*/ true);\r\n };\r\n return OperationSource;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar AckUserWrite = /** @class */ (function () {\r\n /**\r\n *\r\n * @param {!Path} path\r\n * @param {!ImmutableTree} affectedTree A tree containing true for each affected path. Affected paths can't overlap.\r\n * @param {!boolean} revert\r\n */\r\n function AckUserWrite(\r\n /**@inheritDoc */ path, \r\n /**@inheritDoc */ affectedTree, \r\n /**@inheritDoc */ revert) {\r\n this.path = path;\r\n this.affectedTree = affectedTree;\r\n this.revert = revert;\r\n /** @inheritDoc */\r\n this.type = OperationType.ACK_USER_WRITE;\r\n /** @inheritDoc */\r\n this.source = OperationSource.User;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n AckUserWrite.prototype.operationForChild = function (childName) {\r\n if (!this.path.isEmpty()) {\r\n assert(this.path.getFront() === childName, 'operationForChild called for unrelated child.');\r\n return new AckUserWrite(this.path.popFront(), this.affectedTree, this.revert);\r\n }\r\n else if (this.affectedTree.value != null) {\r\n assert(this.affectedTree.children.isEmpty(), 'affectedTree should not have overlapping affected paths.');\r\n // All child locations are affected as well; just return same operation.\r\n return this;\r\n }\r\n else {\r\n var childTree = this.affectedTree.subtree(new Path(childName));\r\n return new AckUserWrite(Path.Empty, childTree, this.revert);\r\n }\r\n };\r\n return AckUserWrite;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar emptyChildrenSingleton;\r\n/**\r\n * Singleton empty children collection.\r\n *\r\n * @const\r\n * @type {!SortedMap.>}\r\n */\r\nvar EmptyChildren = function () {\r\n if (!emptyChildrenSingleton) {\r\n emptyChildrenSingleton = new SortedMap(stringCompare);\r\n }\r\n return emptyChildrenSingleton;\r\n};\r\n/**\r\n * A tree with immutable elements.\r\n */\r\nvar ImmutableTree = /** @class */ (function () {\r\n /**\r\n * @template T\r\n * @param {?T} value\r\n * @param {SortedMap.>=} children\r\n */\r\n function ImmutableTree(value, children) {\r\n if (children === void 0) { children = EmptyChildren(); }\r\n this.value = value;\r\n this.children = children;\r\n }\r\n /**\r\n * @template T\r\n * @param {!Object.} obj\r\n * @return {!ImmutableTree.}\r\n */\r\n ImmutableTree.fromObject = function (obj) {\r\n var tree = ImmutableTree.Empty;\r\n forEach(obj, function (childPath, childSnap) {\r\n tree = tree.set(new Path(childPath), childSnap);\r\n });\r\n return tree;\r\n };\r\n /**\r\n * True if the value is empty and there are no children\r\n * @return {boolean}\r\n */\r\n ImmutableTree.prototype.isEmpty = function () {\r\n return this.value === null && this.children.isEmpty();\r\n };\r\n /**\r\n * Given a path and predicate, return the first node and the path to that node\r\n * where the predicate returns true.\r\n *\r\n * TODO Do a perf test -- If we're creating a bunch of {path: value:} objects\r\n * on the way back out, it may be better to pass down a pathSoFar obj.\r\n *\r\n * @param {!Path} relativePath The remainder of the path\r\n * @param {function(T):boolean} predicate The predicate to satisfy to return a\r\n * node\r\n * @return {?{path:!Path, value:!T}}\r\n */\r\n ImmutableTree.prototype.findRootMostMatchingPathAndValue = function (relativePath, predicate) {\r\n if (this.value != null && predicate(this.value)) {\r\n return { path: Path.Empty, value: this.value };\r\n }\r\n else {\r\n if (relativePath.isEmpty()) {\r\n return null;\r\n }\r\n else {\r\n var front = relativePath.getFront();\r\n var child = this.children.get(front);\r\n if (child !== null) {\r\n var childExistingPathAndValue = child.findRootMostMatchingPathAndValue(relativePath.popFront(), predicate);\r\n if (childExistingPathAndValue != null) {\r\n var fullPath = new Path(front).child(childExistingPathAndValue.path);\r\n return { path: fullPath, value: childExistingPathAndValue.value };\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n * Find, if it exists, the shortest subpath of the given path that points a defined\r\n * value in the tree\r\n * @param {!Path} relativePath\r\n * @return {?{path: !Path, value: !T}}\r\n */\r\n ImmutableTree.prototype.findRootMostValueAndPath = function (relativePath) {\r\n return this.findRootMostMatchingPathAndValue(relativePath, function () { return true; });\r\n };\r\n /**\r\n * @param {!Path} relativePath\r\n * @return {!ImmutableTree.} The subtree at the given path\r\n */\r\n ImmutableTree.prototype.subtree = function (relativePath) {\r\n if (relativePath.isEmpty()) {\r\n return this;\r\n }\r\n else {\r\n var front = relativePath.getFront();\r\n var childTree = this.children.get(front);\r\n if (childTree !== null) {\r\n return childTree.subtree(relativePath.popFront());\r\n }\r\n else {\r\n return ImmutableTree.Empty;\r\n }\r\n }\r\n };\r\n /**\r\n * Sets a value at the specified path.\r\n *\r\n * @param {!Path} relativePath Path to set value at.\r\n * @param {?T} toSet Value to set.\r\n * @return {!ImmutableTree.} Resulting tree.\r\n */\r\n ImmutableTree.prototype.set = function (relativePath, toSet) {\r\n if (relativePath.isEmpty()) {\r\n return new ImmutableTree(toSet, this.children);\r\n }\r\n else {\r\n var front = relativePath.getFront();\r\n var child = this.children.get(front) || ImmutableTree.Empty;\r\n var newChild = child.set(relativePath.popFront(), toSet);\r\n var newChildren = this.children.insert(front, newChild);\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n };\r\n /**\r\n * Removes the value at the specified path.\r\n *\r\n * @param {!Path} relativePath Path to value to remove.\r\n * @return {!ImmutableTree.} Resulting tree.\r\n */\r\n ImmutableTree.prototype.remove = function (relativePath) {\r\n if (relativePath.isEmpty()) {\r\n if (this.children.isEmpty()) {\r\n return ImmutableTree.Empty;\r\n }\r\n else {\r\n return new ImmutableTree(null, this.children);\r\n }\r\n }\r\n else {\r\n var front = relativePath.getFront();\r\n var child = this.children.get(front);\r\n if (child) {\r\n var newChild = child.remove(relativePath.popFront());\r\n var newChildren = void 0;\r\n if (newChild.isEmpty()) {\r\n newChildren = this.children.remove(front);\r\n }\r\n else {\r\n newChildren = this.children.insert(front, newChild);\r\n }\r\n if (this.value === null && newChildren.isEmpty()) {\r\n return ImmutableTree.Empty;\r\n }\r\n else {\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n }\r\n else {\r\n return this;\r\n }\r\n }\r\n };\r\n /**\r\n * Gets a value from the tree.\r\n *\r\n * @param {!Path} relativePath Path to get value for.\r\n * @return {?T} Value at path, or null.\r\n */\r\n ImmutableTree.prototype.get = function (relativePath) {\r\n if (relativePath.isEmpty()) {\r\n return this.value;\r\n }\r\n else {\r\n var front = relativePath.getFront();\r\n var child = this.children.get(front);\r\n if (child) {\r\n return child.get(relativePath.popFront());\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n };\r\n /**\r\n * Replace the subtree at the specified path with the given new tree.\r\n *\r\n * @param {!Path} relativePath Path to replace subtree for.\r\n * @param {!ImmutableTree} newTree New tree.\r\n * @return {!ImmutableTree} Resulting tree.\r\n */\r\n ImmutableTree.prototype.setTree = function (relativePath, newTree) {\r\n if (relativePath.isEmpty()) {\r\n return newTree;\r\n }\r\n else {\r\n var front = relativePath.getFront();\r\n var child = this.children.get(front) || ImmutableTree.Empty;\r\n var newChild = child.setTree(relativePath.popFront(), newTree);\r\n var newChildren = void 0;\r\n if (newChild.isEmpty()) {\r\n newChildren = this.children.remove(front);\r\n }\r\n else {\r\n newChildren = this.children.insert(front, newChild);\r\n }\r\n return new ImmutableTree(this.value, newChildren);\r\n }\r\n };\r\n /**\r\n * Performs a depth first fold on this tree. Transforms a tree into a single\r\n * value, given a function that operates on the path to a node, an optional\r\n * current value, and a map of child names to folded subtrees\r\n * @template V\r\n * @param {function(Path, ?T, Object.):V} fn\r\n * @return {V}\r\n */\r\n ImmutableTree.prototype.fold = function (fn) {\r\n return this.fold_(Path.Empty, fn);\r\n };\r\n /**\r\n * Recursive helper for public-facing fold() method\r\n * @template V\r\n * @param {!Path} pathSoFar\r\n * @param {function(Path, ?T, Object.):V} fn\r\n * @return {V}\r\n * @private\r\n */\r\n ImmutableTree.prototype.fold_ = function (pathSoFar, fn) {\r\n var accum = {};\r\n this.children.inorderTraversal(function (childKey, childTree) {\r\n accum[childKey] = childTree.fold_(pathSoFar.child(childKey), fn);\r\n });\r\n return fn(pathSoFar, this.value, accum);\r\n };\r\n /**\r\n * Find the first matching value on the given path. Return the result of applying f to it.\r\n * @template V\r\n * @param {!Path} path\r\n * @param {!function(!Path, !T):?V} f\r\n * @return {?V}\r\n */\r\n ImmutableTree.prototype.findOnPath = function (path, f) {\r\n return this.findOnPath_(path, Path.Empty, f);\r\n };\r\n ImmutableTree.prototype.findOnPath_ = function (pathToFollow, pathSoFar, f) {\r\n var result = this.value ? f(pathSoFar, this.value) : false;\r\n if (result) {\r\n return result;\r\n }\r\n else {\r\n if (pathToFollow.isEmpty()) {\r\n return null;\r\n }\r\n else {\r\n var front = pathToFollow.getFront();\r\n var nextChild = this.children.get(front);\r\n if (nextChild) {\r\n return nextChild.findOnPath_(pathToFollow.popFront(), pathSoFar.child(front), f);\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n *\r\n * @param {!Path} path\r\n * @param {!function(!Path, !T)} f\r\n * @returns {!ImmutableTree.}\r\n */\r\n ImmutableTree.prototype.foreachOnPath = function (path, f) {\r\n return this.foreachOnPath_(path, Path.Empty, f);\r\n };\r\n ImmutableTree.prototype.foreachOnPath_ = function (pathToFollow, currentRelativePath, f) {\r\n if (pathToFollow.isEmpty()) {\r\n return this;\r\n }\r\n else {\r\n if (this.value) {\r\n f(currentRelativePath, this.value);\r\n }\r\n var front = pathToFollow.getFront();\r\n var nextChild = this.children.get(front);\r\n if (nextChild) {\r\n return nextChild.foreachOnPath_(pathToFollow.popFront(), currentRelativePath.child(front), f);\r\n }\r\n else {\r\n return ImmutableTree.Empty;\r\n }\r\n }\r\n };\r\n /**\r\n * Calls the given function for each node in the tree that has a value.\r\n *\r\n * @param {function(!Path, !T)} f A function to be called with\r\n * the path from the root of the tree to a node, and the value at that node.\r\n * Called in depth-first order.\r\n */\r\n ImmutableTree.prototype.foreach = function (f) {\r\n this.foreach_(Path.Empty, f);\r\n };\r\n ImmutableTree.prototype.foreach_ = function (currentRelativePath, f) {\r\n this.children.inorderTraversal(function (childName, childTree) {\r\n childTree.foreach_(currentRelativePath.child(childName), f);\r\n });\r\n if (this.value) {\r\n f(currentRelativePath, this.value);\r\n }\r\n };\r\n /**\r\n *\r\n * @param {function(string, !T)} f\r\n */\r\n ImmutableTree.prototype.foreachChild = function (f) {\r\n this.children.inorderTraversal(function (childName, childTree) {\r\n if (childTree.value) {\r\n f(childName, childTree.value);\r\n }\r\n });\r\n };\r\n ImmutableTree.Empty = new ImmutableTree(null);\r\n return ImmutableTree;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param {!OperationSource} source\r\n * @param {!Path} path\r\n * @constructor\r\n * @implements {Operation}\r\n */\r\nvar ListenComplete = /** @class */ (function () {\r\n function ListenComplete(source, path) {\r\n this.source = source;\r\n this.path = path;\r\n /** @inheritDoc */\r\n this.type = OperationType.LISTEN_COMPLETE;\r\n }\r\n ListenComplete.prototype.operationForChild = function (childName) {\r\n if (this.path.isEmpty()) {\r\n return new ListenComplete(this.source, Path.Empty);\r\n }\r\n else {\r\n return new ListenComplete(this.source, this.path.popFront());\r\n }\r\n };\r\n return ListenComplete;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param {!OperationSource} source\r\n * @param {!Path} path\r\n * @param {!Node} snap\r\n * @constructor\r\n * @implements {Operation}\r\n */\r\nvar Overwrite = /** @class */ (function () {\r\n function Overwrite(source, path, snap) {\r\n this.source = source;\r\n this.path = path;\r\n this.snap = snap;\r\n /** @inheritDoc */\r\n this.type = OperationType.OVERWRITE;\r\n }\r\n Overwrite.prototype.operationForChild = function (childName) {\r\n if (this.path.isEmpty()) {\r\n return new Overwrite(this.source, Path.Empty, this.snap.getImmediateChild(childName));\r\n }\r\n else {\r\n return new Overwrite(this.source, this.path.popFront(), this.snap);\r\n }\r\n };\r\n return Overwrite;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param {!OperationSource} source\r\n * @param {!Path} path\r\n * @param {!ImmutableTree.} children\r\n * @constructor\r\n * @implements {Operation}\r\n */\r\nvar Merge = /** @class */ (function () {\r\n function Merge(\r\n /**@inheritDoc */ source, \r\n /**@inheritDoc */ path, \r\n /**@inheritDoc */ children) {\r\n this.source = source;\r\n this.path = path;\r\n this.children = children;\r\n /** @inheritDoc */\r\n this.type = OperationType.MERGE;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n Merge.prototype.operationForChild = function (childName) {\r\n if (this.path.isEmpty()) {\r\n var childTree = this.children.subtree(new Path(childName));\r\n if (childTree.isEmpty()) {\r\n // This child is unaffected\r\n return null;\r\n }\r\n else if (childTree.value) {\r\n // We have a snapshot for the child in question. This becomes an overwrite of the child.\r\n return new Overwrite(this.source, Path.Empty, childTree.value);\r\n }\r\n else {\r\n // This is a merge at a deeper level\r\n return new Merge(this.source, Path.Empty, childTree);\r\n }\r\n }\r\n else {\r\n assert(this.path.getFront() === childName, \"Can't get a merge for a child not on the path of the operation\");\r\n return new Merge(this.source, this.path.popFront(), this.children);\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n Merge.prototype.toString = function () {\r\n return ('Operation(' +\r\n this.path +\r\n ': ' +\r\n this.source.toString() +\r\n ' merge: ' +\r\n this.children.toString() +\r\n ')');\r\n };\r\n return Merge;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A cache node only stores complete children. Additionally it holds a flag whether the node can be considered fully\r\n * initialized in the sense that we know at one point in time this represented a valid state of the world, e.g.\r\n * initialized with data from the server, or a complete overwrite by the client. The filtered flag also tracks\r\n * whether a node potentially had children removed due to a filter.\r\n */\r\nvar CacheNode = /** @class */ (function () {\r\n /**\r\n * @param {!Node} node_\r\n * @param {boolean} fullyInitialized_\r\n * @param {boolean} filtered_\r\n */\r\n function CacheNode(node_, fullyInitialized_, filtered_) {\r\n this.node_ = node_;\r\n this.fullyInitialized_ = fullyInitialized_;\r\n this.filtered_ = filtered_;\r\n }\r\n /**\r\n * Returns whether this node was fully initialized with either server data or a complete overwrite by the client\r\n * @return {boolean}\r\n */\r\n CacheNode.prototype.isFullyInitialized = function () {\r\n return this.fullyInitialized_;\r\n };\r\n /**\r\n * Returns whether this node is potentially missing children due to a filter applied to the node\r\n * @return {boolean}\r\n */\r\n CacheNode.prototype.isFiltered = function () {\r\n return this.filtered_;\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @return {boolean}\r\n */\r\n CacheNode.prototype.isCompleteForPath = function (path) {\r\n if (path.isEmpty()) {\r\n return this.isFullyInitialized() && !this.filtered_;\r\n }\r\n var childKey = path.getFront();\r\n return this.isCompleteForChild(childKey);\r\n };\r\n /**\r\n * @param {!string} key\r\n * @return {boolean}\r\n */\r\n CacheNode.prototype.isCompleteForChild = function (key) {\r\n return ((this.isFullyInitialized() && !this.filtered_) || this.node_.hasChild(key));\r\n };\r\n /**\r\n * @return {!Node}\r\n */\r\n CacheNode.prototype.getNode = function () {\r\n return this.node_;\r\n };\r\n return CacheNode;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Stores the data we have cached for a view.\r\n *\r\n * serverSnap is the cached server data, eventSnap is the cached event data (server data plus any local writes).\r\n *\r\n * @constructor\r\n */\r\nvar ViewCache = /** @class */ (function () {\r\n /**\r\n *\r\n * @param {!CacheNode} eventCache_\r\n * @param {!CacheNode} serverCache_\r\n */\r\n function ViewCache(eventCache_, serverCache_) {\r\n this.eventCache_ = eventCache_;\r\n this.serverCache_ = serverCache_;\r\n }\r\n /**\r\n * @param {!Node} eventSnap\r\n * @param {boolean} complete\r\n * @param {boolean} filtered\r\n * @return {!ViewCache}\r\n */\r\n ViewCache.prototype.updateEventSnap = function (eventSnap, complete, filtered) {\r\n return new ViewCache(new CacheNode(eventSnap, complete, filtered), this.serverCache_);\r\n };\r\n /**\r\n * @param {!Node} serverSnap\r\n * @param {boolean} complete\r\n * @param {boolean} filtered\r\n * @return {!ViewCache}\r\n */\r\n ViewCache.prototype.updateServerSnap = function (serverSnap, complete, filtered) {\r\n return new ViewCache(this.eventCache_, new CacheNode(serverSnap, complete, filtered));\r\n };\r\n /**\r\n * @return {!CacheNode}\r\n */\r\n ViewCache.prototype.getEventCache = function () {\r\n return this.eventCache_;\r\n };\r\n /**\r\n * @return {?Node}\r\n */\r\n ViewCache.prototype.getCompleteEventSnap = function () {\r\n return this.eventCache_.isFullyInitialized()\r\n ? this.eventCache_.getNode()\r\n : null;\r\n };\r\n /**\r\n * @return {!CacheNode}\r\n */\r\n ViewCache.prototype.getServerCache = function () {\r\n return this.serverCache_;\r\n };\r\n /**\r\n * @return {?Node}\r\n */\r\n ViewCache.prototype.getCompleteServerSnap = function () {\r\n return this.serverCache_.isFullyInitialized()\r\n ? this.serverCache_.getNode()\r\n : null;\r\n };\r\n /**\r\n * @const\r\n * @type {ViewCache}\r\n */\r\n ViewCache.Empty = new ViewCache(new CacheNode(ChildrenNode.EMPTY_NODE, \r\n /*fullyInitialized=*/ false, \r\n /*filtered=*/ false), new CacheNode(ChildrenNode.EMPTY_NODE, \r\n /*fullyInitialized=*/ false, \r\n /*filtered=*/ false));\r\n return ViewCache;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @constructor\r\n * @struct\r\n * @param {!string} type The event type\r\n * @param {!Node} snapshotNode The data\r\n * @param {string=} childName The name for this child, if it's a child event\r\n * @param {Node=} oldSnap Used for intermediate processing of child changed events\r\n * @param {string=} prevName The name for the previous child, if applicable\r\n */\r\nvar Change = /** @class */ (function () {\r\n function Change(type, snapshotNode, childName, oldSnap, prevName) {\r\n this.type = type;\r\n this.snapshotNode = snapshotNode;\r\n this.childName = childName;\r\n this.oldSnap = oldSnap;\r\n this.prevName = prevName;\r\n }\r\n /**\r\n * @param {!Node} snapshot\r\n * @return {!Change}\r\n */\r\n Change.valueChange = function (snapshot) {\r\n return new Change(Change.VALUE, snapshot);\r\n };\r\n /**\r\n * @param {string} childKey\r\n * @param {!Node} snapshot\r\n * @return {!Change}\r\n */\r\n Change.childAddedChange = function (childKey, snapshot) {\r\n return new Change(Change.CHILD_ADDED, snapshot, childKey);\r\n };\r\n /**\r\n * @param {string} childKey\r\n * @param {!Node} snapshot\r\n * @return {!Change}\r\n */\r\n Change.childRemovedChange = function (childKey, snapshot) {\r\n return new Change(Change.CHILD_REMOVED, snapshot, childKey);\r\n };\r\n /**\r\n * @param {string} childKey\r\n * @param {!Node} newSnapshot\r\n * @param {!Node} oldSnapshot\r\n * @return {!Change}\r\n */\r\n Change.childChangedChange = function (childKey, newSnapshot, oldSnapshot) {\r\n return new Change(Change.CHILD_CHANGED, newSnapshot, childKey, oldSnapshot);\r\n };\r\n /**\r\n * @param {string} childKey\r\n * @param {!Node} snapshot\r\n * @return {!Change}\r\n */\r\n Change.childMovedChange = function (childKey, snapshot) {\r\n return new Change(Change.CHILD_MOVED, snapshot, childKey);\r\n };\r\n //event types\r\n /** Event type for a child added */\r\n Change.CHILD_ADDED = 'child_added';\r\n /** Event type for a child removed */\r\n Change.CHILD_REMOVED = 'child_removed';\r\n /** Event type for a child changed */\r\n Change.CHILD_CHANGED = 'child_changed';\r\n /** Event type for a child moved */\r\n Change.CHILD_MOVED = 'child_moved';\r\n /** Event type for a value change */\r\n Change.VALUE = 'value';\r\n return Change;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Doesn't really filter nodes but applies an index to the node and keeps track of any changes\r\n *\r\n * @constructor\r\n * @implements {NodeFilter}\r\n * @param {!Index} index\r\n */\r\nvar IndexedFilter = /** @class */ (function () {\r\n function IndexedFilter(index_) {\r\n this.index_ = index_;\r\n }\r\n IndexedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n assert(snap.isIndexed(this.index_), 'A node must be indexed if only a child is updated');\r\n var oldChild = snap.getImmediateChild(key);\r\n // Check if anything actually changed.\r\n if (oldChild.getChild(affectedPath).equals(newChild.getChild(affectedPath))) {\r\n // There's an edge case where a child can enter or leave the view because affectedPath was set to null.\r\n // In this case, affectedPath will appear null in both the old and new snapshots. So we need\r\n // to avoid treating these cases as \"nothing changed.\"\r\n if (oldChild.isEmpty() == newChild.isEmpty()) {\r\n // Nothing changed.\r\n // This assert should be valid, but it's expensive (can dominate perf testing) so don't actually do it.\r\n //assert(oldChild.equals(newChild), 'Old and new snapshots should be equal.');\r\n return snap;\r\n }\r\n }\r\n if (optChangeAccumulator != null) {\r\n if (newChild.isEmpty()) {\r\n if (snap.hasChild(key)) {\r\n optChangeAccumulator.trackChildChange(Change.childRemovedChange(key, oldChild));\r\n }\r\n else {\r\n assert(snap.isLeafNode(), 'A child remove without an old child only makes sense on a leaf node');\r\n }\r\n }\r\n else if (oldChild.isEmpty()) {\r\n optChangeAccumulator.trackChildChange(Change.childAddedChange(key, newChild));\r\n }\r\n else {\r\n optChangeAccumulator.trackChildChange(Change.childChangedChange(key, newChild, oldChild));\r\n }\r\n }\r\n if (snap.isLeafNode() && newChild.isEmpty()) {\r\n return snap;\r\n }\r\n else {\r\n // Make sure the node is indexed\r\n return snap.updateImmediateChild(key, newChild).withIndex(this.index_);\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n IndexedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n if (optChangeAccumulator != null) {\r\n if (!oldSnap.isLeafNode()) {\r\n oldSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (!newSnap.hasChild(key)) {\r\n optChangeAccumulator.trackChildChange(Change.childRemovedChange(key, childNode));\r\n }\r\n });\r\n }\r\n if (!newSnap.isLeafNode()) {\r\n newSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (oldSnap.hasChild(key)) {\r\n var oldChild = oldSnap.getImmediateChild(key);\r\n if (!oldChild.equals(childNode)) {\r\n optChangeAccumulator.trackChildChange(Change.childChangedChange(key, childNode, oldChild));\r\n }\r\n }\r\n else {\r\n optChangeAccumulator.trackChildChange(Change.childAddedChange(key, childNode));\r\n }\r\n });\r\n }\r\n }\r\n return newSnap.withIndex(this.index_);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n IndexedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n if (oldSnap.isEmpty()) {\r\n return ChildrenNode.EMPTY_NODE;\r\n }\r\n else {\r\n return oldSnap.updatePriority(newPriority);\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n IndexedFilter.prototype.filtersNodes = function () {\r\n return false;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n IndexedFilter.prototype.getIndexedFilter = function () {\r\n return this;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n IndexedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n return IndexedFilter;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @constructor\r\n */\r\nvar ChildChangeAccumulator = /** @class */ (function () {\r\n function ChildChangeAccumulator() {\r\n this.changeMap_ = {};\r\n }\r\n /**\r\n * @param {!Change} change\r\n */\r\n ChildChangeAccumulator.prototype.trackChildChange = function (change) {\r\n var type = change.type;\r\n var childKey /** @type {!string} */ = change.childName;\r\n assert(type == Change.CHILD_ADDED ||\r\n type == Change.CHILD_CHANGED ||\r\n type == Change.CHILD_REMOVED, 'Only child changes supported for tracking');\r\n assert(childKey !== '.priority', 'Only non-priority child changes can be tracked.');\r\n var oldChange = safeGet(this.changeMap_, childKey);\r\n if (oldChange) {\r\n var oldType = oldChange.type;\r\n if (type == Change.CHILD_ADDED && oldType == Change.CHILD_REMOVED) {\r\n this.changeMap_[childKey] = Change.childChangedChange(childKey, change.snapshotNode, oldChange.snapshotNode);\r\n }\r\n else if (type == Change.CHILD_REMOVED &&\r\n oldType == Change.CHILD_ADDED) {\r\n delete this.changeMap_[childKey];\r\n }\r\n else if (type == Change.CHILD_REMOVED &&\r\n oldType == Change.CHILD_CHANGED) {\r\n this.changeMap_[childKey] = Change.childRemovedChange(childKey, oldChange.oldSnap);\r\n }\r\n else if (type == Change.CHILD_CHANGED &&\r\n oldType == Change.CHILD_ADDED) {\r\n this.changeMap_[childKey] = Change.childAddedChange(childKey, change.snapshotNode);\r\n }\r\n else if (type == Change.CHILD_CHANGED &&\r\n oldType == Change.CHILD_CHANGED) {\r\n this.changeMap_[childKey] = Change.childChangedChange(childKey, change.snapshotNode, oldChange.oldSnap);\r\n }\r\n else {\r\n throw assertionError('Illegal combination of changes: ' +\r\n change +\r\n ' occurred after ' +\r\n oldChange);\r\n }\r\n }\r\n else {\r\n this.changeMap_[childKey] = change;\r\n }\r\n };\r\n /**\r\n * @return {!Array.}\r\n */\r\n ChildChangeAccumulator.prototype.getChanges = function () {\r\n return getValues(this.changeMap_);\r\n };\r\n return ChildChangeAccumulator;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An implementation of CompleteChildSource that never returns any additional children\r\n *\r\n * @private\r\n * @constructor\r\n * @implements CompleteChildSource\r\n */\r\nvar NoCompleteChildSource_ = /** @class */ (function () {\r\n function NoCompleteChildSource_() {\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n NoCompleteChildSource_.prototype.getCompleteChild = function (childKey) {\r\n return null;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n NoCompleteChildSource_.prototype.getChildAfterChild = function (index, child, reverse) {\r\n return null;\r\n };\r\n return NoCompleteChildSource_;\r\n}());\r\n/**\r\n * Singleton instance.\r\n * @const\r\n * @type {!CompleteChildSource}\r\n */\r\nvar NO_COMPLETE_CHILD_SOURCE = new NoCompleteChildSource_();\r\n/**\r\n * An implementation of CompleteChildSource that uses a WriteTree in addition to any other server data or\r\n * old event caches available to calculate complete children.\r\n *\r\n *\r\n * @implements CompleteChildSource\r\n */\r\nvar WriteTreeCompleteChildSource = /** @class */ (function () {\r\n /**\r\n * @param {!WriteTreeRef} writes_\r\n * @param {!ViewCache} viewCache_\r\n * @param {?Node} optCompleteServerCache_\r\n */\r\n function WriteTreeCompleteChildSource(writes_, viewCache_, optCompleteServerCache_) {\r\n if (optCompleteServerCache_ === void 0) { optCompleteServerCache_ = null; }\r\n this.writes_ = writes_;\r\n this.viewCache_ = viewCache_;\r\n this.optCompleteServerCache_ = optCompleteServerCache_;\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n WriteTreeCompleteChildSource.prototype.getCompleteChild = function (childKey) {\r\n var node = this.viewCache_.getEventCache();\r\n if (node.isCompleteForChild(childKey)) {\r\n return node.getNode().getImmediateChild(childKey);\r\n }\r\n else {\r\n var serverNode = this.optCompleteServerCache_ != null\r\n ? new CacheNode(this.optCompleteServerCache_, true, false)\r\n : this.viewCache_.getServerCache();\r\n return this.writes_.calcCompleteChild(childKey, serverNode);\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n WriteTreeCompleteChildSource.prototype.getChildAfterChild = function (index, child, reverse) {\r\n var completeServerData = this.optCompleteServerCache_ != null\r\n ? this.optCompleteServerCache_\r\n : this.viewCache_.getCompleteServerSnap();\r\n var nodes = this.writes_.calcIndexedSlice(completeServerData, child, 1, reverse, index);\r\n if (nodes.length === 0) {\r\n return null;\r\n }\r\n else {\r\n return nodes[0];\r\n }\r\n };\r\n return WriteTreeCompleteChildSource;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @constructor\r\n * @struct\r\n */\r\nvar ProcessorResult = /** @class */ (function () {\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {!Array.} changes\r\n */\r\n function ProcessorResult(viewCache, changes) {\r\n this.viewCache = viewCache;\r\n this.changes = changes;\r\n }\r\n return ProcessorResult;\r\n}());\r\n/**\r\n * @constructor\r\n */\r\nvar ViewProcessor = /** @class */ (function () {\r\n /**\r\n * @param {!NodeFilter} filter_\r\n */\r\n function ViewProcessor(filter_) {\r\n this.filter_ = filter_;\r\n }\r\n /**\r\n * @param {!ViewCache} viewCache\r\n */\r\n ViewProcessor.prototype.assertIndexed = function (viewCache) {\r\n assert(viewCache\r\n .getEventCache()\r\n .getNode()\r\n .isIndexed(this.filter_.getIndex()), 'Event snap not indexed');\r\n assert(viewCache\r\n .getServerCache()\r\n .getNode()\r\n .isIndexed(this.filter_.getIndex()), 'Server snap not indexed');\r\n };\r\n /**\r\n * @param {!ViewCache} oldViewCache\r\n * @param {!Operation} operation\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} completeCache\r\n * @return {!ProcessorResult}\r\n */\r\n ViewProcessor.prototype.applyOperation = function (oldViewCache, operation, writesCache, completeCache) {\r\n var accumulator = new ChildChangeAccumulator();\r\n var newViewCache, filterServerNode;\r\n if (operation.type === OperationType.OVERWRITE) {\r\n var overwrite = operation;\r\n if (overwrite.source.fromUser) {\r\n newViewCache = this.applyUserOverwrite_(oldViewCache, overwrite.path, overwrite.snap, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n assert(overwrite.source.fromServer, 'Unknown source.');\r\n // We filter the node if it's a tagged update or the node has been previously filtered and the\r\n // update is not at the root in which case it is ok (and necessary) to mark the node unfiltered\r\n // again\r\n filterServerNode =\r\n overwrite.source.tagged ||\r\n (oldViewCache.getServerCache().isFiltered() &&\r\n !overwrite.path.isEmpty());\r\n newViewCache = this.applyServerOverwrite_(oldViewCache, overwrite.path, overwrite.snap, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.MERGE) {\r\n var merge = operation;\r\n if (merge.source.fromUser) {\r\n newViewCache = this.applyUserMerge_(oldViewCache, merge.path, merge.children, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n assert(merge.source.fromServer, 'Unknown source.');\r\n // We filter the node if it's a tagged update or the node has been previously filtered\r\n filterServerNode =\r\n merge.source.tagged || oldViewCache.getServerCache().isFiltered();\r\n newViewCache = this.applyServerMerge_(oldViewCache, merge.path, merge.children, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.ACK_USER_WRITE) {\r\n var ackUserWrite = operation;\r\n if (!ackUserWrite.revert) {\r\n newViewCache = this.ackUserWrite_(oldViewCache, ackUserWrite.path, ackUserWrite.affectedTree, writesCache, completeCache, accumulator);\r\n }\r\n else {\r\n newViewCache = this.revertUserWrite_(oldViewCache, ackUserWrite.path, writesCache, completeCache, accumulator);\r\n }\r\n }\r\n else if (operation.type === OperationType.LISTEN_COMPLETE) {\r\n newViewCache = this.listenComplete_(oldViewCache, operation.path, writesCache, accumulator);\r\n }\r\n else {\r\n throw assertionError('Unknown operation type: ' + operation.type);\r\n }\r\n var changes = accumulator.getChanges();\r\n ViewProcessor.maybeAddValueEvent_(oldViewCache, newViewCache, changes);\r\n return new ProcessorResult(newViewCache, changes);\r\n };\r\n /**\r\n * @param {!ViewCache} oldViewCache\r\n * @param {!ViewCache} newViewCache\r\n * @param {!Array.} accumulator\r\n * @private\r\n */\r\n ViewProcessor.maybeAddValueEvent_ = function (oldViewCache, newViewCache, accumulator) {\r\n var eventSnap = newViewCache.getEventCache();\r\n if (eventSnap.isFullyInitialized()) {\r\n var isLeafOrEmpty = eventSnap.getNode().isLeafNode() || eventSnap.getNode().isEmpty();\r\n var oldCompleteSnap = oldViewCache.getCompleteEventSnap();\r\n if (accumulator.length > 0 ||\r\n !oldViewCache.getEventCache().isFullyInitialized() ||\r\n (isLeafOrEmpty &&\r\n !eventSnap\r\n .getNode()\r\n .equals(/** @type {!Node} */ (oldCompleteSnap))) ||\r\n !eventSnap\r\n .getNode()\r\n .getPriority()\r\n .equals(oldCompleteSnap.getPriority())) {\r\n accumulator.push(Change.valueChange(\r\n /** @type {!Node} */ newViewCache.getCompleteEventSnap()));\r\n }\r\n }\r\n };\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {!Path} changePath\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {!CompleteChildSource} source\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.generateEventCacheAfterServerEvent_ = function (viewCache, changePath, writesCache, source, accumulator) {\r\n var oldEventSnap = viewCache.getEventCache();\r\n if (writesCache.shadowingWrite(changePath) != null) {\r\n // we have a shadowing write, ignore changes\r\n return viewCache;\r\n }\r\n else {\r\n var newEventCache = void 0, serverNode = void 0;\r\n if (changePath.isEmpty()) {\r\n // TODO: figure out how this plays with \"sliding ack windows\"\r\n assert(viewCache.getServerCache().isFullyInitialized(), 'If change path is empty, we must have complete server data');\r\n if (viewCache.getServerCache().isFiltered()) {\r\n // We need to special case this, because we need to only apply writes to complete children, or\r\n // we might end up raising events for incomplete children. If the server data is filtered deep\r\n // writes cannot be guaranteed to be complete\r\n var serverCache = viewCache.getCompleteServerSnap();\r\n var completeChildren = serverCache instanceof ChildrenNode\r\n ? serverCache\r\n : ChildrenNode.EMPTY_NODE;\r\n var completeEventChildren = writesCache.calcCompleteEventChildren(completeChildren);\r\n newEventCache = this.filter_.updateFullNode(viewCache.getEventCache().getNode(), completeEventChildren, accumulator);\r\n }\r\n else {\r\n var completeNode = writesCache.calcCompleteEventCache(viewCache.getCompleteServerSnap());\r\n newEventCache = this.filter_.updateFullNode(viewCache.getEventCache().getNode(), completeNode, accumulator);\r\n }\r\n }\r\n else {\r\n var childKey = changePath.getFront();\r\n if (childKey == '.priority') {\r\n assert(changePath.getLength() == 1, \"Can't have a priority with additional path components\");\r\n var oldEventNode = oldEventSnap.getNode();\r\n serverNode = viewCache.getServerCache().getNode();\r\n // we might have overwrites for this priority\r\n var updatedPriority = writesCache.calcEventCacheAfterServerOverwrite(changePath, oldEventNode, serverNode);\r\n if (updatedPriority != null) {\r\n newEventCache = this.filter_.updatePriority(oldEventNode, updatedPriority);\r\n }\r\n else {\r\n // priority didn't change, keep old node\r\n newEventCache = oldEventSnap.getNode();\r\n }\r\n }\r\n else {\r\n var childChangePath = changePath.popFront();\r\n // update child\r\n var newEventChild = void 0;\r\n if (oldEventSnap.isCompleteForChild(childKey)) {\r\n serverNode = viewCache.getServerCache().getNode();\r\n var eventChildUpdate = writesCache.calcEventCacheAfterServerOverwrite(changePath, oldEventSnap.getNode(), serverNode);\r\n if (eventChildUpdate != null) {\r\n newEventChild = oldEventSnap\r\n .getNode()\r\n .getImmediateChild(childKey)\r\n .updateChild(childChangePath, eventChildUpdate);\r\n }\r\n else {\r\n // Nothing changed, just keep the old child\r\n newEventChild = oldEventSnap\r\n .getNode()\r\n .getImmediateChild(childKey);\r\n }\r\n }\r\n else {\r\n newEventChild = writesCache.calcCompleteChild(childKey, viewCache.getServerCache());\r\n }\r\n if (newEventChild != null) {\r\n newEventCache = this.filter_.updateChild(oldEventSnap.getNode(), childKey, newEventChild, childChangePath, source, accumulator);\r\n }\r\n else {\r\n // no complete child available or no change\r\n newEventCache = oldEventSnap.getNode();\r\n }\r\n }\r\n }\r\n return viewCache.updateEventSnap(newEventCache, oldEventSnap.isFullyInitialized() || changePath.isEmpty(), this.filter_.filtersNodes());\r\n }\r\n };\r\n /**\r\n * @param {!ViewCache} oldViewCache\r\n * @param {!Path} changePath\r\n * @param {!Node} changedSnap\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} completeCache\r\n * @param {boolean} filterServerNode\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.applyServerOverwrite_ = function (oldViewCache, changePath, changedSnap, writesCache, completeCache, filterServerNode, accumulator) {\r\n var oldServerSnap = oldViewCache.getServerCache();\r\n var newServerCache;\r\n var serverFilter = filterServerNode\r\n ? this.filter_\r\n : this.filter_.getIndexedFilter();\r\n if (changePath.isEmpty()) {\r\n newServerCache = serverFilter.updateFullNode(oldServerSnap.getNode(), changedSnap, null);\r\n }\r\n else if (serverFilter.filtersNodes() && !oldServerSnap.isFiltered()) {\r\n // we want to filter the server node, but we didn't filter the server node yet, so simulate a full update\r\n var newServerNode = oldServerSnap\r\n .getNode()\r\n .updateChild(changePath, changedSnap);\r\n newServerCache = serverFilter.updateFullNode(oldServerSnap.getNode(), newServerNode, null);\r\n }\r\n else {\r\n var childKey = changePath.getFront();\r\n if (!oldServerSnap.isCompleteForPath(changePath) &&\r\n changePath.getLength() > 1) {\r\n // We don't update incomplete nodes with updates intended for other listeners\r\n return oldViewCache;\r\n }\r\n var childChangePath = changePath.popFront();\r\n var childNode = oldServerSnap.getNode().getImmediateChild(childKey);\r\n var newChildNode = childNode.updateChild(childChangePath, changedSnap);\r\n if (childKey == '.priority') {\r\n newServerCache = serverFilter.updatePriority(oldServerSnap.getNode(), newChildNode);\r\n }\r\n else {\r\n newServerCache = serverFilter.updateChild(oldServerSnap.getNode(), childKey, newChildNode, childChangePath, NO_COMPLETE_CHILD_SOURCE, null);\r\n }\r\n }\r\n var newViewCache = oldViewCache.updateServerSnap(newServerCache, oldServerSnap.isFullyInitialized() || changePath.isEmpty(), serverFilter.filtersNodes());\r\n var source = new WriteTreeCompleteChildSource(writesCache, newViewCache, completeCache);\r\n return this.generateEventCacheAfterServerEvent_(newViewCache, changePath, writesCache, source, accumulator);\r\n };\r\n /**\r\n * @param {!ViewCache} oldViewCache\r\n * @param {!Path} changePath\r\n * @param {!Node} changedSnap\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} completeCache\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.applyUserOverwrite_ = function (oldViewCache, changePath, changedSnap, writesCache, completeCache, accumulator) {\r\n var oldEventSnap = oldViewCache.getEventCache();\r\n var newViewCache, newEventCache;\r\n var source = new WriteTreeCompleteChildSource(writesCache, oldViewCache, completeCache);\r\n if (changePath.isEmpty()) {\r\n newEventCache = this.filter_.updateFullNode(oldViewCache.getEventCache().getNode(), changedSnap, accumulator);\r\n newViewCache = oldViewCache.updateEventSnap(newEventCache, true, this.filter_.filtersNodes());\r\n }\r\n else {\r\n var childKey = changePath.getFront();\r\n if (childKey === '.priority') {\r\n newEventCache = this.filter_.updatePriority(oldViewCache.getEventCache().getNode(), changedSnap);\r\n newViewCache = oldViewCache.updateEventSnap(newEventCache, oldEventSnap.isFullyInitialized(), oldEventSnap.isFiltered());\r\n }\r\n else {\r\n var childChangePath = changePath.popFront();\r\n var oldChild = oldEventSnap.getNode().getImmediateChild(childKey);\r\n var newChild = void 0;\r\n if (childChangePath.isEmpty()) {\r\n // Child overwrite, we can replace the child\r\n newChild = changedSnap;\r\n }\r\n else {\r\n var childNode = source.getCompleteChild(childKey);\r\n if (childNode != null) {\r\n if (childChangePath.getBack() === '.priority' &&\r\n childNode.getChild(childChangePath.parent()).isEmpty()) {\r\n // This is a priority update on an empty node. If this node exists on the server, the\r\n // server will send down the priority in the update, so ignore for now\r\n newChild = childNode;\r\n }\r\n else {\r\n newChild = childNode.updateChild(childChangePath, changedSnap);\r\n }\r\n }\r\n else {\r\n // There is no complete child node available\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n }\r\n if (!oldChild.equals(newChild)) {\r\n var newEventSnap = this.filter_.updateChild(oldEventSnap.getNode(), childKey, newChild, childChangePath, source, accumulator);\r\n newViewCache = oldViewCache.updateEventSnap(newEventSnap, oldEventSnap.isFullyInitialized(), this.filter_.filtersNodes());\r\n }\r\n else {\r\n newViewCache = oldViewCache;\r\n }\r\n }\r\n }\r\n return newViewCache;\r\n };\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {string} childKey\r\n * @return {boolean}\r\n * @private\r\n */\r\n ViewProcessor.cacheHasChild_ = function (viewCache, childKey) {\r\n return viewCache.getEventCache().isCompleteForChild(childKey);\r\n };\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {!Path} path\r\n * @param {ImmutableTree.} changedChildren\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} serverCache\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.applyUserMerge_ = function (viewCache, path, changedChildren, writesCache, serverCache, accumulator) {\r\n var _this = this;\r\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\r\n // window leaving room for new items. It's important we process these changes first, so we\r\n // iterate the changes twice, first processing any that affect items currently in view.\r\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\r\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\r\n // not the other.\r\n var curViewCache = viewCache;\r\n changedChildren.foreach(function (relativePath, childNode) {\r\n var writePath = path.child(relativePath);\r\n if (ViewProcessor.cacheHasChild_(viewCache, writePath.getFront())) {\r\n curViewCache = _this.applyUserOverwrite_(curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n }\r\n });\r\n changedChildren.foreach(function (relativePath, childNode) {\r\n var writePath = path.child(relativePath);\r\n if (!ViewProcessor.cacheHasChild_(viewCache, writePath.getFront())) {\r\n curViewCache = _this.applyUserOverwrite_(curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n }\r\n });\r\n return curViewCache;\r\n };\r\n /**\r\n * @param {!Node} node\r\n * @param {ImmutableTree.} merge\r\n * @return {!Node}\r\n * @private\r\n */\r\n ViewProcessor.prototype.applyMerge_ = function (node, merge) {\r\n merge.foreach(function (relativePath, childNode) {\r\n node = node.updateChild(relativePath, childNode);\r\n });\r\n return node;\r\n };\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {!Path} path\r\n * @param {!ImmutableTree.} changedChildren\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} serverCache\r\n * @param {boolean} filterServerNode\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.applyServerMerge_ = function (viewCache, path, changedChildren, writesCache, serverCache, filterServerNode, accumulator) {\r\n var _this = this;\r\n // If we don't have a cache yet, this merge was intended for a previously listen in the same location. Ignore it and\r\n // wait for the complete data update coming soon.\r\n if (viewCache\r\n .getServerCache()\r\n .getNode()\r\n .isEmpty() &&\r\n !viewCache.getServerCache().isFullyInitialized()) {\r\n return viewCache;\r\n }\r\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\r\n // window leaving room for new items. It's important we process these changes first, so we\r\n // iterate the changes twice, first processing any that affect items currently in view.\r\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\r\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\r\n // not the other.\r\n var curViewCache = viewCache;\r\n var viewMergeTree;\r\n if (path.isEmpty()) {\r\n viewMergeTree = changedChildren;\r\n }\r\n else {\r\n viewMergeTree = ImmutableTree.Empty.setTree(path, changedChildren);\r\n }\r\n var serverNode = viewCache.getServerCache().getNode();\r\n viewMergeTree.children.inorderTraversal(function (childKey, childTree) {\r\n if (serverNode.hasChild(childKey)) {\r\n var serverChild = viewCache\r\n .getServerCache()\r\n .getNode()\r\n .getImmediateChild(childKey);\r\n var newChild = _this.applyMerge_(serverChild, childTree);\r\n curViewCache = _this.applyServerOverwrite_(curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n }\r\n });\r\n viewMergeTree.children.inorderTraversal(function (childKey, childMergeTree) {\r\n var isUnknownDeepMerge = !viewCache.getServerCache().isCompleteForChild(childKey) &&\r\n childMergeTree.value == null;\r\n if (!serverNode.hasChild(childKey) && !isUnknownDeepMerge) {\r\n var serverChild = viewCache\r\n .getServerCache()\r\n .getNode()\r\n .getImmediateChild(childKey);\r\n var newChild = _this.applyMerge_(serverChild, childMergeTree);\r\n curViewCache = _this.applyServerOverwrite_(curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n }\r\n });\r\n return curViewCache;\r\n };\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {!Path} ackPath\r\n * @param {!ImmutableTree} affectedTree\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} completeCache\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.ackUserWrite_ = function (viewCache, ackPath, affectedTree, writesCache, completeCache, accumulator) {\r\n if (writesCache.shadowingWrite(ackPath) != null) {\r\n return viewCache;\r\n }\r\n // Only filter server node if it is currently filtered\r\n var filterServerNode = viewCache.getServerCache().isFiltered();\r\n // Essentially we'll just get our existing server cache for the affected paths and re-apply it as a server update\r\n // now that it won't be shadowed.\r\n var serverCache = viewCache.getServerCache();\r\n if (affectedTree.value != null) {\r\n // This is an overwrite.\r\n if ((ackPath.isEmpty() && serverCache.isFullyInitialized()) ||\r\n serverCache.isCompleteForPath(ackPath)) {\r\n return this.applyServerOverwrite_(viewCache, ackPath, serverCache.getNode().getChild(ackPath), writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n else if (ackPath.isEmpty()) {\r\n // This is a goofy edge case where we are acking data at this location but don't have full data. We\r\n // should just re-apply whatever we have in our cache as a merge.\r\n var changedChildren_1 = ImmutableTree.Empty;\r\n serverCache.getNode().forEachChild(KEY_INDEX, function (name, node) {\r\n changedChildren_1 = changedChildren_1.set(new Path(name), node);\r\n });\r\n return this.applyServerMerge_(viewCache, ackPath, changedChildren_1, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n else {\r\n return viewCache;\r\n }\r\n }\r\n else {\r\n // This is a merge.\r\n var changedChildren_2 = ImmutableTree.Empty;\r\n affectedTree.foreach(function (mergePath, value) {\r\n var serverCachePath = ackPath.child(mergePath);\r\n if (serverCache.isCompleteForPath(serverCachePath)) {\r\n changedChildren_2 = changedChildren_2.set(mergePath, serverCache.getNode().getChild(serverCachePath));\r\n }\r\n });\r\n return this.applyServerMerge_(viewCache, ackPath, changedChildren_2, writesCache, completeCache, filterServerNode, accumulator);\r\n }\r\n };\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {!Path} path\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.listenComplete_ = function (viewCache, path, writesCache, accumulator) {\r\n var oldServerNode = viewCache.getServerCache();\r\n var newViewCache = viewCache.updateServerSnap(oldServerNode.getNode(), oldServerNode.isFullyInitialized() || path.isEmpty(), oldServerNode.isFiltered());\r\n return this.generateEventCacheAfterServerEvent_(newViewCache, path, writesCache, NO_COMPLETE_CHILD_SOURCE, accumulator);\r\n };\r\n /**\r\n * @param {!ViewCache} viewCache\r\n * @param {!Path} path\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} completeServerCache\r\n * @param {!ChildChangeAccumulator} accumulator\r\n * @return {!ViewCache}\r\n * @private\r\n */\r\n ViewProcessor.prototype.revertUserWrite_ = function (viewCache, path, writesCache, completeServerCache, accumulator) {\r\n var complete;\r\n if (writesCache.shadowingWrite(path) != null) {\r\n return viewCache;\r\n }\r\n else {\r\n var source = new WriteTreeCompleteChildSource(writesCache, viewCache, completeServerCache);\r\n var oldEventCache = viewCache.getEventCache().getNode();\r\n var newEventCache = void 0;\r\n if (path.isEmpty() || path.getFront() === '.priority') {\r\n var newNode = void 0;\r\n if (viewCache.getServerCache().isFullyInitialized()) {\r\n newNode = writesCache.calcCompleteEventCache(viewCache.getCompleteServerSnap());\r\n }\r\n else {\r\n var serverChildren = viewCache.getServerCache().getNode();\r\n assert(serverChildren instanceof ChildrenNode, 'serverChildren would be complete if leaf node');\r\n newNode = writesCache.calcCompleteEventChildren(serverChildren);\r\n }\r\n newNode = newNode;\r\n newEventCache = this.filter_.updateFullNode(oldEventCache, newNode, accumulator);\r\n }\r\n else {\r\n var childKey = path.getFront();\r\n var newChild = writesCache.calcCompleteChild(childKey, viewCache.getServerCache());\r\n if (newChild == null &&\r\n viewCache.getServerCache().isCompleteForChild(childKey)) {\r\n newChild = oldEventCache.getImmediateChild(childKey);\r\n }\r\n if (newChild != null) {\r\n newEventCache = this.filter_.updateChild(oldEventCache, childKey, newChild, path.popFront(), source, accumulator);\r\n }\r\n else if (viewCache\r\n .getEventCache()\r\n .getNode()\r\n .hasChild(childKey)) {\r\n // No complete child available, delete the existing one, if any\r\n newEventCache = this.filter_.updateChild(oldEventCache, childKey, ChildrenNode.EMPTY_NODE, path.popFront(), source, accumulator);\r\n }\r\n else {\r\n newEventCache = oldEventCache;\r\n }\r\n if (newEventCache.isEmpty() &&\r\n viewCache.getServerCache().isFullyInitialized()) {\r\n // We might have reverted all child writes. Maybe the old event was a leaf node\r\n complete = writesCache.calcCompleteEventCache(viewCache.getCompleteServerSnap());\r\n if (complete.isLeafNode()) {\r\n newEventCache = this.filter_.updateFullNode(newEventCache, complete, accumulator);\r\n }\r\n }\r\n }\r\n complete =\r\n viewCache.getServerCache().isFullyInitialized() ||\r\n writesCache.shadowingWrite(Path.Empty) != null;\r\n return viewCache.updateEventSnap(newEventCache, complete, this.filter_.filtersNodes());\r\n }\r\n };\r\n return ViewProcessor;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An EventGenerator is used to convert \"raw\" changes (Change) as computed by the\r\n * CacheDiffer into actual events (Event) that can be raised. See generateEventsForChanges()\r\n * for details.\r\n *\r\n * @constructor\r\n */\r\nvar EventGenerator = /** @class */ (function () {\r\n /**\r\n *\r\n * @param {!Query} query_\r\n */\r\n function EventGenerator(query_) {\r\n this.query_ = query_;\r\n /**\r\n * @private\r\n * @type {!Index}\r\n */\r\n this.index_ = this.query_.getQueryParams().getIndex();\r\n }\r\n /**\r\n * Given a set of raw changes (no moved events and prevName not specified yet), and a set of\r\n * EventRegistrations that should be notified of these changes, generate the actual events to be raised.\r\n *\r\n * Notes:\r\n * - child_moved events will be synthesized at this time for any child_changed events that affect\r\n * our index.\r\n * - prevName will be calculated based on the index ordering.\r\n *\r\n * @param {!Array.} changes\r\n * @param {!Node} eventCache\r\n * @param {!Array.} eventRegistrations\r\n * @return {!Array.}\r\n */\r\n EventGenerator.prototype.generateEventsForChanges = function (changes, eventCache, eventRegistrations) {\r\n var _this = this;\r\n var events = [];\r\n var moves = [];\r\n changes.forEach(function (change) {\r\n if (change.type === Change.CHILD_CHANGED &&\r\n _this.index_.indexedValueChanged(change.oldSnap, change.snapshotNode)) {\r\n moves.push(Change.childMovedChange(change.childName, change.snapshotNode));\r\n }\r\n });\r\n this.generateEventsForType_(events, Change.CHILD_REMOVED, changes, eventRegistrations, eventCache);\r\n this.generateEventsForType_(events, Change.CHILD_ADDED, changes, eventRegistrations, eventCache);\r\n this.generateEventsForType_(events, Change.CHILD_MOVED, moves, eventRegistrations, eventCache);\r\n this.generateEventsForType_(events, Change.CHILD_CHANGED, changes, eventRegistrations, eventCache);\r\n this.generateEventsForType_(events, Change.VALUE, changes, eventRegistrations, eventCache);\r\n return events;\r\n };\r\n /**\r\n * Given changes of a single change type, generate the corresponding events.\r\n *\r\n * @param {!Array.} events\r\n * @param {!string} eventType\r\n * @param {!Array.} changes\r\n * @param {!Array.} registrations\r\n * @param {!Node} eventCache\r\n * @private\r\n */\r\n EventGenerator.prototype.generateEventsForType_ = function (events, eventType, changes, registrations, eventCache) {\r\n var _this = this;\r\n var filteredChanges = changes.filter(function (change) { return change.type === eventType; });\r\n filteredChanges.sort(this.compareChanges_.bind(this));\r\n filteredChanges.forEach(function (change) {\r\n var materializedChange = _this.materializeSingleChange_(change, eventCache);\r\n registrations.forEach(function (registration) {\r\n if (registration.respondsTo(change.type)) {\r\n events.push(registration.createEvent(materializedChange, _this.query_));\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * @param {!Change} change\r\n * @param {!Node} eventCache\r\n * @return {!Change}\r\n * @private\r\n */\r\n EventGenerator.prototype.materializeSingleChange_ = function (change, eventCache) {\r\n if (change.type === 'value' || change.type === 'child_removed') {\r\n return change;\r\n }\r\n else {\r\n change.prevName = eventCache.getPredecessorChildName(\r\n /** @type {!string} */\r\n change.childName, change.snapshotNode, this.index_);\r\n return change;\r\n }\r\n };\r\n /**\r\n * @param {!Change} a\r\n * @param {!Change} b\r\n * @return {number}\r\n * @private\r\n */\r\n EventGenerator.prototype.compareChanges_ = function (a, b) {\r\n if (a.childName == null || b.childName == null) {\r\n throw assertionError('Should only compare child_ events.');\r\n }\r\n var aWrapped = new NamedNode(a.childName, a.snapshotNode);\r\n var bWrapped = new NamedNode(b.childName, b.snapshotNode);\r\n return this.index_.compare(aWrapped, bWrapped);\r\n };\r\n return EventGenerator;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A view represents a specific location and query that has 1 or more event registrations.\r\n *\r\n * It does several things:\r\n * - Maintains the list of event registrations for this location/query.\r\n * - Maintains a cache of the data visible for this location/query.\r\n * - Applies new operations (via applyOperation), updates the cache, and based on the event\r\n * registrations returns the set of events to be raised.\r\n * @constructor\r\n */\r\nvar View = /** @class */ (function () {\r\n /**\r\n *\r\n * @param {!Query} query_\r\n * @param {!ViewCache} initialViewCache\r\n */\r\n function View(query_, initialViewCache) {\r\n this.query_ = query_;\r\n this.eventRegistrations_ = [];\r\n var params = this.query_.getQueryParams();\r\n var indexFilter = new IndexedFilter(params.getIndex());\r\n var filter = params.getNodeFilter();\r\n /**\r\n * @type {ViewProcessor}\r\n * @private\r\n */\r\n this.processor_ = new ViewProcessor(filter);\r\n var initialServerCache = initialViewCache.getServerCache();\r\n var initialEventCache = initialViewCache.getEventCache();\r\n // Don't filter server node with other filter than index, wait for tagged listen\r\n var serverSnap = indexFilter.updateFullNode(ChildrenNode.EMPTY_NODE, initialServerCache.getNode(), null);\r\n var eventSnap = filter.updateFullNode(ChildrenNode.EMPTY_NODE, initialEventCache.getNode(), null);\r\n var newServerCache = new CacheNode(serverSnap, initialServerCache.isFullyInitialized(), indexFilter.filtersNodes());\r\n var newEventCache = new CacheNode(eventSnap, initialEventCache.isFullyInitialized(), filter.filtersNodes());\r\n /**\r\n * @type {!ViewCache}\r\n * @private\r\n */\r\n this.viewCache_ = new ViewCache(newEventCache, newServerCache);\r\n /**\r\n * @type {!EventGenerator}\r\n * @private\r\n */\r\n this.eventGenerator_ = new EventGenerator(this.query_);\r\n }\r\n /**\r\n * @return {!Query}\r\n */\r\n View.prototype.getQuery = function () {\r\n return this.query_;\r\n };\r\n /**\r\n * @return {?Node}\r\n */\r\n View.prototype.getServerCache = function () {\r\n return this.viewCache_.getServerCache().getNode();\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @return {?Node}\r\n */\r\n View.prototype.getCompleteServerCache = function (path) {\r\n var cache = this.viewCache_.getCompleteServerSnap();\r\n if (cache) {\r\n // If this isn't a \"loadsAllData\" view, then cache isn't actually a complete cache and\r\n // we need to see if it contains the child we're interested in.\r\n if (this.query_.getQueryParams().loadsAllData() ||\r\n (!path.isEmpty() && !cache.getImmediateChild(path.getFront()).isEmpty())) {\r\n return cache.getChild(path);\r\n }\r\n }\r\n return null;\r\n };\r\n /**\r\n * @return {boolean}\r\n */\r\n View.prototype.isEmpty = function () {\r\n return this.eventRegistrations_.length === 0;\r\n };\r\n /**\r\n * @param {!EventRegistration} eventRegistration\r\n */\r\n View.prototype.addEventRegistration = function (eventRegistration) {\r\n this.eventRegistrations_.push(eventRegistration);\r\n };\r\n /**\r\n * @param {?EventRegistration} eventRegistration If null, remove all callbacks.\r\n * @param {Error=} cancelError If a cancelError is provided, appropriate cancel events will be returned.\r\n * @return {!Array.} Cancel events, if cancelError was provided.\r\n */\r\n View.prototype.removeEventRegistration = function (eventRegistration, cancelError) {\r\n var cancelEvents = [];\r\n if (cancelError) {\r\n assert(eventRegistration == null, 'A cancel should cancel all event registrations.');\r\n var path_1 = this.query_.path;\r\n this.eventRegistrations_.forEach(function (registration) {\r\n cancelError /** @type {!Error} */ = cancelError;\r\n var maybeEvent = registration.createCancelEvent(cancelError, path_1);\r\n if (maybeEvent) {\r\n cancelEvents.push(maybeEvent);\r\n }\r\n });\r\n }\r\n if (eventRegistration) {\r\n var remaining = [];\r\n for (var i = 0; i < this.eventRegistrations_.length; ++i) {\r\n var existing = this.eventRegistrations_[i];\r\n if (!existing.matches(eventRegistration)) {\r\n remaining.push(existing);\r\n }\r\n else if (eventRegistration.hasAnyCallback()) {\r\n // We're removing just this one\r\n remaining = remaining.concat(this.eventRegistrations_.slice(i + 1));\r\n break;\r\n }\r\n }\r\n this.eventRegistrations_ = remaining;\r\n }\r\n else {\r\n this.eventRegistrations_ = [];\r\n }\r\n return cancelEvents;\r\n };\r\n /**\r\n * Applies the given Operation, updates our cache, and returns the appropriate events.\r\n *\r\n * @param {!Operation} operation\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} completeServerCache\r\n * @return {!Array.}\r\n */\r\n View.prototype.applyOperation = function (operation, writesCache, completeServerCache) {\r\n if (operation.type === OperationType.MERGE &&\r\n operation.source.queryId !== null) {\r\n assert(this.viewCache_.getCompleteServerSnap(), 'We should always have a full cache before handling merges');\r\n assert(this.viewCache_.getCompleteEventSnap(), 'Missing event cache, even though we have a server cache');\r\n }\r\n var oldViewCache = this.viewCache_;\r\n var result = this.processor_.applyOperation(oldViewCache, operation, writesCache, completeServerCache);\r\n this.processor_.assertIndexed(result.viewCache);\r\n assert(result.viewCache.getServerCache().isFullyInitialized() ||\r\n !oldViewCache.getServerCache().isFullyInitialized(), 'Once a server snap is complete, it should never go back');\r\n this.viewCache_ = result.viewCache;\r\n return this.generateEventsForChanges_(result.changes, result.viewCache.getEventCache().getNode(), null);\r\n };\r\n /**\r\n * @param {!EventRegistration} registration\r\n * @return {!Array.}\r\n */\r\n View.prototype.getInitialEvents = function (registration) {\r\n var eventSnap = this.viewCache_.getEventCache();\r\n var initialChanges = [];\r\n if (!eventSnap.getNode().isLeafNode()) {\r\n var eventNode = eventSnap.getNode();\r\n eventNode.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n initialChanges.push(Change.childAddedChange(key, childNode));\r\n });\r\n }\r\n if (eventSnap.isFullyInitialized()) {\r\n initialChanges.push(Change.valueChange(eventSnap.getNode()));\r\n }\r\n return this.generateEventsForChanges_(initialChanges, eventSnap.getNode(), registration);\r\n };\r\n /**\r\n * @private\r\n * @param {!Array.} changes\r\n * @param {!Node} eventCache\r\n * @param {EventRegistration=} eventRegistration\r\n * @return {!Array.}\r\n */\r\n View.prototype.generateEventsForChanges_ = function (changes, eventCache, eventRegistration) {\r\n var registrations = eventRegistration\r\n ? [eventRegistration]\r\n : this.eventRegistrations_;\r\n return this.eventGenerator_.generateEventsForChanges(changes, eventCache, registrations);\r\n };\r\n return View;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar __referenceConstructor$1;\r\n/**\r\n * SyncPoint represents a single location in a SyncTree with 1 or more event registrations, meaning we need to\r\n * maintain 1 or more Views at this location to cache server data and raise appropriate events for server changes\r\n * and user writes (set, transaction, update).\r\n *\r\n * It's responsible for:\r\n * - Maintaining the set of 1 or more views necessary at this location (a SyncPoint with 0 views should be removed).\r\n * - Proxying user / server operations to the views as appropriate (i.e. applyServerOverwrite,\r\n * applyUserOverwrite, etc.)\r\n */\r\nvar SyncPoint = /** @class */ (function () {\r\n function SyncPoint() {\r\n /**\r\n * The Views being tracked at this location in the tree, stored as a map where the key is a\r\n * queryId and the value is the View for that query.\r\n *\r\n * NOTE: This list will be quite small (usually 1, but perhaps 2 or 3; any more is an odd use case).\r\n *\r\n * @type {!Object.}\r\n * @private\r\n */\r\n this.views_ = {};\r\n }\r\n Object.defineProperty(SyncPoint, \"__referenceConstructor\", {\r\n get: function () {\r\n assert(__referenceConstructor$1, 'Reference.ts has not been loaded');\r\n return __referenceConstructor$1;\r\n },\r\n set: function (val) {\r\n assert(!__referenceConstructor$1, '__referenceConstructor has already been defined');\r\n __referenceConstructor$1 = val;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @return {boolean}\r\n */\r\n SyncPoint.prototype.isEmpty = function () {\r\n return isEmpty(this.views_);\r\n };\r\n /**\r\n *\r\n * @param {!Operation} operation\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} optCompleteServerCache\r\n * @return {!Array.}\r\n */\r\n SyncPoint.prototype.applyOperation = function (operation, writesCache, optCompleteServerCache) {\r\n var queryId = operation.source.queryId;\r\n if (queryId !== null) {\r\n var view = safeGet(this.views_, queryId);\r\n assert(view != null, 'SyncTree gave us an op for an invalid query.');\r\n return view.applyOperation(operation, writesCache, optCompleteServerCache);\r\n }\r\n else {\r\n var events_1 = [];\r\n forEach(this.views_, function (key, view) {\r\n events_1 = events_1.concat(view.applyOperation(operation, writesCache, optCompleteServerCache));\r\n });\r\n return events_1;\r\n }\r\n };\r\n /**\r\n * Add an event callback for the specified query.\r\n *\r\n * @param {!Query} query\r\n * @param {!EventRegistration} eventRegistration\r\n * @param {!WriteTreeRef} writesCache\r\n * @param {?Node} serverCache Complete server cache, if we have it.\r\n * @param {boolean} serverCacheComplete\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncPoint.prototype.addEventRegistration = function (query, eventRegistration, writesCache, serverCache, serverCacheComplete) {\r\n var queryId = query.queryIdentifier();\r\n var view = safeGet(this.views_, queryId);\r\n if (!view) {\r\n // TODO: make writesCache take flag for complete server node\r\n var eventCache = writesCache.calcCompleteEventCache(serverCacheComplete ? serverCache : null);\r\n var eventCacheComplete = false;\r\n if (eventCache) {\r\n eventCacheComplete = true;\r\n }\r\n else if (serverCache instanceof ChildrenNode) {\r\n eventCache = writesCache.calcCompleteEventChildren(serverCache);\r\n eventCacheComplete = false;\r\n }\r\n else {\r\n eventCache = ChildrenNode.EMPTY_NODE;\r\n eventCacheComplete = false;\r\n }\r\n var viewCache = new ViewCache(new CacheNode(\r\n /** @type {!Node} */ (eventCache), eventCacheComplete, false), new CacheNode(\r\n /** @type {!Node} */ (serverCache), serverCacheComplete, false));\r\n view = new View(query, viewCache);\r\n this.views_[queryId] = view;\r\n }\r\n // This is guaranteed to exist now, we just created anything that was missing\r\n view.addEventRegistration(eventRegistration);\r\n return view.getInitialEvents(eventRegistration);\r\n };\r\n /**\r\n * Remove event callback(s). Return cancelEvents if a cancelError is specified.\r\n *\r\n * If query is the default query, we'll check all views for the specified eventRegistration.\r\n * If eventRegistration is null, we'll remove all callbacks for the specified view(s).\r\n *\r\n * @param {!Query} query\r\n * @param {?EventRegistration} eventRegistration If null, remove all callbacks.\r\n * @param {Error=} cancelError If a cancelError is provided, appropriate cancel events will be returned.\r\n * @return {{removed:!Array., events:!Array.}} removed queries and any cancel events\r\n */\r\n SyncPoint.prototype.removeEventRegistration = function (query, eventRegistration, cancelError) {\r\n var queryId = query.queryIdentifier();\r\n var removed = [];\r\n var cancelEvents = [];\r\n var hadCompleteView = this.hasCompleteView();\r\n if (queryId === 'default') {\r\n // When you do ref.off(...), we search all views for the registration to remove.\r\n var self_1 = this;\r\n forEach(this.views_, function (viewQueryId, view) {\r\n cancelEvents = cancelEvents.concat(view.removeEventRegistration(eventRegistration, cancelError));\r\n if (view.isEmpty()) {\r\n delete self_1.views_[viewQueryId];\r\n // We'll deal with complete views later.\r\n if (!view\r\n .getQuery()\r\n .getQueryParams()\r\n .loadsAllData()) {\r\n removed.push(view.getQuery());\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n // remove the callback from the specific view.\r\n var view = safeGet(this.views_, queryId);\r\n if (view) {\r\n cancelEvents = cancelEvents.concat(view.removeEventRegistration(eventRegistration, cancelError));\r\n if (view.isEmpty()) {\r\n delete this.views_[queryId];\r\n // We'll deal with complete views later.\r\n if (!view\r\n .getQuery()\r\n .getQueryParams()\r\n .loadsAllData()) {\r\n removed.push(view.getQuery());\r\n }\r\n }\r\n }\r\n }\r\n if (hadCompleteView && !this.hasCompleteView()) {\r\n // We removed our last complete view.\r\n removed.push(new SyncPoint.__referenceConstructor(query.repo, query.path));\r\n }\r\n return { removed: removed, events: cancelEvents };\r\n };\r\n /**\r\n * @return {!Array.}\r\n */\r\n SyncPoint.prototype.getQueryViews = function () {\r\n var _this = this;\r\n var values = Object.keys(this.views_).map(function (key) { return _this.views_[key]; });\r\n return values.filter(function (view) {\r\n return !view\r\n .getQuery()\r\n .getQueryParams()\r\n .loadsAllData();\r\n });\r\n };\r\n /**\r\n *\r\n * @param {!Path} path The path to the desired complete snapshot\r\n * @return {?Node} A complete cache, if it exists\r\n */\r\n SyncPoint.prototype.getCompleteServerCache = function (path) {\r\n var serverCache = null;\r\n forEach(this.views_, function (key, view) {\r\n serverCache = serverCache || view.getCompleteServerCache(path);\r\n });\r\n return serverCache;\r\n };\r\n /**\r\n * @param {!Query} query\r\n * @return {?View}\r\n */\r\n SyncPoint.prototype.viewForQuery = function (query) {\r\n var params = query.getQueryParams();\r\n if (params.loadsAllData()) {\r\n return this.getCompleteView();\r\n }\r\n else {\r\n var queryId = query.queryIdentifier();\r\n return safeGet(this.views_, queryId);\r\n }\r\n };\r\n /**\r\n * @param {!Query} query\r\n * @return {boolean}\r\n */\r\n SyncPoint.prototype.viewExistsForQuery = function (query) {\r\n return this.viewForQuery(query) != null;\r\n };\r\n /**\r\n * @return {boolean}\r\n */\r\n SyncPoint.prototype.hasCompleteView = function () {\r\n return this.getCompleteView() != null;\r\n };\r\n /**\r\n * @return {?View}\r\n */\r\n SyncPoint.prototype.getCompleteView = function () {\r\n var completeView = findValue(this.views_, function (view) {\r\n return view\r\n .getQuery()\r\n .getQueryParams()\r\n .loadsAllData();\r\n });\r\n return completeView || null;\r\n };\r\n return SyncPoint;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class holds a collection of writes that can be applied to nodes in unison. It abstracts away the logic with\r\n * dealing with priority writes and multiple nested writes. At any given path there is only allowed to be one write\r\n * modifying that path. Any write to an existing path or shadowing an existing path will modify that existing write\r\n * to reflect the write added.\r\n *\r\n * @constructor\r\n * @param {!ImmutableTree.} writeTree\r\n */\r\nvar CompoundWrite = /** @class */ (function () {\r\n function CompoundWrite(writeTree_) {\r\n this.writeTree_ = writeTree_;\r\n }\r\n /**\r\n * @param {!Path} path\r\n * @param {!Node} node\r\n * @return {!CompoundWrite}\r\n */\r\n CompoundWrite.prototype.addWrite = function (path, node) {\r\n if (path.isEmpty()) {\r\n return new CompoundWrite(new ImmutableTree(node));\r\n }\r\n else {\r\n var rootmost = this.writeTree_.findRootMostValueAndPath(path);\r\n if (rootmost != null) {\r\n var rootMostPath = rootmost.path;\r\n var value = rootmost.value;\r\n var relativePath = Path.relativePath(rootMostPath, path);\r\n value = value.updateChild(relativePath, node);\r\n return new CompoundWrite(this.writeTree_.set(rootMostPath, value));\r\n }\r\n else {\r\n var subtree = new ImmutableTree(node);\r\n var newWriteTree = this.writeTree_.setTree(path, subtree);\r\n return new CompoundWrite(newWriteTree);\r\n }\r\n }\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @param {!Object.} updates\r\n * @return {!CompoundWrite}\r\n */\r\n CompoundWrite.prototype.addWrites = function (path, updates) {\r\n var newWrite = this;\r\n forEach(updates, function (childKey, node) {\r\n newWrite = newWrite.addWrite(path.child(childKey), node);\r\n });\r\n return newWrite;\r\n };\r\n /**\r\n * Will remove a write at the given path and deeper paths. This will not modify a write at a higher\r\n * location, which must be removed by calling this method with that path.\r\n *\r\n * @param {!Path} path The path at which a write and all deeper writes should be removed\r\n * @return {!CompoundWrite} The new CompoundWrite with the removed path\r\n */\r\n CompoundWrite.prototype.removeWrite = function (path) {\r\n if (path.isEmpty()) {\r\n return CompoundWrite.Empty;\r\n }\r\n else {\r\n var newWriteTree = this.writeTree_.setTree(path, ImmutableTree.Empty);\r\n return new CompoundWrite(newWriteTree);\r\n }\r\n };\r\n /**\r\n * Returns whether this CompoundWrite will fully overwrite a node at a given location and can therefore be\r\n * considered \"complete\".\r\n *\r\n * @param {!Path} path The path to check for\r\n * @return {boolean} Whether there is a complete write at that path\r\n */\r\n CompoundWrite.prototype.hasCompleteWrite = function (path) {\r\n return this.getCompleteNode(path) != null;\r\n };\r\n /**\r\n * Returns a node for a path if and only if the node is a \"complete\" overwrite at that path. This will not aggregate\r\n * writes from deeper paths, but will return child nodes from a more shallow path.\r\n *\r\n * @param {!Path} path The path to get a complete write\r\n * @return {?Node} The node if complete at that path, or null otherwise.\r\n */\r\n CompoundWrite.prototype.getCompleteNode = function (path) {\r\n var rootmost = this.writeTree_.findRootMostValueAndPath(path);\r\n if (rootmost != null) {\r\n return this.writeTree_\r\n .get(rootmost.path)\r\n .getChild(Path.relativePath(rootmost.path, path));\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n /**\r\n * Returns all children that are guaranteed to be a complete overwrite.\r\n *\r\n * @return {!Array.} A list of all complete children.\r\n */\r\n CompoundWrite.prototype.getCompleteChildren = function () {\r\n var children = [];\r\n var node = this.writeTree_.value;\r\n if (node != null) {\r\n // If it's a leaf node, it has no children; so nothing to do.\r\n if (!node.isLeafNode()) {\r\n node.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n children.push(new NamedNode(childName, childNode));\r\n });\r\n }\r\n }\r\n else {\r\n this.writeTree_.children.inorderTraversal(function (childName, childTree) {\r\n if (childTree.value != null) {\r\n children.push(new NamedNode(childName, childTree.value));\r\n }\r\n });\r\n }\r\n return children;\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @return {!CompoundWrite}\r\n */\r\n CompoundWrite.prototype.childCompoundWrite = function (path) {\r\n if (path.isEmpty()) {\r\n return this;\r\n }\r\n else {\r\n var shadowingNode = this.getCompleteNode(path);\r\n if (shadowingNode != null) {\r\n return new CompoundWrite(new ImmutableTree(shadowingNode));\r\n }\r\n else {\r\n return new CompoundWrite(this.writeTree_.subtree(path));\r\n }\r\n }\r\n };\r\n /**\r\n * Returns true if this CompoundWrite is empty and therefore does not modify any nodes.\r\n * @return {boolean} Whether this CompoundWrite is empty\r\n */\r\n CompoundWrite.prototype.isEmpty = function () {\r\n return this.writeTree_.isEmpty();\r\n };\r\n /**\r\n * Applies this CompoundWrite to a node. The node is returned with all writes from this CompoundWrite applied to the\r\n * node\r\n * @param {!Node} node The node to apply this CompoundWrite to\r\n * @return {!Node} The node with all writes applied\r\n */\r\n CompoundWrite.prototype.apply = function (node) {\r\n return CompoundWrite.applySubtreeWrite_(Path.Empty, this.writeTree_, node);\r\n };\r\n /**\r\n * @type {!CompoundWrite}\r\n */\r\n CompoundWrite.Empty = new CompoundWrite(new ImmutableTree(null));\r\n /**\r\n * @param {!Path} relativePath\r\n * @param {!ImmutableTree.} writeTree\r\n * @param {!Node} node\r\n * @return {!Node}\r\n * @private\r\n */\r\n CompoundWrite.applySubtreeWrite_ = function (relativePath, writeTree, node) {\r\n if (writeTree.value != null) {\r\n // Since there a write is always a leaf, we're done here\r\n return node.updateChild(relativePath, writeTree.value);\r\n }\r\n else {\r\n var priorityWrite_1 = null;\r\n writeTree.children.inorderTraversal(function (childKey, childTree) {\r\n if (childKey === '.priority') {\r\n // Apply priorities at the end so we don't update priorities for either empty nodes or forget\r\n // to apply priorities to empty nodes that are later filled\r\n assert(childTree.value !== null, 'Priority writes must always be leaf nodes');\r\n priorityWrite_1 = childTree.value;\r\n }\r\n else {\r\n node = CompoundWrite.applySubtreeWrite_(relativePath.child(childKey), childTree, node);\r\n }\r\n });\r\n // If there was a priority write, we only apply it if the node is not empty\r\n if (!node.getChild(relativePath).isEmpty() && priorityWrite_1 !== null) {\r\n node = node.updateChild(relativePath.child('.priority'), priorityWrite_1);\r\n }\r\n return node;\r\n }\r\n };\r\n return CompoundWrite;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * WriteTree tracks all pending user-initiated writes and has methods to calculate the result of merging them\r\n * with underlying server data (to create \"event cache\" data). Pending writes are added with addOverwrite()\r\n * and addMerge(), and removed with removeWrite().\r\n *\r\n * @constructor\r\n */\r\nvar WriteTree = /** @class */ (function () {\r\n function WriteTree() {\r\n /**\r\n * A tree tracking the result of applying all visible writes. This does not include transactions with\r\n * applyLocally=false or writes that are completely shadowed by other writes.\r\n *\r\n * @type {!CompoundWrite}\r\n * @private\r\n */\r\n this.visibleWrites_ = CompoundWrite.Empty;\r\n /**\r\n * A list of all pending writes, regardless of visibility and shadowed-ness. Used to calculate arbitrary\r\n * sets of the changed data, such as hidden writes (from transactions) or changes with certain writes excluded (also\r\n * used by transactions).\r\n *\r\n * @type {!Array.}\r\n * @private\r\n */\r\n this.allWrites_ = [];\r\n this.lastWriteId_ = -1;\r\n }\r\n /**\r\n * Create a new WriteTreeRef for the given path. For use with a new sync point at the given path.\r\n *\r\n * @param {!Path} path\r\n * @return {!WriteTreeRef}\r\n */\r\n WriteTree.prototype.childWrites = function (path) {\r\n return new WriteTreeRef(path, this);\r\n };\r\n /**\r\n * Record a new overwrite from user code.\r\n *\r\n * @param {!Path} path\r\n * @param {!Node} snap\r\n * @param {!number} writeId\r\n * @param {boolean=} visible This is set to false by some transactions. It should be excluded from event caches\r\n */\r\n WriteTree.prototype.addOverwrite = function (path, snap, writeId, visible) {\r\n assert(writeId > this.lastWriteId_, 'Stacking an older write on top of newer ones');\r\n if (visible === undefined) {\r\n visible = true;\r\n }\r\n this.allWrites_.push({\r\n path: path,\r\n snap: snap,\r\n writeId: writeId,\r\n visible: visible\r\n });\r\n if (visible) {\r\n this.visibleWrites_ = this.visibleWrites_.addWrite(path, snap);\r\n }\r\n this.lastWriteId_ = writeId;\r\n };\r\n /**\r\n * Record a new merge from user code.\r\n *\r\n * @param {!Path} path\r\n * @param {!Object.} changedChildren\r\n * @param {!number} writeId\r\n */\r\n WriteTree.prototype.addMerge = function (path, changedChildren, writeId) {\r\n assert(writeId > this.lastWriteId_, 'Stacking an older merge on top of newer ones');\r\n this.allWrites_.push({\r\n path: path,\r\n children: changedChildren,\r\n writeId: writeId,\r\n visible: true\r\n });\r\n this.visibleWrites_ = this.visibleWrites_.addWrites(path, changedChildren);\r\n this.lastWriteId_ = writeId;\r\n };\r\n /**\r\n * @param {!number} writeId\r\n * @return {?WriteRecord}\r\n */\r\n WriteTree.prototype.getWrite = function (writeId) {\r\n for (var i = 0; i < this.allWrites_.length; i++) {\r\n var record = this.allWrites_[i];\r\n if (record.writeId === writeId) {\r\n return record;\r\n }\r\n }\r\n return null;\r\n };\r\n /**\r\n * Remove a write (either an overwrite or merge) that has been successfully acknowledge by the server. Recalculates\r\n * the tree if necessary. We return true if it may have been visible, meaning views need to reevaluate.\r\n *\r\n * @param {!number} writeId\r\n * @return {boolean} true if the write may have been visible (meaning we'll need to reevaluate / raise\r\n * events as a result).\r\n */\r\n WriteTree.prototype.removeWrite = function (writeId) {\r\n // Note: disabling this check. It could be a transaction that preempted another transaction, and thus was applied\r\n // out of order.\r\n //const validClear = revert || this.allWrites_.length === 0 || writeId <= this.allWrites_[0].writeId;\r\n //assert(validClear, \"Either we don't have this write, or it's the first one in the queue\");\r\n var _this = this;\r\n var idx = this.allWrites_.findIndex(function (s) {\r\n return s.writeId === writeId;\r\n });\r\n assert(idx >= 0, 'removeWrite called with nonexistent writeId.');\r\n var writeToRemove = this.allWrites_[idx];\r\n this.allWrites_.splice(idx, 1);\r\n var removedWriteWasVisible = writeToRemove.visible;\r\n var removedWriteOverlapsWithOtherWrites = false;\r\n var i = this.allWrites_.length - 1;\r\n while (removedWriteWasVisible && i >= 0) {\r\n var currentWrite = this.allWrites_[i];\r\n if (currentWrite.visible) {\r\n if (i >= idx &&\r\n this.recordContainsPath_(currentWrite, writeToRemove.path)) {\r\n // The removed write was completely shadowed by a subsequent write.\r\n removedWriteWasVisible = false;\r\n }\r\n else if (writeToRemove.path.contains(currentWrite.path)) {\r\n // Either we're covering some writes or they're covering part of us (depending on which came first).\r\n removedWriteOverlapsWithOtherWrites = true;\r\n }\r\n }\r\n i--;\r\n }\r\n if (!removedWriteWasVisible) {\r\n return false;\r\n }\r\n else if (removedWriteOverlapsWithOtherWrites) {\r\n // There's some shadowing going on. Just rebuild the visible writes from scratch.\r\n this.resetTree_();\r\n return true;\r\n }\r\n else {\r\n // There's no shadowing. We can safely just remove the write(s) from visibleWrites.\r\n if (writeToRemove.snap) {\r\n this.visibleWrites_ = this.visibleWrites_.removeWrite(writeToRemove.path);\r\n }\r\n else {\r\n var children = writeToRemove.children;\r\n forEach(children, function (childName) {\r\n _this.visibleWrites_ = _this.visibleWrites_.removeWrite(writeToRemove.path.child(childName));\r\n });\r\n }\r\n return true;\r\n }\r\n };\r\n /**\r\n * Return a complete snapshot for the given path if there's visible write data at that path, else null.\r\n * No server data is considered.\r\n *\r\n * @param {!Path} path\r\n * @return {?Node}\r\n */\r\n WriteTree.prototype.getCompleteWriteData = function (path) {\r\n return this.visibleWrites_.getCompleteNode(path);\r\n };\r\n /**\r\n * Given optional, underlying server data, and an optional set of constraints (exclude some sets, include hidden\r\n * writes), attempt to calculate a complete snapshot for the given path\r\n *\r\n * @param {!Path} treePath\r\n * @param {?Node} completeServerCache\r\n * @param {Array.=} writeIdsToExclude An optional set to be excluded\r\n * @param {boolean=} includeHiddenWrites Defaults to false, whether or not to layer on writes with visible set to false\r\n * @return {?Node}\r\n */\r\n WriteTree.prototype.calcCompleteEventCache = function (treePath, completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n if (!writeIdsToExclude && !includeHiddenWrites) {\r\n var shadowingNode = this.visibleWrites_.getCompleteNode(treePath);\r\n if (shadowingNode != null) {\r\n return shadowingNode;\r\n }\r\n else {\r\n var subMerge = this.visibleWrites_.childCompoundWrite(treePath);\r\n if (subMerge.isEmpty()) {\r\n return completeServerCache;\r\n }\r\n else if (completeServerCache == null &&\r\n !subMerge.hasCompleteWrite(Path.Empty)) {\r\n // We wouldn't have a complete snapshot, since there's no underlying data and no complete shadow\r\n return null;\r\n }\r\n else {\r\n var layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n return subMerge.apply(layeredCache);\r\n }\r\n }\r\n }\r\n else {\r\n var merge = this.visibleWrites_.childCompoundWrite(treePath);\r\n if (!includeHiddenWrites && merge.isEmpty()) {\r\n return completeServerCache;\r\n }\r\n else {\r\n // If the server cache is null, and we don't have a complete cache, we need to return null\r\n if (!includeHiddenWrites &&\r\n completeServerCache == null &&\r\n !merge.hasCompleteWrite(Path.Empty)) {\r\n return null;\r\n }\r\n else {\r\n var filter = function (write) {\r\n return ((write.visible || includeHiddenWrites) &&\r\n (!writeIdsToExclude ||\r\n !~writeIdsToExclude.indexOf(write.writeId)) &&\r\n (write.path.contains(treePath) || treePath.contains(write.path)));\r\n };\r\n var mergeAtPath = WriteTree.layerTree_(this.allWrites_, filter, treePath);\r\n var layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n return mergeAtPath.apply(layeredCache);\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n * With optional, underlying server data, attempt to return a children node of children that we have complete data for.\r\n * Used when creating new views, to pre-fill their complete event children snapshot.\r\n *\r\n * @param {!Path} treePath\r\n * @param {?ChildrenNode} completeServerChildren\r\n * @return {!ChildrenNode}\r\n */\r\n WriteTree.prototype.calcCompleteEventChildren = function (treePath, completeServerChildren) {\r\n var completeChildren = ChildrenNode.EMPTY_NODE;\r\n var topLevelSet = this.visibleWrites_.getCompleteNode(treePath);\r\n if (topLevelSet) {\r\n if (!topLevelSet.isLeafNode()) {\r\n // we're shadowing everything. Return the children.\r\n topLevelSet.forEachChild(PRIORITY_INDEX, function (childName, childSnap) {\r\n completeChildren = completeChildren.updateImmediateChild(childName, childSnap);\r\n });\r\n }\r\n return completeChildren;\r\n }\r\n else if (completeServerChildren) {\r\n // Layer any children we have on top of this\r\n // We know we don't have a top-level set, so just enumerate existing children\r\n var merge_1 = this.visibleWrites_.childCompoundWrite(treePath);\r\n completeServerChildren.forEachChild(PRIORITY_INDEX, function (childName, childNode) {\r\n var node = merge_1\r\n .childCompoundWrite(new Path(childName))\r\n .apply(childNode);\r\n completeChildren = completeChildren.updateImmediateChild(childName, node);\r\n });\r\n // Add any complete children we have from the set\r\n merge_1.getCompleteChildren().forEach(function (namedNode) {\r\n completeChildren = completeChildren.updateImmediateChild(namedNode.name, namedNode.node);\r\n });\r\n return completeChildren;\r\n }\r\n else {\r\n // We don't have anything to layer on top of. Layer on any children we have\r\n // Note that we can return an empty snap if we have a defined delete\r\n var merge = this.visibleWrites_.childCompoundWrite(treePath);\r\n merge.getCompleteChildren().forEach(function (namedNode) {\r\n completeChildren = completeChildren.updateImmediateChild(namedNode.name, namedNode.node);\r\n });\r\n return completeChildren;\r\n }\r\n };\r\n /**\r\n * Given that the underlying server data has updated, determine what, if anything, needs to be\r\n * applied to the event cache.\r\n *\r\n * Possibilities:\r\n *\r\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\r\n *\r\n * 2. Some write is completely shadowing. No events to be raised\r\n *\r\n * 3. Is partially shadowed. Events\r\n *\r\n * Either existingEventSnap or existingServerSnap must exist\r\n *\r\n * @param {!Path} treePath\r\n * @param {!Path} childPath\r\n * @param {?Node} existingEventSnap\r\n * @param {?Node} existingServerSnap\r\n * @return {?Node}\r\n */\r\n WriteTree.prototype.calcEventCacheAfterServerOverwrite = function (treePath, childPath, existingEventSnap, existingServerSnap) {\r\n assert(existingEventSnap || existingServerSnap, 'Either existingEventSnap or existingServerSnap must exist');\r\n var path = treePath.child(childPath);\r\n if (this.visibleWrites_.hasCompleteWrite(path)) {\r\n // At this point we can probably guarantee that we're in case 2, meaning no events\r\n // May need to check visibility while doing the findRootMostValueAndPath call\r\n return null;\r\n }\r\n else {\r\n // No complete shadowing. We're either partially shadowing or not shadowing at all.\r\n var childMerge = this.visibleWrites_.childCompoundWrite(path);\r\n if (childMerge.isEmpty()) {\r\n // We're not shadowing at all. Case 1\r\n return existingServerSnap.getChild(childPath);\r\n }\r\n else {\r\n // This could be more efficient if the serverNode + updates doesn't change the eventSnap\r\n // However this is tricky to find out, since user updates don't necessary change the server\r\n // snap, e.g. priority updates on empty nodes, or deep deletes. Another special case is if the server\r\n // adds nodes, but doesn't change any existing writes. It is therefore not enough to\r\n // only check if the updates change the serverNode.\r\n // Maybe check if the merge tree contains these special cases and only do a full overwrite in that case?\r\n return childMerge.apply(existingServerSnap.getChild(childPath));\r\n }\r\n }\r\n };\r\n /**\r\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\r\n * complete child for this ChildKey.\r\n *\r\n * @param {!Path} treePath\r\n * @param {!string} childKey\r\n * @param {!CacheNode} existingServerSnap\r\n * @return {?Node}\r\n */\r\n WriteTree.prototype.calcCompleteChild = function (treePath, childKey, existingServerSnap) {\r\n var path = treePath.child(childKey);\r\n var shadowingNode = this.visibleWrites_.getCompleteNode(path);\r\n if (shadowingNode != null) {\r\n return shadowingNode;\r\n }\r\n else {\r\n if (existingServerSnap.isCompleteForChild(childKey)) {\r\n var childMerge = this.visibleWrites_.childCompoundWrite(path);\r\n return childMerge.apply(existingServerSnap.getNode().getImmediateChild(childKey));\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n };\r\n /**\r\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\r\n * a higher path, this will return the child of that write relative to the write and this path.\r\n * Returns null if there is no write at this path.\r\n *\r\n * @param {!Path} path\r\n * @return {?Node}\r\n */\r\n WriteTree.prototype.shadowingWrite = function (path) {\r\n return this.visibleWrites_.getCompleteNode(path);\r\n };\r\n /**\r\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\r\n * the window, but may now be in the window.\r\n *\r\n * @param {!Path} treePath\r\n * @param {?Node} completeServerData\r\n * @param {!NamedNode} startPost\r\n * @param {!number} count\r\n * @param {boolean} reverse\r\n * @param {!Index} index\r\n * @return {!Array.}\r\n */\r\n WriteTree.prototype.calcIndexedSlice = function (treePath, completeServerData, startPost, count, reverse, index) {\r\n var toIterate;\r\n var merge = this.visibleWrites_.childCompoundWrite(treePath);\r\n var shadowingNode = merge.getCompleteNode(Path.Empty);\r\n if (shadowingNode != null) {\r\n toIterate = shadowingNode;\r\n }\r\n else if (completeServerData != null) {\r\n toIterate = merge.apply(completeServerData);\r\n }\r\n else {\r\n // no children to iterate on\r\n return [];\r\n }\r\n toIterate = toIterate.withIndex(index);\r\n if (!toIterate.isEmpty() && !toIterate.isLeafNode()) {\r\n var nodes = [];\r\n var cmp = index.getCompare();\r\n var iter = reverse\r\n ? toIterate.getReverseIteratorFrom(startPost, index)\r\n : toIterate.getIteratorFrom(startPost, index);\r\n var next = iter.getNext();\r\n while (next && nodes.length < count) {\r\n if (cmp(next, startPost) !== 0) {\r\n nodes.push(next);\r\n }\r\n next = iter.getNext();\r\n }\r\n return nodes;\r\n }\r\n else {\r\n return [];\r\n }\r\n };\r\n /**\r\n * @param {!WriteRecord} writeRecord\r\n * @param {!Path} path\r\n * @return {boolean}\r\n * @private\r\n */\r\n WriteTree.prototype.recordContainsPath_ = function (writeRecord, path) {\r\n if (writeRecord.snap) {\r\n return writeRecord.path.contains(path);\r\n }\r\n else {\r\n // findKey can return undefined, so use !! to coerce to boolean\r\n return !!findKey(writeRecord.children, function (childSnap, childName) {\r\n return writeRecord.path.child(childName).contains(path);\r\n });\r\n }\r\n };\r\n /**\r\n * Re-layer the writes and merges into a tree so we can efficiently calculate event snapshots\r\n * @private\r\n */\r\n WriteTree.prototype.resetTree_ = function () {\r\n this.visibleWrites_ = WriteTree.layerTree_(this.allWrites_, WriteTree.DefaultFilter_, Path.Empty);\r\n if (this.allWrites_.length > 0) {\r\n this.lastWriteId_ = this.allWrites_[this.allWrites_.length - 1].writeId;\r\n }\r\n else {\r\n this.lastWriteId_ = -1;\r\n }\r\n };\r\n /**\r\n * The default filter used when constructing the tree. Keep everything that's visible.\r\n *\r\n * @param {!WriteRecord} write\r\n * @return {boolean}\r\n * @private\r\n */\r\n WriteTree.DefaultFilter_ = function (write) {\r\n return write.visible;\r\n };\r\n /**\r\n * Static method. Given an array of WriteRecords, a filter for which ones to include, and a path, construct the tree of\r\n * event data at that path.\r\n *\r\n * @param {!Array.} writes\r\n * @param {!function(!WriteRecord):boolean} filter\r\n * @param {!Path} treeRoot\r\n * @return {!CompoundWrite}\r\n * @private\r\n */\r\n WriteTree.layerTree_ = function (writes, filter, treeRoot) {\r\n var compoundWrite = CompoundWrite.Empty;\r\n for (var i = 0; i < writes.length; ++i) {\r\n var write = writes[i];\r\n // Theory, a later set will either:\r\n // a) abort a relevant transaction, so no need to worry about excluding it from calculating that transaction\r\n // b) not be relevant to a transaction (separate branch), so again will not affect the data for that transaction\r\n if (filter(write)) {\r\n var writePath = write.path;\r\n var relativePath = void 0;\r\n if (write.snap) {\r\n if (treeRoot.contains(writePath)) {\r\n relativePath = Path.relativePath(treeRoot, writePath);\r\n compoundWrite = compoundWrite.addWrite(relativePath, write.snap);\r\n }\r\n else if (writePath.contains(treeRoot)) {\r\n relativePath = Path.relativePath(writePath, treeRoot);\r\n compoundWrite = compoundWrite.addWrite(Path.Empty, write.snap.getChild(relativePath));\r\n }\r\n else {\r\n // There is no overlap between root path and write path, ignore write\r\n }\r\n }\r\n else if (write.children) {\r\n if (treeRoot.contains(writePath)) {\r\n relativePath = Path.relativePath(treeRoot, writePath);\r\n compoundWrite = compoundWrite.addWrites(relativePath, write.children);\r\n }\r\n else if (writePath.contains(treeRoot)) {\r\n relativePath = Path.relativePath(writePath, treeRoot);\r\n if (relativePath.isEmpty()) {\r\n compoundWrite = compoundWrite.addWrites(Path.Empty, write.children);\r\n }\r\n else {\r\n var child = safeGet(write.children, relativePath.getFront());\r\n if (child) {\r\n // There exists a child in this node that matches the root path\r\n var deepNode = child.getChild(relativePath.popFront());\r\n compoundWrite = compoundWrite.addWrite(Path.Empty, deepNode);\r\n }\r\n }\r\n }\r\n else {\r\n // There is no overlap between root path and write path, ignore write\r\n }\r\n }\r\n else {\r\n throw assertionError('WriteRecord should have .snap or .children');\r\n }\r\n }\r\n }\r\n return compoundWrite;\r\n };\r\n return WriteTree;\r\n}());\r\n/**\r\n * A WriteTreeRef wraps a WriteTree and a path, for convenient access to a particular subtree. All of the methods\r\n * just proxy to the underlying WriteTree.\r\n *\r\n * @constructor\r\n */\r\nvar WriteTreeRef = /** @class */ (function () {\r\n /**\r\n * @param {!Path} path\r\n * @param {!WriteTree} writeTree\r\n */\r\n function WriteTreeRef(path, writeTree) {\r\n this.treePath_ = path;\r\n this.writeTree_ = writeTree;\r\n }\r\n /**\r\n * If possible, returns a complete event cache, using the underlying server data if possible. In addition, can be used\r\n * to get a cache that includes hidden writes, and excludes arbitrary writes. Note that customizing the returned node\r\n * can lead to a more expensive calculation.\r\n *\r\n * @param {?Node} completeServerCache\r\n * @param {Array.=} writeIdsToExclude Optional writes to exclude.\r\n * @param {boolean=} includeHiddenWrites Defaults to false, whether or not to layer on writes with visible set to false\r\n * @return {?Node}\r\n */\r\n WriteTreeRef.prototype.calcCompleteEventCache = function (completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n return this.writeTree_.calcCompleteEventCache(this.treePath_, completeServerCache, writeIdsToExclude, includeHiddenWrites);\r\n };\r\n /**\r\n * If possible, returns a children node containing all of the complete children we have data for. The returned data is a\r\n * mix of the given server data and write data.\r\n *\r\n * @param {?ChildrenNode} completeServerChildren\r\n * @return {!ChildrenNode}\r\n */\r\n WriteTreeRef.prototype.calcCompleteEventChildren = function (completeServerChildren) {\r\n return this.writeTree_.calcCompleteEventChildren(this.treePath_, completeServerChildren);\r\n };\r\n /**\r\n * Given that either the underlying server data has updated or the outstanding writes have updated, determine what,\r\n * if anything, needs to be applied to the event cache.\r\n *\r\n * Possibilities:\r\n *\r\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\r\n *\r\n * 2. Some write is completely shadowing. No events to be raised\r\n *\r\n * 3. Is partially shadowed. Events should be raised\r\n *\r\n * Either existingEventSnap or existingServerSnap must exist, this is validated via an assert\r\n *\r\n * @param {!Path} path\r\n * @param {?Node} existingEventSnap\r\n * @param {?Node} existingServerSnap\r\n * @return {?Node}\r\n */\r\n WriteTreeRef.prototype.calcEventCacheAfterServerOverwrite = function (path, existingEventSnap, existingServerSnap) {\r\n return this.writeTree_.calcEventCacheAfterServerOverwrite(this.treePath_, path, existingEventSnap, existingServerSnap);\r\n };\r\n /**\r\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\r\n * a higher path, this will return the child of that write relative to the write and this path.\r\n * Returns null if there is no write at this path.\r\n *\r\n * @param {!Path} path\r\n * @return {?Node}\r\n */\r\n WriteTreeRef.prototype.shadowingWrite = function (path) {\r\n return this.writeTree_.shadowingWrite(this.treePath_.child(path));\r\n };\r\n /**\r\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\r\n * the window, but may now be in the window\r\n *\r\n * @param {?Node} completeServerData\r\n * @param {!NamedNode} startPost\r\n * @param {!number} count\r\n * @param {boolean} reverse\r\n * @param {!Index} index\r\n * @return {!Array.}\r\n */\r\n WriteTreeRef.prototype.calcIndexedSlice = function (completeServerData, startPost, count, reverse, index) {\r\n return this.writeTree_.calcIndexedSlice(this.treePath_, completeServerData, startPost, count, reverse, index);\r\n };\r\n /**\r\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\r\n * complete child for this ChildKey.\r\n *\r\n * @param {!string} childKey\r\n * @param {!CacheNode} existingServerCache\r\n * @return {?Node}\r\n */\r\n WriteTreeRef.prototype.calcCompleteChild = function (childKey, existingServerCache) {\r\n return this.writeTree_.calcCompleteChild(this.treePath_, childKey, existingServerCache);\r\n };\r\n /**\r\n * Return a WriteTreeRef for a child.\r\n *\r\n * @param {string} childName\r\n * @return {!WriteTreeRef}\r\n */\r\n WriteTreeRef.prototype.child = function (childName) {\r\n return new WriteTreeRef(this.treePath_.child(childName), this.writeTree_);\r\n };\r\n return WriteTreeRef;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * SyncTree is the central class for managing event callback registration, data caching, views\r\n * (query processing), and event generation. There are typically two SyncTree instances for\r\n * each Repo, one for the normal Firebase data, and one for the .info data.\r\n *\r\n * It has a number of responsibilities, including:\r\n * - Tracking all user event callbacks (registered via addEventRegistration() and removeEventRegistration()).\r\n * - Applying and caching data changes for user set(), transaction(), and update() calls\r\n * (applyUserOverwrite(), applyUserMerge()).\r\n * - Applying and caching data changes for server data changes (applyServerOverwrite(),\r\n * applyServerMerge()).\r\n * - Generating user-facing events for server and user changes (all of the apply* methods\r\n * return the set of events that need to be raised as a result).\r\n * - Maintaining the appropriate set of server listens to ensure we are always subscribed\r\n * to the correct set of paths and queries to satisfy the current set of user event\r\n * callbacks (listens are started/stopped using the provided listenProvider).\r\n *\r\n * NOTE: Although SyncTree tracks event callbacks and calculates events to raise, the actual\r\n * events are returned to the caller rather than raised synchronously.\r\n *\r\n * @constructor\r\n */\r\nvar SyncTree = /** @class */ (function () {\r\n /**\r\n * @param {!ListenProvider} listenProvider_ Used by SyncTree to start / stop listening\r\n * to server data.\r\n */\r\n function SyncTree(listenProvider_) {\r\n this.listenProvider_ = listenProvider_;\r\n /**\r\n * Tree of SyncPoints. There's a SyncPoint at any location that has 1 or more views.\r\n * @type {!ImmutableTree.}\r\n * @private\r\n */\r\n this.syncPointTree_ = ImmutableTree.Empty;\r\n /**\r\n * A tree of all pending user writes (user-initiated set()'s, transaction()'s, update()'s, etc.).\r\n * @type {!WriteTree}\r\n * @private\r\n */\r\n this.pendingWriteTree_ = new WriteTree();\r\n this.tagToQueryMap_ = {};\r\n this.queryToTagMap_ = {};\r\n }\r\n /**\r\n * Apply the data changes for a user-generated set() or transaction() call.\r\n *\r\n * @param {!Path} path\r\n * @param {!Node} newData\r\n * @param {number} writeId\r\n * @param {boolean=} visible\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyUserOverwrite = function (path, newData, writeId, visible) {\r\n // Record pending write.\r\n this.pendingWriteTree_.addOverwrite(path, newData, writeId, visible);\r\n if (!visible) {\r\n return [];\r\n }\r\n else {\r\n return this.applyOperationToSyncPoints_(new Overwrite(OperationSource.User, path, newData));\r\n }\r\n };\r\n /**\r\n * Apply the data from a user-generated update() call\r\n *\r\n * @param {!Path} path\r\n * @param {!Object.} changedChildren\r\n * @param {!number} writeId\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyUserMerge = function (path, changedChildren, writeId) {\r\n // Record pending merge.\r\n this.pendingWriteTree_.addMerge(path, changedChildren, writeId);\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n return this.applyOperationToSyncPoints_(new Merge(OperationSource.User, path, changeTree));\r\n };\r\n /**\r\n * Acknowledge a pending user write that was previously registered with applyUserOverwrite() or applyUserMerge().\r\n *\r\n * @param {!number} writeId\r\n * @param {boolean=} revert True if the given write failed and needs to be reverted\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.ackUserWrite = function (writeId, revert) {\r\n if (revert === void 0) { revert = false; }\r\n var write = this.pendingWriteTree_.getWrite(writeId);\r\n var needToReevaluate = this.pendingWriteTree_.removeWrite(writeId);\r\n if (!needToReevaluate) {\r\n return [];\r\n }\r\n else {\r\n var affectedTree_1 = ImmutableTree.Empty;\r\n if (write.snap != null) {\r\n // overwrite\r\n affectedTree_1 = affectedTree_1.set(Path.Empty, true);\r\n }\r\n else {\r\n forEach(write.children, function (pathString, node) {\r\n affectedTree_1 = affectedTree_1.set(new Path(pathString), node);\r\n });\r\n }\r\n return this.applyOperationToSyncPoints_(new AckUserWrite(write.path, affectedTree_1, revert));\r\n }\r\n };\r\n /**\r\n * Apply new server data for the specified path..\r\n *\r\n * @param {!Path} path\r\n * @param {!Node} newData\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyServerOverwrite = function (path, newData) {\r\n return this.applyOperationToSyncPoints_(new Overwrite(OperationSource.Server, path, newData));\r\n };\r\n /**\r\n * Apply new server data to be merged in at the specified path.\r\n *\r\n * @param {!Path} path\r\n * @param {!Object.} changedChildren\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyServerMerge = function (path, changedChildren) {\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n return this.applyOperationToSyncPoints_(new Merge(OperationSource.Server, path, changeTree));\r\n };\r\n /**\r\n * Apply a listen complete for a query\r\n *\r\n * @param {!Path} path\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyListenComplete = function (path) {\r\n return this.applyOperationToSyncPoints_(new ListenComplete(OperationSource.Server, path));\r\n };\r\n /**\r\n * Apply new server data for the specified tagged query.\r\n *\r\n * @param {!Path} path\r\n * @param {!Node} snap\r\n * @param {!number} tag\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyTaggedQueryOverwrite = function (path, snap, tag) {\r\n var queryKey = this.queryKeyForTag_(tag);\r\n if (queryKey != null) {\r\n var r = SyncTree.parseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = Path.relativePath(queryPath, path);\r\n var op = new Overwrite(OperationSource.forServerTaggedQuery(queryId), relativePath, snap);\r\n return this.applyTaggedOperation_(queryPath, op);\r\n }\r\n else {\r\n // Query must have been removed already\r\n return [];\r\n }\r\n };\r\n /**\r\n * Apply server data to be merged in for the specified tagged query.\r\n *\r\n * @param {!Path} path\r\n * @param {!Object.} changedChildren\r\n * @param {!number} tag\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyTaggedQueryMerge = function (path, changedChildren, tag) {\r\n var queryKey = this.queryKeyForTag_(tag);\r\n if (queryKey) {\r\n var r = SyncTree.parseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = Path.relativePath(queryPath, path);\r\n var changeTree = ImmutableTree.fromObject(changedChildren);\r\n var op = new Merge(OperationSource.forServerTaggedQuery(queryId), relativePath, changeTree);\r\n return this.applyTaggedOperation_(queryPath, op);\r\n }\r\n else {\r\n // We've already removed the query. No big deal, ignore the update\r\n return [];\r\n }\r\n };\r\n /**\r\n * Apply a listen complete for a tagged query\r\n *\r\n * @param {!Path} path\r\n * @param {!number} tag\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.applyTaggedListenComplete = function (path, tag) {\r\n var queryKey = this.queryKeyForTag_(tag);\r\n if (queryKey) {\r\n var r = SyncTree.parseQueryKey_(queryKey);\r\n var queryPath = r.path, queryId = r.queryId;\r\n var relativePath = Path.relativePath(queryPath, path);\r\n var op = new ListenComplete(OperationSource.forServerTaggedQuery(queryId), relativePath);\r\n return this.applyTaggedOperation_(queryPath, op);\r\n }\r\n else {\r\n // We've already removed the query. No big deal, ignore the update\r\n return [];\r\n }\r\n };\r\n /**\r\n * Add an event callback for the specified query.\r\n *\r\n * @param {!Query} query\r\n * @param {!EventRegistration} eventRegistration\r\n * @return {!Array.} Events to raise.\r\n */\r\n SyncTree.prototype.addEventRegistration = function (query, eventRegistration) {\r\n var path = query.path;\r\n var serverCache = null;\r\n var foundAncestorDefaultView = false;\r\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\r\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\r\n this.syncPointTree_.foreachOnPath(path, function (pathToSyncPoint, sp) {\r\n var relativePath = Path.relativePath(pathToSyncPoint, path);\r\n serverCache = serverCache || sp.getCompleteServerCache(relativePath);\r\n foundAncestorDefaultView =\r\n foundAncestorDefaultView || sp.hasCompleteView();\r\n });\r\n var syncPoint = this.syncPointTree_.get(path);\r\n if (!syncPoint) {\r\n syncPoint = new SyncPoint();\r\n this.syncPointTree_ = this.syncPointTree_.set(path, syncPoint);\r\n }\r\n else {\r\n foundAncestorDefaultView =\r\n foundAncestorDefaultView || syncPoint.hasCompleteView();\r\n serverCache = serverCache || syncPoint.getCompleteServerCache(Path.Empty);\r\n }\r\n var serverCacheComplete;\r\n if (serverCache != null) {\r\n serverCacheComplete = true;\r\n }\r\n else {\r\n serverCacheComplete = false;\r\n serverCache = ChildrenNode.EMPTY_NODE;\r\n var subtree = this.syncPointTree_.subtree(path);\r\n subtree.foreachChild(function (childName, childSyncPoint) {\r\n var completeCache = childSyncPoint.getCompleteServerCache(Path.Empty);\r\n if (completeCache) {\r\n serverCache = serverCache.updateImmediateChild(childName, completeCache);\r\n }\r\n });\r\n }\r\n var viewAlreadyExists = syncPoint.viewExistsForQuery(query);\r\n if (!viewAlreadyExists && !query.getQueryParams().loadsAllData()) {\r\n // We need to track a tag for this query\r\n var queryKey = SyncTree.makeQueryKey_(query);\r\n assert(!(queryKey in this.queryToTagMap_), 'View does not exist, but we have a tag');\r\n var tag = SyncTree.getNextQueryTag_();\r\n this.queryToTagMap_[queryKey] = tag;\r\n // Coerce to string to avoid sparse arrays.\r\n this.tagToQueryMap_['_' + tag] = queryKey;\r\n }\r\n var writesCache = this.pendingWriteTree_.childWrites(path);\r\n var events = syncPoint.addEventRegistration(query, eventRegistration, writesCache, serverCache, serverCacheComplete);\r\n if (!viewAlreadyExists && !foundAncestorDefaultView) {\r\n var view /** @type !View */ = syncPoint.viewForQuery(query);\r\n events = events.concat(this.setupListener_(query, view));\r\n }\r\n return events;\r\n };\r\n /**\r\n * Remove event callback(s).\r\n *\r\n * If query is the default query, we'll check all queries for the specified eventRegistration.\r\n * If eventRegistration is null, we'll remove all callbacks for the specified query/queries.\r\n *\r\n * @param {!Query} query\r\n * @param {?EventRegistration} eventRegistration If null, all callbacks are removed.\r\n * @param {Error=} cancelError If a cancelError is provided, appropriate cancel events will be returned.\r\n * @return {!Array.} Cancel events, if cancelError was provided.\r\n */\r\n SyncTree.prototype.removeEventRegistration = function (query, eventRegistration, cancelError) {\r\n var _this = this;\r\n // Find the syncPoint first. Then deal with whether or not it has matching listeners\r\n var path = query.path;\r\n var maybeSyncPoint = this.syncPointTree_.get(path);\r\n var cancelEvents = [];\r\n // A removal on a default query affects all queries at that location. A removal on an indexed query, even one without\r\n // other query constraints, does *not* affect all queries at that location. So this check must be for 'default', and\r\n // not loadsAllData().\r\n if (maybeSyncPoint &&\r\n (query.queryIdentifier() === 'default' ||\r\n maybeSyncPoint.viewExistsForQuery(query))) {\r\n /**\r\n * @type {{removed: !Array., events: !Array.}}\r\n */\r\n var removedAndEvents = maybeSyncPoint.removeEventRegistration(query, eventRegistration, cancelError);\r\n if (maybeSyncPoint.isEmpty()) {\r\n this.syncPointTree_ = this.syncPointTree_.remove(path);\r\n }\r\n var removed = removedAndEvents.removed;\r\n cancelEvents = removedAndEvents.events;\r\n // We may have just removed one of many listeners and can short-circuit this whole process\r\n // We may also not have removed a default listener, in which case all of the descendant listeners should already be\r\n // properly set up.\r\n //\r\n // Since indexed queries can shadow if they don't have other query constraints, check for loadsAllData(), instead of\r\n // queryId === 'default'\r\n var removingDefault = -1 !==\r\n removed.findIndex(function (query) {\r\n return query.getQueryParams().loadsAllData();\r\n });\r\n var covered = this.syncPointTree_.findOnPath(path, function (relativePath, parentSyncPoint) {\r\n return parentSyncPoint.hasCompleteView();\r\n });\r\n if (removingDefault && !covered) {\r\n var subtree = this.syncPointTree_.subtree(path);\r\n // There are potentially child listeners. Determine what if any listens we need to send before executing the\r\n // removal\r\n if (!subtree.isEmpty()) {\r\n // We need to fold over our subtree and collect the listeners to send\r\n var newViews = this.collectDistinctViewsForSubTree_(subtree);\r\n // Ok, we've collected all the listens we need. Set them up.\r\n for (var i = 0; i < newViews.length; ++i) {\r\n var view = newViews[i], newQuery = view.getQuery();\r\n var listener = this.createListenerForView_(view);\r\n this.listenProvider_.startListening(SyncTree.queryForListening_(newQuery), this.tagForQuery_(newQuery), listener.hashFn, listener.onComplete);\r\n }\r\n }\r\n else {\r\n // There's nothing below us, so nothing we need to start listening on\r\n }\r\n }\r\n // If we removed anything and we're not covered by a higher up listen, we need to stop listening on this query\r\n // The above block has us covered in terms of making sure we're set up on listens lower in the tree.\r\n // Also, note that if we have a cancelError, it's already been removed at the provider level.\r\n if (!covered && removed.length > 0 && !cancelError) {\r\n // If we removed a default, then we weren't listening on any of the other queries here. Just cancel the one\r\n // default. Otherwise, we need to iterate through and cancel each individual query\r\n if (removingDefault) {\r\n // We don't tag default listeners\r\n var defaultTag = null;\r\n this.listenProvider_.stopListening(SyncTree.queryForListening_(query), defaultTag);\r\n }\r\n else {\r\n removed.forEach(function (queryToRemove) {\r\n var tagToRemove = _this.queryToTagMap_[SyncTree.makeQueryKey_(queryToRemove)];\r\n _this.listenProvider_.stopListening(SyncTree.queryForListening_(queryToRemove), tagToRemove);\r\n });\r\n }\r\n }\r\n // Now, clear all of the tags we're tracking for the removed listens\r\n this.removeTags_(removed);\r\n }\r\n else {\r\n // No-op, this listener must've been already removed\r\n }\r\n return cancelEvents;\r\n };\r\n /**\r\n * Returns a complete cache, if we have one, of the data at a particular path. The location must have a listener above\r\n * it, but as this is only used by transaction code, that should always be the case anyways.\r\n *\r\n * Note: this method will *include* hidden writes from transaction with applyLocally set to false.\r\n * @param {!Path} path The path to the data we want\r\n * @param {Array.=} writeIdsToExclude A specific set to be excluded\r\n * @return {?Node}\r\n */\r\n SyncTree.prototype.calcCompleteEventCache = function (path, writeIdsToExclude) {\r\n var includeHiddenSets = true;\r\n var writeTree = this.pendingWriteTree_;\r\n var serverCache = this.syncPointTree_.findOnPath(path, function (pathSoFar, syncPoint) {\r\n var relativePath = Path.relativePath(pathSoFar, path);\r\n var serverCache = syncPoint.getCompleteServerCache(relativePath);\r\n if (serverCache) {\r\n return serverCache;\r\n }\r\n });\r\n return writeTree.calcCompleteEventCache(path, serverCache, writeIdsToExclude, includeHiddenSets);\r\n };\r\n /**\r\n * This collapses multiple unfiltered views into a single view, since we only need a single\r\n * listener for them.\r\n *\r\n * @param {!ImmutableTree.} subtree\r\n * @return {!Array.}\r\n * @private\r\n */\r\n SyncTree.prototype.collectDistinctViewsForSubTree_ = function (subtree) {\r\n return subtree.fold(function (relativePath, maybeChildSyncPoint, childMap) {\r\n if (maybeChildSyncPoint && maybeChildSyncPoint.hasCompleteView()) {\r\n var completeView = maybeChildSyncPoint.getCompleteView();\r\n return [completeView];\r\n }\r\n else {\r\n // No complete view here, flatten any deeper listens into an array\r\n var views_1 = [];\r\n if (maybeChildSyncPoint) {\r\n views_1 = maybeChildSyncPoint.getQueryViews();\r\n }\r\n forEach(childMap, function (key, childViews) {\r\n views_1 = views_1.concat(childViews);\r\n });\r\n return views_1;\r\n }\r\n });\r\n };\r\n /**\r\n * @param {!Array.} queries\r\n * @private\r\n */\r\n SyncTree.prototype.removeTags_ = function (queries) {\r\n for (var j = 0; j < queries.length; ++j) {\r\n var removedQuery = queries[j];\r\n if (!removedQuery.getQueryParams().loadsAllData()) {\r\n // We should have a tag for this\r\n var removedQueryKey = SyncTree.makeQueryKey_(removedQuery);\r\n var removedQueryTag = this.queryToTagMap_[removedQueryKey];\r\n delete this.queryToTagMap_[removedQueryKey];\r\n delete this.tagToQueryMap_['_' + removedQueryTag];\r\n }\r\n }\r\n };\r\n /**\r\n * Normalizes a query to a query we send the server for listening\r\n * @param {!Query} query\r\n * @return {!Query} The normalized query\r\n * @private\r\n */\r\n SyncTree.queryForListening_ = function (query) {\r\n if (query.getQueryParams().loadsAllData() &&\r\n !query.getQueryParams().isDefault()) {\r\n // We treat queries that load all data as default queries\r\n // Cast is necessary because ref() technically returns Firebase which is actually fb.api.Firebase which inherits\r\n // from Query\r\n return /** @type {!Query} */ query.getRef();\r\n }\r\n else {\r\n return query;\r\n }\r\n };\r\n /**\r\n * For a given new listen, manage the de-duplication of outstanding subscriptions.\r\n *\r\n * @param {!Query} query\r\n * @param {!View} view\r\n * @return {!Array.} This method can return events to support synchronous data sources\r\n * @private\r\n */\r\n SyncTree.prototype.setupListener_ = function (query, view) {\r\n var path = query.path;\r\n var tag = this.tagForQuery_(query);\r\n var listener = this.createListenerForView_(view);\r\n var events = this.listenProvider_.startListening(SyncTree.queryForListening_(query), tag, listener.hashFn, listener.onComplete);\r\n var subtree = this.syncPointTree_.subtree(path);\r\n // The root of this subtree has our query. We're here because we definitely need to send a listen for that, but we\r\n // may need to shadow other listens as well.\r\n if (tag) {\r\n assert(!subtree.value.hasCompleteView(), \"If we're adding a query, it shouldn't be shadowed\");\r\n }\r\n else {\r\n // Shadow everything at or below this location, this is a default listener.\r\n var queriesToStop = subtree.fold(function (relativePath, maybeChildSyncPoint, childMap) {\r\n if (!relativePath.isEmpty() &&\r\n maybeChildSyncPoint &&\r\n maybeChildSyncPoint.hasCompleteView()) {\r\n return [maybeChildSyncPoint.getCompleteView().getQuery()];\r\n }\r\n else {\r\n // No default listener here, flatten any deeper queries into an array\r\n var queries_1 = [];\r\n if (maybeChildSyncPoint) {\r\n queries_1 = queries_1.concat(maybeChildSyncPoint.getQueryViews().map(function (view) { return view.getQuery(); }));\r\n }\r\n forEach(childMap, function (key, childQueries) {\r\n queries_1 = queries_1.concat(childQueries);\r\n });\r\n return queries_1;\r\n }\r\n });\r\n for (var i = 0; i < queriesToStop.length; ++i) {\r\n var queryToStop = queriesToStop[i];\r\n this.listenProvider_.stopListening(SyncTree.queryForListening_(queryToStop), this.tagForQuery_(queryToStop));\r\n }\r\n }\r\n return events;\r\n };\r\n /**\r\n *\r\n * @param {!View} view\r\n * @return {{hashFn: function(), onComplete: function(!string, *)}}\r\n * @private\r\n */\r\n SyncTree.prototype.createListenerForView_ = function (view) {\r\n var _this = this;\r\n var query = view.getQuery();\r\n var tag = this.tagForQuery_(query);\r\n return {\r\n hashFn: function () {\r\n var cache = view.getServerCache() || ChildrenNode.EMPTY_NODE;\r\n return cache.hash();\r\n },\r\n onComplete: function (status) {\r\n if (status === 'ok') {\r\n if (tag) {\r\n return _this.applyTaggedListenComplete(query.path, tag);\r\n }\r\n else {\r\n return _this.applyListenComplete(query.path);\r\n }\r\n }\r\n else {\r\n // If a listen failed, kill all of the listeners here, not just the one that triggered the error.\r\n // Note that this may need to be scoped to just this listener if we change permissions on filtered children\r\n var error$$1 = errorForServerCode(status, query);\r\n return _this.removeEventRegistration(query, \r\n /*eventRegistration*/ null, error$$1);\r\n }\r\n }\r\n };\r\n };\r\n /**\r\n * Given a query, computes a \"queryKey\" suitable for use in our queryToTagMap_.\r\n * @private\r\n * @param {!Query} query\r\n * @return {string}\r\n */\r\n SyncTree.makeQueryKey_ = function (query) {\r\n return query.path.toString() + '$' + query.queryIdentifier();\r\n };\r\n /**\r\n * Given a queryKey (created by makeQueryKey), parse it back into a path and queryId.\r\n * @private\r\n * @param {!string} queryKey\r\n * @return {{queryId: !string, path: !Path}}\r\n */\r\n SyncTree.parseQueryKey_ = function (queryKey) {\r\n var splitIndex = queryKey.indexOf('$');\r\n assert(splitIndex !== -1 && splitIndex < queryKey.length - 1, 'Bad queryKey.');\r\n return {\r\n queryId: queryKey.substr(splitIndex + 1),\r\n path: new Path(queryKey.substr(0, splitIndex))\r\n };\r\n };\r\n /**\r\n * Return the query associated with the given tag, if we have one\r\n * @param {!number} tag\r\n * @return {?string}\r\n * @private\r\n */\r\n SyncTree.prototype.queryKeyForTag_ = function (tag) {\r\n return this.tagToQueryMap_['_' + tag];\r\n };\r\n /**\r\n * Return the tag associated with the given query.\r\n * @param {!Query} query\r\n * @return {?number}\r\n * @private\r\n */\r\n SyncTree.prototype.tagForQuery_ = function (query) {\r\n var queryKey = SyncTree.makeQueryKey_(query);\r\n return safeGet(this.queryToTagMap_, queryKey);\r\n };\r\n /**\r\n * Static accessor for query tags.\r\n * @return {number}\r\n * @private\r\n */\r\n SyncTree.getNextQueryTag_ = function () {\r\n return SyncTree.nextQueryTag_++;\r\n };\r\n /**\r\n * A helper method to apply tagged operations\r\n *\r\n * @param {!Path} queryPath\r\n * @param {!Operation} operation\r\n * @return {!Array.}\r\n * @private\r\n */\r\n SyncTree.prototype.applyTaggedOperation_ = function (queryPath, operation) {\r\n var syncPoint = this.syncPointTree_.get(queryPath);\r\n assert(syncPoint, \"Missing sync point for query tag that we're tracking\");\r\n var writesCache = this.pendingWriteTree_.childWrites(queryPath);\r\n return syncPoint.applyOperation(operation, writesCache, \r\n /*serverCache=*/ null);\r\n };\r\n /**\r\n * A helper method that visits all descendant and ancestor SyncPoints, applying the operation.\r\n *\r\n * NOTES:\r\n * - Descendant SyncPoints will be visited first (since we raise events depth-first).\r\n \n * - We call applyOperation() on each SyncPoint passing three things:\r\n * 1. A version of the Operation that has been made relative to the SyncPoint location.\r\n * 2. A WriteTreeRef of any writes we have cached at the SyncPoint location.\r\n * 3. A snapshot Node with cached server data, if we have it.\r\n \n * - We concatenate all of the events returned by each SyncPoint and return the result.\r\n *\r\n * @param {!Operation} operation\r\n * @return {!Array.}\r\n * @private\r\n */\r\n SyncTree.prototype.applyOperationToSyncPoints_ = function (operation) {\r\n return this.applyOperationHelper_(operation, this.syncPointTree_, \r\n /*serverCache=*/ null, this.pendingWriteTree_.childWrites(Path.Empty));\r\n };\r\n /**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n *\r\n * @private\r\n * @param {!Operation} operation\r\n * @param {ImmutableTree.} syncPointTree\r\n * @param {?Node} serverCache\r\n * @param {!WriteTreeRef} writesCache\r\n * @return {!Array.}\r\n */\r\n SyncTree.prototype.applyOperationHelper_ = function (operation, syncPointTree, serverCache, writesCache) {\r\n if (operation.path.isEmpty()) {\r\n return this.applyOperationDescendantsHelper_(operation, syncPointTree, serverCache, writesCache);\r\n }\r\n else {\r\n var syncPoint = syncPointTree.get(Path.Empty);\r\n // If we don't have cached server data, see if we can get it from this SyncPoint.\r\n if (serverCache == null && syncPoint != null) {\r\n serverCache = syncPoint.getCompleteServerCache(Path.Empty);\r\n }\r\n var events = [];\r\n var childName = operation.path.getFront();\r\n var childOperation = operation.operationForChild(childName);\r\n var childTree = syncPointTree.children.get(childName);\r\n if (childTree && childOperation) {\r\n var childServerCache = serverCache\r\n ? serverCache.getImmediateChild(childName)\r\n : null;\r\n var childWritesCache = writesCache.child(childName);\r\n events = events.concat(this.applyOperationHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n }\r\n if (syncPoint) {\r\n events = events.concat(syncPoint.applyOperation(operation, writesCache, serverCache));\r\n }\r\n return events;\r\n }\r\n };\r\n /**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n *\r\n * @private\r\n * @param {!Operation} operation\r\n * @param {ImmutableTree.} syncPointTree\r\n * @param {?Node} serverCache\r\n * @param {!WriteTreeRef} writesCache\r\n * @return {!Array.}\r\n */\r\n SyncTree.prototype.applyOperationDescendantsHelper_ = function (operation, syncPointTree, serverCache, writesCache) {\r\n var _this = this;\r\n var syncPoint = syncPointTree.get(Path.Empty);\r\n // If we don't have cached server data, see if we can get it from this SyncPoint.\r\n if (serverCache == null && syncPoint != null) {\r\n serverCache = syncPoint.getCompleteServerCache(Path.Empty);\r\n }\r\n var events = [];\r\n syncPointTree.children.inorderTraversal(function (childName, childTree) {\r\n var childServerCache = serverCache\r\n ? serverCache.getImmediateChild(childName)\r\n : null;\r\n var childWritesCache = writesCache.child(childName);\r\n var childOperation = operation.operationForChild(childName);\r\n if (childOperation) {\r\n events = events.concat(_this.applyOperationDescendantsHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n }\r\n });\r\n if (syncPoint) {\r\n events = events.concat(syncPoint.applyOperation(operation, writesCache, serverCache));\r\n }\r\n return events;\r\n };\r\n /**\r\n * Static tracker for next query tag.\r\n * @type {number}\r\n * @private\r\n */\r\n SyncTree.nextQueryTag_ = 1;\r\n return SyncTree;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Mutable object which basically just stores a reference to the \"latest\" immutable snapshot.\r\n *\r\n * @constructor\r\n */\r\nvar SnapshotHolder = /** @class */ (function () {\r\n function SnapshotHolder() {\r\n this.rootNode_ = ChildrenNode.EMPTY_NODE;\r\n }\r\n SnapshotHolder.prototype.getNode = function (path) {\r\n return this.rootNode_.getChild(path);\r\n };\r\n SnapshotHolder.prototype.updateSnapshot = function (path, newSnapshotNode) {\r\n this.rootNode_ = this.rootNode_.updateChild(path, newSnapshotNode);\r\n };\r\n return SnapshotHolder;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Abstraction around FirebaseApp's token fetching capabilities.\r\n */\r\nvar AuthTokenProvider = /** @class */ (function () {\r\n /**\r\n * @param {!FirebaseApp} app_\r\n */\r\n function AuthTokenProvider(app_) {\r\n this.app_ = app_;\r\n }\r\n /**\r\n * @param {boolean} forceRefresh\r\n * @return {!Promise}\r\n */\r\n AuthTokenProvider.prototype.getToken = function (forceRefresh) {\r\n return this.app_['INTERNAL']['getToken'](forceRefresh).then(null, \r\n // .catch\r\n function (error$$1) {\r\n // TODO: Need to figure out all the cases this is raised and whether\r\n // this makes sense.\r\n if (error$$1 && error$$1.code === 'auth/token-not-initialized') {\r\n log('Got auth/token-not-initialized error. Treating as null token.');\r\n return null;\r\n }\r\n else {\r\n return Promise.reject(error$$1);\r\n }\r\n });\r\n };\r\n AuthTokenProvider.prototype.addTokenChangeListener = function (listener) {\r\n // TODO: We might want to wrap the listener and call it with no args to\r\n // avoid a leaky abstraction, but that makes removing the listener harder.\r\n this.app_['INTERNAL']['addAuthTokenListener'](listener);\r\n };\r\n AuthTokenProvider.prototype.removeTokenChangeListener = function (listener) {\r\n this.app_['INTERNAL']['removeAuthTokenListener'](listener);\r\n };\r\n AuthTokenProvider.prototype.notifyForInvalidToken = function () {\r\n var errorMessage = 'Provided authentication credentials for the app named \"' +\r\n this.app_.name +\r\n '\" are invalid. This usually indicates your app was not ' +\r\n 'initialized correctly. ';\r\n if ('credential' in this.app_.options) {\r\n errorMessage +=\r\n 'Make sure the \"credential\" property provided to initializeApp() ' +\r\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\r\n 'project.';\r\n }\r\n else if ('serviceAccount' in this.app_.options) {\r\n errorMessage +=\r\n 'Make sure the \"serviceAccount\" property provided to initializeApp() ' +\r\n 'is authorized to access the specified \"databaseURL\" and is from the correct ' +\r\n 'project.';\r\n }\r\n else {\r\n errorMessage +=\r\n 'Make sure the \"apiKey\" and \"databaseURL\" properties provided to ' +\r\n 'initializeApp() match the values provided for your app at ' +\r\n 'https://console.firebase.google.com/.';\r\n }\r\n warn(errorMessage);\r\n };\r\n return AuthTokenProvider;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Tracks a collection of stats.\r\n *\r\n * @constructor\r\n */\r\nvar StatsCollection = /** @class */ (function () {\r\n function StatsCollection() {\r\n this.counters_ = {};\r\n }\r\n StatsCollection.prototype.incrementCounter = function (name, amount) {\r\n if (amount === void 0) { amount = 1; }\r\n if (!contains(this.counters_, name))\r\n this.counters_[name] = 0;\r\n this.counters_[name] += amount;\r\n };\r\n StatsCollection.prototype.get = function () {\r\n return deepCopy(this.counters_);\r\n };\r\n return StatsCollection;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar StatsManager = /** @class */ (function () {\r\n function StatsManager() {\r\n }\r\n StatsManager.getCollection = function (repoInfo) {\r\n var hashString = repoInfo.toString();\r\n if (!this.collections_[hashString]) {\r\n this.collections_[hashString] = new StatsCollection();\r\n }\r\n return this.collections_[hashString];\r\n };\r\n StatsManager.getOrCreateReporter = function (repoInfo, creatorFunction) {\r\n var hashString = repoInfo.toString();\r\n if (!this.reporters_[hashString]) {\r\n this.reporters_[hashString] = creatorFunction();\r\n }\r\n return this.reporters_[hashString];\r\n };\r\n StatsManager.collections_ = {};\r\n StatsManager.reporters_ = {};\r\n return StatsManager;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns the delta from the previous call to get stats.\r\n *\r\n * @param collection_ The collection to \"listen\" to.\r\n * @constructor\r\n */\r\nvar StatsListener = /** @class */ (function () {\r\n function StatsListener(collection_) {\r\n this.collection_ = collection_;\r\n this.last_ = null;\r\n }\r\n StatsListener.prototype.get = function () {\r\n var newStats = this.collection_.get();\r\n var delta = clone(newStats);\r\n if (this.last_) {\r\n forEach(this.last_, function (stat, value) {\r\n delta[stat] = delta[stat] - value;\r\n });\r\n }\r\n this.last_ = newStats;\r\n return delta;\r\n };\r\n return StatsListener;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Assuming some apps may have a short amount of time on page, and a bulk of firebase operations probably\r\n// happen on page load, we try to report our first set of stats pretty quickly, but we wait at least 10\r\n// seconds to try to ensure the Firebase connection is established / settled.\r\nvar FIRST_STATS_MIN_TIME = 10 * 1000;\r\nvar FIRST_STATS_MAX_TIME = 30 * 1000;\r\n// We'll continue to report stats on average every 5 minutes.\r\nvar REPORT_STATS_INTERVAL = 5 * 60 * 1000;\r\n/**\r\n * @constructor\r\n */\r\nvar StatsReporter = /** @class */ (function () {\r\n /**\r\n * @param collection\r\n * @param server_\r\n */\r\n function StatsReporter(collection, server_) {\r\n this.server_ = server_;\r\n this.statsToReport_ = {};\r\n this.statsListener_ = new StatsListener(collection);\r\n var timeout = FIRST_STATS_MIN_TIME +\r\n (FIRST_STATS_MAX_TIME - FIRST_STATS_MIN_TIME) * Math.random();\r\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(timeout));\r\n }\r\n StatsReporter.prototype.includeStat = function (stat) {\r\n this.statsToReport_[stat] = true;\r\n };\r\n StatsReporter.prototype.reportStats_ = function () {\r\n var _this = this;\r\n var stats = this.statsListener_.get();\r\n var reportedStats = {};\r\n var haveStatsToReport = false;\r\n forEach(stats, function (stat, value) {\r\n if (value > 0 && contains(_this.statsToReport_, stat)) {\r\n reportedStats[stat] = value;\r\n haveStatsToReport = true;\r\n }\r\n });\r\n if (haveStatsToReport) {\r\n this.server_.reportStats(reportedStats);\r\n }\r\n // queue our next run.\r\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(Math.random() * 2 * REPORT_STATS_INTERVAL));\r\n };\r\n return StatsReporter;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * The event queue serves a few purposes:\r\n * 1. It ensures we maintain event order in the face of event callbacks doing operations that result in more\r\n * events being queued.\r\n * 2. raiseQueuedEvents() handles being called reentrantly nicely. That is, if in the course of raising events,\r\n * raiseQueuedEvents() is called again, the \"inner\" call will pick up raising events where the \"outer\" call\r\n * left off, ensuring that the events are still raised synchronously and in order.\r\n * 3. You can use raiseEventsAtPath and raiseEventsForChangedPath to ensure only relevant previously-queued\r\n * events are raised synchronously.\r\n *\r\n * NOTE: This can all go away if/when we move to async events.\r\n *\r\n * @constructor\r\n */\r\nvar EventQueue = /** @class */ (function () {\r\n function EventQueue() {\r\n /**\r\n * @private\r\n * @type {!Array.}\r\n */\r\n this.eventLists_ = [];\r\n /**\r\n * Tracks recursion depth of raiseQueuedEvents_, for debugging purposes.\r\n * @private\r\n * @type {!number}\r\n */\r\n this.recursionDepth_ = 0;\r\n }\r\n /**\r\n * @param {!Array.} eventDataList The new events to queue.\r\n */\r\n EventQueue.prototype.queueEvents = function (eventDataList) {\r\n // We group events by path, storing them in a single EventList, to make it easier to skip over them quickly.\r\n var currList = null;\r\n for (var i = 0; i < eventDataList.length; i++) {\r\n var eventData = eventDataList[i];\r\n var eventPath = eventData.getPath();\r\n if (currList !== null && !eventPath.equals(currList.getPath())) {\r\n this.eventLists_.push(currList);\r\n currList = null;\r\n }\r\n if (currList === null) {\r\n currList = new EventList(eventPath);\r\n }\r\n currList.add(eventData);\r\n }\r\n if (currList) {\r\n this.eventLists_.push(currList);\r\n }\r\n };\r\n /**\r\n * Queues the specified events and synchronously raises all events (including previously queued ones)\r\n * for the specified path.\r\n *\r\n * It is assumed that the new events are all for the specified path.\r\n *\r\n * @param {!Path} path The path to raise events for.\r\n * @param {!Array.} eventDataList The new events to raise.\r\n */\r\n EventQueue.prototype.raiseEventsAtPath = function (path, eventDataList) {\r\n this.queueEvents(eventDataList);\r\n this.raiseQueuedEventsMatchingPredicate_(function (eventPath) {\r\n return eventPath.equals(path);\r\n });\r\n };\r\n /**\r\n * Queues the specified events and synchronously raises all events (including previously queued ones) for\r\n * locations related to the specified change path (i.e. all ancestors and descendants).\r\n *\r\n * It is assumed that the new events are all related (ancestor or descendant) to the specified path.\r\n *\r\n * @param {!Path} changedPath The path to raise events for.\r\n * @param {!Array.} eventDataList The events to raise\r\n */\r\n EventQueue.prototype.raiseEventsForChangedPath = function (changedPath, eventDataList) {\r\n this.queueEvents(eventDataList);\r\n this.raiseQueuedEventsMatchingPredicate_(function (eventPath) {\r\n return eventPath.contains(changedPath) || changedPath.contains(eventPath);\r\n });\r\n };\r\n /**\r\n * @param {!function(!Path):boolean} predicate\r\n * @private\r\n */\r\n EventQueue.prototype.raiseQueuedEventsMatchingPredicate_ = function (predicate) {\r\n this.recursionDepth_++;\r\n var sentAll = true;\r\n for (var i = 0; i < this.eventLists_.length; i++) {\r\n var eventList = this.eventLists_[i];\r\n if (eventList) {\r\n var eventPath = eventList.getPath();\r\n if (predicate(eventPath)) {\r\n this.eventLists_[i].raise();\r\n this.eventLists_[i] = null;\r\n }\r\n else {\r\n sentAll = false;\r\n }\r\n }\r\n }\r\n if (sentAll) {\r\n this.eventLists_ = [];\r\n }\r\n this.recursionDepth_--;\r\n };\r\n return EventQueue;\r\n}());\r\n/**\r\n * @param {!Path} path\r\n * @constructor\r\n */\r\nvar EventList = /** @class */ (function () {\r\n function EventList(path_) {\r\n this.path_ = path_;\r\n /**\r\n * @type {!Array.}\r\n * @private\r\n */\r\n this.events_ = [];\r\n }\r\n /**\r\n * @param {!Event} eventData\r\n */\r\n EventList.prototype.add = function (eventData) {\r\n this.events_.push(eventData);\r\n };\r\n /**\r\n * Iterates through the list and raises each event\r\n */\r\n EventList.prototype.raise = function () {\r\n for (var i = 0; i < this.events_.length; i++) {\r\n var eventData = this.events_[i];\r\n if (eventData !== null) {\r\n this.events_[i] = null;\r\n var eventFn = eventData.getEventRunner();\r\n if (logger) {\r\n log('event: ' + eventData.toString());\r\n }\r\n exceptionGuard(eventFn);\r\n }\r\n }\r\n };\r\n /**\r\n * @return {!Path}\r\n */\r\n EventList.prototype.getPath = function () {\r\n return this.path_;\r\n };\r\n return EventList;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Base class to be used if you want to emit events. Call the constructor with\r\n * the set of allowed event names.\r\n */\r\nvar EventEmitter = /** @class */ (function () {\r\n /**\r\n * @param {!Array.} allowedEvents_\r\n */\r\n function EventEmitter(allowedEvents_) {\r\n this.allowedEvents_ = allowedEvents_;\r\n this.listeners_ = {};\r\n assert(Array.isArray(allowedEvents_) && allowedEvents_.length > 0, 'Requires a non-empty array');\r\n }\r\n /**\r\n * To be called by derived classes to trigger events.\r\n * @param {!string} eventType\r\n * @param {...*} var_args\r\n */\r\n EventEmitter.prototype.trigger = function (eventType) {\r\n var var_args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n var_args[_i - 1] = arguments[_i];\r\n }\r\n if (Array.isArray(this.listeners_[eventType])) {\r\n // Clone the list, since callbacks could add/remove listeners.\r\n var listeners = this.listeners_[eventType].slice();\r\n for (var i = 0; i < listeners.length; i++) {\r\n listeners[i].callback.apply(listeners[i].context, var_args);\r\n }\r\n }\r\n };\r\n EventEmitter.prototype.on = function (eventType, callback, context) {\r\n this.validateEventType_(eventType);\r\n this.listeners_[eventType] = this.listeners_[eventType] || [];\r\n this.listeners_[eventType].push({ callback: callback, context: context });\r\n var eventData = this.getInitialEvent(eventType);\r\n if (eventData) {\r\n callback.apply(context, eventData);\r\n }\r\n };\r\n EventEmitter.prototype.off = function (eventType, callback, context) {\r\n this.validateEventType_(eventType);\r\n var listeners = this.listeners_[eventType] || [];\r\n for (var i = 0; i < listeners.length; i++) {\r\n if (listeners[i].callback === callback &&\r\n (!context || context === listeners[i].context)) {\r\n listeners.splice(i, 1);\r\n return;\r\n }\r\n }\r\n };\r\n EventEmitter.prototype.validateEventType_ = function (eventType) {\r\n assert(this.allowedEvents_.find(function (et) {\r\n return et === eventType;\r\n }), 'Unknown event: ' + eventType);\r\n };\r\n return EventEmitter;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @extends {EventEmitter}\r\n */\r\nvar VisibilityMonitor = /** @class */ (function (_super) {\r\n __extends(VisibilityMonitor, _super);\r\n function VisibilityMonitor() {\r\n var _this = _super.call(this, ['visible']) || this;\r\n var hidden;\r\n var visibilityChange;\r\n if (typeof document !== 'undefined' &&\r\n typeof document.addEventListener !== 'undefined') {\r\n if (typeof document['hidden'] !== 'undefined') {\r\n // Opera 12.10 and Firefox 18 and later support\r\n visibilityChange = 'visibilitychange';\r\n hidden = 'hidden';\r\n }\r\n else if (typeof document['mozHidden'] !== 'undefined') {\r\n visibilityChange = 'mozvisibilitychange';\r\n hidden = 'mozHidden';\r\n }\r\n else if (typeof document['msHidden'] !== 'undefined') {\r\n visibilityChange = 'msvisibilitychange';\r\n hidden = 'msHidden';\r\n }\r\n else if (typeof document['webkitHidden'] !== 'undefined') {\r\n visibilityChange = 'webkitvisibilitychange';\r\n hidden = 'webkitHidden';\r\n }\r\n }\r\n // Initially, we always assume we are visible. This ensures that in browsers\r\n // without page visibility support or in cases where we are never visible\r\n // (e.g. chrome extension), we act as if we are visible, i.e. don't delay\r\n // reconnects\r\n _this.visible_ = true;\r\n if (visibilityChange) {\r\n document.addEventListener(visibilityChange, function () {\r\n var visible = !document[hidden];\r\n if (visible !== _this.visible_) {\r\n _this.visible_ = visible;\r\n _this.trigger('visible', visible);\r\n }\r\n }, false);\r\n }\r\n return _this;\r\n }\r\n VisibilityMonitor.getInstance = function () {\r\n return new VisibilityMonitor();\r\n };\r\n /**\r\n * @param {!string} eventType\r\n * @return {Array.}\r\n */\r\n VisibilityMonitor.prototype.getInitialEvent = function (eventType) {\r\n assert(eventType === 'visible', 'Unknown event type: ' + eventType);\r\n return [this.visible_];\r\n };\r\n return VisibilityMonitor;\r\n}(EventEmitter));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Monitors online state (as reported by window.online/offline events).\r\n *\r\n * The expectation is that this could have many false positives (thinks we are online\r\n * when we're not), but no false negatives. So we can safely use it to determine when\r\n * we definitely cannot reach the internet.\r\n *\r\n * @extends {EventEmitter}\r\n */\r\nvar OnlineMonitor = /** @class */ (function (_super) {\r\n __extends(OnlineMonitor, _super);\r\n function OnlineMonitor() {\r\n var _this = _super.call(this, ['online']) || this;\r\n _this.online_ = true;\r\n // We've had repeated complaints that Cordova apps can get stuck \"offline\", e.g.\r\n // https://forum.ionicframework.com/t/firebase-connection-is-lost-and-never-come-back/43810\r\n // It would seem that the 'online' event does not always fire consistently. So we disable it\r\n // for Cordova.\r\n if (typeof window !== 'undefined' &&\r\n typeof window.addEventListener !== 'undefined' &&\r\n !isMobileCordova()) {\r\n window.addEventListener('online', function () {\r\n if (!_this.online_) {\r\n _this.online_ = true;\r\n _this.trigger('online', true);\r\n }\r\n }, false);\r\n window.addEventListener('offline', function () {\r\n if (_this.online_) {\r\n _this.online_ = false;\r\n _this.trigger('online', false);\r\n }\r\n }, false);\r\n }\r\n return _this;\r\n }\r\n OnlineMonitor.getInstance = function () {\r\n return new OnlineMonitor();\r\n };\r\n /**\r\n * @param {!string} eventType\r\n * @return {Array.}\r\n */\r\n OnlineMonitor.prototype.getInitialEvent = function (eventType) {\r\n assert(eventType === 'online', 'Unknown event type: ' + eventType);\r\n return [this.online_];\r\n };\r\n /**\r\n * @return {boolean}\r\n */\r\n OnlineMonitor.prototype.currentlyOnline = function () {\r\n return this.online_;\r\n };\r\n return OnlineMonitor;\r\n}(EventEmitter));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class ensures the packets from the server arrive in order\r\n * This class takes data from the server and ensures it gets passed into the callbacks in order.\r\n * @constructor\r\n */\r\nvar PacketReceiver = /** @class */ (function () {\r\n /**\r\n * @param onMessage_\r\n */\r\n function PacketReceiver(onMessage_) {\r\n this.onMessage_ = onMessage_;\r\n this.pendingResponses = [];\r\n this.currentResponseNum = 0;\r\n this.closeAfterResponse = -1;\r\n this.onClose = null;\r\n }\r\n PacketReceiver.prototype.closeAfter = function (responseNum, callback) {\r\n this.closeAfterResponse = responseNum;\r\n this.onClose = callback;\r\n if (this.closeAfterResponse < this.currentResponseNum) {\r\n this.onClose();\r\n this.onClose = null;\r\n }\r\n };\r\n /**\r\n * Each message from the server comes with a response number, and an array of data. The responseNumber\r\n * allows us to ensure that we process them in the right order, since we can't be guaranteed that all\r\n * browsers will respond in the same order as the requests we sent\r\n * @param {number} requestNum\r\n * @param {Array} data\r\n */\r\n PacketReceiver.prototype.handleResponse = function (requestNum, data) {\r\n var _this = this;\r\n this.pendingResponses[requestNum] = data;\r\n var _loop_1 = function () {\r\n var toProcess = this_1.pendingResponses[this_1.currentResponseNum];\r\n delete this_1.pendingResponses[this_1.currentResponseNum];\r\n var _loop_2 = function (i) {\r\n if (toProcess[i]) {\r\n exceptionGuard(function () {\r\n _this.onMessage_(toProcess[i]);\r\n });\r\n }\r\n };\r\n for (var i = 0; i < toProcess.length; ++i) {\r\n _loop_2(i);\r\n }\r\n if (this_1.currentResponseNum === this_1.closeAfterResponse) {\r\n if (this_1.onClose) {\r\n this_1.onClose();\r\n this_1.onClose = null;\r\n }\r\n return \"break\";\r\n }\r\n this_1.currentResponseNum++;\r\n };\r\n var this_1 = this;\r\n while (this.pendingResponses[this.currentResponseNum]) {\r\n var state_1 = _loop_1();\r\n if (state_1 === \"break\")\r\n break;\r\n }\r\n };\r\n return PacketReceiver;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// URL query parameters associated with longpolling\r\nvar FIREBASE_LONGPOLL_START_PARAM = 'start';\r\nvar FIREBASE_LONGPOLL_CLOSE_COMMAND = 'close';\r\nvar FIREBASE_LONGPOLL_COMMAND_CB_NAME = 'pLPCommand';\r\nvar FIREBASE_LONGPOLL_DATA_CB_NAME = 'pRTLPCB';\r\nvar FIREBASE_LONGPOLL_ID_PARAM = 'id';\r\nvar FIREBASE_LONGPOLL_PW_PARAM = 'pw';\r\nvar FIREBASE_LONGPOLL_SERIAL_PARAM = 'ser';\r\nvar FIREBASE_LONGPOLL_CALLBACK_ID_PARAM = 'cb';\r\nvar FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM = 'seg';\r\nvar FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET = 'ts';\r\nvar FIREBASE_LONGPOLL_DATA_PARAM = 'd';\r\nvar FIREBASE_LONGPOLL_DISCONN_FRAME_PARAM = 'disconn';\r\nvar FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM = 'dframe';\r\n//Data size constants.\r\n//TODO: Perf: the maximum length actually differs from browser to browser.\r\n// We should check what browser we're on and set accordingly.\r\nvar MAX_URL_DATA_SIZE = 1870;\r\nvar SEG_HEADER_SIZE = 30; //ie: &seg=8299234&ts=982389123&d=\r\nvar MAX_PAYLOAD_SIZE = MAX_URL_DATA_SIZE - SEG_HEADER_SIZE;\r\n/**\r\n * Keepalive period\r\n * send a fresh request at minimum every 25 seconds. Opera has a maximum request\r\n * length of 30 seconds that we can't exceed.\r\n * @const\r\n * @type {number}\r\n */\r\nvar KEEPALIVE_REQUEST_INTERVAL = 25000;\r\n/**\r\n * How long to wait before aborting a long-polling connection attempt.\r\n * @const\r\n * @type {number}\r\n */\r\nvar LP_CONNECT_TIMEOUT = 30000;\r\n/**\r\n * This class manages a single long-polling connection.\r\n *\r\n * @constructor\r\n * @implements {Transport}\r\n */\r\nvar BrowserPollConnection = /** @class */ (function () {\r\n /**\r\n * @param {string} connId An identifier for this connection, used for logging\r\n * @param {RepoInfo} repoInfo The info for the endpoint to send data to.\r\n * @param {string=} transportSessionId Optional transportSessionid if we are reconnecting for an existing\r\n * transport session\r\n * @param {string=} lastSessionId Optional lastSessionId if the PersistentConnection has already created a\r\n * connection previously\r\n */\r\n function BrowserPollConnection(connId, repoInfo, transportSessionId, lastSessionId) {\r\n this.connId = connId;\r\n this.repoInfo = repoInfo;\r\n this.transportSessionId = transportSessionId;\r\n this.lastSessionId = lastSessionId;\r\n this.bytesSent = 0;\r\n this.bytesReceived = 0;\r\n this.everConnected_ = false;\r\n this.log_ = logWrapper(connId);\r\n this.stats_ = StatsManager.getCollection(repoInfo);\r\n this.urlFn = function (params) {\r\n return repoInfo.connectionURL(LONG_POLLING, params);\r\n };\r\n }\r\n /**\r\n *\r\n * @param {function(Object)} onMessage Callback when messages arrive\r\n * @param {function()} onDisconnect Callback with connection lost.\r\n */\r\n BrowserPollConnection.prototype.open = function (onMessage, onDisconnect) {\r\n var _this = this;\r\n this.curSegmentNum = 0;\r\n this.onDisconnect_ = onDisconnect;\r\n this.myPacketOrderer = new PacketReceiver(onMessage);\r\n this.isClosed_ = false;\r\n this.connectTimeoutTimer_ = setTimeout(function () {\r\n _this.log_('Timed out trying to connect.');\r\n // Make sure we clear the host cache\r\n _this.onClosed_();\r\n _this.connectTimeoutTimer_ = null;\r\n }, Math.floor(LP_CONNECT_TIMEOUT));\r\n // Ensure we delay the creation of the iframe until the DOM is loaded.\r\n executeWhenDOMReady(function () {\r\n if (_this.isClosed_)\r\n return;\r\n //Set up a callback that gets triggered once a connection is set up.\r\n _this.scriptTagHolder = new FirebaseIFrameScriptHolder(function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var command = args[0], arg1 = args[1], arg2 = args[2];\r\n _this.incrementIncomingBytes_(args);\r\n if (!_this.scriptTagHolder)\r\n return; // we closed the connection.\r\n if (_this.connectTimeoutTimer_) {\r\n clearTimeout(_this.connectTimeoutTimer_);\r\n _this.connectTimeoutTimer_ = null;\r\n }\r\n _this.everConnected_ = true;\r\n if (command == FIREBASE_LONGPOLL_START_PARAM) {\r\n _this.id = arg1;\r\n _this.password = arg2;\r\n }\r\n else if (command === FIREBASE_LONGPOLL_CLOSE_COMMAND) {\r\n // Don't clear the host cache. We got a response from the server, so we know it's reachable\r\n if (arg1) {\r\n // We aren't expecting any more data (other than what the server's already in the process of sending us\r\n // through our already open polls), so don't send any more.\r\n _this.scriptTagHolder.sendNewPolls = false;\r\n // arg1 in this case is the last response number sent by the server. We should try to receive\r\n // all of the responses up to this one before closing\r\n _this.myPacketOrderer.closeAfter(arg1, function () {\r\n _this.onClosed_();\r\n });\r\n }\r\n else {\r\n _this.onClosed_();\r\n }\r\n }\r\n else {\r\n throw new Error('Unrecognized command received: ' + command);\r\n }\r\n }, function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var pN = args[0], data = args[1];\r\n _this.incrementIncomingBytes_(args);\r\n _this.myPacketOrderer.handleResponse(pN, data);\r\n }, function () {\r\n _this.onClosed_();\r\n }, _this.urlFn);\r\n //Send the initial request to connect. The serial number is simply to keep the browser from pulling previous results\r\n //from cache.\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_START_PARAM] = 't';\r\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = Math.floor(Math.random() * 100000000);\r\n if (_this.scriptTagHolder.uniqueCallbackIdentifier)\r\n urlParams[FIREBASE_LONGPOLL_CALLBACK_ID_PARAM] = _this.scriptTagHolder.uniqueCallbackIdentifier;\r\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\r\n if (_this.transportSessionId) {\r\n urlParams[TRANSPORT_SESSION_PARAM] = _this.transportSessionId;\r\n }\r\n if (_this.lastSessionId) {\r\n urlParams[LAST_SESSION_PARAM] = _this.lastSessionId;\r\n }\r\n if (!isNodeSdk() &&\r\n typeof location !== 'undefined' &&\r\n location.href &&\r\n location.href.indexOf(FORGE_DOMAIN) !== -1) {\r\n urlParams[REFERER_PARAM] = FORGE_REF;\r\n }\r\n var connectURL = _this.urlFn(urlParams);\r\n _this.log_('Connecting via long-poll to ' + connectURL);\r\n _this.scriptTagHolder.addTag(connectURL, function () {\r\n /* do nothing */\r\n });\r\n });\r\n };\r\n /**\r\n * Call this when a handshake has completed successfully and we want to consider the connection established\r\n */\r\n BrowserPollConnection.prototype.start = function () {\r\n this.scriptTagHolder.startLongPoll(this.id, this.password);\r\n this.addDisconnectPingFrame(this.id, this.password);\r\n };\r\n /**\r\n * Forces long polling to be considered as a potential transport\r\n */\r\n BrowserPollConnection.forceAllow = function () {\r\n BrowserPollConnection.forceAllow_ = true;\r\n };\r\n /**\r\n * Forces longpolling to not be considered as a potential transport\r\n */\r\n BrowserPollConnection.forceDisallow = function () {\r\n BrowserPollConnection.forceDisallow_ = true;\r\n };\r\n // Static method, use string literal so it can be accessed in a generic way\r\n BrowserPollConnection.isAvailable = function () {\r\n // NOTE: In React-Native there's normally no 'document', but if you debug a React-Native app in\r\n // the Chrome debugger, 'document' is defined, but document.createElement is null (2015/06/08).\r\n return (BrowserPollConnection.forceAllow_ ||\r\n (!BrowserPollConnection.forceDisallow_ &&\r\n typeof document !== 'undefined' &&\r\n document.createElement != null &&\r\n !isChromeExtensionContentScript() &&\r\n !isWindowsStoreApp() &&\r\n !isNodeSdk()));\r\n };\r\n /**\r\n * No-op for polling\r\n */\r\n BrowserPollConnection.prototype.markConnectionHealthy = function () { };\r\n /**\r\n * Stops polling and cleans up the iframe\r\n * @private\r\n */\r\n BrowserPollConnection.prototype.shutdown_ = function () {\r\n this.isClosed_ = true;\r\n if (this.scriptTagHolder) {\r\n this.scriptTagHolder.close();\r\n this.scriptTagHolder = null;\r\n }\r\n //remove the disconnect frame, which will trigger an XHR call to the server to tell it we're leaving.\r\n if (this.myDisconnFrame) {\r\n document.body.removeChild(this.myDisconnFrame);\r\n this.myDisconnFrame = null;\r\n }\r\n if (this.connectTimeoutTimer_) {\r\n clearTimeout(this.connectTimeoutTimer_);\r\n this.connectTimeoutTimer_ = null;\r\n }\r\n };\r\n /**\r\n * Triggered when this transport is closed\r\n * @private\r\n */\r\n BrowserPollConnection.prototype.onClosed_ = function () {\r\n if (!this.isClosed_) {\r\n this.log_('Longpoll is closing itself');\r\n this.shutdown_();\r\n if (this.onDisconnect_) {\r\n this.onDisconnect_(this.everConnected_);\r\n this.onDisconnect_ = null;\r\n }\r\n }\r\n };\r\n /**\r\n * External-facing close handler. RealTime has requested we shut down. Kill our connection and tell the server\r\n * that we've left.\r\n */\r\n BrowserPollConnection.prototype.close = function () {\r\n if (!this.isClosed_) {\r\n this.log_('Longpoll is being closed.');\r\n this.shutdown_();\r\n }\r\n };\r\n /**\r\n * Send the JSON object down to the server. It will need to be stringified, base64 encoded, and then\r\n * broken into chunks (since URLs have a small maximum length).\r\n * @param {!Object} data The JSON data to transmit.\r\n */\r\n BrowserPollConnection.prototype.send = function (data) {\r\n var dataStr = stringify(data);\r\n this.bytesSent += dataStr.length;\r\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\r\n //first, lets get the base64-encoded data\r\n var base64data = base64Encode(dataStr);\r\n //We can only fit a certain amount in each URL, so we need to split this request\r\n //up into multiple pieces if it doesn't fit in one request.\r\n var dataSegs = splitStringBySize(base64data, MAX_PAYLOAD_SIZE);\r\n //Enqueue each segment for transmission. We assign each chunk a sequential ID and a total number\r\n //of segments so that we can reassemble the packet on the server.\r\n for (var i = 0; i < dataSegs.length; i++) {\r\n this.scriptTagHolder.enqueueSegment(this.curSegmentNum, dataSegs.length, dataSegs[i]);\r\n this.curSegmentNum++;\r\n }\r\n };\r\n /**\r\n * This is how we notify the server that we're leaving.\r\n * We aren't able to send requests with DHTML on a window close event, but we can\r\n * trigger XHR requests in some browsers (everything but Opera basically).\r\n * @param {!string} id\r\n * @param {!string} pw\r\n */\r\n BrowserPollConnection.prototype.addDisconnectPingFrame = function (id, pw) {\r\n if (isNodeSdk())\r\n return;\r\n this.myDisconnFrame = document.createElement('iframe');\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_DISCONN_FRAME_REQUEST_PARAM] = 't';\r\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = id;\r\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = pw;\r\n this.myDisconnFrame.src = this.urlFn(urlParams);\r\n this.myDisconnFrame.style.display = 'none';\r\n document.body.appendChild(this.myDisconnFrame);\r\n };\r\n /**\r\n * Used to track the bytes received by this client\r\n * @param {*} args\r\n * @private\r\n */\r\n BrowserPollConnection.prototype.incrementIncomingBytes_ = function (args) {\r\n // TODO: This is an annoying perf hit just to track the number of incoming bytes. Maybe it should be opt-in.\r\n var bytesReceived = stringify(args).length;\r\n this.bytesReceived += bytesReceived;\r\n this.stats_.incrementCounter('bytes_received', bytesReceived);\r\n };\r\n return BrowserPollConnection;\r\n}());\r\n/*********************************************************************************************\r\n * A wrapper around an iframe that is used as a long-polling script holder.\r\n * @constructor\r\n *********************************************************************************************/\r\nvar FirebaseIFrameScriptHolder = /** @class */ (function () {\r\n /**\r\n * @param commandCB - The callback to be called when control commands are recevied from the server.\r\n * @param onMessageCB - The callback to be triggered when responses arrive from the server.\r\n * @param onDisconnect - The callback to be triggered when this tag holder is closed\r\n * @param urlFn - A function that provides the URL of the endpoint to send data to.\r\n */\r\n function FirebaseIFrameScriptHolder(commandCB, onMessageCB, onDisconnect, urlFn) {\r\n this.onDisconnect = onDisconnect;\r\n this.urlFn = urlFn;\r\n //We maintain a count of all of the outstanding requests, because if we have too many active at once it can cause\r\n //problems in some browsers.\r\n /**\r\n * @type {CountedSet.}\r\n */\r\n this.outstandingRequests = new CountedSet();\r\n //A queue of the pending segments waiting for transmission to the server.\r\n this.pendingSegs = [];\r\n //A serial number. We use this for two things:\r\n // 1) A way to ensure the browser doesn't cache responses to polls\r\n // 2) A way to make the server aware when long-polls arrive in a different order than we started them. The\r\n // server needs to release both polls in this case or it will cause problems in Opera since Opera can only execute\r\n // JSONP code in the order it was added to the iframe.\r\n this.currentSerial = Math.floor(Math.random() * 100000000);\r\n // This gets set to false when we're \"closing down\" the connection (e.g. we're switching transports but there's still\r\n // incoming data from the server that we're waiting for).\r\n this.sendNewPolls = true;\r\n if (!isNodeSdk()) {\r\n //Each script holder registers a couple of uniquely named callbacks with the window. These are called from the\r\n //iframes where we put the long-polling script tags. We have two callbacks:\r\n // 1) Command Callback - Triggered for control issues, like starting a connection.\r\n // 2) Message Callback - Triggered when new data arrives.\r\n this.uniqueCallbackIdentifier = LUIDGenerator();\r\n window[FIREBASE_LONGPOLL_COMMAND_CB_NAME + this.uniqueCallbackIdentifier] = commandCB;\r\n window[FIREBASE_LONGPOLL_DATA_CB_NAME + this.uniqueCallbackIdentifier] = onMessageCB;\r\n //Create an iframe for us to add script tags to.\r\n this.myIFrame = FirebaseIFrameScriptHolder.createIFrame_();\r\n // Set the iframe's contents.\r\n var script = '';\r\n // if we set a javascript url, it's IE and we need to set the document domain. The javascript url is sufficient\r\n // for ie9, but ie8 needs to do it again in the document itself.\r\n if (this.myIFrame.src &&\r\n this.myIFrame.src.substr(0, 'javascript:'.length) === 'javascript:') {\r\n var currentDomain = document.domain;\r\n script = '';\r\n }\r\n var iframeContents = '' + script + '';\r\n try {\r\n this.myIFrame.doc.open();\r\n this.myIFrame.doc.write(iframeContents);\r\n this.myIFrame.doc.close();\r\n }\r\n catch (e) {\r\n log('frame writing exception');\r\n if (e.stack) {\r\n log(e.stack);\r\n }\r\n log(e);\r\n }\r\n }\r\n else {\r\n this.commandCB = commandCB;\r\n this.onMessageCB = onMessageCB;\r\n }\r\n }\r\n /**\r\n * Each browser has its own funny way to handle iframes. Here we mush them all together into one object that I can\r\n * actually use.\r\n * @private\r\n * @return {Element}\r\n */\r\n FirebaseIFrameScriptHolder.createIFrame_ = function () {\r\n var iframe = document.createElement('iframe');\r\n iframe.style.display = 'none';\r\n // This is necessary in order to initialize the document inside the iframe\r\n if (document.body) {\r\n document.body.appendChild(iframe);\r\n try {\r\n // If document.domain has been modified in IE, this will throw an error, and we need to set the\r\n // domain of the iframe's document manually. We can do this via a javascript: url as the src attribute\r\n // Also note that we must do this *after* the iframe has been appended to the page. Otherwise it doesn't work.\r\n var a = iframe.contentWindow.document;\r\n if (!a) {\r\n // Apologies for the log-spam, I need to do something to keep closure from optimizing out the assignment above.\r\n log('No IE domain setting required');\r\n }\r\n }\r\n catch (e) {\r\n var domain = document.domain;\r\n iframe.src =\r\n \"javascript:void((function(){document.open();document.domain='\" +\r\n domain +\r\n \"';document.close();})())\";\r\n }\r\n }\r\n else {\r\n // LongPollConnection attempts to delay initialization until the document is ready, so hopefully this\r\n // never gets hit.\r\n throw 'Document body has not initialized. Wait to initialize Firebase until after the document is ready.';\r\n }\r\n // Get the document of the iframe in a browser-specific way.\r\n if (iframe.contentDocument) {\r\n iframe.doc = iframe.contentDocument; // Firefox, Opera, Safari\r\n }\r\n else if (iframe.contentWindow) {\r\n iframe.doc = iframe.contentWindow.document; // Internet Explorer\r\n }\r\n else if (iframe.document) {\r\n iframe.doc = iframe.document; //others?\r\n }\r\n return iframe;\r\n };\r\n /**\r\n * Cancel all outstanding queries and remove the frame.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.close = function () {\r\n var _this = this;\r\n //Mark this iframe as dead, so no new requests are sent.\r\n this.alive = false;\r\n if (this.myIFrame) {\r\n //We have to actually remove all of the html inside this iframe before removing it from the\r\n //window, or IE will continue loading and executing the script tags we've already added, which\r\n //can lead to some errors being thrown. Setting innerHTML seems to be the easiest way to do this.\r\n this.myIFrame.doc.body.innerHTML = '';\r\n setTimeout(function () {\r\n if (_this.myIFrame !== null) {\r\n document.body.removeChild(_this.myIFrame);\r\n _this.myIFrame = null;\r\n }\r\n }, Math.floor(0));\r\n }\r\n if (isNodeSdk() && this.myID) {\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_DISCONN_FRAME_PARAM] = 't';\r\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = this.myID;\r\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = this.myPW;\r\n var theURL = this.urlFn(urlParams);\r\n FirebaseIFrameScriptHolder.nodeRestRequest(theURL);\r\n }\r\n // Protect from being called recursively.\r\n var onDisconnect = this.onDisconnect;\r\n if (onDisconnect) {\r\n this.onDisconnect = null;\r\n onDisconnect();\r\n }\r\n };\r\n /**\r\n * Actually start the long-polling session by adding the first script tag(s) to the iframe.\r\n * @param {!string} id - The ID of this connection\r\n * @param {!string} pw - The password for this connection\r\n */\r\n FirebaseIFrameScriptHolder.prototype.startLongPoll = function (id, pw) {\r\n this.myID = id;\r\n this.myPW = pw;\r\n this.alive = true;\r\n //send the initial request. If there are requests queued, make sure that we transmit as many as we are currently able to.\r\n while (this.newRequest_()) { }\r\n };\r\n /**\r\n * This is called any time someone might want a script tag to be added. It adds a script tag when there aren't\r\n * too many outstanding requests and we are still alive.\r\n *\r\n * If there are outstanding packet segments to send, it sends one. If there aren't, it sends a long-poll anyways if\r\n * needed.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.newRequest_ = function () {\r\n // We keep one outstanding request open all the time to receive data, but if we need to send data\r\n // (pendingSegs.length > 0) then we create a new request to send the data. The server will automatically\r\n // close the old request.\r\n if (this.alive &&\r\n this.sendNewPolls &&\r\n this.outstandingRequests.count() < (this.pendingSegs.length > 0 ? 2 : 1)) {\r\n //construct our url\r\n this.currentSerial++;\r\n var urlParams = {};\r\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = this.myID;\r\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = this.myPW;\r\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = this.currentSerial;\r\n var theURL = this.urlFn(urlParams);\r\n //Now add as much data as we can.\r\n var curDataString = '';\r\n var i = 0;\r\n while (this.pendingSegs.length > 0) {\r\n //first, lets see if the next segment will fit.\r\n var nextSeg = this.pendingSegs[0];\r\n if (nextSeg.d.length + SEG_HEADER_SIZE + curDataString.length <=\r\n MAX_URL_DATA_SIZE) {\r\n //great, the segment will fit. Lets append it.\r\n var theSeg = this.pendingSegs.shift();\r\n curDataString =\r\n curDataString +\r\n '&' +\r\n FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM +\r\n i +\r\n '=' +\r\n theSeg.seg +\r\n '&' +\r\n FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET +\r\n i +\r\n '=' +\r\n theSeg.ts +\r\n '&' +\r\n FIREBASE_LONGPOLL_DATA_PARAM +\r\n i +\r\n '=' +\r\n theSeg.d;\r\n i++;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n theURL = theURL + curDataString;\r\n this.addLongPollTag_(theURL, this.currentSerial);\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n /**\r\n * Queue a packet for transmission to the server.\r\n * @param segnum - A sequential id for this packet segment used for reassembly\r\n * @param totalsegs - The total number of segments in this packet\r\n * @param data - The data for this segment.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.enqueueSegment = function (segnum, totalsegs, data) {\r\n //add this to the queue of segments to send.\r\n this.pendingSegs.push({ seg: segnum, ts: totalsegs, d: data });\r\n //send the data immediately if there isn't already data being transmitted, unless\r\n //startLongPoll hasn't been called yet.\r\n if (this.alive) {\r\n this.newRequest_();\r\n }\r\n };\r\n /**\r\n * Add a script tag for a regular long-poll request.\r\n * @param {!string} url - The URL of the script tag.\r\n * @param {!number} serial - The serial number of the request.\r\n * @private\r\n */\r\n FirebaseIFrameScriptHolder.prototype.addLongPollTag_ = function (url, serial) {\r\n var _this = this;\r\n //remember that we sent this request.\r\n this.outstandingRequests.add(serial, 1);\r\n var doNewRequest = function () {\r\n _this.outstandingRequests.remove(serial);\r\n _this.newRequest_();\r\n };\r\n // If this request doesn't return on its own accord (by the server sending us some data), we'll\r\n // create a new one after the KEEPALIVE interval to make sure we always keep a fresh request open.\r\n var keepaliveTimeout = setTimeout(doNewRequest, Math.floor(KEEPALIVE_REQUEST_INTERVAL));\r\n var readyStateCB = function () {\r\n // Request completed. Cancel the keepalive.\r\n clearTimeout(keepaliveTimeout);\r\n // Trigger a new request so we can continue receiving data.\r\n doNewRequest();\r\n };\r\n this.addTag(url, readyStateCB);\r\n };\r\n /**\r\n * Add an arbitrary script tag to the iframe.\r\n * @param {!string} url - The URL for the script tag source.\r\n * @param {!function()} loadCB - A callback to be triggered once the script has loaded.\r\n */\r\n FirebaseIFrameScriptHolder.prototype.addTag = function (url, loadCB) {\r\n var _this = this;\r\n if (isNodeSdk()) {\r\n this.doNodeLongPoll(url, loadCB);\r\n }\r\n else {\r\n setTimeout(function () {\r\n try {\r\n // if we're already closed, don't add this poll\r\n if (!_this.sendNewPolls)\r\n return;\r\n var newScript_1 = _this.myIFrame.doc.createElement('script');\r\n newScript_1.type = 'text/javascript';\r\n newScript_1.async = true;\r\n newScript_1.src = url;\r\n newScript_1.onload = newScript_1.onreadystatechange = function () {\r\n var rstate = newScript_1.readyState;\r\n if (!rstate || rstate === 'loaded' || rstate === 'complete') {\r\n newScript_1.onload = newScript_1.onreadystatechange = null;\r\n if (newScript_1.parentNode) {\r\n newScript_1.parentNode.removeChild(newScript_1);\r\n }\r\n loadCB();\r\n }\r\n };\r\n newScript_1.onerror = function () {\r\n log('Long-poll script failed to load: ' + url);\r\n _this.sendNewPolls = false;\r\n _this.close();\r\n };\r\n _this.myIFrame.doc.body.appendChild(newScript_1);\r\n }\r\n catch (e) {\r\n // TODO: we should make this error visible somehow\r\n }\r\n }, Math.floor(1));\r\n }\r\n };\r\n return FirebaseIFrameScriptHolder;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar WEBSOCKET_MAX_FRAME_SIZE = 16384;\r\nvar WEBSOCKET_KEEPALIVE_INTERVAL = 45000;\r\nvar WebSocketImpl = null;\r\nif (typeof MozWebSocket !== 'undefined') {\r\n WebSocketImpl = MozWebSocket;\r\n}\r\nelse if (typeof WebSocket !== 'undefined') {\r\n WebSocketImpl = WebSocket;\r\n}\r\n/**\r\n * Create a new websocket connection with the given callbacks.\r\n * @constructor\r\n * @implements {Transport}\r\n */\r\nvar WebSocketConnection = /** @class */ (function () {\r\n /**\r\n * @param {string} connId identifier for this transport\r\n * @param {RepoInfo} repoInfo The info for the websocket endpoint.\r\n * @param {string=} transportSessionId Optional transportSessionId if this is connecting to an existing transport\r\n * session\r\n * @param {string=} lastSessionId Optional lastSessionId if there was a previous connection\r\n */\r\n function WebSocketConnection(connId, repoInfo, transportSessionId, lastSessionId) {\r\n this.connId = connId;\r\n this.keepaliveTimer = null;\r\n this.frames = null;\r\n this.totalFrames = 0;\r\n this.bytesSent = 0;\r\n this.bytesReceived = 0;\r\n this.log_ = logWrapper(this.connId);\r\n this.stats_ = StatsManager.getCollection(repoInfo);\r\n this.connURL = WebSocketConnection.connectionURL_(repoInfo, transportSessionId, lastSessionId);\r\n }\r\n /**\r\n * @param {RepoInfo} repoInfo The info for the websocket endpoint.\r\n * @param {string=} transportSessionId Optional transportSessionId if this is connecting to an existing transport\r\n * session\r\n * @param {string=} lastSessionId Optional lastSessionId if there was a previous connection\r\n * @return {string} connection url\r\n * @private\r\n */\r\n WebSocketConnection.connectionURL_ = function (repoInfo, transportSessionId, lastSessionId) {\r\n var urlParams = {};\r\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\r\n if (!isNodeSdk() &&\r\n typeof location !== 'undefined' &&\r\n location.href &&\r\n location.href.indexOf(FORGE_DOMAIN) !== -1) {\r\n urlParams[REFERER_PARAM] = FORGE_REF;\r\n }\r\n if (transportSessionId) {\r\n urlParams[TRANSPORT_SESSION_PARAM] = transportSessionId;\r\n }\r\n if (lastSessionId) {\r\n urlParams[LAST_SESSION_PARAM] = lastSessionId;\r\n }\r\n return repoInfo.connectionURL(WEBSOCKET, urlParams);\r\n };\r\n /**\r\n *\r\n * @param onMessage Callback when messages arrive\r\n * @param onDisconnect Callback with connection lost.\r\n */\r\n WebSocketConnection.prototype.open = function (onMessage, onDisconnect) {\r\n var _this = this;\r\n this.onDisconnect = onDisconnect;\r\n this.onMessage = onMessage;\r\n this.log_('Websocket connecting to ' + this.connURL);\r\n this.everConnected_ = false;\r\n // Assume failure until proven otherwise.\r\n PersistentStorage.set('previous_websocket_failure', true);\r\n try {\r\n if (isNodeSdk()) {\r\n var device = CONSTANTS.NODE_ADMIN ? 'AdminNode' : 'Node';\r\n // UA Format: Firebase////\r\n var options = {\r\n headers: {\r\n 'User-Agent': \"Firebase/\" + PROTOCOL_VERSION + \"/\" + firebase.SDK_VERSION + \"/\" + process.platform + \"/\" + device\r\n }\r\n };\r\n // Plumb appropriate http_proxy environment variable into faye-websocket if it exists.\r\n var env = process['env'];\r\n var proxy = this.connURL.indexOf('wss://') == 0\r\n ? env['HTTPS_PROXY'] || env['https_proxy']\r\n : env['HTTP_PROXY'] || env['http_proxy'];\r\n if (proxy) {\r\n options['proxy'] = { origin: proxy };\r\n }\r\n this.mySock = new WebSocketImpl(this.connURL, [], options);\r\n }\r\n else {\r\n this.mySock = new WebSocketImpl(this.connURL);\r\n }\r\n }\r\n catch (e) {\r\n this.log_('Error instantiating WebSocket.');\r\n var error$$1 = e.message || e.data;\r\n if (error$$1) {\r\n this.log_(error$$1);\r\n }\r\n this.onClosed_();\r\n return;\r\n }\r\n this.mySock.onopen = function () {\r\n _this.log_('Websocket connected.');\r\n _this.everConnected_ = true;\r\n };\r\n this.mySock.onclose = function () {\r\n _this.log_('Websocket connection was disconnected.');\r\n _this.mySock = null;\r\n _this.onClosed_();\r\n };\r\n this.mySock.onmessage = function (m) {\r\n _this.handleIncomingFrame(m);\r\n };\r\n this.mySock.onerror = function (e) {\r\n _this.log_('WebSocket error. Closing connection.');\r\n var error$$1 = e.message || e.data;\r\n if (error$$1) {\r\n _this.log_(error$$1);\r\n }\r\n _this.onClosed_();\r\n };\r\n };\r\n /**\r\n * No-op for websockets, we don't need to do anything once the connection is confirmed as open\r\n */\r\n WebSocketConnection.prototype.start = function () { };\r\n WebSocketConnection.forceDisallow = function () {\r\n WebSocketConnection.forceDisallow_ = true;\r\n };\r\n WebSocketConnection.isAvailable = function () {\r\n var isOldAndroid = false;\r\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\r\n var oldAndroidRegex = /Android ([0-9]{0,}\\.[0-9]{0,})/;\r\n var oldAndroidMatch = navigator.userAgent.match(oldAndroidRegex);\r\n if (oldAndroidMatch && oldAndroidMatch.length > 1) {\r\n if (parseFloat(oldAndroidMatch[1]) < 4.4) {\r\n isOldAndroid = true;\r\n }\r\n }\r\n }\r\n return (!isOldAndroid &&\r\n WebSocketImpl !== null &&\r\n !WebSocketConnection.forceDisallow_);\r\n };\r\n /**\r\n * Returns true if we previously failed to connect with this transport.\r\n * @return {boolean}\r\n */\r\n WebSocketConnection.previouslyFailed = function () {\r\n // If our persistent storage is actually only in-memory storage,\r\n // we default to assuming that it previously failed to be safe.\r\n return (PersistentStorage.isInMemoryStorage ||\r\n PersistentStorage.get('previous_websocket_failure') === true);\r\n };\r\n WebSocketConnection.prototype.markConnectionHealthy = function () {\r\n PersistentStorage.remove('previous_websocket_failure');\r\n };\r\n WebSocketConnection.prototype.appendFrame_ = function (data) {\r\n this.frames.push(data);\r\n if (this.frames.length == this.totalFrames) {\r\n var fullMess = this.frames.join('');\r\n this.frames = null;\r\n var jsonMess = jsonEval(fullMess);\r\n //handle the message\r\n this.onMessage(jsonMess);\r\n }\r\n };\r\n /**\r\n * @param {number} frameCount The number of frames we are expecting from the server\r\n * @private\r\n */\r\n WebSocketConnection.prototype.handleNewFrameCount_ = function (frameCount) {\r\n this.totalFrames = frameCount;\r\n this.frames = [];\r\n };\r\n /**\r\n * Attempts to parse a frame count out of some text. If it can't, assumes a value of 1\r\n * @param {!String} data\r\n * @return {?String} Any remaining data to be process, or null if there is none\r\n * @private\r\n */\r\n WebSocketConnection.prototype.extractFrameCount_ = function (data) {\r\n assert(this.frames === null, 'We already have a frame buffer');\r\n // TODO: The server is only supposed to send up to 9999 frames (i.e. length <= 4), but that isn't being enforced\r\n // currently. So allowing larger frame counts (length <= 6). See https://app.asana.com/0/search/8688598998380/8237608042508\r\n if (data.length <= 6) {\r\n var frameCount = Number(data);\r\n if (!isNaN(frameCount)) {\r\n this.handleNewFrameCount_(frameCount);\r\n return null;\r\n }\r\n }\r\n this.handleNewFrameCount_(1);\r\n return data;\r\n };\r\n /**\r\n * Process a websocket frame that has arrived from the server.\r\n * @param mess The frame data\r\n */\r\n WebSocketConnection.prototype.handleIncomingFrame = function (mess) {\r\n if (this.mySock === null)\r\n return; // Chrome apparently delivers incoming packets even after we .close() the connection sometimes.\r\n var data = mess['data'];\r\n this.bytesReceived += data.length;\r\n this.stats_.incrementCounter('bytes_received', data.length);\r\n this.resetKeepAlive();\r\n if (this.frames !== null) {\r\n // we're buffering\r\n this.appendFrame_(data);\r\n }\r\n else {\r\n // try to parse out a frame count, otherwise, assume 1 and process it\r\n var remainingData = this.extractFrameCount_(data);\r\n if (remainingData !== null) {\r\n this.appendFrame_(remainingData);\r\n }\r\n }\r\n };\r\n /**\r\n * Send a message to the server\r\n * @param {Object} data The JSON object to transmit\r\n */\r\n WebSocketConnection.prototype.send = function (data) {\r\n this.resetKeepAlive();\r\n var dataStr = stringify(data);\r\n this.bytesSent += dataStr.length;\r\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\r\n //We can only fit a certain amount in each websocket frame, so we need to split this request\r\n //up into multiple pieces if it doesn't fit in one request.\r\n var dataSegs = splitStringBySize(dataStr, WEBSOCKET_MAX_FRAME_SIZE);\r\n //Send the length header\r\n if (dataSegs.length > 1) {\r\n this.sendString_(String(dataSegs.length));\r\n }\r\n //Send the actual data in segments.\r\n for (var i = 0; i < dataSegs.length; i++) {\r\n this.sendString_(dataSegs[i]);\r\n }\r\n };\r\n WebSocketConnection.prototype.shutdown_ = function () {\r\n this.isClosed_ = true;\r\n if (this.keepaliveTimer) {\r\n clearInterval(this.keepaliveTimer);\r\n this.keepaliveTimer = null;\r\n }\r\n if (this.mySock) {\r\n this.mySock.close();\r\n this.mySock = null;\r\n }\r\n };\r\n WebSocketConnection.prototype.onClosed_ = function () {\r\n if (!this.isClosed_) {\r\n this.log_('WebSocket is closing itself');\r\n this.shutdown_();\r\n // since this is an internal close, trigger the close listener\r\n if (this.onDisconnect) {\r\n this.onDisconnect(this.everConnected_);\r\n this.onDisconnect = null;\r\n }\r\n }\r\n };\r\n /**\r\n * External-facing close handler.\r\n * Close the websocket and kill the connection.\r\n */\r\n WebSocketConnection.prototype.close = function () {\r\n if (!this.isClosed_) {\r\n this.log_('WebSocket is being closed');\r\n this.shutdown_();\r\n }\r\n };\r\n /**\r\n * Kill the current keepalive timer and start a new one, to ensure that it always fires N seconds after\r\n * the last activity.\r\n */\r\n WebSocketConnection.prototype.resetKeepAlive = function () {\r\n var _this = this;\r\n clearInterval(this.keepaliveTimer);\r\n this.keepaliveTimer = setInterval(function () {\r\n //If there has been no websocket activity for a while, send a no-op\r\n if (_this.mySock) {\r\n _this.sendString_('0');\r\n }\r\n _this.resetKeepAlive();\r\n }, Math.floor(WEBSOCKET_KEEPALIVE_INTERVAL));\r\n };\r\n /**\r\n * Send a string over the websocket.\r\n *\r\n * @param {string} str String to send.\r\n * @private\r\n */\r\n WebSocketConnection.prototype.sendString_ = function (str) {\r\n // Firefox seems to sometimes throw exceptions (NS_ERROR_UNEXPECTED) from websocket .send()\r\n // calls for some unknown reason. We treat these as an error and disconnect.\r\n // See https://app.asana.com/0/58926111402292/68021340250410\r\n try {\r\n this.mySock.send(str);\r\n }\r\n catch (e) {\r\n this.log_('Exception thrown from WebSocket.send():', e.message || e.data, 'Closing connection.');\r\n setTimeout(this.onClosed_.bind(this), 0);\r\n }\r\n };\r\n /**\r\n * Number of response before we consider the connection \"healthy.\"\r\n * @type {number}\r\n */\r\n WebSocketConnection.responsesRequiredToBeHealthy = 2;\r\n /**\r\n * Time to wait for the connection te become healthy before giving up.\r\n * @type {number}\r\n */\r\n WebSocketConnection.healthyTimeout = 30000;\r\n return WebSocketConnection;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Currently simplistic, this class manages what transport a Connection should use at various stages of its\r\n * lifecycle.\r\n *\r\n * It starts with longpolling in a browser, and httppolling on node. It then upgrades to websockets if\r\n * they are available.\r\n * @constructor\r\n */\r\nvar TransportManager = /** @class */ (function () {\r\n /**\r\n * @param {!RepoInfo} repoInfo Metadata around the namespace we're connecting to\r\n */\r\n function TransportManager(repoInfo) {\r\n this.initTransports_(repoInfo);\r\n }\r\n Object.defineProperty(TransportManager, \"ALL_TRANSPORTS\", {\r\n /**\r\n * @const\r\n * @type {!Array.}\r\n */\r\n get: function () {\r\n return [BrowserPollConnection, WebSocketConnection];\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {!RepoInfo} repoInfo\r\n * @private\r\n */\r\n TransportManager.prototype.initTransports_ = function (repoInfo) {\r\n var isWebSocketsAvailable = WebSocketConnection && WebSocketConnection['isAvailable']();\r\n var isSkipPollConnection = isWebSocketsAvailable && !WebSocketConnection.previouslyFailed();\r\n if (repoInfo.webSocketOnly) {\r\n if (!isWebSocketsAvailable)\r\n warn(\"wss:// URL used, but browser isn't known to support websockets. Trying anyway.\");\r\n isSkipPollConnection = true;\r\n }\r\n if (isSkipPollConnection) {\r\n this.transports_ = [WebSocketConnection];\r\n }\r\n else {\r\n var transports_1 = (this.transports_ = []);\r\n each(TransportManager.ALL_TRANSPORTS, function (i, transport) {\r\n if (transport && transport['isAvailable']()) {\r\n transports_1.push(transport);\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * @return {function(new:Transport, !string, !RepoInfo, string=, string=)} The constructor for the\r\n * initial transport to use\r\n */\r\n TransportManager.prototype.initialTransport = function () {\r\n if (this.transports_.length > 0) {\r\n return this.transports_[0];\r\n }\r\n else {\r\n throw new Error('No transports available');\r\n }\r\n };\r\n /**\r\n * @return {?function(new:Transport, function(),function(), string=)} The constructor for the next\r\n * transport, or null\r\n */\r\n TransportManager.prototype.upgradeTransport = function () {\r\n if (this.transports_.length > 1) {\r\n return this.transports_[1];\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n return TransportManager;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// Abort upgrade attempt if it takes longer than 60s.\r\nvar UPGRADE_TIMEOUT = 60000;\r\n// For some transports (WebSockets), we need to \"validate\" the transport by exchanging a few requests and responses.\r\n// If we haven't sent enough requests within 5s, we'll start sending noop ping requests.\r\nvar DELAY_BEFORE_SENDING_EXTRA_REQUESTS = 5000;\r\n// If the initial data sent triggers a lot of bandwidth (i.e. it's a large put or a listen for a large amount of data)\r\n// then we may not be able to exchange our ping/pong requests within the healthy timeout. So if we reach the timeout\r\n// but we've sent/received enough bytes, we don't cancel the connection.\r\nvar BYTES_SENT_HEALTHY_OVERRIDE = 10 * 1024;\r\nvar BYTES_RECEIVED_HEALTHY_OVERRIDE = 100 * 1024;\r\nvar MESSAGE_TYPE = 't';\r\nvar MESSAGE_DATA = 'd';\r\nvar CONTROL_SHUTDOWN = 's';\r\nvar CONTROL_RESET = 'r';\r\nvar CONTROL_ERROR = 'e';\r\nvar CONTROL_PONG = 'o';\r\nvar SWITCH_ACK = 'a';\r\nvar END_TRANSMISSION = 'n';\r\nvar PING = 'p';\r\nvar SERVER_HELLO = 'h';\r\n/**\r\n * Creates a new real-time connection to the server using whichever method works\r\n * best in the current browser.\r\n *\r\n * @constructor\r\n */\r\nvar Connection = /** @class */ (function () {\r\n /**\r\n * @param {!string} id - an id for this connection\r\n * @param {!RepoInfo} repoInfo_ - the info for the endpoint to connect to\r\n * @param {function(Object)} onMessage_ - the callback to be triggered when a server-push message arrives\r\n * @param {function(number, string)} onReady_ - the callback to be triggered when this connection is ready to send messages.\r\n * @param {function()} onDisconnect_ - the callback to be triggered when a connection was lost\r\n * @param {function(string)} onKill_ - the callback to be triggered when this connection has permanently shut down.\r\n * @param {string=} lastSessionId - last session id in persistent connection. is used to clean up old session in real-time server\r\n */\r\n function Connection(id, repoInfo_, onMessage_, onReady_, onDisconnect_, onKill_, lastSessionId) {\r\n this.id = id;\r\n this.repoInfo_ = repoInfo_;\r\n this.onMessage_ = onMessage_;\r\n this.onReady_ = onReady_;\r\n this.onDisconnect_ = onDisconnect_;\r\n this.onKill_ = onKill_;\r\n this.lastSessionId = lastSessionId;\r\n this.connectionCount = 0;\r\n this.pendingDataMessages = [];\r\n this.state_ = 0 /* CONNECTING */;\r\n this.log_ = logWrapper('c:' + this.id + ':');\r\n this.transportManager_ = new TransportManager(repoInfo_);\r\n this.log_('Connection created');\r\n this.start_();\r\n }\r\n /**\r\n * Starts a connection attempt\r\n * @private\r\n */\r\n Connection.prototype.start_ = function () {\r\n var _this = this;\r\n var conn = this.transportManager_.initialTransport();\r\n this.conn_ = new conn(this.nextTransportId_(), this.repoInfo_, undefined, this.lastSessionId);\r\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\r\n // can consider the transport healthy.\r\n this.primaryResponsesRequired_ = conn['responsesRequiredToBeHealthy'] || 0;\r\n var onMessageReceived = this.connReceiver_(this.conn_);\r\n var onConnectionLost = this.disconnReceiver_(this.conn_);\r\n this.tx_ = this.conn_;\r\n this.rx_ = this.conn_;\r\n this.secondaryConn_ = null;\r\n this.isHealthy_ = false;\r\n /*\r\n * Firefox doesn't like when code from one iframe tries to create another iframe by way of the parent frame.\r\n * This can occur in the case of a redirect, i.e. we guessed wrong on what server to connect to and received a reset.\r\n * Somehow, setTimeout seems to make this ok. That doesn't make sense from a security perspective, since you should\r\n * still have the context of your originating frame.\r\n */\r\n setTimeout(function () {\r\n // this.conn_ gets set to null in some of the tests. Check to make sure it still exists before using it\r\n _this.conn_ && _this.conn_.open(onMessageReceived, onConnectionLost);\r\n }, Math.floor(0));\r\n var healthyTimeout_ms = conn['healthyTimeout'] || 0;\r\n if (healthyTimeout_ms > 0) {\r\n this.healthyTimeout_ = setTimeoutNonBlocking(function () {\r\n _this.healthyTimeout_ = null;\r\n if (!_this.isHealthy_) {\r\n if (_this.conn_ &&\r\n _this.conn_.bytesReceived > BYTES_RECEIVED_HEALTHY_OVERRIDE) {\r\n _this.log_('Connection exceeded healthy timeout but has received ' +\r\n _this.conn_.bytesReceived +\r\n ' bytes. Marking connection healthy.');\r\n _this.isHealthy_ = true;\r\n _this.conn_.markConnectionHealthy();\r\n }\r\n else if (_this.conn_ &&\r\n _this.conn_.bytesSent > BYTES_SENT_HEALTHY_OVERRIDE) {\r\n _this.log_('Connection exceeded healthy timeout but has sent ' +\r\n _this.conn_.bytesSent +\r\n ' bytes. Leaving connection alive.');\r\n // NOTE: We don't want to mark it healthy, since we have no guarantee that the bytes have made it to\r\n // the server.\r\n }\r\n else {\r\n _this.log_('Closing unhealthy connection after timeout.');\r\n _this.close();\r\n }\r\n }\r\n }, Math.floor(healthyTimeout_ms));\r\n }\r\n };\r\n /**\r\n * @return {!string}\r\n * @private\r\n */\r\n Connection.prototype.nextTransportId_ = function () {\r\n return 'c:' + this.id + ':' + this.connectionCount++;\r\n };\r\n Connection.prototype.disconnReceiver_ = function (conn) {\r\n var _this = this;\r\n return function (everConnected) {\r\n if (conn === _this.conn_) {\r\n _this.onConnectionLost_(everConnected);\r\n }\r\n else if (conn === _this.secondaryConn_) {\r\n _this.log_('Secondary connection lost.');\r\n _this.onSecondaryConnectionLost_();\r\n }\r\n else {\r\n _this.log_('closing an old connection');\r\n }\r\n };\r\n };\r\n Connection.prototype.connReceiver_ = function (conn) {\r\n var _this = this;\r\n return function (message) {\r\n if (_this.state_ != 2 /* DISCONNECTED */) {\r\n if (conn === _this.rx_) {\r\n _this.onPrimaryMessageReceived_(message);\r\n }\r\n else if (conn === _this.secondaryConn_) {\r\n _this.onSecondaryMessageReceived_(message);\r\n }\r\n else {\r\n _this.log_('message on old connection');\r\n }\r\n }\r\n };\r\n };\r\n /**\r\n *\r\n * @param {Object} dataMsg An arbitrary data message to be sent to the server\r\n */\r\n Connection.prototype.sendRequest = function (dataMsg) {\r\n // wrap in a data message envelope and send it on\r\n var msg = { t: 'd', d: dataMsg };\r\n this.sendData_(msg);\r\n };\r\n Connection.prototype.tryCleanupConnection = function () {\r\n if (this.tx_ === this.secondaryConn_ && this.rx_ === this.secondaryConn_) {\r\n this.log_('cleaning up and promoting a connection: ' + this.secondaryConn_.connId);\r\n this.conn_ = this.secondaryConn_;\r\n this.secondaryConn_ = null;\r\n // the server will shutdown the old connection\r\n }\r\n };\r\n Connection.prototype.onSecondaryControl_ = function (controlData) {\r\n if (MESSAGE_TYPE in controlData) {\r\n var cmd = controlData[MESSAGE_TYPE];\r\n if (cmd === SWITCH_ACK) {\r\n this.upgradeIfSecondaryHealthy_();\r\n }\r\n else if (cmd === CONTROL_RESET) {\r\n // Most likely the session wasn't valid. Abandon the switch attempt\r\n this.log_('Got a reset on secondary, closing it');\r\n this.secondaryConn_.close();\r\n // If we were already using this connection for something, than we need to fully close\r\n if (this.tx_ === this.secondaryConn_ ||\r\n this.rx_ === this.secondaryConn_) {\r\n this.close();\r\n }\r\n }\r\n else if (cmd === CONTROL_PONG) {\r\n this.log_('got pong on secondary.');\r\n this.secondaryResponsesRequired_--;\r\n this.upgradeIfSecondaryHealthy_();\r\n }\r\n }\r\n };\r\n Connection.prototype.onSecondaryMessageReceived_ = function (parsedData) {\r\n var layer = requireKey('t', parsedData);\r\n var data = requireKey('d', parsedData);\r\n if (layer == 'c') {\r\n this.onSecondaryControl_(data);\r\n }\r\n else if (layer == 'd') {\r\n // got a data message, but we're still second connection. Need to buffer it up\r\n this.pendingDataMessages.push(data);\r\n }\r\n else {\r\n throw new Error('Unknown protocol layer: ' + layer);\r\n }\r\n };\r\n Connection.prototype.upgradeIfSecondaryHealthy_ = function () {\r\n if (this.secondaryResponsesRequired_ <= 0) {\r\n this.log_('Secondary connection is healthy.');\r\n this.isHealthy_ = true;\r\n this.secondaryConn_.markConnectionHealthy();\r\n this.proceedWithUpgrade_();\r\n }\r\n else {\r\n // Send a ping to make sure the connection is healthy.\r\n this.log_('sending ping on secondary.');\r\n this.secondaryConn_.send({ t: 'c', d: { t: PING, d: {} } });\r\n }\r\n };\r\n Connection.prototype.proceedWithUpgrade_ = function () {\r\n // tell this connection to consider itself open\r\n this.secondaryConn_.start();\r\n // send ack\r\n this.log_('sending client ack on secondary');\r\n this.secondaryConn_.send({ t: 'c', d: { t: SWITCH_ACK, d: {} } });\r\n // send end packet on primary transport, switch to sending on this one\r\n // can receive on this one, buffer responses until end received on primary transport\r\n this.log_('Ending transmission on primary');\r\n this.conn_.send({ t: 'c', d: { t: END_TRANSMISSION, d: {} } });\r\n this.tx_ = this.secondaryConn_;\r\n this.tryCleanupConnection();\r\n };\r\n Connection.prototype.onPrimaryMessageReceived_ = function (parsedData) {\r\n // Must refer to parsedData properties in quotes, so closure doesn't touch them.\r\n var layer = requireKey('t', parsedData);\r\n var data = requireKey('d', parsedData);\r\n if (layer == 'c') {\r\n this.onControl_(data);\r\n }\r\n else if (layer == 'd') {\r\n this.onDataMessage_(data);\r\n }\r\n };\r\n Connection.prototype.onDataMessage_ = function (message) {\r\n this.onPrimaryResponse_();\r\n // We don't do anything with data messages, just kick them up a level\r\n this.onMessage_(message);\r\n };\r\n Connection.prototype.onPrimaryResponse_ = function () {\r\n if (!this.isHealthy_) {\r\n this.primaryResponsesRequired_--;\r\n if (this.primaryResponsesRequired_ <= 0) {\r\n this.log_('Primary connection is healthy.');\r\n this.isHealthy_ = true;\r\n this.conn_.markConnectionHealthy();\r\n }\r\n }\r\n };\r\n Connection.prototype.onControl_ = function (controlData) {\r\n var cmd = requireKey(MESSAGE_TYPE, controlData);\r\n if (MESSAGE_DATA in controlData) {\r\n var payload = controlData[MESSAGE_DATA];\r\n if (cmd === SERVER_HELLO) {\r\n this.onHandshake_(payload);\r\n }\r\n else if (cmd === END_TRANSMISSION) {\r\n this.log_('recvd end transmission on primary');\r\n this.rx_ = this.secondaryConn_;\r\n for (var i = 0; i < this.pendingDataMessages.length; ++i) {\r\n this.onDataMessage_(this.pendingDataMessages[i]);\r\n }\r\n this.pendingDataMessages = [];\r\n this.tryCleanupConnection();\r\n }\r\n else if (cmd === CONTROL_SHUTDOWN) {\r\n // This was previously the 'onKill' callback passed to the lower-level connection\r\n // payload in this case is the reason for the shutdown. Generally a human-readable error\r\n this.onConnectionShutdown_(payload);\r\n }\r\n else if (cmd === CONTROL_RESET) {\r\n // payload in this case is the host we should contact\r\n this.onReset_(payload);\r\n }\r\n else if (cmd === CONTROL_ERROR) {\r\n error('Server Error: ' + payload);\r\n }\r\n else if (cmd === CONTROL_PONG) {\r\n this.log_('got pong on primary.');\r\n this.onPrimaryResponse_();\r\n this.sendPingOnPrimaryIfNecessary_();\r\n }\r\n else {\r\n error('Unknown control packet command: ' + cmd);\r\n }\r\n }\r\n };\r\n /**\r\n *\r\n * @param {Object} handshake The handshake data returned from the server\r\n * @private\r\n */\r\n Connection.prototype.onHandshake_ = function (handshake) {\r\n var timestamp = handshake.ts;\r\n var version = handshake.v;\r\n var host = handshake.h;\r\n this.sessionId = handshake.s;\r\n this.repoInfo_.updateHost(host);\r\n // if we've already closed the connection, then don't bother trying to progress further\r\n if (this.state_ == 0 /* CONNECTING */) {\r\n this.conn_.start();\r\n this.onConnectionEstablished_(this.conn_, timestamp);\r\n if (PROTOCOL_VERSION !== version) {\r\n warn('Protocol version mismatch detected');\r\n }\r\n // TODO: do we want to upgrade? when? maybe a delay?\r\n this.tryStartUpgrade_();\r\n }\r\n };\r\n Connection.prototype.tryStartUpgrade_ = function () {\r\n var conn = this.transportManager_.upgradeTransport();\r\n if (conn) {\r\n this.startUpgrade_(conn);\r\n }\r\n };\r\n Connection.prototype.startUpgrade_ = function (conn) {\r\n var _this = this;\r\n this.secondaryConn_ = new conn(this.nextTransportId_(), this.repoInfo_, this.sessionId);\r\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\r\n // can consider the transport healthy.\r\n this.secondaryResponsesRequired_ =\r\n conn['responsesRequiredToBeHealthy'] || 0;\r\n var onMessage = this.connReceiver_(this.secondaryConn_);\r\n var onDisconnect = this.disconnReceiver_(this.secondaryConn_);\r\n this.secondaryConn_.open(onMessage, onDisconnect);\r\n // If we haven't successfully upgraded after UPGRADE_TIMEOUT, give up and kill the secondary.\r\n setTimeoutNonBlocking(function () {\r\n if (_this.secondaryConn_) {\r\n _this.log_('Timed out trying to upgrade.');\r\n _this.secondaryConn_.close();\r\n }\r\n }, Math.floor(UPGRADE_TIMEOUT));\r\n };\r\n Connection.prototype.onReset_ = function (host) {\r\n this.log_('Reset packet received. New host: ' + host);\r\n this.repoInfo_.updateHost(host);\r\n // TODO: if we're already \"connected\", we need to trigger a disconnect at the next layer up.\r\n // We don't currently support resets after the connection has already been established\r\n if (this.state_ === 1 /* CONNECTED */) {\r\n this.close();\r\n }\r\n else {\r\n // Close whatever connections we have open and start again.\r\n this.closeConnections_();\r\n this.start_();\r\n }\r\n };\r\n Connection.prototype.onConnectionEstablished_ = function (conn, timestamp) {\r\n var _this = this;\r\n this.log_('Realtime connection established.');\r\n this.conn_ = conn;\r\n this.state_ = 1 /* CONNECTED */;\r\n if (this.onReady_) {\r\n this.onReady_(timestamp, this.sessionId);\r\n this.onReady_ = null;\r\n }\r\n // If after 5 seconds we haven't sent enough requests to the server to get the connection healthy,\r\n // send some pings.\r\n if (this.primaryResponsesRequired_ === 0) {\r\n this.log_('Primary connection is healthy.');\r\n this.isHealthy_ = true;\r\n }\r\n else {\r\n setTimeoutNonBlocking(function () {\r\n _this.sendPingOnPrimaryIfNecessary_();\r\n }, Math.floor(DELAY_BEFORE_SENDING_EXTRA_REQUESTS));\r\n }\r\n };\r\n Connection.prototype.sendPingOnPrimaryIfNecessary_ = function () {\r\n // If the connection isn't considered healthy yet, we'll send a noop ping packet request.\r\n if (!this.isHealthy_ && this.state_ === 1 /* CONNECTED */) {\r\n this.log_('sending ping on primary.');\r\n this.sendData_({ t: 'c', d: { t: PING, d: {} } });\r\n }\r\n };\r\n Connection.prototype.onSecondaryConnectionLost_ = function () {\r\n var conn = this.secondaryConn_;\r\n this.secondaryConn_ = null;\r\n if (this.tx_ === conn || this.rx_ === conn) {\r\n // we are relying on this connection already in some capacity. Therefore, a failure is real\r\n this.close();\r\n }\r\n };\r\n /**\r\n *\r\n * @param {boolean} everConnected Whether or not the connection ever reached a server. Used to determine if\r\n * we should flush the host cache\r\n * @private\r\n */\r\n Connection.prototype.onConnectionLost_ = function (everConnected) {\r\n this.conn_ = null;\r\n // NOTE: IF you're seeing a Firefox error for this line, I think it might be because it's getting\r\n // called on window close and RealtimeState.CONNECTING is no longer defined. Just a guess.\r\n if (!everConnected && this.state_ === 0 /* CONNECTING */) {\r\n this.log_('Realtime connection failed.');\r\n // Since we failed to connect at all, clear any cached entry for this namespace in case the machine went away\r\n if (this.repoInfo_.isCacheableHost()) {\r\n PersistentStorage.remove('host:' + this.repoInfo_.host);\r\n // reset the internal host to what we would show the user, i.e. .firebaseio.com\r\n this.repoInfo_.internalHost = this.repoInfo_.host;\r\n }\r\n }\r\n else if (this.state_ === 1 /* CONNECTED */) {\r\n this.log_('Realtime connection lost.');\r\n }\r\n this.close();\r\n };\r\n /**\r\n *\r\n * @param {string} reason\r\n * @private\r\n */\r\n Connection.prototype.onConnectionShutdown_ = function (reason) {\r\n this.log_('Connection shutdown command received. Shutting down...');\r\n if (this.onKill_) {\r\n this.onKill_(reason);\r\n this.onKill_ = null;\r\n }\r\n // We intentionally don't want to fire onDisconnect (kill is a different case),\r\n // so clear the callback.\r\n this.onDisconnect_ = null;\r\n this.close();\r\n };\r\n Connection.prototype.sendData_ = function (data) {\r\n if (this.state_ !== 1 /* CONNECTED */) {\r\n throw 'Connection is not connected';\r\n }\r\n else {\r\n this.tx_.send(data);\r\n }\r\n };\r\n /**\r\n * Cleans up this connection, calling the appropriate callbacks\r\n */\r\n Connection.prototype.close = function () {\r\n if (this.state_ !== 2 /* DISCONNECTED */) {\r\n this.log_('Closing realtime connection.');\r\n this.state_ = 2 /* DISCONNECTED */;\r\n this.closeConnections_();\r\n if (this.onDisconnect_) {\r\n this.onDisconnect_();\r\n this.onDisconnect_ = null;\r\n }\r\n }\r\n };\r\n /**\r\n *\r\n * @private\r\n */\r\n Connection.prototype.closeConnections_ = function () {\r\n this.log_('Shutting down all connections');\r\n if (this.conn_) {\r\n this.conn_.close();\r\n this.conn_ = null;\r\n }\r\n if (this.secondaryConn_) {\r\n this.secondaryConn_.close();\r\n this.secondaryConn_ = null;\r\n }\r\n if (this.healthyTimeout_) {\r\n clearTimeout(this.healthyTimeout_);\r\n this.healthyTimeout_ = null;\r\n }\r\n };\r\n return Connection;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Interface defining the set of actions that can be performed against the Firebase server\r\n * (basically corresponds to our wire protocol).\r\n *\r\n * @interface\r\n */\r\nvar ServerActions = /** @class */ (function () {\r\n function ServerActions() {\r\n }\r\n /**\r\n * @param {string} pathString\r\n * @param {*} data\r\n * @param {function(string, string)=} onComplete\r\n * @param {string=} hash\r\n */\r\n ServerActions.prototype.put = function (pathString, data, onComplete, hash) { };\r\n /**\r\n * @param {string} pathString\r\n * @param {*} data\r\n * @param {function(string, ?string)} onComplete\r\n * @param {string=} hash\r\n */\r\n ServerActions.prototype.merge = function (pathString, data, onComplete, hash) { };\r\n /**\r\n * Refreshes the auth token for the current connection.\r\n * @param {string} token The authentication token\r\n */\r\n ServerActions.prototype.refreshAuthToken = function (token) { };\r\n /**\r\n * @param {string} pathString\r\n * @param {*} data\r\n * @param {function(string, string)=} onComplete\r\n */\r\n ServerActions.prototype.onDisconnectPut = function (pathString, data, onComplete) { };\r\n /**\r\n * @param {string} pathString\r\n * @param {*} data\r\n * @param {function(string, string)=} onComplete\r\n */\r\n ServerActions.prototype.onDisconnectMerge = function (pathString, data, onComplete) { };\r\n /**\r\n * @param {string} pathString\r\n * @param {function(string, string)=} onComplete\r\n */\r\n ServerActions.prototype.onDisconnectCancel = function (pathString, onComplete) { };\r\n /**\r\n * @param {Object.} stats\r\n */\r\n ServerActions.prototype.reportStats = function (stats) { };\r\n return ServerActions;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar RECONNECT_MIN_DELAY = 1000;\r\nvar RECONNECT_MAX_DELAY_DEFAULT = 60 * 5 * 1000; // 5 minutes in milliseconds (Case: 1858)\r\nvar RECONNECT_MAX_DELAY_FOR_ADMINS = 30 * 1000; // 30 seconds for admin clients (likely to be a backend server)\r\nvar RECONNECT_DELAY_MULTIPLIER = 1.3;\r\nvar RECONNECT_DELAY_RESET_TIMEOUT = 30000; // Reset delay back to MIN_DELAY after being connected for 30sec.\r\nvar SERVER_KILL_INTERRUPT_REASON = 'server_kill';\r\n// If auth fails repeatedly, we'll assume something is wrong and log a warning / back off.\r\nvar INVALID_AUTH_TOKEN_THRESHOLD = 3;\r\n/**\r\n * Firebase connection. Abstracts wire protocol and handles reconnecting.\r\n *\r\n * NOTE: All JSON objects sent to the realtime connection must have property names enclosed\r\n * in quotes to make sure the closure compiler does not minify them.\r\n */\r\nvar PersistentConnection = /** @class */ (function (_super) {\r\n __extends(PersistentConnection, _super);\r\n /**\r\n * @implements {ServerActions}\r\n * @param {!RepoInfo} repoInfo_ Data about the namespace we are connecting to\r\n * @param {function(string, *, boolean, ?number)} onDataUpdate_ A callback for new data from the server\r\n * @param onConnectStatus_\r\n * @param onServerInfoUpdate_\r\n * @param authTokenProvider_\r\n * @param authOverride_\r\n */\r\n function PersistentConnection(repoInfo_, onDataUpdate_, onConnectStatus_, onServerInfoUpdate_, authTokenProvider_, authOverride_) {\r\n var _this = _super.call(this) || this;\r\n _this.repoInfo_ = repoInfo_;\r\n _this.onDataUpdate_ = onDataUpdate_;\r\n _this.onConnectStatus_ = onConnectStatus_;\r\n _this.onServerInfoUpdate_ = onServerInfoUpdate_;\r\n _this.authTokenProvider_ = authTokenProvider_;\r\n _this.authOverride_ = authOverride_;\r\n // Used for diagnostic logging.\r\n _this.id = PersistentConnection.nextPersistentConnectionId_++;\r\n _this.log_ = logWrapper('p:' + _this.id + ':');\r\n /** @private {Object} */\r\n _this.interruptReasons_ = {};\r\n _this.listens_ = {};\r\n _this.outstandingPuts_ = [];\r\n _this.outstandingPutCount_ = 0;\r\n _this.onDisconnectRequestQueue_ = [];\r\n _this.connected_ = false;\r\n _this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n _this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_DEFAULT;\r\n _this.securityDebugCallback_ = null;\r\n _this.lastSessionId = null;\r\n /** @private {number|null} */\r\n _this.establishConnectionTimer_ = null;\r\n /** @private {boolean} */\r\n _this.visible_ = false;\r\n // Before we get connected, we keep a queue of pending messages to send.\r\n _this.requestCBHash_ = {};\r\n _this.requestNumber_ = 0;\r\n /** @private {?{\r\n * sendRequest(Object),\r\n * close()\r\n * }} */\r\n _this.realtime_ = null;\r\n /** @private {string|null} */\r\n _this.authToken_ = null;\r\n _this.forceTokenRefresh_ = false;\r\n _this.invalidAuthTokenCount_ = 0;\r\n _this.firstConnection_ = true;\r\n _this.lastConnectionAttemptTime_ = null;\r\n _this.lastConnectionEstablishedTime_ = null;\r\n if (authOverride_ && !isNodeSdk()) {\r\n throw new Error('Auth override specified in options, but not supported on non Node.js platforms');\r\n }\r\n _this.scheduleConnect_(0);\r\n VisibilityMonitor.getInstance().on('visible', _this.onVisible_, _this);\r\n if (repoInfo_.host.indexOf('fblocal') === -1) {\r\n OnlineMonitor.getInstance().on('online', _this.onOnline_, _this);\r\n }\r\n return _this;\r\n }\r\n /**\r\n * @param {!string} action\r\n * @param {*} body\r\n * @param {function(*)=} onResponse\r\n * @protected\r\n */\r\n PersistentConnection.prototype.sendRequest = function (action, body, onResponse) {\r\n var curReqNum = ++this.requestNumber_;\r\n var msg = { r: curReqNum, a: action, b: body };\r\n this.log_(stringify(msg));\r\n assert(this.connected_, \"sendRequest call when we're not connected not allowed.\");\r\n this.realtime_.sendRequest(msg);\r\n if (onResponse) {\r\n this.requestCBHash_[curReqNum] = onResponse;\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.listen = function (query, currentHashFn, tag, onComplete) {\r\n var queryId = query.queryIdentifier();\r\n var pathString = query.path.toString();\r\n this.log_('Listen called for ' + pathString + ' ' + queryId);\r\n this.listens_[pathString] = this.listens_[pathString] || {};\r\n assert(query.getQueryParams().isDefault() ||\r\n !query.getQueryParams().loadsAllData(), 'listen() called for non-default but complete query');\r\n assert(!this.listens_[pathString][queryId], 'listen() called twice for same path/queryId.');\r\n var listenSpec = {\r\n onComplete: onComplete,\r\n hashFn: currentHashFn,\r\n query: query,\r\n tag: tag\r\n };\r\n this.listens_[pathString][queryId] = listenSpec;\r\n if (this.connected_) {\r\n this.sendListen_(listenSpec);\r\n }\r\n };\r\n /**\r\n * @param {!{onComplete(),\r\n * hashFn():!string,\r\n * query: !Query,\r\n * tag: ?number}} listenSpec\r\n * @private\r\n */\r\n PersistentConnection.prototype.sendListen_ = function (listenSpec) {\r\n var _this = this;\r\n var query = listenSpec.query;\r\n var pathString = query.path.toString();\r\n var queryId = query.queryIdentifier();\r\n this.log_('Listen on ' + pathString + ' for ' + queryId);\r\n var req = { /*path*/ p: pathString };\r\n var action = 'q';\r\n // Only bother to send query if it's non-default.\r\n if (listenSpec.tag) {\r\n req['q'] = query.queryObject();\r\n req['t'] = listenSpec.tag;\r\n }\r\n req[ /*hash*/'h'] = listenSpec.hashFn();\r\n this.sendRequest(action, req, function (message) {\r\n var payload = message[ /*data*/'d'];\r\n var status = message[ /*status*/'s'];\r\n // print warnings in any case...\r\n PersistentConnection.warnOnListenWarnings_(payload, query);\r\n var currentListenSpec = _this.listens_[pathString] && _this.listens_[pathString][queryId];\r\n // only trigger actions if the listen hasn't been removed and readded\r\n if (currentListenSpec === listenSpec) {\r\n _this.log_('listen response', message);\r\n if (status !== 'ok') {\r\n _this.removeListen_(pathString, queryId);\r\n }\r\n if (listenSpec.onComplete) {\r\n listenSpec.onComplete(status, payload);\r\n }\r\n }\r\n });\r\n };\r\n /**\r\n * @param {*} payload\r\n * @param {!Query} query\r\n * @private\r\n */\r\n PersistentConnection.warnOnListenWarnings_ = function (payload, query) {\r\n if (payload && typeof payload === 'object' && contains(payload, 'w')) {\r\n var warnings = safeGet(payload, 'w');\r\n if (Array.isArray(warnings) && ~warnings.indexOf('no_index')) {\r\n var indexSpec = '\".indexOn\": \"' +\r\n query\r\n .getQueryParams()\r\n .getIndex()\r\n .toString() +\r\n '\"';\r\n var indexPath = query.path.toString();\r\n warn(\"Using an unspecified index. Your data will be downloaded and \" +\r\n (\"filtered on the client. Consider adding \" + indexSpec + \" at \") +\r\n (indexPath + \" to your security rules for better performance.\"));\r\n }\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.refreshAuthToken = function (token) {\r\n this.authToken_ = token;\r\n this.log_('Auth token refreshed');\r\n if (this.authToken_) {\r\n this.tryAuth();\r\n }\r\n else {\r\n //If we're connected we want to let the server know to unauthenticate us. If we're not connected, simply delete\r\n //the credential so we dont become authenticated next time we connect.\r\n if (this.connected_) {\r\n this.sendRequest('unauth', {}, function () { });\r\n }\r\n }\r\n this.reduceReconnectDelayIfAdminCredential_(token);\r\n };\r\n /**\r\n * @param {!string} credential\r\n * @private\r\n */\r\n PersistentConnection.prototype.reduceReconnectDelayIfAdminCredential_ = function (credential) {\r\n // NOTE: This isn't intended to be bulletproof (a malicious developer can always just modify the client).\r\n // Additionally, we don't bother resetting the max delay back to the default if auth fails / expires.\r\n var isFirebaseSecret = credential && credential.length === 40;\r\n if (isFirebaseSecret || isAdmin(credential)) {\r\n this.log_('Admin auth credential detected. Reducing max reconnect time.');\r\n this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\r\n }\r\n };\r\n /**\r\n * Attempts to authenticate with the given credentials. If the authentication attempt fails, it's triggered like\r\n * a auth revoked (the connection is closed).\r\n */\r\n PersistentConnection.prototype.tryAuth = function () {\r\n var _this = this;\r\n if (this.connected_ && this.authToken_) {\r\n var token_1 = this.authToken_;\r\n var authMethod = isValidFormat(token_1) ? 'auth' : 'gauth';\r\n var requestData = { cred: token_1 };\r\n if (this.authOverride_ === null) {\r\n requestData['noauth'] = true;\r\n }\r\n else if (typeof this.authOverride_ === 'object') {\r\n requestData['authvar'] = this.authOverride_;\r\n }\r\n this.sendRequest(authMethod, requestData, function (res) {\r\n var status = res[ /*status*/'s'];\r\n var data = res[ /*data*/'d'] || 'error';\r\n if (_this.authToken_ === token_1) {\r\n if (status === 'ok') {\r\n _this.invalidAuthTokenCount_ = 0;\r\n }\r\n else {\r\n // Triggers reconnect and force refresh for auth token\r\n _this.onAuthRevoked_(status, data);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.unlisten = function (query, tag) {\r\n var pathString = query.path.toString();\r\n var queryId = query.queryIdentifier();\r\n this.log_('Unlisten called for ' + pathString + ' ' + queryId);\r\n assert(query.getQueryParams().isDefault() ||\r\n !query.getQueryParams().loadsAllData(), 'unlisten() called for non-default but complete query');\r\n var listen = this.removeListen_(pathString, queryId);\r\n if (listen && this.connected_) {\r\n this.sendUnlisten_(pathString, queryId, query.queryObject(), tag);\r\n }\r\n };\r\n PersistentConnection.prototype.sendUnlisten_ = function (pathString, queryId, queryObj, tag) {\r\n this.log_('Unlisten on ' + pathString + ' for ' + queryId);\r\n var req = { /*path*/ p: pathString };\r\n var action = 'n';\r\n // Only bother sending queryId if it's non-default.\r\n if (tag) {\r\n req['q'] = queryObj;\r\n req['t'] = tag;\r\n }\r\n this.sendRequest(action, req);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.onDisconnectPut = function (pathString, data, onComplete) {\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('o', pathString, data, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'o',\r\n data: data,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.onDisconnectMerge = function (pathString, data, onComplete) {\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('om', pathString, data, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'om',\r\n data: data,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.onDisconnectCancel = function (pathString, onComplete) {\r\n if (this.connected_) {\r\n this.sendOnDisconnect_('oc', pathString, null, onComplete);\r\n }\r\n else {\r\n this.onDisconnectRequestQueue_.push({\r\n pathString: pathString,\r\n action: 'oc',\r\n data: null,\r\n onComplete: onComplete\r\n });\r\n }\r\n };\r\n PersistentConnection.prototype.sendOnDisconnect_ = function (action, pathString, data, onComplete) {\r\n var request = { /*path*/ p: pathString, /*data*/ d: data };\r\n this.log_('onDisconnect ' + action, request);\r\n this.sendRequest(action, request, function (response) {\r\n if (onComplete) {\r\n setTimeout(function () {\r\n onComplete(response[ /*status*/'s'], response[ /* data */'d']);\r\n }, Math.floor(0));\r\n }\r\n });\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.put = function (pathString, data, onComplete, hash) {\r\n this.putInternal('p', pathString, data, onComplete, hash);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.merge = function (pathString, data, onComplete, hash) {\r\n this.putInternal('m', pathString, data, onComplete, hash);\r\n };\r\n PersistentConnection.prototype.putInternal = function (action, pathString, data, onComplete, hash) {\r\n var request = {\r\n /*path*/ p: pathString,\r\n /*data*/ d: data\r\n };\r\n if (hash !== undefined)\r\n request[ /*hash*/'h'] = hash;\r\n // TODO: Only keep track of the most recent put for a given path?\r\n this.outstandingPuts_.push({\r\n action: action,\r\n request: request,\r\n onComplete: onComplete\r\n });\r\n this.outstandingPutCount_++;\r\n var index = this.outstandingPuts_.length - 1;\r\n if (this.connected_) {\r\n this.sendPut_(index);\r\n }\r\n else {\r\n this.log_('Buffering put: ' + pathString);\r\n }\r\n };\r\n PersistentConnection.prototype.sendPut_ = function (index) {\r\n var _this = this;\r\n var action = this.outstandingPuts_[index].action;\r\n var request = this.outstandingPuts_[index].request;\r\n var onComplete = this.outstandingPuts_[index].onComplete;\r\n this.outstandingPuts_[index].queued = this.connected_;\r\n this.sendRequest(action, request, function (message) {\r\n _this.log_(action + ' response', message);\r\n delete _this.outstandingPuts_[index];\r\n _this.outstandingPutCount_--;\r\n // Clean up array occasionally.\r\n if (_this.outstandingPutCount_ === 0) {\r\n _this.outstandingPuts_ = [];\r\n }\r\n if (onComplete)\r\n onComplete(message[ /*status*/'s'], message[ /* data */'d']);\r\n });\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n PersistentConnection.prototype.reportStats = function (stats) {\r\n var _this = this;\r\n // If we're not connected, we just drop the stats.\r\n if (this.connected_) {\r\n var request = { /*counters*/ c: stats };\r\n this.log_('reportStats', request);\r\n this.sendRequest(/*stats*/ 's', request, function (result) {\r\n var status = result[ /*status*/'s'];\r\n if (status !== 'ok') {\r\n var errorReason = result[ /* data */'d'];\r\n _this.log_('reportStats', 'Error sending stats: ' + errorReason);\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * @param {*} message\r\n * @private\r\n */\r\n PersistentConnection.prototype.onDataMessage_ = function (message) {\r\n if ('r' in message) {\r\n // this is a response\r\n this.log_('from server: ' + stringify(message));\r\n var reqNum = message['r'];\r\n var onResponse = this.requestCBHash_[reqNum];\r\n if (onResponse) {\r\n delete this.requestCBHash_[reqNum];\r\n onResponse(message[ /*body*/'b']);\r\n }\r\n }\r\n else if ('error' in message) {\r\n throw 'A server-side error has occurred: ' + message['error'];\r\n }\r\n else if ('a' in message) {\r\n // a and b are action and body, respectively\r\n this.onDataPush_(message['a'], message['b']);\r\n }\r\n };\r\n PersistentConnection.prototype.onDataPush_ = function (action, body) {\r\n this.log_('handleServerMessage', action, body);\r\n if (action === 'd')\r\n this.onDataUpdate_(body[ /*path*/'p'], body[ /*data*/'d'], \r\n /*isMerge*/ false, body['t']);\r\n else if (action === 'm')\r\n this.onDataUpdate_(body[ /*path*/'p'], body[ /*data*/'d'], \r\n /*isMerge=*/ true, body['t']);\r\n else if (action === 'c')\r\n this.onListenRevoked_(body[ /*path*/'p'], body[ /*query*/'q']);\r\n else if (action === 'ac')\r\n this.onAuthRevoked_(body[ /*status code*/'s'], body[ /* explanation */'d']);\r\n else if (action === 'sd')\r\n this.onSecurityDebugPacket_(body);\r\n else\r\n error('Unrecognized action received from server: ' +\r\n stringify(action) +\r\n '\\nAre you using the latest client?');\r\n };\r\n PersistentConnection.prototype.onReady_ = function (timestamp, sessionId) {\r\n this.log_('connection ready');\r\n this.connected_ = true;\r\n this.lastConnectionEstablishedTime_ = new Date().getTime();\r\n this.handleTimestamp_(timestamp);\r\n this.lastSessionId = sessionId;\r\n if (this.firstConnection_) {\r\n this.sendConnectStats_();\r\n }\r\n this.restoreState_();\r\n this.firstConnection_ = false;\r\n this.onConnectStatus_(true);\r\n };\r\n PersistentConnection.prototype.scheduleConnect_ = function (timeout) {\r\n var _this = this;\r\n assert(!this.realtime_, \"Scheduling a connect when we're already connected/ing?\");\r\n if (this.establishConnectionTimer_) {\r\n clearTimeout(this.establishConnectionTimer_);\r\n }\r\n // NOTE: Even when timeout is 0, it's important to do a setTimeout to work around an infuriating \"Security Error\" in\r\n // Firefox when trying to write to our long-polling iframe in some scenarios (e.g. Forge or our unit tests).\r\n this.establishConnectionTimer_ = setTimeout(function () {\r\n _this.establishConnectionTimer_ = null;\r\n _this.establishConnection_();\r\n }, Math.floor(timeout));\r\n };\r\n /**\r\n * @param {boolean} visible\r\n * @private\r\n */\r\n PersistentConnection.prototype.onVisible_ = function (visible) {\r\n // NOTE: Tabbing away and back to a window will defeat our reconnect backoff, but I think that's fine.\r\n if (visible &&\r\n !this.visible_ &&\r\n this.reconnectDelay_ === this.maxReconnectDelay_) {\r\n this.log_('Window became visible. Reducing delay.');\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n this.visible_ = visible;\r\n };\r\n PersistentConnection.prototype.onOnline_ = function (online) {\r\n if (online) {\r\n this.log_('Browser went online.');\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n else {\r\n this.log_('Browser went offline. Killing connection.');\r\n if (this.realtime_) {\r\n this.realtime_.close();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onRealtimeDisconnect_ = function () {\r\n this.log_('data client disconnected');\r\n this.connected_ = false;\r\n this.realtime_ = null;\r\n // Since we don't know if our sent transactions succeeded or not, we need to cancel them.\r\n this.cancelSentTransactions_();\r\n // Clear out the pending requests.\r\n this.requestCBHash_ = {};\r\n if (this.shouldReconnect_()) {\r\n if (!this.visible_) {\r\n this.log_(\"Window isn't visible. Delaying reconnect.\");\r\n this.reconnectDelay_ = this.maxReconnectDelay_;\r\n this.lastConnectionAttemptTime_ = new Date().getTime();\r\n }\r\n else if (this.lastConnectionEstablishedTime_) {\r\n // If we've been connected long enough, reset reconnect delay to minimum.\r\n var timeSinceLastConnectSucceeded = new Date().getTime() - this.lastConnectionEstablishedTime_;\r\n if (timeSinceLastConnectSucceeded > RECONNECT_DELAY_RESET_TIMEOUT)\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n this.lastConnectionEstablishedTime_ = null;\r\n }\r\n var timeSinceLastConnectAttempt = new Date().getTime() - this.lastConnectionAttemptTime_;\r\n var reconnectDelay = Math.max(0, this.reconnectDelay_ - timeSinceLastConnectAttempt);\r\n reconnectDelay = Math.random() * reconnectDelay;\r\n this.log_('Trying to reconnect in ' + reconnectDelay + 'ms');\r\n this.scheduleConnect_(reconnectDelay);\r\n // Adjust reconnect delay for next time.\r\n this.reconnectDelay_ = Math.min(this.maxReconnectDelay_, this.reconnectDelay_ * RECONNECT_DELAY_MULTIPLIER);\r\n }\r\n this.onConnectStatus_(false);\r\n };\r\n PersistentConnection.prototype.establishConnection_ = function () {\r\n if (this.shouldReconnect_()) {\r\n this.log_('Making a connection attempt');\r\n this.lastConnectionAttemptTime_ = new Date().getTime();\r\n this.lastConnectionEstablishedTime_ = null;\r\n var onDataMessage_1 = this.onDataMessage_.bind(this);\r\n var onReady_1 = this.onReady_.bind(this);\r\n var onDisconnect_1 = this.onRealtimeDisconnect_.bind(this);\r\n var connId_1 = this.id + ':' + PersistentConnection.nextConnectionId_++;\r\n var self_1 = this;\r\n var lastSessionId_1 = this.lastSessionId;\r\n var canceled_1 = false;\r\n var connection_1 = null;\r\n var closeFn_1 = function () {\r\n if (connection_1) {\r\n connection_1.close();\r\n }\r\n else {\r\n canceled_1 = true;\r\n onDisconnect_1();\r\n }\r\n };\r\n var sendRequestFn = function (msg) {\r\n assert(connection_1, \"sendRequest call when we're not connected not allowed.\");\r\n connection_1.sendRequest(msg);\r\n };\r\n this.realtime_ = {\r\n close: closeFn_1,\r\n sendRequest: sendRequestFn\r\n };\r\n var forceRefresh = this.forceTokenRefresh_;\r\n this.forceTokenRefresh_ = false;\r\n // First fetch auth token, and establish connection after fetching the token was successful\r\n this.authTokenProvider_\r\n .getToken(forceRefresh)\r\n .then(function (result) {\r\n if (!canceled_1) {\r\n log('getToken() completed. Creating connection.');\r\n self_1.authToken_ = result && result.accessToken;\r\n connection_1 = new Connection(connId_1, self_1.repoInfo_, onDataMessage_1, onReady_1, onDisconnect_1, \r\n /* onKill= */ function (reason) {\r\n warn(reason + ' (' + self_1.repoInfo_.toString() + ')');\r\n self_1.interrupt(SERVER_KILL_INTERRUPT_REASON);\r\n }, lastSessionId_1);\r\n }\r\n else {\r\n log('getToken() completed but was canceled');\r\n }\r\n })\r\n .then(null, function (error$$1) {\r\n self_1.log_('Failed to get token: ' + error$$1);\r\n if (!canceled_1) {\r\n if (CONSTANTS.NODE_ADMIN) {\r\n // This may be a critical error for the Admin Node.js SDK, so log a warning.\r\n // But getToken() may also just have temporarily failed, so we still want to\r\n // continue retrying.\r\n warn(error$$1);\r\n }\r\n closeFn_1();\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * @param {string} reason\r\n */\r\n PersistentConnection.prototype.interrupt = function (reason) {\r\n log('Interrupting connection for reason: ' + reason);\r\n this.interruptReasons_[reason] = true;\r\n if (this.realtime_) {\r\n this.realtime_.close();\r\n }\r\n else {\r\n if (this.establishConnectionTimer_) {\r\n clearTimeout(this.establishConnectionTimer_);\r\n this.establishConnectionTimer_ = null;\r\n }\r\n if (this.connected_) {\r\n this.onRealtimeDisconnect_();\r\n }\r\n }\r\n };\r\n /**\r\n * @param {string} reason\r\n */\r\n PersistentConnection.prototype.resume = function (reason) {\r\n log('Resuming connection for reason: ' + reason);\r\n delete this.interruptReasons_[reason];\r\n if (isEmpty(this.interruptReasons_)) {\r\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n if (!this.realtime_) {\r\n this.scheduleConnect_(0);\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.handleTimestamp_ = function (timestamp) {\r\n var delta = timestamp - new Date().getTime();\r\n this.onServerInfoUpdate_({ serverTimeOffset: delta });\r\n };\r\n PersistentConnection.prototype.cancelSentTransactions_ = function () {\r\n for (var i = 0; i < this.outstandingPuts_.length; i++) {\r\n var put = this.outstandingPuts_[i];\r\n if (put && /*hash*/ 'h' in put.request && put.queued) {\r\n if (put.onComplete)\r\n put.onComplete('disconnect');\r\n delete this.outstandingPuts_[i];\r\n this.outstandingPutCount_--;\r\n }\r\n }\r\n // Clean up array occasionally.\r\n if (this.outstandingPutCount_ === 0)\r\n this.outstandingPuts_ = [];\r\n };\r\n /**\r\n * @param {!string} pathString\r\n * @param {Array.<*>=} query\r\n * @private\r\n */\r\n PersistentConnection.prototype.onListenRevoked_ = function (pathString, query) {\r\n // Remove the listen and manufacture a \"permission_denied\" error for the failed listen.\r\n var queryId;\r\n if (!query) {\r\n queryId = 'default';\r\n }\r\n else {\r\n queryId = query.map(function (q) { return ObjectToUniqueKey(q); }).join('$');\r\n }\r\n var listen = this.removeListen_(pathString, queryId);\r\n if (listen && listen.onComplete)\r\n listen.onComplete('permission_denied');\r\n };\r\n /**\r\n * @param {!string} pathString\r\n * @param {!string} queryId\r\n * @return {{queries:Array., onComplete:function(string)}}\r\n * @private\r\n */\r\n PersistentConnection.prototype.removeListen_ = function (pathString, queryId) {\r\n var normalizedPathString = new Path(pathString).toString(); // normalize path.\r\n var listen;\r\n if (this.listens_[normalizedPathString] !== undefined) {\r\n listen = this.listens_[normalizedPathString][queryId];\r\n delete this.listens_[normalizedPathString][queryId];\r\n if (getCount(this.listens_[normalizedPathString]) === 0) {\r\n delete this.listens_[normalizedPathString];\r\n }\r\n }\r\n else {\r\n // all listens for this path has already been removed\r\n listen = undefined;\r\n }\r\n return listen;\r\n };\r\n PersistentConnection.prototype.onAuthRevoked_ = function (statusCode, explanation) {\r\n log('Auth token revoked: ' + statusCode + '/' + explanation);\r\n this.authToken_ = null;\r\n this.forceTokenRefresh_ = true;\r\n this.realtime_.close();\r\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\r\n // We'll wait a couple times before logging the warning / increasing the\r\n // retry period since oauth tokens will report as \"invalid\" if they're\r\n // just expired. Plus there may be transient issues that resolve themselves.\r\n this.invalidAuthTokenCount_++;\r\n if (this.invalidAuthTokenCount_ >= INVALID_AUTH_TOKEN_THRESHOLD) {\r\n // Set a long reconnect delay because recovery is unlikely\r\n this.reconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\r\n // Notify the auth token provider that the token is invalid, which will log\r\n // a warning\r\n this.authTokenProvider_.notifyForInvalidToken();\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.onSecurityDebugPacket_ = function (body) {\r\n if (this.securityDebugCallback_) {\r\n this.securityDebugCallback_(body);\r\n }\r\n else {\r\n if ('msg' in body) {\r\n console.log('FIREBASE: ' + body['msg'].replace('\\n', '\\nFIREBASE: '));\r\n }\r\n }\r\n };\r\n PersistentConnection.prototype.restoreState_ = function () {\r\n var _this = this;\r\n //Re-authenticate ourselves if we have a credential stored.\r\n this.tryAuth();\r\n // Puts depend on having received the corresponding data update from the server before they complete, so we must\r\n // make sure to send listens before puts.\r\n forEach(this.listens_, function (pathString, queries) {\r\n forEach(queries, function (key, listenSpec) {\r\n _this.sendListen_(listenSpec);\r\n });\r\n });\r\n for (var i = 0; i < this.outstandingPuts_.length; i++) {\r\n if (this.outstandingPuts_[i])\r\n this.sendPut_(i);\r\n }\r\n while (this.onDisconnectRequestQueue_.length) {\r\n var request = this.onDisconnectRequestQueue_.shift();\r\n this.sendOnDisconnect_(request.action, request.pathString, request.data, request.onComplete);\r\n }\r\n };\r\n /**\r\n * Sends client stats for first connection\r\n * @private\r\n */\r\n PersistentConnection.prototype.sendConnectStats_ = function () {\r\n var stats = {};\r\n var clientName = 'js';\r\n if (CONSTANTS.NODE_ADMIN) {\r\n clientName = 'admin_node';\r\n }\r\n else if (CONSTANTS.NODE_CLIENT) {\r\n clientName = 'node';\r\n }\r\n stats['sdk.' + clientName + '.' + firebase.SDK_VERSION.replace(/\\./g, '-')] = 1;\r\n if (isMobileCordova()) {\r\n stats['framework.cordova'] = 1;\r\n }\r\n else if (isReactNative()) {\r\n stats['framework.reactnative'] = 1;\r\n }\r\n this.reportStats(stats);\r\n };\r\n /**\r\n * @return {boolean}\r\n * @private\r\n */\r\n PersistentConnection.prototype.shouldReconnect_ = function () {\r\n var online = OnlineMonitor.getInstance().currentlyOnline();\r\n return isEmpty(this.interruptReasons_) && online;\r\n };\r\n /**\r\n * @private\r\n */\r\n PersistentConnection.nextPersistentConnectionId_ = 0;\r\n /**\r\n * Counter for number of connections created. Mainly used for tagging in the logs\r\n * @type {number}\r\n * @private\r\n */\r\n PersistentConnection.nextConnectionId_ = 0;\r\n return PersistentConnection;\r\n}(ServerActions));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * An implementation of ServerActions that communicates with the server via REST requests.\r\n * This is mostly useful for compatibility with crawlers, where we don't want to spin up a full\r\n * persistent connection (using WebSockets or long-polling)\r\n */\r\nvar ReadonlyRestClient = /** @class */ (function (_super) {\r\n __extends(ReadonlyRestClient, _super);\r\n /**\r\n * @param {!RepoInfo} repoInfo_ Data about the namespace we are connecting to\r\n * @param {function(string, *, boolean, ?number)} onDataUpdate_ A callback for new data from the server\r\n * @param {AuthTokenProvider} authTokenProvider_\r\n * @implements {ServerActions}\r\n */\r\n function ReadonlyRestClient(repoInfo_, onDataUpdate_, authTokenProvider_) {\r\n var _this = _super.call(this) || this;\r\n _this.repoInfo_ = repoInfo_;\r\n _this.onDataUpdate_ = onDataUpdate_;\r\n _this.authTokenProvider_ = authTokenProvider_;\r\n /** @private {function(...[*])} */\r\n _this.log_ = logWrapper('p:rest:');\r\n /**\r\n * We don't actually need to track listens, except to prevent us calling an onComplete for a listen\r\n * that's been removed. :-/\r\n *\r\n * @private {!Object.}\r\n */\r\n _this.listens_ = {};\r\n return _this;\r\n }\r\n ReadonlyRestClient.prototype.reportStats = function (stats) {\r\n throw new Error('Method not implemented.');\r\n };\r\n /**\r\n * @param {!Query} query\r\n * @param {?number=} tag\r\n * @return {string}\r\n * @private\r\n */\r\n ReadonlyRestClient.getListenId_ = function (query, tag) {\r\n if (tag !== undefined) {\r\n return 'tag$' + tag;\r\n }\r\n else {\r\n assert(query.getQueryParams().isDefault(), \"should have a tag if it's not a default query.\");\r\n return query.path.toString();\r\n }\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.listen = function (query, currentHashFn, tag, onComplete) {\r\n var _this = this;\r\n var pathString = query.path.toString();\r\n this.log_('Listen called for ' + pathString + ' ' + query.queryIdentifier());\r\n // Mark this listener so we can tell if it's removed.\r\n var listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n var thisListen = {};\r\n this.listens_[listenId] = thisListen;\r\n var queryStringParamaters = query\r\n .getQueryParams()\r\n .toRestQueryStringParameters();\r\n this.restRequest_(pathString + '.json', queryStringParamaters, function (error$$1, result) {\r\n var data = result;\r\n if (error$$1 === 404) {\r\n data = null;\r\n error$$1 = null;\r\n }\r\n if (error$$1 === null) {\r\n _this.onDataUpdate_(pathString, data, /*isMerge=*/ false, tag);\r\n }\r\n if (safeGet(_this.listens_, listenId) === thisListen) {\r\n var status_1;\r\n if (!error$$1) {\r\n status_1 = 'ok';\r\n }\r\n else if (error$$1 == 401) {\r\n status_1 = 'permission_denied';\r\n }\r\n else {\r\n status_1 = 'rest_error:' + error$$1;\r\n }\r\n onComplete(status_1, null);\r\n }\r\n });\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.unlisten = function (query, tag) {\r\n var listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n delete this.listens_[listenId];\r\n };\r\n /** @inheritDoc */\r\n ReadonlyRestClient.prototype.refreshAuthToken = function (token) {\r\n // no-op since we just always call getToken.\r\n };\r\n /**\r\n * Performs a REST request to the given path, with the provided query string parameters,\r\n * and any auth credentials we have.\r\n *\r\n * @param {!string} pathString\r\n * @param {!Object.} queryStringParameters\r\n * @param {?function(?number, *=)} callback\r\n * @private\r\n */\r\n ReadonlyRestClient.prototype.restRequest_ = function (pathString, queryStringParameters, callback) {\r\n var _this = this;\r\n if (queryStringParameters === void 0) { queryStringParameters = {}; }\r\n queryStringParameters['format'] = 'export';\r\n this.authTokenProvider_\r\n .getToken(/*forceRefresh=*/ false)\r\n .then(function (authTokenData) {\r\n var authToken = authTokenData && authTokenData.accessToken;\r\n if (authToken) {\r\n queryStringParameters['auth'] = authToken;\r\n }\r\n var url = (_this.repoInfo_.secure ? 'https://' : 'http://') +\r\n _this.repoInfo_.host +\r\n pathString +\r\n '?' +\r\n querystring(queryStringParameters);\r\n _this.log_('Sending REST request for ' + url);\r\n var xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = function () {\r\n if (callback && xhr.readyState === 4) {\r\n _this.log_('REST Response for ' + url + ' received. status:', xhr.status, 'response:', xhr.responseText);\r\n var res = null;\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n try {\r\n res = jsonEval(xhr.responseText);\r\n }\r\n catch (e) {\r\n warn('Failed to parse JSON response for ' +\r\n url +\r\n ': ' +\r\n xhr.responseText);\r\n }\r\n callback(null, res);\r\n }\r\n else {\r\n // 401 and 404 are expected.\r\n if (xhr.status !== 401 && xhr.status !== 404) {\r\n warn('Got unsuccessful REST response for ' +\r\n url +\r\n ' Status: ' +\r\n xhr.status);\r\n }\r\n callback(xhr.status);\r\n }\r\n callback = null;\r\n }\r\n };\r\n xhr.open('GET', url, /*asynchronous=*/ true);\r\n xhr.send();\r\n });\r\n };\r\n return ReadonlyRestClient;\r\n}(ServerActions));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar INTERRUPT_REASON = 'repo_interrupt';\r\n/**\r\n * A connection to a single data repository.\r\n */\r\nvar Repo = /** @class */ (function () {\r\n /**\r\n * @param {!RepoInfo} repoInfo_\r\n * @param {boolean} forceRestClient\r\n * @param {!FirebaseApp} app\r\n */\r\n function Repo(repoInfo_, forceRestClient, app) {\r\n var _this = this;\r\n this.repoInfo_ = repoInfo_;\r\n this.app = app;\r\n this.dataUpdateCount = 0;\r\n this.statsListener_ = null;\r\n this.eventQueue_ = new EventQueue();\r\n this.nextWriteId_ = 1;\r\n this.interceptServerDataCallback_ = null;\r\n // A list of data pieces and paths to be set when this client disconnects.\r\n this.onDisconnect_ = new SparseSnapshotTree();\r\n /**\r\n * TODO: This should be @private but it's used by test_access.js and internal.js\r\n * @type {?PersistentConnection}\r\n */\r\n this.persistentConnection_ = null;\r\n /** @type {!AuthTokenProvider} */\r\n var authTokenProvider = new AuthTokenProvider(app);\r\n this.stats_ = StatsManager.getCollection(repoInfo_);\r\n if (forceRestClient || beingCrawled()) {\r\n this.server_ = new ReadonlyRestClient(this.repoInfo_, this.onDataUpdate_.bind(this), authTokenProvider);\r\n // Minor hack: Fire onConnect immediately, since there's no actual connection.\r\n setTimeout(this.onConnectStatus_.bind(this, true), 0);\r\n }\r\n else {\r\n var authOverride = app.options['databaseAuthVariableOverride'];\r\n // Validate authOverride\r\n if (typeof authOverride !== 'undefined' && authOverride !== null) {\r\n if (typeof authOverride !== 'object') {\r\n throw new Error('Only objects are supported for option databaseAuthVariableOverride');\r\n }\r\n try {\r\n stringify(authOverride);\r\n }\r\n catch (e) {\r\n throw new Error('Invalid authOverride provided: ' + e);\r\n }\r\n }\r\n this.persistentConnection_ = new PersistentConnection(this.repoInfo_, this.onDataUpdate_.bind(this), this.onConnectStatus_.bind(this), this.onServerInfoUpdate_.bind(this), authTokenProvider, authOverride);\r\n this.server_ = this.persistentConnection_;\r\n }\r\n authTokenProvider.addTokenChangeListener(function (token) {\r\n _this.server_.refreshAuthToken(token);\r\n });\r\n // In the case of multiple Repos for the same repoInfo (i.e. there are multiple Firebase.Contexts being used),\r\n // we only want to create one StatsReporter. As such, we'll report stats over the first Repo created.\r\n this.statsReporter_ = StatsManager.getOrCreateReporter(repoInfo_, function () { return new StatsReporter(_this.stats_, _this.server_); });\r\n this.transactions_init_();\r\n // Used for .info.\r\n this.infoData_ = new SnapshotHolder();\r\n this.infoSyncTree_ = new SyncTree({\r\n startListening: function (query, tag, currentHashFn, onComplete) {\r\n var infoEvents = [];\r\n var node = _this.infoData_.getNode(query.path);\r\n // This is possibly a hack, but we have different semantics for .info endpoints. We don't raise null events\r\n // on initial data...\r\n if (!node.isEmpty()) {\r\n infoEvents = _this.infoSyncTree_.applyServerOverwrite(query.path, node);\r\n setTimeout(function () {\r\n onComplete('ok');\r\n }, 0);\r\n }\r\n return infoEvents;\r\n },\r\n stopListening: function () { }\r\n });\r\n this.updateInfo_('connected', false);\r\n this.serverSyncTree_ = new SyncTree({\r\n startListening: function (query, tag, currentHashFn, onComplete) {\r\n _this.server_.listen(query, currentHashFn, tag, function (status, data) {\r\n var events = onComplete(status, data);\r\n _this.eventQueue_.raiseEventsForChangedPath(query.path, events);\r\n });\r\n // No synchronous events for network-backed sync trees\r\n return [];\r\n },\r\n stopListening: function (query, tag) {\r\n _this.server_.unlisten(query, tag);\r\n }\r\n });\r\n }\r\n /**\r\n * @return {string} The URL corresponding to the root of this Firebase.\r\n */\r\n Repo.prototype.toString = function () {\r\n return ((this.repoInfo_.secure ? 'https://' : 'http://') + this.repoInfo_.host);\r\n };\r\n /**\r\n * @return {!string} The namespace represented by the repo.\r\n */\r\n Repo.prototype.name = function () {\r\n return this.repoInfo_.namespace;\r\n };\r\n /**\r\n * @return {!number} The time in milliseconds, taking the server offset into account if we have one.\r\n */\r\n Repo.prototype.serverTime = function () {\r\n var offsetNode = this.infoData_.getNode(new Path('.info/serverTimeOffset'));\r\n var offset = offsetNode.val() || 0;\r\n return new Date().getTime() + offset;\r\n };\r\n /**\r\n * Generate ServerValues using some variables from the repo object.\r\n * @return {!Object}\r\n */\r\n Repo.prototype.generateServerValues = function () {\r\n return generateWithValues({\r\n timestamp: this.serverTime()\r\n });\r\n };\r\n /**\r\n * Called by realtime when we get new messages from the server.\r\n *\r\n * @private\r\n * @param {string} pathString\r\n * @param {*} data\r\n * @param {boolean} isMerge\r\n * @param {?number} tag\r\n */\r\n Repo.prototype.onDataUpdate_ = function (pathString, data, isMerge, tag) {\r\n // For testing.\r\n this.dataUpdateCount++;\r\n var path = new Path(pathString);\r\n data = this.interceptServerDataCallback_\r\n ? this.interceptServerDataCallback_(pathString, data)\r\n : data;\r\n var events = [];\r\n if (tag) {\r\n if (isMerge) {\r\n var taggedChildren = map(data, function (raw) {\r\n return nodeFromJSON$1(raw);\r\n });\r\n events = this.serverSyncTree_.applyTaggedQueryMerge(path, taggedChildren, tag);\r\n }\r\n else {\r\n var taggedSnap = nodeFromJSON$1(data);\r\n events = this.serverSyncTree_.applyTaggedQueryOverwrite(path, taggedSnap, tag);\r\n }\r\n }\r\n else if (isMerge) {\r\n var changedChildren = map(data, function (raw) {\r\n return nodeFromJSON$1(raw);\r\n });\r\n events = this.serverSyncTree_.applyServerMerge(path, changedChildren);\r\n }\r\n else {\r\n var snap = nodeFromJSON$1(data);\r\n events = this.serverSyncTree_.applyServerOverwrite(path, snap);\r\n }\r\n var affectedPath = path;\r\n if (events.length > 0) {\r\n // Since we have a listener outstanding for each transaction, receiving any events\r\n // is a proxy for some change having occurred.\r\n affectedPath = this.rerunTransactions_(path);\r\n }\r\n this.eventQueue_.raiseEventsForChangedPath(affectedPath, events);\r\n };\r\n /**\r\n * TODO: This should be @private but it's used by test_access.js and internal.js\r\n * @param {?function(!string, *):*} callback\r\n * @private\r\n */\r\n Repo.prototype.interceptServerData_ = function (callback) {\r\n this.interceptServerDataCallback_ = callback;\r\n };\r\n /**\r\n * @param {!boolean} connectStatus\r\n * @private\r\n */\r\n Repo.prototype.onConnectStatus_ = function (connectStatus) {\r\n this.updateInfo_('connected', connectStatus);\r\n if (connectStatus === false) {\r\n this.runOnDisconnectEvents_();\r\n }\r\n };\r\n /**\r\n * @param {!Object} updates\r\n * @private\r\n */\r\n Repo.prototype.onServerInfoUpdate_ = function (updates) {\r\n var _this = this;\r\n each(updates, function (value, key) {\r\n _this.updateInfo_(key, value);\r\n });\r\n };\r\n /**\r\n *\r\n * @param {!string} pathString\r\n * @param {*} value\r\n * @private\r\n */\r\n Repo.prototype.updateInfo_ = function (pathString, value) {\r\n var path = new Path('/.info/' + pathString);\r\n var newNode = nodeFromJSON$1(value);\r\n this.infoData_.updateSnapshot(path, newNode);\r\n var events = this.infoSyncTree_.applyServerOverwrite(path, newNode);\r\n this.eventQueue_.raiseEventsForChangedPath(path, events);\r\n };\r\n /**\r\n * @return {!number}\r\n * @private\r\n */\r\n Repo.prototype.getNextWriteId_ = function () {\r\n return this.nextWriteId_++;\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @param {*} newVal\r\n * @param {number|string|null} newPriority\r\n * @param {?function(?Error, *=)} onComplete\r\n */\r\n Repo.prototype.setWithPriority = function (path, newVal, newPriority, onComplete) {\r\n var _this = this;\r\n this.log_('set', {\r\n path: path.toString(),\r\n value: newVal,\r\n priority: newPriority\r\n });\r\n // TODO: Optimize this behavior to either (a) store flag to skip resolving where possible and / or\r\n // (b) store unresolved paths on JSON parse\r\n var serverValues = this.generateServerValues();\r\n var newNodeUnresolved = nodeFromJSON$1(newVal, newPriority);\r\n var newNode = resolveDeferredValueSnapshot(newNodeUnresolved, serverValues);\r\n var writeId = this.getNextWriteId_();\r\n var events = this.serverSyncTree_.applyUserOverwrite(path, newNode, writeId, true);\r\n this.eventQueue_.queueEvents(events);\r\n this.server_.put(path.toString(), newNodeUnresolved.val(/*export=*/ true), function (status, errorReason) {\r\n var success = status === 'ok';\r\n if (!success) {\r\n warn('set at ' + path + ' failed: ' + status);\r\n }\r\n var clearEvents = _this.serverSyncTree_.ackUserWrite(writeId, !success);\r\n _this.eventQueue_.raiseEventsForChangedPath(path, clearEvents);\r\n _this.callOnCompleteCallback(onComplete, status, errorReason);\r\n });\r\n var affectedPath = this.abortTransactions_(path);\r\n this.rerunTransactions_(affectedPath);\r\n // We queued the events above, so just flush the queue here\r\n this.eventQueue_.raiseEventsForChangedPath(affectedPath, []);\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @param {!Object} childrenToMerge\r\n * @param {?function(?Error, *=)} onComplete\r\n */\r\n Repo.prototype.update = function (path, childrenToMerge, onComplete) {\r\n var _this = this;\r\n this.log_('update', { path: path.toString(), value: childrenToMerge });\r\n // Start with our existing data and merge each child into it.\r\n var empty = true;\r\n var serverValues = this.generateServerValues();\r\n var changedChildren = {};\r\n forEach(childrenToMerge, function (changedKey, changedValue) {\r\n empty = false;\r\n var newNodeUnresolved = nodeFromJSON$1(changedValue);\r\n changedChildren[changedKey] = resolveDeferredValueSnapshot(newNodeUnresolved, serverValues);\r\n });\r\n if (!empty) {\r\n var writeId_1 = this.getNextWriteId_();\r\n var events = this.serverSyncTree_.applyUserMerge(path, changedChildren, writeId_1);\r\n this.eventQueue_.queueEvents(events);\r\n this.server_.merge(path.toString(), childrenToMerge, function (status, errorReason) {\r\n var success = status === 'ok';\r\n if (!success) {\r\n warn('update at ' + path + ' failed: ' + status);\r\n }\r\n var clearEvents = _this.serverSyncTree_.ackUserWrite(writeId_1, !success);\r\n var affectedPath = clearEvents.length > 0 ? _this.rerunTransactions_(path) : path;\r\n _this.eventQueue_.raiseEventsForChangedPath(affectedPath, clearEvents);\r\n _this.callOnCompleteCallback(onComplete, status, errorReason);\r\n });\r\n forEach(childrenToMerge, function (changedPath) {\r\n var affectedPath = _this.abortTransactions_(path.child(changedPath));\r\n _this.rerunTransactions_(affectedPath);\r\n });\r\n // We queued the events above, so just flush the queue here\r\n this.eventQueue_.raiseEventsForChangedPath(path, []);\r\n }\r\n else {\r\n log(\"update() called with empty data. Don't do anything.\");\r\n this.callOnCompleteCallback(onComplete, 'ok');\r\n }\r\n };\r\n /**\r\n * Applies all of the changes stored up in the onDisconnect_ tree.\r\n * @private\r\n */\r\n Repo.prototype.runOnDisconnectEvents_ = function () {\r\n var _this = this;\r\n this.log_('onDisconnectEvents');\r\n var serverValues = this.generateServerValues();\r\n var resolvedOnDisconnectTree = resolveDeferredValueTree(this.onDisconnect_, serverValues);\r\n var events = [];\r\n resolvedOnDisconnectTree.forEachTree(Path.Empty, function (path, snap) {\r\n events = events.concat(_this.serverSyncTree_.applyServerOverwrite(path, snap));\r\n var affectedPath = _this.abortTransactions_(path);\r\n _this.rerunTransactions_(affectedPath);\r\n });\r\n this.onDisconnect_ = new SparseSnapshotTree();\r\n this.eventQueue_.raiseEventsForChangedPath(Path.Empty, events);\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @param {?function(?Error, *=)} onComplete\r\n */\r\n Repo.prototype.onDisconnectCancel = function (path, onComplete) {\r\n var _this = this;\r\n this.server_.onDisconnectCancel(path.toString(), function (status, errorReason) {\r\n if (status === 'ok') {\r\n _this.onDisconnect_.forget(path);\r\n }\r\n _this.callOnCompleteCallback(onComplete, status, errorReason);\r\n });\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @param {*} value\r\n * @param {?function(?Error, *=)} onComplete\r\n */\r\n Repo.prototype.onDisconnectSet = function (path, value, onComplete) {\r\n var _this = this;\r\n var newNode = nodeFromJSON$1(value);\r\n this.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), function (status, errorReason) {\r\n if (status === 'ok') {\r\n _this.onDisconnect_.remember(path, newNode);\r\n }\r\n _this.callOnCompleteCallback(onComplete, status, errorReason);\r\n });\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @param {*} value\r\n * @param {*} priority\r\n * @param {?function(?Error, *=)} onComplete\r\n */\r\n Repo.prototype.onDisconnectSetWithPriority = function (path, value, priority, onComplete) {\r\n var _this = this;\r\n var newNode = nodeFromJSON$1(value, priority);\r\n this.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), function (status, errorReason) {\r\n if (status === 'ok') {\r\n _this.onDisconnect_.remember(path, newNode);\r\n }\r\n _this.callOnCompleteCallback(onComplete, status, errorReason);\r\n });\r\n };\r\n /**\r\n * @param {!Path} path\r\n * @param {*} childrenToMerge\r\n * @param {?function(?Error, *=)} onComplete\r\n */\r\n Repo.prototype.onDisconnectUpdate = function (path, childrenToMerge, onComplete) {\r\n var _this = this;\r\n if (isEmpty(childrenToMerge)) {\r\n log(\"onDisconnect().update() called with empty data. Don't do anything.\");\r\n this.callOnCompleteCallback(onComplete, 'ok');\r\n return;\r\n }\r\n this.server_.onDisconnectMerge(path.toString(), childrenToMerge, function (status, errorReason) {\r\n if (status === 'ok') {\r\n forEach(childrenToMerge, function (childName, childNode) {\r\n var newChildNode = nodeFromJSON$1(childNode);\r\n _this.onDisconnect_.remember(path.child(childName), newChildNode);\r\n });\r\n }\r\n _this.callOnCompleteCallback(onComplete, status, errorReason);\r\n });\r\n };\r\n /**\r\n * @param {!Query} query\r\n * @param {!EventRegistration} eventRegistration\r\n */\r\n Repo.prototype.addEventCallbackForQuery = function (query, eventRegistration) {\r\n var events;\r\n if (query.path.getFront() === '.info') {\r\n events = this.infoSyncTree_.addEventRegistration(query, eventRegistration);\r\n }\r\n else {\r\n events = this.serverSyncTree_.addEventRegistration(query, eventRegistration);\r\n }\r\n this.eventQueue_.raiseEventsAtPath(query.path, events);\r\n };\r\n /**\r\n * @param {!Query} query\r\n * @param {?EventRegistration} eventRegistration\r\n */\r\n Repo.prototype.removeEventCallbackForQuery = function (query, eventRegistration) {\r\n // These are guaranteed not to raise events, since we're not passing in a cancelError. However, we can future-proof\r\n // a little bit by handling the return values anyways.\r\n var events;\r\n if (query.path.getFront() === '.info') {\r\n events = this.infoSyncTree_.removeEventRegistration(query, eventRegistration);\r\n }\r\n else {\r\n events = this.serverSyncTree_.removeEventRegistration(query, eventRegistration);\r\n }\r\n this.eventQueue_.raiseEventsAtPath(query.path, events);\r\n };\r\n Repo.prototype.interrupt = function () {\r\n if (this.persistentConnection_) {\r\n this.persistentConnection_.interrupt(INTERRUPT_REASON);\r\n }\r\n };\r\n Repo.prototype.resume = function () {\r\n if (this.persistentConnection_) {\r\n this.persistentConnection_.resume(INTERRUPT_REASON);\r\n }\r\n };\r\n Repo.prototype.stats = function (showDelta) {\r\n if (showDelta === void 0) { showDelta = false; }\r\n if (typeof console === 'undefined')\r\n return;\r\n var stats;\r\n if (showDelta) {\r\n if (!this.statsListener_)\r\n this.statsListener_ = new StatsListener(this.stats_);\r\n stats = this.statsListener_.get();\r\n }\r\n else {\r\n stats = this.stats_.get();\r\n }\r\n var longestName = Object.keys(stats).reduce(function (previousValue, currentValue) {\r\n return Math.max(currentValue.length, previousValue);\r\n }, 0);\r\n forEach(stats, function (stat, value) {\r\n // pad stat names to be the same length (plus 2 extra spaces).\r\n for (var i = stat.length; i < longestName + 2; i++)\r\n stat += ' ';\r\n console.log(stat + value);\r\n });\r\n };\r\n Repo.prototype.statsIncrementCounter = function (metric) {\r\n this.stats_.incrementCounter(metric);\r\n this.statsReporter_.includeStat(metric);\r\n };\r\n /**\r\n * @param {...*} var_args\r\n * @private\r\n */\r\n Repo.prototype.log_ = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var prefix = '';\r\n if (this.persistentConnection_) {\r\n prefix = this.persistentConnection_.id + ':';\r\n }\r\n log.apply(void 0, [prefix].concat(var_args));\r\n };\r\n /**\r\n * @param {?function(?Error, *=)} callback\r\n * @param {!string} status\r\n * @param {?string=} errorReason\r\n */\r\n Repo.prototype.callOnCompleteCallback = function (callback, status, errorReason) {\r\n if (callback) {\r\n exceptionGuard(function () {\r\n if (status == 'ok') {\r\n callback(null);\r\n }\r\n else {\r\n var code = (status || 'error').toUpperCase();\r\n var message = code;\r\n if (errorReason)\r\n message += ': ' + errorReason;\r\n var error$$1 = new Error(message);\r\n error$$1.code = code;\r\n callback(error$$1);\r\n }\r\n });\r\n }\r\n };\r\n Object.defineProperty(Repo.prototype, \"database\", {\r\n get: function () {\r\n return this.__database || (this.__database = new Database(this));\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Repo;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Filters nodes by range and uses an IndexFilter to track any changes after filtering the node\r\n *\r\n * @constructor\r\n * @implements {NodeFilter}\r\n */\r\nvar RangedFilter = /** @class */ (function () {\r\n /**\r\n * @param {!QueryParams} params\r\n */\r\n function RangedFilter(params) {\r\n this.indexedFilter_ = new IndexedFilter(params.getIndex());\r\n this.index_ = params.getIndex();\r\n this.startPost_ = RangedFilter.getStartPost_(params);\r\n this.endPost_ = RangedFilter.getEndPost_(params);\r\n }\r\n /**\r\n * @return {!NamedNode}\r\n */\r\n RangedFilter.prototype.getStartPost = function () {\r\n return this.startPost_;\r\n };\r\n /**\r\n * @return {!NamedNode}\r\n */\r\n RangedFilter.prototype.getEndPost = function () {\r\n return this.endPost_;\r\n };\r\n /**\r\n * @param {!NamedNode} node\r\n * @return {boolean}\r\n */\r\n RangedFilter.prototype.matches = function (node) {\r\n return (this.index_.compare(this.getStartPost(), node) <= 0 &&\r\n this.index_.compare(node, this.getEndPost()) <= 0);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n RangedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n if (!this.matches(new NamedNode(key, newChild))) {\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n return this.indexedFilter_.updateChild(snap, key, newChild, affectedPath, source, optChangeAccumulator);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n RangedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n if (newSnap.isLeafNode()) {\r\n // Make sure we have a children node with the correct index, not a leaf node;\r\n newSnap = ChildrenNode.EMPTY_NODE;\r\n }\r\n var filtered = newSnap.withIndex(this.index_);\r\n // Don't support priorities on queries\r\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\r\n var self = this;\r\n newSnap.forEachChild(PRIORITY_INDEX, function (key, childNode) {\r\n if (!self.matches(new NamedNode(key, childNode))) {\r\n filtered = filtered.updateImmediateChild(key, ChildrenNode.EMPTY_NODE);\r\n }\r\n });\r\n return this.indexedFilter_.updateFullNode(oldSnap, filtered, optChangeAccumulator);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n RangedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n // Don't support priorities on queries\r\n return oldSnap;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n RangedFilter.prototype.filtersNodes = function () {\r\n return true;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n RangedFilter.prototype.getIndexedFilter = function () {\r\n return this.indexedFilter_;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n RangedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n /**\r\n * @param {!QueryParams} params\r\n * @return {!NamedNode}\r\n * @private\r\n */\r\n RangedFilter.getStartPost_ = function (params) {\r\n if (params.hasStart()) {\r\n var startName = params.getIndexStartName();\r\n return params.getIndex().makePost(params.getIndexStartValue(), startName);\r\n }\r\n else {\r\n return params.getIndex().minPost();\r\n }\r\n };\r\n /**\r\n * @param {!QueryParams} params\r\n * @return {!NamedNode}\r\n * @private\r\n */\r\n RangedFilter.getEndPost_ = function (params) {\r\n if (params.hasEnd()) {\r\n var endName = params.getIndexEndName();\r\n return params.getIndex().makePost(params.getIndexEndValue(), endName);\r\n }\r\n else {\r\n return params.getIndex().maxPost();\r\n }\r\n };\r\n return RangedFilter;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Applies a limit and a range to a node and uses RangedFilter to do the heavy lifting where possible\r\n *\r\n * @constructor\r\n * @implements {NodeFilter}\r\n */\r\nvar LimitedFilter = /** @class */ (function () {\r\n /**\r\n * @param {!QueryParams} params\r\n */\r\n function LimitedFilter(params) {\r\n this.rangedFilter_ = new RangedFilter(params);\r\n this.index_ = params.getIndex();\r\n this.limit_ = params.getLimit();\r\n this.reverse_ = !params.isViewFromLeft();\r\n }\r\n /**\r\n * @inheritDoc\r\n */\r\n LimitedFilter.prototype.updateChild = function (snap, key, newChild, affectedPath, source, optChangeAccumulator) {\r\n if (!this.rangedFilter_.matches(new NamedNode(key, newChild))) {\r\n newChild = ChildrenNode.EMPTY_NODE;\r\n }\r\n if (snap.getImmediateChild(key).equals(newChild)) {\r\n // No change\r\n return snap;\r\n }\r\n else if (snap.numChildren() < this.limit_) {\r\n return this.rangedFilter_\r\n .getIndexedFilter()\r\n .updateChild(snap, key, newChild, affectedPath, source, optChangeAccumulator);\r\n }\r\n else {\r\n return this.fullLimitUpdateChild_(snap, key, newChild, source, optChangeAccumulator);\r\n }\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LimitedFilter.prototype.updateFullNode = function (oldSnap, newSnap, optChangeAccumulator) {\r\n var filtered;\r\n if (newSnap.isLeafNode() || newSnap.isEmpty()) {\r\n // Make sure we have a children node with the correct index, not a leaf node;\r\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\r\n }\r\n else {\r\n if (this.limit_ * 2 < newSnap.numChildren() &&\r\n newSnap.isIndexed(this.index_)) {\r\n // Easier to build up a snapshot, since what we're given has more than twice the elements we want\r\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\r\n // anchor to the startPost, endPost, or last element as appropriate\r\n var iterator = void 0;\r\n if (this.reverse_) {\r\n iterator = newSnap.getReverseIteratorFrom(this.rangedFilter_.getEndPost(), this.index_);\r\n }\r\n else {\r\n iterator = newSnap.getIteratorFrom(this.rangedFilter_.getStartPost(), this.index_);\r\n }\r\n var count = 0;\r\n while (iterator.hasNext() && count < this.limit_) {\r\n var next = iterator.getNext();\r\n var inRange = void 0;\r\n if (this.reverse_) {\r\n inRange =\r\n this.index_.compare(this.rangedFilter_.getStartPost(), next) <= 0;\r\n }\r\n else {\r\n inRange =\r\n this.index_.compare(next, this.rangedFilter_.getEndPost()) <= 0;\r\n }\r\n if (inRange) {\r\n filtered = filtered.updateImmediateChild(next.name, next.node);\r\n count++;\r\n }\r\n else {\r\n // if we have reached the end post, we cannot keep adding elemments\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n // The snap contains less than twice the limit. Faster to delete from the snap than build up a new one\r\n filtered = newSnap.withIndex(this.index_);\r\n // Don't support priorities on queries\r\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\r\n var startPost = void 0;\r\n var endPost = void 0;\r\n var cmp = void 0;\r\n var iterator = void 0;\r\n if (this.reverse_) {\r\n iterator = filtered.getReverseIterator(this.index_);\r\n startPost = this.rangedFilter_.getEndPost();\r\n endPost = this.rangedFilter_.getStartPost();\r\n var indexCompare_1 = this.index_.getCompare();\r\n cmp = function (a, b) { return indexCompare_1(b, a); };\r\n }\r\n else {\r\n iterator = filtered.getIterator(this.index_);\r\n startPost = this.rangedFilter_.getStartPost();\r\n endPost = this.rangedFilter_.getEndPost();\r\n cmp = this.index_.getCompare();\r\n }\r\n var count = 0;\r\n var foundStartPost = false;\r\n while (iterator.hasNext()) {\r\n var next = iterator.getNext();\r\n if (!foundStartPost && cmp(startPost, next) <= 0) {\r\n // start adding\r\n foundStartPost = true;\r\n }\r\n var inRange = foundStartPost && count < this.limit_ && cmp(next, endPost) <= 0;\r\n if (inRange) {\r\n count++;\r\n }\r\n else {\r\n filtered = filtered.updateImmediateChild(next.name, ChildrenNode.EMPTY_NODE);\r\n }\r\n }\r\n }\r\n }\r\n return this.rangedFilter_\r\n .getIndexedFilter()\r\n .updateFullNode(oldSnap, filtered, optChangeAccumulator);\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LimitedFilter.prototype.updatePriority = function (oldSnap, newPriority) {\r\n // Don't support priorities on queries\r\n return oldSnap;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LimitedFilter.prototype.filtersNodes = function () {\r\n return true;\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LimitedFilter.prototype.getIndexedFilter = function () {\r\n return this.rangedFilter_.getIndexedFilter();\r\n };\r\n /**\r\n * @inheritDoc\r\n */\r\n LimitedFilter.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n /**\r\n * @param {!Node} snap\r\n * @param {string} childKey\r\n * @param {!Node} childSnap\r\n * @param {!CompleteChildSource} source\r\n * @param {?ChildChangeAccumulator} changeAccumulator\r\n * @return {!Node}\r\n * @private\r\n */\r\n LimitedFilter.prototype.fullLimitUpdateChild_ = function (snap, childKey, childSnap, source, changeAccumulator) {\r\n // TODO: rename all cache stuff etc to general snap terminology\r\n var cmp;\r\n if (this.reverse_) {\r\n var indexCmp_1 = this.index_.getCompare();\r\n cmp = function (a, b) { return indexCmp_1(b, a); };\r\n }\r\n else {\r\n cmp = this.index_.getCompare();\r\n }\r\n var oldEventCache = snap;\r\n assert(oldEventCache.numChildren() == this.limit_, '');\r\n var newChildNamedNode = new NamedNode(childKey, childSnap);\r\n var windowBoundary = this.reverse_\r\n ? oldEventCache.getFirstChild(this.index_)\r\n : oldEventCache.getLastChild(this.index_);\r\n var inRange = this.rangedFilter_.matches(newChildNamedNode);\r\n if (oldEventCache.hasChild(childKey)) {\r\n var oldChildSnap = oldEventCache.getImmediateChild(childKey);\r\n var nextChild = source.getChildAfterChild(this.index_, windowBoundary, this.reverse_);\r\n while (nextChild != null &&\r\n (nextChild.name == childKey || oldEventCache.hasChild(nextChild.name))) {\r\n // There is a weird edge case where a node is updated as part of a merge in the write tree, but hasn't\r\n // been applied to the limited filter yet. Ignore this next child which will be updated later in\r\n // the limited filter...\r\n nextChild = source.getChildAfterChild(this.index_, nextChild, this.reverse_);\r\n }\r\n var compareNext = nextChild == null ? 1 : cmp(nextChild, newChildNamedNode);\r\n var remainsInWindow = inRange && !childSnap.isEmpty() && compareNext >= 0;\r\n if (remainsInWindow) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(Change.childChangedChange(childKey, childSnap, oldChildSnap));\r\n }\r\n return oldEventCache.updateImmediateChild(childKey, childSnap);\r\n }\r\n else {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(Change.childRemovedChange(childKey, oldChildSnap));\r\n }\r\n var newEventCache = oldEventCache.updateImmediateChild(childKey, ChildrenNode.EMPTY_NODE);\r\n var nextChildInRange = nextChild != null && this.rangedFilter_.matches(nextChild);\r\n if (nextChildInRange) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(Change.childAddedChange(nextChild.name, nextChild.node));\r\n }\r\n return newEventCache.updateImmediateChild(nextChild.name, nextChild.node);\r\n }\r\n else {\r\n return newEventCache;\r\n }\r\n }\r\n }\r\n else if (childSnap.isEmpty()) {\r\n // we're deleting a node, but it was not in the window, so ignore it\r\n return snap;\r\n }\r\n else if (inRange) {\r\n if (cmp(windowBoundary, newChildNamedNode) >= 0) {\r\n if (changeAccumulator != null) {\r\n changeAccumulator.trackChildChange(Change.childRemovedChange(windowBoundary.name, windowBoundary.node));\r\n changeAccumulator.trackChildChange(Change.childAddedChange(childKey, childSnap));\r\n }\r\n return oldEventCache\r\n .updateImmediateChild(childKey, childSnap)\r\n .updateImmediateChild(windowBoundary.name, ChildrenNode.EMPTY_NODE);\r\n }\r\n else {\r\n return snap;\r\n }\r\n }\r\n else {\r\n return snap;\r\n }\r\n };\r\n return LimitedFilter;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * This class is an immutable-from-the-public-api struct containing a set of query parameters defining a\r\n * range to be returned for a particular location. It is assumed that validation of parameters is done at the\r\n * user-facing API level, so it is not done here.\r\n * @constructor\r\n */\r\nvar QueryParams = /** @class */ (function () {\r\n function QueryParams() {\r\n this.limitSet_ = false;\r\n this.startSet_ = false;\r\n this.startNameSet_ = false;\r\n this.endSet_ = false;\r\n this.endNameSet_ = false;\r\n this.limit_ = 0;\r\n this.viewFrom_ = '';\r\n this.indexStartValue_ = null;\r\n this.indexStartName_ = '';\r\n this.indexEndValue_ = null;\r\n this.indexEndName_ = '';\r\n this.index_ = PRIORITY_INDEX;\r\n }\r\n /**\r\n * @return {boolean}\r\n */\r\n QueryParams.prototype.hasStart = function () {\r\n return this.startSet_;\r\n };\r\n /**\r\n * @return {boolean} True if it would return from left.\r\n */\r\n QueryParams.prototype.isViewFromLeft = function () {\r\n if (this.viewFrom_ === '') {\r\n // limit(), rather than limitToFirst or limitToLast was called.\r\n // This means that only one of startSet_ and endSet_ is true. Use them\r\n // to calculate which side of the view to anchor to. If neither is set,\r\n // anchor to the end.\r\n return this.startSet_;\r\n }\r\n else {\r\n return (this.viewFrom_ === QueryParams.WIRE_PROTOCOL_CONSTANTS_.VIEW_FROM_LEFT);\r\n }\r\n };\r\n /**\r\n * Only valid to call if hasStart() returns true\r\n * @return {*}\r\n */\r\n QueryParams.prototype.getIndexStartValue = function () {\r\n assert(this.startSet_, 'Only valid if start has been set');\r\n return this.indexStartValue_;\r\n };\r\n /**\r\n * Only valid to call if hasStart() returns true.\r\n * Returns the starting key name for the range defined by these query parameters\r\n * @return {!string}\r\n */\r\n QueryParams.prototype.getIndexStartName = function () {\r\n assert(this.startSet_, 'Only valid if start has been set');\r\n if (this.startNameSet_) {\r\n return this.indexStartName_;\r\n }\r\n else {\r\n return MIN_NAME;\r\n }\r\n };\r\n /**\r\n * @return {boolean}\r\n */\r\n QueryParams.prototype.hasEnd = function () {\r\n return this.endSet_;\r\n };\r\n /**\r\n * Only valid to call if hasEnd() returns true.\r\n * @return {*}\r\n */\r\n QueryParams.prototype.getIndexEndValue = function () {\r\n assert(this.endSet_, 'Only valid if end has been set');\r\n return this.indexEndValue_;\r\n };\r\n /**\r\n * Only valid to call if hasEnd() returns true.\r\n * Returns the end key name for the range defined by these query parameters\r\n * @return {!string}\r\n */\r\n QueryParams.prototype.getIndexEndName = function () {\r\n assert(this.endSet_, 'Only valid if end has been set');\r\n if (this.endNameSet_) {\r\n return this.indexEndName_;\r\n }\r\n else {\r\n return MAX_NAME;\r\n }\r\n };\r\n /**\r\n * @return {boolean}\r\n */\r\n QueryParams.prototype.hasLimit = function () {\r\n return this.limitSet_;\r\n };\r\n /**\r\n * @return {boolean} True if a limit has been set and it has been explicitly anchored\r\n */\r\n QueryParams.prototype.hasAnchoredLimit = function () {\r\n return this.limitSet_ && this.viewFrom_ !== '';\r\n };\r\n /**\r\n * Only valid to call if hasLimit() returns true\r\n * @return {!number}\r\n */\r\n QueryParams.prototype.getLimit = function () {\r\n assert(this.limitSet_, 'Only valid if limit has been set');\r\n return this.limit_;\r\n };\r\n /**\r\n * @return {!Index}\r\n */\r\n QueryParams.prototype.getIndex = function () {\r\n return this.index_;\r\n };\r\n /**\r\n * @return {!QueryParams}\r\n * @private\r\n */\r\n QueryParams.prototype.copy_ = function () {\r\n var copy = new QueryParams();\r\n copy.limitSet_ = this.limitSet_;\r\n copy.limit_ = this.limit_;\r\n copy.startSet_ = this.startSet_;\r\n copy.indexStartValue_ = this.indexStartValue_;\r\n copy.startNameSet_ = this.startNameSet_;\r\n copy.indexStartName_ = this.indexStartName_;\r\n copy.endSet_ = this.endSet_;\r\n copy.indexEndValue_ = this.indexEndValue_;\r\n copy.endNameSet_ = this.endNameSet_;\r\n copy.indexEndName_ = this.indexEndName_;\r\n copy.index_ = this.index_;\r\n copy.viewFrom_ = this.viewFrom_;\r\n return copy;\r\n };\r\n /**\r\n * @param {!number} newLimit\r\n * @return {!QueryParams}\r\n */\r\n QueryParams.prototype.limit = function (newLimit) {\r\n var newParams = this.copy_();\r\n newParams.limitSet_ = true;\r\n newParams.limit_ = newLimit;\r\n newParams.viewFrom_ = '';\r\n return newParams;\r\n };\r\n /**\r\n * @param {!number} newLimit\r\n * @return {!QueryParams}\r\n */\r\n QueryParams.prototype.limitToFirst = function (newLimit) {\r\n var newParams = this.copy_();\r\n newParams.limitSet_ = true;\r\n newParams.limit_ = newLimit;\r\n newParams.viewFrom_ = QueryParams.WIRE_PROTOCOL_CONSTANTS_.VIEW_FROM_LEFT;\r\n return newParams;\r\n };\r\n /**\r\n * @param {!number} newLimit\r\n * @return {!QueryParams}\r\n */\r\n QueryParams.prototype.limitToLast = function (newLimit) {\r\n var newParams = this.copy_();\r\n newParams.limitSet_ = true;\r\n newParams.limit_ = newLimit;\r\n newParams.viewFrom_ = QueryParams.WIRE_PROTOCOL_CONSTANTS_.VIEW_FROM_RIGHT;\r\n return newParams;\r\n };\r\n /**\r\n * @param {*} indexValue\r\n * @param {?string=} key\r\n * @return {!QueryParams}\r\n */\r\n QueryParams.prototype.startAt = function (indexValue, key) {\r\n var newParams = this.copy_();\r\n newParams.startSet_ = true;\r\n if (!(indexValue !== undefined)) {\r\n indexValue = null;\r\n }\r\n newParams.indexStartValue_ = indexValue;\r\n if (key != null) {\r\n newParams.startNameSet_ = true;\r\n newParams.indexStartName_ = key;\r\n }\r\n else {\r\n newParams.startNameSet_ = false;\r\n newParams.indexStartName_ = '';\r\n }\r\n return newParams;\r\n };\r\n /**\r\n * @param {*} indexValue\r\n * @param {?string=} key\r\n * @return {!QueryParams}\r\n */\r\n QueryParams.prototype.endAt = function (indexValue, key) {\r\n var newParams = this.copy_();\r\n newParams.endSet_ = true;\r\n if (!(indexValue !== undefined)) {\r\n indexValue = null;\r\n }\r\n newParams.indexEndValue_ = indexValue;\r\n if (key !== undefined) {\r\n newParams.endNameSet_ = true;\r\n newParams.indexEndName_ = key;\r\n }\r\n else {\r\n newParams.endNameSet_ = false;\r\n newParams.indexEndName_ = '';\r\n }\r\n return newParams;\r\n };\r\n /**\r\n * @param {!Index} index\r\n * @return {!QueryParams}\r\n */\r\n QueryParams.prototype.orderBy = function (index) {\r\n var newParams = this.copy_();\r\n newParams.index_ = index;\r\n return newParams;\r\n };\r\n /**\r\n * @return {!Object}\r\n */\r\n QueryParams.prototype.getQueryObject = function () {\r\n var WIRE_PROTOCOL_CONSTANTS = QueryParams.WIRE_PROTOCOL_CONSTANTS_;\r\n var obj = {};\r\n if (this.startSet_) {\r\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_VALUE] = this.indexStartValue_;\r\n if (this.startNameSet_) {\r\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_NAME] = this.indexStartName_;\r\n }\r\n }\r\n if (this.endSet_) {\r\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_VALUE] = this.indexEndValue_;\r\n if (this.endNameSet_) {\r\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_NAME] = this.indexEndName_;\r\n }\r\n }\r\n if (this.limitSet_) {\r\n obj[WIRE_PROTOCOL_CONSTANTS.LIMIT] = this.limit_;\r\n var viewFrom = this.viewFrom_;\r\n if (viewFrom === '') {\r\n if (this.isViewFromLeft()) {\r\n viewFrom = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT;\r\n }\r\n else {\r\n viewFrom = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_RIGHT;\r\n }\r\n }\r\n obj[WIRE_PROTOCOL_CONSTANTS.VIEW_FROM] = viewFrom;\r\n }\r\n // For now, priority index is the default, so we only specify if it's some other index\r\n if (this.index_ !== PRIORITY_INDEX) {\r\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX] = this.index_.toString();\r\n }\r\n return obj;\r\n };\r\n /**\r\n * @return {boolean}\r\n */\r\n QueryParams.prototype.loadsAllData = function () {\r\n return !(this.startSet_ || this.endSet_ || this.limitSet_);\r\n };\r\n /**\r\n * @return {boolean}\r\n */\r\n QueryParams.prototype.isDefault = function () {\r\n return this.loadsAllData() && this.index_ == PRIORITY_INDEX;\r\n };\r\n /**\r\n * @return {!NodeFilter}\r\n */\r\n QueryParams.prototype.getNodeFilter = function () {\r\n if (this.loadsAllData()) {\r\n return new IndexedFilter(this.getIndex());\r\n }\r\n else if (this.hasLimit()) {\r\n return new LimitedFilter(this);\r\n }\r\n else {\r\n return new RangedFilter(this);\r\n }\r\n };\r\n /**\r\n * Returns a set of REST query string parameters representing this query.\r\n *\r\n * @return {!Object.} query string parameters\r\n */\r\n QueryParams.prototype.toRestQueryStringParameters = function () {\r\n var REST_CONSTANTS = QueryParams.REST_QUERY_CONSTANTS_;\r\n var qs = {};\r\n if (this.isDefault()) {\r\n return qs;\r\n }\r\n var orderBy;\r\n if (this.index_ === PRIORITY_INDEX) {\r\n orderBy = REST_CONSTANTS.PRIORITY_INDEX;\r\n }\r\n else if (this.index_ === VALUE_INDEX) {\r\n orderBy = REST_CONSTANTS.VALUE_INDEX;\r\n }\r\n else if (this.index_ === KEY_INDEX) {\r\n orderBy = REST_CONSTANTS.KEY_INDEX;\r\n }\r\n else {\r\n assert(this.index_ instanceof PathIndex, 'Unrecognized index type!');\r\n orderBy = this.index_.toString();\r\n }\r\n qs[REST_CONSTANTS.ORDER_BY] = stringify(orderBy);\r\n if (this.startSet_) {\r\n qs[REST_CONSTANTS.START_AT] = stringify(this.indexStartValue_);\r\n if (this.startNameSet_) {\r\n qs[REST_CONSTANTS.START_AT] += ',' + stringify(this.indexStartName_);\r\n }\r\n }\r\n if (this.endSet_) {\r\n qs[REST_CONSTANTS.END_AT] = stringify(this.indexEndValue_);\r\n if (this.endNameSet_) {\r\n qs[REST_CONSTANTS.END_AT] += ',' + stringify(this.indexEndName_);\r\n }\r\n }\r\n if (this.limitSet_) {\r\n if (this.isViewFromLeft()) {\r\n qs[REST_CONSTANTS.LIMIT_TO_FIRST] = this.limit_;\r\n }\r\n else {\r\n qs[REST_CONSTANTS.LIMIT_TO_LAST] = this.limit_;\r\n }\r\n }\r\n return qs;\r\n };\r\n /**\r\n * Wire Protocol Constants\r\n * @const\r\n * @enum {string}\r\n * @private\r\n */\r\n QueryParams.WIRE_PROTOCOL_CONSTANTS_ = {\r\n INDEX_START_VALUE: 'sp',\r\n INDEX_START_NAME: 'sn',\r\n INDEX_END_VALUE: 'ep',\r\n INDEX_END_NAME: 'en',\r\n LIMIT: 'l',\r\n VIEW_FROM: 'vf',\r\n VIEW_FROM_LEFT: 'l',\r\n VIEW_FROM_RIGHT: 'r',\r\n INDEX: 'i'\r\n };\r\n /**\r\n * REST Query Constants\r\n * @const\r\n * @enum {string}\r\n * @private\r\n */\r\n QueryParams.REST_QUERY_CONSTANTS_ = {\r\n ORDER_BY: 'orderBy',\r\n PRIORITY_INDEX: '$priority',\r\n VALUE_INDEX: '$value',\r\n KEY_INDEX: '$key',\r\n START_AT: 'startAt',\r\n END_AT: 'endAt',\r\n LIMIT_TO_FIRST: 'limitToFirst',\r\n LIMIT_TO_LAST: 'limitToLast'\r\n };\r\n /**\r\n * Default, empty query parameters\r\n * @type {!QueryParams}\r\n * @const\r\n */\r\n QueryParams.DEFAULT = new QueryParams();\r\n return QueryParams;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar Reference = /** @class */ (function (_super) {\r\n __extends(Reference, _super);\r\n /**\r\n * Call options:\r\n * new Reference(Repo, Path) or\r\n * new Reference(url: string, string|RepoManager)\r\n *\r\n * Externally - this is the firebase.database.Reference type.\r\n *\r\n * @param {!Repo} repo\r\n * @param {(!Path)} path\r\n * @extends {Query}\r\n */\r\n function Reference(repo, path) {\r\n var _this = this;\r\n if (!(repo instanceof Repo)) {\r\n throw new Error('new Reference() no longer supported - use app.database().');\r\n }\r\n // call Query's constructor, passing in the repo and path.\r\n _this = _super.call(this, repo, path, QueryParams.DEFAULT, false) || this;\r\n return _this;\r\n }\r\n /** @return {?string} */\r\n Reference.prototype.getKey = function () {\r\n validateArgCount('Reference.key', 0, 0, arguments.length);\r\n if (this.path.isEmpty())\r\n return null;\r\n else\r\n return this.path.getBack();\r\n };\r\n /**\r\n * @param {!(string|Path)} pathString\r\n * @return {!Reference}\r\n */\r\n Reference.prototype.child = function (pathString) {\r\n validateArgCount('Reference.child', 1, 1, arguments.length);\r\n if (typeof pathString === 'number') {\r\n pathString = String(pathString);\r\n }\r\n else if (!(pathString instanceof Path)) {\r\n if (this.path.getFront() === null)\r\n validateRootPathString('Reference.child', 1, pathString, false);\r\n else\r\n validatePathString('Reference.child', 1, pathString, false);\r\n }\r\n return new Reference(this.repo, this.path.child(pathString));\r\n };\r\n /** @return {?Reference} */\r\n Reference.prototype.getParent = function () {\r\n validateArgCount('Reference.parent', 0, 0, arguments.length);\r\n var parentPath = this.path.parent();\r\n return parentPath === null ? null : new Reference(this.repo, parentPath);\r\n };\r\n /** @return {!Reference} */\r\n Reference.prototype.getRoot = function () {\r\n validateArgCount('Reference.root', 0, 0, arguments.length);\r\n var ref = this;\r\n while (ref.getParent() !== null) {\r\n ref = ref.getParent();\r\n }\r\n return ref;\r\n };\r\n /** @return {!Database} */\r\n Reference.prototype.databaseProp = function () {\r\n return this.repo.database;\r\n };\r\n /**\r\n * @param {*} newVal\r\n * @param {function(?Error)=} onComplete\r\n * @return {!Promise}\r\n */\r\n Reference.prototype.set = function (newVal, onComplete) {\r\n validateArgCount('Reference.set', 1, 2, arguments.length);\r\n validateWritablePath('Reference.set', this.path);\r\n validateFirebaseDataArg('Reference.set', 1, newVal, this.path, false);\r\n validateCallback('Reference.set', 2, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo.setWithPriority(this.path, newVal, \r\n /*priority=*/ null, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {!Object} objectToMerge\r\n * @param {function(?Error)=} onComplete\r\n * @return {!Promise}\r\n */\r\n Reference.prototype.update = function (objectToMerge, onComplete) {\r\n validateArgCount('Reference.update', 1, 2, arguments.length);\r\n validateWritablePath('Reference.update', this.path);\r\n if (Array.isArray(objectToMerge)) {\r\n var newObjectToMerge = {};\r\n for (var i = 0; i < objectToMerge.length; ++i) {\r\n newObjectToMerge['' + i] = objectToMerge[i];\r\n }\r\n objectToMerge = newObjectToMerge;\r\n warn('Passing an Array to Firebase.update() is deprecated. ' +\r\n 'Use set() if you want to overwrite the existing data, or ' +\r\n 'an Object with integer keys if you really do want to ' +\r\n 'only update some of the children.');\r\n }\r\n validateFirebaseMergeDataArg('Reference.update', 1, objectToMerge, this.path, false);\r\n validateCallback('Reference.update', 2, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo.update(this.path, objectToMerge, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {*} newVal\r\n * @param {string|number|null} newPriority\r\n * @param {function(?Error)=} onComplete\r\n * @return {!Promise}\r\n */\r\n Reference.prototype.setWithPriority = function (newVal, newPriority, onComplete) {\r\n validateArgCount('Reference.setWithPriority', 2, 3, arguments.length);\r\n validateWritablePath('Reference.setWithPriority', this.path);\r\n validateFirebaseDataArg('Reference.setWithPriority', 1, newVal, this.path, false);\r\n validatePriority('Reference.setWithPriority', 2, newPriority, false);\r\n validateCallback('Reference.setWithPriority', 3, onComplete, true);\r\n if (this.getKey() === '.length' || this.getKey() === '.keys')\r\n throw 'Reference.setWithPriority failed: ' +\r\n this.getKey() +\r\n ' is a read-only object.';\r\n var deferred = new Deferred();\r\n this.repo.setWithPriority(this.path, newVal, newPriority, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {function(?Error)=} onComplete\r\n * @return {!Promise}\r\n */\r\n Reference.prototype.remove = function (onComplete) {\r\n validateArgCount('Reference.remove', 0, 1, arguments.length);\r\n validateWritablePath('Reference.remove', this.path);\r\n validateCallback('Reference.remove', 1, onComplete, true);\r\n return this.set(null, onComplete);\r\n };\r\n /**\r\n * @param {function(*):*} transactionUpdate\r\n * @param {(function(?Error, boolean, ?DataSnapshot))=} onComplete\r\n * @param {boolean=} applyLocally\r\n * @return {!Promise}\r\n */\r\n Reference.prototype.transaction = function (transactionUpdate, onComplete, applyLocally) {\r\n validateArgCount('Reference.transaction', 1, 3, arguments.length);\r\n validateWritablePath('Reference.transaction', this.path);\r\n validateCallback('Reference.transaction', 1, transactionUpdate, false);\r\n validateCallback('Reference.transaction', 2, onComplete, true);\r\n // NOTE: applyLocally is an internal-only option for now. We need to decide if we want to keep it and how\r\n // to expose it.\r\n validateBoolean('Reference.transaction', 3, applyLocally, true);\r\n if (this.getKey() === '.length' || this.getKey() === '.keys')\r\n throw 'Reference.transaction failed: ' +\r\n this.getKey() +\r\n ' is a read-only object.';\r\n if (applyLocally === undefined)\r\n applyLocally = true;\r\n var deferred = new Deferred();\r\n if (typeof onComplete === 'function') {\r\n deferred.promise.catch(function () { });\r\n }\r\n var promiseComplete = function (error$$1, committed, snapshot) {\r\n if (error$$1) {\r\n deferred.reject(error$$1);\r\n }\r\n else {\r\n deferred.resolve(new TransactionResult(committed, snapshot));\r\n }\r\n if (typeof onComplete === 'function') {\r\n onComplete(error$$1, committed, snapshot);\r\n }\r\n };\r\n this.repo.startTransaction(this.path, transactionUpdate, promiseComplete, applyLocally);\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {string|number|null} priority\r\n * @param {function(?Error)=} onComplete\r\n * @return {!Promise}\r\n */\r\n Reference.prototype.setPriority = function (priority, onComplete) {\r\n validateArgCount('Reference.setPriority', 1, 2, arguments.length);\r\n validateWritablePath('Reference.setPriority', this.path);\r\n validatePriority('Reference.setPriority', 1, priority, false);\r\n validateCallback('Reference.setPriority', 2, onComplete, true);\r\n var deferred = new Deferred();\r\n this.repo.setWithPriority(this.path.child('.priority'), priority, null, deferred.wrapCallback(onComplete));\r\n return deferred.promise;\r\n };\r\n /**\r\n * @param {*=} value\r\n * @param {function(?Error)=} onComplete\r\n * @return {!Reference}\r\n */\r\n Reference.prototype.push = function (value, onComplete) {\r\n validateArgCount('Reference.push', 0, 2, arguments.length);\r\n validateWritablePath('Reference.push', this.path);\r\n validateFirebaseDataArg('Reference.push', 1, value, this.path, true);\r\n validateCallback('Reference.push', 2, onComplete, true);\r\n var now = this.repo.serverTime();\r\n var name = nextPushId(now);\r\n // push() returns a ThennableReference whose promise is fulfilled with a regular Reference.\r\n // We use child() to create handles to two different references. The first is turned into a\r\n // ThennableReference below by adding then() and catch() methods and is used as the\r\n // return value of push(). The second remains a regular Reference and is used as the fulfilled\r\n // value of the first ThennableReference.\r\n var thennablePushRef = this.child(name);\r\n var pushRef = this.child(name);\r\n var promise;\r\n if (value != null) {\r\n promise = thennablePushRef.set(value, onComplete).then(function () { return pushRef; });\r\n }\r\n else {\r\n promise = Promise.resolve(pushRef);\r\n }\r\n thennablePushRef.then = promise.then.bind(promise);\r\n thennablePushRef.catch = promise.then.bind(promise, undefined);\r\n if (typeof onComplete === 'function') {\r\n promise.catch(function () { });\r\n }\r\n return thennablePushRef;\r\n };\r\n /**\r\n * @return {!OnDisconnect}\r\n */\r\n Reference.prototype.onDisconnect = function () {\r\n validateWritablePath('Reference.onDisconnect', this.path);\r\n return new OnDisconnect(this.repo, this.path);\r\n };\r\n Object.defineProperty(Reference.prototype, \"database\", {\r\n get: function () {\r\n return this.databaseProp();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"key\", {\r\n get: function () {\r\n return this.getKey();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"parent\", {\r\n get: function () {\r\n return this.getParent();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"root\", {\r\n get: function () {\r\n return this.getRoot();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Reference;\r\n}(Query));\r\n/**\r\n * Define reference constructor in various modules\r\n *\r\n * We are doing this here to avoid several circular\r\n * dependency issues\r\n */\r\nQuery.__referenceConstructor = Reference;\r\nSyncPoint.__referenceConstructor = Reference;\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Node in a Tree.\r\n */\r\nvar TreeNode = /** @class */ (function () {\r\n function TreeNode() {\r\n // TODO: Consider making accessors that create children and value lazily or\r\n // separate Internal / Leaf 'types'.\r\n this.children = {};\r\n this.childCount = 0;\r\n this.value = null;\r\n }\r\n return TreeNode;\r\n}());\r\n/**\r\n * A light-weight tree, traversable by path. Nodes can have both values and children.\r\n * Nodes are not enumerated (by forEachChild) unless they have a value or non-empty\r\n * children.\r\n */\r\nvar Tree = /** @class */ (function () {\r\n /**\r\n * @template T\r\n * @param {string=} name_ Optional name of the node.\r\n * @param {Tree=} parent_ Optional parent node.\r\n * @param {TreeNode=} node_ Optional node to wrap.\r\n */\r\n function Tree(name_, parent_, node_) {\r\n if (name_ === void 0) { name_ = ''; }\r\n if (parent_ === void 0) { parent_ = null; }\r\n if (node_ === void 0) { node_ = new TreeNode(); }\r\n this.name_ = name_;\r\n this.parent_ = parent_;\r\n this.node_ = node_;\r\n }\r\n /**\r\n * Returns a sub-Tree for the given path.\r\n *\r\n * @param {!(string|Path)} pathObj Path to look up.\r\n * @return {!Tree.} Tree for path.\r\n */\r\n Tree.prototype.subTree = function (pathObj) {\r\n // TODO: Require pathObj to be Path?\r\n var path = pathObj instanceof Path ? pathObj : new Path(pathObj);\r\n var child = this, next;\r\n while ((next = path.getFront()) !== null) {\r\n var childNode = safeGet(child.node_.children, next) || new TreeNode();\r\n child = new Tree(next, child, childNode);\r\n path = path.popFront();\r\n }\r\n return child;\r\n };\r\n /**\r\n * Returns the data associated with this tree node.\r\n *\r\n * @return {?T} The data or null if no data exists.\r\n */\r\n Tree.prototype.getValue = function () {\r\n return this.node_.value;\r\n };\r\n /**\r\n * Sets data to this tree node.\r\n *\r\n * @param {!T} value Value to set.\r\n */\r\n Tree.prototype.setValue = function (value) {\r\n assert(typeof value !== 'undefined', 'Cannot set value to undefined');\r\n this.node_.value = value;\r\n this.updateParents_();\r\n };\r\n /**\r\n * Clears the contents of the tree node (its value and all children).\r\n */\r\n Tree.prototype.clear = function () {\r\n this.node_.value = null;\r\n this.node_.children = {};\r\n this.node_.childCount = 0;\r\n this.updateParents_();\r\n };\r\n /**\r\n * @return {boolean} Whether the tree has any children.\r\n */\r\n Tree.prototype.hasChildren = function () {\r\n return this.node_.childCount > 0;\r\n };\r\n /**\r\n * @return {boolean} Whether the tree is empty (no value or children).\r\n */\r\n Tree.prototype.isEmpty = function () {\r\n return this.getValue() === null && !this.hasChildren();\r\n };\r\n /**\r\n * Calls action for each child of this tree node.\r\n *\r\n * @param {function(!Tree.)} action Action to be called for each child.\r\n */\r\n Tree.prototype.forEachChild = function (action) {\r\n var _this = this;\r\n forEach(this.node_.children, function (child, childTree) {\r\n action(new Tree(child, _this, childTree));\r\n });\r\n };\r\n /**\r\n * Does a depth-first traversal of this node's descendants, calling action for each one.\r\n *\r\n * @param {function(!Tree.)} action Action to be called for each child.\r\n * @param {boolean=} includeSelf Whether to call action on this node as well. Defaults to\r\n * false.\r\n * @param {boolean=} childrenFirst Whether to call action on children before calling it on\r\n * parent.\r\n */\r\n Tree.prototype.forEachDescendant = function (action, includeSelf, childrenFirst) {\r\n if (includeSelf && !childrenFirst)\r\n action(this);\r\n this.forEachChild(function (child) {\r\n child.forEachDescendant(action, /*includeSelf=*/ true, childrenFirst);\r\n });\r\n if (includeSelf && childrenFirst)\r\n action(this);\r\n };\r\n /**\r\n * Calls action on each ancestor node.\r\n *\r\n * @param {function(!Tree.)} action Action to be called on each parent; return\r\n * true to abort.\r\n * @param {boolean=} includeSelf Whether to call action on this node as well.\r\n * @return {boolean} true if the action callback returned true.\r\n */\r\n Tree.prototype.forEachAncestor = function (action, includeSelf) {\r\n var node = includeSelf ? this : this.parent();\r\n while (node !== null) {\r\n if (action(node)) {\r\n return true;\r\n }\r\n node = node.parent();\r\n }\r\n return false;\r\n };\r\n /**\r\n * Does a depth-first traversal of this node's descendants. When a descendant with a value\r\n * is found, action is called on it and traversal does not continue inside the node.\r\n * Action is *not* called on this node.\r\n *\r\n * @param {function(!Tree.)} action Action to be called for each child.\r\n */\r\n Tree.prototype.forEachImmediateDescendantWithValue = function (action) {\r\n this.forEachChild(function (child) {\r\n if (child.getValue() !== null)\r\n action(child);\r\n else\r\n child.forEachImmediateDescendantWithValue(action);\r\n });\r\n };\r\n /**\r\n * @return {!Path} The path of this tree node, as a Path.\r\n */\r\n Tree.prototype.path = function () {\r\n return new Path(this.parent_ === null\r\n ? this.name_\r\n : this.parent_.path() + '/' + this.name_);\r\n };\r\n /**\r\n * @return {string} The name of the tree node.\r\n */\r\n Tree.prototype.name = function () {\r\n return this.name_;\r\n };\r\n /**\r\n * @return {?Tree} The parent tree node, or null if this is the root of the tree.\r\n */\r\n Tree.prototype.parent = function () {\r\n return this.parent_;\r\n };\r\n /**\r\n * Adds or removes this child from its parent based on whether it's empty or not.\r\n *\r\n * @private\r\n */\r\n Tree.prototype.updateParents_ = function () {\r\n if (this.parent_ !== null)\r\n this.parent_.updateChild_(this.name_, this);\r\n };\r\n /**\r\n * Adds or removes the passed child to this tree node, depending on whether it's empty.\r\n *\r\n * @param {string} childName The name of the child to update.\r\n * @param {!Tree.} child The child to update.\r\n * @private\r\n */\r\n Tree.prototype.updateChild_ = function (childName, child) {\r\n var childEmpty = child.isEmpty();\r\n var childExists = contains(this.node_.children, childName);\r\n if (childEmpty && childExists) {\r\n delete this.node_.children[childName];\r\n this.node_.childCount--;\r\n this.updateParents_();\r\n }\r\n else if (!childEmpty && !childExists) {\r\n this.node_.children[childName] = child.node_;\r\n this.node_.childCount++;\r\n this.updateParents_();\r\n }\r\n };\r\n return Tree;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n// TODO: This is pretty messy. Ideally, a lot of this would move into FirebaseData, or a transaction-specific\r\n// component used by FirebaseData, but it has ties to user callbacks (transaction update and onComplete) as well\r\n// as the realtime connection (to send transactions to the server). So that all needs to be decoupled first.\r\n// For now it's part of Repo, but in its own file.\r\n/**\r\n * @enum {number}\r\n */\r\nvar TransactionStatus;\r\n(function (TransactionStatus) {\r\n // We've run the transaction and updated transactionResultData_ with the result, but it isn't currently sent to the\r\n // server. A transaction will go from RUN -> SENT -> RUN if it comes back from the server as rejected due to\r\n // mismatched hash.\r\n TransactionStatus[TransactionStatus[\"RUN\"] = 0] = \"RUN\";\r\n // We've run the transaction and sent it to the server and it's currently outstanding (hasn't come back as accepted\r\n // or rejected yet).\r\n TransactionStatus[TransactionStatus[\"SENT\"] = 1] = \"SENT\";\r\n // Temporary state used to mark completed transactions (whether successful or aborted). The transaction will be\r\n // removed when we get a chance to prune completed ones.\r\n TransactionStatus[TransactionStatus[\"COMPLETED\"] = 2] = \"COMPLETED\";\r\n // Used when an already-sent transaction needs to be aborted (e.g. due to a conflicting set() call that was made).\r\n // If it comes back as unsuccessful, we'll abort it.\r\n TransactionStatus[TransactionStatus[\"SENT_NEEDS_ABORT\"] = 3] = \"SENT_NEEDS_ABORT\";\r\n // Temporary state used to mark transactions that need to be aborted.\r\n TransactionStatus[TransactionStatus[\"NEEDS_ABORT\"] = 4] = \"NEEDS_ABORT\";\r\n})(TransactionStatus || (TransactionStatus = {}));\r\n/**\r\n * If a transaction does not succeed after 25 retries, we abort it. Among other things this ensure that if there's\r\n * ever a bug causing a mismatch between client / server hashes for some data, we won't retry indefinitely.\r\n * @type {number}\r\n * @const\r\n * @private\r\n */\r\nRepo.MAX_TRANSACTION_RETRIES_ = 25;\r\n/**\r\n * Setup the transaction data structures\r\n * @private\r\n */\r\nRepo.prototype.transactions_init_ = function () {\r\n /**\r\n * Stores queues of outstanding transactions for Firebase locations.\r\n *\r\n * @type {!Tree.>}\r\n * @private\r\n */\r\n this.transactionQueueTree_ = new Tree();\r\n};\r\n/**\r\n * Creates a new transaction, adds it to the transactions we're tracking, and sends it to the server if possible.\r\n *\r\n * @param {!Path} path Path at which to do transaction.\r\n * @param {function(*):*} transactionUpdate Update callback.\r\n * @param {?function(?Error, boolean, ?DataSnapshot)} onComplete Completion callback.\r\n * @param {boolean} applyLocally Whether or not to make intermediate results visible\r\n */\r\nRepo.prototype.startTransaction = function (path, transactionUpdate, onComplete, applyLocally) {\r\n this.log_('transaction on ' + path);\r\n // Add a watch to make sure we get server updates.\r\n var valueCallback = function () { };\r\n var watchRef = new Reference(this, path);\r\n watchRef.on('value', valueCallback);\r\n var unwatcher = function () {\r\n watchRef.off('value', valueCallback);\r\n };\r\n // Initialize transaction.\r\n var transaction = {\r\n path: path,\r\n update: transactionUpdate,\r\n onComplete: onComplete,\r\n // One of TransactionStatus enums.\r\n status: null,\r\n // Used when combining transactions at different locations to figure out which one goes first.\r\n order: LUIDGenerator(),\r\n // Whether to raise local events for this transaction.\r\n applyLocally: applyLocally,\r\n // Count of how many times we've retried the transaction.\r\n retryCount: 0,\r\n // Function to call to clean up our .on() listener.\r\n unwatcher: unwatcher,\r\n // Stores why a transaction was aborted.\r\n abortReason: null,\r\n currentWriteId: null,\r\n currentInputSnapshot: null,\r\n currentOutputSnapshotRaw: null,\r\n currentOutputSnapshotResolved: null\r\n };\r\n // Run transaction initially.\r\n var currentState = this.getLatestState_(path);\r\n transaction.currentInputSnapshot = currentState;\r\n var newVal = transaction.update(currentState.val());\r\n if (newVal === undefined) {\r\n // Abort transaction.\r\n transaction.unwatcher();\r\n transaction.currentOutputSnapshotRaw = null;\r\n transaction.currentOutputSnapshotResolved = null;\r\n if (transaction.onComplete) {\r\n // We just set the input snapshot, so this cast should be safe\r\n var snapshot = new DataSnapshot(transaction.currentInputSnapshot, new Reference(this, transaction.path), PRIORITY_INDEX);\r\n transaction.onComplete(null, false, snapshot);\r\n }\r\n }\r\n else {\r\n validateFirebaseData('transaction failed: Data returned ', newVal, transaction.path);\r\n // Mark as run and add to our queue.\r\n transaction.status = TransactionStatus.RUN;\r\n var queueNode = this.transactionQueueTree_.subTree(path);\r\n var nodeQueue = queueNode.getValue() || [];\r\n nodeQueue.push(transaction);\r\n queueNode.setValue(nodeQueue);\r\n // Update visibleData and raise events\r\n // Note: We intentionally raise events after updating all of our transaction state, since the user could\r\n // start new transactions from the event callbacks.\r\n var priorityForNode = void 0;\r\n if (typeof newVal === 'object' &&\r\n newVal !== null &&\r\n contains(newVal, '.priority')) {\r\n priorityForNode = safeGet(newVal, '.priority');\r\n assert(isValidPriority(priorityForNode), 'Invalid priority returned by transaction. ' +\r\n 'Priority must be a valid string, finite number, server value, or null.');\r\n }\r\n else {\r\n var currentNode = this.serverSyncTree_.calcCompleteEventCache(path) ||\r\n ChildrenNode.EMPTY_NODE;\r\n priorityForNode = currentNode.getPriority().val();\r\n }\r\n priorityForNode /** @type {null|number|string} */ = priorityForNode;\r\n var serverValues = this.generateServerValues();\r\n var newNodeUnresolved = nodeFromJSON$1(newVal, priorityForNode);\r\n var newNode = resolveDeferredValueSnapshot(newNodeUnresolved, serverValues);\r\n transaction.currentOutputSnapshotRaw = newNodeUnresolved;\r\n transaction.currentOutputSnapshotResolved = newNode;\r\n transaction.currentWriteId = this.getNextWriteId_();\r\n var events = this.serverSyncTree_.applyUserOverwrite(path, newNode, transaction.currentWriteId, transaction.applyLocally);\r\n this.eventQueue_.raiseEventsForChangedPath(path, events);\r\n this.sendReadyTransactions_();\r\n }\r\n};\r\n/**\r\n * @param {!Path} path\r\n * @param {Array.=} excludeSets A specific set to exclude\r\n * @return {Node}\r\n * @private\r\n */\r\nRepo.prototype.getLatestState_ = function (path, excludeSets) {\r\n return (this.serverSyncTree_.calcCompleteEventCache(path, excludeSets) ||\r\n ChildrenNode.EMPTY_NODE);\r\n};\r\n/**\r\n * Sends any already-run transactions that aren't waiting for outstanding transactions to\r\n * complete.\r\n *\r\n * Externally it's called with no arguments, but it calls itself recursively with a particular\r\n * transactionQueueTree node to recurse through the tree.\r\n *\r\n * @param {Tree.>=} node transactionQueueTree node to start at.\r\n * @private\r\n */\r\nRepo.prototype.sendReadyTransactions_ = function (node) {\r\n var _this = this;\r\n if (node === void 0) { node = this.transactionQueueTree_; }\r\n // Before recursing, make sure any completed transactions are removed.\r\n if (!node) {\r\n this.pruneCompletedTransactionsBelowNode_(node);\r\n }\r\n if (node.getValue() !== null) {\r\n var queue = this.buildTransactionQueue_(node);\r\n assert(queue.length > 0, 'Sending zero length transaction queue');\r\n var allRun = queue.every(function (transaction) { return transaction.status === TransactionStatus.RUN; });\r\n // If they're all run (and not sent), we can send them. Else, we must wait.\r\n if (allRun) {\r\n this.sendTransactionQueue_(node.path(), queue);\r\n }\r\n }\r\n else if (node.hasChildren()) {\r\n node.forEachChild(function (childNode) {\r\n _this.sendReadyTransactions_(childNode);\r\n });\r\n }\r\n};\r\n/**\r\n * Given a list of run transactions, send them to the server and then handle the result (success or failure).\r\n *\r\n * @param {!Path} path The location of the queue.\r\n * @param {!Array.} queue Queue of transactions under the specified location.\r\n * @private\r\n */\r\nRepo.prototype.sendTransactionQueue_ = function (path, queue) {\r\n var _this = this;\r\n // Mark transactions as sent and increment retry count!\r\n var setsToIgnore = queue.map(function (txn) {\r\n return txn.currentWriteId;\r\n });\r\n var latestState = this.getLatestState_(path, setsToIgnore);\r\n var snapToSend = latestState;\r\n var latestHash = latestState.hash();\r\n for (var i = 0; i < queue.length; i++) {\r\n var txn = queue[i];\r\n assert(txn.status === TransactionStatus.RUN, 'tryToSendTransactionQueue_: items in queue should all be run.');\r\n txn.status = TransactionStatus.SENT;\r\n txn.retryCount++;\r\n var relativePath = Path.relativePath(path, txn.path);\r\n // If we've gotten to this point, the output snapshot must be defined.\r\n snapToSend = snapToSend.updateChild(relativePath /**@type {!Node} */, txn.currentOutputSnapshotRaw);\r\n }\r\n var dataToSend = snapToSend.val(true);\r\n var pathToSend = path;\r\n // Send the put.\r\n this.server_.put(pathToSend.toString(), dataToSend, function (status) {\r\n _this.log_('transaction put response', {\r\n path: pathToSend.toString(),\r\n status: status\r\n });\r\n var events = [];\r\n if (status === 'ok') {\r\n // Queue up the callbacks and fire them after cleaning up all of our transaction state, since\r\n // the callback could trigger more transactions or sets.\r\n var callbacks = [];\r\n for (var i = 0; i < queue.length; i++) {\r\n queue[i].status = TransactionStatus.COMPLETED;\r\n events = events.concat(_this.serverSyncTree_.ackUserWrite(queue[i].currentWriteId));\r\n if (queue[i].onComplete) {\r\n // We never unset the output snapshot, and given that this transaction is complete, it should be set\r\n var node = queue[i].currentOutputSnapshotResolved;\r\n var ref = new Reference(_this, queue[i].path);\r\n var snapshot = new DataSnapshot(node, ref, PRIORITY_INDEX);\r\n callbacks.push(queue[i].onComplete.bind(null, null, true, snapshot));\r\n }\r\n queue[i].unwatcher();\r\n }\r\n // Now remove the completed transactions.\r\n _this.pruneCompletedTransactionsBelowNode_(_this.transactionQueueTree_.subTree(path));\r\n // There may be pending transactions that we can now send.\r\n _this.sendReadyTransactions_();\r\n _this.eventQueue_.raiseEventsForChangedPath(path, events);\r\n // Finally, trigger onComplete callbacks.\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n }\r\n else {\r\n // transactions are no longer sent. Update their status appropriately.\r\n if (status === 'datastale') {\r\n for (var i = 0; i < queue.length; i++) {\r\n if (queue[i].status === TransactionStatus.SENT_NEEDS_ABORT)\r\n queue[i].status = TransactionStatus.NEEDS_ABORT;\r\n else\r\n queue[i].status = TransactionStatus.RUN;\r\n }\r\n }\r\n else {\r\n warn('transaction at ' + pathToSend.toString() + ' failed: ' + status);\r\n for (var i = 0; i < queue.length; i++) {\r\n queue[i].status = TransactionStatus.NEEDS_ABORT;\r\n queue[i].abortReason = status;\r\n }\r\n }\r\n _this.rerunTransactions_(path);\r\n }\r\n }, latestHash);\r\n};\r\n/**\r\n * Finds all transactions dependent on the data at changedPath and reruns them.\r\n *\r\n * Should be called any time cached data changes.\r\n *\r\n * Return the highest path that was affected by rerunning transactions. This is the path at which events need to\r\n * be raised for.\r\n *\r\n * @param {!Path} changedPath The path in mergedData that changed.\r\n * @return {!Path} The rootmost path that was affected by rerunning transactions.\r\n * @private\r\n */\r\nRepo.prototype.rerunTransactions_ = function (changedPath) {\r\n var rootMostTransactionNode = this.getAncestorTransactionNode_(changedPath);\r\n var path = rootMostTransactionNode.path();\r\n var queue = this.buildTransactionQueue_(rootMostTransactionNode);\r\n this.rerunTransactionQueue_(queue, path);\r\n return path;\r\n};\r\n/**\r\n * Does all the work of rerunning transactions (as well as cleans up aborted transactions and whatnot).\r\n *\r\n * @param {Array.} queue The queue of transactions to run.\r\n * @param {!Path} path The path the queue is for.\r\n * @private\r\n */\r\nRepo.prototype.rerunTransactionQueue_ = function (queue, path) {\r\n if (queue.length === 0) {\r\n return; // Nothing to do!\r\n }\r\n // Queue up the callbacks and fire them after cleaning up all of our transaction state, since\r\n // the callback could trigger more transactions or sets.\r\n var callbacks = [];\r\n var events = [];\r\n // Ignore all of the sets we're going to re-run.\r\n var txnsToRerun = queue.filter(function (q) {\r\n return q.status === TransactionStatus.RUN;\r\n });\r\n var setsToIgnore = txnsToRerun.map(function (q) {\r\n return q.currentWriteId;\r\n });\r\n for (var i = 0; i < queue.length; i++) {\r\n var transaction = queue[i];\r\n var relativePath = Path.relativePath(path, transaction.path);\r\n var abortTransaction = false, abortReason = void 0;\r\n assert(relativePath !== null, 'rerunTransactionsUnderNode_: relativePath should not be null.');\r\n if (transaction.status === TransactionStatus.NEEDS_ABORT) {\r\n abortTransaction = true;\r\n abortReason = transaction.abortReason;\r\n events = events.concat(this.serverSyncTree_.ackUserWrite(transaction.currentWriteId, true));\r\n }\r\n else if (transaction.status === TransactionStatus.RUN) {\r\n if (transaction.retryCount >= Repo.MAX_TRANSACTION_RETRIES_) {\r\n abortTransaction = true;\r\n abortReason = 'maxretry';\r\n events = events.concat(this.serverSyncTree_.ackUserWrite(transaction.currentWriteId, true));\r\n }\r\n else {\r\n // This code reruns a transaction\r\n var currentNode = this.getLatestState_(transaction.path, setsToIgnore);\r\n transaction.currentInputSnapshot = currentNode;\r\n var newData = queue[i].update(currentNode.val());\r\n if (newData !== undefined) {\r\n validateFirebaseData('transaction failed: Data returned ', newData, transaction.path);\r\n var newDataNode = nodeFromJSON$1(newData);\r\n var hasExplicitPriority = typeof newData === 'object' &&\r\n newData != null &&\r\n contains(newData, '.priority');\r\n if (!hasExplicitPriority) {\r\n // Keep the old priority if there wasn't a priority explicitly specified.\r\n newDataNode = newDataNode.updatePriority(currentNode.getPriority());\r\n }\r\n var oldWriteId = transaction.currentWriteId;\r\n var serverValues = this.generateServerValues();\r\n var newNodeResolved = resolveDeferredValueSnapshot(newDataNode, serverValues);\r\n transaction.currentOutputSnapshotRaw = newDataNode;\r\n transaction.currentOutputSnapshotResolved = newNodeResolved;\r\n transaction.currentWriteId = this.getNextWriteId_();\r\n // Mutates setsToIgnore in place\r\n setsToIgnore.splice(setsToIgnore.indexOf(oldWriteId), 1);\r\n events = events.concat(this.serverSyncTree_.applyUserOverwrite(transaction.path, newNodeResolved, transaction.currentWriteId, transaction.applyLocally));\r\n events = events.concat(this.serverSyncTree_.ackUserWrite(oldWriteId, true));\r\n }\r\n else {\r\n abortTransaction = true;\r\n abortReason = 'nodata';\r\n events = events.concat(this.serverSyncTree_.ackUserWrite(transaction.currentWriteId, true));\r\n }\r\n }\r\n }\r\n this.eventQueue_.raiseEventsForChangedPath(path, events);\r\n events = [];\r\n if (abortTransaction) {\r\n // Abort.\r\n queue[i].status = TransactionStatus.COMPLETED;\r\n // Removing a listener can trigger pruning which can muck with mergedData/visibleData (as it prunes data).\r\n // So defer the unwatcher until we're done.\r\n (function (unwatcher) {\r\n setTimeout(unwatcher, Math.floor(0));\r\n })(queue[i].unwatcher);\r\n if (queue[i].onComplete) {\r\n if (abortReason === 'nodata') {\r\n var ref = new Reference(this, queue[i].path);\r\n // We set this field immediately, so it's safe to cast to an actual snapshot\r\n var lastInput /** @type {!Node} */ = queue[i].currentInputSnapshot;\r\n var snapshot = new DataSnapshot(lastInput, ref, PRIORITY_INDEX);\r\n callbacks.push(queue[i].onComplete.bind(null, null, false, snapshot));\r\n }\r\n else {\r\n callbacks.push(queue[i].onComplete.bind(null, new Error(abortReason), false, null));\r\n }\r\n }\r\n }\r\n }\r\n // Clean up completed transactions.\r\n this.pruneCompletedTransactionsBelowNode_(this.transactionQueueTree_);\r\n // Now fire callbacks, now that we're in a good, known state.\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n // Try to send the transaction result to the server.\r\n this.sendReadyTransactions_();\r\n};\r\n/**\r\n * Returns the rootmost ancestor node of the specified path that has a pending transaction on it, or just returns\r\n * the node for the given path if there are no pending transactions on any ancestor.\r\n *\r\n * @param {!Path} path The location to start at.\r\n * @return {!Tree.>} The rootmost node with a transaction.\r\n * @private\r\n */\r\nRepo.prototype.getAncestorTransactionNode_ = function (path) {\r\n var front;\r\n // Start at the root and walk deeper into the tree towards path until we find a node with pending transactions.\r\n var transactionNode = this.transactionQueueTree_;\r\n while ((front = path.getFront()) !== null &&\r\n transactionNode.getValue() === null) {\r\n transactionNode = transactionNode.subTree(front);\r\n path = path.popFront();\r\n }\r\n return transactionNode;\r\n};\r\n/**\r\n * Builds the queue of all transactions at or below the specified transactionNode.\r\n *\r\n * @param {!Tree.>} transactionNode\r\n * @return {Array.} The generated queue.\r\n * @private\r\n */\r\nRepo.prototype.buildTransactionQueue_ = function (transactionNode) {\r\n // Walk any child transaction queues and aggregate them into a single queue.\r\n var transactionQueue = [];\r\n this.aggregateTransactionQueuesForNode_(transactionNode, transactionQueue);\r\n // Sort them by the order the transactions were created.\r\n transactionQueue.sort(function (a, b) {\r\n return a.order - b.order;\r\n });\r\n return transactionQueue;\r\n};\r\n/**\r\n * @param {!Tree.>} node\r\n * @param {Array.} queue\r\n * @private\r\n */\r\nRepo.prototype.aggregateTransactionQueuesForNode_ = function (node, queue) {\r\n var _this = this;\r\n var nodeQueue = node.getValue();\r\n if (nodeQueue !== null) {\r\n for (var i = 0; i < nodeQueue.length; i++) {\r\n queue.push(nodeQueue[i]);\r\n }\r\n }\r\n node.forEachChild(function (child) {\r\n _this.aggregateTransactionQueuesForNode_(child, queue);\r\n });\r\n};\r\n/**\r\n * Remove COMPLETED transactions at or below this node in the transactionQueueTree_.\r\n *\r\n * @param {!Tree.>} node\r\n * @private\r\n */\r\nRepo.prototype.pruneCompletedTransactionsBelowNode_ = function (node) {\r\n var _this = this;\r\n var queue = node.getValue();\r\n if (queue) {\r\n var to = 0;\r\n for (var from = 0; from < queue.length; from++) {\r\n if (queue[from].status !== TransactionStatus.COMPLETED) {\r\n queue[to] = queue[from];\r\n to++;\r\n }\r\n }\r\n queue.length = to;\r\n node.setValue(queue.length > 0 ? queue : null);\r\n }\r\n node.forEachChild(function (childNode) {\r\n _this.pruneCompletedTransactionsBelowNode_(childNode);\r\n });\r\n};\r\n/**\r\n * Aborts all transactions on ancestors or descendants of the specified path. Called when doing a set() or update()\r\n * since we consider them incompatible with transactions.\r\n *\r\n * @param {!Path} path Path for which we want to abort related transactions.\r\n * @return {!Path}\r\n * @private\r\n */\r\nRepo.prototype.abortTransactions_ = function (path) {\r\n var _this = this;\r\n var affectedPath = this.getAncestorTransactionNode_(path).path();\r\n var transactionNode = this.transactionQueueTree_.subTree(path);\r\n transactionNode.forEachAncestor(function (node) {\r\n _this.abortTransactionsOnNode_(node);\r\n });\r\n this.abortTransactionsOnNode_(transactionNode);\r\n transactionNode.forEachDescendant(function (node) {\r\n _this.abortTransactionsOnNode_(node);\r\n });\r\n return affectedPath;\r\n};\r\n/**\r\n * Abort transactions stored in this transaction queue node.\r\n *\r\n * @param {!Tree.>} node Node to abort transactions for.\r\n * @private\r\n */\r\nRepo.prototype.abortTransactionsOnNode_ = function (node) {\r\n var queue = node.getValue();\r\n if (queue !== null) {\r\n // Queue up the callbacks and fire them after cleaning up all of our transaction state, since\r\n // the callback could trigger more transactions or sets.\r\n var callbacks = [];\r\n // Go through queue. Any already-sent transactions must be marked for abort, while the unsent ones\r\n // can be immediately aborted and removed.\r\n var events = [];\r\n var lastSent = -1;\r\n for (var i = 0; i < queue.length; i++) {\r\n if (queue[i].status === TransactionStatus.SENT_NEEDS_ABORT) {\r\n // Already marked. No action needed.\r\n }\r\n else if (queue[i].status === TransactionStatus.SENT) {\r\n assert(lastSent === i - 1, 'All SENT items should be at beginning of queue.');\r\n lastSent = i;\r\n // Mark transaction for abort when it comes back.\r\n queue[i].status = TransactionStatus.SENT_NEEDS_ABORT;\r\n queue[i].abortReason = 'set';\r\n }\r\n else {\r\n assert(queue[i].status === TransactionStatus.RUN, 'Unexpected transaction status in abort');\r\n // We can abort it immediately.\r\n queue[i].unwatcher();\r\n events = events.concat(this.serverSyncTree_.ackUserWrite(queue[i].currentWriteId, true));\r\n if (queue[i].onComplete) {\r\n var snapshot = null;\r\n callbacks.push(queue[i].onComplete.bind(null, new Error('set'), false, snapshot));\r\n }\r\n }\r\n }\r\n if (lastSent === -1) {\r\n // We're not waiting for any sent transactions. We can clear the queue.\r\n node.setValue(null);\r\n }\r\n else {\r\n // Remove the transactions we aborted.\r\n queue.length = lastSent + 1;\r\n }\r\n // Now fire the callbacks.\r\n this.eventQueue_.raiseEventsForChangedPath(node.path(), events);\r\n for (var i = 0; i < callbacks.length; i++) {\r\n exceptionGuard(callbacks[i]);\r\n }\r\n }\r\n};\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/** @const {string} */\r\nvar DATABASE_URL_OPTION = 'databaseURL';\r\nvar _staticInstance;\r\n/**\r\n * Creates and caches Repo instances.\r\n */\r\nvar RepoManager = /** @class */ (function () {\r\n function RepoManager() {\r\n /**\r\n * @private {!Object.>}\r\n */\r\n this.repos_ = {};\r\n /**\r\n * If true, new Repos will be created to use ReadonlyRestClient (for testing purposes).\r\n * @private {boolean}\r\n */\r\n this.useRestClient_ = false;\r\n }\r\n RepoManager.getInstance = function () {\r\n if (!_staticInstance) {\r\n _staticInstance = new RepoManager();\r\n }\r\n return _staticInstance;\r\n };\r\n // TODO(koss): Remove these functions unless used in tests?\r\n RepoManager.prototype.interrupt = function () {\r\n for (var appName in this.repos_) {\r\n for (var dbUrl in this.repos_[appName]) {\r\n this.repos_[appName][dbUrl].interrupt();\r\n }\r\n }\r\n };\r\n RepoManager.prototype.resume = function () {\r\n for (var appName in this.repos_) {\r\n for (var dbUrl in this.repos_[appName]) {\r\n this.repos_[appName][dbUrl].resume();\r\n }\r\n }\r\n };\r\n /**\r\n * This function should only ever be called to CREATE a new database instance.\r\n *\r\n * @param {!FirebaseApp} app\r\n * @return {!Database}\r\n */\r\n RepoManager.prototype.databaseFromApp = function (app, url) {\r\n var dbUrl = url || app.options[DATABASE_URL_OPTION];\r\n if (dbUrl === undefined) {\r\n fatal(\"Can't determine Firebase Database URL. Be sure to include \" +\r\n DATABASE_URL_OPTION +\r\n ' option when calling firebase.initializeApp().');\r\n }\r\n var parsedUrl = parseRepoInfo(dbUrl);\r\n var repoInfo = parsedUrl.repoInfo;\r\n validateUrl('Invalid Firebase Database URL', 1, parsedUrl);\r\n if (!parsedUrl.path.isEmpty()) {\r\n fatal('Database URL must point to the root of a Firebase Database ' +\r\n '(not including a child path).');\r\n }\r\n var repo = this.createRepo(repoInfo, app);\r\n return repo.database;\r\n };\r\n /**\r\n * Remove the repo and make sure it is disconnected.\r\n *\r\n * @param {!Repo} repo\r\n */\r\n RepoManager.prototype.deleteRepo = function (repo) {\r\n var appRepos = safeGet(this.repos_, repo.app.name);\r\n // This should never happen...\r\n if (!appRepos || safeGet(appRepos, repo.repoInfo_.toURLString()) !== repo) {\r\n fatal(\"Database \" + repo.app.name + \"(\" + repo.repoInfo_ + \") has already been deleted.\");\r\n }\r\n repo.interrupt();\r\n delete appRepos[repo.repoInfo_.toURLString()];\r\n };\r\n /**\r\n * Ensures a repo doesn't already exist and then creates one using the\r\n * provided app.\r\n *\r\n * @param {!RepoInfo} repoInfo The metadata about the Repo\r\n * @param {!FirebaseApp} app\r\n * @return {!Repo} The Repo object for the specified server / repoName.\r\n */\r\n RepoManager.prototype.createRepo = function (repoInfo, app) {\r\n var appRepos = safeGet(this.repos_, app.name);\r\n if (!appRepos) {\r\n appRepos = {};\r\n this.repos_[app.name] = appRepos;\r\n }\r\n var repo = safeGet(appRepos, repoInfo.toURLString());\r\n if (repo) {\r\n fatal('Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.');\r\n }\r\n repo = new Repo(repoInfo, this.useRestClient_, app);\r\n appRepos[repoInfo.toURLString()] = repo;\r\n return repo;\r\n };\r\n /**\r\n * Forces us to use ReadonlyRestClient instead of PersistentConnection for new Repos.\r\n * @param {boolean} forceRestClient\r\n */\r\n RepoManager.prototype.forceRestClient = function (forceRestClient) {\r\n this.useRestClient_ = forceRestClient;\r\n };\r\n return RepoManager;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Class representing a firebase database.\r\n * @implements {FirebaseService}\r\n */\r\nvar Database = /** @class */ (function () {\r\n /**\r\n * The constructor should not be called by users of our public API.\r\n * @param {!Repo} repo_\r\n */\r\n function Database(repo_) {\r\n this.repo_ = repo_;\r\n if (!(repo_ instanceof Repo)) {\r\n fatal(\"Don't call new Database() directly - please use firebase.database().\");\r\n }\r\n /** @type {Reference} */\r\n this.root_ = new Reference(repo_, Path.Empty);\r\n this.INTERNAL = new DatabaseInternals(this);\r\n }\r\n Object.defineProperty(Database.prototype, \"app\", {\r\n get: function () {\r\n return this.repo_.app;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Database.prototype.ref = function (path) {\r\n this.checkDeleted_('ref');\r\n validateArgCount('database.ref', 0, 1, arguments.length);\r\n if (path instanceof Reference) {\r\n return this.refFromURL(path.toString());\r\n }\r\n return path !== undefined ? this.root_.child(path) : this.root_;\r\n };\r\n /**\r\n * Returns a reference to the root or the path specified in url.\r\n * We throw a exception if the url is not in the same domain as the\r\n * current repo.\r\n * @param {string} url\r\n * @return {!Reference} Firebase reference.\r\n */\r\n Database.prototype.refFromURL = function (url) {\r\n /** @const {string} */\r\n var apiName = 'database.refFromURL';\r\n this.checkDeleted_(apiName);\r\n validateArgCount(apiName, 1, 1, arguments.length);\r\n var parsedURL = parseRepoInfo(url);\r\n validateUrl(apiName, 1, parsedURL);\r\n var repoInfo = parsedURL.repoInfo;\r\n if (repoInfo.host !== this.repo_.repoInfo_.host) {\r\n fatal(apiName +\r\n ': Host name does not match the current database: ' +\r\n '(found ' +\r\n repoInfo.host +\r\n ' but expected ' +\r\n this.repo_.repoInfo_.host +\r\n ')');\r\n }\r\n return this.ref(parsedURL.path.toString());\r\n };\r\n /**\r\n * @param {string} apiName\r\n */\r\n Database.prototype.checkDeleted_ = function (apiName) {\r\n if (this.repo_ === null) {\r\n fatal('Cannot call ' + apiName + ' on a deleted database.');\r\n }\r\n };\r\n // Make individual repo go offline.\r\n Database.prototype.goOffline = function () {\r\n validateArgCount('database.goOffline', 0, 0, arguments.length);\r\n this.checkDeleted_('goOffline');\r\n this.repo_.interrupt();\r\n };\r\n Database.prototype.goOnline = function () {\r\n validateArgCount('database.goOnline', 0, 0, arguments.length);\r\n this.checkDeleted_('goOnline');\r\n this.repo_.resume();\r\n };\r\n Database.ServerValue = {\r\n TIMESTAMP: {\r\n '.sv': 'timestamp'\r\n }\r\n };\r\n return Database;\r\n}());\r\nvar DatabaseInternals = /** @class */ (function () {\r\n /** @param {!Database} database */\r\n function DatabaseInternals(database) {\r\n this.database = database;\r\n }\r\n /** @return {Promise} */\r\n DatabaseInternals.prototype.delete = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n this.database.checkDeleted_('delete');\r\n RepoManager.getInstance().deleteRepo(this.database.repo_);\r\n this.database.repo_ = null;\r\n this.database.root_ = null;\r\n this.database.INTERNAL = null;\r\n this.database = null;\r\n return [2 /*return*/];\r\n });\r\n });\r\n };\r\n return DatabaseInternals;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * INTERNAL methods for internal-use only (tests, etc.).\r\n *\r\n * Customers shouldn't use these or else should be aware that they could break at any time.\r\n *\r\n * @const\r\n */\r\nvar forceLongPolling = function () {\r\n WebSocketConnection.forceDisallow();\r\n BrowserPollConnection.forceAllow();\r\n};\r\nvar forceWebSockets = function () {\r\n BrowserPollConnection.forceDisallow();\r\n};\r\n/* Used by App Manager */\r\nvar isWebSocketsAvailable = function () {\r\n return WebSocketConnection['isAvailable']();\r\n};\r\nvar setSecurityDebugCallback = function (ref, callback) {\r\n ref.repo.persistentConnection_.securityDebugCallback_ = callback;\r\n};\r\nvar stats = function (ref, showDelta) {\r\n ref.repo.stats(showDelta);\r\n};\r\nvar statsIncrementCounter = function (ref, metric) {\r\n ref.repo.statsIncrementCounter(metric);\r\n};\r\nvar dataUpdateCount = function (ref) {\r\n return ref.repo.dataUpdateCount;\r\n};\r\nvar interceptServerData = function (ref, callback) {\r\n return ref.repo.interceptServerData_(callback);\r\n};\n\nvar INTERNAL = /*#__PURE__*/Object.freeze({\n forceLongPolling: forceLongPolling,\n forceWebSockets: forceWebSockets,\n isWebSocketsAvailable: isWebSocketsAvailable,\n setSecurityDebugCallback: setSecurityDebugCallback,\n stats: stats,\n statsIncrementCounter: statsIncrementCounter,\n dataUpdateCount: dataUpdateCount,\n interceptServerData: interceptServerData\n});\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar DataConnection = PersistentConnection;\r\n/**\r\n * @param {!string} pathString\r\n * @param {function(*)} onComplete\r\n */\r\nPersistentConnection.prototype.simpleListen = function (pathString, onComplete) {\r\n this.sendRequest('q', { p: pathString }, onComplete);\r\n};\r\n/**\r\n * @param {*} data\r\n * @param {function(*)} onEcho\r\n */\r\nPersistentConnection.prototype.echo = function (data, onEcho) {\r\n this.sendRequest('echo', { d: data }, onEcho);\r\n};\r\n// RealTimeConnection properties that we use in tests.\r\nvar RealTimeConnection = Connection;\r\n/**\r\n * @param {function(): string} newHash\r\n * @return {function()}\r\n */\r\nvar hijackHash = function (newHash) {\r\n var oldPut = PersistentConnection.prototype.put;\r\n PersistentConnection.prototype.put = function (pathString, data, opt_onComplete, opt_hash) {\r\n if (opt_hash !== undefined) {\r\n opt_hash = newHash();\r\n }\r\n oldPut.call(this, pathString, data, opt_onComplete, opt_hash);\r\n };\r\n return function () {\r\n PersistentConnection.prototype.put = oldPut;\r\n };\r\n};\r\n/**\r\n * @type {function(new:RepoInfo, !string, boolean, !string, boolean): undefined}\r\n */\r\nvar ConnectionTarget = RepoInfo;\r\n/**\r\n * @param {!Query} query\r\n * @return {!string}\r\n */\r\nvar queryIdentifier = function (query) {\r\n return query.queryIdentifier();\r\n};\r\n/**\r\n * @param {!Query} firebaseRef\r\n * @return {!Object}\r\n */\r\nvar listens = function (firebaseRef) {\r\n return firebaseRef.repo.persistentConnection_.listens_;\r\n};\r\n/**\r\n * Forces the RepoManager to create Repos that use ReadonlyRestClient instead of PersistentConnection.\r\n *\r\n * @param {boolean} forceRestClient\r\n */\r\nvar forceRestClient = function (forceRestClient) {\r\n RepoManager.getInstance().forceRestClient(forceRestClient);\r\n};\n\nvar TEST_ACCESS = /*#__PURE__*/Object.freeze({\n DataConnection: DataConnection,\n RealTimeConnection: RealTimeConnection,\n hijackHash: hijackHash,\n ConnectionTarget: ConnectionTarget,\n queryIdentifier: queryIdentifier,\n listens: listens,\n forceRestClient: forceRestClient\n});\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ServerValue = Database.ServerValue;\r\nfunction registerDatabase(instance) {\r\n // Register the Database Service with the 'firebase' namespace.\r\n var namespace = instance.INTERNAL.registerService('database', function (app, unused, url) { return RepoManager.getInstance().databaseFromApp(app, url); }, \r\n // firebase.database namespace properties\r\n {\r\n Reference: Reference,\r\n Query: Query,\r\n Database: Database,\r\n enableLogging: enableLogging,\r\n INTERNAL: INTERNAL,\r\n ServerValue: ServerValue,\r\n TEST_ACCESS: TEST_ACCESS\r\n }, null, true);\r\n if (isNodeSdk()) {\r\n module.exports = namespace;\r\n }\r\n}\r\nregisterDatabase(firebase);\n\nexport { registerDatabase, Database, Query, Reference, enableLogging, ServerValue, DataSnapshot, OnDisconnect };\n","import { ErrorFactory, createSubscribe } from '@firebase/util';\nimport { __extends, __awaiter, __generator, __assign } from 'tslib';\nimport firebase from '@firebase/app';\n\n/**\r\n * Copyright 2018 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar ERROR_CODES = {\r\n AVAILABLE_IN_WINDOW: 'only-available-in-window',\r\n AVAILABLE_IN_SW: 'only-available-in-sw',\r\n SHOULD_BE_INHERITED: 'should-be-overriden',\r\n BAD_SENDER_ID: 'bad-sender-id',\r\n INCORRECT_GCM_SENDER_ID: 'incorrect-gcm-sender-id',\r\n PERMISSION_DEFAULT: 'permission-default',\r\n PERMISSION_BLOCKED: 'permission-blocked',\r\n UNSUPPORTED_BROWSER: 'unsupported-browser',\r\n NOTIFICATIONS_BLOCKED: 'notifications-blocked',\r\n FAILED_DEFAULT_REGISTRATION: 'failed-serviceworker-registration',\r\n SW_REGISTRATION_EXPECTED: 'sw-registration-expected',\r\n GET_SUBSCRIPTION_FAILED: 'get-subscription-failed',\r\n INVALID_SAVED_TOKEN: 'invalid-saved-token',\r\n SW_REG_REDUNDANT: 'sw-reg-redundant',\r\n TOKEN_SUBSCRIBE_FAILED: 'token-subscribe-failed',\r\n TOKEN_SUBSCRIBE_NO_TOKEN: 'token-subscribe-no-token',\r\n TOKEN_SUBSCRIBE_NO_PUSH_SET: 'token-subscribe-no-push-set',\r\n TOKEN_UNSUBSCRIBE_FAILED: 'token-unsubscribe-failed',\r\n TOKEN_UPDATE_FAILED: 'token-update-failed',\r\n TOKEN_UPDATE_NO_TOKEN: 'token-update-no-token',\r\n USE_SW_BEFORE_GET_TOKEN: 'use-sw-before-get-token',\r\n INVALID_DELETE_TOKEN: 'invalid-delete-token',\r\n DELETE_TOKEN_NOT_FOUND: 'delete-token-not-found',\r\n DELETE_SCOPE_NOT_FOUND: 'delete-scope-not-found',\r\n BG_HANDLER_FUNCTION_EXPECTED: 'bg-handler-function-expected',\r\n NO_WINDOW_CLIENT_TO_MSG: 'no-window-client-to-msg',\r\n UNABLE_TO_RESUBSCRIBE: 'unable-to-resubscribe',\r\n NO_FCM_TOKEN_FOR_RESUBSCRIBE: 'no-fcm-token-for-resubscribe',\r\n FAILED_TO_DELETE_TOKEN: 'failed-to-delete-token',\r\n NO_SW_IN_REG: 'no-sw-in-reg',\r\n BAD_SCOPE: 'bad-scope',\r\n BAD_VAPID_KEY: 'bad-vapid-key',\r\n BAD_SUBSCRIPTION: 'bad-subscription',\r\n BAD_TOKEN: 'bad-token',\r\n BAD_PUSH_SET: 'bad-push-set',\r\n FAILED_DELETE_VAPID_KEY: 'failed-delete-vapid-key',\r\n INVALID_PUBLIC_VAPID_KEY: 'invalid-public-vapid-key',\r\n USE_PUBLIC_KEY_BEFORE_GET_TOKEN: 'use-public-key-before-get-token',\r\n PUBLIC_KEY_DECRYPTION_FAILED: 'public-vapid-key-decryption-failed'\r\n};\r\nvar ERROR_MAP = (_a = {}, _a[ERROR_CODES.AVAILABLE_IN_WINDOW] = 'This method is available in a Window context.', _a[ERROR_CODES.AVAILABLE_IN_SW] = 'This method is available in a service worker ' + 'context.', _a[ERROR_CODES.SHOULD_BE_INHERITED] = 'This method should be overriden by ' + 'extended classes.', _a[ERROR_CODES.BAD_SENDER_ID] = \"Please ensure that 'messagingSenderId' is set \" +\r\n 'correctly in the options passed into firebase.initializeApp().', _a[ERROR_CODES.PERMISSION_DEFAULT] = 'The required permissions were not granted and ' + 'dismissed instead.', _a[ERROR_CODES.PERMISSION_BLOCKED] = 'The required permissions were not granted and ' + 'blocked instead.', _a[ERROR_CODES.UNSUPPORTED_BROWSER] = \"This browser doesn't support the API's \" +\r\n 'required to use the firebase SDK.', _a[ERROR_CODES.NOTIFICATIONS_BLOCKED] = 'Notifications have been blocked.', _a[ERROR_CODES.FAILED_DEFAULT_REGISTRATION] = 'We are unable to register the ' +\r\n 'default service worker. {$browserErrorMessage}', _a[ERROR_CODES.SW_REGISTRATION_EXPECTED] = 'A service worker registration was the ' + 'expected input.', _a[ERROR_CODES.GET_SUBSCRIPTION_FAILED] = 'There was an error when trying to get ' +\r\n 'any existing Push Subscriptions.', _a[ERROR_CODES.INVALID_SAVED_TOKEN] = 'Unable to access details of the saved token.', _a[ERROR_CODES.SW_REG_REDUNDANT] = 'The service worker being used for push was made ' + 'redundant.', _a[ERROR_CODES.TOKEN_SUBSCRIBE_FAILED] = 'A problem occured while subscribing the ' + 'user to FCM: {$message}', _a[ERROR_CODES.TOKEN_SUBSCRIBE_NO_TOKEN] = 'FCM returned no token when subscribing ' + 'the user to push.', _a[ERROR_CODES.TOKEN_SUBSCRIBE_NO_PUSH_SET] = 'FCM returned an invalid response ' + 'when getting an FCM token.', _a[ERROR_CODES.TOKEN_UNSUBSCRIBE_FAILED] = 'A problem occured while unsubscribing the ' + 'user from FCM: {$message}', _a[ERROR_CODES.TOKEN_UPDATE_FAILED] = 'A problem occured while updating the ' + 'user from FCM: {$message}', _a[ERROR_CODES.TOKEN_UPDATE_NO_TOKEN] = 'FCM returned no token when updating ' + 'the user to push.', _a[ERROR_CODES.USE_SW_BEFORE_GET_TOKEN] = 'The useServiceWorker() method may only be called once and must be ' +\r\n 'called before calling getToken() to ensure your service worker is used.', _a[ERROR_CODES.INVALID_DELETE_TOKEN] = 'You must pass a valid token into ' +\r\n 'deleteToken(), i.e. the token from getToken().', _a[ERROR_CODES.DELETE_TOKEN_NOT_FOUND] = 'The deletion attempt for token could not ' +\r\n 'be performed as the token was not found.', _a[ERROR_CODES.DELETE_SCOPE_NOT_FOUND] = 'The deletion attempt for service worker ' +\r\n 'scope could not be performed as the scope was not found.', _a[ERROR_CODES.BG_HANDLER_FUNCTION_EXPECTED] = 'The input to ' + 'setBackgroundMessageHandler() must be a function.', _a[ERROR_CODES.NO_WINDOW_CLIENT_TO_MSG] = 'An attempt was made to message a ' + 'non-existant window client.', _a[ERROR_CODES.UNABLE_TO_RESUBSCRIBE] = 'There was an error while re-subscribing ' +\r\n 'the FCM token for push messaging. Will have to resubscribe the ' +\r\n 'user on next visit. {$message}', _a[ERROR_CODES.NO_FCM_TOKEN_FOR_RESUBSCRIBE] = 'Could not find an FCM token ' +\r\n 'and as a result, unable to resubscribe. Will have to resubscribe the ' +\r\n 'user on next visit.', _a[ERROR_CODES.FAILED_TO_DELETE_TOKEN] = 'Unable to delete the currently saved token.', _a[ERROR_CODES.NO_SW_IN_REG] = 'Even though the service worker registration was ' +\r\n 'successful, there was a problem accessing the service worker itself.', _a[ERROR_CODES.INCORRECT_GCM_SENDER_ID] = \"Please change your web app manifest's \" +\r\n \"'gcm_sender_id' value to '103953800507' to use Firebase messaging.\", _a[ERROR_CODES.BAD_SCOPE] = 'The service worker scope must be a string with at ' +\r\n 'least one character.', _a[ERROR_CODES.BAD_VAPID_KEY] = 'The public VAPID key is not a Uint8Array with 65 bytes.', _a[ERROR_CODES.BAD_SUBSCRIPTION] = 'The subscription must be a valid ' + 'PushSubscription.', _a[ERROR_CODES.BAD_TOKEN] = 'The FCM Token used for storage / lookup was not ' +\r\n 'a valid token string.', _a[ERROR_CODES.BAD_PUSH_SET] = 'The FCM push set used for storage / lookup was not ' +\r\n 'not a valid push set string.', _a[ERROR_CODES.FAILED_DELETE_VAPID_KEY] = 'The VAPID key could not be deleted.', _a[ERROR_CODES.INVALID_PUBLIC_VAPID_KEY] = 'The public VAPID key must be a string.', _a[ERROR_CODES.PUBLIC_KEY_DECRYPTION_FAILED] = 'The public VAPID key did not equal ' + '65 bytes when decrypted.', _a);\r\nvar errorFactory = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\r\nvar _a;\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar DEFAULT_PUBLIC_VAPID_KEY = new Uint8Array([\r\n 0x04,\r\n 0x33,\r\n 0x94,\r\n 0xf7,\r\n 0xdf,\r\n 0xa1,\r\n 0xeb,\r\n 0xb1,\r\n 0xdc,\r\n 0x03,\r\n 0xa2,\r\n 0x5e,\r\n 0x15,\r\n 0x71,\r\n 0xdb,\r\n 0x48,\r\n 0xd3,\r\n 0x2e,\r\n 0xed,\r\n 0xed,\r\n 0xb2,\r\n 0x34,\r\n 0xdb,\r\n 0xb7,\r\n 0x47,\r\n 0x3a,\r\n 0x0c,\r\n 0x8f,\r\n 0xc4,\r\n 0xcc,\r\n 0xe1,\r\n 0x6f,\r\n 0x3c,\r\n 0x8c,\r\n 0x84,\r\n 0xdf,\r\n 0xab,\r\n 0xb6,\r\n 0x66,\r\n 0x3e,\r\n 0xf2,\r\n 0x0c,\r\n 0xd4,\r\n 0x8b,\r\n 0xfe,\r\n 0xe3,\r\n 0xf9,\r\n 0x76,\r\n 0x2f,\r\n 0x14,\r\n 0x1c,\r\n 0x63,\r\n 0x08,\r\n 0x6a,\r\n 0x6f,\r\n 0x2d,\r\n 0xb1,\r\n 0x1a,\r\n 0x95,\r\n 0xb0,\r\n 0xce,\r\n 0x37,\r\n 0xc0,\r\n 0x9c,\r\n 0x6e\r\n]);\r\nvar ENDPOINT = 'https://fcm.googleapis.com';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar MessageParameter;\r\n(function (MessageParameter) {\r\n MessageParameter[\"TYPE_OF_MSG\"] = \"firebase-messaging-msg-type\";\r\n MessageParameter[\"DATA\"] = \"firebase-messaging-msg-data\";\r\n})(MessageParameter || (MessageParameter = {}));\r\nvar MessageType;\r\n(function (MessageType) {\r\n MessageType[\"PUSH_MSG_RECEIVED\"] = \"push-msg-received\";\r\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\r\n})(MessageType || (MessageType = {}));\n\n/**\r\n * Copyright 2018 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction isArrayBufferEqual(a, b) {\r\n if (a == null || b == null) {\r\n return false;\r\n }\r\n if (a === b) {\r\n return true;\r\n }\r\n if (a.byteLength !== b.byteLength) {\r\n return false;\r\n }\r\n var viewA = new DataView(a);\r\n var viewB = new DataView(b);\r\n for (var i = 0; i < a.byteLength; i++) {\r\n if (viewA.getUint8(i) !== viewB.getUint8(i)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction toBase64(arrayBuffer) {\r\n var uint8Version = new Uint8Array(arrayBuffer);\r\n return btoa(String.fromCharCode.apply(null, uint8Version));\r\n}\r\nfunction arrayBufferToBase64(arrayBuffer) {\r\n var base64String = toBase64(arrayBuffer);\r\n return base64String\r\n .replace(/=/g, '')\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_');\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar IIDModel = /** @class */ (function () {\r\n function IIDModel() {\r\n }\r\n IIDModel.prototype.getToken = function (senderId, subscription, publicVapidKey) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var p256dh, auth, fcmSubscribeBody, applicationPubKey, headers, subscribeOptions, responseData, response, err_1, message;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n p256dh = arrayBufferToBase64(subscription.getKey('p256dh'));\r\n auth = arrayBufferToBase64(subscription.getKey('auth'));\r\n fcmSubscribeBody = \"authorized_entity=\" + senderId + \"&\" +\r\n (\"endpoint=\" + subscription.endpoint + \"&\") +\r\n (\"encryption_key=\" + p256dh + \"&\") +\r\n (\"encryption_auth=\" + auth);\r\n if (publicVapidKey !== DEFAULT_PUBLIC_VAPID_KEY) {\r\n applicationPubKey = arrayBufferToBase64(publicVapidKey);\r\n fcmSubscribeBody += \"&application_pub_key=\" + applicationPubKey;\r\n }\r\n headers = new Headers();\r\n headers.append('Content-Type', 'application/x-www-form-urlencoded');\r\n subscribeOptions = {\r\n method: 'POST',\r\n headers: headers,\r\n body: fcmSubscribeBody\r\n };\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n return [4 /*yield*/, fetch(ENDPOINT + '/fcm/connect/subscribe', subscribeOptions)];\r\n case 2:\r\n response = _a.sent();\r\n return [4 /*yield*/, response.json()];\r\n case 3:\r\n responseData = _a.sent();\r\n return [3 /*break*/, 5];\r\n case 4:\r\n err_1 = _a.sent();\r\n throw errorFactory.create(ERROR_CODES.TOKEN_SUBSCRIBE_FAILED);\r\n case 5:\r\n if (responseData.error) {\r\n message = responseData.error.message;\r\n throw errorFactory.create(ERROR_CODES.TOKEN_SUBSCRIBE_FAILED, {\r\n message: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw errorFactory.create(ERROR_CODES.TOKEN_SUBSCRIBE_NO_TOKEN);\r\n }\r\n if (!responseData.pushSet) {\r\n throw errorFactory.create(ERROR_CODES.TOKEN_SUBSCRIBE_NO_PUSH_SET);\r\n }\r\n return [2 /*return*/, {\r\n token: responseData.token,\r\n pushSet: responseData.pushSet\r\n }];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Update the underlying token details for fcmToken.\r\n */\r\n IIDModel.prototype.updateToken = function (senderId, fcmToken, fcmPushSet, subscription, publicVapidKey) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var p256dh, auth, fcmUpdateBody, applicationPubKey, headers, updateOptions, responseData, response, err_2, message;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n p256dh = arrayBufferToBase64(subscription.getKey('p256dh'));\r\n auth = arrayBufferToBase64(subscription.getKey('auth'));\r\n fcmUpdateBody = \"push_set=\" + fcmPushSet + \"&\" +\r\n (\"token=\" + fcmToken + \"&\") +\r\n (\"authorized_entity=\" + senderId + \"&\") +\r\n (\"endpoint=\" + subscription.endpoint + \"&\") +\r\n (\"encryption_key=\" + p256dh + \"&\") +\r\n (\"encryption_auth=\" + auth);\r\n if (publicVapidKey !== DEFAULT_PUBLIC_VAPID_KEY) {\r\n applicationPubKey = arrayBufferToBase64(publicVapidKey);\r\n fcmUpdateBody += \"&application_pub_key=\" + applicationPubKey;\r\n }\r\n headers = new Headers();\r\n headers.append('Content-Type', 'application/x-www-form-urlencoded');\r\n updateOptions = {\r\n method: 'POST',\r\n headers: headers,\r\n body: fcmUpdateBody\r\n };\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n return [4 /*yield*/, fetch(ENDPOINT + '/fcm/connect/subscribe', updateOptions)];\r\n case 2:\r\n response = _a.sent();\r\n return [4 /*yield*/, response.json()];\r\n case 3:\r\n responseData = _a.sent();\r\n return [3 /*break*/, 5];\r\n case 4:\r\n err_2 = _a.sent();\r\n throw errorFactory.create(ERROR_CODES.TOKEN_UPDATE_FAILED);\r\n case 5:\r\n if (responseData.error) {\r\n message = responseData.error.message;\r\n throw errorFactory.create(ERROR_CODES.TOKEN_UPDATE_FAILED, {\r\n message: message\r\n });\r\n }\r\n if (!responseData.token) {\r\n throw errorFactory.create(ERROR_CODES.TOKEN_UPDATE_NO_TOKEN);\r\n }\r\n return [2 /*return*/, responseData.token];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Given a fcmToken, pushSet and messagingSenderId, delete an FCM token.\r\n */\r\n IIDModel.prototype.deleteToken = function (senderId, fcmToken, fcmPushSet) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var fcmUnsubscribeBody, headers, unsubscribeOptions, response, responseData, message, err_3;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n fcmUnsubscribeBody = \"authorized_entity=\" + senderId + \"&\" +\r\n (\"token=\" + fcmToken + \"&\") +\r\n (\"pushSet=\" + fcmPushSet);\r\n headers = new Headers();\r\n headers.append('Content-Type', 'application/x-www-form-urlencoded');\r\n unsubscribeOptions = {\r\n method: 'POST',\r\n headers: headers,\r\n body: fcmUnsubscribeBody\r\n };\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n return [4 /*yield*/, fetch(ENDPOINT + '/fcm/connect/unsubscribe', unsubscribeOptions)];\r\n case 2:\r\n response = _a.sent();\r\n return [4 /*yield*/, response.json()];\r\n case 3:\r\n responseData = _a.sent();\r\n if (responseData.error) {\r\n message = responseData.error.message;\r\n throw errorFactory.create(ERROR_CODES.TOKEN_UNSUBSCRIBE_FAILED, {\r\n message: message\r\n });\r\n }\r\n return [3 /*break*/, 5];\r\n case 4:\r\n err_3 = _a.sent();\r\n throw errorFactory.create(ERROR_CODES.TOKEN_UNSUBSCRIBE_FAILED);\r\n case 5: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n return IIDModel;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction base64ToArrayBuffer(base64String) {\r\n var padding = '='.repeat((4 - base64String.length % 4) % 4);\r\n var base64 = (base64String + padding)\r\n .replace(/\\-/g, '+')\r\n .replace(/_/g, '/');\r\n var rawData = window.atob(base64);\r\n var outputArray = new Uint8Array(rawData.length);\r\n for (var i = 0; i < rawData.length; ++i) {\r\n outputArray[i] = rawData.charCodeAt(i);\r\n }\r\n return outputArray;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar OLD_DB_NAME = 'undefined';\r\nvar OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\r\nfunction handleDb(db) {\r\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\r\n // We found a database with the name 'undefined', but our expected object\r\n // store isn't defined.\r\n return;\r\n }\r\n var transaction = db.transaction(OLD_OBJECT_STORE_NAME);\r\n var objectStore = transaction.objectStore(OLD_OBJECT_STORE_NAME);\r\n var iidModel = new IIDModel();\r\n var openCursorRequest = objectStore.openCursor();\r\n openCursorRequest.onerror = function (event) {\r\n // NOOP - Nothing we can do.\r\n console.warn('Unable to cleanup old IDB.', event);\r\n };\r\n openCursorRequest.onsuccess = function () {\r\n var cursor = openCursorRequest.result;\r\n if (cursor) {\r\n // cursor.value contains the current record being iterated through\r\n // this is where you'd do something with the result\r\n var tokenDetails = cursor.value;\r\n iidModel.deleteToken(tokenDetails.fcmSenderId, tokenDetails.fcmToken, tokenDetails.fcmPushSet);\r\n cursor.continue();\r\n }\r\n else {\r\n db.close();\r\n indexedDB.deleteDatabase(OLD_DB_NAME);\r\n }\r\n };\r\n}\r\nfunction cleanV1() {\r\n var request = indexedDB.open(OLD_DB_NAME);\r\n request.onerror = function (event) {\r\n // NOOP - Nothing we can do.\r\n };\r\n request.onsuccess = function (event) {\r\n var db = request.result;\r\n handleDb(db);\r\n };\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar DBInterface = /** @class */ (function () {\r\n function DBInterface() {\r\n this.dbPromise = null;\r\n }\r\n /** Gets record(s) from the objectStore that match the given key. */\r\n DBInterface.prototype.get = function (key) {\r\n return this.createTransaction(function (objectStore) { return objectStore.get(key); });\r\n };\r\n /** Gets record(s) from the objectStore that match the given index. */\r\n DBInterface.prototype.getIndex = function (index, key) {\r\n function runRequest(objectStore) {\r\n var idbIndex = objectStore.index(index);\r\n return idbIndex.get(key);\r\n }\r\n return this.createTransaction(runRequest);\r\n };\r\n /** Assigns or overwrites the record for the given value. */\r\n // tslint:disable-next-line:no-any IndexedDB values are of type \"any\"\r\n DBInterface.prototype.put = function (value) {\r\n return this.createTransaction(function (objectStore) { return objectStore.put(value); }, 'readwrite');\r\n };\r\n /** Deletes record(s) from the objectStore that match the given key. */\r\n DBInterface.prototype.delete = function (key) {\r\n return this.createTransaction(function (objectStore) { return objectStore.delete(key); }, 'readwrite');\r\n };\r\n /**\r\n * Close the currently open database.\r\n */\r\n DBInterface.prototype.closeDatabase = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var db;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!this.dbPromise) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.dbPromise];\r\n case 1:\r\n db = _a.sent();\r\n db.close();\r\n this.dbPromise = null;\r\n _a.label = 2;\r\n case 2: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Creates an IndexedDB Transaction and passes its objectStore to the\r\n * runRequest function, which runs the database request.\r\n *\r\n * @return Promise that resolves with the result of the runRequest function\r\n */\r\n DBInterface.prototype.createTransaction = function (runRequest, mode) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var db, transaction, request, result;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.getDb()];\r\n case 1:\r\n db = _a.sent();\r\n transaction = db.transaction(this.objectStoreName, mode);\r\n request = transaction.objectStore(this.objectStoreName);\r\n return [4 /*yield*/, promisify(runRequest(request))];\r\n case 2:\r\n result = _a.sent();\r\n return [2 /*return*/, new Promise(function (resolve, reject) {\r\n transaction.oncomplete = function () {\r\n resolve(result);\r\n };\r\n transaction.onerror = function () {\r\n reject(transaction.error);\r\n };\r\n })];\r\n }\r\n });\r\n });\r\n };\r\n /** Gets the cached db connection or opens a new one. */\r\n DBInterface.prototype.getDb = function () {\r\n var _this = this;\r\n if (!this.dbPromise) {\r\n this.dbPromise = new Promise(function (resolve, reject) {\r\n var request = indexedDB.open(_this.dbName, _this.dbVersion);\r\n request.onsuccess = function () {\r\n resolve(request.result);\r\n };\r\n request.onerror = function () {\r\n _this.dbPromise = null;\r\n reject(request.error);\r\n };\r\n request.onupgradeneeded = function (event) { return _this.onDbUpgrade(request, event); };\r\n });\r\n }\r\n return this.dbPromise;\r\n };\r\n return DBInterface;\r\n}());\r\n/** Promisifies an IDBRequest. Resolves with the IDBRequest's result. */\r\nfunction promisify(request) {\r\n return new Promise(function (resolve, reject) {\r\n request.onsuccess = function () {\r\n resolve(request.result);\r\n };\r\n request.onerror = function () {\r\n reject(request.error);\r\n };\r\n });\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar TokenDetailsModel = /** @class */ (function (_super) {\r\n __extends(TokenDetailsModel, _super);\r\n function TokenDetailsModel() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.dbName = 'fcm_token_details_db';\r\n _this.dbVersion = 3;\r\n _this.objectStoreName = 'fcm_token_object_Store';\r\n return _this;\r\n }\r\n TokenDetailsModel.prototype.onDbUpgrade = function (request, event) {\r\n var db = request.result;\r\n // Lack of 'break' statements is intentional.\r\n switch (event.oldVersion) {\r\n case 0: {\r\n // New IDB instance\r\n var objectStore = db.createObjectStore(this.objectStoreName, {\r\n keyPath: 'swScope'\r\n });\r\n // Make sure the sender ID can be searched\r\n objectStore.createIndex('fcmSenderId', 'fcmSenderId', {\r\n unique: false\r\n });\r\n objectStore.createIndex('fcmToken', 'fcmToken', { unique: true });\r\n }\r\n case 1: {\r\n // Prior to version 2, we were using either 'fcm_token_details_db'\r\n // or 'undefined' as the database name due to bug in the SDK\r\n // So remove the old tokens and databases.\r\n cleanV1();\r\n }\r\n case 2: {\r\n var objectStore = request.transaction.objectStore(this.objectStoreName);\r\n var cursorRequest_1 = objectStore.openCursor();\r\n cursorRequest_1.onsuccess = function () {\r\n var cursor = cursorRequest_1.result;\r\n if (cursor) {\r\n var value = cursor.value;\r\n var newValue = __assign({}, value);\r\n if (!value.createTime) {\r\n newValue.createTime = Date.now();\r\n }\r\n if (typeof value.vapidKey === 'string') {\r\n newValue.vapidKey = base64ToArrayBuffer(value.vapidKey);\r\n }\r\n if (typeof value.auth === 'string') {\r\n newValue.auth = base64ToArrayBuffer(value.auth).buffer;\r\n }\r\n if (typeof value.auth === 'string') {\r\n newValue.p256dh = base64ToArrayBuffer(value.p256dh).buffer;\r\n }\r\n cursor.update(newValue);\r\n cursor.continue();\r\n }\r\n };\r\n }\r\n }\r\n };\r\n /**\r\n * Given a token, this method will look up the details in indexedDB.\r\n */\r\n TokenDetailsModel.prototype.getTokenDetailsFromToken = function (fcmToken) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n if (!fcmToken) {\r\n throw errorFactory.create(ERROR_CODES.BAD_TOKEN);\r\n }\r\n validateInputs({ fcmToken: fcmToken });\r\n return [2 /*return*/, this.getIndex('fcmToken', fcmToken)];\r\n });\r\n });\r\n };\r\n /**\r\n * Given a service worker scope, this method will look up the details in\r\n * indexedDB.\r\n * @return The details associated with that token.\r\n */\r\n TokenDetailsModel.prototype.getTokenDetailsFromSWScope = function (swScope) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n if (!swScope) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SCOPE);\r\n }\r\n validateInputs({ swScope: swScope });\r\n return [2 /*return*/, this.get(swScope)];\r\n });\r\n });\r\n };\r\n /**\r\n * Save the details for the fcm token for re-use at a later date.\r\n * @param input A plain js object containing args to save.\r\n */\r\n TokenDetailsModel.prototype.saveTokenDetails = function (tokenDetails) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n if (!tokenDetails.swScope) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SCOPE);\r\n }\r\n if (!tokenDetails.vapidKey) {\r\n throw errorFactory.create(ERROR_CODES.BAD_VAPID_KEY);\r\n }\r\n if (!tokenDetails.endpoint || !tokenDetails.auth || !tokenDetails.p256dh) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SUBSCRIPTION);\r\n }\r\n if (!tokenDetails.fcmSenderId) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SENDER_ID);\r\n }\r\n if (!tokenDetails.fcmToken) {\r\n throw errorFactory.create(ERROR_CODES.BAD_TOKEN);\r\n }\r\n if (!tokenDetails.fcmPushSet) {\r\n throw errorFactory.create(ERROR_CODES.BAD_PUSH_SET);\r\n }\r\n validateInputs(tokenDetails);\r\n return [2 /*return*/, this.put(tokenDetails)];\r\n });\r\n });\r\n };\r\n /**\r\n * This method deletes details of the current FCM token.\r\n * It's returning a promise in case we need to move to an async\r\n * method for deleting at a later date.\r\n *\r\n * @return Resolves once the FCM token details have been deleted and returns\r\n * the deleted details.\r\n */\r\n TokenDetailsModel.prototype.deleteToken = function (token) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var details;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (typeof token !== 'string' || token.length === 0) {\r\n return [2 /*return*/, Promise.reject(errorFactory.create(ERROR_CODES.INVALID_DELETE_TOKEN))];\r\n }\r\n return [4 /*yield*/, this.getTokenDetailsFromToken(token)];\r\n case 1:\r\n details = _a.sent();\r\n if (!details) {\r\n throw errorFactory.create(ERROR_CODES.DELETE_TOKEN_NOT_FOUND);\r\n }\r\n return [4 /*yield*/, this.delete(details.swScope)];\r\n case 2:\r\n _a.sent();\r\n return [2 /*return*/, details];\r\n }\r\n });\r\n });\r\n };\r\n return TokenDetailsModel;\r\n}(DBInterface));\r\n/**\r\n * This method takes an object and will check for known arguments and\r\n * validate the input.\r\n * @return Promise that resolves if input is valid, rejects otherwise.\r\n */\r\nfunction validateInputs(input) {\r\n if (input.fcmToken) {\r\n if (typeof input.fcmToken !== 'string' || input.fcmToken.length === 0) {\r\n throw errorFactory.create(ERROR_CODES.BAD_TOKEN);\r\n }\r\n }\r\n if (input.swScope) {\r\n if (typeof input.swScope !== 'string' || input.swScope.length === 0) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SCOPE);\r\n }\r\n }\r\n if (input.vapidKey) {\r\n if (!(input.vapidKey instanceof Uint8Array) ||\r\n input.vapidKey.length !== 65) {\r\n throw errorFactory.create(ERROR_CODES.BAD_VAPID_KEY);\r\n }\r\n }\r\n if (input.endpoint) {\r\n if (typeof input.endpoint !== 'string' || input.endpoint.length === 0) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SUBSCRIPTION);\r\n }\r\n }\r\n if (input.auth) {\r\n if (!(input.auth instanceof ArrayBuffer)) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SUBSCRIPTION);\r\n }\r\n }\r\n if (input.p256dh) {\r\n if (!(input.p256dh instanceof ArrayBuffer)) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SUBSCRIPTION);\r\n }\r\n }\r\n if (input.fcmSenderId) {\r\n if (typeof input.fcmSenderId !== 'string' ||\r\n input.fcmSenderId.length === 0) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SENDER_ID);\r\n }\r\n }\r\n if (input.fcmPushSet) {\r\n if (typeof input.fcmPushSet !== 'string' || input.fcmPushSet.length === 0) {\r\n throw errorFactory.create(ERROR_CODES.BAD_PUSH_SET);\r\n }\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar UNCOMPRESSED_PUBLIC_KEY_SIZE = 65;\r\nvar VapidDetailsModel = /** @class */ (function (_super) {\r\n __extends(VapidDetailsModel, _super);\r\n function VapidDetailsModel() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.dbName = 'fcm_vapid_details_db';\r\n _this.dbVersion = 1;\r\n _this.objectStoreName = 'fcm_vapid_object_Store';\r\n return _this;\r\n }\r\n VapidDetailsModel.prototype.onDbUpgrade = function (request) {\r\n var db = request.result;\r\n db.createObjectStore(this.objectStoreName, { keyPath: 'swScope' });\r\n };\r\n /**\r\n * Given a service worker scope, this method will look up the vapid key\r\n * in indexedDB.\r\n */\r\n VapidDetailsModel.prototype.getVapidFromSWScope = function (swScope) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var result;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (typeof swScope !== 'string' || swScope.length === 0) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SCOPE);\r\n }\r\n return [4 /*yield*/, this.get(swScope)];\r\n case 1:\r\n result = _a.sent();\r\n return [2 /*return*/, result ? result.vapidKey : undefined];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Save a vapid key against a swScope for later date.\r\n */\r\n VapidDetailsModel.prototype.saveVapidDetails = function (swScope, vapidKey) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var details;\r\n return __generator(this, function (_a) {\r\n if (typeof swScope !== 'string' || swScope.length === 0) {\r\n throw errorFactory.create(ERROR_CODES.BAD_SCOPE);\r\n }\r\n if (vapidKey === null || vapidKey.length !== UNCOMPRESSED_PUBLIC_KEY_SIZE) {\r\n throw errorFactory.create(ERROR_CODES.BAD_VAPID_KEY);\r\n }\r\n details = {\r\n swScope: swScope,\r\n vapidKey: vapidKey\r\n };\r\n return [2 /*return*/, this.put(details)];\r\n });\r\n });\r\n };\r\n /**\r\n * This method deletes details of the current FCM VAPID key for a SW scope.\r\n * Resolves once the scope/vapid details have been deleted and returns the\r\n * deleted vapid key.\r\n */\r\n VapidDetailsModel.prototype.deleteVapidDetails = function (swScope) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var vapidKey;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.getVapidFromSWScope(swScope)];\r\n case 1:\r\n vapidKey = _a.sent();\r\n if (!vapidKey) {\r\n throw errorFactory.create(ERROR_CODES.DELETE_SCOPE_NOT_FOUND);\r\n }\r\n return [4 /*yield*/, this.delete(swScope)];\r\n case 2:\r\n _a.sent();\r\n return [2 /*return*/, vapidKey];\r\n }\r\n });\r\n });\r\n };\r\n return VapidDetailsModel;\r\n}(DBInterface));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar SENDER_ID_OPTION_NAME = 'messagingSenderId';\r\n// Database cache should be invalidated once a week.\r\nvar TOKEN_EXPIRATION_MILLIS = 7 * 24 * 60 * 60 * 1000; // 7 days\r\nvar ControllerInterface = /** @class */ (function () {\r\n /**\r\n * An interface of the Messaging Service API\r\n */\r\n function ControllerInterface(app) {\r\n var _this = this;\r\n if (!app.options[SENDER_ID_OPTION_NAME] ||\r\n typeof app.options[SENDER_ID_OPTION_NAME] !== 'string') {\r\n throw errorFactory.create(ERROR_CODES.BAD_SENDER_ID);\r\n }\r\n this.messagingSenderId = app.options[SENDER_ID_OPTION_NAME];\r\n this.tokenDetailsModel = new TokenDetailsModel();\r\n this.vapidDetailsModel = new VapidDetailsModel();\r\n this.iidModel = new IIDModel();\r\n this.app = app;\r\n this.INTERNAL = {\r\n delete: function () { return _this.delete(); }\r\n };\r\n }\r\n /**\r\n * @export\r\n */\r\n ControllerInterface.prototype.getToken = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var currentPermission, swReg, publicVapidKey, pushSubscription, tokenDetails;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n currentPermission = this.getNotificationPermission_();\r\n if (currentPermission !== 'granted') {\r\n if (currentPermission === 'denied') {\r\n return [2 /*return*/, Promise.reject(errorFactory.create(ERROR_CODES.NOTIFICATIONS_BLOCKED))];\r\n }\r\n // We must wait for permission to be granted\r\n return [2 /*return*/, Promise.resolve(null)];\r\n }\r\n return [4 /*yield*/, this.getSWRegistration_()];\r\n case 1:\r\n swReg = _a.sent();\r\n return [4 /*yield*/, this.getPublicVapidKey_()];\r\n case 2:\r\n publicVapidKey = _a.sent();\r\n return [4 /*yield*/, this.getPushSubscription(swReg, publicVapidKey)];\r\n case 3:\r\n pushSubscription = _a.sent();\r\n return [4 /*yield*/, this.tokenDetailsModel.getTokenDetailsFromSWScope(swReg.scope)];\r\n case 4:\r\n tokenDetails = _a.sent();\r\n if (tokenDetails) {\r\n return [2 /*return*/, this.manageExistingToken(swReg, pushSubscription, publicVapidKey, tokenDetails)];\r\n }\r\n return [2 /*return*/, this.getNewToken(swReg, pushSubscription, publicVapidKey)];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * manageExistingToken is triggered if there's an existing FCM token in the\r\n * database and it can take 3 different actions:\r\n * 1) Retrieve the existing FCM token from the database.\r\n * 2) If VAPID details have changed: Delete the existing token and create a\r\n * new one with the new VAPID key.\r\n * 3) If the database cache is invalidated: Send a request to FCM to update\r\n * the token, and to check if the token is still valid on FCM-side.\r\n */\r\n ControllerInterface.prototype.manageExistingToken = function (swReg, pushSubscription, publicVapidKey, tokenDetails) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var isTokenValid, now;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n isTokenValid = isTokenStillValid(pushSubscription, publicVapidKey, tokenDetails);\r\n if (isTokenValid) {\r\n now = Date.now();\r\n if (now < tokenDetails.createTime + TOKEN_EXPIRATION_MILLIS) {\r\n return [2 /*return*/, tokenDetails.fcmToken];\r\n }\r\n else {\r\n return [2 /*return*/, this.updateToken(swReg, pushSubscription, publicVapidKey, tokenDetails)];\r\n }\r\n }\r\n // If the token is no longer valid (for example if the VAPID details\r\n // have changed), delete the existing token from the FCM client and server\r\n // database. No need to unsubscribe from the Service Worker as we have a\r\n // good push subscription that we'd like to use in getNewToken.\r\n return [4 /*yield*/, this.deleteTokenFromDB(tokenDetails.fcmToken)];\r\n case 1:\r\n // If the token is no longer valid (for example if the VAPID details\r\n // have changed), delete the existing token from the FCM client and server\r\n // database. No need to unsubscribe from the Service Worker as we have a\r\n // good push subscription that we'd like to use in getNewToken.\r\n _a.sent();\r\n return [2 /*return*/, this.getNewToken(swReg, pushSubscription, publicVapidKey)];\r\n }\r\n });\r\n });\r\n };\r\n ControllerInterface.prototype.updateToken = function (swReg, pushSubscription, publicVapidKey, tokenDetails) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var updatedToken, allDetails, e_1;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n _a.trys.push([0, 4, , 6]);\r\n return [4 /*yield*/, this.iidModel.updateToken(this.messagingSenderId, tokenDetails.fcmToken, tokenDetails.fcmPushSet, pushSubscription, publicVapidKey)];\r\n case 1:\r\n updatedToken = _a.sent();\r\n allDetails = {\r\n swScope: swReg.scope,\r\n vapidKey: publicVapidKey,\r\n fcmSenderId: this.messagingSenderId,\r\n fcmToken: updatedToken,\r\n fcmPushSet: tokenDetails.fcmPushSet,\r\n createTime: Date.now(),\r\n endpoint: pushSubscription.endpoint,\r\n auth: pushSubscription.getKey('auth'),\r\n p256dh: pushSubscription.getKey('p256dh')\r\n };\r\n return [4 /*yield*/, this.tokenDetailsModel.saveTokenDetails(allDetails)];\r\n case 2:\r\n _a.sent();\r\n return [4 /*yield*/, this.vapidDetailsModel.saveVapidDetails(swReg.scope, publicVapidKey)];\r\n case 3:\r\n _a.sent();\r\n return [2 /*return*/, updatedToken];\r\n case 4:\r\n e_1 = _a.sent();\r\n return [4 /*yield*/, this.deleteToken(tokenDetails.fcmToken)];\r\n case 5:\r\n _a.sent();\r\n throw e_1;\r\n case 6: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n ControllerInterface.prototype.getNewToken = function (swReg, pushSubscription, publicVapidKey) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var tokenDetails, allDetails;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.iidModel.getToken(this.messagingSenderId, pushSubscription, publicVapidKey)];\r\n case 1:\r\n tokenDetails = _a.sent();\r\n allDetails = {\r\n swScope: swReg.scope,\r\n vapidKey: publicVapidKey,\r\n fcmSenderId: this.messagingSenderId,\r\n fcmToken: tokenDetails.token,\r\n fcmPushSet: tokenDetails.pushSet,\r\n createTime: Date.now(),\r\n endpoint: pushSubscription.endpoint,\r\n auth: pushSubscription.getKey('auth'),\r\n p256dh: pushSubscription.getKey('p256dh')\r\n };\r\n return [4 /*yield*/, this.tokenDetailsModel.saveTokenDetails(allDetails)];\r\n case 2:\r\n _a.sent();\r\n return [4 /*yield*/, this.vapidDetailsModel.saveVapidDetails(swReg.scope, publicVapidKey)];\r\n case 3:\r\n _a.sent();\r\n return [2 /*return*/, tokenDetails.token];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * This method deletes tokens that the token manager looks after,\r\n * unsubscribes the token from FCM and then unregisters the push\r\n * subscription if it exists. It returns a promise that indicates\r\n * whether or not the unsubscribe request was processed successfully.\r\n * @export\r\n */\r\n ControllerInterface.prototype.deleteToken = function (token) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var registration, pushSubscription;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: \r\n // Delete the token details from the database.\r\n return [4 /*yield*/, this.deleteTokenFromDB(token)];\r\n case 1:\r\n // Delete the token details from the database.\r\n _a.sent();\r\n return [4 /*yield*/, this.getSWRegistration_()];\r\n case 2:\r\n registration = _a.sent();\r\n if (!registration) return [3 /*break*/, 4];\r\n return [4 /*yield*/, registration.pushManager.getSubscription()];\r\n case 3:\r\n pushSubscription = _a.sent();\r\n if (pushSubscription) {\r\n return [2 /*return*/, pushSubscription.unsubscribe()];\r\n }\r\n _a.label = 4;\r\n case 4: \r\n // If there's no SW, consider it a success.\r\n return [2 /*return*/, true];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * This method will delete the token from the client database, and make a\r\n * call to FCM to remove it from the server DB. Does not temper with the\r\n * push subscription.\r\n */\r\n ControllerInterface.prototype.deleteTokenFromDB = function (token) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var details;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.tokenDetailsModel.deleteToken(token)];\r\n case 1:\r\n details = _a.sent();\r\n return [4 /*yield*/, this.iidModel.deleteToken(details.fcmSenderId, details.fcmToken, details.fcmPushSet)];\r\n case 2:\r\n _a.sent();\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Gets a PushSubscription for the current user.\r\n */\r\n ControllerInterface.prototype.getPushSubscription = function (swRegistration, publicVapidKey) {\r\n return swRegistration.pushManager.getSubscription().then(function (subscription) {\r\n if (subscription) {\r\n return subscription;\r\n }\r\n return swRegistration.pushManager.subscribe({\r\n userVisibleOnly: true,\r\n applicationServerKey: publicVapidKey\r\n });\r\n });\r\n };\r\n //\r\n // The following methods should only be available in the window.\r\n //\r\n ControllerInterface.prototype.requestPermission = function () {\r\n throw errorFactory.create(ERROR_CODES.AVAILABLE_IN_WINDOW);\r\n };\r\n ControllerInterface.prototype.useServiceWorker = function (registration) {\r\n throw errorFactory.create(ERROR_CODES.AVAILABLE_IN_WINDOW);\r\n };\r\n ControllerInterface.prototype.usePublicVapidKey = function (b64PublicKey) {\r\n throw errorFactory.create(ERROR_CODES.AVAILABLE_IN_WINDOW);\r\n };\r\n ControllerInterface.prototype.onMessage = function (nextOrObserver, error, completed) {\r\n throw errorFactory.create(ERROR_CODES.AVAILABLE_IN_WINDOW);\r\n };\r\n ControllerInterface.prototype.onTokenRefresh = function (nextOrObserver, error, completed) {\r\n throw errorFactory.create(ERROR_CODES.AVAILABLE_IN_WINDOW);\r\n };\r\n //\r\n // The following methods are used by the service worker only.\r\n //\r\n ControllerInterface.prototype.setBackgroundMessageHandler = function (callback) {\r\n throw errorFactory.create(ERROR_CODES.AVAILABLE_IN_SW);\r\n };\r\n //\r\n // The following methods are used by the service themselves and not exposed\r\n // publicly or not expected to be used by developers.\r\n //\r\n /**\r\n * This method is required to adhere to the Firebase interface.\r\n * It closes any currently open indexdb database connections.\r\n */\r\n ControllerInterface.prototype.delete = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, Promise.all([\r\n this.tokenDetailsModel.closeDatabase(),\r\n this.vapidDetailsModel.closeDatabase()\r\n ])];\r\n case 1:\r\n _a.sent();\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * Returns the current Notification Permission state.\r\n */\r\n ControllerInterface.prototype.getNotificationPermission_ = function () {\r\n // TODO: Remove the cast when this issue is fixed:\r\n // https://github.com/Microsoft/TypeScript/issues/14701\r\n // tslint:disable-next-line no-any\r\n return Notification.permission;\r\n };\r\n ControllerInterface.prototype.getTokenDetailsModel = function () {\r\n return this.tokenDetailsModel;\r\n };\r\n ControllerInterface.prototype.getVapidDetailsModel = function () {\r\n return this.vapidDetailsModel;\r\n };\r\n // Visible for testing\r\n // TODO: make protected\r\n ControllerInterface.prototype.getIIDModel = function () {\r\n return this.iidModel;\r\n };\r\n return ControllerInterface;\r\n}());\r\n/**\r\n * Checks if the tokenDetails match the details provided in the clients.\r\n */\r\nfunction isTokenStillValid(pushSubscription, publicVapidKey, tokenDetails) {\r\n if (!isArrayBufferEqual(publicVapidKey.buffer, tokenDetails.vapidKey.buffer)) {\r\n return false;\r\n }\r\n var isEndpointEqual = pushSubscription.endpoint === tokenDetails.endpoint;\r\n var isAuthEqual = isArrayBufferEqual(pushSubscription.getKey('auth'), tokenDetails.auth);\r\n var isP256dhEqual = isArrayBufferEqual(pushSubscription.getKey('p256dh'), tokenDetails.p256dh);\r\n return isEndpointEqual && isAuthEqual && isP256dhEqual;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar FCM_MSG = 'FCM_MSG';\r\nvar SWController = /** @class */ (function (_super) {\r\n __extends(SWController, _super);\r\n function SWController(app) {\r\n var _this = _super.call(this, app) || this;\r\n _this.bgMessageHandler = null;\r\n self.addEventListener('push', function (e) {\r\n _this.onPush(e);\r\n });\r\n self.addEventListener('pushsubscriptionchange', function (e) {\r\n _this.onSubChange(e);\r\n });\r\n self.addEventListener('notificationclick', function (e) {\r\n _this.onNotificationClick(e);\r\n });\r\n return _this;\r\n }\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.onPush = function (event) {\r\n event.waitUntil(this.onPush_(event));\r\n };\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.onSubChange = function (event) {\r\n event.waitUntil(this.onSubChange_(event));\r\n };\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.onNotificationClick = function (event) {\r\n event.waitUntil(this.onNotificationClick_(event));\r\n };\r\n /**\r\n * A handler for push events that shows notifications based on the content of\r\n * the payload.\r\n *\r\n * The payload must be a JSON-encoded Object with a `notification` key. The\r\n * value of the `notification` property will be used as the NotificationOptions\r\n * object passed to showNotification. Additionally, the `title` property of the\r\n * notification object will be used as the title.\r\n *\r\n * If there is no notification data in the payload then no notification will be\r\n * shown.\r\n */\r\n SWController.prototype.onPush_ = function (event) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var msgPayload, hasVisibleClients, notificationDetails, notificationTitle, reg;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!event.data) {\r\n return [2 /*return*/];\r\n }\r\n try {\r\n msgPayload = event.data.json();\r\n }\r\n catch (err) {\r\n // Not JSON so not an FCM message\r\n return [2 /*return*/];\r\n }\r\n return [4 /*yield*/, this.hasVisibleClients_()];\r\n case 1:\r\n hasVisibleClients = _a.sent();\r\n if (hasVisibleClients) {\r\n // Do not need to show a notification.\r\n if (msgPayload.notification || this.bgMessageHandler) {\r\n // Send to page\r\n return [2 /*return*/, this.sendMessageToWindowClients_(msgPayload)];\r\n }\r\n return [2 /*return*/];\r\n }\r\n notificationDetails = this.getNotificationData_(msgPayload);\r\n if (!notificationDetails) return [3 /*break*/, 3];\r\n notificationTitle = notificationDetails.title || '';\r\n return [4 /*yield*/, this.getSWRegistration_()];\r\n case 2:\r\n reg = _a.sent();\r\n return [2 /*return*/, reg.showNotification(notificationTitle, notificationDetails)];\r\n case 3:\r\n if (!this.bgMessageHandler) return [3 /*break*/, 5];\r\n return [4 /*yield*/, this.bgMessageHandler(msgPayload)];\r\n case 4:\r\n _a.sent();\r\n return [2 /*return*/];\r\n case 5: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n SWController.prototype.onSubChange_ = function (event) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var registration, err_1, err_2, tokenDetailsModel, tokenDetails;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n _a.trys.push([0, 2, , 3]);\r\n return [4 /*yield*/, this.getSWRegistration_()];\r\n case 1:\r\n registration = _a.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n err_1 = _a.sent();\r\n throw errorFactory.create(ERROR_CODES.UNABLE_TO_RESUBSCRIBE, {\r\n message: err_1\r\n });\r\n case 3:\r\n _a.trys.push([3, 5, , 8]);\r\n return [4 /*yield*/, registration.pushManager.getSubscription()];\r\n case 4:\r\n _a.sent();\r\n return [3 /*break*/, 8];\r\n case 5:\r\n err_2 = _a.sent();\r\n tokenDetailsModel = this.getTokenDetailsModel();\r\n return [4 /*yield*/, tokenDetailsModel.getTokenDetailsFromSWScope(registration.scope)];\r\n case 6:\r\n tokenDetails = _a.sent();\r\n if (!tokenDetails) {\r\n // This should rarely occure, but could if indexedDB\r\n // is corrupted or wiped\r\n throw err_2;\r\n }\r\n // Attempt to delete the token if we know it's bad\r\n return [4 /*yield*/, this.deleteToken(tokenDetails.fcmToken)];\r\n case 7:\r\n // Attempt to delete the token if we know it's bad\r\n _a.sent();\r\n throw err_2;\r\n case 8: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n SWController.prototype.onNotificationClick_ = function (event) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var msgPayload, clickAction, windowClient, internalMsg;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!event.notification ||\r\n !event.notification.data ||\r\n !event.notification.data[FCM_MSG]) {\r\n // Not an FCM notification, do nothing.\r\n return [2 /*return*/];\r\n }\r\n // Prevent other listeners from receiving the event\r\n event.stopImmediatePropagation();\r\n event.notification.close();\r\n msgPayload = event.notification.data[FCM_MSG];\r\n if (!msgPayload.notification) {\r\n // Nothing to do.\r\n return [2 /*return*/];\r\n }\r\n clickAction = msgPayload.notification.click_action;\r\n if (!clickAction) {\r\n // Nothing to do.\r\n return [2 /*return*/];\r\n }\r\n return [4 /*yield*/, this.getWindowClient_(clickAction)];\r\n case 1:\r\n windowClient = _a.sent();\r\n if (!!windowClient) return [3 /*break*/, 3];\r\n return [4 /*yield*/, self.clients.openWindow(clickAction)];\r\n case 2:\r\n // Unable to find window client so need to open one.\r\n windowClient = _a.sent();\r\n return [3 /*break*/, 5];\r\n case 3: return [4 /*yield*/, windowClient.focus()];\r\n case 4:\r\n windowClient = _a.sent();\r\n _a.label = 5;\r\n case 5:\r\n if (!windowClient) {\r\n // Window Client will not be returned if it's for a third party origin.\r\n return [2 /*return*/];\r\n }\r\n // Delete notification data from payload before sending to the page.\r\n delete msgPayload.notification;\r\n internalMsg = createNewMsg(MessageType.NOTIFICATION_CLICKED, msgPayload);\r\n // Attempt to send a message to the client to handle the data\r\n // Is affected by: https://github.com/slightlyoff/ServiceWorker/issues/728\r\n return [2 /*return*/, this.attemptToMessageClient_(windowClient, internalMsg)];\r\n }\r\n });\r\n });\r\n };\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.getNotificationData_ = function (msgPayload) {\r\n if (!msgPayload) {\r\n return;\r\n }\r\n if (typeof msgPayload.notification !== 'object') {\r\n return;\r\n }\r\n var notificationInformation = __assign({}, msgPayload.notification);\r\n // Put the message payload under FCM_MSG name so we can identify the\r\n // notification as being an FCM notification vs a notification from\r\n // somewhere else (i.e. normal web push or developer generated\r\n // notification).\r\n notificationInformation.data = (_a = {}, _a[FCM_MSG] = msgPayload, _a);\r\n return notificationInformation;\r\n var _a;\r\n };\r\n /**\r\n * Calling setBackgroundMessageHandler will opt in to some specific\r\n * behaviours.\r\n * 1.) If a notification doesn't need to be shown due to a window already\r\n * being visible, then push messages will be sent to the page.\r\n * 2.) If a notification needs to be shown, and the message contains no\r\n * notification data this method will be called\r\n * and the promise it returns will be passed to event.waitUntil.\r\n * If you do not set this callback then all push messages will let and the\r\n * developer can handle them in a their own 'push' event callback\r\n *\r\n * @param callback The callback to be called when a push message is received\r\n * and a notification must be shown. The callback will be given the data from\r\n * the push message.\r\n */\r\n SWController.prototype.setBackgroundMessageHandler = function (callback) {\r\n if (!callback || typeof callback !== 'function') {\r\n throw errorFactory.create(ERROR_CODES.BG_HANDLER_FUNCTION_EXPECTED);\r\n }\r\n this.bgMessageHandler = callback;\r\n };\r\n /**\r\n * @param url The URL to look for when focusing a client.\r\n * @return Returns an existing window client or a newly opened WindowClient.\r\n */\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.getWindowClient_ = function (url) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var parsedURL, clientList, suitableClient, i, parsedClientUrl;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n parsedURL = new URL(url, self.location.href).href;\r\n return [4 /*yield*/, getClientList()];\r\n case 1:\r\n clientList = _a.sent();\r\n suitableClient = null;\r\n for (i = 0; i < clientList.length; i++) {\r\n parsedClientUrl = new URL(clientList[i].url, self.location.href)\r\n .href;\r\n if (parsedClientUrl === parsedURL) {\r\n suitableClient = clientList[i];\r\n break;\r\n }\r\n }\r\n return [2 /*return*/, suitableClient];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * This message will attempt to send the message to a window client.\r\n * @param client The WindowClient to send the message to.\r\n * @param message The message to send to the client.\r\n * @returns Returns a promise that resolves after sending the message. This\r\n * does not guarantee that the message was successfully received.\r\n */\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.attemptToMessageClient_ = function (client, message) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n // NOTE: This returns a promise in case this API is abstracted later on to\r\n // do additional work\r\n if (!client) {\r\n throw errorFactory.create(ERROR_CODES.NO_WINDOW_CLIENT_TO_MSG);\r\n }\r\n client.postMessage(message);\r\n return [2 /*return*/];\r\n });\r\n });\r\n };\r\n /**\r\n * @returns If there is currently a visible WindowClient, this method will\r\n * resolve to true, otherwise false.\r\n */\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.hasVisibleClients_ = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var clientList;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, getClientList()];\r\n case 1:\r\n clientList = _a.sent();\r\n return [2 /*return*/, clientList.some(function (client) { return client.visibilityState === 'visible'; })];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * @param msgPayload The data from the push event that should be sent to all\r\n * available pages.\r\n * @returns Returns a promise that resolves once the message has been sent to\r\n * all WindowClients.\r\n */\r\n // Visible for testing\r\n // TODO: Make private\r\n SWController.prototype.sendMessageToWindowClients_ = function (msgPayload) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _this = this;\r\n var clientList, internalMsg;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, getClientList()];\r\n case 1:\r\n clientList = _a.sent();\r\n internalMsg = createNewMsg(MessageType.PUSH_MSG_RECEIVED, msgPayload);\r\n return [4 /*yield*/, Promise.all(clientList.map(function (client) {\r\n return _this.attemptToMessageClient_(client, internalMsg);\r\n }))];\r\n case 2:\r\n _a.sent();\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n * This will register the default service worker and return the registration.\r\n * @return he service worker registration to be used for the push service.\r\n */\r\n SWController.prototype.getSWRegistration_ = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n return [2 /*return*/, self.registration];\r\n });\r\n });\r\n };\r\n /**\r\n * This will return the default VAPID key or the uint8array version of the\r\n * public VAPID key provided by the developer.\r\n */\r\n SWController.prototype.getPublicVapidKey_ = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var swReg, vapidKeyFromDatabase;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.getSWRegistration_()];\r\n case 1:\r\n swReg = _a.sent();\r\n if (!swReg) {\r\n throw errorFactory.create(ERROR_CODES.SW_REGISTRATION_EXPECTED);\r\n }\r\n return [4 /*yield*/, this.getVapidDetailsModel().getVapidFromSWScope(swReg.scope)];\r\n case 2:\r\n vapidKeyFromDatabase = _a.sent();\r\n if (vapidKeyFromDatabase == null) {\r\n return [2 /*return*/, DEFAULT_PUBLIC_VAPID_KEY];\r\n }\r\n return [2 /*return*/, vapidKeyFromDatabase];\r\n }\r\n });\r\n });\r\n };\r\n return SWController;\r\n}(ControllerInterface));\r\nfunction getClientList() {\r\n return self.clients.matchAll({\r\n type: 'window',\r\n includeUncontrolled: true\r\n // TS doesn't know that \"type: 'window'\" means it'll return WindowClient[]\r\n });\r\n}\r\nfunction createNewMsg(msgType, msgData) {\r\n return _a = {}, _a[MessageParameter.TYPE_OF_MSG] = msgType, _a[MessageParameter.DATA] = msgData, _a;\r\n var _a;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\r\nvar DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar WindowController = /** @class */ (function (_super) {\r\n __extends(WindowController, _super);\r\n /**\r\n * A service that provides a MessagingService instance.\r\n */\r\n function WindowController(app) {\r\n var _this = _super.call(this, app) || this;\r\n _this.registrationToUse = null;\r\n _this.publicVapidKeyToUse = null;\r\n _this.manifestCheckPromise = null;\r\n _this.messageObserver = null;\r\n // @ts-ignore: Unused variable error, this is not implemented yet.\r\n _this.tokenRefreshObserver = null;\r\n _this.onMessageInternal = createSubscribe(function (observer) {\r\n _this.messageObserver = observer;\r\n });\r\n _this.onTokenRefreshInternal = createSubscribe(function (observer) {\r\n _this.tokenRefreshObserver = observer;\r\n });\r\n _this.setupSWMessageListener_();\r\n return _this;\r\n }\r\n /**\r\n * This method returns an FCM token if it can be generated.\r\n * The return promise will reject if the browser doesn't support\r\n * FCM, if permission is denied for notifications or it's not\r\n * possible to generate a token.\r\n *\r\n * @return Returns a promise that resolves to an FCM token or null if\r\n * permission isn't granted.\r\n */\r\n WindowController.prototype.getToken = function () {\r\n var _this = this;\r\n // Check that the required API's are available\r\n if (!this.isSupported_()) {\r\n return Promise.reject(errorFactory.create(ERROR_CODES.UNSUPPORTED_BROWSER));\r\n }\r\n return this.manifestCheck_().then(function () {\r\n return _super.prototype.getToken.call(_this);\r\n });\r\n };\r\n /**\r\n * The method checks that a manifest is defined and has the correct GCM\r\n * sender ID.\r\n * @return Returns a promise that resolves if the manifest matches\r\n * our required sender ID\r\n */\r\n // Visible for testing\r\n // TODO: make private\r\n WindowController.prototype.manifestCheck_ = function () {\r\n if (this.manifestCheckPromise) {\r\n return this.manifestCheckPromise;\r\n }\r\n var manifestTag = document.querySelector('link[rel=\"manifest\"]');\r\n if (!manifestTag) {\r\n this.manifestCheckPromise = Promise.resolve();\r\n }\r\n else {\r\n this.manifestCheckPromise = fetch(manifestTag.href)\r\n .then(function (response) {\r\n return response.json();\r\n })\r\n .catch(function () {\r\n // If the download or parsing fails allow check.\r\n // We only want to error if we KNOW that the gcm_sender_id is incorrect.\r\n })\r\n .then(function (manifestContent) {\r\n if (!manifestContent) {\r\n return;\r\n }\r\n if (!manifestContent['gcm_sender_id']) {\r\n return;\r\n }\r\n if (manifestContent['gcm_sender_id'] !== '103953800507') {\r\n throw errorFactory.create(ERROR_CODES.INCORRECT_GCM_SENDER_ID);\r\n }\r\n });\r\n }\r\n return this.manifestCheckPromise;\r\n };\r\n /**\r\n * Request permission if it is not currently granted\r\n *\r\n * @return Resolves if the permission was granted, otherwise rejects\r\n */\r\n WindowController.prototype.requestPermission = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n if (\r\n // TODO: Remove the cast when this issue is fixed:\r\n // https://github.com/Microsoft/TypeScript/issues/14701\r\n // tslint:disable-next-line no-any\r\n Notification.permission === 'granted') {\r\n return [2 /*return*/];\r\n }\r\n return [2 /*return*/, new Promise(function (resolve, reject) {\r\n var managePermissionResult = function (result) {\r\n if (result === 'granted') {\r\n return resolve();\r\n }\r\n else if (result === 'denied') {\r\n return reject(errorFactory.create(ERROR_CODES.PERMISSION_BLOCKED));\r\n }\r\n else {\r\n return reject(errorFactory.create(ERROR_CODES.PERMISSION_DEFAULT));\r\n }\r\n };\r\n // The Notification.requestPermission API was changed to\r\n // return a promise so now have to handle both in case\r\n // browsers stop support callbacks for promised version\r\n var permissionPromise = Notification.requestPermission(managePermissionResult);\r\n if (permissionPromise) {\r\n // Prefer the promise version as it's the future API.\r\n permissionPromise.then(managePermissionResult);\r\n }\r\n })];\r\n });\r\n });\r\n };\r\n /**\r\n * This method allows a developer to override the default service worker and\r\n * instead use a custom service worker.\r\n *\r\n * @param registration The service worker registration that should be used to\r\n * receive the push messages.\r\n */\r\n WindowController.prototype.useServiceWorker = function (registration) {\r\n if (!(registration instanceof ServiceWorkerRegistration)) {\r\n throw errorFactory.create(ERROR_CODES.SW_REGISTRATION_EXPECTED);\r\n }\r\n if (this.registrationToUse != null) {\r\n throw errorFactory.create(ERROR_CODES.USE_SW_BEFORE_GET_TOKEN);\r\n }\r\n this.registrationToUse = registration;\r\n };\r\n /**\r\n * This method allows a developer to override the default vapid key\r\n * and instead use a custom VAPID public key.\r\n *\r\n * @param publicKey A URL safe base64 encoded string.\r\n */\r\n WindowController.prototype.usePublicVapidKey = function (publicKey) {\r\n if (typeof publicKey !== 'string') {\r\n throw errorFactory.create(ERROR_CODES.INVALID_PUBLIC_VAPID_KEY);\r\n }\r\n if (this.publicVapidKeyToUse != null) {\r\n throw errorFactory.create(ERROR_CODES.USE_PUBLIC_KEY_BEFORE_GET_TOKEN);\r\n }\r\n var parsedKey = base64ToArrayBuffer(publicKey);\r\n if (parsedKey.length !== 65) {\r\n throw errorFactory.create(ERROR_CODES.PUBLIC_KEY_DECRYPTION_FAILED);\r\n }\r\n this.publicVapidKeyToUse = parsedKey;\r\n };\r\n /**\r\n * @export\r\n * @param nextOrObserver An observer object or a function triggered on\r\n * message.\r\n * @param error A function triggered on message error.\r\n * @param completed function triggered when the observer is removed.\r\n * @return The unsubscribe function for the observer.\r\n */\r\n WindowController.prototype.onMessage = function (nextOrObserver, error, completed) {\r\n if (typeof nextOrObserver === 'function') {\r\n return this.onMessageInternal(nextOrObserver, error, completed);\r\n }\r\n else {\r\n return this.onMessageInternal(nextOrObserver);\r\n }\r\n };\r\n /**\r\n * @param nextOrObserver An observer object or a function triggered on token\r\n * refresh.\r\n * @param error A function triggered on token refresh error.\r\n * @param completed function triggered when the observer is removed.\r\n * @return The unsubscribe function for the observer.\r\n */\r\n WindowController.prototype.onTokenRefresh = function (nextOrObserver, error, completed) {\r\n if (typeof nextOrObserver === 'function') {\r\n return this.onTokenRefreshInternal(nextOrObserver, error, completed);\r\n }\r\n else {\r\n return this.onTokenRefreshInternal(nextOrObserver);\r\n }\r\n };\r\n /**\r\n * Given a registration, wait for the service worker it relates to\r\n * become activer\r\n * @param registration Registration to wait for service worker to become active\r\n * @return Wait for service worker registration to become active\r\n */\r\n // Visible for testing\r\n // TODO: Make private\r\n WindowController.prototype.waitForRegistrationToActivate_ = function (registration) {\r\n var serviceWorker = registration.installing || registration.waiting || registration.active;\r\n return new Promise(function (resolve, reject) {\r\n if (!serviceWorker) {\r\n // This is a rare scenario but has occured in firefox\r\n reject(errorFactory.create(ERROR_CODES.NO_SW_IN_REG));\r\n return;\r\n }\r\n // Because the Promise function is called on next tick there is a\r\n // small chance that the worker became active or redundant already.\r\n if (serviceWorker.state === 'activated') {\r\n resolve(registration);\r\n return;\r\n }\r\n if (serviceWorker.state === 'redundant') {\r\n reject(errorFactory.create(ERROR_CODES.SW_REG_REDUNDANT));\r\n return;\r\n }\r\n var stateChangeListener = function () {\r\n if (serviceWorker.state === 'activated') {\r\n resolve(registration);\r\n }\r\n else if (serviceWorker.state === 'redundant') {\r\n reject(errorFactory.create(ERROR_CODES.SW_REG_REDUNDANT));\r\n }\r\n else {\r\n // Return early and wait to next state change\r\n return;\r\n }\r\n serviceWorker.removeEventListener('statechange', stateChangeListener);\r\n };\r\n serviceWorker.addEventListener('statechange', stateChangeListener);\r\n });\r\n };\r\n /**\r\n * This will register the default service worker and return the registration\r\n * @return The service worker registration to be used for the push service.\r\n */\r\n WindowController.prototype.getSWRegistration_ = function () {\r\n var _this = this;\r\n if (this.registrationToUse) {\r\n return this.waitForRegistrationToActivate_(this.registrationToUse);\r\n }\r\n // Make the registration null so we know useServiceWorker will not\r\n // use a new service worker as registrationToUse is no longer undefined\r\n this.registrationToUse = null;\r\n return navigator.serviceWorker\r\n .register(DEFAULT_SW_PATH, {\r\n scope: DEFAULT_SW_SCOPE\r\n })\r\n .catch(function (err) {\r\n throw errorFactory.create(ERROR_CODES.FAILED_DEFAULT_REGISTRATION, {\r\n browserErrorMessage: err.message\r\n });\r\n })\r\n .then(function (registration) {\r\n return _this.waitForRegistrationToActivate_(registration).then(function () {\r\n _this.registrationToUse = registration;\r\n // We update after activation due to an issue with Firefox v49 where\r\n // a race condition occassionally causes the service work to not\r\n // install\r\n registration.update();\r\n return registration;\r\n });\r\n });\r\n };\r\n /**\r\n * This will return the default VAPID key or the uint8array version of the public VAPID key\r\n * provided by the developer.\r\n */\r\n WindowController.prototype.getPublicVapidKey_ = function () {\r\n if (this.publicVapidKeyToUse) {\r\n return Promise.resolve(this.publicVapidKeyToUse);\r\n }\r\n return Promise.resolve(DEFAULT_PUBLIC_VAPID_KEY);\r\n };\r\n /**\r\n * This method will set up a message listener to handle\r\n * events from the service worker that should trigger\r\n * events in the page.\r\n */\r\n // Visible for testing\r\n // TODO: Make private\r\n WindowController.prototype.setupSWMessageListener_ = function () {\r\n var _this = this;\r\n if (!('serviceWorker' in navigator)) {\r\n return;\r\n }\r\n navigator.serviceWorker.addEventListener('message', function (event) {\r\n if (!event.data || !event.data[MessageParameter.TYPE_OF_MSG]) {\r\n // Not a message from FCM\r\n return;\r\n }\r\n var workerPageMessage = event.data;\r\n switch (workerPageMessage[MessageParameter.TYPE_OF_MSG]) {\r\n case MessageType.PUSH_MSG_RECEIVED:\r\n case MessageType.NOTIFICATION_CLICKED:\r\n var pushMessage = workerPageMessage[MessageParameter.DATA];\r\n if (_this.messageObserver) {\r\n _this.messageObserver.next(pushMessage);\r\n }\r\n break;\r\n default:\r\n // Noop.\r\n break;\r\n }\r\n }, false);\r\n };\r\n /**\r\n * Checks to see if the required API's are valid or not.\r\n * @return Returns true if the desired APIs are available.\r\n */\r\n // Visible for testing\r\n // TODO: Make private\r\n WindowController.prototype.isSupported_ = function () {\r\n return ('serviceWorker' in navigator &&\r\n 'PushManager' in window &&\r\n 'Notification' in window &&\r\n 'fetch' in window &&\r\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\r\n PushSubscription.prototype.hasOwnProperty('getKey'));\r\n };\r\n return WindowController;\r\n}(ControllerInterface));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction registerMessaging(instance) {\r\n var messagingName = 'messaging';\r\n var factoryMethod = function (app) {\r\n if (self && 'ServiceWorkerGlobalScope' in self) {\r\n return new SWController(app);\r\n }\r\n // Assume we are in the window context.\r\n return new WindowController(app);\r\n };\r\n var namespaceExports = {\r\n // no-inline\r\n Messaging: WindowController\r\n };\r\n instance.INTERNAL.registerService(messagingName, factoryMethod, namespaceExports);\r\n}\r\nregisterMessaging(firebase);\n\nexport { registerMessaging };\n","import firebase from '@firebase/app';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Constants used in the Firebase Storage library.\r\n */\r\n/**\r\n * Domain and scheme for API calls.\r\n */\r\nvar domainBase = 'https://firebasestorage.googleapis.com';\r\n/**\r\n * Domain and scheme for object downloads.\r\n */\r\nvar downloadBase = 'https://firebasestorage.googleapis.com';\r\n/**\r\n * Base URL for non-upload calls to the API.\r\n */\r\nvar apiBaseUrl = '/v0';\r\n/**\r\n * Base URL for upload calls to the API.\r\n */\r\nvar apiUploadBaseUrl = '/v0';\r\nvar configOption = 'storageBucket';\r\n/**\r\n * 2 minutes\r\n */\r\nvar defaultMaxOperationRetryTime = 2 * 60 * 1000;\r\n/**\r\n * 10 minutes\r\n */\r\nvar defaultMaxUploadRetryTime = 10 * 60 * 100;\r\n/**\r\n * This is the value of Number.MIN_SAFE_INTEGER, which is not well supported\r\n * enough for us to use it directly.\r\n */\r\nvar minSafeInteger = -9007199254740991;\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar FirebaseStorageError = /** @class */ (function () {\r\n function FirebaseStorageError(code, message) {\r\n this.code_ = prependCode(code);\r\n this.message_ = 'Firebase Storage: ' + message;\r\n this.serverResponse_ = null;\r\n this.name_ = 'FirebaseError';\r\n }\r\n FirebaseStorageError.prototype.codeProp = function () {\r\n return this.code;\r\n };\r\n FirebaseStorageError.prototype.codeEquals = function (code) {\r\n return prependCode(code) === this.codeProp();\r\n };\r\n FirebaseStorageError.prototype.serverResponseProp = function () {\r\n return this.serverResponse_;\r\n };\r\n FirebaseStorageError.prototype.setServerResponseProp = function (serverResponse) {\r\n this.serverResponse_ = serverResponse;\r\n };\r\n Object.defineProperty(FirebaseStorageError.prototype, \"name\", {\r\n get: function () {\r\n return this.name_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"code\", {\r\n get: function () {\r\n return this.code_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"message\", {\r\n get: function () {\r\n return this.message_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"serverResponse\", {\r\n get: function () {\r\n return this.serverResponse_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return FirebaseStorageError;\r\n}());\r\nvar Code = {\r\n // Shared between all platforms\r\n UNKNOWN: 'unknown',\r\n OBJECT_NOT_FOUND: 'object-not-found',\r\n BUCKET_NOT_FOUND: 'bucket-not-found',\r\n PROJECT_NOT_FOUND: 'project-not-found',\r\n QUOTA_EXCEEDED: 'quota-exceeded',\r\n UNAUTHENTICATED: 'unauthenticated',\r\n UNAUTHORIZED: 'unauthorized',\r\n RETRY_LIMIT_EXCEEDED: 'retry-limit-exceeded',\r\n INVALID_CHECKSUM: 'invalid-checksum',\r\n CANCELED: 'canceled',\r\n // JS specific\r\n INVALID_EVENT_NAME: 'invalid-event-name',\r\n INVALID_URL: 'invalid-url',\r\n INVALID_DEFAULT_BUCKET: 'invalid-default-bucket',\r\n NO_DEFAULT_BUCKET: 'no-default-bucket',\r\n CANNOT_SLICE_BLOB: 'cannot-slice-blob',\r\n SERVER_FILE_WRONG_SIZE: 'server-file-wrong-size',\r\n NO_DOWNLOAD_URL: 'no-download-url',\r\n INVALID_ARGUMENT: 'invalid-argument',\r\n INVALID_ARGUMENT_COUNT: 'invalid-argument-count',\r\n APP_DELETED: 'app-deleted',\r\n INVALID_ROOT_OPERATION: 'invalid-root-operation',\r\n INVALID_FORMAT: 'invalid-format',\r\n INTERNAL_ERROR: 'internal-error'\r\n};\r\nfunction prependCode(code) {\r\n return 'storage/' + code;\r\n}\r\nfunction unknown() {\r\n var message = 'An unknown error occurred, please check the error payload for ' +\r\n 'server response.';\r\n return new FirebaseStorageError(Code.UNKNOWN, message);\r\n}\r\nfunction objectNotFound(path) {\r\n return new FirebaseStorageError(Code.OBJECT_NOT_FOUND, \"Object '\" + path + \"' does not exist.\");\r\n}\r\nfunction quotaExceeded(bucket) {\r\n return new FirebaseStorageError(Code.QUOTA_EXCEEDED, \"Quota for bucket '\" +\r\n bucket +\r\n \"' exceeded, please view quota on \" +\r\n 'https://firebase.google.com/pricing/.');\r\n}\r\nfunction unauthenticated() {\r\n var message = 'User is not authenticated, please authenticate using Firebase ' +\r\n 'Authentication and try again.';\r\n return new FirebaseStorageError(Code.UNAUTHENTICATED, message);\r\n}\r\nfunction unauthorized(path) {\r\n return new FirebaseStorageError(Code.UNAUTHORIZED, \"User does not have permission to access '\" + path + \"'.\");\r\n}\r\nfunction retryLimitExceeded() {\r\n return new FirebaseStorageError(Code.RETRY_LIMIT_EXCEEDED, 'Max retry time for operation exceeded, please try again.');\r\n}\r\nfunction canceled() {\r\n return new FirebaseStorageError(Code.CANCELED, 'User canceled the upload/download.');\r\n}\r\nfunction invalidUrl(url) {\r\n return new FirebaseStorageError(Code.INVALID_URL, \"Invalid URL '\" + url + \"'.\");\r\n}\r\nfunction invalidDefaultBucket(bucket) {\r\n return new FirebaseStorageError(Code.INVALID_DEFAULT_BUCKET, \"Invalid default bucket '\" + bucket + \"'.\");\r\n}\r\nfunction cannotSliceBlob() {\r\n return new FirebaseStorageError(Code.CANNOT_SLICE_BLOB, 'Cannot slice blob for upload. Please retry the upload.');\r\n}\r\nfunction serverFileWrongSize() {\r\n return new FirebaseStorageError(Code.SERVER_FILE_WRONG_SIZE, 'Server recorded incorrect upload file size, please retry the upload.');\r\n}\r\nfunction noDownloadURL() {\r\n return new FirebaseStorageError(Code.NO_DOWNLOAD_URL, 'The given file does not have any download URLs.');\r\n}\r\nfunction invalidArgument(index, fnName, message) {\r\n return new FirebaseStorageError(Code.INVALID_ARGUMENT, 'Invalid argument in `' + fnName + '` at index ' + index + ': ' + message);\r\n}\r\nfunction invalidArgumentCount(argMin, argMax, fnName, real) {\r\n var countPart;\r\n var plural;\r\n if (argMin === argMax) {\r\n countPart = argMin;\r\n plural = argMin === 1 ? 'argument' : 'arguments';\r\n }\r\n else {\r\n countPart = 'between ' + argMin + ' and ' + argMax;\r\n plural = 'arguments';\r\n }\r\n return new FirebaseStorageError(Code.INVALID_ARGUMENT_COUNT, 'Invalid argument count in `' +\r\n fnName +\r\n '`: Expected ' +\r\n countPart +\r\n ' ' +\r\n plural +\r\n ', received ' +\r\n real +\r\n '.');\r\n}\r\nfunction appDeleted() {\r\n return new FirebaseStorageError(Code.APP_DELETED, 'The Firebase app was deleted.');\r\n}\r\n/**\r\n * @param name The name of the operation that was invalid.\r\n */\r\nfunction invalidRootOperation(name) {\r\n return new FirebaseStorageError(Code.INVALID_ROOT_OPERATION, \"The operation '\" +\r\n name +\r\n \"' cannot be performed on a root reference, create a non-root \" +\r\n \"reference using child, such as .child('file.png').\");\r\n}\r\n/**\r\n * @param format The format that was not valid.\r\n * @param message A message describing the format violation.\r\n */\r\nfunction invalidFormat(format, message) {\r\n return new FirebaseStorageError(Code.INVALID_FORMAT, \"String does not match format '\" + format + \"': \" + message);\r\n}\r\n/**\r\n * @param message A message describing the internal error.\r\n */\r\nfunction internalError(message) {\r\n throw new FirebaseStorageError(Code.INTERNAL_ERROR, 'Internal error: ' + message);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar StringFormat = {\r\n RAW: 'raw',\r\n BASE64: 'base64',\r\n BASE64URL: 'base64url',\r\n DATA_URL: 'data_url'\r\n};\r\nfunction formatValidator(stringFormat) {\r\n switch (stringFormat) {\r\n case StringFormat.RAW:\r\n case StringFormat.BASE64:\r\n case StringFormat.BASE64URL:\r\n case StringFormat.DATA_URL:\r\n return;\r\n default:\r\n throw 'Expected one of the event types: [' +\r\n StringFormat.RAW +\r\n ', ' +\r\n StringFormat.BASE64 +\r\n ', ' +\r\n StringFormat.BASE64URL +\r\n ', ' +\r\n StringFormat.DATA_URL +\r\n '].';\r\n }\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar StringData = /** @class */ (function () {\r\n function StringData(data, opt_contentType) {\r\n this.data = data;\r\n this.contentType = opt_contentType || null;\r\n }\r\n return StringData;\r\n}());\r\nfunction dataFromString(format, string) {\r\n switch (format) {\r\n case StringFormat.RAW:\r\n return new StringData(utf8Bytes_(string));\r\n case StringFormat.BASE64:\r\n case StringFormat.BASE64URL:\r\n return new StringData(base64Bytes_(format, string));\r\n case StringFormat.DATA_URL:\r\n return new StringData(dataURLBytes_(string), dataURLContentType_(string));\r\n }\r\n // assert(false);\r\n throw unknown();\r\n}\r\nfunction utf8Bytes_(string) {\r\n var b = [];\r\n for (var i = 0; i < string.length; i++) {\r\n var c = string.charCodeAt(i);\r\n if (c <= 127) {\r\n b.push(c);\r\n }\r\n else {\r\n if (c <= 2047) {\r\n b.push(192 | (c >> 6), 128 | (c & 63));\r\n }\r\n else {\r\n if ((c & 64512) == 55296) {\r\n // The start of a surrogate pair.\r\n var valid = i < string.length - 1 &&\r\n (string.charCodeAt(i + 1) & 64512) == 56320;\r\n if (!valid) {\r\n // The second surrogate wasn't there.\r\n b.push(239, 191, 189);\r\n }\r\n else {\r\n var hi = c;\r\n var lo = string.charCodeAt(++i);\r\n c = 65536 | ((hi & 1023) << 10) | (lo & 1023);\r\n b.push(240 | (c >> 18), 128 | ((c >> 12) & 63), 128 | ((c >> 6) & 63), 128 | (c & 63));\r\n }\r\n }\r\n else {\r\n if ((c & 64512) == 56320) {\r\n // Invalid low surrogate.\r\n b.push(239, 191, 189);\r\n }\r\n else {\r\n b.push(224 | (c >> 12), 128 | ((c >> 6) & 63), 128 | (c & 63));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return new Uint8Array(b);\r\n}\r\nfunction percentEncodedBytes_(string) {\r\n var decoded;\r\n try {\r\n decoded = decodeURIComponent(string);\r\n }\r\n catch (e) {\r\n throw invalidFormat(StringFormat.DATA_URL, 'Malformed data URL.');\r\n }\r\n return utf8Bytes_(decoded);\r\n}\r\nfunction base64Bytes_(format, string) {\r\n switch (format) {\r\n case StringFormat.BASE64: {\r\n var hasMinus = string.indexOf('-') !== -1;\r\n var hasUnder = string.indexOf('_') !== -1;\r\n if (hasMinus || hasUnder) {\r\n var invalidChar = hasMinus ? '-' : '_';\r\n throw invalidFormat(format, \"Invalid character '\" +\r\n invalidChar +\r\n \"' found: is it base64url encoded?\");\r\n }\r\n break;\r\n }\r\n case StringFormat.BASE64URL: {\r\n var hasPlus = string.indexOf('+') !== -1;\r\n var hasSlash = string.indexOf('/') !== -1;\r\n if (hasPlus || hasSlash) {\r\n var invalidChar = hasPlus ? '+' : '/';\r\n throw invalidFormat(format, \"Invalid character '\" + invalidChar + \"' found: is it base64 encoded?\");\r\n }\r\n string = string.replace(/-/g, '+').replace(/_/g, '/');\r\n break;\r\n }\r\n }\r\n var bytes;\r\n try {\r\n bytes = atob(string);\r\n }\r\n catch (e) {\r\n throw invalidFormat(format, 'Invalid character found');\r\n }\r\n var array = new Uint8Array(bytes.length);\r\n for (var i = 0; i < bytes.length; i++) {\r\n array[i] = bytes.charCodeAt(i);\r\n }\r\n return array;\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar DataURLParts = /** @class */ (function () {\r\n function DataURLParts(dataURL) {\r\n this.base64 = false;\r\n this.contentType = null;\r\n var matches = dataURL.match(/^data:([^,]+)?,/);\r\n if (matches === null) {\r\n throw invalidFormat(StringFormat.DATA_URL, \"Must be formatted 'data:[][;base64],\");\r\n }\r\n var middle = matches[1] || null;\r\n if (middle != null) {\r\n this.base64 = endsWith(middle, ';base64');\r\n this.contentType = this.base64\r\n ? middle.substring(0, middle.length - ';base64'.length)\r\n : middle;\r\n }\r\n this.rest = dataURL.substring(dataURL.indexOf(',') + 1);\r\n }\r\n return DataURLParts;\r\n}());\r\nfunction dataURLBytes_(string) {\r\n var parts = new DataURLParts(string);\r\n if (parts.base64) {\r\n return base64Bytes_(StringFormat.BASE64, parts.rest);\r\n }\r\n else {\r\n return percentEncodedBytes_(parts.rest);\r\n }\r\n}\r\nfunction dataURLContentType_(string) {\r\n var parts = new DataURLParts(string);\r\n return parts.contentType;\r\n}\r\nfunction endsWith(s, end) {\r\n var longEnough = s.length >= end.length;\r\n if (!longEnough) {\r\n return false;\r\n }\r\n return s.substring(s.length - end.length) === end;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar TaskEvent = {\r\n /** Triggered whenever the task changes or progress is updated. */\r\n STATE_CHANGED: 'state_changed'\r\n};\r\nvar InternalTaskState = {\r\n RUNNING: 'running',\r\n PAUSING: 'pausing',\r\n PAUSED: 'paused',\r\n SUCCESS: 'success',\r\n CANCELING: 'canceling',\r\n CANCELED: 'canceled',\r\n ERROR: 'error'\r\n};\r\nvar TaskState = {\r\n /** The task is currently transferring data. */\r\n RUNNING: 'running',\r\n /** The task was paused by the user. */\r\n PAUSED: 'paused',\r\n /** The task completed successfully. */\r\n SUCCESS: 'success',\r\n /** The task was canceled. */\r\n CANCELED: 'canceled',\r\n /** The task failed with an error. */\r\n ERROR: 'error'\r\n};\r\nfunction taskStateFromInternalTaskState(state) {\r\n switch (state) {\r\n case InternalTaskState.RUNNING:\r\n case InternalTaskState.PAUSING:\r\n case InternalTaskState.CANCELING:\r\n return TaskState.RUNNING;\r\n case InternalTaskState.PAUSED:\r\n return TaskState.PAUSED;\r\n case InternalTaskState.SUCCESS:\r\n return TaskState.SUCCESS;\r\n case InternalTaskState.CANCELED:\r\n return TaskState.CANCELED;\r\n case InternalTaskState.ERROR:\r\n return TaskState.ERROR;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n return TaskState.ERROR;\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Contains methods for working with objects.\r\n */\r\nfunction contains(obj, prop) {\r\n return Object.prototype.hasOwnProperty.call(obj, prop);\r\n}\r\nfunction forEach(obj, f) {\r\n for (var key in obj) {\r\n if (contains(obj, key)) {\r\n f(key, obj[key]);\r\n }\r\n }\r\n}\r\nfunction clone(obj) {\r\n if (obj == null) {\r\n return {};\r\n }\r\n var c = {};\r\n forEach(obj, function (key, val) {\r\n c[key] = val;\r\n });\r\n return c;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Implements the promise abstraction interface for external\r\n * (public SDK) packaging, which just passes through to the firebase-app impl.\r\n */\r\n/**\r\n * @template T\r\n * @param {function((function(T): void),\r\n * (function(!Error): void))} resolver\r\n */\r\nfunction make(resolver) {\r\n return new Promise(resolver);\r\n}\r\n/**\r\n * @template T\r\n */\r\nfunction resolve(value) {\r\n return Promise.resolve(value);\r\n}\r\nfunction reject(error) {\r\n return Promise.reject(error);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @return False if the object is undefined or null, true otherwise.\r\n */\r\nfunction isDef(p) {\r\n return p != null;\r\n}\r\nfunction isJustDef(p) {\r\n return p !== void 0;\r\n}\r\nfunction isFunction(p) {\r\n return typeof p === 'function';\r\n}\r\nfunction isObject(p) {\r\n return typeof p === 'object';\r\n}\r\nfunction isNonNullObject(p) {\r\n return isObject(p) && p !== null;\r\n}\r\nfunction isNonArrayObject(p) {\r\n return isObject(p) && !Array.isArray(p);\r\n}\r\nfunction isString(p) {\r\n return typeof p === 'string' || p instanceof String;\r\n}\r\nfunction isNumber(p) {\r\n return typeof p === 'number' || p instanceof Number;\r\n}\r\nfunction isNativeBlob(p) {\r\n return isNativeBlobDefined() && p instanceof Blob;\r\n}\r\nfunction isNativeBlobDefined() {\r\n return typeof Blob !== 'undefined';\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @enum{number}\r\n */\r\nvar ErrorCode;\r\n(function (ErrorCode) {\r\n ErrorCode[ErrorCode[\"NO_ERROR\"] = 0] = \"NO_ERROR\";\r\n ErrorCode[ErrorCode[\"NETWORK_ERROR\"] = 1] = \"NETWORK_ERROR\";\r\n ErrorCode[ErrorCode[\"ABORT\"] = 2] = \"ABORT\";\r\n})(ErrorCode || (ErrorCode = {}));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * We use this instead of goog.net.XhrIo because goog.net.XhrIo is hyuuuuge and\r\n * doesn't work in React Native on Android.\r\n */\r\nvar NetworkXhrIo = /** @class */ (function () {\r\n function NetworkXhrIo() {\r\n var _this = this;\r\n this.sent_ = false;\r\n this.xhr_ = new XMLHttpRequest();\r\n this.errorCode_ = ErrorCode.NO_ERROR;\r\n this.sendPromise_ = make(function (resolve$$1, reject$$1) {\r\n _this.xhr_.addEventListener('abort', function (event) {\r\n _this.errorCode_ = ErrorCode.ABORT;\r\n resolve$$1(_this);\r\n });\r\n _this.xhr_.addEventListener('error', function (event) {\r\n _this.errorCode_ = ErrorCode.NETWORK_ERROR;\r\n resolve$$1(_this);\r\n });\r\n _this.xhr_.addEventListener('load', function (event) {\r\n resolve$$1(_this);\r\n });\r\n });\r\n }\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.send = function (url, method, opt_body, opt_headers) {\r\n var _this = this;\r\n if (this.sent_) {\r\n throw internalError('cannot .send() more than once');\r\n }\r\n this.sent_ = true;\r\n this.xhr_.open(method, url, true);\r\n if (isDef(opt_headers)) {\r\n var headers = opt_headers;\r\n forEach(headers, function (key, val) {\r\n _this.xhr_.setRequestHeader(key, val.toString());\r\n });\r\n }\r\n if (isDef(opt_body)) {\r\n this.xhr_.send(opt_body);\r\n }\r\n else {\r\n this.xhr_.send();\r\n }\r\n return this.sendPromise_;\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getErrorCode = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getErrorCode() before sending');\r\n }\r\n return this.errorCode_;\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getStatus = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getStatus() before sending');\r\n }\r\n try {\r\n return this.xhr_.status;\r\n }\r\n catch (e) {\r\n return -1;\r\n }\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getResponseText = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getResponseText() before sending');\r\n }\r\n return this.xhr_.responseText;\r\n };\r\n /**\r\n * Aborts the request.\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.abort = function () {\r\n this.xhr_.abort();\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getResponseHeader = function (header) {\r\n return this.xhr_.getResponseHeader(header);\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.addUploadProgressListener = function (listener) {\r\n if (isDef(this.xhr_.upload)) {\r\n this.xhr_.upload.addEventListener('progress', listener);\r\n }\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.removeUploadProgressListener = function (listener) {\r\n if (isDef(this.xhr_.upload)) {\r\n this.xhr_.upload.removeEventListener('progress', listener);\r\n }\r\n };\r\n return NetworkXhrIo;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Factory-like class for creating XhrIo instances.\r\n */\r\nvar XhrIoPool = /** @class */ (function () {\r\n function XhrIoPool() {\r\n }\r\n XhrIoPool.prototype.createXhrIo = function () {\r\n return new NetworkXhrIo();\r\n };\r\n return XhrIoPool;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns the Object resulting from parsing the given JSON, or null if the\r\n * given string does not represent a JSON object.\r\n */\r\nfunction jsonObjectOrNull(s) {\r\n var obj;\r\n try {\r\n obj = JSON.parse(s);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n if (isNonArrayObject(obj)) {\r\n return obj;\r\n }\r\n else {\r\n return null;\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar Location = /** @class */ (function () {\r\n function Location(bucket, path) {\r\n this.bucket = bucket;\r\n this.path_ = path;\r\n }\r\n Object.defineProperty(Location.prototype, \"path\", {\r\n get: function () {\r\n return this.path_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Location.prototype.fullServerUrl = function () {\r\n var encode = encodeURIComponent;\r\n return '/b/' + encode(this.bucket) + '/o/' + encode(this.path);\r\n };\r\n Location.prototype.bucketOnlyServerUrl = function () {\r\n var encode = encodeURIComponent;\r\n return '/b/' + encode(this.bucket) + '/o';\r\n };\r\n Location.makeFromBucketSpec = function (bucketString) {\r\n var bucketLocation;\r\n try {\r\n bucketLocation = Location.makeFromUrl(bucketString);\r\n }\r\n catch (e) {\r\n // Not valid URL, use as-is. This lets you put bare bucket names in\r\n // config.\r\n return new Location(bucketString, '');\r\n }\r\n if (bucketLocation.path === '') {\r\n return bucketLocation;\r\n }\r\n else {\r\n throw invalidDefaultBucket(bucketString);\r\n }\r\n };\r\n Location.makeFromUrl = function (url) {\r\n var location = null;\r\n var bucketDomain = '([A-Za-z0-9.\\\\-]+)';\r\n function gsModify(loc) {\r\n if (loc.path.charAt(loc.path.length - 1) === '/') {\r\n loc.path_ = loc.path_.slice(0, -1);\r\n }\r\n }\r\n var gsPath = '(/(.*))?$';\r\n var path = '(/([^?#]*).*)?$';\r\n var gsRegex = new RegExp('^gs://' + bucketDomain + gsPath, 'i');\r\n var gsIndices = { bucket: 1, path: 3 };\r\n function httpModify(loc) {\r\n loc.path_ = decodeURIComponent(loc.path);\r\n }\r\n var version = 'v[A-Za-z0-9_]+';\r\n var httpRegex = new RegExp('^https?://firebasestorage\\\\.googleapis\\\\.com/' +\r\n version +\r\n '/b/' +\r\n bucketDomain +\r\n '/o' +\r\n path, 'i');\r\n var httpIndices = { bucket: 1, path: 3 };\r\n var groups = [\r\n { regex: gsRegex, indices: gsIndices, postModify: gsModify },\r\n { regex: httpRegex, indices: httpIndices, postModify: httpModify }\r\n ];\r\n for (var i = 0; i < groups.length; i++) {\r\n var group = groups[i];\r\n var captures = group.regex.exec(url);\r\n if (captures) {\r\n var bucketValue = captures[group.indices.bucket];\r\n var pathValue = captures[group.indices.path];\r\n if (!pathValue) {\r\n pathValue = '';\r\n }\r\n location = new Location(bucketValue, pathValue);\r\n group.postModify(location);\r\n break;\r\n }\r\n }\r\n if (location == null) {\r\n throw invalidUrl(url);\r\n }\r\n return location;\r\n };\r\n return Location;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Contains helper methods for manipulating paths.\r\n */\r\n/**\r\n * @return Null if the path is already at the root.\r\n */\r\nfunction parent(path) {\r\n if (path.length == 0) {\r\n return null;\r\n }\r\n var index = path.lastIndexOf('/');\r\n if (index === -1) {\r\n return '';\r\n }\r\n var newPath = path.slice(0, index);\r\n return newPath;\r\n}\r\nfunction child(path, childPath) {\r\n var canonicalChildPath = childPath\r\n .split('/')\r\n .filter(function (component) {\r\n return component.length > 0;\r\n })\r\n .join('/');\r\n if (path.length === 0) {\r\n return canonicalChildPath;\r\n }\r\n else {\r\n return path + '/' + canonicalChildPath;\r\n }\r\n}\r\n/**\r\n * Returns the last component of a path.\r\n * '/foo/bar' -> 'bar'\r\n * '/foo/bar/baz/' -> 'baz/'\r\n * '/a' -> 'a'\r\n */\r\nfunction lastComponent(path) {\r\n var index = path.lastIndexOf('/', path.length - 2);\r\n if (index === -1) {\r\n return path;\r\n }\r\n else {\r\n return path.slice(index + 1);\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction makeNormalUrl(urlPart) {\r\n return domainBase + apiBaseUrl + urlPart;\r\n}\r\nfunction makeDownloadUrl(urlPart) {\r\n return downloadBase + apiBaseUrl + urlPart;\r\n}\r\nfunction makeUploadUrl(urlPart) {\r\n return domainBase + apiUploadBaseUrl + urlPart;\r\n}\r\nfunction makeQueryString(params) {\r\n var encode = encodeURIComponent;\r\n var queryPart = '?';\r\n forEach(params, function (key, val) {\r\n var nextPart = encode(key) + '=' + encode(val);\r\n queryPart = queryPart + nextPart + '&';\r\n });\r\n // Chop off the extra '&' or '?' on the end\r\n queryPart = queryPart.slice(0, -1);\r\n return queryPart;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction noXform_(metadata, value) {\r\n return value;\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar Mapping = /** @class */ (function () {\r\n function Mapping(server, opt_local, opt_writable, opt_xform) {\r\n this.server = server;\r\n this.local = opt_local || server;\r\n this.writable = !!opt_writable;\r\n this.xform = opt_xform || noXform_;\r\n }\r\n return Mapping;\r\n}());\r\nvar mappings_ = null;\r\nfunction xformPath(fullPath) {\r\n var valid = isString(fullPath);\r\n if (!valid || fullPath.length < 2) {\r\n return fullPath;\r\n }\r\n else {\r\n fullPath = fullPath;\r\n return lastComponent(fullPath);\r\n }\r\n}\r\nfunction getMappings() {\r\n if (mappings_) {\r\n return mappings_;\r\n }\r\n var mappings = [];\r\n mappings.push(new Mapping('bucket'));\r\n mappings.push(new Mapping('generation'));\r\n mappings.push(new Mapping('metageneration'));\r\n mappings.push(new Mapping('name', 'fullPath', true));\r\n function mappingsXformPath(metadata, fullPath) {\r\n return xformPath(fullPath);\r\n }\r\n var nameMapping = new Mapping('name');\r\n nameMapping.xform = mappingsXformPath;\r\n mappings.push(nameMapping);\r\n /**\r\n * Coerces the second param to a number, if it is defined.\r\n */\r\n function xformSize(metadata, size) {\r\n if (isDef(size)) {\r\n return +size;\r\n }\r\n else {\r\n return size;\r\n }\r\n }\r\n var sizeMapping = new Mapping('size');\r\n sizeMapping.xform = xformSize;\r\n mappings.push(sizeMapping);\r\n mappings.push(new Mapping('timeCreated'));\r\n mappings.push(new Mapping('updated'));\r\n mappings.push(new Mapping('md5Hash', null, true));\r\n mappings.push(new Mapping('cacheControl', null, true));\r\n mappings.push(new Mapping('contentDisposition', null, true));\r\n mappings.push(new Mapping('contentEncoding', null, true));\r\n mappings.push(new Mapping('contentLanguage', null, true));\r\n mappings.push(new Mapping('contentType', null, true));\r\n mappings.push(new Mapping('metadata', 'customMetadata', true));\r\n /**\r\n * Transforms a comma-separated string of tokens into a list of download\r\n * URLs.\r\n */\r\n function xformTokens(metadata, tokens) {\r\n var valid = isString(tokens) && tokens.length > 0;\r\n if (!valid) {\r\n // This can happen if objects are uploaded through GCS and retrieved\r\n // through list, so we don't want to throw an Error.\r\n return [];\r\n }\r\n var encode = encodeURIComponent;\r\n var tokensList = tokens.split(',');\r\n var urls = tokensList.map(function (token) {\r\n var bucket = metadata['bucket'];\r\n var path = metadata['fullPath'];\r\n var urlPart = '/b/' + encode(bucket) + '/o/' + encode(path);\r\n var base = makeDownloadUrl(urlPart);\r\n var queryString = makeQueryString({\r\n alt: 'media',\r\n token: token\r\n });\r\n return base + queryString;\r\n });\r\n return urls;\r\n }\r\n mappings.push(new Mapping('downloadTokens', 'downloadURLs', false, xformTokens));\r\n mappings_ = mappings;\r\n return mappings_;\r\n}\r\nfunction addRef(metadata, authWrapper) {\r\n function generateRef() {\r\n var bucket = metadata['bucket'];\r\n var path = metadata['fullPath'];\r\n var loc = new Location(bucket, path);\r\n return authWrapper.makeStorageReference(loc);\r\n }\r\n Object.defineProperty(metadata, 'ref', { get: generateRef });\r\n}\r\nfunction fromResource(authWrapper, resource, mappings) {\r\n var metadata = {};\r\n metadata['type'] = 'file';\r\n var len = mappings.length;\r\n for (var i = 0; i < len; i++) {\r\n var mapping = mappings[i];\r\n metadata[mapping.local] = mapping.xform(metadata, resource[mapping.server]);\r\n }\r\n addRef(metadata, authWrapper);\r\n return metadata;\r\n}\r\nfunction fromResourceString(authWrapper, resourceString, mappings) {\r\n var obj = jsonObjectOrNull(resourceString);\r\n if (obj === null) {\r\n return null;\r\n }\r\n var resource = obj;\r\n return fromResource(authWrapper, resource, mappings);\r\n}\r\nfunction toResourceString(metadata, mappings) {\r\n var resource = {};\r\n var len = mappings.length;\r\n for (var i = 0; i < len; i++) {\r\n var mapping = mappings[i];\r\n if (mapping.writable) {\r\n resource[mapping.server] = metadata[mapping.local];\r\n }\r\n }\r\n return JSON.stringify(resource);\r\n}\r\nfunction metadataValidator(p) {\r\n var validType = p && isObject(p);\r\n if (!validType) {\r\n throw 'Expected Metadata object.';\r\n }\r\n for (var key in p) {\r\n var val = p[key];\r\n if (key === 'customMetadata') {\r\n if (!isObject(val)) {\r\n throw 'Expected object for \\'customMetadata\\' mapping.';\r\n }\r\n }\r\n else {\r\n if (isNonNullObject(val)) {\r\n throw \"Mapping for '\" + key + \"' cannot be an object.\";\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param name Name of the function.\r\n * @param specs Argument specs.\r\n * @param passed The actual arguments passed to the function.\r\n * @throws {fbs.Error} If the arguments are invalid.\r\n */\r\nfunction validate(name, specs, passed) {\r\n var minArgs = specs.length;\r\n var maxArgs = specs.length;\r\n for (var i = 0; i < specs.length; i++) {\r\n if (specs[i].optional) {\r\n minArgs = i;\r\n break;\r\n }\r\n }\r\n var validLength = minArgs <= passed.length && passed.length <= maxArgs;\r\n if (!validLength) {\r\n throw invalidArgumentCount(minArgs, maxArgs, name, passed.length);\r\n }\r\n for (var i = 0; i < passed.length; i++) {\r\n try {\r\n specs[i].validator(passed[i]);\r\n }\r\n catch (e) {\r\n if (e instanceof Error) {\r\n throw invalidArgument(i, name, e.message);\r\n }\r\n else {\r\n throw invalidArgument(i, name, e);\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar ArgSpec = /** @class */ (function () {\r\n function ArgSpec(validator, opt_optional) {\r\n var self = this;\r\n this.validator = function (p) {\r\n if (self.optional && !isJustDef(p)) {\r\n return;\r\n }\r\n validator(p);\r\n };\r\n this.optional = !!opt_optional;\r\n }\r\n return ArgSpec;\r\n}());\r\nfunction and_(v1, v2) {\r\n return function (p) {\r\n v1(p);\r\n v2(p);\r\n };\r\n}\r\nfunction stringSpec(opt_validator, opt_optional) {\r\n function stringValidator(p) {\r\n if (!isString(p)) {\r\n throw 'Expected string.';\r\n }\r\n }\r\n var validator;\r\n if (opt_validator) {\r\n validator = and_(stringValidator, opt_validator);\r\n }\r\n else {\r\n validator = stringValidator;\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\r\nfunction uploadDataSpec() {\r\n function validator(p) {\r\n var valid = p instanceof Uint8Array ||\r\n p instanceof ArrayBuffer ||\r\n (isNativeBlobDefined() && p instanceof Blob);\r\n if (!valid) {\r\n throw 'Expected Blob or File.';\r\n }\r\n }\r\n return new ArgSpec(validator);\r\n}\r\nfunction metadataSpec(opt_optional) {\r\n return new ArgSpec(metadataValidator, opt_optional);\r\n}\r\nfunction nonNegativeNumberSpec() {\r\n function validator(p) {\r\n var valid = isNumber(p) && p >= 0;\r\n if (!valid) {\r\n throw 'Expected a number 0 or greater.';\r\n }\r\n }\r\n return new ArgSpec(validator);\r\n}\r\nfunction looseObjectSpec(opt_validator, opt_optional) {\r\n function validator(p) {\r\n var isLooseObject = p === null || (isDef(p) && p instanceof Object);\r\n if (!isLooseObject) {\r\n throw 'Expected an Object.';\r\n }\r\n if (opt_validator !== undefined && opt_validator !== null) {\r\n opt_validator(p);\r\n }\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\r\nfunction nullFunctionSpec(opt_optional) {\r\n function validator(p) {\r\n var valid = p === null || isFunction(p);\r\n if (!valid) {\r\n throw 'Expected a Function.';\r\n }\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\n\nfunction getBlobBuilder() {\r\n if (typeof BlobBuilder !== 'undefined') {\r\n return BlobBuilder;\r\n }\r\n else if (typeof WebKitBlobBuilder !== 'undefined') {\r\n return WebKitBlobBuilder;\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\n/**\r\n * Concatenates one or more values together and converts them to a Blob.\r\n *\r\n * @param var_args The values that will make up the resulting blob.\r\n * @return The blob.\r\n */\r\nfunction getBlob() {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var BlobBuilder = getBlobBuilder();\r\n if (BlobBuilder !== undefined) {\r\n var bb = new BlobBuilder();\r\n for (var i = 0; i < var_args.length; i++) {\r\n bb.append(var_args[i]);\r\n }\r\n return bb.getBlob();\r\n }\r\n else {\r\n if (isNativeBlobDefined()) {\r\n return new Blob(var_args);\r\n }\r\n else {\r\n throw Error(\"This browser doesn't seem to support creating Blobs\");\r\n }\r\n }\r\n}\r\n/**\r\n * Slices the blob. The returned blob contains data from the start byte\r\n * (inclusive) till the end byte (exclusive). Negative indices cannot be used.\r\n *\r\n * @param blob The blob to be sliced.\r\n * @param start Index of the starting byte.\r\n * @param end Index of the ending byte.\r\n * @return The blob slice or null if not supported.\r\n */\r\nfunction sliceBlob(blob, start, end) {\r\n if (blob.webkitSlice) {\r\n return blob.webkitSlice(start, end);\r\n }\r\n else if (blob.mozSlice) {\r\n return blob.mozSlice(start, end);\r\n }\r\n else if (blob.slice) {\r\n return blob.slice(start, end);\r\n }\r\n return null;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param opt_elideCopy If true, doesn't copy mutable input data\r\n * (e.g. Uint8Arrays). Pass true only if you know the objects will not be\r\n * modified after this blob's construction.\r\n */\r\nvar FbsBlob = /** @class */ (function () {\r\n function FbsBlob(data, opt_elideCopy) {\r\n var size = 0;\r\n var blobType = '';\r\n if (isNativeBlob(data)) {\r\n this.data_ = data;\r\n size = data.size;\r\n blobType = data.type;\r\n }\r\n else if (data instanceof ArrayBuffer) {\r\n if (opt_elideCopy) {\r\n this.data_ = new Uint8Array(data);\r\n }\r\n else {\r\n this.data_ = new Uint8Array(data.byteLength);\r\n this.data_.set(new Uint8Array(data));\r\n }\r\n size = this.data_.length;\r\n }\r\n else if (data instanceof Uint8Array) {\r\n if (opt_elideCopy) {\r\n this.data_ = data;\r\n }\r\n else {\r\n this.data_ = new Uint8Array(data.length);\r\n this.data_.set(data);\r\n }\r\n size = data.length;\r\n }\r\n this.size_ = size;\r\n this.type_ = blobType;\r\n }\r\n FbsBlob.prototype.size = function () {\r\n return this.size_;\r\n };\r\n FbsBlob.prototype.type = function () {\r\n return this.type_;\r\n };\r\n FbsBlob.prototype.slice = function (startByte, endByte) {\r\n if (isNativeBlob(this.data_)) {\r\n var realBlob = this.data_;\r\n var sliced = sliceBlob(realBlob, startByte, endByte);\r\n if (sliced === null) {\r\n return null;\r\n }\r\n return new FbsBlob(sliced);\r\n }\r\n else {\r\n var slice = new Uint8Array(this.data_.buffer, startByte, endByte - startByte);\r\n return new FbsBlob(slice, true);\r\n }\r\n };\r\n FbsBlob.getBlob = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n if (isNativeBlobDefined()) {\r\n var blobby = var_args.map(function (val) {\r\n if (val instanceof FbsBlob) {\r\n return val.data_;\r\n }\r\n else {\r\n return val;\r\n }\r\n });\r\n return new FbsBlob(getBlob.apply(null, blobby));\r\n }\r\n else {\r\n var uint8Arrays = var_args.map(function (val) {\r\n if (isString(val)) {\r\n return dataFromString(StringFormat.RAW, val).data;\r\n }\r\n else {\r\n // Blobs don't exist, so this has to be a Uint8Array.\r\n return val.data_;\r\n }\r\n });\r\n var finalLength_1 = 0;\r\n uint8Arrays.forEach(function (array) {\r\n finalLength_1 += array.byteLength;\r\n });\r\n var merged_1 = new Uint8Array(finalLength_1);\r\n var index_1 = 0;\r\n uint8Arrays.forEach(function (array) {\r\n for (var i = 0; i < array.length; i++) {\r\n merged_1[index_1++] = array[i];\r\n }\r\n });\r\n return new FbsBlob(merged_1, true);\r\n }\r\n };\r\n FbsBlob.prototype.uploadData = function () {\r\n return this.data_;\r\n };\r\n return FbsBlob;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns true if the object is contained in the array (compared with ===).\r\n * @template T\r\n */\r\nfunction contains$1(array, elem) {\r\n return array.indexOf(elem) !== -1;\r\n}\r\n/**\r\n * Returns a shallow copy of the array or array-like object (e.g. arguments).\r\n * @template T\r\n */\r\nfunction clone$1(arraylike) {\r\n return Array.prototype.slice.call(arraylike);\r\n}\r\n/**\r\n * Removes the given element from the given array, if it is contained.\r\n * Directly modifies the passed-in array.\r\n * @template T\r\n */\r\nfunction remove(array, elem) {\r\n var i = array.indexOf(elem);\r\n if (i !== -1) {\r\n array.splice(i, 1);\r\n }\r\n}\n\nvar RequestInfo = /** @class */ (function () {\r\n function RequestInfo(url, method, \r\n /**\r\n * Returns the value with which to resolve the request's promise. Only called\r\n * if the request is successful. Throw from this function to reject the\r\n * returned Request's promise with the thrown error.\r\n * Note: The XhrIo passed to this function may be reused after this callback\r\n * returns. Do not keep a reference to it in any way.\r\n */\r\n handler, timeout) {\r\n this.url = url;\r\n this.method = method;\r\n this.handler = handler;\r\n this.timeout = timeout;\r\n this.urlParams = {};\r\n this.headers = {};\r\n this.body = null;\r\n this.errorHandler = null;\r\n /**\r\n * Called with the current number of bytes uploaded and total size (-1 if not\r\n * computable) of the request body (i.e. used to report upload progress).\r\n */\r\n this.progressCallback = null;\r\n this.successCodes = [200];\r\n this.additionalRetryCodes = [];\r\n }\r\n return RequestInfo;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws the UNKNOWN FirebaseStorageError if cndn is false.\r\n */\r\nfunction handlerCheck(cndn) {\r\n if (!cndn) {\r\n throw unknown();\r\n }\r\n}\r\nfunction metadataHandler(authWrapper, mappings) {\r\n function handler(xhr, text) {\r\n var metadata = fromResourceString(authWrapper, text, mappings);\r\n handlerCheck(metadata !== null);\r\n return metadata;\r\n }\r\n return handler;\r\n}\r\nfunction sharedErrorHandler(location) {\r\n function errorHandler(xhr, err) {\r\n var newErr;\r\n if (xhr.getStatus() === 401) {\r\n newErr = unauthenticated();\r\n }\r\n else {\r\n if (xhr.getStatus() === 402) {\r\n newErr = quotaExceeded(location.bucket);\r\n }\r\n else {\r\n if (xhr.getStatus() === 403) {\r\n newErr = unauthorized(location.path);\r\n }\r\n else {\r\n newErr = err;\r\n }\r\n }\r\n }\r\n newErr.setServerResponseProp(err.serverResponseProp());\r\n return newErr;\r\n }\r\n return errorHandler;\r\n}\r\nfunction objectErrorHandler(location) {\r\n var shared = sharedErrorHandler(location);\r\n function errorHandler(xhr, err) {\r\n var newErr = shared(xhr, err);\r\n if (xhr.getStatus() === 404) {\r\n newErr = objectNotFound(location.path);\r\n }\r\n newErr.setServerResponseProp(err.serverResponseProp());\r\n return newErr;\r\n }\r\n return errorHandler;\r\n}\r\nfunction getMetadata(authWrapper, location, mappings) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'GET';\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction updateMetadata(authWrapper, location, metadata, mappings) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'PATCH';\r\n var body = toResourceString(metadata, mappings);\r\n var headers = { 'Content-Type': 'application/json; charset=utf-8' };\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.body = body;\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction deleteObject(authWrapper, location) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'DELETE';\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n function handler(xhr, text) { }\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.successCodes = [200, 204];\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction determineContentType_(metadata, blob) {\r\n return ((metadata && metadata['contentType']) ||\r\n (blob && blob.type()) ||\r\n 'application/octet-stream');\r\n}\r\nfunction metadataForUpload_(location, blob, opt_metadata) {\r\n var metadata = clone(opt_metadata);\r\n metadata['fullPath'] = location.path;\r\n metadata['size'] = blob.size();\r\n if (!metadata['contentType']) {\r\n metadata['contentType'] = determineContentType_(null, blob);\r\n }\r\n return metadata;\r\n}\r\nfunction multipartUpload(authWrapper, location, mappings, blob, opt_metadata) {\r\n var urlPart = location.bucketOnlyServerUrl();\r\n var headers = {\r\n 'X-Goog-Upload-Protocol': 'multipart'\r\n };\r\n function genBoundary() {\r\n var str = '';\r\n for (var i = 0; i < 2; i++) {\r\n str =\r\n str +\r\n Math.random()\r\n .toString()\r\n .slice(2);\r\n }\r\n return str;\r\n }\r\n var boundary = genBoundary();\r\n headers['Content-Type'] = 'multipart/related; boundary=' + boundary;\r\n var metadata = metadataForUpload_(location, blob, opt_metadata);\r\n var metadataString = toResourceString(metadata, mappings);\r\n var preBlobPart = '--' +\r\n boundary +\r\n '\\r\\n' +\r\n 'Content-Type: application/json; charset=utf-8\\r\\n\\r\\n' +\r\n metadataString +\r\n '\\r\\n--' +\r\n boundary +\r\n '\\r\\n' +\r\n 'Content-Type: ' +\r\n metadata['contentType'] +\r\n '\\r\\n\\r\\n';\r\n var postBlobPart = '\\r\\n--' + boundary + '--';\r\n var body = FbsBlob.getBlob(preBlobPart, blob, postBlobPart);\r\n if (body === null) {\r\n throw cannotSliceBlob();\r\n }\r\n var urlParams = { name: metadata['fullPath'] };\r\n var url = makeUploadUrl(urlPart);\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.urlParams = urlParams;\r\n requestInfo.headers = headers;\r\n requestInfo.body = body.uploadData();\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * @param current The number of bytes that have been uploaded so far.\r\n * @param total The total number of bytes in the upload.\r\n * @param opt_finalized True if the server has finished the upload.\r\n * @param opt_metadata The upload metadata, should\r\n * only be passed if opt_finalized is true.\r\n * @struct\r\n */\r\nvar ResumableUploadStatus = /** @class */ (function () {\r\n function ResumableUploadStatus(current, total, finalized, metadata) {\r\n this.current = current;\r\n this.total = total;\r\n this.finalized = !!finalized;\r\n this.metadata = metadata || null;\r\n }\r\n return ResumableUploadStatus;\r\n}());\r\nfunction checkResumeHeader_(xhr, opt_allowed) {\r\n var status;\r\n try {\r\n status = xhr.getResponseHeader('X-Goog-Upload-Status');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n var allowed = opt_allowed || ['active'];\r\n handlerCheck(contains$1(allowed, status));\r\n return status;\r\n}\r\nfunction createResumableUpload(authWrapper, location, mappings, blob, opt_metadata) {\r\n var urlPart = location.bucketOnlyServerUrl();\r\n var metadata = metadataForUpload_(location, blob, opt_metadata);\r\n var urlParams = { name: metadata['fullPath'] };\r\n var url = makeUploadUrl(urlPart);\r\n var method = 'POST';\r\n var headers = {\r\n 'X-Goog-Upload-Protocol': 'resumable',\r\n 'X-Goog-Upload-Command': 'start',\r\n 'X-Goog-Upload-Header-Content-Length': blob.size(),\r\n 'X-Goog-Upload-Header-Content-Type': metadata['contentType'],\r\n 'Content-Type': 'application/json; charset=utf-8'\r\n };\r\n var body = toResourceString(metadata, mappings);\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n function handler(xhr, text) {\r\n checkResumeHeader_(xhr);\r\n var url;\r\n try {\r\n url = xhr.getResponseHeader('X-Goog-Upload-URL');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n handlerCheck(isString(url));\r\n return url;\r\n }\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.urlParams = urlParams;\r\n requestInfo.headers = headers;\r\n requestInfo.body = body;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * @param url From a call to fbs.requests.createResumableUpload.\r\n */\r\nfunction getResumableUploadStatus(authWrapper, location, url, blob) {\r\n var headers = { 'X-Goog-Upload-Command': 'query' };\r\n function handler(xhr, text) {\r\n var status = checkResumeHeader_(xhr, ['active', 'final']);\r\n var sizeString;\r\n try {\r\n sizeString = xhr.getResponseHeader('X-Goog-Upload-Size-Received');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n var size = parseInt(sizeString, 10);\r\n handlerCheck(!isNaN(size));\r\n return new ResumableUploadStatus(size, blob.size(), status === 'final');\r\n }\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * Any uploads via the resumable upload API must transfer a number of bytes\r\n * that is a multiple of this number.\r\n */\r\nvar resumableUploadChunkSize = 256 * 1024;\r\n/**\r\n * @param url From a call to fbs.requests.createResumableUpload.\r\n * @param chunkSize Number of bytes to upload.\r\n * @param opt_status The previous status.\r\n * If not passed or null, we start from the beginning.\r\n * @throws fbs.Error If the upload is already complete, the passed in status\r\n * has a final size inconsistent with the blob, or the blob cannot be sliced\r\n * for upload.\r\n */\r\nfunction continueResumableUpload(location, authWrapper, url, blob, chunkSize, mappings, opt_status, opt_progressCallback) {\r\n // TODO(andysoto): standardize on internal asserts\r\n // assert(!(opt_status && opt_status.finalized));\r\n var status = new ResumableUploadStatus(0, 0);\r\n if (opt_status) {\r\n status.current = opt_status.current;\r\n status.total = opt_status.total;\r\n }\r\n else {\r\n status.current = 0;\r\n status.total = blob.size();\r\n }\r\n if (blob.size() !== status.total) {\r\n throw serverFileWrongSize();\r\n }\r\n var bytesLeft = status.total - status.current;\r\n var bytesToUpload = bytesLeft;\r\n if (chunkSize > 0) {\r\n bytesToUpload = Math.min(bytesToUpload, chunkSize);\r\n }\r\n var startByte = status.current;\r\n var endByte = startByte + bytesToUpload;\r\n var uploadCommand = bytesToUpload === bytesLeft ? 'upload, finalize' : 'upload';\r\n var headers = {\r\n 'X-Goog-Upload-Command': uploadCommand,\r\n 'X-Goog-Upload-Offset': status.current\r\n };\r\n var body = blob.slice(startByte, endByte);\r\n if (body === null) {\r\n throw cannotSliceBlob();\r\n }\r\n function handler(xhr, text) {\r\n // TODO(andysoto): Verify the MD5 of each uploaded range:\r\n // the 'x-range-md5' header comes back with status code 308 responses.\r\n // We'll only be able to bail out though, because you can't re-upload a\r\n // range that you previously uploaded.\r\n var uploadStatus = checkResumeHeader_(xhr, ['active', 'final']);\r\n var newCurrent = status.current + bytesToUpload;\r\n var size = blob.size();\r\n var metadata;\r\n if (uploadStatus === 'final') {\r\n metadata = metadataHandler(authWrapper, mappings)(xhr, text);\r\n }\r\n else {\r\n metadata = null;\r\n }\r\n return new ResumableUploadStatus(newCurrent, size, uploadStatus === 'final', metadata);\r\n }\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.body = body.uploadData();\r\n requestInfo.progressCallback = opt_progressCallback || null;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar Observer = /** @class */ (function () {\r\n function Observer(nextOrObserver, opt_error, opt_complete) {\r\n var asFunctions = isFunction(nextOrObserver) ||\r\n isDef(opt_error) ||\r\n isDef(opt_complete);\r\n if (asFunctions) {\r\n this.next = nextOrObserver;\r\n this.error = opt_error || null;\r\n this.complete = opt_complete || null;\r\n }\r\n else {\r\n var observer = nextOrObserver;\r\n this.next = observer.next || null;\r\n this.error = observer.error || null;\r\n this.complete = observer.complete || null;\r\n }\r\n }\r\n return Observer;\r\n}());\n\nvar UploadTaskSnapshot = /** @class */ (function () {\r\n function UploadTaskSnapshot(bytesTransferred, totalBytes, state, metadata, task, ref) {\r\n this.bytesTransferred = bytesTransferred;\r\n this.totalBytes = totalBytes;\r\n this.state = state;\r\n this.metadata = metadata;\r\n this.task = task;\r\n this.ref = ref;\r\n }\r\n Object.defineProperty(UploadTaskSnapshot.prototype, \"downloadURL\", {\r\n get: function () {\r\n if (this.metadata !== null) {\r\n var urls = this.metadata['downloadURLs'];\r\n if (urls != null && urls[0] != null) {\r\n return urls[0];\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return UploadTaskSnapshot;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a function that invokes f with its arguments asynchronously as a\r\n * microtask, i.e. as soon as possible after the current script returns back\r\n * into browser code.\r\n */\r\nfunction async(f) {\r\n return function () {\r\n var argsToForward = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n argsToForward[_i] = arguments[_i];\r\n }\r\n resolve(true).then(function () {\r\n f.apply(null, argsToForward);\r\n });\r\n };\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Represents a blob being uploaded. Can be used to pause/resume/cancel the\r\n * upload and manage callbacks for various events.\r\n */\r\nvar UploadTask = /** @class */ (function () {\r\n /**\r\n * @param ref The firebaseStorage.Reference object this task came\r\n * from, untyped to avoid cyclic dependencies.\r\n * @param blob The blob to upload.\r\n */\r\n function UploadTask(ref, authWrapper, location, mappings, blob, metadata) {\r\n if (metadata === void 0) { metadata = null; }\r\n var _this = this;\r\n this.transferred_ = 0;\r\n this.needToFetchStatus_ = false;\r\n this.needToFetchMetadata_ = false;\r\n this.observers_ = [];\r\n this.error_ = null;\r\n this.uploadUrl_ = null;\r\n this.request_ = null;\r\n this.chunkMultiplier_ = 1;\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n this.ref_ = ref;\r\n this.authWrapper_ = authWrapper;\r\n this.location_ = location;\r\n this.blob_ = blob;\r\n this.metadata_ = metadata;\r\n this.mappings_ = mappings;\r\n this.resumable_ = this.shouldDoResumable_(this.blob_);\r\n this.state_ = InternalTaskState.RUNNING;\r\n this.errorHandler_ = function (error) {\r\n _this.request_ = null;\r\n _this.chunkMultiplier_ = 1;\r\n if (error.codeEquals(Code.CANCELED)) {\r\n _this.needToFetchStatus_ = true;\r\n _this.completeTransitions_();\r\n }\r\n else {\r\n _this.error_ = error;\r\n _this.transition_(InternalTaskState.ERROR);\r\n }\r\n };\r\n this.metadataErrorHandler_ = function (error) {\r\n _this.request_ = null;\r\n if (error.codeEquals(Code.CANCELED)) {\r\n _this.completeTransitions_();\r\n }\r\n else {\r\n _this.error_ = error;\r\n _this.transition_(InternalTaskState.ERROR);\r\n }\r\n };\r\n this.promise_ = make(function (resolve$$1, reject$$1) {\r\n _this.resolve_ = resolve$$1;\r\n _this.reject_ = reject$$1;\r\n _this.start_();\r\n });\r\n // Prevent uncaught rejections on the internal promise from bubbling out\r\n // to the top level with a dummy handler.\r\n this.promise_.then(null, function () { });\r\n }\r\n UploadTask.prototype.makeProgressCallback_ = function () {\r\n var _this = this;\r\n var sizeBefore = this.transferred_;\r\n return function (loaded, total) {\r\n _this.updateProgress_(sizeBefore + loaded);\r\n };\r\n };\r\n UploadTask.prototype.shouldDoResumable_ = function (blob) {\r\n return blob.size() > 256 * 1024;\r\n };\r\n UploadTask.prototype.start_ = function () {\r\n if (this.state_ !== InternalTaskState.RUNNING) {\r\n // This can happen if someone pauses us in a resume callback, for example.\r\n return;\r\n }\r\n if (this.request_ !== null) {\r\n return;\r\n }\r\n if (this.resumable_) {\r\n if (this.uploadUrl_ === null) {\r\n this.createResumable_();\r\n }\r\n else {\r\n if (this.needToFetchStatus_) {\r\n this.fetchStatus_();\r\n }\r\n else {\r\n if (this.needToFetchMetadata_) {\r\n // Happens if we miss the metadata on upload completion.\r\n this.fetchMetadata_();\r\n }\r\n else {\r\n this.continueUpload_();\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n this.oneShotUpload_();\r\n }\r\n };\r\n UploadTask.prototype.resolveToken_ = function (callback) {\r\n var _this = this;\r\n this.authWrapper_.getAuthToken().then(function (authToken) {\r\n switch (_this.state_) {\r\n case InternalTaskState.RUNNING:\r\n callback(authToken);\r\n break;\r\n case InternalTaskState.CANCELING:\r\n _this.transition_(InternalTaskState.CANCELED);\r\n break;\r\n case InternalTaskState.PAUSING:\r\n _this.transition_(InternalTaskState.PAUSED);\r\n break;\r\n default:\r\n }\r\n });\r\n };\r\n // TODO(andysoto): assert false\r\n UploadTask.prototype.createResumable_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = createResumableUpload(_this.authWrapper_, _this.location_, _this.mappings_, _this.blob_, _this.metadata_);\r\n var createRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = createRequest;\r\n createRequest.getPromise().then(function (url) {\r\n _this.request_ = null;\r\n _this.uploadUrl_ = url;\r\n _this.needToFetchStatus_ = false;\r\n _this.completeTransitions_();\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.fetchStatus_ = function () {\r\n var _this = this;\r\n // TODO(andysoto): assert(this.uploadUrl_ !== null);\r\n var url = this.uploadUrl_;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = getResumableUploadStatus(_this.authWrapper_, _this.location_, url, _this.blob_);\r\n var statusRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = statusRequest;\r\n statusRequest.getPromise().then(function (status) {\r\n status = status;\r\n _this.request_ = null;\r\n _this.updateProgress_(status.current);\r\n _this.needToFetchStatus_ = false;\r\n if (status.finalized) {\r\n _this.needToFetchMetadata_ = true;\r\n }\r\n _this.completeTransitions_();\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.continueUpload_ = function () {\r\n var _this = this;\r\n var chunkSize = resumableUploadChunkSize * this.chunkMultiplier_;\r\n var status = new ResumableUploadStatus(this.transferred_, this.blob_.size());\r\n // TODO(andysoto): assert(this.uploadUrl_ !== null);\r\n var url = this.uploadUrl_;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo;\r\n try {\r\n requestInfo = continueResumableUpload(_this.location_, _this.authWrapper_, url, _this.blob_, chunkSize, _this.mappings_, status, _this.makeProgressCallback_());\r\n }\r\n catch (e) {\r\n _this.error_ = e;\r\n _this.transition_(InternalTaskState.ERROR);\r\n return;\r\n }\r\n var uploadRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = uploadRequest;\r\n uploadRequest\r\n .getPromise()\r\n .then(function (newStatus) {\r\n _this.increaseMultiplier_();\r\n _this.request_ = null;\r\n _this.updateProgress_(newStatus.current);\r\n if (newStatus.finalized) {\r\n _this.metadata_ = newStatus.metadata;\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }\r\n else {\r\n _this.completeTransitions_();\r\n }\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.increaseMultiplier_ = function () {\r\n var currentSize = resumableUploadChunkSize * this.chunkMultiplier_;\r\n // Max chunk size is 32M.\r\n if (currentSize < 32 * 1024 * 1024) {\r\n this.chunkMultiplier_ *= 2;\r\n }\r\n };\r\n UploadTask.prototype.fetchMetadata_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = getMetadata(_this.authWrapper_, _this.location_, _this.mappings_);\r\n var metadataRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = metadataRequest;\r\n metadataRequest.getPromise().then(function (metadata) {\r\n _this.request_ = null;\r\n _this.metadata_ = metadata;\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }, _this.metadataErrorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.oneShotUpload_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = multipartUpload(_this.authWrapper_, _this.location_, _this.mappings_, _this.blob_, _this.metadata_);\r\n var multipartRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = multipartRequest;\r\n multipartRequest.getPromise().then(function (metadata) {\r\n _this.request_ = null;\r\n _this.metadata_ = metadata;\r\n _this.updateProgress_(_this.blob_.size());\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.updateProgress_ = function (transferred) {\r\n var old = this.transferred_;\r\n this.transferred_ = transferred;\r\n // A progress update can make the \"transferred\" value smaller (e.g. a\r\n // partial upload not completed by server, after which the \"transferred\"\r\n // value may reset to the value at the beginning of the request).\r\n if (this.transferred_ !== old) {\r\n this.notifyObservers_();\r\n }\r\n };\r\n UploadTask.prototype.transition_ = function (state) {\r\n if (this.state_ === state) {\r\n return;\r\n }\r\n switch (state) {\r\n case InternalTaskState.CANCELING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING);\r\n this.state_ = state;\r\n if (this.request_ !== null) {\r\n this.request_.cancel();\r\n }\r\n break;\r\n case InternalTaskState.PAUSING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING);\r\n this.state_ = state;\r\n if (this.request_ !== null) {\r\n this.request_.cancel();\r\n }\r\n break;\r\n case InternalTaskState.RUNNING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSED ||\r\n // this.state_ === InternalTaskState.PAUSING);\r\n var wasPaused = this.state_ === InternalTaskState.PAUSED;\r\n this.state_ = state;\r\n if (wasPaused) {\r\n this.notifyObservers_();\r\n this.start_();\r\n }\r\n break;\r\n case InternalTaskState.PAUSED:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.CANCELED:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSED ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.error_ = canceled();\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.ERROR:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.SUCCESS:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n }\r\n };\r\n UploadTask.prototype.completeTransitions_ = function () {\r\n switch (this.state_) {\r\n case InternalTaskState.PAUSING:\r\n this.transition_(InternalTaskState.PAUSED);\r\n break;\r\n case InternalTaskState.CANCELING:\r\n this.transition_(InternalTaskState.CANCELED);\r\n break;\r\n case InternalTaskState.RUNNING:\r\n this.start_();\r\n break;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n break;\r\n }\r\n };\r\n Object.defineProperty(UploadTask.prototype, \"snapshot\", {\r\n get: function () {\r\n var externalState = taskStateFromInternalTaskState(this.state_);\r\n return new UploadTaskSnapshot(this.transferred_, this.blob_.size(), externalState, this.metadata_, this, this.ref_);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Adds a callback for an event.\r\n * @param type The type of event to listen for.\r\n */\r\n UploadTask.prototype.on = function (type, nextOrObserver, error, completed) {\r\n if (nextOrObserver === void 0) { nextOrObserver = undefined; }\r\n if (error === void 0) { error = undefined; }\r\n if (completed === void 0) { completed = undefined; }\r\n function typeValidator(_p) {\r\n if (type !== TaskEvent.STATE_CHANGED) {\r\n throw \"Expected one of the event types: [\" + TaskEvent.STATE_CHANGED + \"].\";\r\n }\r\n }\r\n var nextOrObserverMessage = 'Expected a function or an Object with one of ' +\r\n '`next`, `error`, `complete` properties.';\r\n var nextValidator = nullFunctionSpec(true).validator;\r\n var observerValidator = looseObjectSpec(null, true).validator;\r\n function nextOrObserverValidator(p) {\r\n try {\r\n nextValidator(p);\r\n return;\r\n }\r\n catch (e) { }\r\n try {\r\n observerValidator(p);\r\n var anyDefined = isJustDef(p['next']) ||\r\n isJustDef(p['error']) ||\r\n isJustDef(p['complete']);\r\n if (!anyDefined) {\r\n throw '';\r\n }\r\n return;\r\n }\r\n catch (e) {\r\n throw nextOrObserverMessage;\r\n }\r\n }\r\n var specs = [\r\n stringSpec(typeValidator),\r\n looseObjectSpec(nextOrObserverValidator, true),\r\n nullFunctionSpec(true),\r\n nullFunctionSpec(true)\r\n ];\r\n validate('on', specs, arguments);\r\n var self = this;\r\n function makeBinder(specs) {\r\n function binder(nextOrObserver, error, opt_complete) {\r\n if (specs !== null) {\r\n validate('on', specs, arguments);\r\n }\r\n var observer = new Observer(nextOrObserver, error, completed);\r\n self.addObserver_(observer);\r\n return function () {\r\n self.removeObserver_(observer);\r\n };\r\n }\r\n return binder;\r\n }\r\n function binderNextOrObserverValidator(p) {\r\n if (p === null) {\r\n throw nextOrObserverMessage;\r\n }\r\n nextOrObserverValidator(p);\r\n }\r\n var binderSpecs = [\r\n looseObjectSpec(binderNextOrObserverValidator),\r\n nullFunctionSpec(true),\r\n nullFunctionSpec(true)\r\n ];\r\n var typeOnly = !(isJustDef(nextOrObserver) ||\r\n isJustDef(error) ||\r\n isJustDef(completed));\r\n if (typeOnly) {\r\n return makeBinder(binderSpecs);\r\n }\r\n else {\r\n return makeBinder(null)(nextOrObserver, error, completed);\r\n }\r\n };\r\n /**\r\n * This object behaves like a Promise, and resolves with its snapshot data\r\n * when the upload completes.\r\n * @param onFulfilled The fulfillment callback. Promise chaining works as normal.\r\n * @param onRejected The rejection callback.\r\n */\r\n UploadTask.prototype.then = function (onFulfilled, onRejected) {\r\n // These casts are needed so that TypeScript can infer the types of the\r\n // resulting Promise.\r\n return this.promise_.then(onFulfilled, onRejected);\r\n };\r\n /**\r\n * Equivalent to calling `then(null, onRejected)`.\r\n */\r\n UploadTask.prototype.catch = function (onRejected) {\r\n return this.then(null, onRejected);\r\n };\r\n /**\r\n * Adds the given observer.\r\n */\r\n UploadTask.prototype.addObserver_ = function (observer) {\r\n this.observers_.push(observer);\r\n this.notifyObserver_(observer);\r\n };\r\n /**\r\n * Removes the given observer.\r\n */\r\n UploadTask.prototype.removeObserver_ = function (observer) {\r\n remove(this.observers_, observer);\r\n };\r\n UploadTask.prototype.notifyObservers_ = function () {\r\n var _this = this;\r\n this.finishPromise_();\r\n var observers = clone$1(this.observers_);\r\n observers.forEach(function (observer) {\r\n _this.notifyObserver_(observer);\r\n });\r\n };\r\n UploadTask.prototype.finishPromise_ = function () {\r\n if (this.resolve_ !== null) {\r\n var triggered = true;\r\n switch (taskStateFromInternalTaskState(this.state_)) {\r\n case TaskState.SUCCESS:\r\n async(this.resolve_.bind(null, this.snapshot))();\r\n break;\r\n case TaskState.CANCELED:\r\n case TaskState.ERROR:\r\n var toCall = this.reject_;\r\n async(toCall.bind(null, this.error_))();\r\n break;\r\n default:\r\n triggered = false;\r\n break;\r\n }\r\n if (triggered) {\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n }\r\n }\r\n };\r\n UploadTask.prototype.notifyObserver_ = function (observer) {\r\n var externalState = taskStateFromInternalTaskState(this.state_);\r\n switch (externalState) {\r\n case TaskState.RUNNING:\r\n case TaskState.PAUSED:\r\n if (observer.next !== null) {\r\n async(observer.next.bind(observer, this.snapshot))();\r\n }\r\n break;\r\n case TaskState.SUCCESS:\r\n if (observer.complete !== null) {\r\n async(observer.complete.bind(observer))();\r\n }\r\n break;\r\n case TaskState.CANCELED:\r\n case TaskState.ERROR:\r\n if (observer.error !== null) {\r\n async(observer.error.bind(observer, this.error_))();\r\n }\r\n break;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n if (observer.error !== null) {\r\n async(observer.error.bind(observer, this.error_))();\r\n }\r\n }\r\n };\r\n /**\r\n * Resumes a paused task. Has no effect on a currently running or failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.resume = function () {\r\n validate('resume', [], arguments);\r\n var valid = this.state_ === InternalTaskState.PAUSED ||\r\n this.state_ === InternalTaskState.PAUSING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.RUNNING);\r\n }\r\n return valid;\r\n };\r\n /**\r\n * Pauses a currently running task. Has no effect on a paused or failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.pause = function () {\r\n validate('pause', [], arguments);\r\n var valid = this.state_ === InternalTaskState.RUNNING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.PAUSING);\r\n }\r\n return valid;\r\n };\r\n /**\r\n * Cancels a currently running or paused task. Has no effect on a complete or\r\n * failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.cancel = function () {\r\n validate('cancel', [], arguments);\r\n var valid = this.state_ === InternalTaskState.RUNNING ||\r\n this.state_ === InternalTaskState.PAUSING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.CANCELING);\r\n }\r\n return valid;\r\n };\r\n return UploadTask;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provides methods to interact with a bucket in the Firebase Storage service.\r\n * @param location An fbs.location, or the URL at\r\n * which to base this object, in one of the following forms:\r\n * gs:///\r\n * http[s]://firebasestorage.googleapis.com/\r\n * /b//o/\r\n * Any query or fragment strings will be ignored in the http[s]\r\n * format. If no value is passed, the storage object will use a URL based on\r\n * the project ID of the base firebase.App instance.\r\n */\r\nvar Reference = /** @class */ (function () {\r\n function Reference(authWrapper, location) {\r\n this.authWrapper = authWrapper;\r\n if (location instanceof Location) {\r\n this.location = location;\r\n }\r\n else {\r\n this.location = Location.makeFromUrl(location);\r\n }\r\n }\r\n /**\r\n * @return The URL for the bucket and path this object references,\r\n * in the form gs:///\r\n * @override\r\n */\r\n Reference.prototype.toString = function () {\r\n validate('toString', [], arguments);\r\n return 'gs://' + this.location.bucket + '/' + this.location.path;\r\n };\r\n Reference.prototype.newRef = function (authWrapper, location) {\r\n return new Reference(authWrapper, location);\r\n };\r\n Reference.prototype.mappings = function () {\r\n return getMappings();\r\n };\r\n /**\r\n * @return A reference to the object obtained by\r\n * appending childPath, removing any duplicate, beginning, or trailing\r\n * slashes.\r\n */\r\n Reference.prototype.child = function (childPath) {\r\n validate('child', [stringSpec()], arguments);\r\n var newPath = child(this.location.path, childPath);\r\n var location = new Location(this.location.bucket, newPath);\r\n return this.newRef(this.authWrapper, location);\r\n };\r\n Object.defineProperty(Reference.prototype, \"parent\", {\r\n /**\r\n * @return A reference to the parent of the\r\n * current object, or null if the current object is the root.\r\n */\r\n get: function () {\r\n var newPath = parent(this.location.path);\r\n if (newPath === null) {\r\n return null;\r\n }\r\n var location = new Location(this.location.bucket, newPath);\r\n return this.newRef(this.authWrapper, location);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"root\", {\r\n /**\r\n * @return An reference to the root of this\r\n * object's bucket.\r\n */\r\n get: function () {\r\n var location = new Location(this.location.bucket, '');\r\n return this.newRef(this.authWrapper, location);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"bucket\", {\r\n get: function () {\r\n return this.location.bucket;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"fullPath\", {\r\n get: function () {\r\n return this.location.path;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"name\", {\r\n get: function () {\r\n return lastComponent(this.location.path);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"storage\", {\r\n get: function () {\r\n return this.authWrapper.service();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Uploads a blob to this object's location.\r\n * @param data The blob to upload.\r\n * @return An UploadTask that lets you control and\r\n * observe the upload.\r\n */\r\n Reference.prototype.put = function (data, metadata) {\r\n if (metadata === void 0) { metadata = null; }\r\n validate('put', [uploadDataSpec(), metadataSpec(true)], arguments);\r\n this.throwIfRoot_('put');\r\n return new UploadTask(this, this.authWrapper, this.location, this.mappings(), new FbsBlob(data), metadata);\r\n };\r\n /**\r\n * Uploads a string to this object's location.\r\n * @param string The string to upload.\r\n * @param opt_format The format of the string to upload.\r\n * @return An UploadTask that lets you control and\r\n * observe the upload.\r\n */\r\n Reference.prototype.putString = function (string, format, opt_metadata) {\r\n if (format === void 0) { format = StringFormat.RAW; }\r\n validate('putString', [\r\n stringSpec(),\r\n stringSpec(formatValidator, true),\r\n metadataSpec(true)\r\n ], arguments);\r\n this.throwIfRoot_('putString');\r\n var data = dataFromString(format, string);\r\n var metadata = clone(opt_metadata);\r\n if (!isDef(metadata['contentType']) && isDef(data.contentType)) {\r\n metadata['contentType'] = data.contentType;\r\n }\r\n return new UploadTask(this, this.authWrapper, this.location, this.mappings(), new FbsBlob(data.data, true), metadata);\r\n };\r\n /**\r\n * Deletes the object at this location.\r\n * @return A promise that resolves if the deletion succeeds.\r\n */\r\n Reference.prototype.delete = function () {\r\n validate('delete', [], arguments);\r\n this.throwIfRoot_('delete');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = deleteObject(self.authWrapper, self.location);\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * A promise that resolves with the metadata for this object. If this\r\n * object doesn't exist or metadata cannot be retreived, the promise is\r\n * rejected.\r\n */\r\n Reference.prototype.getMetadata = function () {\r\n validate('getMetadata', [], arguments);\r\n this.throwIfRoot_('getMetadata');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = getMetadata(self.authWrapper, self.location, self.mappings());\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * Updates the metadata for this object.\r\n * @param metadata The new metadata for the object.\r\n * Only values that have been explicitly set will be changed. Explicitly\r\n * setting a value to null will remove the metadata.\r\n * @return A promise that resolves\r\n * with the new metadata for this object.\r\n * @see firebaseStorage.Reference.prototype.getMetadata\r\n */\r\n Reference.prototype.updateMetadata = function (metadata) {\r\n validate('updateMetadata', [metadataSpec()], arguments);\r\n this.throwIfRoot_('updateMetadata');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = updateMetadata(self.authWrapper, self.location, metadata, self.mappings());\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * @return A promise that resolves with the download\r\n * URL for this object.\r\n */\r\n Reference.prototype.getDownloadURL = function () {\r\n validate('getDownloadURL', [], arguments);\r\n this.throwIfRoot_('getDownloadURL');\r\n return this.getMetadata().then(function (metadata) {\r\n var url = metadata['downloadURLs'][0];\r\n if (isDef(url)) {\r\n return url;\r\n }\r\n else {\r\n throw noDownloadURL();\r\n }\r\n });\r\n };\r\n Reference.prototype.throwIfRoot_ = function (name) {\r\n if (this.location.path === '') {\r\n throw invalidRootOperation(name);\r\n }\r\n };\r\n return Reference;\r\n}());\n\n/**\r\n * A request whose promise always fails.\r\n * @struct\r\n * @template T\r\n */\r\nvar FailRequest = /** @class */ (function () {\r\n function FailRequest(error) {\r\n this.promise_ = reject(error);\r\n }\r\n /** @inheritDoc */\r\n FailRequest.prototype.getPromise = function () {\r\n return this.promise_;\r\n };\r\n /** @inheritDoc */\r\n FailRequest.prototype.cancel = function (appDelete) {\r\n if (appDelete === void 0) { appDelete = false; }\r\n };\r\n return FailRequest;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar RequestMap = /** @class */ (function () {\r\n function RequestMap() {\r\n this.map_ = {};\r\n this.id_ = minSafeInteger;\r\n }\r\n /**\r\n * Registers the given request with this map.\r\n * The request is unregistered when it completes.\r\n * @param r The request to register.\r\n */\r\n RequestMap.prototype.addRequest = function (r) {\r\n var id = this.id_;\r\n this.id_++;\r\n this.map_[id] = r;\r\n var self = this;\r\n function unmap() {\r\n delete self.map_[id];\r\n }\r\n r.getPromise().then(unmap, unmap);\r\n };\r\n /**\r\n * Cancels all registered requests.\r\n */\r\n RequestMap.prototype.clear = function () {\r\n forEach(this.map_, function (key, val) {\r\n if (val) {\r\n val.cancel(true);\r\n }\r\n });\r\n this.map_ = {};\r\n };\r\n return RequestMap;\r\n}());\n\n/**\r\n * @param app If null, getAuthToken always resolves with null.\r\n * @param service The storage service associated with this auth wrapper.\r\n * Untyped to avoid circular type dependencies.\r\n * @struct\r\n */\r\nvar AuthWrapper = /** @class */ (function () {\r\n function AuthWrapper(app, maker, requestMaker, service, pool) {\r\n this.bucket_ = null;\r\n this.deleted_ = false;\r\n this.app_ = app;\r\n if (this.app_ !== null) {\r\n var options = this.app_.options;\r\n if (isDef(options)) {\r\n this.bucket_ = AuthWrapper.extractBucket_(options);\r\n }\r\n }\r\n this.storageRefMaker_ = maker;\r\n this.requestMaker_ = requestMaker;\r\n this.pool_ = pool;\r\n this.service_ = service;\r\n this.maxOperationRetryTime_ = defaultMaxOperationRetryTime;\r\n this.maxUploadRetryTime_ = defaultMaxUploadRetryTime;\r\n this.requestMap_ = new RequestMap();\r\n }\r\n AuthWrapper.extractBucket_ = function (config) {\r\n var bucketString = config[configOption] || null;\r\n if (bucketString == null) {\r\n return null;\r\n }\r\n var loc = Location.makeFromBucketSpec(bucketString);\r\n return loc.bucket;\r\n };\r\n AuthWrapper.prototype.getAuthToken = function () {\r\n // TODO(andysoto): remove ifDef checks after firebase-app implements stubs\r\n // (b/28673818).\r\n if (this.app_ !== null &&\r\n isDef(this.app_.INTERNAL) &&\r\n isDef(this.app_.INTERNAL.getToken)) {\r\n return this.app_.INTERNAL.getToken().then(function (response) {\r\n if (response !== null) {\r\n return response.accessToken;\r\n }\r\n else {\r\n return null;\r\n }\r\n }, function (_error) {\r\n return null;\r\n });\r\n }\r\n else {\r\n return resolve(null);\r\n }\r\n };\r\n AuthWrapper.prototype.bucket = function () {\r\n if (this.deleted_) {\r\n throw appDeleted();\r\n }\r\n else {\r\n return this.bucket_;\r\n }\r\n };\r\n /**\r\n * The service associated with this auth wrapper. Untyped to avoid circular\r\n * type dependencies.\r\n */\r\n AuthWrapper.prototype.service = function () {\r\n return this.service_;\r\n };\r\n /**\r\n * Returns a new firebaseStorage.Reference object referencing this AuthWrapper\r\n * at the given Location.\r\n * @param loc The Location.\r\n * @return Actually a firebaseStorage.Reference, typing not allowed\r\n * because of circular dependency problems.\r\n */\r\n AuthWrapper.prototype.makeStorageReference = function (loc) {\r\n return this.storageRefMaker_(this, loc);\r\n };\r\n AuthWrapper.prototype.makeRequest = function (requestInfo, authToken) {\r\n if (!this.deleted_) {\r\n var request = this.requestMaker_(requestInfo, authToken, this.pool_);\r\n this.requestMap_.addRequest(request);\r\n return request;\r\n }\r\n else {\r\n return new FailRequest(appDeleted());\r\n }\r\n };\r\n /**\r\n * Stop running requests and prevent more from being created.\r\n */\r\n AuthWrapper.prototype.deleteApp = function () {\r\n this.deleted_ = true;\r\n this.app_ = null;\r\n this.requestMap_.clear();\r\n };\r\n AuthWrapper.prototype.maxUploadRetryTime = function () {\r\n return this.maxUploadRetryTime_;\r\n };\r\n AuthWrapper.prototype.setMaxUploadRetryTime = function (time) {\r\n this.maxUploadRetryTime_ = time;\r\n };\r\n AuthWrapper.prototype.maxOperationRetryTime = function () {\r\n return this.maxOperationRetryTime_;\r\n };\r\n AuthWrapper.prototype.setMaxOperationRetryTime = function (time) {\r\n this.maxOperationRetryTime_ = time;\r\n };\r\n return AuthWrapper;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param f May be invoked\r\n * before the function returns.\r\n * @param callback Get all the arguments passed to the function\r\n * passed to f, including the initial boolean.\r\n */\r\nfunction start(f, callback, timeout) {\r\n // TODO(andysoto): make this code cleaner (probably refactor into an actual\r\n // type instead of a bunch of functions with state shared in the closure)\r\n var waitSeconds = 1;\r\n // Would type this as \"number\" but that doesn't work for Node so ¯\\_(ツ)_/¯\r\n var timeoutId = null;\r\n var hitTimeout = false;\r\n var cancelState = 0;\r\n function canceled() {\r\n return cancelState === 2;\r\n }\r\n var triggeredCallback = false;\r\n function triggerCallback() {\r\n if (!triggeredCallback) {\r\n triggeredCallback = true;\r\n callback.apply(null, arguments);\r\n }\r\n }\r\n function callWithDelay(millis) {\r\n timeoutId = setTimeout(function () {\r\n timeoutId = null;\r\n f(handler, canceled());\r\n }, millis);\r\n }\r\n function handler(success) {\r\n var var_args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n var_args[_i - 1] = arguments[_i];\r\n }\r\n if (triggeredCallback) {\r\n return;\r\n }\r\n if (success) {\r\n triggerCallback.apply(null, arguments);\r\n return;\r\n }\r\n var mustStop = canceled() || hitTimeout;\r\n if (mustStop) {\r\n triggerCallback.apply(null, arguments);\r\n return;\r\n }\r\n if (waitSeconds < 64) {\r\n /* TODO(andysoto): don't back off so quickly if we know we're offline. */\r\n waitSeconds *= 2;\r\n }\r\n var waitMillis;\r\n if (cancelState === 1) {\r\n cancelState = 2;\r\n waitMillis = 0;\r\n }\r\n else {\r\n waitMillis = (waitSeconds + Math.random()) * 1000;\r\n }\r\n callWithDelay(waitMillis);\r\n }\r\n var stopped = false;\r\n function stop(wasTimeout) {\r\n if (stopped) {\r\n return;\r\n }\r\n stopped = true;\r\n if (triggeredCallback) {\r\n return;\r\n }\r\n if (timeoutId !== null) {\r\n if (!wasTimeout) {\r\n cancelState = 2;\r\n }\r\n clearTimeout(timeoutId);\r\n callWithDelay(0);\r\n }\r\n else {\r\n if (!wasTimeout) {\r\n cancelState = 1;\r\n }\r\n }\r\n }\r\n callWithDelay(0);\r\n setTimeout(function () {\r\n hitTimeout = true;\r\n stop(true);\r\n }, timeout);\r\n return stop;\r\n}\r\n/**\r\n * Stops the retry loop from repeating.\r\n * If the function is currently \"in between\" retries, it is invoked immediately\r\n * with the second parameter as \"true\". Otherwise, it will be invoked once more\r\n * after the current invocation finishes iff the current invocation would have\r\n * triggered another retry.\r\n */\r\nfunction stop(id) {\r\n id(false);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n * @template T\r\n */\r\nvar NetworkRequest = /** @class */ (function () {\r\n function NetworkRequest(url, method, headers, body, successCodes, additionalRetryCodes, callback, errorCallback, timeout, progressCallback, pool) {\r\n this.pendingXhr_ = null;\r\n this.backoffId_ = null;\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n this.canceled_ = false;\r\n this.appDelete_ = false;\r\n this.url_ = url;\r\n this.method_ = method;\r\n this.headers_ = headers;\r\n this.body_ = body;\r\n this.successCodes_ = successCodes.slice();\r\n this.additionalRetryCodes_ = additionalRetryCodes.slice();\r\n this.callback_ = callback;\r\n this.errorCallback_ = errorCallback;\r\n this.progressCallback_ = progressCallback;\r\n this.timeout_ = timeout;\r\n this.pool_ = pool;\r\n var self = this;\r\n this.promise_ = make(function (resolve$$1, reject$$1) {\r\n self.resolve_ = resolve$$1;\r\n self.reject_ = reject$$1;\r\n self.start_();\r\n });\r\n }\r\n /**\r\n * Actually starts the retry loop.\r\n */\r\n NetworkRequest.prototype.start_ = function () {\r\n var self = this;\r\n function doTheRequest(backoffCallback, canceled$$1) {\r\n if (canceled$$1) {\r\n backoffCallback(false, new RequestEndStatus(false, null, true));\r\n return;\r\n }\r\n var xhr = self.pool_.createXhrIo();\r\n self.pendingXhr_ = xhr;\r\n function progressListener(progressEvent) {\r\n var loaded = progressEvent.loaded;\r\n var total = progressEvent.lengthComputable ? progressEvent.total : -1;\r\n if (self.progressCallback_ !== null) {\r\n self.progressCallback_(loaded, total);\r\n }\r\n }\r\n if (self.progressCallback_ !== null) {\r\n xhr.addUploadProgressListener(progressListener);\r\n }\r\n xhr\r\n .send(self.url_, self.method_, self.body_, self.headers_)\r\n .then(function (xhr) {\r\n if (self.progressCallback_ !== null) {\r\n xhr.removeUploadProgressListener(progressListener);\r\n }\r\n self.pendingXhr_ = null;\r\n xhr = xhr;\r\n var hitServer = xhr.getErrorCode() === ErrorCode.NO_ERROR;\r\n var status = xhr.getStatus();\r\n if (!hitServer || self.isRetryStatusCode_(status)) {\r\n var wasCanceled = xhr.getErrorCode() === ErrorCode.ABORT;\r\n backoffCallback(false, new RequestEndStatus(false, null, wasCanceled));\r\n return;\r\n }\r\n var successCode = contains$1(self.successCodes_, status);\r\n backoffCallback(true, new RequestEndStatus(successCode, xhr));\r\n });\r\n }\r\n /**\r\n * @param requestWentThrough True if the request eventually went\r\n * through, false if it hit the retry limit or was canceled.\r\n */\r\n function backoffDone(requestWentThrough, status) {\r\n var resolve$$1 = self.resolve_;\r\n var reject$$1 = self.reject_;\r\n var xhr = status.xhr;\r\n if (status.wasSuccessCode) {\r\n try {\r\n var result = self.callback_(xhr, xhr.getResponseText());\r\n if (isJustDef(result)) {\r\n resolve$$1(result);\r\n }\r\n else {\r\n resolve$$1();\r\n }\r\n }\r\n catch (e) {\r\n reject$$1(e);\r\n }\r\n }\r\n else {\r\n if (xhr !== null) {\r\n var err = unknown();\r\n err.setServerResponseProp(xhr.getResponseText());\r\n if (self.errorCallback_) {\r\n reject$$1(self.errorCallback_(xhr, err));\r\n }\r\n else {\r\n reject$$1(err);\r\n }\r\n }\r\n else {\r\n if (status.canceled) {\r\n var err = self.appDelete_\r\n ? appDeleted()\r\n : canceled();\r\n reject$$1(err);\r\n }\r\n else {\r\n var err = retryLimitExceeded();\r\n reject$$1(err);\r\n }\r\n }\r\n }\r\n }\r\n if (this.canceled_) {\r\n backoffDone(false, new RequestEndStatus(false, null, true));\r\n }\r\n else {\r\n this.backoffId_ = start(doTheRequest, backoffDone, this.timeout_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n NetworkRequest.prototype.getPromise = function () {\r\n return this.promise_;\r\n };\r\n /** @inheritDoc */\r\n NetworkRequest.prototype.cancel = function (appDelete) {\r\n this.canceled_ = true;\r\n this.appDelete_ = appDelete || false;\r\n if (this.backoffId_ !== null) {\r\n stop(this.backoffId_);\r\n }\r\n if (this.pendingXhr_ !== null) {\r\n this.pendingXhr_.abort();\r\n }\r\n };\r\n NetworkRequest.prototype.isRetryStatusCode_ = function (status) {\r\n // The codes for which to retry came from this page:\r\n // https://cloud.google.com/storage/docs/exponential-backoff\r\n var isFiveHundredCode = status >= 500 && status < 600;\r\n var extraRetryCodes = [\r\n // Request Timeout: web server didn't receive full request in time.\r\n 408,\r\n // Too Many Requests: you're getting rate-limited, basically.\r\n 429\r\n ];\r\n var isExtraRetryCode = contains$1(extraRetryCodes, status);\r\n var isRequestSpecificRetryCode = contains$1(this.additionalRetryCodes_, status);\r\n return isFiveHundredCode || isExtraRetryCode || isRequestSpecificRetryCode;\r\n };\r\n return NetworkRequest;\r\n}());\r\n/**\r\n * A collection of information about the result of a network request.\r\n * @param opt_canceled Defaults to false.\r\n * @struct\r\n */\r\nvar RequestEndStatus = /** @class */ (function () {\r\n function RequestEndStatus(wasSuccessCode, xhr, opt_canceled) {\r\n this.wasSuccessCode = wasSuccessCode;\r\n this.xhr = xhr;\r\n this.canceled = !!opt_canceled;\r\n }\r\n return RequestEndStatus;\r\n}());\r\nfunction addAuthHeader_(headers, authToken) {\r\n if (authToken !== null && authToken.length > 0) {\r\n headers['Authorization'] = 'Firebase ' + authToken;\r\n }\r\n}\r\nfunction addVersionHeader_(headers) {\r\n var number = typeof firebase !== 'undefined' ? firebase.SDK_VERSION : 'AppManager';\r\n headers['X-Firebase-Storage-Version'] = 'webjs/' + number;\r\n}\r\n/**\r\n * @template T\r\n */\r\nfunction makeRequest(requestInfo, authToken, pool) {\r\n var queryPart = makeQueryString(requestInfo.urlParams);\r\n var url = requestInfo.url + queryPart;\r\n var headers = clone(requestInfo.headers);\r\n addAuthHeader_(headers, authToken);\r\n addVersionHeader_(headers);\r\n return new NetworkRequest(url, requestInfo.method, headers, requestInfo.body, requestInfo.successCodes, requestInfo.additionalRetryCodes, requestInfo.handler, requestInfo.errorHandler, requestInfo.timeout, requestInfo.progressCallback, pool);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A service that provides firebaseStorage.Reference instances.\r\n * @param opt_url gs:// url to a custom Storage Bucket\r\n *\r\n * @struct\r\n */\r\nvar Service = /** @class */ (function () {\r\n function Service(app, pool, url) {\r\n this.bucket_ = null;\r\n function maker(authWrapper, loc) {\r\n return new Reference(authWrapper, loc);\r\n }\r\n this.authWrapper_ = new AuthWrapper(app, maker, makeRequest, this, pool);\r\n this.app_ = app;\r\n if (url != null) {\r\n this.bucket_ = Location.makeFromBucketSpec(url);\r\n }\r\n else {\r\n var authWrapperBucket = this.authWrapper_.bucket();\r\n if (authWrapperBucket != null) {\r\n this.bucket_ = new Location(authWrapperBucket, '');\r\n }\r\n }\r\n this.internals_ = new ServiceInternals(this);\r\n }\r\n /**\r\n * Returns a firebaseStorage.Reference for the given path in the default\r\n * bucket.\r\n */\r\n Service.prototype.ref = function (path) {\r\n function validator(path) {\r\n if (/^[A-Za-z]+:\\/\\//.test(path)) {\r\n throw 'Expected child path but got a URL, use refFromURL instead.';\r\n }\r\n }\r\n validate('ref', [stringSpec(validator, true)], arguments);\r\n if (this.bucket_ == null) {\r\n throw new Error('No Storage Bucket defined in Firebase Options.');\r\n }\r\n var ref = new Reference(this.authWrapper_, this.bucket_);\r\n if (path != null) {\r\n return ref.child(path);\r\n }\r\n else {\r\n return ref;\r\n }\r\n };\r\n /**\r\n * Returns a firebaseStorage.Reference object for the given absolute URL,\r\n * which must be a gs:// or http[s]:// URL.\r\n */\r\n Service.prototype.refFromURL = function (url) {\r\n function validator(p) {\r\n if (!/^[A-Za-z]+:\\/\\//.test(p)) {\r\n throw 'Expected full URL but got a child path, use ref instead.';\r\n }\r\n try {\r\n Location.makeFromUrl(p);\r\n }\r\n catch (e) {\r\n throw 'Expected valid full URL but got an invalid one.';\r\n }\r\n }\r\n validate('refFromURL', [stringSpec(validator, false)], arguments);\r\n return new Reference(this.authWrapper_, url);\r\n };\r\n Object.defineProperty(Service.prototype, \"maxUploadRetryTime\", {\r\n get: function () {\r\n return this.authWrapper_.maxUploadRetryTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Service.prototype.setMaxUploadRetryTime = function (time) {\r\n validate('setMaxUploadRetryTime', [nonNegativeNumberSpec()], arguments);\r\n this.authWrapper_.setMaxUploadRetryTime(time);\r\n };\r\n Object.defineProperty(Service.prototype, \"maxOperationRetryTime\", {\r\n get: function () {\r\n return this.authWrapper_.maxOperationRetryTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Service.prototype.setMaxOperationRetryTime = function (time) {\r\n validate('setMaxOperationRetryTime', [nonNegativeNumberSpec()], arguments);\r\n this.authWrapper_.setMaxOperationRetryTime(time);\r\n };\r\n Object.defineProperty(Service.prototype, \"app\", {\r\n get: function () {\r\n return this.app_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Service.prototype, \"INTERNAL\", {\r\n get: function () {\r\n return this.internals_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Service;\r\n}());\r\n/**\r\n * @struct\r\n */\r\nvar ServiceInternals = /** @class */ (function () {\r\n function ServiceInternals(service) {\r\n this.service_ = service;\r\n }\r\n /**\r\n * Called when the associated app is deleted.\r\n * @see {!fbs.AuthWrapper.prototype.deleteApp}\r\n */\r\n ServiceInternals.prototype.delete = function () {\r\n this.service_.authWrapper_.deleteApp();\r\n return resolve(undefined);\r\n };\r\n return ServiceInternals;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Type constant for Firebase Storage.\r\n */\r\nvar STORAGE_TYPE = 'storage';\r\nfunction factory(app, unused, opt_url) {\r\n return new Service(app, new XhrIoPool(), opt_url);\r\n}\r\nfunction registerStorage(instance) {\r\n var namespaceExports = {\r\n // no-inline\r\n TaskState: TaskState,\r\n TaskEvent: TaskEvent,\r\n StringFormat: StringFormat,\r\n Storage: Service,\r\n Reference: Reference\r\n };\r\n instance.INTERNAL.registerService(STORAGE_TYPE, factory, namespaceExports, undefined, \r\n // Allow multiple storage instances per app.\r\n true);\r\n}\r\nregisterStorage(firebase);\n\nexport { registerStorage };\n","/**\n * Copyright 2017 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar firebase = require('./app');\nrequire('./auth');\nrequire('./database');\nrequire('./messaging');\nrequire('./storage');\n\nmodule.exports = firebase;\n"],"names":["self","fetch","support","searchParams","iterable","Symbol","blob","Blob","e","formData","arrayBuffer","viewClasses","isDataView","obj","DataView","prototype","isPrototypeOf","isArrayBufferView","ArrayBuffer","isView","indexOf","Object","toString","call","Headers","append","name","value","normalizeName","normalizeValue","oldValue","this","map","get","has","hasOwnProperty","set","forEach","callback","thisArg","keys","items","push","iteratorFor","values","entries","iterator","methods","Request","clone","body","_bodyInit","Body","Response","status","statusText","headers","url","error","response","type","redirectStatuses","redirect","RangeError","location","input","init","Promise","resolve","reject","request","xhr","XMLHttpRequest","onload","rawHeaders","options","getAllResponseHeaders","replace","split","line","parts","key","shift","trim","join","responseURL","responseText","onerror","TypeError","ontimeout","open","method","credentials","withCredentials","responseType","setRequestHeader","send","polyfill","String","test","toLowerCase","next","done","undefined","Array","isArray","header","getOwnPropertyNames","consumed","bodyUsed","fileReaderReady","reader","result","readBlobAsArrayBuffer","FileReader","promise","readAsArrayBuffer","bufferClone","buf","slice","view","Uint8Array","byteLength","buffer","_initBody","_bodyText","_bodyBlob","FormData","_bodyFormData","URLSearchParams","_bodyArrayBuffer","Error","rejected","then","text","readAsText","chars","length","i","fromCharCode","readArrayBufferAsText","decode","json","JSON","parse","upcased","mode","toUpperCase","referrer","form","bytes","decodeURIComponent","bodyInit","ok","setTimeoutFunc","setTimeout","noop","fn","_state","_handled","_value","_deferreds","doResolve","handle","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","newValue","finale","apply","arguments","_unhandledRejectionFn","len","reason","ex","prom","constructor","all","arr","args","remaining","res","val","race","setImmediate","err","console","warn","globalNS","window","global","createCommonjsModule","module","exports","_global","Math","Function","__g","_core","core","version","__e","_isObject","it","_anObject","_fails","exec","_descriptors","defineProperty","a","document","is","createElement","_ie8DomDefine","dP","_objectDp","f","O","P","Attributes","S","valueOf","_toPrimitive","_hide","object","bitmap","enumerable","configurable","writable","_propertyDesc","_has","id","px","random","_uid","concat","_redefine","SRC","$toString","TPL","inspectSource","safe","isFunction","_ctx","that","_aFunction","b","c","$export","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","U","W","R","_export","_cof","_iobject","propertyIsEnumerable","_defined","ceil","floor","min","_toLength","isNaN","_toInteger","_isArray","arg","store","_shared","_wks","USE_SYMBOL","SPECIES","_arraySpeciesCreate","original","C","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","$this","callbackfn","index","UNSCOPABLES","ArrayProto","_addToUnscopables","$find","forced","find","$find$1","forced$1","findIndex","MATCH","_stringContext","searchString","NAME","isRegExp","MATCH$1","$startsWith","KEY","re","_failsIsRegexp","startsWith","search","extendStatics","setPrototypeOf","__proto__","d","p","__extends","__","__assign","assign","t","s","n","__awaiter","_arguments","generator","fulfilled","step","__generator","y","g","_","label","sent","trys","ops","verb","throw","return","v","op","pop","CONSTANTS","assert","assertion","message","assertionError","stringToByteArray","str","charCodeAt","base64","byteToCharMap_","charToByteMap_","byteToCharMapWebSafe_","charToByteMapWebSafe_","ENCODED_VALS_BASE","ENCODED_VALS","ENCODED_VALS_WEBSAFE","HAS_NATIVE_SUPPORT","atob","encodeByteArray","opt_webSafe","init_","byteToCharMap","output","byte1","haveByte2","byte2","haveByte3","byte3","outByte1","outByte2","outByte3","outByte4","encodeString","btoa","decodeString","pos","c1","c2","u","c3","byteArrayToString","decodeStringToByteArray","charToByteMap","charAt","byte4","base64Decode","deepCopy","deepExtend","Date","getTime","prop","patchProperty","Deferred","_this","wrapCallback","catch","isMobileCordova","navigator","isNodeSdk","ERROR_NAME","captureStackTrace","FirebaseError","code","ErrorFactory","err_1","stack","service","serviceName","errors","pattern","data","template","fullCode","match","jsonEval","stringify","token","claims","signature","contains","safeGet","objTo","isEmpty","getCount","rv","opt_obj","findKey","opt_this","getAnyKey","Sha1","_super","chain_","buf_","W_","pad_","inbuf_","total_","blockSize","reset","compress_","opt_offset","k","update","opt_length","lengthMinusBlock","inbuf","digest","totalBits","j","createSubscribe","executor","onNoObservers","proxy","ObserverProxy","subscribe","bind","observers","unsubscribes","observerCount","task","finalized","forEachObserver","observer","close","complete","nextOrObserver","_i","methods_1","implementsAnyMethods","unsub","unsubscribeOne","finalError","sendOne","validateArgCount","fnName","minCount","maxCount","argCount","argError","errorPrefix","argumentNumber","optional","argName","validateCallback","validateContextObject","context","stringLength","DEFAULT_ENTRY_NAME","tokenListeners","FirebaseAppImpl","config","firebase_","isDeleted_","services_","name_","_automaticDataCollectionEnabled","automaticDataCollectionEnabled","options_","INTERNAL","getUid","getToken","addAuthTokenListener","removeAuthTokenListener","filter","listener","checkDestroyed_","delete","removeApp","services","serviceKey","instanceKey","_getService","instanceIdentifier","instanceSpecifier","factories","extendApp","props","appErrors","log","LogLevel","no-app","bad-app-name","duplicate-app","app-deleted","duplicate-service","sa-not-supported","invalid-app-argument","firebase","createFirebaseNamespace","apps_","appHooks","namespace","__esModule","initializeApp","rawConfig","name_1","app","callAppHooks","apps","SDK_VERSION","registerService","createService","serviceProperties","appHook","allowMultipleInstances","getApps","serviceNamespace","appArg","extendNamespace","useAsService","eventName","factoryName","useService","require$$1","default","require$$0","aa","l","ba","ca","da","splice","ea","fa","ha","q","ia","ja","ka","la","unshift","r","ma","na","now","lb","ad","oa","$goog_Thenable","pa","qa","ra","sa","ta","ua","wa","va","xa","ya","add","za","Ba","Ca","some","Fa","Ga","w","Aa","Ha","Ia","Ja","Ka","La","Ma","Na","Oa","Pa","Qa","Ra","Sa","Ua","x","Ta","Va","Wa","userAgent","Xa","Ya","Za","fb","$a","ab","bb","eb","ib","Window","MessageChannel","postMessage","addEventListener","style","display","src","documentElement","appendChild","contentWindow","write","protocol","host","origin","port1","onmessage","port2","rb","onreadystatechange","parentNode","removeChild","db","gb","hb","z","jb","h","kb","mb","nb","ob","pb","qb","A","sb","wb","Ab","vb","E","Kc","Lc","Eb","Bb","m","Cb","Ub","yb","zb","Db","cancel","xb","Fb","Gb","Hb","Ib","Jb","Sb","Mb","Nb","Ob","Pb","Qb","Rb","documentMode","Tb","Vb","parseFloat","Xb","Lb","Wb","Kb","max","parseInt","Yb","compatMode","Zb","freeze","$b","Number","ac","bc","removeEventListener","D","cc","relatedTarget","button","screenY","screenX","clientY","clientX","metaKey","shiftKey","altKey","ctrlKey","pointerId","pointerType","changedTouches","srcElement","nodeName","fromElement","toElement","pageX","pageY","dc","defaultPrevented","preventDefault","2","3","4","returnValue","keyCode","ec","fc","hc","jc","lc","kc","capture","mc","nc","pc","once","qc","rc","sc","tc","uc","xc","vc","attachEvent","wc","addListener","removeListener","yc","zc","detachEvent","Ac","Bc","Cc","handleEvent","Dc","Ec","Fc","clearTimeout","Gc","Hc","Mc","dispatchEvent","clear","Nc","Pc","Qc","Rc","Sc","Tc","Uc","fd","jd","hd","$c","Vc","H","bd","cd","dd","decodeURI","encodeURI","ed","Wc","encodeURIComponent","Xc","Yc","Zc","substring","Oc","gd","kd","ld","md","nd","od","pd","qd","rd","sd","td","ud","wd","vd","xd","yd","zd","Ad","Bd","Cd","Dd","Ed","Gd","Hd","getElementById","Id","cssText","className","htmlFor","Jd","setAttribute","lastIndexOf","cellpadding","cellspacing","colspan","frameborder","height","maxlength","nonce","role","rowspan","usemap","valign","width","Kd","createTextNode","nodeType","Md","Ld","item","Nd","Od","Boolean","Qd","isFinite","Rd","\"","\\","/","\b","\f","\n","\r","\t","\u000b","Sd","substr","Td","I","Ud","href","Vd","$d","ae","be","screen","availHeight","availWidth","top","left","resizable","statusbar","toolbar","Yd","ce","scrollbars","standalone","noreferrer","createEvent","initMouseEvent","opener","Fd","noopener","focus","ee","fe","readyState","he","ie","je","ke","importScripts","le","me","Zd","ne","oe","sort","J","pe","localStorage","qe","setItem","removeItem","indexedDB","se","te","ue","ve","we","xe","ye","___jsl","L","CP","ze","Ae","visibilityState","Ce","toUTCString","De","onLine","connection","Fe","Ee","Ge","abcd","K","He","Ke","Pe","Me","Ne","Oe","Re","Qe","Te","Se","M","Ue","Ve","We","toJSON","argument-error","app-not-authorized","app-not-installed","captcha-check-failed","code-expired","cordova-not-ready","cors-unsupported","credential-already-in-use","custom-token-mismatch","requires-recent-login","dynamic-link-not-activated","email-already-in-use","expired-action-code","cancelled-popup-request","internal-error","invalid-app-credential","invalid-app-id","invalid-user-token","invalid-auth-event","invalid-verification-code","invalid-continue-uri","invalid-cordova-configuration","invalid-custom-token","invalid-email","invalid-api-key","invalid-cert-hash","invalid-credential","invalid-persistence-type","invalid-message-payload","invalid-oauth-provider","invalid-oauth-client-id","unauthorized-domain","invalid-action-code","wrong-password","invalid-phone-number","invalid-recipient-email","invalid-sender","invalid-verification-id","missing-android-pkg-name","auth-domain-config-required","missing-app-credential","missing-verification-code","missing-continue-uri","missing-iframe-start","missing-ios-bundle-id","missing-phone-number","missing-verification-id","account-exists-with-different-credential","network-request-failed","no-auth-event","no-such-provider","operation-not-allowed","operation-not-supported-in-this-environment","popup-blocked","popup-closed-by-user","provider-already-linked","quota-exceeded","redirect-cancelled-by-user","redirect-operation-pending","timeout","user-token-expired","too-many-requests","unauthorized-continue-uri","unsupported-persistence-type","user-cancelled","user-not-found","user-disabled","user-mismatch","user-signed-out","weak-password","web-storage-unsupported","Xe","Ye","Ze","$e","af","bf","cf","df","ef","ff","continueUrl","canHandleCodeInApp","androidPackageName","androidMinimumVersion","androidInstallApp","iOSBundleId","hf","jf","kf","mf","lf","nf","sub","provider_id","sign_in_provider","is_anonymous","of","pf","iss","aud","qf","rf","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Cf","isNewUser","kind","rawUserInfo","providerId","profile","login","screenName","Ef","Ff","Gf","Hf","idToken","accessToken","oauthToken","oauthTokenSecret","Jf","id_token","access_token","secret","oauth_token_secret","postBody","requestUri","Mf","isOAuthProvider","tb","N","Nf","Of","credential","Pf","Qf","Rf","Sf","Tf","Uf","Vf","EMAIL_LINK_SIGN_IN_METHOD","EMAIL_PASSWORD_SIGN_IN_METHOD","$f","ag","bg","Ea","Z","cg","temporaryProof","phoneNumber","sessionInfo","fg","auth","hg","ig","oauthAccessToken","oauthIdToken","jg","kg","lg","eventId","urlResponse","sessionId","mg","If","Kf","Lf","signInMethod","Wf","email","oobCode","Xf","password","Yf","Zf","PROVIDER_ID","dg","operation","eg","verificationId","verificationCode","verify","ai","gg","recaptchaToken","PHONE_SIGN_IN_METHOD","ng","og","pg","ub","qg","unsubscribe","ug","rg","sg","tg","vg","wg","ActiveXObject","xg","yg","XDomainRequest","onprogress","zg","Ag","Cg","Dg","abort","getResponseHeader","contentType","Eg","Fg","Gg","Hg","Ig","Jg","Kg","Lg","Q","Mg","Ng","Og","Pg","Qg","o","Rg","cache","Sg","Tg","Ug","Vg","Wg","Ic","Da","Xg","Yg","Zg","$g","ah","bh","ch","eh","hh","ih","gh","jh","lh","mh","nh","oh","fh","getResponse","mozResponseArrayBuffer","ph","qh","rh","sh","th","uh","attributes","charset","getElementsByTagName","vh","tagName","wh","xh","secureTokenEndpoint","secureTokenTimeout","yh","secureTokenHeaders","zh","firebaseEndpoint","firebaseTimeout","Ah","firebaseHeaders","Bh","node","Ch","Content-Type","Dh","Eh","Fh","Xd","gapi","client","Ih","Hh","kh","Gh","dh","Mh","Nh","Th","Uh","setApiKey","setToken","path","authType","Vh","Wh","Xh","displayName","photoUrl","ei","fi","needConfirmation","errorMessage","gi","returnIdpCredential","hi","ii","autoCreate","ji","ki","deleteAttribute","requestType","Yh","Zh","$h","bi","li","newPassword","mi","ni","endpoint","oi","Ph","pi","T","di","deleteProvider","qi","Sh","ri","recaptchaSiteKey","si","USER_NOT_FOUND","Je","returnSecureToken","Kh","Lh","keyInvalid","ipRefererBlocked","INVALID_CUSTOM_TOKEN","CREDENTIAL_MISMATCH","MISSING_CUSTOM_TOKEN","INVALID_IDENTIFIER","MISSING_CONTINUE_URI","INVALID_EMAIL","INVALID_PASSWORD","USER_DISABLED","MISSING_PASSWORD","EMAIL_EXISTS","PASSWORD_LOGIN_DISABLED","INVALID_IDP_RESPONSE","FEDERATED_USER_ID_ALREADY_LINKED","INVALID_MESSAGE_PAYLOAD","INVALID_RECIPIENT_EMAIL","INVALID_SENDER","EMAIL_NOT_FOUND","EXPIRED_OOB_CODE","INVALID_OOB_CODE","MISSING_OOB_CODE","CREDENTIAL_TOO_OLD_LOGIN_AGAIN","INVALID_ID_TOKEN","TOKEN_EXPIRED","CORS_UNSUPPORTED","DYNAMIC_LINK_NOT_ACTIVATED","INVALID_APP_ID","TOO_MANY_ATTEMPTS_TRY_LATER","WEAK_PASSWORD","OPERATION_NOT_ALLOWED","USER_CANCELLED","CAPTCHA_CHECK_FAILED","INVALID_APP_CREDENTIAL","INVALID_CODE","INVALID_PHONE_NUMBER","INVALID_SESSION_INFO","INVALID_TEMPORARY_PROOF","MISSING_APP_CREDENTIAL","MISSING_CODE","MISSING_PHONE_NUMBER","MISSING_SESSION_INFO","QUOTA_EXCEEDED","SESSION_EXPIRED","INVALID_CONTINUE_URI","MISSING_ANDROID_PACKAGE_NAME","MISSING_IOS_BUNDLE_ID","UNAUTHORIZED_DOMAIN","INVALID_OAUTH_CLIENT_ID","INVALID_CERT_HASH","vi","ti","ui","wi","Ei","Di","Ci","where","messageHandlersFilter","position","dontclear","restyle","setHideOnLeave","zi","ping","xi","Si","Fi","Gi","Hi","Ii","Ji","authorizedDomains","Rh","RegExp","Ki","register","Bi","authEvent","Li","Ni","Oi","Pi","reactNative","AsyncStorage","Qi","Ri","Ui","onupgradeneeded","createObjectStore","keyPath","onsuccess","objectStoreNames","deleteDatabase","Ti","Vi","Wi","objectStore","Xi","transaction","Yi","errorCode","$i","Y","aj","bj","dj","cj","ej","fj","hj","sessionStorage","gj","Ai","webStorageSupport","Mi","closed","de","getItem","put","fbase_key","Jc","getAll","openCursor","Wd","Zi","nj","rj","jj","kj","lj","mj","oj","NONE","qj","Browser","Node","ReactNative","Worker","sj","tj","uj","wj","yj","clearInterval","setInterval","xj","Gj","Aj","Ej","Fj","Int32Array","Hj","Ij","Jj","Kj","Lj","Mj","ic","El","Nj","Oj","Pj","Qj","Rj","Tj","gf","Xj","Uj","Wj","handleOpenURL","Yj","Bj","Sj","ibi","apn","appDisplayName","Vj","ak","ck","ek","fk","gk","unknown","signInViaRedirect","linkViaRedirect","reauthViaRedirect","signInViaPopup","linkViaPopup","reauthViaPopup","hk","ik","jk","kk","lk","dk","mk","nk","bk","ga","pk","qk","rk","uk","tk","user","xk","yk","Ak","Dk","Ek","refreshToken","Fk","expiresIn","Gk","grant_type","refresh_token","Jh","expires_in","expirationTime","Hk","lastSignInTime","creationTime","Kk","Lk","apiKey","appName","authDomain","Mk","Nk","Ok","V","X","Pk","Qk","Rk","Sk","Tk","start","Uk","stop","Wk","Xk","uid","photoURL","emailVerified","isAnonymous","metadata","createdAt","lastLoginAt","providerData","Yk","Zk","$k","al","bl","cl","dl","Ik","el","fl","gl","jl","il","additionalUserInfo","operationType","kl","reload","ll","ml","nl","$","ol","pl","ql","rl","stsTokenManager","redirectEventId","sk","vk","wk","confirm","Bk","Ck","auth_time","iat","authTime","issuedAtTime","signInProvider","users","localId","providerUserInfo","rawId","hl","passwordHash","ci","oc","Ie","vl","xl","vj","Al","zl","wl","yl","Cl","Dl","Fl","Gl","Hl","ul","Rl","Il","Jl","gc","Kl","logFramework","Ll","Ml","Nl","Ol","Pl","sl","Ql","Vk","Sl","currentUser","Ul","_lat","Vl","theme","Wl","Xl","hasChildNodes","Yl","Zl","$l","pj","languages","language","userLanguage","Tl","identifier","continueUri","allProviders","Oh","signinMethods","Qh","bm","em","hm","grecaptcha","render","fm","cm","dm","am","execute","firstChild","im","Infinity","jm","km","lm","mm","nm","om","sm","um","vm","wm","Persistence","LOCAL","SESSION","Auth","Element","App","User","defaultLogLevel","INFO","defaultLogHandler","instance","logType","logLevel","toISOString","DEBUG","VERBOSE","info","WARN","ERROR","Logger","_logLevel","_logHandler","debug","DOMStorageWrapper","domStorage_","prefix_","prefixedName_","storedVal","remove","MemoryStorage","cache_","isInMemoryStorage","createStoragefor","domStorageName","domStorage","PersistentStorage","SessionStorage","logClient","LUIDGenerator","sha1","utf8Bytes","high","sha1Bytes","buildLogMessage_","var_args","logger","firstLog_","enableLogging","logger_","persistent","logWrapper","prefix","fatal","isInvalidJSONNumber","POSITIVE_INFINITY","NEGATIVE_INFINITY","MIN_NAME","MAX_NAME","nameCompare","aAsInt","tryParseInt","bAsInt","stringCompare","requireKey","ObjectToUniqueKey","splitStringBySize","segsize","dataSegs","each","doubleToIEEE754String","ln","bits","abs","pow","LN2","round","reverse","hexByteString","hexByte","INTEGER_REGEXP_","intVal","exceptionGuard","beingCrawled","setTimeoutNonBlocking","time","Path","pathOrString","pieceNum","pieces_","copyTo","pieceNum_","getFront","getLength","popFront","getBack","pathString","toUrlEncodedString","begin","parent","pieces","child","childPathObj","childPieces","relativePath","outerPath","innerPath","outer","inner","comparePaths","right","leftKeys","rightKeys","cmp","equals","other","ValidationPath","errorPrefix_","parts_","byteLength_","checkValid_","last","MAX_PATH_LENGTH_BYTES","MAX_PATH_DEPTH","toErrorString","LONG_POLLING","RepoInfo","secure","webSocketOnly","persistenceKey","domain","internalHost","needsQueryParam","isCustomHost","isCacheableHost","isDemoHost","updateHost","newHost","connectionURL","params","connURL","pairs","toURLString","PUSH_CHARS","lastPushTime","lastRandChars","__EMPTY_NODE","MAX_NODE","parseRepoInfo","dataURL","parsedUrl","parseURL","subdomain","scheme","repoInfo","port","colonInd","slashInd","questionMarkInd","pathStringDecoded","piece","decodePath","queryParams","queryString","results","_a","segment","kv","decodeQuery","INVALID_KEY_REGEX_","INVALID_PATH_REGEX_","isValidKey","isValidPathString","isValidPriority","priority","validateFirebaseDataArg","validateFirebaseData","errorPrefix$$1","path_","hasDotValue_1","hasActualChild_1","validateFirebaseMergeDataArg","mergePaths","curPath","prevPath","validateFirebaseMergePaths","validatePriority","validateEventType","eventType","validateKey","validatePathString","validateWritablePath","validateUrl","isValidRootPathString","OnDisconnect","repo_","onComplete","onDisconnectCancel","onDisconnectSet","setWithPriority","onDisconnectSetWithPriority","objectToMerge","newObjectToMerge","onDisconnectUpdate","TransactionResult","committed","snapshot","nextPushId","duplicateTime","timeStampChars","NamedNode","Wrap","Index","getCompare","compare","indexedValueChanged","oldNode","newNode","oldWrapped","newWrapped","minPost","MIN","KeyIndex","isDefinedOn","maxPost","makePost","indexValue","KEY_INDEX","__childrenNodeConstructor","nodeFromJSON","MAX_NODE$1","priorityHashText","validatePriorityNode","priorityNode","isLeafNode","getPriority","LeafNode","value_","priorityNode_","EMPTY_NODE","lazyHash_","updatePriority","newPriorityNode","getImmediateChild","childName","getChild","hasChild","getPredecessorChildName","childNode","updateImmediateChild","newChildNode","updateChild","front","numChildren","forEachChild","action","exportFormat",".value","getValue",".priority","hash","toHash","compareTo","compareToLeafNode_","otherLeaf","otherLeafType","thisLeafType","otherIndex","VALUE_TYPE_ORDER","thisIndex","withIndex","isIndexed","_defaultIndexMap","PRIORITY_INDEX","PriorityIndex","aPriority","bPriority","indexCmp","SortedMapIterator","startKey","comparator","isReverse_","resultGenerator_","nodeStack_","getNext","hasNext","peek","LLRBNode","color","RED","SortedMap","copy","count","inorderTraversal","reverseTraversal","min_","minKey","maxKey","insert","fixUp_","removeMin_","isRed_","moveRedLeft_","smallest","rotateRight_","moveRedRight_","rotateLeft_","colorFlip_","nr","checkMaxDepth_","blackDepth","check_","BLACK","LLRBEmptyNode","comparator_","root_","getPredecessorKey","rightParent","getIterator","resultGenerator","getIteratorFrom","getReverseIteratorFrom","getReverseIterator","LOG_2","Base12Num","num","current_","mask","bits_","nextBitIsOne","buildChildSet","childList","keyFn","mapSortFn","buildBalancedTree","low","namedNode","middle","root","base12","buildPennant","chunkSize","childTree","attachPennant","pennant","isOne","buildFrom12Array","fallbackObject","IndexMap","indexes_","indexSet_","indexKey","sortedMap","hasIndex","indexDefinition","addIndex","existingChildren","newIndex","sawIndexedValue","iter","indexName","newIndexSet","newIndexes","addToIndexes","indexedChildren","existingSnap","newChildren","removeFromIndexes","NAME_ONLY_COMPARATOR","NAME_COMPARATOR","ChildrenNode","children_","indexMap_","Default","newIndexMap","newImmediateChild","numKeys","allIntegerKeys","array","toHash_1","childHash","idx","resolveIndex_","predecessor","getFirstChildName","getFirstChild","getLastChildName","getLastChild","wrappedNode","startPost","endPost","MAX_NODE$2","otherChildrenNode","thisIter","otherIter","thisCurrent","otherCurrent","MaxNode","defineProperties","MAX","setMaxNode$1","USE_HINZE","nodeFromJSON$1","node_1","jsonObj_1","childData","children_1","childrenHavePriority_1","hinzeJsonObj_1","childSet","sortedChildSet","setNodeFromJSON","__referenceConstructor","OperationType","VALUE_INDEX","ValueIndex","valueNode","PathIndex","indexPath_","extractChild","snap","aChild","bChild","DataSnapshot","node_","ref_","index_","exportVal","exists","childPathString","childPath","childRef","hasChildren","getKey","getRef","DataEvent","eventRegistration","prevName","getPath","ref","getParent","getEventType","getEventRunner","CancelEvent","ValueEventRegistration","callback_","cancelCallback_","context_","respondsTo","change","query","getQueryParams","getIndex","snapshotNode","eventData","ctx","cancelCB_1","cb_1","createCancelEvent","matches","hasAnyCallback","ChildEventRegistration","callbacks_","eventToCheck","cancelCB_2","cb_2","otherCount","otherKey","thisKey","every","Query","repo","queryParams_","orderByCalled_","validateQueryEndpoints_","startNode","endNode","hasStart","getIndexStartValue","hasEnd","getIndexEndValue","tooManyArgsError","wrongArgTypeError","getIndexStartName","getIndexEndName","validateLimit_","hasLimit","hasAnchoredLimit","validateNoPreviousOrderByCall_","on","cancelCallbackOrContext","getCancelAndContextArgs_","onValueEvent","callbacks","onChildEvent","cancelCallback","container","addEventCallbackForQuery","off","removeEventCallbackForQuery","userCallback","cancelOrContext","firstCall","onceCallback","limitToFirst","limit","limitToLast","orderByChild","parsedPath","newParams","orderBy","orderByKey","orderByPriority","orderByValue","startAt","endAt","equalTo","queryObject","getQueryObject","queryIdentifier","isEqual","sameRepo","samePath","sameQueryIdentifier","CountedSet","SparseSnapshotTree","childKey","remember","forget","self_1","tree","forEachTree","prefixPath","func","resolveDeferredValue","serverValues","resolveDeferredValueSnapshot","rawPri","leafNode","childrenNode","emptyChildrenSingleton","__referenceConstructor$1","OperationSource","fromUser","fromServer","queryId","tagged","Server","forServerTaggedQuery","AckUserWrite","affectedTree","revert","ACK_USER_WRITE","operationForChild","children","subtree","Empty","EmptyChildren","ImmutableTree","fromObject","childSnap","findRootMostMatchingPathAndValue","predicate","childExistingPathAndValue","findRootMostValueAndPath","toSet","newChild","setTree","newTree","fold","fold_","pathSoFar","accum","findOnPath","findOnPath_","pathToFollow","nextChild","foreachOnPath","foreachOnPath_","currentRelativePath","foreach","foreach_","foreachChild","ListenComplete","LISTEN_COMPLETE","Overwrite","OVERWRITE","Merge","MERGE","CacheNode","fullyInitialized_","filtered_","isFullyInitialized","isFiltered","isCompleteForPath","isCompleteForChild","getNode","ViewCache","eventCache_","serverCache_","updateEventSnap","eventSnap","filtered","updateServerSnap","serverSnap","getEventCache","getCompleteEventSnap","getServerCache","getCompleteServerSnap","Change","oldSnap","valueChange","VALUE","childAddedChange","CHILD_ADDED","childRemovedChange","CHILD_REMOVED","childChangedChange","newSnapshot","oldSnapshot","CHILD_CHANGED","childMovedChange","CHILD_MOVED","IndexedFilter","affectedPath","optChangeAccumulator","oldChild","trackChildChange","updateFullNode","newSnap","newPriority","filtersNodes","getIndexedFilter","ChildChangeAccumulator","changeMap_","oldChange","oldType","getChanges","getValues","NO_COMPLETE_CHILD_SOURCE","NoCompleteChildSource_","getCompleteChild","getChildAfterChild","WriteTreeCompleteChildSource","writes_","viewCache_","optCompleteServerCache_","serverNode","calcCompleteChild","completeServerData","nodes","calcIndexedSlice","ProcessorResult","viewCache","changes","ViewProcessor","filter_","assertIndexed","applyOperation","oldViewCache","writesCache","completeCache","newViewCache","filterServerNode","accumulator","overwrite","applyUserOverwrite_","applyServerOverwrite_","merge","applyUserMerge_","applyServerMerge_","ackUserWrite","revertUserWrite_","ackUserWrite_","listenComplete_","maybeAddValueEvent_","isLeafOrEmpty","oldCompleteSnap","generateEventCacheAfterServerEvent_","changePath","oldEventSnap","shadowingWrite","newEventCache","serverCache","completeChildren","completeEventChildren","calcCompleteEventChildren","completeNode","calcCompleteEventCache","oldEventNode","updatedPriority","calcEventCacheAfterServerOverwrite","childChangePath","newEventChild","eventChildUpdate","changedSnap","newServerCache","oldServerSnap","serverFilter","newServerNode","newEventSnap","cacheHasChild_","changedChildren","curViewCache","writePath","applyMerge_","viewMergeTree","serverChild","childMergeTree","isUnknownDeepMerge","ackPath","changedChildren_1","changedChildren_2","mergePath","serverCachePath","oldServerNode","completeServerCache","oldEventCache","serverChildren","EventGenerator","query_","generateEventsForChanges","eventCache","eventRegistrations","events","moves","generateEventsForType_","registrations","filteredChanges","compareChanges_","materializedChange","materializeSingleChange_","registration","aWrapped","bWrapped","View","initialViewCache","eventRegistrations_","indexFilter","getNodeFilter","processor_","initialServerCache","initialEventCache","eventGenerator_","getQuery","getCompleteServerCache","loadsAllData","addEventRegistration","removeEventRegistration","cancelError","cancelEvents","path_1","maybeEvent","existing","generateEventsForChanges_","getInitialEvents","initialChanges","SyncPoint","views_","optCompleteServerCache","events_1","serverCacheComplete","eventCacheComplete","removed","hadCompleteView","hasCompleteView","viewQueryId","getQueryViews","viewForQuery","getCompleteView","viewExistsForQuery","CompoundWrite","writeTree_","addWrite","rootmost","rootMostPath","addWrites","updates","newWrite","removeWrite","hasCompleteWrite","getCompleteNode","getCompleteChildren","childCompoundWrite","shadowingNode","applySubtreeWrite_","writeTree","priorityWrite_1","WriteTree","visibleWrites_","allWrites_","lastWriteId_","childWrites","WriteTreeRef","addOverwrite","writeId","visible","addMerge","getWrite","record","writeToRemove","removedWriteWasVisible","removedWriteOverlapsWithOtherWrites","currentWrite","recordContainsPath_","resetTree_","getCompleteWriteData","treePath","writeIdsToExclude","includeHiddenWrites","mergeAtPath","layerTree_","layeredCache","subMerge","completeServerChildren","topLevelSet","merge_1","existingEventSnap","existingServerSnap","childMerge","toIterate","writeRecord","DefaultFilter_","writes","treeRoot","compoundWrite","deepNode","treePath_","existingServerCache","SyncTree","listenProvider_","syncPointTree_","pendingWriteTree_","tagToQueryMap_","queryToTagMap_","applyUserOverwrite","newData","applyOperationToSyncPoints_","applyUserMerge","changeTree","affectedTree_1","applyServerOverwrite","applyServerMerge","applyListenComplete","applyTaggedQueryOverwrite","tag","queryKey","queryKeyForTag_","parseQueryKey_","queryPath","applyTaggedOperation_","applyTaggedQueryMerge","applyTaggedListenComplete","foundAncestorDefaultView","pathToSyncPoint","sp","syncPoint","childSyncPoint","viewAlreadyExists","makeQueryKey_","getNextQueryTag_","setupListener_","maybeSyncPoint","removedAndEvents","removingDefault","covered","parentSyncPoint","newViews","collectDistinctViewsForSubTree_","newQuery","createListenerForView_","startListening","queryForListening_","tagForQuery_","hashFn","stopListening","queryToRemove","tagToRemove","removeTags_","maybeChildSyncPoint","childMap","views_1","childViews","queries","removedQuery","removedQueryKey","removedQueryTag","isDefault","queriesToStop","queries_1","childQueries","queryToStop","error$$1","errorForServerCode","splitIndex","nextQueryTag_","applyOperationHelper_","syncPointTree","applyOperationDescendantsHelper_","childOperation","childServerCache","childWritesCache","SnapshotHolder","rootNode_","updateSnapshot","newSnapshotNode","AuthTokenProvider","app_","forceRefresh","addTokenChangeListener","removeTokenChangeListener","notifyForInvalidToken","StatsCollection","counters_","incrementCounter","amount","StatsManager","getCollection","hashString","collections_","getOrCreateReporter","creatorFunction","reporters_","StatsListener","collection_","last_","newStats","delta","stat","FIRST_STATS_MIN_TIME","FIRST_STATS_MAX_TIME","StatsReporter","collection","server_","statsToReport_","statsListener_","reportStats_","includeStat","stats","reportedStats","haveStatsToReport","reportStats","EventQueue","eventLists_","recursionDepth_","queueEvents","eventDataList","currList","eventPath","EventList","raiseEventsAtPath","raiseQueuedEventsMatchingPredicate_","raiseEventsForChangedPath","changedPath","sentAll","eventList","raise","events_","eventFn","EventEmitter","allowedEvents_","listeners_","trigger","listeners","validateEventType_","getInitialEvent","et","VisibilityMonitor","hidden","visibilityChange","visible_","getInstance","OnlineMonitor","online_","currentlyOnline","PacketReceiver","onMessage_","pendingResponses","currentResponseNum","closeAfterResponse","onClose","closeAfter","responseNum","handleResponse","requestNum","_loop_1","toProcess","this_1","_loop_2","FIREBASE_LONGPOLL_COMMAND_CB_NAME","FIREBASE_LONGPOLL_DATA_CB_NAME","BrowserPollConnection","connId","transportSessionId","lastSessionId","bytesSent","bytesReceived","everConnected_","log_","stats_","urlFn","onMessage","onDisconnect","curSegmentNum","onDisconnect_","myPacketOrderer","isClosed_","connectTimeoutTimer_","onClosed_","called_1","wrappedFn_1","executeWhenDOMReady","scriptTagHolder","FirebaseIFrameScriptHolder","command","arg1","arg2","incrementIncomingBytes_","sendNewPolls","pN","urlParams","uniqueCallbackIdentifier","connectURL","addTag","startLongPoll","addDisconnectPingFrame","forceAllow","forceAllow_","forceDisallow","forceDisallow_","isAvailable","Windows","UI","markConnectionHealthy","shutdown_","myDisconnFrame","dataStr","base64data","MAX_URL_DATA_SIZE","enqueueSegment","pw","dframe","commandCB","onMessageCB","outstandingRequests","pendingSegs","currentSerial","myIFrame","createIFrame_","script","iframeContents","doc","iframe","contentDocument","alive","innerHTML","myID","disconn","myPW","theURL","nodeRestRequest","newRequest_","curDataString","theSeg","seg","ts","addLongPollTag_","segnum","totalsegs","serial","doNewRequest","keepaliveTimeout","loadCB","doNodeLongPoll","newScript_1","async","rstate","WebSocketImpl","MozWebSocket","WebSocket","WebSocketConnection","keepaliveTimer","frames","totalFrames","connectionURL_","device","User-Agent","process","platform","env","mySock","onopen","onclose","handleIncomingFrame","isOldAndroid","oldAndroidMatch","previouslyFailed","appendFrame_","fullMess","jsonMess","handleNewFrameCount_","frameCount","extractFrameCount_","mess","resetKeepAlive","remainingData","sendString_","responsesRequiredToBeHealthy","healthyTimeout","TransportManager","initTransports_","isWebSocketsAvailable","isSkipPollConnection","transports_","transports_1","ALL_TRANSPORTS","transport","initialTransport","upgradeTransport","Connection","repoInfo_","onReady_","onKill_","connectionCount","pendingDataMessages","state_","transportManager_","start_","conn","conn_","nextTransportId_","primaryResponsesRequired_","onMessageReceived","connReceiver_","onConnectionLost","disconnReceiver_","tx_","rx_","secondaryConn_","isHealthy_","healthyTimeout_ms","healthyTimeout_","everConnected","onConnectionLost_","onSecondaryConnectionLost_","onPrimaryMessageReceived_","onSecondaryMessageReceived_","sendRequest","dataMsg","msg","sendData_","tryCleanupConnection","onSecondaryControl_","controlData","cmd","upgradeIfSecondaryHealthy_","secondaryResponsesRequired_","parsedData","layer","proceedWithUpgrade_","onControl_","onDataMessage_","onPrimaryResponse_","payload","onHandshake_","onConnectionShutdown_","onReset_","sendPingOnPrimaryIfNecessary_","handshake","timestamp","onConnectionEstablished_","tryStartUpgrade_","startUpgrade_","closeConnections_","ServerActions","refreshAuthToken","onDisconnectPut","onDisconnectMerge","RECONNECT_MIN_DELAY","RECONNECT_MAX_DELAY_DEFAULT","PersistentConnection","onDataUpdate_","onConnectStatus_","onServerInfoUpdate_","authTokenProvider_","authOverride_","nextPersistentConnectionId_","interruptReasons_","listens_","outstandingPuts_","outstandingPutCount_","onDisconnectRequestQueue_","connected_","reconnectDelay_","maxReconnectDelay_","securityDebugCallback_","establishConnectionTimer_","requestCBHash_","requestNumber_","realtime_","authToken_","forceTokenRefresh_","invalidAuthTokenCount_","firstConnection_","lastConnectionAttemptTime_","lastConnectionEstablishedTime_","scheduleConnect_","onVisible_","onOnline_","onResponse","curReqNum","listen","currentHashFn","listenSpec","sendListen_","req","warnOnListenWarnings_","removeListen_","warnings","indexSpec","indexPath","tryAuth","reduceReconnectDelayIfAdminCredential_","decoded","token_1","authMethod","requestData","cred","onAuthRevoked_","unlisten","sendUnlisten_","queryObj","sendOnDisconnect_","putInternal","sendPut_","queued","errorReason","reqNum","onDataPush_","onListenRevoked_","onSecurityDebugPacket_","handleTimestamp_","sendConnectStats_","restoreState_","establishConnection_","online","onRealtimeDisconnect_","cancelSentTransactions_","shouldReconnect_","timeSinceLastConnectAttempt","reconnectDelay","onDataMessage_1","onReady_1","onDisconnect_1","connId_1","nextConnectionId_","lastSessionId_1","canceled_1","connection_1","closeFn_1","interrupt","resume","serverTimeOffset","normalizedPathString","statusCode","explanation","clientName","ReadonlyRestClient","getListenId_","listenId","thisListen","queryStringParamaters","toRestQueryStringParameters","restRequest_","queryStringParameters","authTokenData","authToken","arrayVal","Repo","forceRestClient","dataUpdateCount","eventQueue_","nextWriteId_","interceptServerDataCallback_","persistentConnection_","authTokenProvider","authOverride","statsReporter_","transactions_init_","infoData_","infoSyncTree_","infoEvents","updateInfo_","serverSyncTree_","serverTime","offset","generateServerValues","isMerge","taggedChildren","raw","taggedSnap","rerunTransactions_","interceptServerData_","connectStatus","runOnDisconnectEvents_","getNextWriteId_","newVal","newNodeUnresolved","success","clearEvents","callOnCompleteCallback","abortTransactions_","childrenToMerge","empty","changedKey","changedValue","writeId_1","resolvedTree","resolveDeferredValueTree","showDelta","longestName","reduce","previousValue","currentValue","statsIncrementCounter","metric","__database","Database","RangedFilter","indexedFilter_","startPost_","getStartPost_","endPost_","getEndPost_","getStartPost","getEndPost","startName","endName","LimitedFilter","rangedFilter_","limit_","getLimit","reverse_","isViewFromLeft","fullLimitUpdateChild_","indexCompare_1","foundStartPost","changeAccumulator","indexCmp_1","newChildNamedNode","windowBoundary","inRange","oldChildSnap","compareNext","QueryParams","limitSet_","startSet_","startNameSet_","endSet_","endNameSet_","viewFrom_","indexStartValue_","indexStartName_","indexEndValue_","indexEndName_","WIRE_PROTOCOL_CONSTANTS_","VIEW_FROM_LEFT","copy_","newLimit","VIEW_FROM_RIGHT","WIRE_PROTOCOL_CONSTANTS","INDEX_START_VALUE","INDEX_START_NAME","INDEX_END_VALUE","INDEX_END_NAME","LIMIT","viewFrom","VIEW_FROM","INDEX","REST_CONSTANTS","REST_QUERY_CONSTANTS_","qs","ORDER_BY","START_AT","END_AT","LIMIT_TO_FIRST","LIMIT_TO_LAST","DEFAULT","Reference","validateRootPathString","parentPath","getRoot","databaseProp","database","transactionUpdate","applyLocally","bool","validateBoolean","startTransaction","setPriority","thennablePushRef","pushRef","TransactionStatus","TreeNode","childCount","Tree","parent_","subTree","pathObj","setValue","updateParents_","forEachDescendant","includeSelf","childrenFirst","forEachAncestor","forEachImmediateDescendantWithValue","updateChild_","childEmpty","childExists","MAX_TRANSACTION_RETRIES_","transactionQueueTree_","valueCallback","watchRef","order","retryCount","unwatcher","abortReason","currentWriteId","currentInputSnapshot","currentOutputSnapshotRaw","currentOutputSnapshotResolved","currentState","getLatestState_","RUN","queueNode","nodeQueue","priorityForNode","sendReadyTransactions_","excludeSets","pruneCompletedTransactionsBelowNode_","queue","buildTransactionQueue_","sendTransactionQueue_","setsToIgnore","txn","latestState","snapToSend","latestHash","SENT","dataToSend","pathToSend","COMPLETED","SENT_NEEDS_ABORT","NEEDS_ABORT","rootMostTransactionNode","getAncestorTransactionNode_","rerunTransactionQueue_","abortTransaction","currentNode","newDataNode","oldWriteId","newNodeResolved","lastInput","transactionNode","transactionQueue","aggregateTransactionQueuesForNode_","to","from","abortTransactionsOnNode_","lastSent","_staticInstance","RepoManager","repos_","useRestClient_","dbUrl","databaseFromApp","createRepo","deleteRepo","appRepos","DatabaseInternals","checkDeleted_","refFromURL","apiName","parsedURL","goOffline","goOnline","ServerValue","TIMESTAMP",".sv","forceLongPolling","forceWebSockets","setSecurityDebugCallback","interceptServerData","DataConnection","simpleListen","echo","onEcho","RealTimeConnection","ConnectionTarget","TEST_ACCESS","hijackHash","newHash","oldPut","opt_onComplete","opt_hash","listens","firebaseRef","unused","MessageParameter","MessageType","ERROR_CODES","AVAILABLE_IN_WINDOW","AVAILABLE_IN_SW","SHOULD_BE_INHERITED","BAD_SENDER_ID","INCORRECT_GCM_SENDER_ID","PERMISSION_DEFAULT","PERMISSION_BLOCKED","UNSUPPORTED_BROWSER","NOTIFICATIONS_BLOCKED","FAILED_DEFAULT_REGISTRATION","SW_REGISTRATION_EXPECTED","GET_SUBSCRIPTION_FAILED","INVALID_SAVED_TOKEN","SW_REG_REDUNDANT","TOKEN_SUBSCRIBE_FAILED","TOKEN_SUBSCRIBE_NO_TOKEN","TOKEN_SUBSCRIBE_NO_PUSH_SET","TOKEN_UNSUBSCRIBE_FAILED","TOKEN_UPDATE_FAILED","TOKEN_UPDATE_NO_TOKEN","USE_SW_BEFORE_GET_TOKEN","INVALID_DELETE_TOKEN","DELETE_TOKEN_NOT_FOUND","DELETE_SCOPE_NOT_FOUND","BG_HANDLER_FUNCTION_EXPECTED","NO_WINDOW_CLIENT_TO_MSG","UNABLE_TO_RESUBSCRIBE","NO_FCM_TOKEN_FOR_RESUBSCRIBE","FAILED_TO_DELETE_TOKEN","NO_SW_IN_REG","BAD_SCOPE","BAD_VAPID_KEY","BAD_SUBSCRIPTION","BAD_TOKEN","BAD_PUSH_SET","FAILED_DELETE_VAPID_KEY","INVALID_PUBLIC_VAPID_KEY","USE_PUBLIC_KEY_BEFORE_GET_TOKEN","PUBLIC_KEY_DECRYPTION_FAILED","ERROR_MAP","errorFactory","DEFAULT_PUBLIC_VAPID_KEY","ENDPOINT","isArrayBufferEqual","viewA","viewB","getUint8","arrayBufferToBase64","uint8Version","toBase64","IIDModel","senderId","subscription","publicVapidKey","p256dh","fcmSubscribeBody","applicationPubKey","subscribeOptions","responseData","pushSet","updateToken","fcmToken","fcmPushSet","fcmUpdateBody","updateOptions","deleteToken","fcmUnsubscribeBody","unsubscribeOptions","base64ToArrayBuffer","base64String","repeat","rawData","outputArray","OLD_DB_NAME","OLD_OBJECT_STORE_NAME","cleanV1","event","iidModel","openCursorRequest","cursor","tokenDetails","fcmSenderId","continue","handleDb","DBInterface","dbPromise","createTransaction","closeDatabase","runRequest","getDb","objectStoreName","promisify","oncomplete","dbName","dbVersion","onDbUpgrade","TokenDetailsModel","oldVersion","createIndex","unique","cursorRequest_1","createTime","vapidKey","getTokenDetailsFromToken","validateInputs","getTokenDetailsFromSWScope","swScope","saveTokenDetails","details","VapidDetailsModel","getVapidFromSWScope","saveVapidDetails","deleteVapidDetails","SENDER_ID_OPTION_NAME","ControllerInterface","messagingSenderId","tokenDetailsModel","vapidDetailsModel","currentPermission","swReg","pushSubscription","getNotificationPermission_","getSWRegistration_","getPublicVapidKey_","getPushSubscription","scope","manageExistingToken","getNewToken","isEndpointEqual","isAuthEqual","isP256dhEqual","isTokenStillValid","deleteTokenFromDB","updatedToken","allDetails","e_1","pushManager","getSubscription","swRegistration","userVisibleOnly","applicationServerKey","requestPermission","useServiceWorker","usePublicVapidKey","b64PublicKey","completed","onTokenRefresh","setBackgroundMessageHandler","Notification","permission","getTokenDetailsModel","getVapidDetailsModel","getIIDModel","SWController","bgMessageHandler","onPush","onSubChange","onNotificationClick","waitUntil","onPush_","onSubChange_","onNotificationClick_","msgPayload","notificationDetails","notificationTitle","hasVisibleClients_","notification","sendMessageToWindowClients_","getNotificationData_","title","showNotification","err_2","clickAction","windowClient","internalMsg","stopImmediatePropagation","click_action","getWindowClient_","clients","openWindow","createNewMsg","NOTIFICATION_CLICKED","attemptToMessageClient_","notificationInformation","clientList","suitableClient","URL","getClientList","PUSH_MSG_RECEIVED","vapidKeyFromDatabase","matchAll","includeUncontrolled","msgType","msgData","TYPE_OF_MSG","DATA","WindowController","registrationToUse","publicVapidKeyToUse","manifestCheckPromise","messageObserver","tokenRefreshObserver","onMessageInternal","onTokenRefreshInternal","setupSWMessageListener_","isSupported_","manifestCheck_","manifestTag","querySelector","manifestContent","managePermissionResult","permissionPromise","ServiceWorkerRegistration","publicKey","parsedKey","waitForRegistrationToActivate_","serviceWorker","installing","waiting","active","state","stateChangeListener","browserErrorMessage","workerPageMessage","pushMessage","PushSubscription","namespaceExports","Messaging","registerMessaging","domainBase","downloadBase","apiBaseUrl","apiUploadBaseUrl","defaultMaxOperationRetryTime","defaultMaxUploadRetryTime","minSafeInteger","FirebaseStorageError","code_","prependCode","message_","serverResponse_","codeProp","codeEquals","serverResponseProp","setServerResponseProp","serverResponse","Code","UNKNOWN","OBJECT_NOT_FOUND","BUCKET_NOT_FOUND","PROJECT_NOT_FOUND","UNAUTHENTICATED","UNAUTHORIZED","RETRY_LIMIT_EXCEEDED","INVALID_CHECKSUM","CANCELED","INVALID_EVENT_NAME","INVALID_URL","INVALID_DEFAULT_BUCKET","NO_DEFAULT_BUCKET","CANNOT_SLICE_BLOB","SERVER_FILE_WRONG_SIZE","NO_DOWNLOAD_URL","INVALID_ARGUMENT","INVALID_ARGUMENT_COUNT","APP_DELETED","INVALID_ROOT_OPERATION","INVALID_FORMAT","INTERNAL_ERROR","canceled","cannotSliceBlob","invalidArgument","appDeleted","invalidFormat","format","internalError","StringFormat","RAW","BASE64","BASE64URL","DATA_URL","formatValidator","stringFormat","StringData","opt_contentType","dataFromString","string","utf8Bytes_","base64Bytes_","DataURLParts","rest","percentEncodedBytes_","dataURLBytes_","dataURLContentType_","hasMinus","hasUnder","hasPlus","hasSlash","end","ErrorCode","TaskEvent","STATE_CHANGED","InternalTaskState","RUNNING","PAUSING","PAUSED","SUCCESS","CANCELING","TaskState","taskStateFromInternalTaskState","make","resolver","isDef","isJustDef","isObject","isNonNullObject","isString","isNativeBlob","isNativeBlobDefined","NetworkXhrIo","sent_","xhr_","errorCode_","NO_ERROR","sendPromise_","resolve$$1","reject$$1","ABORT","NETWORK_ERROR","opt_body","opt_headers","getErrorCode","getStatus","getResponseText","addUploadProgressListener","upload","removeUploadProgressListener","XhrIoPool","createXhrIo","jsonObjectOrNull","Location","bucket","fullServerUrl","encode","bucketOnlyServerUrl","makeFromBucketSpec","bucketString","bucketLocation","makeFromUrl","groups","regex","indices","postModify","loc","group","captures","bucketValue","pathValue","invalidUrl","lastComponent","makeNormalUrl","urlPart","makeUploadUrl","makeQueryString","queryPart","nextPart","noXform_","Mapping","server","opt_local","opt_writable","opt_xform","local","xform","mappings_","getMappings","mappings","nameMapping","fullPath","xformPath","sizeMapping","size","tokens","makeDownloadUrl","alt","fromResource","authWrapper","resource","mapping","makeStorageReference","addRef","toResourceString","metadataValidator","validate","specs","passed","minArgs","maxArgs","argMin","argMax","real","countPart","plural","validator","ArgSpec","opt_optional","stringSpec","opt_validator","stringValidator","v1","v2","metadataSpec","nonNegativeNumberSpec","isNumber","looseObjectSpec","nullFunctionSpec","getBlobBuilder","BlobBuilder","WebKitBlobBuilder","FbsBlob","opt_elideCopy","blobType","data_","size_","type_","startByte","endByte","realBlob","sliced","webkitSlice","mozSlice","getBlob","blobby","uint8Arrays","finalLength_1","merged_1","index_1","uploadData","contains$1","elem","RequestInfo","handler","errorHandler","progressCallback","successCodes","additionalRetryCodes","handlerCheck","cndn","metadataHandler","resourceString","fromResourceString","sharedErrorHandler","newErr","objectErrorHandler","shared","getMetadata","maxOperationRetryTime","requestInfo","metadataForUpload_","opt_metadata","determineContentType_","ResumableUploadStatus","current","total","checkResumeHeader_","opt_allowed","continueResumableUpload","opt_status","opt_progressCallback","bytesLeft","bytesToUpload","X-Goog-Upload-Command","X-Goog-Upload-Offset","maxUploadRetryTime","uploadStatus","newCurrent","Observer","opt_error","opt_complete","UploadTaskSnapshot","bytesTransferred","totalBytes","urls","argsToForward","UploadTask","transferred_","needToFetchStatus_","needToFetchMetadata_","observers_","error_","uploadUrl_","request_","chunkMultiplier_","resolve_","reject_","authWrapper_","location_","blob_","metadata_","resumable_","shouldDoResumable_","errorHandler_","completeTransitions_","transition_","metadataErrorHandler_","promise_","makeProgressCallback_","sizeBefore","loaded","updateProgress_","createResumable_","fetchStatus_","fetchMetadata_","continueUpload_","oneShotUpload_","resolveToken_","getAuthToken","X-Goog-Upload-Protocol","X-Goog-Upload-Header-Content-Length","X-Goog-Upload-Header-Content-Type","createResumableUpload","createRequest","makeRequest","getPromise","sizeString","getResumableUploadStatus","statusRequest","uploadRequest","newStatus","increaseMultiplier_","metadataRequest","boundary","genBoundary","preBlobPart","postBlobPart","multipartUpload","multipartRequest","transferred","old","notifyObservers_","wasPaused","externalState","nextOrObserverMessage","nextValidator","observerValidator","nextOrObserverValidator","_p","makeBinder","addObserver_","removeObserver_","binderSpecs","notifyObserver_","arraylike","finishPromise_","triggered","valid","pause","newRef","newPath","canonicalChildPath","component","throwIfRoot_","putString","deleteObject","updateMetadata","getDownloadURL","invalidRootOperation","FailRequest","appDelete","RequestMap","map_","id_","addRequest","unmap","AuthWrapper","maker","requestMaker","pool","bucket_","deleted_","extractBucket_","storageRefMaker_","requestMaker_","pool_","service_","maxOperationRetryTime_","maxUploadRetryTime_","requestMap_","_error","deleteApp","setMaxUploadRetryTime","setMaxOperationRetryTime","NetworkRequest","errorCallback","pendingXhr_","backoffId_","canceled_","appDelete_","url_","method_","headers_","body_","successCodes_","additionalRetryCodes_","errorCallback_","progressCallback_","timeout_","backoffDone","requestWentThrough","wasSuccessCode","RequestEndStatus","waitSeconds","timeoutId","hitTimeout","cancelState","triggeredCallback","triggerCallback","callWithDelay","millis","waitMillis","stopped","wasTimeout","backoffCallback","canceled$$1","progressListener","hitServer","isRetryStatusCode_","successCode","wasCanceled","progressEvent","lengthComputable","isFiveHundredCode","isExtraRetryCode","isRequestSpecificRetryCode","opt_canceled","addAuthHeader_","number","addVersionHeader_","Service","authWrapperBucket","internals_","ServiceInternals","STORAGE_TYPE","factory","opt_url","Storage","registerStorage"],"mappings":"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"}