{"version":3,"file":"index.mjs","sources":["../node_modules/@firebase/util/dist/index.esm2017.js","../node_modules/@firebase/component/dist/esm/index.esm2017.js","../node_modules/@firebase/logger/dist/esm/index.esm2017.js","../node_modules/idb/build/wrap-idb-value.js","../node_modules/idb/build/index.js","../node_modules/@firebase/app/dist/esm/index.esm2017.js","../node_modules/@firebase/installations/dist/esm/index.esm2017.js","../node_modules/@firebase/analytics/dist/esm/index.esm2017.js","../node_modules/firebase/app/dist/esm/index.esm.js","../node_modules/@firebase/database/dist/index.esm2017.js","../src/index.ts"],"sourcesContent":["/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst 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 * @license\r\n * Copyright 2017 Google LLC\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 */\r\nconst 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 */\r\nconst 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 * @license\r\n * Copyright 2017 Google LLC\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\nconst stringToByteArray$1 = function (str) {\r\n    // TODO(user): Use native implementations if/when available\r\n    const out = [];\r\n    let p = 0;\r\n    for (let i = 0; i < str.length; i++) {\r\n        let 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 bytes Array of numbers representing characters.\r\n * @return Stringification of the array.\r\n */\r\nconst byteArrayToString = function (bytes) {\r\n    // TODO(user): Use native implementations if/when available\r\n    const out = [];\r\n    let pos = 0, c = 0;\r\n    while (pos < bytes.length) {\r\n        const 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            const 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            const c2 = bytes[pos++];\r\n            const c3 = bytes[pos++];\r\n            const c4 = bytes[pos++];\r\n            const 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            const c2 = bytes[pos++];\r\n            const 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// We define it as an object literal instead of a class because a class compiled down to es5 can't\r\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\r\n// Static lookup maps, lazily populated by init_()\r\nconst base64 = {\r\n    /**\r\n     * Maps bytes to characters.\r\n     */\r\n    byteToCharMap_: null,\r\n    /**\r\n     * Maps characters to bytes.\r\n     */\r\n    charToByteMap_: null,\r\n    /**\r\n     * Maps bytes to websafe characters.\r\n     * @private\r\n     */\r\n    byteToCharMapWebSafe_: null,\r\n    /**\r\n     * Maps websafe characters to bytes.\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     */\r\n    ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\r\n    /**\r\n     * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\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     */\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     */\r\n    HAS_NATIVE_SUPPORT: typeof atob === 'function',\r\n    /**\r\n     * Base64-encode an array of bytes.\r\n     *\r\n     * @param input An array of bytes (numbers with\r\n     *     value in [0, 255]) to encode.\r\n     * @param webSafe Boolean indicating we should use the\r\n     *     alternative alphabet.\r\n     * @return The base64 encoded string.\r\n     */\r\n    encodeByteArray(input, 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        const byteToCharMap = webSafe\r\n            ? this.byteToCharMapWebSafe_\r\n            : this.byteToCharMap_;\r\n        const output = [];\r\n        for (let i = 0; i < input.length; i += 3) {\r\n            const byte1 = input[i];\r\n            const haveByte2 = i + 1 < input.length;\r\n            const byte2 = haveByte2 ? input[i + 1] : 0;\r\n            const haveByte3 = i + 2 < input.length;\r\n            const byte3 = haveByte3 ? input[i + 2] : 0;\r\n            const outByte1 = byte1 >> 2;\r\n            const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\r\n            let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\r\n            let 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 input A string to encode.\r\n     * @param webSafe If true, we should use the\r\n     *     alternative alphabet.\r\n     * @return The base64 encoded string.\r\n     */\r\n    encodeString(input, 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 && !webSafe) {\r\n            return btoa(input);\r\n        }\r\n        return this.encodeByteArray(stringToByteArray$1(input), webSafe);\r\n    },\r\n    /**\r\n     * Base64-decode a string.\r\n     *\r\n     * @param input to decode.\r\n     * @param webSafe True if we should use the\r\n     *     alternative alphabet.\r\n     * @return string representing the decoded value.\r\n     */\r\n    decodeString(input, 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 && !webSafe) {\r\n            return atob(input);\r\n        }\r\n        return byteArrayToString(this.decodeStringToByteArray(input, 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 input Input to decode.\r\n     * @param webSafe True if we should use the web-safe alphabet.\r\n     * @return bytes representing the decoded value.\r\n     */\r\n    decodeStringToByteArray(input, webSafe) {\r\n        this.init_();\r\n        const charToByteMap = webSafe\r\n            ? this.charToByteMapWebSafe_\r\n            : this.charToByteMap_;\r\n        const output = [];\r\n        for (let i = 0; i < input.length;) {\r\n            const byte1 = charToByteMap[input.charAt(i++)];\r\n            const haveByte2 = i < input.length;\r\n            const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\r\n            ++i;\r\n            const haveByte3 = i < input.length;\r\n            const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\r\n            ++i;\r\n            const haveByte4 = i < input.length;\r\n            const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\r\n            ++i;\r\n            if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\r\n                throw new DecodeBase64StringError();\r\n            }\r\n            const outByte1 = (byte1 << 2) | (byte2 >> 4);\r\n            output.push(outByte1);\r\n            if (byte3 !== 64) {\r\n                const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\r\n                output.push(outByte2);\r\n                if (byte4 !== 64) {\r\n                    const 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_() {\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 (let 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 * An error encountered while decoding base64 string.\r\n */\r\nclass DecodeBase64StringError extends Error {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.name = 'DecodeBase64StringError';\r\n    }\r\n}\r\n/**\r\n * URL-safe base64 encoding\r\n */\r\nconst base64Encode = function (str) {\r\n    const utf8Bytes = stringToByteArray$1(str);\r\n    return base64.encodeByteArray(utf8Bytes, true);\r\n};\r\n/**\r\n * URL-safe base64 encoding (without \".\" padding in the end).\r\n * e.g. Used in JSON Web Token (JWT) parts.\r\n */\r\nconst base64urlEncodeWithoutPadding = function (str) {\r\n    // Use base64url encoding and remove padding in the end (dot characters).\r\n    return base64Encode(str).replace(/\\./g, '');\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 str To be decoded\r\n * @return Decoded result, if possible\r\n */\r\nconst 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 * @license\r\n * Copyright 2017 Google LLC\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\n * Note: we don't merge __proto__ to prevent prototype pollution\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            const 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 (const prop in source) {\r\n        // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\r\n        if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\r\n            continue;\r\n        }\r\n        target[prop] = deepExtend(target[prop], source[prop]);\r\n    }\r\n    return target;\r\n}\r\nfunction isValidKey(key) {\r\n    return key !== '__proto__';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\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 * Polyfill for `globalThis` object.\r\n * @returns the `globalThis` object for the given environment.\r\n * @public\r\n */\r\nfunction getGlobal() {\r\n    if (typeof self !== 'undefined') {\r\n        return self;\r\n    }\r\n    if (typeof window !== 'undefined') {\r\n        return window;\r\n    }\r\n    if (typeof global !== 'undefined') {\r\n        return global;\r\n    }\r\n    throw new Error('Unable to locate global object.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\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\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\r\n/**\r\n * Attempt to read defaults from a JSON string provided to\r\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\r\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\r\n * The dots are in parens because certain compilers (Vite?) cannot\r\n * handle seeing that variable in comments.\r\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\r\n */\r\nconst getDefaultsFromEnvVariable = () => {\r\n    if (typeof process === 'undefined' || typeof process.env === 'undefined') {\r\n        return;\r\n    }\r\n    const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\r\n    if (defaultsJsonString) {\r\n        return JSON.parse(defaultsJsonString);\r\n    }\r\n};\r\nconst getDefaultsFromCookie = () => {\r\n    if (typeof document === 'undefined') {\r\n        return;\r\n    }\r\n    let match;\r\n    try {\r\n        match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\r\n    }\r\n    catch (e) {\r\n        // Some environments such as Angular Universal SSR have a\r\n        // `document` object but error on accessing `document.cookie`.\r\n        return;\r\n    }\r\n    const decoded = match && base64Decode(match[1]);\r\n    return decoded && JSON.parse(decoded);\r\n};\r\n/**\r\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\r\n * (1) if such an object exists as a property of `globalThis`\r\n * (2) if such an object was provided on a shell environment variable\r\n * (3) if such an object exists in a cookie\r\n * @public\r\n */\r\nconst getDefaults = () => {\r\n    try {\r\n        return (getDefaultsFromGlobal() ||\r\n            getDefaultsFromEnvVariable() ||\r\n            getDefaultsFromCookie());\r\n    }\r\n    catch (e) {\r\n        /**\r\n         * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\r\n         * to any environment case we have not accounted for. Log to\r\n         * info instead of swallowing so we can find these unknown cases\r\n         * and add paths for them if needed.\r\n         */\r\n        console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\r\n        return;\r\n    }\r\n};\r\n/**\r\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHost = (productName) => { var _a, _b; return (_b = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.emulatorHosts) === null || _b === void 0 ? void 0 : _b[productName]; };\r\n/**\r\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\r\n * for the given product.\r\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\r\n * @public\r\n */\r\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\r\n    const host = getDefaultEmulatorHost(productName);\r\n    if (!host) {\r\n        return undefined;\r\n    }\r\n    const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\r\n    if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\r\n        throw new Error(`Invalid host ${host} with no separate hostname and port!`);\r\n    }\r\n    // eslint-disable-next-line no-restricted-globals\r\n    const port = parseInt(host.substring(separatorIndex + 1), 10);\r\n    if (host[0] === '[') {\r\n        // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\r\n        return [host.substring(1, separatorIndex - 1), port];\r\n    }\r\n    else {\r\n        return [host.substring(0, separatorIndex), port];\r\n    }\r\n};\r\n/**\r\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\r\n * @public\r\n */\r\nconst getDefaultAppConfig = () => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.config; };\r\n/**\r\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\r\n * prefixed by \"_\")\r\n * @public\r\n */\r\nconst getExperimentalSetting = (name) => { var _a; return (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a[`_${name}`]; };\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass Deferred {\r\n    constructor() {\r\n        this.reject = () => { };\r\n        this.resolve = () => { };\r\n        this.promise = new Promise((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     */\r\n    wrapCallback(callback) {\r\n        return (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(() => { });\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}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\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 createMockUserToken(token, projectId) {\r\n    if (token.uid) {\r\n        throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\r\n    }\r\n    // Unsecured JWTs use \"none\" as the algorithm.\r\n    const header = {\r\n        alg: 'none',\r\n        type: 'JWT'\r\n    };\r\n    const project = projectId || 'demo-project';\r\n    const iat = token.iat || 0;\r\n    const sub = token.sub || token.user_id;\r\n    if (!sub) {\r\n        throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\r\n    }\r\n    const payload = Object.assign({ \r\n        // Set all required fields to decent defaults\r\n        iss: `https://securetoken.google.com/${project}`, aud: project, iat, exp: iat + 3600, auth_time: iat, sub, user_id: sub, firebase: {\r\n            sign_in_provider: 'custom',\r\n            identities: {}\r\n        } }, token);\r\n    // Unsecured JWTs use the empty string as a signature.\r\n    const signature = '';\r\n    return [\r\n        base64urlEncodeWithoutPadding(JSON.stringify(header)),\r\n        base64urlEncodeWithoutPadding(JSON.stringify(payload)),\r\n        signature\r\n    ].join('.');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 user agent string\r\n */\r\nfunction getUA() {\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\r\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\r\n * wait for a callback.\r\n */\r\nfunction isMobileCordova() {\r\n    return (typeof window !== 'undefined' &&\r\n        // @ts-ignore Setting up an broadly applicable index signature for Window\r\n        // just to deal with this case would probably be a bad idea.\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 Node.js.\r\n *\r\n * @return true if Node.js environment is detected or specified.\r\n */\r\n// Node detection logic from: https://github.com/iliakan/detect-node/\r\nfunction isNode() {\r\n    var _a;\r\n    const forceEnvironment = (_a = getDefaults()) === null || _a === void 0 ? void 0 : _a.forceEnvironment;\r\n    if (forceEnvironment === 'node') {\r\n        return true;\r\n    }\r\n    else if (forceEnvironment === 'browser') {\r\n        return false;\r\n    }\r\n    try {\r\n        return (Object.prototype.toString.call(global.process) === '[object process]');\r\n    }\r\n    catch (e) {\r\n        return false;\r\n    }\r\n}\r\n/**\r\n * Detect Browser Environment\r\n */\r\nfunction isBrowser() {\r\n    return typeof self === 'object' && self.self === self;\r\n}\r\nfunction isBrowserExtension() {\r\n    const runtime = typeof chrome === 'object'\r\n        ? chrome.runtime\r\n        : typeof browser === 'object'\r\n            ? browser.runtime\r\n            : undefined;\r\n    return typeof runtime === 'object' && runtime.id !== undefined;\r\n}\r\n/**\r\n * Detect React Native.\r\n *\r\n * @return true if ReactNative environment is detected.\r\n */\r\nfunction isReactNative() {\r\n    return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\r\n}\r\n/** Detects Electron apps. */\r\nfunction isElectron() {\r\n    return getUA().indexOf('Electron/') >= 0;\r\n}\r\n/** Detects Internet Explorer. */\r\nfunction isIE() {\r\n    const ua = getUA();\r\n    return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\r\n}\r\n/** Detects Universal Windows Platform apps. */\r\nfunction isUWP() {\r\n    return getUA().indexOf('MSAppHost/') >= 0;\r\n}\r\n/**\r\n * Detect whether the current SDK build is the Node version.\r\n *\r\n * @return true if it's the Node SDK build.\r\n */\r\nfunction isNodeSdk() {\r\n    return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\r\n}\r\n/** Returns true if we are running in Safari. */\r\nfunction isSafari() {\r\n    return (!isNode() &&\r\n        !!navigator.userAgent &&\r\n        navigator.userAgent.includes('Safari') &&\r\n        !navigator.userAgent.includes('Chrome'));\r\n}\r\n/**\r\n * This method checks if indexedDB is supported by current browser/service worker context\r\n * @return true if indexedDB is supported by current browser/service worker context\r\n */\r\nfunction isIndexedDBAvailable() {\r\n    try {\r\n        return typeof indexedDB === 'object';\r\n    }\r\n    catch (e) {\r\n        return false;\r\n    }\r\n}\r\n/**\r\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\r\n * if errors occur during the database open operation.\r\n *\r\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\r\n * private browsing)\r\n */\r\nfunction validateIndexedDBOpenable() {\r\n    return new Promise((resolve, reject) => {\r\n        try {\r\n            let preExist = true;\r\n            const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\r\n            const request = self.indexedDB.open(DB_CHECK_NAME);\r\n            request.onsuccess = () => {\r\n                request.result.close();\r\n                // delete database only when it doesn't pre-exist\r\n                if (!preExist) {\r\n                    self.indexedDB.deleteDatabase(DB_CHECK_NAME);\r\n                }\r\n                resolve(true);\r\n            };\r\n            request.onupgradeneeded = () => {\r\n                preExist = false;\r\n            };\r\n            request.onerror = () => {\r\n                var _a;\r\n                reject(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || '');\r\n            };\r\n        }\r\n        catch (error) {\r\n            reject(error);\r\n        }\r\n    });\r\n}\r\n/**\r\n *\r\n * This method checks whether cookie is enabled within current browser\r\n * @return true if cookie is enabled within current browser\r\n */\r\nfunction areCookiesEnabled() {\r\n    if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\r\n        return false;\r\n    }\r\n    return true;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 Standardized Firebase Error.\r\n *\r\n * Usage:\r\n *\r\n *   // Typescript string literals for type-safe codes\r\n *   type Err =\r\n *     'unknown' |\r\n *     'object-not-found'\r\n *     ;\r\n *\r\n *   // Closure enum for type-safe error codes\r\n *   // at-enum {string}\r\n *   var Err = {\r\n *     UNKNOWN: 'unknown',\r\n *     OBJECT_NOT_FOUND: 'object-not-found',\r\n *   }\r\n *\r\n *   let errors: Map<Err, string> = {\r\n *     'generic-error': \"Unknown error\",\r\n *     'file-not-found': \"Could not find file: {$file}\",\r\n *   };\r\n *\r\n *   // Type-safe function - must pass a valid error code as param.\r\n *   let error = new ErrorFactory<Err>('service', 'Service', errors);\r\n *\r\n *   ...\r\n *   throw error.create(Err.GENERIC);\r\n *   ...\r\n *   throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\r\n *   ...\r\n *   // Service: Could not file file: foo.txt (service/file-not-found).\r\n *\r\n *   catch (e) {\r\n *     assert(e.message === \"Could not find file: foo.txt.\");\r\n *     if ((e as FirebaseError)?.code === 'service/file-not-found') {\r\n *       console.log(\"Could not read file: \" + e['file']);\r\n *     }\r\n *   }\r\n */\r\nconst ERROR_NAME = 'FirebaseError';\r\n// Based on code from:\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\r\nclass FirebaseError extends Error {\r\n    constructor(\r\n    /** The error code for this error. */\r\n    code, message, \r\n    /** Custom data for this error. */\r\n    customData) {\r\n        super(message);\r\n        this.code = code;\r\n        this.customData = customData;\r\n        /** The custom name for all FirebaseErrors. */\r\n        this.name = ERROR_NAME;\r\n        // Fix For ES5\r\n        // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\r\n        Object.setPrototypeOf(this, FirebaseError.prototype);\r\n        // Maintains proper stack trace for where our error was thrown.\r\n        // Only available on V8.\r\n        if (Error.captureStackTrace) {\r\n            Error.captureStackTrace(this, ErrorFactory.prototype.create);\r\n        }\r\n    }\r\n}\r\nclass ErrorFactory {\r\n    constructor(service, serviceName, errors) {\r\n        this.service = service;\r\n        this.serviceName = serviceName;\r\n        this.errors = errors;\r\n    }\r\n    create(code, ...data) {\r\n        const customData = data[0] || {};\r\n        const fullCode = `${this.service}/${code}`;\r\n        const template = this.errors[code];\r\n        const message = template ? replaceTemplate(template, customData) : 'Error';\r\n        // Service Name: Error message (service/code).\r\n        const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\r\n        const error = new FirebaseError(fullCode, fullMessage, customData);\r\n        return error;\r\n    }\r\n}\r\nfunction replaceTemplate(template, data) {\r\n    return template.replace(PATTERN, (_, key) => {\r\n        const value = data[key];\r\n        return value != null ? String(value) : `<${key}?>`;\r\n    });\r\n}\r\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 * @license\r\n * Copyright 2017 Google LLC\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\nconst decode = function (token) {\r\n    let header = {}, claims = {}, data = {}, signature = '';\r\n    try {\r\n        const 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,\r\n        claims,\r\n        data,\r\n        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\nconst isValidTimestamp = function (token) {\r\n    const claims = decode(token).claims;\r\n    const now = Math.floor(new Date().getTime() / 1000);\r\n    let validSince = 0, validUntil = 0;\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 &&\r\n        !!validSince &&\r\n        !!validUntil &&\r\n        now >= validSince &&\r\n        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\nconst issuedAtTime = function (token) {\r\n    const 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.\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\nconst isValidFormat = function (token) {\r\n    const decoded = decode(token), claims = decoded.claims;\r\n    return !!claims && typeof claims === 'object' && 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\nconst isAdmin = function (token) {\r\n    const claims = decode(token).claims;\r\n    return typeof claims === 'object' && claims['admin'] === true;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 contains(obj, key) {\r\n    return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\nfunction safeGet(obj, key) {\r\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n        return obj[key];\r\n    }\r\n    else {\r\n        return undefined;\r\n    }\r\n}\r\nfunction isEmpty(obj) {\r\n    for (const key in obj) {\r\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction map(obj, fn, contextObj) {\r\n    const res = {};\r\n    for (const key in obj) {\r\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n            res[key] = fn.call(contextObj, obj[key], key, obj);\r\n        }\r\n    }\r\n    return res;\r\n}\r\n/**\r\n * Deep equal two objects. Support Arrays and Objects.\r\n */\r\nfunction deepEqual(a, b) {\r\n    if (a === b) {\r\n        return true;\r\n    }\r\n    const aKeys = Object.keys(a);\r\n    const bKeys = Object.keys(b);\r\n    for (const k of aKeys) {\r\n        if (!bKeys.includes(k)) {\r\n            return false;\r\n        }\r\n        const aProp = a[k];\r\n        const bProp = b[k];\r\n        if (isObject(aProp) && isObject(bProp)) {\r\n            if (!deepEqual(aProp, bProp)) {\r\n                return false;\r\n            }\r\n        }\r\n        else if (aProp !== bProp) {\r\n            return false;\r\n        }\r\n    }\r\n    for (const k of bKeys) {\r\n        if (!aKeys.includes(k)) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction isObject(thing) {\r\n    return thing !== null && typeof thing === 'object';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2022 Google LLC\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 * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\r\n * @internal\r\n */\r\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\r\n    const deferredPromise = new Deferred();\r\n    setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\r\n    promise.then(deferredPromise.resolve, deferredPromise.reject);\r\n    return deferredPromise.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\r\n * params object (e.g. {arg: 'val', arg2: 'val2'})\r\n * Note: You must prepend it with ? when adding it to a URL.\r\n */\r\nfunction querystring(querystringParams) {\r\n    const params = [];\r\n    for (const [key, value] of Object.entries(querystringParams)) {\r\n        if (Array.isArray(value)) {\r\n            value.forEach(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\r\n * (e.g. {arg: 'val', arg2: 'val2'})\r\n */\r\nfunction querystringDecode(querystring) {\r\n    const obj = {};\r\n    const tokens = querystring.replace(/^\\?/, '').split('&');\r\n    tokens.forEach(token => {\r\n        if (token) {\r\n            const [key, value] = token.split('=');\r\n            obj[decodeURIComponent(key)] = decodeURIComponent(value);\r\n        }\r\n    });\r\n    return obj;\r\n}\r\n/**\r\n * Extract the query string part of a URL, including the leading question mark (if present).\r\n */\r\nfunction extractQuerystring(url) {\r\n    const queryStart = url.indexOf('?');\r\n    if (!queryStart) {\r\n        return '';\r\n    }\r\n    const fragmentStart = url.indexOf('#', queryStart);\r\n    return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 * @final\r\n * @struct\r\n */\r\nclass Sha1 {\r\n    constructor() {\r\n        /**\r\n         * Holds the previous values of accumulated variables a-e in the compress_\r\n         * function.\r\n         * @private\r\n         */\r\n        this.chain_ = [];\r\n        /**\r\n         * A buffer holding the partially computed hash result.\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         * @private\r\n         */\r\n        this.W_ = [];\r\n        /**\r\n         * Contains data needed to pad messages less than 64 bytes.\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 (let i = 1; i < this.blockSize; ++i) {\r\n            this.pad_[i] = 0;\r\n        }\r\n        this.reset();\r\n    }\r\n    reset() {\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 buf Block to compress.\r\n     * @param offset Offset of the block in the buffer.\r\n     * @private\r\n     */\r\n    compress_(buf, offset) {\r\n        if (!offset) {\r\n            offset = 0;\r\n        }\r\n        const W = this.W_;\r\n        // get 16 big endian words\r\n        if (typeof buf === 'string') {\r\n            for (let 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(offset) << 24) |\r\n                        (buf.charCodeAt(offset + 1) << 16) |\r\n                        (buf.charCodeAt(offset + 2) << 8) |\r\n                        buf.charCodeAt(offset + 3);\r\n                offset += 4;\r\n            }\r\n        }\r\n        else {\r\n            for (let i = 0; i < 16; i++) {\r\n                W[i] =\r\n                    (buf[offset] << 24) |\r\n                        (buf[offset + 1] << 16) |\r\n                        (buf[offset + 2] << 8) |\r\n                        buf[offset + 3];\r\n                offset += 4;\r\n            }\r\n        }\r\n        // expand to 80 words\r\n        for (let i = 16; i < 80; i++) {\r\n            const 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        let a = this.chain_[0];\r\n        let b = this.chain_[1];\r\n        let c = this.chain_[2];\r\n        let d = this.chain_[3];\r\n        let e = this.chain_[4];\r\n        let f, k;\r\n        // TODO(user): Try to unroll this loop to speed up the computation.\r\n        for (let 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            const 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    update(bytes, 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 (length === undefined) {\r\n            length = bytes.length;\r\n        }\r\n        const lengthMinusBlock = length - this.blockSize;\r\n        let n = 0;\r\n        // Using local instead of member variables gives ~5% speedup on Firefox 16.\r\n        const buf = this.buf_;\r\n        let inbuf = this.inbuf_;\r\n        // The outer while loop should execute at most twice.\r\n        while (n < 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 < 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 < 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_ += length;\r\n    }\r\n    /** @override */\r\n    digest() {\r\n        const digest = [];\r\n        let 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 (let 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        let n = 0;\r\n        for (let i = 0; i < 5; i++) {\r\n            for (let 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}\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    const 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\nclass ObserverProxy {\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    constructor(executor, onNoObservers) {\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(() => {\r\n            executor(this);\r\n        })\r\n            .catch(e => {\r\n            this.error(e);\r\n        });\r\n    }\r\n    next(value) {\r\n        this.forEachObserver((observer) => {\r\n            observer.next(value);\r\n        });\r\n    }\r\n    error(error) {\r\n        this.forEachObserver((observer) => {\r\n            observer.error(error);\r\n        });\r\n        this.close(error);\r\n    }\r\n    complete() {\r\n        this.forEachObserver((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    subscribe(nextOrObserver, error, complete) {\r\n        let 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, [\r\n            'next',\r\n            'error',\r\n            'complete'\r\n        ])) {\r\n            observer = nextOrObserver;\r\n        }\r\n        else {\r\n            observer = {\r\n                next: nextOrObserver,\r\n                error,\r\n                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        const 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            // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n            this.task.then(() => {\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    unsubscribeOne(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    forEachObserver(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 (let 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    sendOne(i, fn) {\r\n        // Execute the callback asynchronously\r\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n        this.task.then(() => {\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    close(err) {\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        // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n        this.task.then(() => {\r\n            this.observers = undefined;\r\n            this.onNoObservers = undefined;\r\n        });\r\n    }\r\n}\r\n/** Turn synchronous function into one called asynchronously. */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nfunction async(fn, onError) {\r\n    return (...args) => {\r\n        Promise.resolve(true)\r\n            .then(() => {\r\n            fn(...args);\r\n        })\r\n            .catch((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 (const method of methods) {\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 * @license\r\n * Copyright 2017 Google LLC\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 fnName The function name\r\n * @param minCount The minimum number of arguments to allow for the function call\r\n * @param maxCount The maximum number of argument to allow for the function call\r\n * @param argCount The actual number of arguments provided.\r\n */\r\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\r\n    let 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        const 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 fnName The function name\r\n * @param argName The name of the argument\r\n * @return The prefix to add to the error thrown for validation.\r\n */\r\nfunction errorPrefix(fnName, argName) {\r\n    return `${fnName} failed: ${argName} argument `;\r\n}\r\n/**\r\n * @param fnName\r\n * @param argumentNumber\r\n * @param namespace\r\n * @param optional\r\n */\r\nfunction validateNamespace(fnName, namespace, optional) {\r\n    if (optional && !namespace) {\r\n        return;\r\n    }\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, 'namespace') + 'must be a valid firebase namespace.');\r\n    }\r\n}\r\nfunction validateCallback(fnName, argumentName, \r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\ncallback, optional) {\r\n    if (optional && !callback) {\r\n        return;\r\n    }\r\n    if (typeof callback !== 'function') {\r\n        throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\r\n    }\r\n}\r\nfunction validateContextObject(fnName, argumentName, context, optional) {\r\n    if (optional && !context) {\r\n        return;\r\n    }\r\n    if (typeof context !== 'object' || context === null) {\r\n        throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst stringToByteArray = function (str) {\r\n    const out = [];\r\n    let p = 0;\r\n    for (let i = 0; i < str.length; i++) {\r\n        let c = str.charCodeAt(i);\r\n        // Is this the lead surrogate in a surrogate pair?\r\n        if (c >= 0xd800 && c <= 0xdbff) {\r\n            const high = c - 0xd800; // the high 10 bits.\r\n            i++;\r\n            assert(i < str.length, 'Surrogate pair missing trail surrogate.');\r\n            const 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\nconst stringLength = function (str) {\r\n    let p = 0;\r\n    for (let i = 0; i < str.length; i++) {\r\n        const 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 * @license\r\n * Copyright 2022 Google LLC\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 * Copied from https://stackoverflow.com/a/2117523\r\n * Generates a new uuid.\r\n * @public\r\n */\r\nconst uuidv4 = function () {\r\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n        const r = (Math.random() * 16) | 0, v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n        return v.toString(16);\r\n    });\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 amount of milliseconds to exponentially increase.\r\n */\r\nconst DEFAULT_INTERVAL_MILLIS = 1000;\r\n/**\r\n * The factor to backoff by.\r\n * Should be a number greater than 1.\r\n */\r\nconst DEFAULT_BACKOFF_FACTOR = 2;\r\n/**\r\n * The maximum milliseconds to increase to.\r\n *\r\n * <p>Visible for testing\r\n */\r\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\r\n/**\r\n * The percentage of backoff time to randomize by.\r\n * See\r\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\r\n * for context.\r\n *\r\n * <p>Visible for testing\r\n */\r\nconst RANDOM_FACTOR = 0.5;\r\n/**\r\n * Based on the backoff method from\r\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\r\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\r\n */\r\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\r\n    // Calculates an exponentially increasing value.\r\n    // Deviation: calculates value from count and a constant interval, so we only need to save value\r\n    // and count to restore state.\r\n    const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\r\n    // A random \"fuzz\" to avoid waves of retries.\r\n    // Deviation: randomFactor is required.\r\n    const randomWait = Math.round(\r\n    // A fraction of the backoff value to add/subtract.\r\n    // Deviation: changes multiplication order to improve readability.\r\n    RANDOM_FACTOR *\r\n        currBaseValue *\r\n        // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\r\n        // if we add or subtract.\r\n        (Math.random() - 0.5) *\r\n        2);\r\n    // Limits backoff to max to avoid effectively permanent backoff.\r\n    return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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 * Provide English ordinal letters after a number\r\n */\r\nfunction ordinal(i) {\r\n    if (!Number.isFinite(i)) {\r\n        return `${i}`;\r\n    }\r\n    return i + indicator(i);\r\n}\r\nfunction indicator(i) {\r\n    i = Math.abs(i);\r\n    const cent = i % 100;\r\n    if (cent >= 10 && cent <= 20) {\r\n        return 'th';\r\n    }\r\n    const dec = i % 10;\r\n    if (dec === 1) {\r\n        return 'st';\r\n    }\r\n    if (dec === 2) {\r\n        return 'nd';\r\n    }\r\n    if (dec === 3) {\r\n        return 'rd';\r\n    }\r\n    return 'th';\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\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 getModularInstance(service) {\r\n    if (service && service._delegate) {\r\n        return service._delegate;\r\n    }\r\n    else {\r\n        return service;\r\n    }\r\n}\n\nexport { CONSTANTS, DecodeBase64StringError, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isUWP, isValidFormat, isValidTimestamp, issuedAtTime, jsonEval, map, ordinal, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, uuidv4, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm2017.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\r\n * Component for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass Component {\r\n    /**\r\n     *\r\n     * @param name The public service name, e.g. app, auth, firestore, database\r\n     * @param instanceFactory Service factory responsible for creating the public interface\r\n     * @param type whether the service provided by the component is public or private\r\n     */\r\n    constructor(name, instanceFactory, type) {\r\n        this.name = name;\r\n        this.instanceFactory = instanceFactory;\r\n        this.type = type;\r\n        this.multipleInstances = false;\r\n        /**\r\n         * Properties to be added to the service namespace\r\n         */\r\n        this.serviceProps = {};\r\n        this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\r\n        this.onInstanceCreated = null;\r\n    }\r\n    setInstantiationMode(mode) {\r\n        this.instantiationMode = mode;\r\n        return this;\r\n    }\r\n    setMultipleInstances(multipleInstances) {\r\n        this.multipleInstances = multipleInstances;\r\n        return this;\r\n    }\r\n    setServiceProps(props) {\r\n        this.serviceProps = props;\r\n        return this;\r\n    }\r\n    setInstanceCreatedCallback(callback) {\r\n        this.onInstanceCreated = callback;\r\n        return this;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\r\n * NameServiceMapping[T] is an alias for the type of the instance\r\n */\r\nclass Provider {\r\n    constructor(name, container) {\r\n        this.name = name;\r\n        this.container = container;\r\n        this.component = null;\r\n        this.instances = new Map();\r\n        this.instancesDeferred = new Map();\r\n        this.instancesOptions = new Map();\r\n        this.onInitCallbacks = new Map();\r\n    }\r\n    /**\r\n     * @param identifier A provider can provide mulitple instances of a service\r\n     * if this.component.multipleInstances is true.\r\n     */\r\n    get(identifier) {\r\n        // if multipleInstances is not supported, use the default name\r\n        const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n        if (!this.instancesDeferred.has(normalizedIdentifier)) {\r\n            const deferred = new Deferred();\r\n            this.instancesDeferred.set(normalizedIdentifier, deferred);\r\n            if (this.isInitialized(normalizedIdentifier) ||\r\n                this.shouldAutoInitialize()) {\r\n                // initialize the service if it can be auto-initialized\r\n                try {\r\n                    const instance = this.getOrInitializeService({\r\n                        instanceIdentifier: normalizedIdentifier\r\n                    });\r\n                    if (instance) {\r\n                        deferred.resolve(instance);\r\n                    }\r\n                }\r\n                catch (e) {\r\n                    // when the instance factory throws an exception during get(), it should not cause\r\n                    // a fatal error. We just return the unresolved promise in this case.\r\n                }\r\n            }\r\n        }\r\n        return this.instancesDeferred.get(normalizedIdentifier).promise;\r\n    }\r\n    getImmediate(options) {\r\n        var _a;\r\n        // if multipleInstances is not supported, use the default name\r\n        const normalizedIdentifier = this.normalizeInstanceIdentifier(options === null || options === void 0 ? void 0 : options.identifier);\r\n        const optional = (_a = options === null || options === void 0 ? void 0 : options.optional) !== null && _a !== void 0 ? _a : false;\r\n        if (this.isInitialized(normalizedIdentifier) ||\r\n            this.shouldAutoInitialize()) {\r\n            try {\r\n                return this.getOrInitializeService({\r\n                    instanceIdentifier: normalizedIdentifier\r\n                });\r\n            }\r\n            catch (e) {\r\n                if (optional) {\r\n                    return null;\r\n                }\r\n                else {\r\n                    throw e;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            // In case a component is not initialized and should/can not be auto-initialized at the moment, return null if the optional flag is set, or throw\r\n            if (optional) {\r\n                return null;\r\n            }\r\n            else {\r\n                throw Error(`Service ${this.name} is not available`);\r\n            }\r\n        }\r\n    }\r\n    getComponent() {\r\n        return this.component;\r\n    }\r\n    setComponent(component) {\r\n        if (component.name !== this.name) {\r\n            throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\r\n        }\r\n        if (this.component) {\r\n            throw Error(`Component for ${this.name} has already been provided`);\r\n        }\r\n        this.component = component;\r\n        // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\r\n        if (!this.shouldAutoInitialize()) {\r\n            return;\r\n        }\r\n        // if the service is eager, initialize the default instance\r\n        if (isComponentEager(component)) {\r\n            try {\r\n                this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\r\n            }\r\n            catch (e) {\r\n                // when the instance factory for an eager Component throws an exception during the eager\r\n                // initialization, it should not cause a fatal error.\r\n                // TODO: Investigate if we need to make it configurable, because some component may want to cause\r\n                // a fatal error in this case?\r\n            }\r\n        }\r\n        // Create service instances for the pending promises and resolve them\r\n        // NOTE: if this.multipleInstances is false, only the default instance will be created\r\n        // and all promises with resolve with it regardless of the identifier.\r\n        for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n            const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n            try {\r\n                // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\r\n                const instance = this.getOrInitializeService({\r\n                    instanceIdentifier: normalizedIdentifier\r\n                });\r\n                instanceDeferred.resolve(instance);\r\n            }\r\n            catch (e) {\r\n                // when the instance factory throws an exception, it should not cause\r\n                // a fatal error. We just leave the promise unresolved.\r\n            }\r\n        }\r\n    }\r\n    clearInstance(identifier = DEFAULT_ENTRY_NAME) {\r\n        this.instancesDeferred.delete(identifier);\r\n        this.instancesOptions.delete(identifier);\r\n        this.instances.delete(identifier);\r\n    }\r\n    // app.delete() will call this method on every provider to delete the services\r\n    // TODO: should we mark the provider as deleted?\r\n    async delete() {\r\n        const services = Array.from(this.instances.values());\r\n        await Promise.all([\r\n            ...services\r\n                .filter(service => 'INTERNAL' in service) // legacy services\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .map(service => service.INTERNAL.delete()),\r\n            ...services\r\n                .filter(service => '_delete' in service) // modularized services\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .map(service => service._delete())\r\n        ]);\r\n    }\r\n    isComponentSet() {\r\n        return this.component != null;\r\n    }\r\n    isInitialized(identifier = DEFAULT_ENTRY_NAME) {\r\n        return this.instances.has(identifier);\r\n    }\r\n    getOptions(identifier = DEFAULT_ENTRY_NAME) {\r\n        return this.instancesOptions.get(identifier) || {};\r\n    }\r\n    initialize(opts = {}) {\r\n        const { options = {} } = opts;\r\n        const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\r\n        if (this.isInitialized(normalizedIdentifier)) {\r\n            throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\r\n        }\r\n        if (!this.isComponentSet()) {\r\n            throw Error(`Component ${this.name} has not been registered yet`);\r\n        }\r\n        const instance = this.getOrInitializeService({\r\n            instanceIdentifier: normalizedIdentifier,\r\n            options\r\n        });\r\n        // resolve any pending promise waiting for the service instance\r\n        for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\r\n            const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\r\n            if (normalizedIdentifier === normalizedDeferredIdentifier) {\r\n                instanceDeferred.resolve(instance);\r\n            }\r\n        }\r\n        return instance;\r\n    }\r\n    /**\r\n     *\r\n     * @param callback - a function that will be invoked  after the provider has been initialized by calling provider.initialize().\r\n     * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\r\n     *\r\n     * @param identifier An optional instance identifier\r\n     * @returns a function to unregister the callback\r\n     */\r\n    onInit(callback, identifier) {\r\n        var _a;\r\n        const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\r\n        const existingCallbacks = (_a = this.onInitCallbacks.get(normalizedIdentifier)) !== null && _a !== void 0 ? _a : new Set();\r\n        existingCallbacks.add(callback);\r\n        this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\r\n        const existingInstance = this.instances.get(normalizedIdentifier);\r\n        if (existingInstance) {\r\n            callback(existingInstance, normalizedIdentifier);\r\n        }\r\n        return () => {\r\n            existingCallbacks.delete(callback);\r\n        };\r\n    }\r\n    /**\r\n     * Invoke onInit callbacks synchronously\r\n     * @param instance the service instance`\r\n     */\r\n    invokeOnInitCallbacks(instance, identifier) {\r\n        const callbacks = this.onInitCallbacks.get(identifier);\r\n        if (!callbacks) {\r\n            return;\r\n        }\r\n        for (const callback of callbacks) {\r\n            try {\r\n                callback(instance, identifier);\r\n            }\r\n            catch (_a) {\r\n                // ignore errors in the onInit callback\r\n            }\r\n        }\r\n    }\r\n    getOrInitializeService({ instanceIdentifier, options = {} }) {\r\n        let instance = this.instances.get(instanceIdentifier);\r\n        if (!instance && this.component) {\r\n            instance = this.component.instanceFactory(this.container, {\r\n                instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\r\n                options\r\n            });\r\n            this.instances.set(instanceIdentifier, instance);\r\n            this.instancesOptions.set(instanceIdentifier, options);\r\n            /**\r\n             * Invoke onInit listeners.\r\n             * Note this.component.onInstanceCreated is different, which is used by the component creator,\r\n             * while onInit listeners are registered by consumers of the provider.\r\n             */\r\n            this.invokeOnInitCallbacks(instance, instanceIdentifier);\r\n            /**\r\n             * Order is important\r\n             * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\r\n             * makes `isInitialized()` return true.\r\n             */\r\n            if (this.component.onInstanceCreated) {\r\n                try {\r\n                    this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\r\n                }\r\n                catch (_a) {\r\n                    // ignore errors in the onInstanceCreatedCallback\r\n                }\r\n            }\r\n        }\r\n        return instance || null;\r\n    }\r\n    normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\r\n        if (this.component) {\r\n            return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\r\n        }\r\n        else {\r\n            return identifier; // assume multiple instances are supported before the component is provided.\r\n        }\r\n    }\r\n    shouldAutoInitialize() {\r\n        return (!!this.component &&\r\n            this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\r\n    }\r\n}\r\n// undefined should be passed to the service factory for the default instance\r\nfunction normalizeIdentifierForFactory(identifier) {\r\n    return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\r\n}\r\nfunction isComponentEager(component) {\r\n    return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\r\n */\r\nclass ComponentContainer {\r\n    constructor(name) {\r\n        this.name = name;\r\n        this.providers = new Map();\r\n    }\r\n    /**\r\n     *\r\n     * @param component Component being added\r\n     * @param overwrite When a component with the same name has already been registered,\r\n     * if overwrite is true: overwrite the existing component with the new component and create a new\r\n     * provider with the new component. It can be useful in tests where you want to use different mocks\r\n     * for different tests.\r\n     * if overwrite is false: throw an exception\r\n     */\r\n    addComponent(component) {\r\n        const provider = this.getProvider(component.name);\r\n        if (provider.isComponentSet()) {\r\n            throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\r\n        }\r\n        provider.setComponent(component);\r\n    }\r\n    addOrOverwriteComponent(component) {\r\n        const provider = this.getProvider(component.name);\r\n        if (provider.isComponentSet()) {\r\n            // delete the existing provider from the container, so we can register the new component\r\n            this.providers.delete(component.name);\r\n        }\r\n        this.addComponent(component);\r\n    }\r\n    /**\r\n     * getProvider provides a type safe interface where it can only be called with a field name\r\n     * present in NameServiceMapping interface.\r\n     *\r\n     * Firebase SDKs providing services should extend NameServiceMapping interface to register\r\n     * themselves.\r\n     */\r\n    getProvider(name) {\r\n        if (this.providers.has(name)) {\r\n            return this.providers.get(name);\r\n        }\r\n        // create a Provider for a service that hasn't registered with Firebase\r\n        const provider = new Provider(name, this);\r\n        this.providers.set(name, provider);\r\n        return provider;\r\n    }\r\n    getProviders() {\r\n        return Array.from(this.providers.values());\r\n    }\r\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm2017.js.map\n","/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst 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\nconst levelStringToEnum = {\r\n    'debug': LogLevel.DEBUG,\r\n    'verbose': LogLevel.VERBOSE,\r\n    'info': LogLevel.INFO,\r\n    'warn': LogLevel.WARN,\r\n    'error': LogLevel.ERROR,\r\n    'silent': LogLevel.SILENT\r\n};\r\n/**\r\n * The default log level\r\n */\r\nconst defaultLogLevel = LogLevel.INFO;\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\nconst ConsoleMethod = {\r\n    [LogLevel.DEBUG]: 'log',\r\n    [LogLevel.VERBOSE]: 'log',\r\n    [LogLevel.INFO]: 'info',\r\n    [LogLevel.WARN]: 'warn',\r\n    [LogLevel.ERROR]: 'error'\r\n};\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\nconst defaultLogHandler = (instance, logType, ...args) => {\r\n    if (logType < instance.logLevel) {\r\n        return;\r\n    }\r\n    const now = new Date().toISOString();\r\n    const method = ConsoleMethod[logType];\r\n    if (method) {\r\n        console[method](`[${now}]  ${instance.name}:`, ...args);\r\n    }\r\n    else {\r\n        throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\r\n    }\r\n};\r\nclass Logger {\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    constructor(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 main (internal) log handler for the Logger instance.\r\n         * Can be set to a new function in internal package code but not by user.\r\n         */\r\n        this._logHandler = defaultLogHandler;\r\n        /**\r\n         * The optional, additional, user-defined log handler for the Logger instance.\r\n         */\r\n        this._userLogHandler = null;\r\n        /**\r\n         * Capture the current instance for later use\r\n         */\r\n        instances.push(this);\r\n    }\r\n    get logLevel() {\r\n        return this._logLevel;\r\n    }\r\n    set logLevel(val) {\r\n        if (!(val in LogLevel)) {\r\n            throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\r\n        }\r\n        this._logLevel = val;\r\n    }\r\n    // Workaround for setter/getter having to be the same type.\r\n    setLogLevel(val) {\r\n        this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\r\n    }\r\n    get logHandler() {\r\n        return this._logHandler;\r\n    }\r\n    set logHandler(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    get userLogHandler() {\r\n        return this._userLogHandler;\r\n    }\r\n    set userLogHandler(val) {\r\n        this._userLogHandler = val;\r\n    }\r\n    /**\r\n     * The functions below are all based on the `console` interface\r\n     */\r\n    debug(...args) {\r\n        this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\r\n        this._logHandler(this, LogLevel.DEBUG, ...args);\r\n    }\r\n    log(...args) {\r\n        this._userLogHandler &&\r\n            this._userLogHandler(this, LogLevel.VERBOSE, ...args);\r\n        this._logHandler(this, LogLevel.VERBOSE, ...args);\r\n    }\r\n    info(...args) {\r\n        this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\r\n        this._logHandler(this, LogLevel.INFO, ...args);\r\n    }\r\n    warn(...args) {\r\n        this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\r\n        this._logHandler(this, LogLevel.WARN, ...args);\r\n    }\r\n    error(...args) {\r\n        this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\r\n        this._logHandler(this, LogLevel.ERROR, ...args);\r\n    }\r\n}\r\nfunction setLogLevel(level) {\r\n    instances.forEach(inst => {\r\n        inst.setLogLevel(level);\r\n    });\r\n}\r\nfunction setUserLogHandler(logCallback, options) {\r\n    for (const instance of instances) {\r\n        let customLogLevel = null;\r\n        if (options && options.level) {\r\n            customLogLevel = levelStringToEnum[options.level];\r\n        }\r\n        if (logCallback === null) {\r\n            instance.userLogHandler = null;\r\n        }\r\n        else {\r\n            instance.userLogHandler = (instance, level, ...args) => {\r\n                const message = args\r\n                    .map(arg => {\r\n                    if (arg == null) {\r\n                        return null;\r\n                    }\r\n                    else if (typeof arg === 'string') {\r\n                        return arg;\r\n                    }\r\n                    else if (typeof arg === 'number' || typeof arg === 'boolean') {\r\n                        return arg.toString();\r\n                    }\r\n                    else if (arg instanceof Error) {\r\n                        return arg.message;\r\n                    }\r\n                    else {\r\n                        try {\r\n                            return JSON.stringify(arg);\r\n                        }\r\n                        catch (ignored) {\r\n                            return null;\r\n                        }\r\n                    }\r\n                })\r\n                    .filter(arg => arg)\r\n                    .join(' ');\r\n                if (level >= (customLogLevel !== null && customLogLevel !== void 0 ? customLogLevel : instance.logLevel)) {\r\n                    logCallback({\r\n                        level: LogLevel[level].toLowerCase(),\r\n                        message,\r\n                        args,\r\n                        type: instance.name\r\n                    });\r\n                }\r\n            };\r\n        }\r\n    }\r\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm2017.js.map\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n    return (idbProxyableTypes ||\n        (idbProxyableTypes = [\n            IDBDatabase,\n            IDBObjectStore,\n            IDBIndex,\n            IDBCursor,\n            IDBTransaction,\n        ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n    return (cursorAdvanceMethods ||\n        (cursorAdvanceMethods = [\n            IDBCursor.prototype.advance,\n            IDBCursor.prototype.continue,\n            IDBCursor.prototype.continuePrimaryKey,\n        ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n    const promise = new Promise((resolve, reject) => {\n        const unlisten = () => {\n            request.removeEventListener('success', success);\n            request.removeEventListener('error', error);\n        };\n        const success = () => {\n            resolve(wrap(request.result));\n            unlisten();\n        };\n        const error = () => {\n            reject(request.error);\n            unlisten();\n        };\n        request.addEventListener('success', success);\n        request.addEventListener('error', error);\n    });\n    promise\n        .then((value) => {\n        // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n        // (see wrapFunction).\n        if (value instanceof IDBCursor) {\n            cursorRequestMap.set(value, request);\n        }\n        // Catching to avoid \"Uncaught Promise exceptions\"\n    })\n        .catch(() => { });\n    // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n    // is because we create many promises from a single IDBRequest.\n    reverseTransformCache.set(promise, request);\n    return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n    // Early bail if we've already created a done promise for this transaction.\n    if (transactionDoneMap.has(tx))\n        return;\n    const done = new Promise((resolve, reject) => {\n        const unlisten = () => {\n            tx.removeEventListener('complete', complete);\n            tx.removeEventListener('error', error);\n            tx.removeEventListener('abort', error);\n        };\n        const complete = () => {\n            resolve();\n            unlisten();\n        };\n        const error = () => {\n            reject(tx.error || new DOMException('AbortError', 'AbortError'));\n            unlisten();\n        };\n        tx.addEventListener('complete', complete);\n        tx.addEventListener('error', error);\n        tx.addEventListener('abort', error);\n    });\n    // Cache it for later retrieval.\n    transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n    get(target, prop, receiver) {\n        if (target instanceof IDBTransaction) {\n            // Special handling for transaction.done.\n            if (prop === 'done')\n                return transactionDoneMap.get(target);\n            // Polyfill for objectStoreNames because of Edge.\n            if (prop === 'objectStoreNames') {\n                return target.objectStoreNames || transactionStoreNamesMap.get(target);\n            }\n            // Make tx.store return the only store in the transaction, or undefined if there are many.\n            if (prop === 'store') {\n                return receiver.objectStoreNames[1]\n                    ? undefined\n                    : receiver.objectStore(receiver.objectStoreNames[0]);\n            }\n        }\n        // Else transform whatever we get back.\n        return wrap(target[prop]);\n    },\n    set(target, prop, value) {\n        target[prop] = value;\n        return true;\n    },\n    has(target, prop) {\n        if (target instanceof IDBTransaction &&\n            (prop === 'done' || prop === 'store')) {\n            return true;\n        }\n        return prop in target;\n    },\n};\nfunction replaceTraps(callback) {\n    idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n    // Due to expected object equality (which is enforced by the caching in `wrap`), we\n    // only create one new func per func.\n    // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n    if (func === IDBDatabase.prototype.transaction &&\n        !('objectStoreNames' in IDBTransaction.prototype)) {\n        return function (storeNames, ...args) {\n            const tx = func.call(unwrap(this), storeNames, ...args);\n            transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n            return wrap(tx);\n        };\n    }\n    // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n    // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n    // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n    // with real promises, so each advance methods returns a new promise for the cursor object, or\n    // undefined if the end of the cursor has been reached.\n    if (getCursorAdvanceMethods().includes(func)) {\n        return function (...args) {\n            // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n            // the original object.\n            func.apply(unwrap(this), args);\n            return wrap(cursorRequestMap.get(this));\n        };\n    }\n    return function (...args) {\n        // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n        // the original object.\n        return wrap(func.apply(unwrap(this), args));\n    };\n}\nfunction transformCachableValue(value) {\n    if (typeof value === 'function')\n        return wrapFunction(value);\n    // This doesn't return, it just creates a 'done' promise for the transaction,\n    // which is later returned for transaction.done (see idbObjectHandler).\n    if (value instanceof IDBTransaction)\n        cacheDonePromiseForTransaction(value);\n    if (instanceOfAny(value, getIdbProxyableTypes()))\n        return new Proxy(value, idbProxyTraps);\n    // Return the same value back if we're not going to transform it.\n    return value;\n}\nfunction wrap(value) {\n    // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n    // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n    if (value instanceof IDBRequest)\n        return promisifyRequest(value);\n    // If we've already transformed this value before, reuse the transformed value.\n    // This is faster, but it also provides object equality.\n    if (transformCache.has(value))\n        return transformCache.get(value);\n    const newValue = transformCachableValue(value);\n    // Not all types are transformed.\n    // These may be primitive types, so they can't be WeakMap keys.\n    if (newValue !== value) {\n        transformCache.set(value, newValue);\n        reverseTransformCache.set(newValue, value);\n    }\n    return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n    const request = indexedDB.open(name, version);\n    const openPromise = wrap(request);\n    if (upgrade) {\n        request.addEventListener('upgradeneeded', (event) => {\n            upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n        });\n    }\n    if (blocked) {\n        request.addEventListener('blocked', (event) => blocked(\n        // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n        event.oldVersion, event.newVersion, event));\n    }\n    openPromise\n        .then((db) => {\n        if (terminated)\n            db.addEventListener('close', () => terminated());\n        if (blocking) {\n            db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n        }\n    })\n        .catch(() => { });\n    return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n    const request = indexedDB.deleteDatabase(name);\n    if (blocked) {\n        request.addEventListener('blocked', (event) => blocked(\n        // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n        event.oldVersion, event));\n    }\n    return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n    if (!(target instanceof IDBDatabase &&\n        !(prop in target) &&\n        typeof prop === 'string')) {\n        return;\n    }\n    if (cachedMethods.get(prop))\n        return cachedMethods.get(prop);\n    const targetFuncName = prop.replace(/FromIndex$/, '');\n    const useIndex = prop !== targetFuncName;\n    const isWrite = writeMethods.includes(targetFuncName);\n    if (\n    // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n    !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n        !(isWrite || readMethods.includes(targetFuncName))) {\n        return;\n    }\n    const method = async function (storeName, ...args) {\n        // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n        const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n        let target = tx.store;\n        if (useIndex)\n            target = target.index(args.shift());\n        // Must reject if op rejects.\n        // If it's a write operation, must reject if tx.done rejects.\n        // Must reject with op rejection first.\n        // Must resolve with op value.\n        // Must handle both promises (no unhandled rejections)\n        return (await Promise.all([\n            target[targetFuncName](...args),\n            isWrite && tx.done,\n        ]))[0];\n    };\n    cachedMethods.set(prop, method);\n    return method;\n}\nreplaceTraps((oldTraps) => ({\n    ...oldTraps,\n    get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n    has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, getDefaultAppConfig, deepEqual, isBrowser, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nclass PlatformLoggerServiceImpl {\r\n    constructor(container) {\r\n        this.container = container;\r\n    }\r\n    // In initial implementation, this will be called by installations on\r\n    // auth token refresh, and installations will send this string.\r\n    getPlatformInfoString() {\r\n        const providers = this.container.getProviders();\r\n        // Loop through providers and get library/version pairs from any that are\r\n        // version components.\r\n        return providers\r\n            .map(provider => {\r\n            if (isVersionServiceProvider(provider)) {\r\n                const service = provider.getImmediate();\r\n                return `${service.library}/${service.version}`;\r\n            }\r\n            else {\r\n                return null;\r\n            }\r\n        })\r\n            .filter(logString => logString)\r\n            .join(' ');\r\n    }\r\n}\r\n/**\r\n *\r\n * @param provider check if this provider provides a VersionService\r\n *\r\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\r\n * provides VersionService. The provider is not necessarily a 'app-version'\r\n * provider.\r\n */\r\nfunction isVersionServiceProvider(provider) {\r\n    const component = provider.getComponent();\r\n    return (component === null || component === void 0 ? void 0 : component.type) === \"VERSION\" /* ComponentType.VERSION */;\r\n}\n\nconst name$p = \"@firebase/app\";\nconst version$1 = \"0.10.5\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst logger = new Logger('@firebase/app');\n\nconst name$o = \"@firebase/app-compat\";\n\nconst name$n = \"@firebase/analytics-compat\";\n\nconst name$m = \"@firebase/analytics\";\n\nconst name$l = \"@firebase/app-check-compat\";\n\nconst name$k = \"@firebase/app-check\";\n\nconst name$j = \"@firebase/auth\";\n\nconst name$i = \"@firebase/auth-compat\";\n\nconst name$h = \"@firebase/database\";\n\nconst name$g = \"@firebase/database-compat\";\n\nconst name$f = \"@firebase/functions\";\n\nconst name$e = \"@firebase/functions-compat\";\n\nconst name$d = \"@firebase/installations\";\n\nconst name$c = \"@firebase/installations-compat\";\n\nconst name$b = \"@firebase/messaging\";\n\nconst name$a = \"@firebase/messaging-compat\";\n\nconst name$9 = \"@firebase/performance\";\n\nconst name$8 = \"@firebase/performance-compat\";\n\nconst name$7 = \"@firebase/remote-config\";\n\nconst name$6 = \"@firebase/remote-config-compat\";\n\nconst name$5 = \"@firebase/storage\";\n\nconst name$4 = \"@firebase/storage-compat\";\n\nconst name$3 = \"@firebase/firestore\";\n\nconst name$2 = \"@firebase/vertexai-preview\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"10.12.2\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 default app name\r\n *\r\n * @internal\r\n */\r\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\r\nconst PLATFORM_LOG_STRING = {\r\n    [name$p]: 'fire-core',\r\n    [name$o]: 'fire-core-compat',\r\n    [name$m]: 'fire-analytics',\r\n    [name$n]: 'fire-analytics-compat',\r\n    [name$k]: 'fire-app-check',\r\n    [name$l]: 'fire-app-check-compat',\r\n    [name$j]: 'fire-auth',\r\n    [name$i]: 'fire-auth-compat',\r\n    [name$h]: 'fire-rtdb',\r\n    [name$g]: 'fire-rtdb-compat',\r\n    [name$f]: 'fire-fn',\r\n    [name$e]: 'fire-fn-compat',\r\n    [name$d]: 'fire-iid',\r\n    [name$c]: 'fire-iid-compat',\r\n    [name$b]: 'fire-fcm',\r\n    [name$a]: 'fire-fcm-compat',\r\n    [name$9]: 'fire-perf',\r\n    [name$8]: 'fire-perf-compat',\r\n    [name$7]: 'fire-rc',\r\n    [name$6]: 'fire-rc-compat',\r\n    [name$5]: 'fire-gcs',\r\n    [name$4]: 'fire-gcs-compat',\r\n    [name$3]: 'fire-fst',\r\n    [name$1]: 'fire-fst-compat',\r\n    [name$2]: 'fire-vertex',\r\n    'fire-js': 'fire-js',\r\n    [name]: 'fire-js-all'\r\n};\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\r\n */\r\nconst _apps = new Map();\r\n/**\r\n * @internal\r\n */\r\nconst _serverApps = new Map();\r\n/**\r\n * Registered components.\r\n *\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst _components = new Map();\r\n/**\r\n * @param component - the component being added to this app's container\r\n *\r\n * @internal\r\n */\r\nfunction _addComponent(app, component) {\r\n    try {\r\n        app.container.addComponent(component);\r\n    }\r\n    catch (e) {\r\n        logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\r\n    }\r\n}\r\n/**\r\n *\r\n * @internal\r\n */\r\nfunction _addOrOverwriteComponent(app, component) {\r\n    app.container.addOrOverwriteComponent(component);\r\n}\r\n/**\r\n *\r\n * @param component - the component to register\r\n * @returns whether or not the component is registered successfully\r\n *\r\n * @internal\r\n */\r\nfunction _registerComponent(component) {\r\n    const componentName = component.name;\r\n    if (_components.has(componentName)) {\r\n        logger.debug(`There were multiple attempts to register component ${componentName}.`);\r\n        return false;\r\n    }\r\n    _components.set(componentName, component);\r\n    // add the component to existing app instances\r\n    for (const app of _apps.values()) {\r\n        _addComponent(app, component);\r\n    }\r\n    for (const serverApp of _serverApps.values()) {\r\n        _addComponent(serverApp, component);\r\n    }\r\n    return true;\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n *\r\n * @returns the provider for the service with the matching name\r\n *\r\n * @internal\r\n */\r\nfunction _getProvider(app, name) {\r\n    const heartbeatController = app.container\r\n        .getProvider('heartbeat')\r\n        .getImmediate({ optional: true });\r\n    if (heartbeatController) {\r\n        void heartbeatController.triggerHeartbeat();\r\n    }\r\n    return app.container.getProvider(name);\r\n}\r\n/**\r\n *\r\n * @param app - FirebaseApp instance\r\n * @param name - service name\r\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\r\n *\r\n * @internal\r\n */\r\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\r\n    _getProvider(app, name).clearInstance(instanceIdentifier);\r\n}\r\n/**\r\n *\r\n * @param obj - an object of type FirebaseApp or FirebaseOptions.\r\n *\r\n * @returns true if the provide object is of type FirebaseApp.\r\n *\r\n * @internal\r\n */\r\nfunction _isFirebaseApp(obj) {\r\n    return obj.options !== undefined;\r\n}\r\n/**\r\n *\r\n * @param obj - an object of type FirebaseApp.\r\n *\r\n * @returns true if the provided object is of type FirebaseServerAppImpl.\r\n *\r\n * @internal\r\n */\r\nfunction _isFirebaseServerApp(obj) {\r\n    return obj.settings !== undefined;\r\n}\r\n/**\r\n * Test only\r\n *\r\n * @internal\r\n */\r\nfunction _clearComponents() {\r\n    _components.clear();\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst ERRORS = {\r\n    [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\r\n        'call initializeApp() first',\r\n    [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}'\",\r\n    [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\r\n    [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\r\n    [\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */]: 'Firebase Server App has been deleted',\r\n    [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\r\n    [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\r\n        'Firebase App instance.',\r\n    [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\r\n    [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\r\n    [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\r\n    [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\r\n    [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.',\r\n    [\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */]: 'FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.',\r\n    [\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */]: 'FirebaseServerApp is not for use in browser environments.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nclass FirebaseAppImpl {\r\n    constructor(options, config, container) {\r\n        this._isDeleted = false;\r\n        this._options = Object.assign({}, options);\r\n        this._config = Object.assign({}, config);\r\n        this._name = config.name;\r\n        this._automaticDataCollectionEnabled =\r\n            config.automaticDataCollectionEnabled;\r\n        this._container = container;\r\n        this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n    }\r\n    get automaticDataCollectionEnabled() {\r\n        this.checkDestroyed();\r\n        return this._automaticDataCollectionEnabled;\r\n    }\r\n    set automaticDataCollectionEnabled(val) {\r\n        this.checkDestroyed();\r\n        this._automaticDataCollectionEnabled = val;\r\n    }\r\n    get name() {\r\n        this.checkDestroyed();\r\n        return this._name;\r\n    }\r\n    get options() {\r\n        this.checkDestroyed();\r\n        return this._options;\r\n    }\r\n    get config() {\r\n        this.checkDestroyed();\r\n        return this._config;\r\n    }\r\n    get container() {\r\n        return this._container;\r\n    }\r\n    get isDeleted() {\r\n        return this._isDeleted;\r\n    }\r\n    set isDeleted(val) {\r\n        this._isDeleted = val;\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    checkDestroyed() {\r\n        if (this.isDeleted) {\r\n            throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\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\nclass FirebaseServerAppImpl extends FirebaseAppImpl {\r\n    constructor(options, serverConfig, name, container) {\r\n        // Build configuration parameters for the FirebaseAppImpl base class.\r\n        const automaticDataCollectionEnabled = serverConfig.automaticDataCollectionEnabled !== undefined\r\n            ? serverConfig.automaticDataCollectionEnabled\r\n            : false;\r\n        // Create the FirebaseAppSettings object for the FirebaseAppImp constructor.\r\n        const config = {\r\n            name,\r\n            automaticDataCollectionEnabled\r\n        };\r\n        if (options.apiKey !== undefined) {\r\n            // Construct the parent FirebaseAppImp object.\r\n            super(options, config, container);\r\n        }\r\n        else {\r\n            const appImpl = options;\r\n            super(appImpl.options, config, container);\r\n        }\r\n        // Now construct the data for the FirebaseServerAppImpl.\r\n        this._serverConfig = Object.assign({ automaticDataCollectionEnabled }, serverConfig);\r\n        this._finalizationRegistry = new FinalizationRegistry(() => {\r\n            this.automaticCleanup();\r\n        });\r\n        this._refCount = 0;\r\n        this.incRefCount(this._serverConfig.releaseOnDeref);\r\n        // Do not retain a hard reference to the dref object, otherwise the FinalizationRegisry\r\n        // will never trigger.\r\n        this._serverConfig.releaseOnDeref = undefined;\r\n        serverConfig.releaseOnDeref = undefined;\r\n        registerVersion(name$p, version$1, 'serverapp');\r\n    }\r\n    toJSON() {\r\n        return undefined;\r\n    }\r\n    get refCount() {\r\n        return this._refCount;\r\n    }\r\n    // Increment the reference count of this server app. If an object is provided, register it\r\n    // with the finalization registry.\r\n    incRefCount(obj) {\r\n        if (this.isDeleted) {\r\n            return;\r\n        }\r\n        this._refCount++;\r\n        if (obj !== undefined) {\r\n            this._finalizationRegistry.register(obj, this);\r\n        }\r\n    }\r\n    // Decrement the reference count.\r\n    decRefCount() {\r\n        if (this.isDeleted) {\r\n            return 0;\r\n        }\r\n        return --this._refCount;\r\n    }\r\n    // Invoked by the FinalizationRegistry callback to note that this app should go through its\r\n    // reference counts and delete itself if no reference count remain. The coordinating logic that\r\n    // handles this is in deleteApp(...).\r\n    automaticCleanup() {\r\n        void deleteApp(this);\r\n    }\r\n    get settings() {\r\n        this.checkDestroyed();\r\n        return this._serverConfig;\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    checkDestroyed() {\r\n        if (this.isDeleted) {\r\n            throw ERROR_FACTORY.create(\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */);\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 current SDK version.\r\n *\r\n * @public\r\n */\r\nconst SDK_VERSION = version;\r\nfunction initializeApp(_options, rawConfig = {}) {\r\n    let options = _options;\r\n    if (typeof rawConfig !== 'object') {\r\n        const name = rawConfig;\r\n        rawConfig = { name };\r\n    }\r\n    const config = Object.assign({ name: DEFAULT_ENTRY_NAME, automaticDataCollectionEnabled: false }, rawConfig);\r\n    const name = config.name;\r\n    if (typeof name !== 'string' || !name) {\r\n        throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\r\n            appName: String(name)\r\n        });\r\n    }\r\n    options || (options = getDefaultAppConfig());\r\n    if (!options) {\r\n        throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\r\n    }\r\n    const existingApp = _apps.get(name);\r\n    if (existingApp) {\r\n        // return the existing app if options and config deep equal the ones in the existing app.\r\n        if (deepEqual(options, existingApp.options) &&\r\n            deepEqual(config, existingApp.config)) {\r\n            return existingApp;\r\n        }\r\n        else {\r\n            throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\r\n        }\r\n    }\r\n    const container = new ComponentContainer(name);\r\n    for (const component of _components.values()) {\r\n        container.addComponent(component);\r\n    }\r\n    const newApp = new FirebaseAppImpl(options, config, container);\r\n    _apps.set(name, newApp);\r\n    return newApp;\r\n}\r\nfunction initializeServerApp(_options, _serverAppConfig) {\r\n    if (isBrowser()) {\r\n        // FirebaseServerApp isn't designed to be run in browsers.\r\n        throw ERROR_FACTORY.create(\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */);\r\n    }\r\n    if (_serverAppConfig.automaticDataCollectionEnabled === undefined) {\r\n        _serverAppConfig.automaticDataCollectionEnabled = false;\r\n    }\r\n    let appOptions;\r\n    if (_isFirebaseApp(_options)) {\r\n        appOptions = _options.options;\r\n    }\r\n    else {\r\n        appOptions = _options;\r\n    }\r\n    // Build an app name based on a hash of the configuration options.\r\n    const nameObj = Object.assign(Object.assign({}, _serverAppConfig), appOptions);\r\n    // However, Do not mangle the name based on releaseOnDeref, since it will vary between the\r\n    // construction of FirebaseServerApp instances. For example, if the object is the request headers.\r\n    if (nameObj.releaseOnDeref !== undefined) {\r\n        delete nameObj.releaseOnDeref;\r\n    }\r\n    const hashCode = (s) => {\r\n        return [...s].reduce((hash, c) => (Math.imul(31, hash) + c.charCodeAt(0)) | 0, 0);\r\n    };\r\n    if (_serverAppConfig.releaseOnDeref !== undefined) {\r\n        if (typeof FinalizationRegistry === 'undefined') {\r\n            throw ERROR_FACTORY.create(\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */, {});\r\n        }\r\n    }\r\n    const nameString = '' + hashCode(JSON.stringify(nameObj));\r\n    const existingApp = _serverApps.get(nameString);\r\n    if (existingApp) {\r\n        existingApp.incRefCount(_serverAppConfig.releaseOnDeref);\r\n        return existingApp;\r\n    }\r\n    const container = new ComponentContainer(nameString);\r\n    for (const component of _components.values()) {\r\n        container.addComponent(component);\r\n    }\r\n    const newApp = new FirebaseServerAppImpl(appOptions, _serverAppConfig, nameString, container);\r\n    _serverApps.set(nameString, newApp);\r\n    return newApp;\r\n}\r\n/**\r\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * When called with no arguments, the default app is returned. When an app name\r\n * is provided, the app corresponding to that name is returned.\r\n *\r\n * An exception is thrown if the app being retrieved has not yet been\r\n * initialized.\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return the default app\r\n * const app = getApp();\r\n * ```\r\n *\r\n * @example\r\n * ```javascript\r\n * // Return a named app\r\n * const otherApp = getApp(\"otherApp\");\r\n * ```\r\n *\r\n * @param name - Optional name of the app to return. If no name is\r\n *   provided, the default is `\"[DEFAULT]\"`.\r\n *\r\n * @returns The app corresponding to the provided app name.\r\n *   If no app name is provided, the default app is returned.\r\n *\r\n * @public\r\n */\r\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\r\n    const app = _apps.get(name);\r\n    if (!app && name === DEFAULT_ENTRY_NAME && getDefaultAppConfig()) {\r\n        return initializeApp();\r\n    }\r\n    if (!app) {\r\n        throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\r\n    }\r\n    return app;\r\n}\r\n/**\r\n * A (read-only) array of all initialized apps.\r\n * @public\r\n */\r\nfunction getApps() {\r\n    return Array.from(_apps.values());\r\n}\r\n/**\r\n * Renders this app unusable and frees the resources of all associated\r\n * services.\r\n *\r\n * @example\r\n * ```javascript\r\n * deleteApp(app)\r\n *   .then(function() {\r\n *     console.log(\"App deleted successfully\");\r\n *   })\r\n *   .catch(function(error) {\r\n *     console.log(\"Error deleting app:\", error);\r\n *   });\r\n * ```\r\n *\r\n * @public\r\n */\r\nasync function deleteApp(app) {\r\n    let cleanupProviders = false;\r\n    const name = app.name;\r\n    if (_apps.has(name)) {\r\n        cleanupProviders = true;\r\n        _apps.delete(name);\r\n    }\r\n    else if (_serverApps.has(name)) {\r\n        const firebaseServerApp = app;\r\n        if (firebaseServerApp.decRefCount() <= 0) {\r\n            _serverApps.delete(name);\r\n            cleanupProviders = true;\r\n        }\r\n    }\r\n    if (cleanupProviders) {\r\n        await Promise.all(app.container\r\n            .getProviders()\r\n            .map(provider => provider.delete()));\r\n        app.isDeleted = true;\r\n    }\r\n}\r\n/**\r\n * Registers a library's name and version for platform logging purposes.\r\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\r\n * @param version - Current version of that library.\r\n * @param variant - Bundle variant, e.g., node, rn, etc.\r\n *\r\n * @public\r\n */\r\nfunction registerVersion(libraryKeyOrName, version, variant) {\r\n    var _a;\r\n    // TODO: We can use this check to whitelist strings when/if we set up\r\n    // a good whitelist system.\r\n    let library = (_a = PLATFORM_LOG_STRING[libraryKeyOrName]) !== null && _a !== void 0 ? _a : libraryKeyOrName;\r\n    if (variant) {\r\n        library += `-${variant}`;\r\n    }\r\n    const libraryMismatch = library.match(/\\s|\\//);\r\n    const versionMismatch = version.match(/\\s|\\//);\r\n    if (libraryMismatch || versionMismatch) {\r\n        const warning = [\r\n            `Unable to register library \"${library}\" with version \"${version}\":`\r\n        ];\r\n        if (libraryMismatch) {\r\n            warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\r\n        }\r\n        if (libraryMismatch && versionMismatch) {\r\n            warning.push('and');\r\n        }\r\n        if (versionMismatch) {\r\n            warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\r\n        }\r\n        logger.warn(warning.join(' '));\r\n        return;\r\n    }\r\n    _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\r\n}\r\n/**\r\n * Sets log handler for all Firebase SDKs.\r\n * @param logCallback - An optional custom log handler that executes user code whenever\r\n * the Firebase SDK makes a logging call.\r\n *\r\n * @public\r\n */\r\nfunction onLog(logCallback, options) {\r\n    if (logCallback !== null && typeof logCallback !== 'function') {\r\n        throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\r\n    }\r\n    setUserLogHandler(logCallback, options);\r\n}\r\n/**\r\n * Sets log level for all Firebase SDKs.\r\n *\r\n * All of the log types above the current log level are captured (i.e. if\r\n * you set the log level to `info`, errors are logged, but `debug` and\r\n * `verbose` logs are not).\r\n *\r\n * @public\r\n */\r\nfunction setLogLevel(logLevel) {\r\n    setLogLevel$1(logLevel);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\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\nconst DB_NAME = 'firebase-heartbeat-database';\r\nconst DB_VERSION = 1;\r\nconst STORE_NAME = 'firebase-heartbeat-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n    if (!dbPromise) {\r\n        dbPromise = openDB(DB_NAME, DB_VERSION, {\r\n            upgrade: (db, oldVersion) => {\r\n                // We don't use 'break' in this switch statement, the fall-through\r\n                // behavior is what we want, because if there are multiple versions between\r\n                // the old version and the current version, we want ALL the migrations\r\n                // that correspond to those versions to run, not only the last one.\r\n                // eslint-disable-next-line default-case\r\n                switch (oldVersion) {\r\n                    case 0:\r\n                        try {\r\n                            db.createObjectStore(STORE_NAME);\r\n                        }\r\n                        catch (e) {\r\n                            // Safari/iOS browsers throw occasional exceptions on\r\n                            // db.createObjectStore() that may be a bug. Avoid blocking\r\n                            // the rest of the app functionality.\r\n                            console.warn(e);\r\n                        }\r\n                }\r\n            }\r\n        }).catch(e => {\r\n            throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\r\n                originalErrorMessage: e.message\r\n            });\r\n        });\r\n    }\r\n    return dbPromise;\r\n}\r\nasync function readHeartbeatsFromIndexedDB(app) {\r\n    try {\r\n        const db = await getDbPromise();\r\n        const tx = db.transaction(STORE_NAME);\r\n        const result = await tx.objectStore(STORE_NAME).get(computeKey(app));\r\n        // We already have the value but tx.done can throw,\r\n        // so we need to await it here to catch errors\r\n        await tx.done;\r\n        return result;\r\n    }\r\n    catch (e) {\r\n        if (e instanceof FirebaseError) {\r\n            logger.warn(e.message);\r\n        }\r\n        else {\r\n            const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\r\n                originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n            });\r\n            logger.warn(idbGetError.message);\r\n        }\r\n    }\r\n}\r\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\r\n    try {\r\n        const db = await getDbPromise();\r\n        const tx = db.transaction(STORE_NAME, 'readwrite');\r\n        const objectStore = tx.objectStore(STORE_NAME);\r\n        await objectStore.put(heartbeatObject, computeKey(app));\r\n        await tx.done;\r\n    }\r\n    catch (e) {\r\n        if (e instanceof FirebaseError) {\r\n            logger.warn(e.message);\r\n        }\r\n        else {\r\n            const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\r\n                originalErrorMessage: e === null || e === void 0 ? void 0 : e.message\r\n            });\r\n            logger.warn(idbGetError.message);\r\n        }\r\n    }\r\n}\r\nfunction computeKey(app) {\r\n    return `${app.name}!${app.options.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\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\nconst MAX_HEADER_BYTES = 1024;\r\n// 30 days\r\nconst STORED_HEARTBEAT_RETENTION_MAX_MILLIS = 30 * 24 * 60 * 60 * 1000;\r\nclass HeartbeatServiceImpl {\r\n    constructor(container) {\r\n        this.container = container;\r\n        /**\r\n         * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\r\n         * the header string.\r\n         * Stores one record per date. This will be consolidated into the standard\r\n         * format of one record per user agent string before being sent as a header.\r\n         * Populated from indexedDB when the controller is instantiated and should\r\n         * be kept in sync with indexedDB.\r\n         * Leave public for easier testing.\r\n         */\r\n        this._heartbeatsCache = null;\r\n        const app = this.container.getProvider('app').getImmediate();\r\n        this._storage = new HeartbeatStorageImpl(app);\r\n        this._heartbeatsCachePromise = this._storage.read().then(result => {\r\n            this._heartbeatsCache = result;\r\n            return result;\r\n        });\r\n    }\r\n    /**\r\n     * Called to report a heartbeat. The function will generate\r\n     * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\r\n     * to IndexedDB.\r\n     * Note that we only store one heartbeat per day. So if a heartbeat for today is\r\n     * already logged, subsequent calls to this function in the same day will be ignored.\r\n     */\r\n    async triggerHeartbeat() {\r\n        var _a, _b;\r\n        const platformLogger = this.container\r\n            .getProvider('platform-logger')\r\n            .getImmediate();\r\n        // This is the \"Firebase user agent\" string from the platform logger\r\n        // service, not the browser user agent.\r\n        const agent = platformLogger.getPlatformInfoString();\r\n        const date = getUTCDateString();\r\n        if (((_a = this._heartbeatsCache) === null || _a === void 0 ? void 0 : _a.heartbeats) == null) {\r\n            this._heartbeatsCache = await this._heartbeatsCachePromise;\r\n            // If we failed to construct a heartbeats cache, then return immediately.\r\n            if (((_b = this._heartbeatsCache) === null || _b === void 0 ? void 0 : _b.heartbeats) == null) {\r\n                return;\r\n            }\r\n        }\r\n        // Do not store a heartbeat if one is already stored for this day\r\n        // or if a header has already been sent today.\r\n        if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\r\n            this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\r\n            return;\r\n        }\r\n        else {\r\n            // There is no entry for this date. Create one.\r\n            this._heartbeatsCache.heartbeats.push({ date, agent });\r\n        }\r\n        // Remove entries older than 30 days.\r\n        this._heartbeatsCache.heartbeats = this._heartbeatsCache.heartbeats.filter(singleDateHeartbeat => {\r\n            const hbTimestamp = new Date(singleDateHeartbeat.date).valueOf();\r\n            const now = Date.now();\r\n            return now - hbTimestamp <= STORED_HEARTBEAT_RETENTION_MAX_MILLIS;\r\n        });\r\n        return this._storage.overwrite(this._heartbeatsCache);\r\n    }\r\n    /**\r\n     * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\r\n     * It also clears all heartbeats from memory as well as in IndexedDB.\r\n     *\r\n     * NOTE: Consuming product SDKs should not send the header if this method\r\n     * returns an empty string.\r\n     */\r\n    async getHeartbeatsHeader() {\r\n        var _a;\r\n        if (this._heartbeatsCache === null) {\r\n            await this._heartbeatsCachePromise;\r\n        }\r\n        // If it's still null or the array is empty, there is no data to send.\r\n        if (((_a = this._heartbeatsCache) === null || _a === void 0 ? void 0 : _a.heartbeats) == null ||\r\n            this._heartbeatsCache.heartbeats.length === 0) {\r\n            return '';\r\n        }\r\n        const date = getUTCDateString();\r\n        // Extract as many heartbeats from the cache as will fit under the size limit.\r\n        const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\r\n        const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\r\n        // Store last sent date to prevent another being logged/sent for the same day.\r\n        this._heartbeatsCache.lastSentHeartbeatDate = date;\r\n        if (unsentEntries.length > 0) {\r\n            // Store any unsent entries if they exist.\r\n            this._heartbeatsCache.heartbeats = unsentEntries;\r\n            // This seems more likely than emptying the array (below) to lead to some odd state\r\n            // since the cache isn't empty and this will be called again on the next request,\r\n            // and is probably safest if we await it.\r\n            await this._storage.overwrite(this._heartbeatsCache);\r\n        }\r\n        else {\r\n            this._heartbeatsCache.heartbeats = [];\r\n            // Do not wait for this, to reduce latency.\r\n            void this._storage.overwrite(this._heartbeatsCache);\r\n        }\r\n        return headerString;\r\n    }\r\n}\r\nfunction getUTCDateString() {\r\n    const today = new Date();\r\n    // Returns date format 'YYYY-MM-DD'\r\n    return today.toISOString().substring(0, 10);\r\n}\r\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\r\n    // Heartbeats grouped by user agent in the standard format to be sent in\r\n    // the header.\r\n    const heartbeatsToSend = [];\r\n    // Single date format heartbeats that are not sent.\r\n    let unsentEntries = heartbeatsCache.slice();\r\n    for (const singleDateHeartbeat of heartbeatsCache) {\r\n        // Look for an existing entry with the same user agent.\r\n        const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\r\n        if (!heartbeatEntry) {\r\n            // If no entry for this user agent exists, create one.\r\n            heartbeatsToSend.push({\r\n                agent: singleDateHeartbeat.agent,\r\n                dates: [singleDateHeartbeat.date]\r\n            });\r\n            if (countBytes(heartbeatsToSend) > maxSize) {\r\n                // If the header would exceed max size, remove the added heartbeat\r\n                // entry and stop adding to the header.\r\n                heartbeatsToSend.pop();\r\n                break;\r\n            }\r\n        }\r\n        else {\r\n            heartbeatEntry.dates.push(singleDateHeartbeat.date);\r\n            // If the header would exceed max size, remove the added date\r\n            // and stop adding to the header.\r\n            if (countBytes(heartbeatsToSend) > maxSize) {\r\n                heartbeatEntry.dates.pop();\r\n                break;\r\n            }\r\n        }\r\n        // Pop unsent entry from queue. (Skipped if adding the entry exceeded\r\n        // quota and the loop breaks early.)\r\n        unsentEntries = unsentEntries.slice(1);\r\n    }\r\n    return {\r\n        heartbeatsToSend,\r\n        unsentEntries\r\n    };\r\n}\r\nclass HeartbeatStorageImpl {\r\n    constructor(app) {\r\n        this.app = app;\r\n        this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\r\n    }\r\n    async runIndexedDBEnvironmentCheck() {\r\n        if (!isIndexedDBAvailable()) {\r\n            return false;\r\n        }\r\n        else {\r\n            return validateIndexedDBOpenable()\r\n                .then(() => true)\r\n                .catch(() => false);\r\n        }\r\n    }\r\n    /**\r\n     * Read all heartbeats.\r\n     */\r\n    async read() {\r\n        const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n        if (!canUseIndexedDB) {\r\n            return { heartbeats: [] };\r\n        }\r\n        else {\r\n            const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\r\n            if (idbHeartbeatObject === null || idbHeartbeatObject === void 0 ? void 0 : idbHeartbeatObject.heartbeats) {\r\n                return idbHeartbeatObject;\r\n            }\r\n            else {\r\n                return { heartbeats: [] };\r\n            }\r\n        }\r\n    }\r\n    // overwrite the storage with the provided heartbeats\r\n    async overwrite(heartbeatsObject) {\r\n        var _a;\r\n        const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n        if (!canUseIndexedDB) {\r\n            return;\r\n        }\r\n        else {\r\n            const existingHeartbeatsObject = await this.read();\r\n            return writeHeartbeatsToIndexedDB(this.app, {\r\n                lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n                heartbeats: heartbeatsObject.heartbeats\r\n            });\r\n        }\r\n    }\r\n    // add heartbeats\r\n    async add(heartbeatsObject) {\r\n        var _a;\r\n        const canUseIndexedDB = await this._canUseIndexedDBPromise;\r\n        if (!canUseIndexedDB) {\r\n            return;\r\n        }\r\n        else {\r\n            const existingHeartbeatsObject = await this.read();\r\n            return writeHeartbeatsToIndexedDB(this.app, {\r\n                lastSentHeartbeatDate: (_a = heartbeatsObject.lastSentHeartbeatDate) !== null && _a !== void 0 ? _a : existingHeartbeatsObject.lastSentHeartbeatDate,\r\n                heartbeats: [\r\n                    ...existingHeartbeatsObject.heartbeats,\r\n                    ...heartbeatsObject.heartbeats\r\n                ]\r\n            });\r\n        }\r\n    }\r\n}\r\n/**\r\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\r\n * in a platform logging header JSON object, stringified, and converted\r\n * to base 64.\r\n */\r\nfunction countBytes(heartbeatsCache) {\r\n    // base64 has a restricted set of characters, all of which should be 1 byte.\r\n    return base64urlEncodeWithoutPadding(\r\n    // heartbeatsCache wrapper properties\r\n    JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 registerCoreComponents(variant) {\r\n    _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n    _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n    // Register `app` package.\r\n    registerVersion(name$p, version$1, variant);\r\n    // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n    registerVersion(name$p, version$1, 'esm2017');\r\n    // Register platform SDK identifier (no version).\r\n    registerVersion('fire-js', '');\r\n}\n\n/**\r\n * Firebase App\r\n *\r\n * @remarks This package coordinates the communication between the different Firebase components\r\n * @packageDocumentation\r\n */\r\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _isFirebaseApp, _isFirebaseServerApp, _registerComponent, _removeServiceInstance, _serverApps, deleteApp, getApp, getApps, initializeApp, initializeServerApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm2017.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.6.7\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst PENDING_TIMEOUT_MS = 10000;\r\nconst PACKAGE_VERSION = `w:${version}`;\r\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\r\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\r\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\r\nconst SERVICE = 'installations';\r\nconst SERVICE_NAME = 'Installations';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst ERROR_DESCRIPTION_MAP = {\r\n    [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\r\n    [\"not-registered\" /* ErrorCode.NOT_REGISTERED */]: 'Firebase Installation is not registered.',\r\n    [\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\r\n    [\"request-failed\" /* ErrorCode.REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\r\n    [\"app-offline\" /* ErrorCode.APP_OFFLINE */]: 'Could not process request. Application offline.',\r\n    [\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\r\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\r\nfunction isServerError(error) {\r\n    return (error instanceof FirebaseError &&\r\n        error.code.includes(\"request-failed\" /* ErrorCode.REQUEST_FAILED */));\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 getInstallationsEndpoint({ projectId }) {\r\n    return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\r\n}\r\nfunction extractAuthTokenInfoFromResponse(response) {\r\n    return {\r\n        token: response.token,\r\n        requestStatus: 2 /* RequestStatus.COMPLETED */,\r\n        expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\r\n        creationTime: Date.now()\r\n    };\r\n}\r\nasync function getErrorFromResponse(requestName, response) {\r\n    const responseJson = await response.json();\r\n    const errorData = responseJson.error;\r\n    return ERROR_FACTORY.create(\"request-failed\" /* ErrorCode.REQUEST_FAILED */, {\r\n        requestName,\r\n        serverCode: errorData.code,\r\n        serverMessage: errorData.message,\r\n        serverStatus: errorData.status\r\n    });\r\n}\r\nfunction getHeaders({ apiKey }) {\r\n    return new Headers({\r\n        'Content-Type': 'application/json',\r\n        Accept: 'application/json',\r\n        'x-goog-api-key': apiKey\r\n    });\r\n}\r\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\r\n    const headers = getHeaders(appConfig);\r\n    headers.append('Authorization', getAuthorizationHeader(refreshToken));\r\n    return headers;\r\n}\r\n/**\r\n * Calls the passed in fetch wrapper and returns the response.\r\n * If the returned response has a status of 5xx, re-runs the function once and\r\n * returns the response.\r\n */\r\nasync function retryIfServerError(fn) {\r\n    const result = await fn();\r\n    if (result.status >= 500 && result.status < 600) {\r\n        // Internal Server Error. Retry request.\r\n        return fn();\r\n    }\r\n    return result;\r\n}\r\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\r\n    // This works because the server will never respond with fractions of a second.\r\n    return Number(responseExpiresIn.replace('s', '000'));\r\n}\r\nfunction getAuthorizationHeader(refreshToken) {\r\n    return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\r\n    const endpoint = getInstallationsEndpoint(appConfig);\r\n    const headers = getHeaders(appConfig);\r\n    // If heartbeat service exists, add the heartbeat string to the header.\r\n    const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n        optional: true\r\n    });\r\n    if (heartbeatService) {\r\n        const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n        if (heartbeatsHeader) {\r\n            headers.append('x-firebase-client', heartbeatsHeader);\r\n        }\r\n    }\r\n    const body = {\r\n        fid,\r\n        authVersion: INTERNAL_AUTH_VERSION,\r\n        appId: appConfig.appId,\r\n        sdkVersion: PACKAGE_VERSION\r\n    };\r\n    const request = {\r\n        method: 'POST',\r\n        headers,\r\n        body: JSON.stringify(body)\r\n    };\r\n    const response = await retryIfServerError(() => fetch(endpoint, request));\r\n    if (response.ok) {\r\n        const responseValue = await response.json();\r\n        const registeredInstallationEntry = {\r\n            fid: responseValue.fid || fid,\r\n            registrationStatus: 2 /* RequestStatus.COMPLETED */,\r\n            refreshToken: responseValue.refreshToken,\r\n            authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\r\n        };\r\n        return registeredInstallationEntry;\r\n    }\r\n    else {\r\n        throw await getErrorFromResponse('Create Installation', response);\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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/** Returns a promise that resolves after given time passes. */\r\nfunction sleep(ms) {\r\n    return new Promise(resolve => {\r\n        setTimeout(resolve, ms);\r\n    });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 bufferToBase64UrlSafe(array) {\r\n    const b64 = btoa(String.fromCharCode(...array));\r\n    return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\r\nconst INVALID_FID = '';\r\n/**\r\n * Generates a new FID using random values from Web Crypto API.\r\n * Returns an empty string if FID generation fails for any reason.\r\n */\r\nfunction generateFid() {\r\n    try {\r\n        // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\r\n        // bytes. our implementation generates a 17 byte array instead.\r\n        const fidByteArray = new Uint8Array(17);\r\n        const crypto = self.crypto || self.msCrypto;\r\n        crypto.getRandomValues(fidByteArray);\r\n        // Replace the first 4 random bits with the constant FID header of 0b0111.\r\n        fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\r\n        const fid = encode(fidByteArray);\r\n        return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\r\n    }\r\n    catch (_a) {\r\n        // FID generation errored\r\n        return INVALID_FID;\r\n    }\r\n}\r\n/** Converts a FID Uint8Array to a base64 string representation. */\r\nfunction encode(fidByteArray) {\r\n    const b64String = bufferToBase64UrlSafe(fidByteArray);\r\n    // Remove the 23rd character that was added because of the extra 4 bits at the\r\n    // end of our 17 byte array, and the '=' padding.\r\n    return b64String.substr(0, 22);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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/** Returns a string key that can be used to identify the app. */\r\nfunction getKey(appConfig) {\r\n    return `${appConfig.appName}!${appConfig.appId}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst fidChangeCallbacks = new Map();\r\n/**\r\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\r\n * change to other tabs.\r\n */\r\nfunction fidChanged(appConfig, fid) {\r\n    const key = getKey(appConfig);\r\n    callFidChangeCallbacks(key, fid);\r\n    broadcastFidChange(key, fid);\r\n}\r\nfunction addCallback(appConfig, callback) {\r\n    // Open the broadcast channel if it's not already open,\r\n    // to be able to listen to change events from other tabs.\r\n    getBroadcastChannel();\r\n    const key = getKey(appConfig);\r\n    let callbackSet = fidChangeCallbacks.get(key);\r\n    if (!callbackSet) {\r\n        callbackSet = new Set();\r\n        fidChangeCallbacks.set(key, callbackSet);\r\n    }\r\n    callbackSet.add(callback);\r\n}\r\nfunction removeCallback(appConfig, callback) {\r\n    const key = getKey(appConfig);\r\n    const callbackSet = fidChangeCallbacks.get(key);\r\n    if (!callbackSet) {\r\n        return;\r\n    }\r\n    callbackSet.delete(callback);\r\n    if (callbackSet.size === 0) {\r\n        fidChangeCallbacks.delete(key);\r\n    }\r\n    // Close broadcast channel if there are no more callbacks.\r\n    closeBroadcastChannel();\r\n}\r\nfunction callFidChangeCallbacks(key, fid) {\r\n    const callbacks = fidChangeCallbacks.get(key);\r\n    if (!callbacks) {\r\n        return;\r\n    }\r\n    for (const callback of callbacks) {\r\n        callback(fid);\r\n    }\r\n}\r\nfunction broadcastFidChange(key, fid) {\r\n    const channel = getBroadcastChannel();\r\n    if (channel) {\r\n        channel.postMessage({ key, fid });\r\n    }\r\n    closeBroadcastChannel();\r\n}\r\nlet broadcastChannel = null;\r\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\r\nfunction getBroadcastChannel() {\r\n    if (!broadcastChannel && 'BroadcastChannel' in self) {\r\n        broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\r\n        broadcastChannel.onmessage = e => {\r\n            callFidChangeCallbacks(e.data.key, e.data.fid);\r\n        };\r\n    }\r\n    return broadcastChannel;\r\n}\r\nfunction closeBroadcastChannel() {\r\n    if (fidChangeCallbacks.size === 0 && broadcastChannel) {\r\n        broadcastChannel.close();\r\n        broadcastChannel = null;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst DATABASE_NAME = 'firebase-installations-database';\r\nconst DATABASE_VERSION = 1;\r\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\r\nlet dbPromise = null;\r\nfunction getDbPromise() {\r\n    if (!dbPromise) {\r\n        dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\r\n            upgrade: (db, oldVersion) => {\r\n                // We don't use 'break' in this switch statement, the fall-through\r\n                // behavior is what we want, because if there are multiple versions between\r\n                // the old version and the current version, we want ALL the migrations\r\n                // that correspond to those versions to run, not only the last one.\r\n                // eslint-disable-next-line default-case\r\n                switch (oldVersion) {\r\n                    case 0:\r\n                        db.createObjectStore(OBJECT_STORE_NAME);\r\n                }\r\n            }\r\n        });\r\n    }\r\n    return dbPromise;\r\n}\r\n/** Assigns or overwrites the record for the given key with the given value. */\r\nasync function set(appConfig, value) {\r\n    const key = getKey(appConfig);\r\n    const db = await getDbPromise();\r\n    const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n    const objectStore = tx.objectStore(OBJECT_STORE_NAME);\r\n    const oldValue = (await objectStore.get(key));\r\n    await objectStore.put(value, key);\r\n    await tx.done;\r\n    if (!oldValue || oldValue.fid !== value.fid) {\r\n        fidChanged(appConfig, value.fid);\r\n    }\r\n    return value;\r\n}\r\n/** Removes record(s) from the objectStore that match the given key. */\r\nasync function remove(appConfig) {\r\n    const key = getKey(appConfig);\r\n    const db = await getDbPromise();\r\n    const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n    await tx.objectStore(OBJECT_STORE_NAME).delete(key);\r\n    await tx.done;\r\n}\r\n/**\r\n * Atomically updates a record with the result of updateFn, which gets\r\n * called with the current value. If newValue is undefined, the record is\r\n * deleted instead.\r\n * @return Updated value\r\n */\r\nasync function update(appConfig, updateFn) {\r\n    const key = getKey(appConfig);\r\n    const db = await getDbPromise();\r\n    const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\r\n    const store = tx.objectStore(OBJECT_STORE_NAME);\r\n    const oldValue = (await store.get(key));\r\n    const newValue = updateFn(oldValue);\r\n    if (newValue === undefined) {\r\n        await store.delete(key);\r\n    }\r\n    else {\r\n        await store.put(newValue, key);\r\n    }\r\n    await tx.done;\r\n    if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\r\n        fidChanged(appConfig, newValue.fid);\r\n    }\r\n    return newValue;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Updates and returns the InstallationEntry from the database.\r\n * Also triggers a registration request if it is necessary and possible.\r\n */\r\nasync function getInstallationEntry(installations) {\r\n    let registrationPromise;\r\n    const installationEntry = await update(installations.appConfig, oldEntry => {\r\n        const installationEntry = updateOrCreateInstallationEntry(oldEntry);\r\n        const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\r\n        registrationPromise = entryWithPromise.registrationPromise;\r\n        return entryWithPromise.installationEntry;\r\n    });\r\n    if (installationEntry.fid === INVALID_FID) {\r\n        // FID generation failed. Waiting for the FID from the server.\r\n        return { installationEntry: await registrationPromise };\r\n    }\r\n    return {\r\n        installationEntry,\r\n        registrationPromise\r\n    };\r\n}\r\n/**\r\n * Creates a new Installation Entry if one does not exist.\r\n * Also clears timed out pending requests.\r\n */\r\nfunction updateOrCreateInstallationEntry(oldEntry) {\r\n    const entry = oldEntry || {\r\n        fid: generateFid(),\r\n        registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n    };\r\n    return clearTimedOutRequest(entry);\r\n}\r\n/**\r\n * If the Firebase Installation is not registered yet, this will trigger the\r\n * registration and return an InProgressInstallationEntry.\r\n *\r\n * If registrationPromise does not exist, the installationEntry is guaranteed\r\n * to be registered.\r\n */\r\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\r\n    if (installationEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n        if (!navigator.onLine) {\r\n            // Registration required but app is offline.\r\n            const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */));\r\n            return {\r\n                installationEntry,\r\n                registrationPromise: registrationPromiseWithError\r\n            };\r\n        }\r\n        // Try registering. Change status to IN_PROGRESS.\r\n        const inProgressEntry = {\r\n            fid: installationEntry.fid,\r\n            registrationStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n            registrationTime: Date.now()\r\n        };\r\n        const registrationPromise = registerInstallation(installations, inProgressEntry);\r\n        return { installationEntry: inProgressEntry, registrationPromise };\r\n    }\r\n    else if (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n        return {\r\n            installationEntry,\r\n            registrationPromise: waitUntilFidRegistration(installations)\r\n        };\r\n    }\r\n    else {\r\n        return { installationEntry };\r\n    }\r\n}\r\n/** This will be executed only once for each new Firebase Installation. */\r\nasync function registerInstallation(installations, installationEntry) {\r\n    try {\r\n        const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\r\n        return set(installations.appConfig, registeredInstallationEntry);\r\n    }\r\n    catch (e) {\r\n        if (isServerError(e) && e.customData.serverCode === 409) {\r\n            // Server returned a \"FID can not be used\" error.\r\n            // Generate a new ID next time.\r\n            await remove(installations.appConfig);\r\n        }\r\n        else {\r\n            // Registration failed. Set FID as not registered.\r\n            await set(installations.appConfig, {\r\n                fid: installationEntry.fid,\r\n                registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n            });\r\n        }\r\n        throw e;\r\n    }\r\n}\r\n/** Call if FID registration is pending in another request. */\r\nasync function waitUntilFidRegistration(installations) {\r\n    // Unfortunately, there is no way of reliably observing when a value in\r\n    // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n    // so we need to poll.\r\n    let entry = await updateInstallationRequest(installations.appConfig);\r\n    while (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n        // createInstallation request still in progress.\r\n        await sleep(100);\r\n        entry = await updateInstallationRequest(installations.appConfig);\r\n    }\r\n    if (entry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n        // The request timed out or failed in a different call. Try again.\r\n        const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\r\n        if (registrationPromise) {\r\n            return registrationPromise;\r\n        }\r\n        else {\r\n            // if there is no registrationPromise, entry is registered.\r\n            return installationEntry;\r\n        }\r\n    }\r\n    return entry;\r\n}\r\n/**\r\n * Called only if there is a CreateInstallation request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * CreateInstallation request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateInstallationRequest(appConfig) {\r\n    return update(appConfig, oldEntry => {\r\n        if (!oldEntry) {\r\n            throw ERROR_FACTORY.create(\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */);\r\n        }\r\n        return clearTimedOutRequest(oldEntry);\r\n    });\r\n}\r\nfunction clearTimedOutRequest(entry) {\r\n    if (hasInstallationRequestTimedOut(entry)) {\r\n        return {\r\n            fid: entry.fid,\r\n            registrationStatus: 0 /* RequestStatus.NOT_STARTED */\r\n        };\r\n    }\r\n    return entry;\r\n}\r\nfunction hasInstallationRequestTimedOut(installationEntry) {\r\n    return (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n        installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\r\n    const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\r\n    const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n    // If heartbeat service exists, add the heartbeat string to the header.\r\n    const heartbeatService = heartbeatServiceProvider.getImmediate({\r\n        optional: true\r\n    });\r\n    if (heartbeatService) {\r\n        const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\r\n        if (heartbeatsHeader) {\r\n            headers.append('x-firebase-client', heartbeatsHeader);\r\n        }\r\n    }\r\n    const body = {\r\n        installation: {\r\n            sdkVersion: PACKAGE_VERSION,\r\n            appId: appConfig.appId\r\n        }\r\n    };\r\n    const request = {\r\n        method: 'POST',\r\n        headers,\r\n        body: JSON.stringify(body)\r\n    };\r\n    const response = await retryIfServerError(() => fetch(endpoint, request));\r\n    if (response.ok) {\r\n        const responseValue = await response.json();\r\n        const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\r\n        return completedAuthToken;\r\n    }\r\n    else {\r\n        throw await getErrorFromResponse('Generate Auth Token', response);\r\n    }\r\n}\r\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\r\n    return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 valid authentication token for the installation. Generates a new\r\n * token if one doesn't exist, is expired or about to expire.\r\n *\r\n * Should only be called if the Firebase Installation is registered.\r\n */\r\nasync function refreshAuthToken(installations, forceRefresh = false) {\r\n    let tokenPromise;\r\n    const entry = await update(installations.appConfig, oldEntry => {\r\n        if (!isEntryRegistered(oldEntry)) {\r\n            throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n        }\r\n        const oldAuthToken = oldEntry.authToken;\r\n        if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\r\n            // There is a valid token in the DB.\r\n            return oldEntry;\r\n        }\r\n        else if (oldAuthToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n            // There already is a token request in progress.\r\n            tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\r\n            return oldEntry;\r\n        }\r\n        else {\r\n            // No token or token expired.\r\n            if (!navigator.onLine) {\r\n                throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n            }\r\n            const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\r\n            tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\r\n            return inProgressEntry;\r\n        }\r\n    });\r\n    const authToken = tokenPromise\r\n        ? await tokenPromise\r\n        : entry.authToken;\r\n    return authToken;\r\n}\r\n/**\r\n * Call only if FID is registered and Auth Token request is in progress.\r\n *\r\n * Waits until the current pending request finishes. If the request times out,\r\n * tries once in this thread as well.\r\n */\r\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\r\n    // Unfortunately, there is no way of reliably observing when a value in\r\n    // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\r\n    // so we need to poll.\r\n    let entry = await updateAuthTokenRequest(installations.appConfig);\r\n    while (entry.authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n        // generateAuthToken still in progress.\r\n        await sleep(100);\r\n        entry = await updateAuthTokenRequest(installations.appConfig);\r\n    }\r\n    const authToken = entry.authToken;\r\n    if (authToken.requestStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n        // The request timed out or failed in a different call. Try again.\r\n        return refreshAuthToken(installations, forceRefresh);\r\n    }\r\n    else {\r\n        return authToken;\r\n    }\r\n}\r\n/**\r\n * Called only if there is a GenerateAuthToken request in progress.\r\n *\r\n * Updates the InstallationEntry in the DB based on the status of the\r\n * GenerateAuthToken request.\r\n *\r\n * Returns the updated InstallationEntry.\r\n */\r\nfunction updateAuthTokenRequest(appConfig) {\r\n    return update(appConfig, oldEntry => {\r\n        if (!isEntryRegistered(oldEntry)) {\r\n            throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\r\n        }\r\n        const oldAuthToken = oldEntry.authToken;\r\n        if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\r\n            return Object.assign(Object.assign({}, oldEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n        }\r\n        return oldEntry;\r\n    });\r\n}\r\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\r\n    try {\r\n        const authToken = await generateAuthTokenRequest(installations, installationEntry);\r\n        const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken });\r\n        await set(installations.appConfig, updatedInstallationEntry);\r\n        return authToken;\r\n    }\r\n    catch (e) {\r\n        if (isServerError(e) &&\r\n            (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\r\n            // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\r\n            // Generate a new ID next time.\r\n            await remove(installations.appConfig);\r\n        }\r\n        else {\r\n            const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ } });\r\n            await set(installations.appConfig, updatedInstallationEntry);\r\n        }\r\n        throw e;\r\n    }\r\n}\r\nfunction isEntryRegistered(installationEntry) {\r\n    return (installationEntry !== undefined &&\r\n        installationEntry.registrationStatus === 2 /* RequestStatus.COMPLETED */);\r\n}\r\nfunction isAuthTokenValid(authToken) {\r\n    return (authToken.requestStatus === 2 /* RequestStatus.COMPLETED */ &&\r\n        !isAuthTokenExpired(authToken));\r\n}\r\nfunction isAuthTokenExpired(authToken) {\r\n    const now = Date.now();\r\n    return (now < authToken.creationTime ||\r\n        authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\r\n}\r\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\r\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\r\n    const inProgressAuthToken = {\r\n        requestStatus: 1 /* RequestStatus.IN_PROGRESS */,\r\n        requestTime: Date.now()\r\n    };\r\n    return Object.assign(Object.assign({}, oldEntry), { authToken: inProgressAuthToken });\r\n}\r\nfunction hasAuthTokenRequestTimedOut(authToken) {\r\n    return (authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\r\n        authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Creates a Firebase Installation if there isn't one for the app and\r\n * returns the Installation ID.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function getId(installations) {\r\n    const installationsImpl = installations;\r\n    const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\r\n    if (registrationPromise) {\r\n        registrationPromise.catch(console.error);\r\n    }\r\n    else {\r\n        // If the installation is already registered, update the authentication\r\n        // token if needed.\r\n        refreshAuthToken(installationsImpl).catch(console.error);\r\n    }\r\n    return installationEntry.fid;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 Firebase Installations auth token, identifying the current\r\n * Firebase Installation.\r\n * @param installations - The `Installations` instance.\r\n * @param forceRefresh - Force refresh regardless of token expiration.\r\n *\r\n * @public\r\n */\r\nasync function getToken(installations, forceRefresh = false) {\r\n    const installationsImpl = installations;\r\n    await completeInstallationRegistration(installationsImpl);\r\n    // At this point we either have a Registered Installation in the DB, or we've\r\n    // already thrown an error.\r\n    const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\r\n    return authToken.token;\r\n}\r\nasync function completeInstallationRegistration(installations) {\r\n    const { registrationPromise } = await getInstallationEntry(installations);\r\n    if (registrationPromise) {\r\n        // A createInstallation request is in progress. Wait until it finishes.\r\n        await registrationPromise;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nasync function deleteInstallationRequest(appConfig, installationEntry) {\r\n    const endpoint = getDeleteEndpoint(appConfig, installationEntry);\r\n    const headers = getHeadersWithAuth(appConfig, installationEntry);\r\n    const request = {\r\n        method: 'DELETE',\r\n        headers\r\n    };\r\n    const response = await retryIfServerError(() => fetch(endpoint, request));\r\n    if (!response.ok) {\r\n        throw await getErrorFromResponse('Delete Installation', response);\r\n    }\r\n}\r\nfunction getDeleteEndpoint(appConfig, { fid }) {\r\n    return `${getInstallationsEndpoint(appConfig)}/${fid}`;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Deletes the Firebase Installation and all associated data.\r\n * @param installations - The `Installations` instance.\r\n *\r\n * @public\r\n */\r\nasync function deleteInstallations(installations) {\r\n    const { appConfig } = installations;\r\n    const entry = await update(appConfig, oldEntry => {\r\n        if (oldEntry && oldEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\r\n            // Delete the unregistered entry without sending a deleteInstallation request.\r\n            return undefined;\r\n        }\r\n        return oldEntry;\r\n    });\r\n    if (entry) {\r\n        if (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\r\n            // Can't delete while trying to register.\r\n            throw ERROR_FACTORY.create(\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */);\r\n        }\r\n        else if (entry.registrationStatus === 2 /* RequestStatus.COMPLETED */) {\r\n            if (!navigator.onLine) {\r\n                throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\r\n            }\r\n            else {\r\n                await deleteInstallationRequest(appConfig, entry);\r\n                await remove(appConfig);\r\n            }\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Sets a new callback that will get called when Installation ID changes.\r\n * Returns an unsubscribe function that will remove the callback when called.\r\n * @param installations - The `Installations` instance.\r\n * @param callback - The callback function that is invoked when FID changes.\r\n * @returns A function that can be called to unsubscribe.\r\n *\r\n * @public\r\n */\r\nfunction onIdChange(installations, callback) {\r\n    const { appConfig } = installations;\r\n    addCallback(appConfig, callback);\r\n    return () => {\r\n        removeCallback(appConfig, callback);\r\n    };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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 an instance of {@link Installations} associated with the given\r\n * {@link @firebase/app#FirebaseApp} instance.\r\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\r\n *\r\n * @public\r\n */\r\nfunction getInstallations(app = getApp()) {\r\n    const installationsImpl = _getProvider(app, 'installations').getImmediate();\r\n    return installationsImpl;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 extractAppConfig(app) {\r\n    if (!app || !app.options) {\r\n        throw getMissingValueError('App Configuration');\r\n    }\r\n    if (!app.name) {\r\n        throw getMissingValueError('App Name');\r\n    }\r\n    // Required app config keys\r\n    const configKeys = [\r\n        'projectId',\r\n        'apiKey',\r\n        'appId'\r\n    ];\r\n    for (const keyName of configKeys) {\r\n        if (!app.options[keyName]) {\r\n            throw getMissingValueError(keyName);\r\n        }\r\n    }\r\n    return {\r\n        appName: app.name,\r\n        projectId: app.options.projectId,\r\n        apiKey: app.options.apiKey,\r\n        appId: app.options.appId\r\n    };\r\n}\r\nfunction getMissingValueError(valueName) {\r\n    return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\r\n        valueName\r\n    });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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\nconst INSTALLATIONS_NAME = 'installations';\r\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\r\nconst publicFactory = (container) => {\r\n    const app = container.getProvider('app').getImmediate();\r\n    // Throws if app isn't configured properly.\r\n    const appConfig = extractAppConfig(app);\r\n    const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\r\n    const installationsImpl = {\r\n        app,\r\n        appConfig,\r\n        heartbeatServiceProvider,\r\n        _delete: () => Promise.resolve()\r\n    };\r\n    return installationsImpl;\r\n};\r\nconst internalFactory = (container) => {\r\n    const app = container.getProvider('app').getImmediate();\r\n    // Internal FIS instance relies on public FIS instance.\r\n    const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\r\n    const installationsInternal = {\r\n        getId: () => getId(installations),\r\n        getToken: (forceRefresh) => getToken(installations, forceRefresh)\r\n    };\r\n    return installationsInternal;\r\n};\r\nfunction registerInstallations() {\r\n    _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n    _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n}\n\n/**\r\n * The Firebase Installations Web SDK.\r\n * This SDK does not work in a Node.js environment.\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterInstallations();\r\nregisterVersion(name, version);\r\n// BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\nregisterVersion(name, version, 'esm2017');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm2017.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Logger } from '@firebase/logger';\nimport { ErrorFactory, calculateBackoffMillis, FirebaseError, isIndexedDBAvailable, validateIndexedDBOpenable, isBrowserExtension, areCookiesEnabled, getModularInstance, deepEqual } from '@firebase/util';\nimport { Component } from '@firebase/component';\nimport '@firebase/installations';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 Analytics.\r\n */\r\nconst ANALYTICS_TYPE = 'analytics';\r\n// Key to attach FID to in gtag params.\r\nconst GA_FID_KEY = 'firebase_id';\r\nconst ORIGIN_KEY = 'origin';\r\nconst FETCH_TIMEOUT_MILLIS = 60 * 1000;\r\nconst DYNAMIC_CONFIG_URL = 'https://firebase.googleapis.com/v1alpha/projects/-/apps/{app-id}/webConfig';\r\nconst GTAG_URL = 'https://www.googletagmanager.com/gtag/js';\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst logger = new Logger('@firebase/analytics');\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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\nconst ERRORS = {\r\n    [\"already-exists\" /* AnalyticsError.ALREADY_EXISTS */]: 'A Firebase Analytics instance with the appId {$id} ' +\r\n        ' already exists. ' +\r\n        'Only one Firebase Analytics instance can be created for each appId.',\r\n    [\"already-initialized\" /* AnalyticsError.ALREADY_INITIALIZED */]: 'initializeAnalytics() cannot be called again with different options than those ' +\r\n        'it was initially called with. It can be called again with the same options to ' +\r\n        'return the existing instance, or getAnalytics() can be used ' +\r\n        'to get a reference to the already-intialized instance.',\r\n    [\"already-initialized-settings\" /* AnalyticsError.ALREADY_INITIALIZED_SETTINGS */]: 'Firebase Analytics has already been initialized.' +\r\n        'settings() must be called before initializing any Analytics instance' +\r\n        'or it will have no effect.',\r\n    [\"interop-component-reg-failed\" /* AnalyticsError.INTEROP_COMPONENT_REG_FAILED */]: 'Firebase Analytics Interop Component failed to instantiate: {$reason}',\r\n    [\"invalid-analytics-context\" /* AnalyticsError.INVALID_ANALYTICS_CONTEXT */]: 'Firebase Analytics is not supported in this environment. ' +\r\n        'Wrap initialization of analytics in analytics.isSupported() ' +\r\n        'to prevent initialization in unsupported environments. Details: {$errorInfo}',\r\n    [\"indexeddb-unavailable\" /* AnalyticsError.INDEXEDDB_UNAVAILABLE */]: 'IndexedDB unavailable or restricted in this environment. ' +\r\n        'Wrap initialization of analytics in analytics.isSupported() ' +\r\n        'to prevent initialization in unsupported environments. Details: {$errorInfo}',\r\n    [\"fetch-throttle\" /* AnalyticsError.FETCH_THROTTLE */]: 'The config fetch request timed out while in an exponential backoff state.' +\r\n        ' Unix timestamp in milliseconds when fetch request throttling ends: {$throttleEndTimeMillis}.',\r\n    [\"config-fetch-failed\" /* AnalyticsError.CONFIG_FETCH_FAILED */]: 'Dynamic config fetch failed: [{$httpStatus}] {$responseMessage}',\r\n    [\"no-api-key\" /* AnalyticsError.NO_API_KEY */]: 'The \"apiKey\" field is empty in the local Firebase config. Firebase Analytics requires this field to' +\r\n        'contain a valid API key.',\r\n    [\"no-app-id\" /* AnalyticsError.NO_APP_ID */]: 'The \"appId\" field is empty in the local Firebase config. Firebase Analytics requires this field to' +\r\n        'contain a valid app ID.',\r\n    [\"no-client-id\" /* AnalyticsError.NO_CLIENT_ID */]: 'The \"client_id\" field is empty.',\r\n    [\"invalid-gtag-resource\" /* AnalyticsError.INVALID_GTAG_RESOURCE */]: 'Trusted Types detected an invalid gtag resource: {$gtagURL}.'\r\n};\r\nconst ERROR_FACTORY = new ErrorFactory('analytics', 'Analytics', ERRORS);\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Verifies and creates a TrustedScriptURL.\r\n */\r\nfunction createGtagTrustedTypesScriptURL(url) {\r\n    if (!url.startsWith(GTAG_URL)) {\r\n        const err = ERROR_FACTORY.create(\"invalid-gtag-resource\" /* AnalyticsError.INVALID_GTAG_RESOURCE */, {\r\n            gtagURL: url\r\n        });\r\n        logger.warn(err.message);\r\n        return '';\r\n    }\r\n    return url;\r\n}\r\n/**\r\n * Makeshift polyfill for Promise.allSettled(). Resolves when all promises\r\n * have either resolved or rejected.\r\n *\r\n * @param promises Array of promises to wait for.\r\n */\r\nfunction promiseAllSettled(promises) {\r\n    return Promise.all(promises.map(promise => promise.catch(e => e)));\r\n}\r\n/**\r\n * Creates a TrustedTypePolicy object that implements the rules passed as policyOptions.\r\n *\r\n * @param policyName A string containing the name of the policy\r\n * @param policyOptions Object containing implementations of instance methods for TrustedTypesPolicy, see {@link https://developer.mozilla.org/en-US/docs/Web/API/TrustedTypePolicy#instance_methods\r\n * | the TrustedTypePolicy reference documentation}.\r\n */\r\nfunction createTrustedTypesPolicy(policyName, policyOptions) {\r\n    // Create a TrustedTypes policy that we can use for updating src\r\n    // properties\r\n    let trustedTypesPolicy;\r\n    if (window.trustedTypes) {\r\n        trustedTypesPolicy = window.trustedTypes.createPolicy(policyName, policyOptions);\r\n    }\r\n    return trustedTypesPolicy;\r\n}\r\n/**\r\n * Inserts gtag script tag into the page to asynchronously download gtag.\r\n * @param dataLayerName Name of datalayer (most often the default, \"_dataLayer\").\r\n */\r\nfunction insertScriptTag(dataLayerName, measurementId) {\r\n    const trustedTypesPolicy = createTrustedTypesPolicy('firebase-js-sdk-policy', {\r\n        createScriptURL: createGtagTrustedTypesScriptURL\r\n    });\r\n    const script = document.createElement('script');\r\n    // We are not providing an analyticsId in the URL because it would trigger a `page_view`\r\n    // without fid. We will initialize ga-id using gtag (config) command together with fid.\r\n    const gtagScriptURL = `${GTAG_URL}?l=${dataLayerName}&id=${measurementId}`;\r\n    script.src = trustedTypesPolicy\r\n        ? trustedTypesPolicy === null || trustedTypesPolicy === void 0 ? void 0 : trustedTypesPolicy.createScriptURL(gtagScriptURL)\r\n        : gtagScriptURL;\r\n    script.async = true;\r\n    document.head.appendChild(script);\r\n}\r\n/**\r\n * Get reference to, or create, global datalayer.\r\n * @param dataLayerName Name of datalayer (most often the default, \"_dataLayer\").\r\n */\r\nfunction getOrCreateDataLayer(dataLayerName) {\r\n    // Check for existing dataLayer and create if needed.\r\n    let dataLayer = [];\r\n    if (Array.isArray(window[dataLayerName])) {\r\n        dataLayer = window[dataLayerName];\r\n    }\r\n    else {\r\n        window[dataLayerName] = dataLayer;\r\n    }\r\n    return dataLayer;\r\n}\r\n/**\r\n * Wrapped gtag logic when gtag is called with 'config' command.\r\n *\r\n * @param gtagCore Basic gtag function that just appends to dataLayer.\r\n * @param initializationPromisesMap Map of appIds to their initialization promises.\r\n * @param dynamicConfigPromisesList Array of dynamic config fetch promises.\r\n * @param measurementIdToAppId Map of GA measurementIDs to corresponding Firebase appId.\r\n * @param measurementId GA Measurement ID to set config for.\r\n * @param gtagParams Gtag config params to set.\r\n */\r\nasync function gtagOnConfig(gtagCore, initializationPromisesMap, dynamicConfigPromisesList, measurementIdToAppId, measurementId, gtagParams) {\r\n    // If config is already fetched, we know the appId and can use it to look up what FID promise we\r\n    /// are waiting for, and wait only on that one.\r\n    const correspondingAppId = measurementIdToAppId[measurementId];\r\n    try {\r\n        if (correspondingAppId) {\r\n            await initializationPromisesMap[correspondingAppId];\r\n        }\r\n        else {\r\n            // If config is not fetched yet, wait for all configs (we don't know which one we need) and\r\n            // find the appId (if any) corresponding to this measurementId. If there is one, wait on\r\n            // that appId's initialization promise. If there is none, promise resolves and gtag\r\n            // call goes through.\r\n            const dynamicConfigResults = await promiseAllSettled(dynamicConfigPromisesList);\r\n            const foundConfig = dynamicConfigResults.find(config => config.measurementId === measurementId);\r\n            if (foundConfig) {\r\n                await initializationPromisesMap[foundConfig.appId];\r\n            }\r\n        }\r\n    }\r\n    catch (e) {\r\n        logger.error(e);\r\n    }\r\n    gtagCore(\"config\" /* GtagCommand.CONFIG */, measurementId, gtagParams);\r\n}\r\n/**\r\n * Wrapped gtag logic when gtag is called with 'event' command.\r\n *\r\n * @param gtagCore Basic gtag function that just appends to dataLayer.\r\n * @param initializationPromisesMap Map of appIds to their initialization promises.\r\n * @param dynamicConfigPromisesList Array of dynamic config fetch promises.\r\n * @param measurementId GA Measurement ID to log event to.\r\n * @param gtagParams Params to log with this event.\r\n */\r\nasync function gtagOnEvent(gtagCore, initializationPromisesMap, dynamicConfigPromisesList, measurementId, gtagParams) {\r\n    try {\r\n        let initializationPromisesToWaitFor = [];\r\n        // If there's a 'send_to' param, check if any ID specified matches\r\n        // an initializeIds() promise we are waiting for.\r\n        if (gtagParams && gtagParams['send_to']) {\r\n            let gaSendToList = gtagParams['send_to'];\r\n            // Make it an array if is isn't, so it can be dealt with the same way.\r\n            if (!Array.isArray(gaSendToList)) {\r\n                gaSendToList = [gaSendToList];\r\n            }\r\n            // Checking 'send_to' fields requires having all measurement ID results back from\r\n            // the dynamic config fetch.\r\n            const dynamicConfigResults = await promiseAllSettled(dynamicConfigPromisesList);\r\n            for (const sendToId of gaSendToList) {\r\n                // Any fetched dynamic measurement ID that matches this 'send_to' ID\r\n                const foundConfig = dynamicConfigResults.find(config => config.measurementId === sendToId);\r\n                const initializationPromise = foundConfig && initializationPromisesMap[foundConfig.appId];\r\n                if (initializationPromise) {\r\n                    initializationPromisesToWaitFor.push(initializationPromise);\r\n                }\r\n                else {\r\n                    // Found an item in 'send_to' that is not associated\r\n                    // directly with an FID, possibly a group.  Empty this array,\r\n                    // exit the loop early, and let it get populated below.\r\n                    initializationPromisesToWaitFor = [];\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        // This will be unpopulated if there was no 'send_to' field , or\r\n        // if not all entries in the 'send_to' field could be mapped to\r\n        // a FID. In these cases, wait on all pending initialization promises.\r\n        if (initializationPromisesToWaitFor.length === 0) {\r\n            initializationPromisesToWaitFor = Object.values(initializationPromisesMap);\r\n        }\r\n        // Run core gtag function with args after all relevant initialization\r\n        // promises have been resolved.\r\n        await Promise.all(initializationPromisesToWaitFor);\r\n        // Workaround for http://b/141370449 - third argument cannot be undefined.\r\n        gtagCore(\"event\" /* GtagCommand.EVENT */, measurementId, gtagParams || {});\r\n    }\r\n    catch (e) {\r\n        logger.error(e);\r\n    }\r\n}\r\n/**\r\n * Wraps a standard gtag function with extra code to wait for completion of\r\n * relevant initialization promises before sending requests.\r\n *\r\n * @param gtagCore Basic gtag function that just appends to dataLayer.\r\n * @param initializationPromisesMap Map of appIds to their initialization promises.\r\n * @param dynamicConfigPromisesList Array of dynamic config fetch promises.\r\n * @param measurementIdToAppId Map of GA measurementIDs to corresponding Firebase appId.\r\n */\r\nfunction wrapGtag(gtagCore, \r\n/**\r\n * Allows wrapped gtag calls to wait on whichever intialization promises are required,\r\n * depending on the contents of the gtag params' `send_to` field, if any.\r\n */\r\ninitializationPromisesMap, \r\n/**\r\n * Wrapped gtag calls sometimes require all dynamic config fetches to have returned\r\n * before determining what initialization promises (which include FIDs) to wait for.\r\n */\r\ndynamicConfigPromisesList, \r\n/**\r\n * Wrapped gtag config calls can narrow down which initialization promise (with FID)\r\n * to wait for if the measurementId is already fetched, by getting the corresponding appId,\r\n * which is the key for the initialization promises map.\r\n */\r\nmeasurementIdToAppId) {\r\n    /**\r\n     * Wrapper around gtag that ensures FID is sent with gtag calls.\r\n     * @param command Gtag command type.\r\n     * @param idOrNameOrParams Measurement ID if command is EVENT/CONFIG, params if command is SET.\r\n     * @param gtagParams Params if event is EVENT/CONFIG.\r\n     */\r\n    async function gtagWrapper(command, ...args) {\r\n        try {\r\n            // If event, check that relevant initialization promises have completed.\r\n            if (command === \"event\" /* GtagCommand.EVENT */) {\r\n                const [measurementId, gtagParams] = args;\r\n                // If EVENT, second arg must be measurementId.\r\n                await gtagOnEvent(gtagCore, initializationPromisesMap, dynamicConfigPromisesList, measurementId, gtagParams);\r\n            }\r\n            else if (command === \"config\" /* GtagCommand.CONFIG */) {\r\n                const [measurementId, gtagParams] = args;\r\n                // If CONFIG, second arg must be measurementId.\r\n                await gtagOnConfig(gtagCore, initializationPromisesMap, dynamicConfigPromisesList, measurementIdToAppId, measurementId, gtagParams);\r\n            }\r\n            else if (command === \"consent\" /* GtagCommand.CONSENT */) {\r\n                const [consentAction, gtagParams] = args;\r\n                // consentAction can be one of 'default' or 'update'.\r\n                gtagCore(\"consent\" /* GtagCommand.CONSENT */, consentAction, gtagParams);\r\n            }\r\n            else if (command === \"get\" /* GtagCommand.GET */) {\r\n                const [measurementId, fieldName, callback] = args;\r\n                gtagCore(\"get\" /* GtagCommand.GET */, measurementId, fieldName, callback);\r\n            }\r\n            else if (command === \"set\" /* GtagCommand.SET */) {\r\n                const [customParams] = args;\r\n                // If SET, second arg must be params.\r\n                gtagCore(\"set\" /* GtagCommand.SET */, customParams);\r\n            }\r\n            else {\r\n                gtagCore(command, ...args);\r\n            }\r\n        }\r\n        catch (e) {\r\n            logger.error(e);\r\n        }\r\n    }\r\n    return gtagWrapper;\r\n}\r\n/**\r\n * Creates global gtag function or wraps existing one if found.\r\n * This wrapped function attaches Firebase instance ID (FID) to gtag 'config' and\r\n * 'event' calls that belong to the GAID associated with this Firebase instance.\r\n *\r\n * @param initializationPromisesMap Map of appIds to their initialization promises.\r\n * @param dynamicConfigPromisesList Array of dynamic config fetch promises.\r\n * @param measurementIdToAppId Map of GA measurementIDs to corresponding Firebase appId.\r\n * @param dataLayerName Name of global GA datalayer array.\r\n * @param gtagFunctionName Name of global gtag function (\"gtag\" if not user-specified).\r\n */\r\nfunction wrapOrCreateGtag(initializationPromisesMap, dynamicConfigPromisesList, measurementIdToAppId, dataLayerName, gtagFunctionName) {\r\n    // Create a basic core gtag function\r\n    let gtagCore = function (..._args) {\r\n        // Must push IArguments object, not an array.\r\n        window[dataLayerName].push(arguments);\r\n    };\r\n    // Replace it with existing one if found\r\n    if (window[gtagFunctionName] &&\r\n        typeof window[gtagFunctionName] === 'function') {\r\n        // @ts-ignore\r\n        gtagCore = window[gtagFunctionName];\r\n    }\r\n    window[gtagFunctionName] = wrapGtag(gtagCore, initializationPromisesMap, dynamicConfigPromisesList, measurementIdToAppId);\r\n    return {\r\n        gtagCore,\r\n        wrappedGtag: window[gtagFunctionName]\r\n    };\r\n}\r\n/**\r\n * Returns the script tag in the DOM matching both the gtag url pattern\r\n * and the provided data layer name.\r\n */\r\nfunction findGtagScriptOnPage(dataLayerName) {\r\n    const scriptTags = window.document.getElementsByTagName('script');\r\n    for (const tag of Object.values(scriptTags)) {\r\n        if (tag.src &&\r\n            tag.src.includes(GTAG_URL) &&\r\n            tag.src.includes(dataLayerName)) {\r\n            return tag;\r\n        }\r\n    }\r\n    return null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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 * Backoff factor for 503 errors, which we want to be conservative about\r\n * to avoid overloading servers. Each retry interval will be\r\n * BASE_INTERVAL_MILLIS * LONG_RETRY_FACTOR ^ retryCount, so the second one\r\n * will be ~30 seconds (with fuzzing).\r\n */\r\nconst LONG_RETRY_FACTOR = 30;\r\n/**\r\n * Base wait interval to multiplied by backoffFactor^backoffCount.\r\n */\r\nconst BASE_INTERVAL_MILLIS = 1000;\r\n/**\r\n * Stubbable retry data storage class.\r\n */\r\nclass RetryData {\r\n    constructor(throttleMetadata = {}, intervalMillis = BASE_INTERVAL_MILLIS) {\r\n        this.throttleMetadata = throttleMetadata;\r\n        this.intervalMillis = intervalMillis;\r\n    }\r\n    getThrottleMetadata(appId) {\r\n        return this.throttleMetadata[appId];\r\n    }\r\n    setThrottleMetadata(appId, metadata) {\r\n        this.throttleMetadata[appId] = metadata;\r\n    }\r\n    deleteThrottleMetadata(appId) {\r\n        delete this.throttleMetadata[appId];\r\n    }\r\n}\r\nconst defaultRetryData = new RetryData();\r\n/**\r\n * Set GET request headers.\r\n * @param apiKey App API key.\r\n */\r\nfunction getHeaders(apiKey) {\r\n    return new Headers({\r\n        Accept: 'application/json',\r\n        'x-goog-api-key': apiKey\r\n    });\r\n}\r\n/**\r\n * Fetches dynamic config from backend.\r\n * @param app Firebase app to fetch config for.\r\n */\r\nasync function fetchDynamicConfig(appFields) {\r\n    var _a;\r\n    const { appId, apiKey } = appFields;\r\n    const request = {\r\n        method: 'GET',\r\n        headers: getHeaders(apiKey)\r\n    };\r\n    const appUrl = DYNAMIC_CONFIG_URL.replace('{app-id}', appId);\r\n    const response = await fetch(appUrl, request);\r\n    if (response.status !== 200 && response.status !== 304) {\r\n        let errorMessage = '';\r\n        try {\r\n            // Try to get any error message text from server response.\r\n            const jsonResponse = (await response.json());\r\n            if ((_a = jsonResponse.error) === null || _a === void 0 ? void 0 : _a.message) {\r\n                errorMessage = jsonResponse.error.message;\r\n            }\r\n        }\r\n        catch (_ignored) { }\r\n        throw ERROR_FACTORY.create(\"config-fetch-failed\" /* AnalyticsError.CONFIG_FETCH_FAILED */, {\r\n            httpStatus: response.status,\r\n            responseMessage: errorMessage\r\n        });\r\n    }\r\n    return response.json();\r\n}\r\n/**\r\n * Fetches dynamic config from backend, retrying if failed.\r\n * @param app Firebase app to fetch config for.\r\n */\r\nasync function fetchDynamicConfigWithRetry(app, \r\n// retryData and timeoutMillis are parameterized to allow passing a different value for testing.\r\nretryData = defaultRetryData, timeoutMillis) {\r\n    const { appId, apiKey, measurementId } = app.options;\r\n    if (!appId) {\r\n        throw ERROR_FACTORY.create(\"no-app-id\" /* AnalyticsError.NO_APP_ID */);\r\n    }\r\n    if (!apiKey) {\r\n        if (measurementId) {\r\n            return {\r\n                measurementId,\r\n                appId\r\n            };\r\n        }\r\n        throw ERROR_FACTORY.create(\"no-api-key\" /* AnalyticsError.NO_API_KEY */);\r\n    }\r\n    const throttleMetadata = retryData.getThrottleMetadata(appId) || {\r\n        backoffCount: 0,\r\n        throttleEndTimeMillis: Date.now()\r\n    };\r\n    const signal = new AnalyticsAbortSignal();\r\n    setTimeout(async () => {\r\n        // Note a very low delay, eg < 10ms, can elapse before listeners are initialized.\r\n        signal.abort();\r\n    }, timeoutMillis !== undefined ? timeoutMillis : FETCH_TIMEOUT_MILLIS);\r\n    return attemptFetchDynamicConfigWithRetry({ appId, apiKey, measurementId }, throttleMetadata, signal, retryData);\r\n}\r\n/**\r\n * Runs one retry attempt.\r\n * @param appFields Necessary app config fields.\r\n * @param throttleMetadata Ongoing metadata to determine throttling times.\r\n * @param signal Abort signal.\r\n */\r\nasync function attemptFetchDynamicConfigWithRetry(appFields, { throttleEndTimeMillis, backoffCount }, signal, retryData = defaultRetryData // for testing\r\n) {\r\n    var _a;\r\n    const { appId, measurementId } = appFields;\r\n    // Starts with a (potentially zero) timeout to support resumption from stored state.\r\n    // Ensures the throttle end time is honored if the last attempt timed out.\r\n    // Note the SDK will never make a request if the fetch timeout expires at this point.\r\n    try {\r\n        await setAbortableTimeout(signal, throttleEndTimeMillis);\r\n    }\r\n    catch (e) {\r\n        if (measurementId) {\r\n            logger.warn(`Timed out fetching this Firebase app's measurement ID from the server.` +\r\n                ` Falling back to the measurement ID ${measurementId}` +\r\n                ` provided in the \"measurementId\" field in the local Firebase config. [${e === null || e === void 0 ? void 0 : e.message}]`);\r\n            return { appId, measurementId };\r\n        }\r\n        throw e;\r\n    }\r\n    try {\r\n        const response = await fetchDynamicConfig(appFields);\r\n        // Note the SDK only clears throttle state if response is success or non-retriable.\r\n        retryData.deleteThrottleMetadata(appId);\r\n        return response;\r\n    }\r\n    catch (e) {\r\n        const error = e;\r\n        if (!isRetriableError(error)) {\r\n            retryData.deleteThrottleMetadata(appId);\r\n            if (measurementId) {\r\n                logger.warn(`Failed to fetch this Firebase app's measurement ID from the server.` +\r\n                    ` Falling back to the measurement ID ${measurementId}` +\r\n                    ` provided in the \"measurementId\" field in the local Firebase config. [${error === null || error === void 0 ? void 0 : error.message}]`);\r\n                return { appId, measurementId };\r\n            }\r\n            else {\r\n                throw e;\r\n            }\r\n        }\r\n        const backoffMillis = Number((_a = error === null || error === void 0 ? void 0 : error.customData) === null || _a === void 0 ? void 0 : _a.httpStatus) === 503\r\n            ? calculateBackoffMillis(backoffCount, retryData.intervalMillis, LONG_RETRY_FACTOR)\r\n            : calculateBackoffMillis(backoffCount, retryData.intervalMillis);\r\n        // Increments backoff state.\r\n        const throttleMetadata = {\r\n            throttleEndTimeMillis: Date.now() + backoffMillis,\r\n            backoffCount: backoffCount + 1\r\n        };\r\n        // Persists state.\r\n        retryData.setThrottleMetadata(appId, throttleMetadata);\r\n        logger.debug(`Calling attemptFetch again in ${backoffMillis} millis`);\r\n        return attemptFetchDynamicConfigWithRetry(appFields, throttleMetadata, signal, retryData);\r\n    }\r\n}\r\n/**\r\n * Supports waiting on a backoff by:\r\n *\r\n * <ul>\r\n *   <li>Promisifying setTimeout, so we can set a timeout in our Promise chain</li>\r\n *   <li>Listening on a signal bus for abort events, just like the Fetch API</li>\r\n *   <li>Failing in the same way the Fetch API fails, so timing out a live request and a throttled\r\n *       request appear the same.</li>\r\n * </ul>\r\n *\r\n * <p>Visible for testing.\r\n */\r\nfunction setAbortableTimeout(signal, throttleEndTimeMillis) {\r\n    return new Promise((resolve, reject) => {\r\n        // Derives backoff from given end time, normalizing negative numbers to zero.\r\n        const backoffMillis = Math.max(throttleEndTimeMillis - Date.now(), 0);\r\n        const timeout = setTimeout(resolve, backoffMillis);\r\n        // Adds listener, rather than sets onabort, because signal is a shared object.\r\n        signal.addEventListener(() => {\r\n            clearTimeout(timeout);\r\n            // If the request completes before this timeout, the rejection has no effect.\r\n            reject(ERROR_FACTORY.create(\"fetch-throttle\" /* AnalyticsError.FETCH_THROTTLE */, {\r\n                throttleEndTimeMillis\r\n            }));\r\n        });\r\n    });\r\n}\r\n/**\r\n * Returns true if the {@link Error} indicates a fetch request may succeed later.\r\n */\r\nfunction isRetriableError(e) {\r\n    if (!(e instanceof FirebaseError) || !e.customData) {\r\n        return false;\r\n    }\r\n    // Uses string index defined by ErrorData, which FirebaseError implements.\r\n    const httpStatus = Number(e.customData['httpStatus']);\r\n    return (httpStatus === 429 ||\r\n        httpStatus === 500 ||\r\n        httpStatus === 503 ||\r\n        httpStatus === 504);\r\n}\r\n/**\r\n * Shims a minimal AbortSignal (copied from Remote Config).\r\n *\r\n * <p>AbortController's AbortSignal conveniently decouples fetch timeout logic from other aspects\r\n * of networking, such as retries. Firebase doesn't use AbortController enough to justify a\r\n * polyfill recommendation, like we do with the Fetch API, but this minimal shim can easily be\r\n * swapped out if/when we do.\r\n */\r\nclass AnalyticsAbortSignal {\r\n    constructor() {\r\n        this.listeners = [];\r\n    }\r\n    addEventListener(listener) {\r\n        this.listeners.push(listener);\r\n    }\r\n    abort() {\r\n        this.listeners.forEach(listener => listener());\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Event parameters to set on 'gtag' during initialization.\r\n */\r\nlet defaultEventParametersForInit;\r\n/**\r\n * Logs an analytics event through the Firebase SDK.\r\n *\r\n * @param gtagFunction Wrapped gtag function that waits for fid to be set before sending an event\r\n * @param eventName Google Analytics event name, choose from standard list or use a custom string.\r\n * @param eventParams Analytics event parameters.\r\n */\r\nasync function logEvent$1(gtagFunction, initializationPromise, eventName, eventParams, options) {\r\n    if (options && options.global) {\r\n        gtagFunction(\"event\" /* GtagCommand.EVENT */, eventName, eventParams);\r\n        return;\r\n    }\r\n    else {\r\n        const measurementId = await initializationPromise;\r\n        const params = Object.assign(Object.assign({}, eventParams), { 'send_to': measurementId });\r\n        gtagFunction(\"event\" /* GtagCommand.EVENT */, eventName, params);\r\n    }\r\n}\r\n/**\r\n * Set screen_name parameter for this Google Analytics ID.\r\n *\r\n * @deprecated Use {@link logEvent} with `eventName` as 'screen_view' and add relevant `eventParams`.\r\n * See {@link https://firebase.google.com/docs/analytics/screenviews | Track Screenviews}.\r\n *\r\n * @param gtagFunction Wrapped gtag function that waits for fid to be set before sending an event\r\n * @param screenName Screen name string to set.\r\n */\r\nasync function setCurrentScreen$1(gtagFunction, initializationPromise, screenName, options) {\r\n    if (options && options.global) {\r\n        gtagFunction(\"set\" /* GtagCommand.SET */, { 'screen_name': screenName });\r\n        return Promise.resolve();\r\n    }\r\n    else {\r\n        const measurementId = await initializationPromise;\r\n        gtagFunction(\"config\" /* GtagCommand.CONFIG */, measurementId, {\r\n            update: true,\r\n            'screen_name': screenName\r\n        });\r\n    }\r\n}\r\n/**\r\n * Set user_id parameter for this Google Analytics ID.\r\n *\r\n * @param gtagFunction Wrapped gtag function that waits for fid to be set before sending an event\r\n * @param id User ID string to set\r\n */\r\nasync function setUserId$1(gtagFunction, initializationPromise, id, options) {\r\n    if (options && options.global) {\r\n        gtagFunction(\"set\" /* GtagCommand.SET */, { 'user_id': id });\r\n        return Promise.resolve();\r\n    }\r\n    else {\r\n        const measurementId = await initializationPromise;\r\n        gtagFunction(\"config\" /* GtagCommand.CONFIG */, measurementId, {\r\n            update: true,\r\n            'user_id': id\r\n        });\r\n    }\r\n}\r\n/**\r\n * Set all other user properties other than user_id and screen_name.\r\n *\r\n * @param gtagFunction Wrapped gtag function that waits for fid to be set before sending an event\r\n * @param properties Map of user properties to set\r\n */\r\nasync function setUserProperties$1(gtagFunction, initializationPromise, properties, options) {\r\n    if (options && options.global) {\r\n        const flatProperties = {};\r\n        for (const key of Object.keys(properties)) {\r\n            // use dot notation for merge behavior in gtag.js\r\n            flatProperties[`user_properties.${key}`] = properties[key];\r\n        }\r\n        gtagFunction(\"set\" /* GtagCommand.SET */, flatProperties);\r\n        return Promise.resolve();\r\n    }\r\n    else {\r\n        const measurementId = await initializationPromise;\r\n        gtagFunction(\"config\" /* GtagCommand.CONFIG */, measurementId, {\r\n            update: true,\r\n            'user_properties': properties\r\n        });\r\n    }\r\n}\r\n/**\r\n * Retrieves a unique Google Analytics identifier for the web client.\r\n * See {@link https://developers.google.com/analytics/devguides/collection/ga4/reference/config#client_id | client_id}.\r\n *\r\n * @param gtagFunction Wrapped gtag function that waits for fid to be set before sending an event\r\n */\r\nasync function internalGetGoogleAnalyticsClientId(gtagFunction, initializationPromise) {\r\n    const measurementId = await initializationPromise;\r\n    return new Promise((resolve, reject) => {\r\n        gtagFunction(\"get\" /* GtagCommand.GET */, measurementId, 'client_id', (clientId) => {\r\n            if (!clientId) {\r\n                reject(ERROR_FACTORY.create(\"no-client-id\" /* AnalyticsError.NO_CLIENT_ID */));\r\n            }\r\n            resolve(clientId);\r\n        });\r\n    });\r\n}\r\n/**\r\n * Set whether collection is enabled for this ID.\r\n *\r\n * @param enabled If true, collection is enabled for this ID.\r\n */\r\nasync function setAnalyticsCollectionEnabled$1(initializationPromise, enabled) {\r\n    const measurementId = await initializationPromise;\r\n    window[`ga-disable-${measurementId}`] = !enabled;\r\n}\r\n/**\r\n * Consent parameters to default to during 'gtag' initialization.\r\n */\r\nlet defaultConsentSettingsForInit;\r\n/**\r\n * Sets the variable {@link defaultConsentSettingsForInit} for use in the initialization of\r\n * analytics.\r\n *\r\n * @param consentSettings Maps the applicable end user consent state for gtag.js.\r\n */\r\nfunction _setConsentDefaultForInit(consentSettings) {\r\n    defaultConsentSettingsForInit = consentSettings;\r\n}\r\n/**\r\n * Sets the variable `defaultEventParametersForInit` for use in the initialization of\r\n * analytics.\r\n *\r\n * @param customParams Any custom params the user may pass to gtag.js.\r\n */\r\nfunction _setDefaultEventParametersForInit(customParams) {\r\n    defaultEventParametersForInit = customParams;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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\nasync function validateIndexedDB() {\r\n    if (!isIndexedDBAvailable()) {\r\n        logger.warn(ERROR_FACTORY.create(\"indexeddb-unavailable\" /* AnalyticsError.INDEXEDDB_UNAVAILABLE */, {\r\n            errorInfo: 'IndexedDB is not available in this environment.'\r\n        }).message);\r\n        return false;\r\n    }\r\n    else {\r\n        try {\r\n            await validateIndexedDBOpenable();\r\n        }\r\n        catch (e) {\r\n            logger.warn(ERROR_FACTORY.create(\"indexeddb-unavailable\" /* AnalyticsError.INDEXEDDB_UNAVAILABLE */, {\r\n                errorInfo: e === null || e === void 0 ? void 0 : e.toString()\r\n            }).message);\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * Initialize the analytics instance in gtag.js by calling config command with fid.\r\n *\r\n * NOTE: We combine analytics initialization and setting fid together because we want fid to be\r\n * part of the `page_view` event that's sent during the initialization\r\n * @param app Firebase app\r\n * @param gtagCore The gtag function that's not wrapped.\r\n * @param dynamicConfigPromisesList Array of all dynamic config promises.\r\n * @param measurementIdToAppId Maps measurementID to appID.\r\n * @param installations _FirebaseInstallationsInternal instance.\r\n *\r\n * @returns Measurement ID.\r\n */\r\nasync function _initializeAnalytics(app, dynamicConfigPromisesList, measurementIdToAppId, installations, gtagCore, dataLayerName, options) {\r\n    var _a;\r\n    const dynamicConfigPromise = fetchDynamicConfigWithRetry(app);\r\n    // Once fetched, map measurementIds to appId, for ease of lookup in wrapped gtag function.\r\n    dynamicConfigPromise\r\n        .then(config => {\r\n        measurementIdToAppId[config.measurementId] = config.appId;\r\n        if (app.options.measurementId &&\r\n            config.measurementId !== app.options.measurementId) {\r\n            logger.warn(`The measurement ID in the local Firebase config (${app.options.measurementId})` +\r\n                ` does not match the measurement ID fetched from the server (${config.measurementId}).` +\r\n                ` To ensure analytics events are always sent to the correct Analytics property,` +\r\n                ` update the` +\r\n                ` measurement ID field in the local config or remove it from the local config.`);\r\n        }\r\n    })\r\n        .catch(e => logger.error(e));\r\n    // Add to list to track state of all dynamic config promises.\r\n    dynamicConfigPromisesList.push(dynamicConfigPromise);\r\n    const fidPromise = validateIndexedDB().then(envIsValid => {\r\n        if (envIsValid) {\r\n            return installations.getId();\r\n        }\r\n        else {\r\n            return undefined;\r\n        }\r\n    });\r\n    const [dynamicConfig, fid] = await Promise.all([\r\n        dynamicConfigPromise,\r\n        fidPromise\r\n    ]);\r\n    // Detect if user has already put the gtag <script> tag on this page with the passed in\r\n    // data layer name.\r\n    if (!findGtagScriptOnPage(dataLayerName)) {\r\n        insertScriptTag(dataLayerName, dynamicConfig.measurementId);\r\n    }\r\n    // Detects if there are consent settings that need to be configured.\r\n    if (defaultConsentSettingsForInit) {\r\n        gtagCore(\"consent\" /* GtagCommand.CONSENT */, 'default', defaultConsentSettingsForInit);\r\n        _setConsentDefaultForInit(undefined);\r\n    }\r\n    // This command initializes gtag.js and only needs to be called once for the entire web app,\r\n    // but since it is idempotent, we can call it multiple times.\r\n    // We keep it together with other initialization logic for better code structure.\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    gtagCore('js', new Date());\r\n    // User config added first. We don't want users to accidentally overwrite\r\n    // base Firebase config properties.\r\n    const configProperties = (_a = options === null || options === void 0 ? void 0 : options.config) !== null && _a !== void 0 ? _a : {};\r\n    // guard against developers accidentally setting properties with prefix `firebase_`\r\n    configProperties[ORIGIN_KEY] = 'firebase';\r\n    configProperties.update = true;\r\n    if (fid != null) {\r\n        configProperties[GA_FID_KEY] = fid;\r\n    }\r\n    // It should be the first config command called on this GA-ID\r\n    // Initialize this GA-ID and set FID on it using the gtag config API.\r\n    // Note: This will trigger a page_view event unless 'send_page_view' is set to false in\r\n    // `configProperties`.\r\n    gtagCore(\"config\" /* GtagCommand.CONFIG */, dynamicConfig.measurementId, configProperties);\r\n    // Detects if there is data that will be set on every event logged from the SDK.\r\n    if (defaultEventParametersForInit) {\r\n        gtagCore(\"set\" /* GtagCommand.SET */, defaultEventParametersForInit);\r\n        _setDefaultEventParametersForInit(undefined);\r\n    }\r\n    return dynamicConfig.measurementId;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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 * Analytics Service class.\r\n */\r\nclass AnalyticsService {\r\n    constructor(app) {\r\n        this.app = app;\r\n    }\r\n    _delete() {\r\n        delete initializationPromisesMap[this.app.options.appId];\r\n        return Promise.resolve();\r\n    }\r\n}\r\n/**\r\n * Maps appId to full initialization promise. Wrapped gtag calls must wait on\r\n * all or some of these, depending on the call's `send_to` param and the status\r\n * of the dynamic config fetches (see below).\r\n */\r\nlet initializationPromisesMap = {};\r\n/**\r\n * List of dynamic config fetch promises. In certain cases, wrapped gtag calls\r\n * wait on all these to be complete in order to determine if it can selectively\r\n * wait for only certain initialization (FID) promises or if it must wait for all.\r\n */\r\nlet dynamicConfigPromisesList = [];\r\n/**\r\n * Maps fetched measurementIds to appId. Populated when the app's dynamic config\r\n * fetch completes. If already populated, gtag config calls can use this to\r\n * selectively wait for only this app's initialization promise (FID) instead of all\r\n * initialization promises.\r\n */\r\nconst measurementIdToAppId = {};\r\n/**\r\n * Name for window global data layer array used by GA: defaults to 'dataLayer'.\r\n */\r\nlet dataLayerName = 'dataLayer';\r\n/**\r\n * Name for window global gtag function used by GA: defaults to 'gtag'.\r\n */\r\nlet gtagName = 'gtag';\r\n/**\r\n * Reproduction of standard gtag function or reference to existing\r\n * gtag function on window object.\r\n */\r\nlet gtagCoreFunction;\r\n/**\r\n * Wrapper around gtag function that ensures FID is sent with all\r\n * relevant event and config calls.\r\n */\r\nlet wrappedGtagFunction;\r\n/**\r\n * Flag to ensure page initialization steps (creation or wrapping of\r\n * dataLayer and gtag script) are only run once per page load.\r\n */\r\nlet globalInitDone = false;\r\n/**\r\n * Configures Firebase Analytics to use custom `gtag` or `dataLayer` names.\r\n * Intended to be used if `gtag.js` script has been installed on\r\n * this page independently of Firebase Analytics, and is using non-default\r\n * names for either the `gtag` function or for `dataLayer`.\r\n * Must be called before calling `getAnalytics()` or it won't\r\n * have any effect.\r\n *\r\n * @public\r\n *\r\n * @param options - Custom gtag and dataLayer names.\r\n */\r\nfunction settings(options) {\r\n    if (globalInitDone) {\r\n        throw ERROR_FACTORY.create(\"already-initialized\" /* AnalyticsError.ALREADY_INITIALIZED */);\r\n    }\r\n    if (options.dataLayerName) {\r\n        dataLayerName = options.dataLayerName;\r\n    }\r\n    if (options.gtagName) {\r\n        gtagName = options.gtagName;\r\n    }\r\n}\r\n/**\r\n * Returns true if no environment mismatch is found.\r\n * If environment mismatches are found, throws an INVALID_ANALYTICS_CONTEXT\r\n * error that also lists details for each mismatch found.\r\n */\r\nfunction warnOnBrowserContextMismatch() {\r\n    const mismatchedEnvMessages = [];\r\n    if (isBrowserExtension()) {\r\n        mismatchedEnvMessages.push('This is a browser extension environment.');\r\n    }\r\n    if (!areCookiesEnabled()) {\r\n        mismatchedEnvMessages.push('Cookies are not available.');\r\n    }\r\n    if (mismatchedEnvMessages.length > 0) {\r\n        const details = mismatchedEnvMessages\r\n            .map((message, index) => `(${index + 1}) ${message}`)\r\n            .join(' ');\r\n        const err = ERROR_FACTORY.create(\"invalid-analytics-context\" /* AnalyticsError.INVALID_ANALYTICS_CONTEXT */, {\r\n            errorInfo: details\r\n        });\r\n        logger.warn(err.message);\r\n    }\r\n}\r\n/**\r\n * Analytics instance factory.\r\n * @internal\r\n */\r\nfunction factory(app, installations, options) {\r\n    warnOnBrowserContextMismatch();\r\n    const appId = app.options.appId;\r\n    if (!appId) {\r\n        throw ERROR_FACTORY.create(\"no-app-id\" /* AnalyticsError.NO_APP_ID */);\r\n    }\r\n    if (!app.options.apiKey) {\r\n        if (app.options.measurementId) {\r\n            logger.warn(`The \"apiKey\" field is empty in the local Firebase config. This is needed to fetch the latest` +\r\n                ` measurement ID for this Firebase app. Falling back to the measurement ID ${app.options.measurementId}` +\r\n                ` provided in the \"measurementId\" field in the local Firebase config.`);\r\n        }\r\n        else {\r\n            throw ERROR_FACTORY.create(\"no-api-key\" /* AnalyticsError.NO_API_KEY */);\r\n        }\r\n    }\r\n    if (initializationPromisesMap[appId] != null) {\r\n        throw ERROR_FACTORY.create(\"already-exists\" /* AnalyticsError.ALREADY_EXISTS */, {\r\n            id: appId\r\n        });\r\n    }\r\n    if (!globalInitDone) {\r\n        // Steps here should only be done once per page: creation or wrapping\r\n        // of dataLayer and global gtag function.\r\n        getOrCreateDataLayer(dataLayerName);\r\n        const { wrappedGtag, gtagCore } = wrapOrCreateGtag(initializationPromisesMap, dynamicConfigPromisesList, measurementIdToAppId, dataLayerName, gtagName);\r\n        wrappedGtagFunction = wrappedGtag;\r\n        gtagCoreFunction = gtagCore;\r\n        globalInitDone = true;\r\n    }\r\n    // Async but non-blocking.\r\n    // This map reflects the completion state of all promises for each appId.\r\n    initializationPromisesMap[appId] = _initializeAnalytics(app, dynamicConfigPromisesList, measurementIdToAppId, installations, gtagCoreFunction, dataLayerName, options);\r\n    const analyticsInstance = new AnalyticsService(app);\r\n    return analyticsInstance;\r\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/**\r\n * Returns an {@link Analytics} instance for the given app.\r\n *\r\n * @public\r\n *\r\n * @param app - The {@link @firebase/app#FirebaseApp} to use.\r\n */\r\nfunction getAnalytics(app = getApp()) {\r\n    app = getModularInstance(app);\r\n    // Dependencies\r\n    const analyticsProvider = _getProvider(app, ANALYTICS_TYPE);\r\n    if (analyticsProvider.isInitialized()) {\r\n        return analyticsProvider.getImmediate();\r\n    }\r\n    return initializeAnalytics(app);\r\n}\r\n/**\r\n * Returns an {@link Analytics} instance for the given app.\r\n *\r\n * @public\r\n *\r\n * @param app - The {@link @firebase/app#FirebaseApp} to use.\r\n */\r\nfunction initializeAnalytics(app, options = {}) {\r\n    // Dependencies\r\n    const analyticsProvider = _getProvider(app, ANALYTICS_TYPE);\r\n    if (analyticsProvider.isInitialized()) {\r\n        const existingInstance = analyticsProvider.getImmediate();\r\n        if (deepEqual(options, analyticsProvider.getOptions())) {\r\n            return existingInstance;\r\n        }\r\n        else {\r\n            throw ERROR_FACTORY.create(\"already-initialized\" /* AnalyticsError.ALREADY_INITIALIZED */);\r\n        }\r\n    }\r\n    const analyticsInstance = analyticsProvider.initialize({ options });\r\n    return analyticsInstance;\r\n}\r\n/**\r\n * This is a public static method provided to users that wraps four different checks:\r\n *\r\n * 1. Check if it's not a browser extension environment.\r\n * 2. Check if cookies are enabled in current browser.\r\n * 3. Check if IndexedDB is supported by the browser environment.\r\n * 4. Check if the current browser context is valid for using `IndexedDB.open()`.\r\n *\r\n * @public\r\n *\r\n */\r\nasync function isSupported() {\r\n    if (isBrowserExtension()) {\r\n        return false;\r\n    }\r\n    if (!areCookiesEnabled()) {\r\n        return false;\r\n    }\r\n    if (!isIndexedDBAvailable()) {\r\n        return false;\r\n    }\r\n    try {\r\n        const isDBOpenable = await validateIndexedDBOpenable();\r\n        return isDBOpenable;\r\n    }\r\n    catch (error) {\r\n        return false;\r\n    }\r\n}\r\n/**\r\n * Use gtag `config` command to set `screen_name`.\r\n *\r\n * @public\r\n *\r\n * @deprecated Use {@link logEvent} with `eventName` as 'screen_view' and add relevant `eventParams`.\r\n * See {@link https://firebase.google.com/docs/analytics/screenviews | Track Screenviews}.\r\n *\r\n * @param analyticsInstance - The {@link Analytics} instance.\r\n * @param screenName - Screen name to set.\r\n */\r\nfunction setCurrentScreen(analyticsInstance, screenName, options) {\r\n    analyticsInstance = getModularInstance(analyticsInstance);\r\n    setCurrentScreen$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], screenName, options).catch(e => logger.error(e));\r\n}\r\n/**\r\n * Retrieves a unique Google Analytics identifier for the web client.\r\n * See {@link https://developers.google.com/analytics/devguides/collection/ga4/reference/config#client_id | client_id}.\r\n *\r\n * @public\r\n *\r\n * @param app - The {@link @firebase/app#FirebaseApp} to use.\r\n */\r\nasync function getGoogleAnalyticsClientId(analyticsInstance) {\r\n    analyticsInstance = getModularInstance(analyticsInstance);\r\n    return internalGetGoogleAnalyticsClientId(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId]);\r\n}\r\n/**\r\n * Use gtag `config` command to set `user_id`.\r\n *\r\n * @public\r\n *\r\n * @param analyticsInstance - The {@link Analytics} instance.\r\n * @param id - User ID to set.\r\n */\r\nfunction setUserId(analyticsInstance, id, options) {\r\n    analyticsInstance = getModularInstance(analyticsInstance);\r\n    setUserId$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], id, options).catch(e => logger.error(e));\r\n}\r\n/**\r\n * Use gtag `config` command to set all params specified.\r\n *\r\n * @public\r\n */\r\nfunction setUserProperties(analyticsInstance, properties, options) {\r\n    analyticsInstance = getModularInstance(analyticsInstance);\r\n    setUserProperties$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], properties, options).catch(e => logger.error(e));\r\n}\r\n/**\r\n * Sets whether Google Analytics collection is enabled for this app on this device.\r\n * Sets global `window['ga-disable-analyticsId'] = true;`\r\n *\r\n * @public\r\n *\r\n * @param analyticsInstance - The {@link Analytics} instance.\r\n * @param enabled - If true, enables collection, if false, disables it.\r\n */\r\nfunction setAnalyticsCollectionEnabled(analyticsInstance, enabled) {\r\n    analyticsInstance = getModularInstance(analyticsInstance);\r\n    setAnalyticsCollectionEnabled$1(initializationPromisesMap[analyticsInstance.app.options.appId], enabled).catch(e => logger.error(e));\r\n}\r\n/**\r\n * Adds data that will be set on every event logged from the SDK, including automatic ones.\r\n * With gtag's \"set\" command, the values passed persist on the current page and are passed with\r\n * all subsequent events.\r\n * @public\r\n * @param customParams - Any custom params the user may pass to gtag.js.\r\n */\r\nfunction setDefaultEventParameters(customParams) {\r\n    // Check if reference to existing gtag function on window object exists\r\n    if (wrappedGtagFunction) {\r\n        wrappedGtagFunction(\"set\" /* GtagCommand.SET */, customParams);\r\n    }\r\n    else {\r\n        _setDefaultEventParametersForInit(customParams);\r\n    }\r\n}\r\n/**\r\n * Sends a Google Analytics event with given `eventParams`. This method\r\n * automatically associates this logged event with this Firebase web\r\n * app instance on this device.\r\n * List of official event parameters can be found in the gtag.js\r\n * reference documentation:\r\n * {@link https://developers.google.com/gtagjs/reference/ga4-events\r\n * | the GA4 reference documentation}.\r\n *\r\n * @public\r\n */\r\nfunction logEvent(analyticsInstance, eventName, eventParams, options) {\r\n    analyticsInstance = getModularInstance(analyticsInstance);\r\n    logEvent$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], eventName, eventParams, options).catch(e => logger.error(e));\r\n}\r\n/**\r\n * Sets the applicable end user consent state for this web app across all gtag references once\r\n * Firebase Analytics is initialized.\r\n *\r\n * Use the {@link ConsentSettings} to specify individual consent type values. By default consent\r\n * types are set to \"granted\".\r\n * @public\r\n * @param consentSettings - Maps the applicable end user consent state for gtag.js.\r\n */\r\nfunction setConsent(consentSettings) {\r\n    // Check if reference to existing gtag function on window object exists\r\n    if (wrappedGtagFunction) {\r\n        wrappedGtagFunction(\"consent\" /* GtagCommand.CONSENT */, 'update', consentSettings);\r\n    }\r\n    else {\r\n        _setConsentDefaultForInit(consentSettings);\r\n    }\r\n}\n\nconst name = \"@firebase/analytics\";\nconst version = \"0.10.4\";\n\n/**\r\n * The Firebase Analytics Web SDK.\r\n * This SDK does not work in a Node.js environment.\r\n *\r\n * @packageDocumentation\r\n */\r\nfunction registerAnalytics() {\r\n    _registerComponent(new Component(ANALYTICS_TYPE, (container, { options: analyticsOptions }) => {\r\n        // getImmediate for FirebaseApp will always succeed\r\n        const app = container.getProvider('app').getImmediate();\r\n        const installations = container\r\n            .getProvider('installations-internal')\r\n            .getImmediate();\r\n        return factory(app, installations, analyticsOptions);\r\n    }, \"PUBLIC\" /* ComponentType.PUBLIC */));\r\n    _registerComponent(new Component('analytics-internal', internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n    registerVersion(name, version);\r\n    // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n    registerVersion(name, version, 'esm2017');\r\n    function internalFactory(container) {\r\n        try {\r\n            const analytics = container.getProvider(ANALYTICS_TYPE).getImmediate();\r\n            return {\r\n                logEvent: (eventName, eventParams, options) => logEvent(analytics, eventName, eventParams, options)\r\n            };\r\n        }\r\n        catch (e) {\r\n            throw ERROR_FACTORY.create(\"interop-component-reg-failed\" /* AnalyticsError.INTEROP_COMPONENT_REG_FAILED */, {\r\n                reason: e\r\n            });\r\n        }\r\n    }\r\n}\r\nregisterAnalytics();\n\nexport { getAnalytics, getGoogleAnalyticsClientId, initializeAnalytics, isSupported, logEvent, setAnalyticsCollectionEnabled, setConsent, setCurrentScreen, setDefaultEventParameters, setUserId, setUserProperties, settings };\n//# sourceMappingURL=index.esm2017.js.map\n","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"10.12.2\";\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","import { _getProvider, getApp, SDK_VERSION as SDK_VERSION$1, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component, ComponentContainer, Provider } from '@firebase/component';\nimport { stringify, jsonEval, contains, assert, isNodeSdk, stringToByteArray, Sha1, base64, deepCopy, base64Encode, isMobileCordova, stringLength, Deferred, safeGet, isAdmin, isValidFormat, isEmpty, isReactNative, assertionError, map, querystring, errorPrefix, getModularInstance, getDefaultEmulatorHostnameAndPort, createMockUserToken } from '@firebase/util';\nimport { Logger, LogLevel } from '@firebase/logger';\n\nconst name = \"@firebase/database\";\nconst version = \"1.0.5\";\n\n/**\r\n * @license\r\n * Copyright 2019 Google LLC\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/** The semver (www.semver.org) version of the SDK. */\r\nlet SDK_VERSION = '';\r\n/**\r\n * SDK_VERSION should be set before any database instance is created\r\n * @internal\r\n */\r\nfunction setSDKVersion(version) {\r\n    SDK_VERSION = version;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass DOMStorageWrapper {\r\n    /**\r\n     * @param domStorage_ - The underlying storage object (e.g. localStorage or sessionStorage)\r\n     */\r\n    constructor(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 key - The key to save the value under\r\n     * @param value - The value being stored, or null to remove the key.\r\n     */\r\n    set(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     * @returns The value that was stored under this key, or null\r\n     */\r\n    get(key) {\r\n        const 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    remove(key) {\r\n        this.domStorage_.removeItem(this.prefixedName_(key));\r\n    }\r\n    prefixedName_(name) {\r\n        return this.prefix_ + name;\r\n    }\r\n    toString() {\r\n        return this.domStorage_.toString();\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass MemoryStorage {\r\n    constructor() {\r\n        this.cache_ = {};\r\n        this.isInMemoryStorage = true;\r\n    }\r\n    set(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    get(key) {\r\n        if (contains(this.cache_, key)) {\r\n            return this.cache_[key];\r\n        }\r\n        return null;\r\n    }\r\n    remove(key) {\r\n        delete this.cache_[key];\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 domStorageName - Name of the underlying storage object\r\n *   (e.g. 'localStorage' or 'sessionStorage').\r\n * @returns Turning off type information until a common interface is defined.\r\n */\r\nconst 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            const 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\nconst PersistentStorage = createStoragefor('localStorage');\r\n/** A storage object that only lasts one session */\r\nconst SessionStorage = createStoragefor('sessionStorage');\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst 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 */\r\nconst LUIDGenerator = (function () {\r\n    let 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 str - The string to hash\r\n * @returns {!string} The resulting hash\r\n */\r\nconst sha1 = function (str) {\r\n    const utf8Bytes = stringToByteArray(str);\r\n    const sha1 = new Sha1();\r\n    sha1.update(utf8Bytes);\r\n    const sha1Bytes = sha1.digest();\r\n    return base64.encodeByteArray(sha1Bytes);\r\n};\r\nconst buildLogMessage_ = function (...varArgs) {\r\n    let message = '';\r\n    for (let i = 0; i < varArgs.length; i++) {\r\n        const arg = varArgs[i];\r\n        if (Array.isArray(arg) ||\r\n            (arg &&\r\n                typeof arg === 'object' &&\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                typeof arg.length === 'number')) {\r\n            message += buildLogMessage_.apply(null, arg);\r\n        }\r\n        else if (typeof arg === 'object') {\r\n            message += stringify(arg);\r\n        }\r\n        else {\r\n            message += arg;\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 */\r\nlet logger = null;\r\n/**\r\n * Flag to check for log availability on first log message\r\n */\r\nlet firstLog_ = true;\r\n/**\r\n * The implementation of Firebase.enableLogging (defined here to break dependencies)\r\n * @param logger_ - A flag to turn on logging, or a custom logger\r\n * @param persistent - Whether or not to persist logging settings across refreshes\r\n */\r\nconst enableLogging$1 = 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    }\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\nconst log = function (...varArgs) {\r\n    if (firstLog_ === true) {\r\n        firstLog_ = false;\r\n        if (logger === null && SessionStorage.get('logging_enabled') === true) {\r\n            enableLogging$1(true);\r\n        }\r\n    }\r\n    if (logger) {\r\n        const message = buildLogMessage_.apply(null, varArgs);\r\n        logger(message);\r\n    }\r\n};\r\nconst logWrapper = function (prefix) {\r\n    return function (...varArgs) {\r\n        log(prefix, ...varArgs);\r\n    };\r\n};\r\nconst error = function (...varArgs) {\r\n    const message = 'FIREBASE INTERNAL ERROR: ' + buildLogMessage_(...varArgs);\r\n    logClient.error(message);\r\n};\r\nconst fatal = function (...varArgs) {\r\n    const message = `FIREBASE FATAL ERROR: ${buildLogMessage_(...varArgs)}`;\r\n    logClient.error(message);\r\n    throw new Error(message);\r\n};\r\nconst warn = function (...varArgs) {\r\n    const message = 'FIREBASE WARNING: ' + buildLogMessage_(...varArgs);\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\nconst 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 */\r\nconst 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\nconst 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        let called = false;\r\n        const wrappedFn = function () {\r\n            if (!document.body) {\r\n                setTimeout(wrappedFn, Math.floor(10));\r\n                return;\r\n            }\r\n            if (!called) {\r\n                called = true;\r\n                fn();\r\n            }\r\n        };\r\n        if (document.addEventListener) {\r\n            document.addEventListener('DOMContentLoaded', wrappedFn, false);\r\n            // fallback to onload.\r\n            window.addEventListener('load', wrappedFn, false);\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        }\r\n        else if (document.attachEvent) {\r\n            // IE.\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            document.attachEvent('onreadystatechange', () => {\r\n                if (document.readyState === 'complete') {\r\n                    wrappedFn();\r\n                }\r\n            });\r\n            // fallback to onload.\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            window.attachEvent('onload', wrappedFn);\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 */\r\nconst 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 */\r\nconst MAX_NAME = '[MAX_NAME]';\r\n/**\r\n * Compares valid Firebase key names, plus min and max name\r\n */\r\nconst 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        const 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 * @returns {!number} comparison result.\r\n */\r\nconst 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\nconst 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\nconst ObjectToUniqueKey = function (obj) {\r\n    if (typeof obj !== 'object' || obj === null) {\r\n        return stringify(obj);\r\n    }\r\n    const keys = [];\r\n    // eslint-disable-next-line guard-for-in\r\n    for (const 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    let key = '{';\r\n    for (let i = 0; i < keys.length; i++) {\r\n        if (i !== 0) {\r\n            key += ',';\r\n        }\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 str - The string\r\n * @param segsize - The maximum number of chars in the string.\r\n * @returns The string, split into appropriately-sized chunks\r\n */\r\nconst splitStringBySize = function (str, segsize) {\r\n    const len = str.length;\r\n    if (len <= segsize) {\r\n        return [str];\r\n    }\r\n    const dataSegs = [];\r\n    for (let 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 obj - The object or array to iterate over\r\n * @param fn - The function to apply\r\n */\r\nfunction each(obj, fn) {\r\n    for (const key in obj) {\r\n        if (obj.hasOwnProperty(key)) {\r\n            fn(key, obj[key]);\r\n        }\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 v - A double\r\n *\r\n */\r\nconst doubleToIEEE754String = function (v) {\r\n    assert(!isInvalidJSONNumber(v), 'Invalid JSON number'); // MJL\r\n    const ebits = 11, fbits = 52;\r\n    const bias = (1 << (ebits - 1)) - 1;\r\n    let s, e, f, ln, i;\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    const 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    const str = bits.join('');\r\n    // Return the data as a hex string. --MJL\r\n    let hexByteString = '';\r\n    for (i = 0; i < 64; i += 8) {\r\n        let hexByte = parseInt(str.substr(i, 8), 2).toString(16);\r\n        if (hexByte.length === 1) {\r\n            hexByte = '0' + hexByte;\r\n        }\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 */\r\nconst 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 */\r\nconst 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 */\r\nfunction errorForServerCode(code, query) {\r\n    let 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    const error = new Error(code + ' at ' + query._path.toString() + ': ' + reason);\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 */\r\nconst INTEGER_REGEXP_ = new RegExp('^-?(0*)\\\\d{1,10}$');\r\n/**\r\n * For use in keys, the minimum possible 32-bit integer.\r\n */\r\nconst INTEGER_32_MIN = -2147483648;\r\n/**\r\n * For use in kyes, the maximum possible 32-bit integer.\r\n */\r\nconst INTEGER_32_MAX = 2147483647;\r\n/**\r\n * If the string contains a 32-bit integer, return it.  Else return null.\r\n */\r\nconst tryParseInt = function (str) {\r\n    if (INTEGER_REGEXP_.test(str)) {\r\n        const intVal = Number(str);\r\n        if (intVal >= INTEGER_32_MIN && intVal <= INTEGER_32_MAX) {\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 fn - The code to guard.\r\n */\r\nconst 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(() => {\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            const 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 * @returns {boolean} true if we think we're currently being crawled.\r\n */\r\nconst beingCrawled = function () {\r\n    const 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 fn - Function to run.\r\n * @param time - Milliseconds to wait before running.\r\n * @returns The setTimeout() return value.\r\n */\r\nconst setTimeoutNonBlocking = function (fn, time) {\r\n    const timeout = setTimeout(fn, time);\r\n    // Note: at the time of this comment, unrefTimer is under the unstable set of APIs. Run with --unstable to enable the API.\r\n    if (typeof timeout === 'number' &&\r\n        // @ts-ignore Is only defined in Deno environments.\r\n        typeof Deno !== 'undefined' &&\r\n        // @ts-ignore Deno and unrefTimer are only defined in Deno environments.\r\n        Deno['unrefTimer']) {\r\n        // @ts-ignore Deno and unrefTimer are only defined in Deno environments.\r\n        Deno.unrefTimer(timeout);\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    }\r\n    else if (typeof timeout === 'object' && timeout['unref']) {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        timeout['unref']();\r\n    }\r\n    return timeout;\r\n};\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\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 AppCheck's token fetching capabilities.\r\n */\r\nclass AppCheckTokenProvider {\r\n    constructor(appName_, appCheckProvider) {\r\n        this.appName_ = appName_;\r\n        this.appCheckProvider = appCheckProvider;\r\n        this.appCheck = appCheckProvider === null || appCheckProvider === void 0 ? void 0 : appCheckProvider.getImmediate({ optional: true });\r\n        if (!this.appCheck) {\r\n            appCheckProvider === null || appCheckProvider === void 0 ? void 0 : appCheckProvider.get().then(appCheck => (this.appCheck = appCheck));\r\n        }\r\n    }\r\n    getToken(forceRefresh) {\r\n        if (!this.appCheck) {\r\n            return new Promise((resolve, reject) => {\r\n                // Support delayed initialization of FirebaseAppCheck. This allows our\r\n                // customers to initialize the RTDB SDK before initializing Firebase\r\n                // AppCheck and ensures that all requests are authenticated if a token\r\n                // becomes available before the timoeout below expires.\r\n                setTimeout(() => {\r\n                    if (this.appCheck) {\r\n                        this.getToken(forceRefresh).then(resolve, reject);\r\n                    }\r\n                    else {\r\n                        resolve(null);\r\n                    }\r\n                }, 0);\r\n            });\r\n        }\r\n        return this.appCheck.getToken(forceRefresh);\r\n    }\r\n    addTokenChangeListener(listener) {\r\n        var _a;\r\n        (_a = this.appCheckProvider) === null || _a === void 0 ? void 0 : _a.get().then(appCheck => appCheck.addTokenListener(listener));\r\n    }\r\n    notifyForInvalidToken() {\r\n        warn(`Provided AppCheck credentials for the app named \"${this.appName_}\" ` +\r\n            'are invalid. This usually indicates your app was not initialized correctly.');\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass FirebaseAuthTokenProvider {\r\n    constructor(appName_, firebaseOptions_, authProvider_) {\r\n        this.appName_ = appName_;\r\n        this.firebaseOptions_ = firebaseOptions_;\r\n        this.authProvider_ = authProvider_;\r\n        this.auth_ = null;\r\n        this.auth_ = authProvider_.getImmediate({ optional: true });\r\n        if (!this.auth_) {\r\n            authProvider_.onInit(auth => (this.auth_ = auth));\r\n        }\r\n    }\r\n    getToken(forceRefresh) {\r\n        if (!this.auth_) {\r\n            return new Promise((resolve, reject) => {\r\n                // Support delayed initialization of FirebaseAuth. This allows our\r\n                // customers to initialize the RTDB SDK before initializing Firebase\r\n                // Auth and ensures that all requests are authenticated if a token\r\n                // becomes available before the timoeout below expires.\r\n                setTimeout(() => {\r\n                    if (this.auth_) {\r\n                        this.getToken(forceRefresh).then(resolve, reject);\r\n                    }\r\n                    else {\r\n                        resolve(null);\r\n                    }\r\n                }, 0);\r\n            });\r\n        }\r\n        return this.auth_.getToken(forceRefresh).catch(error => {\r\n            // TODO: Need to figure out all the cases this is raised and whether\r\n            // this makes sense.\r\n            if (error && error.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);\r\n            }\r\n        });\r\n    }\r\n    addTokenChangeListener(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        if (this.auth_) {\r\n            this.auth_.addAuthTokenListener(listener);\r\n        }\r\n        else {\r\n            this.authProvider_\r\n                .get()\r\n                .then(auth => auth.addAuthTokenListener(listener));\r\n        }\r\n    }\r\n    removeTokenChangeListener(listener) {\r\n        this.authProvider_\r\n            .get()\r\n            .then(auth => auth.removeAuthTokenListener(listener));\r\n    }\r\n    notifyForInvalidToken() {\r\n        let errorMessage = 'Provided authentication credentials for the app named \"' +\r\n            this.appName_ +\r\n            '\" are invalid. This usually indicates your app was not ' +\r\n            'initialized correctly. ';\r\n        if ('credential' in this.firebaseOptions_) {\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.firebaseOptions_) {\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}\r\n/* AuthTokenProvider that supplies a constant token. Used by Admin SDK or mockUserToken with emulators. */\r\nclass EmulatorTokenProvider {\r\n    constructor(accessToken) {\r\n        this.accessToken = accessToken;\r\n    }\r\n    getToken(forceRefresh) {\r\n        return Promise.resolve({\r\n            accessToken: this.accessToken\r\n        });\r\n    }\r\n    addTokenChangeListener(listener) {\r\n        // Invoke the listener immediately to match the behavior in Firebase Auth\r\n        // (see packages/auth/src/auth.js#L1807)\r\n        listener(this.accessToken);\r\n    }\r\n    removeTokenChangeListener(listener) { }\r\n    notifyForInvalidToken() { }\r\n}\r\n/** A string that is treated as an admin access token by the RTDB emulator. Used by Admin SDK. */\r\nEmulatorTokenProvider.OWNER = 'owner';\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst PROTOCOL_VERSION = '5';\r\nconst VERSION_PARAM = 'v';\r\nconst TRANSPORT_SESSION_PARAM = 's';\r\nconst REFERER_PARAM = 'r';\r\nconst FORGE_REF = 'f';\r\n// Matches console.firebase.google.com, firebase-console-*.corp.google.com and\r\n// firebase.corp.google.com\r\nconst FORGE_DOMAIN_RE = /(console\\.firebase|firebase-console-\\w+\\.corp|firebase\\.corp)\\.google\\.com/;\r\nconst LAST_SESSION_PARAM = 'ls';\r\nconst APPLICATION_ID_PARAM = 'p';\r\nconst APP_CHECK_TOKEN_PARAM = 'ac';\r\nconst WEBSOCKET = 'websocket';\r\nconst LONG_POLLING = 'long_polling';\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass RepoInfo {\r\n    /**\r\n     * @param host - Hostname portion of the url for the repo\r\n     * @param secure - Whether or not this repo is accessed over ssl\r\n     * @param namespace - The namespace represented by the repo\r\n     * @param webSocketOnly - Whether to prefer websockets over all other transports (used by Nest).\r\n     * @param nodeAdmin - Whether this instance uses Admin SDK credentials\r\n     * @param persistenceKey - Override the default session persistence storage key\r\n     */\r\n    constructor(host, secure, namespace, webSocketOnly, nodeAdmin = false, persistenceKey = '', includeNamespaceInQueryParams = false, isUsingEmulator = false) {\r\n        this.secure = secure;\r\n        this.namespace = namespace;\r\n        this.webSocketOnly = webSocketOnly;\r\n        this.nodeAdmin = nodeAdmin;\r\n        this.persistenceKey = persistenceKey;\r\n        this.includeNamespaceInQueryParams = includeNamespaceInQueryParams;\r\n        this.isUsingEmulator = isUsingEmulator;\r\n        this._host = host.toLowerCase();\r\n        this._domain = this._host.substr(this._host.indexOf('.') + 1);\r\n        this.internalHost =\r\n            PersistentStorage.get('host:' + host) || this._host;\r\n    }\r\n    isCacheableHost() {\r\n        return this.internalHost.substr(0, 2) === 's-';\r\n    }\r\n    isCustomHost() {\r\n        return (this._domain !== 'firebaseio.com' &&\r\n            this._domain !== 'firebaseio-demo.com');\r\n    }\r\n    get host() {\r\n        return this._host;\r\n    }\r\n    set host(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    toString() {\r\n        let str = this.toURLString();\r\n        if (this.persistenceKey) {\r\n            str += '<' + this.persistenceKey + '>';\r\n        }\r\n        return str;\r\n    }\r\n    toURLString() {\r\n        const protocol = this.secure ? 'https://' : 'http://';\r\n        const query = this.includeNamespaceInQueryParams\r\n            ? `?ns=${this.namespace}`\r\n            : '';\r\n        return `${protocol}${this.host}/${query}`;\r\n    }\r\n}\r\nfunction repoInfoNeedsQueryParam(repoInfo) {\r\n    return (repoInfo.host !== repoInfo.internalHost ||\r\n        repoInfo.isCustomHost() ||\r\n        repoInfo.includeNamespaceInQueryParams);\r\n}\r\n/**\r\n * Returns the websocket URL for this repo\r\n * @param repoInfo - RepoInfo object\r\n * @param type - of connection\r\n * @param params - list\r\n * @returns The URL for this repo\r\n */\r\nfunction repoInfoConnectionURL(repoInfo, type, params) {\r\n    assert(typeof type === 'string', 'typeof type must == string');\r\n    assert(typeof params === 'object', 'typeof params must == object');\r\n    let connURL;\r\n    if (type === WEBSOCKET) {\r\n        connURL =\r\n            (repoInfo.secure ? 'wss://' : 'ws://') + repoInfo.internalHost + '/.ws?';\r\n    }\r\n    else if (type === LONG_POLLING) {\r\n        connURL =\r\n            (repoInfo.secure ? 'https://' : 'http://') +\r\n                repoInfo.internalHost +\r\n                '/.lp?';\r\n    }\r\n    else {\r\n        throw new Error('Unknown connection type: ' + type);\r\n    }\r\n    if (repoInfoNeedsQueryParam(repoInfo)) {\r\n        params['ns'] = repoInfo.namespace;\r\n    }\r\n    const pairs = [];\r\n    each(params, (key, value) => {\r\n        pairs.push(key + '=' + value);\r\n    });\r\n    return connURL + pairs.join('&');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass StatsCollection {\r\n    constructor() {\r\n        this.counters_ = {};\r\n    }\r\n    incrementCounter(name, amount = 1) {\r\n        if (!contains(this.counters_, name)) {\r\n            this.counters_[name] = 0;\r\n        }\r\n        this.counters_[name] += amount;\r\n    }\r\n    get() {\r\n        return deepCopy(this.counters_);\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst collections = {};\r\nconst reporters = {};\r\nfunction statsManagerGetCollection(repoInfo) {\r\n    const hashString = repoInfo.toString();\r\n    if (!collections[hashString]) {\r\n        collections[hashString] = new StatsCollection();\r\n    }\r\n    return collections[hashString];\r\n}\r\nfunction statsManagerGetOrCreateReporter(repoInfo, creatorFunction) {\r\n    const hashString = repoInfo.toString();\r\n    if (!reporters[hashString]) {\r\n        reporters[hashString] = creatorFunction();\r\n    }\r\n    return reporters[hashString];\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass PacketReceiver {\r\n    /**\r\n     * @param onMessage_\r\n     */\r\n    constructor(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    closeAfter(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     */\r\n    handleResponse(requestNum, data) {\r\n        this.pendingResponses[requestNum] = data;\r\n        while (this.pendingResponses[this.currentResponseNum]) {\r\n            const toProcess = this.pendingResponses[this.currentResponseNum];\r\n            delete this.pendingResponses[this.currentResponseNum];\r\n            for (let i = 0; i < toProcess.length; ++i) {\r\n                if (toProcess[i]) {\r\n                    exceptionGuard(() => {\r\n                        this.onMessage_(toProcess[i]);\r\n                    });\r\n                }\r\n            }\r\n            if (this.currentResponseNum === this.closeAfterResponse) {\r\n                if (this.onClose) {\r\n                    this.onClose();\r\n                    this.onClose = null;\r\n                }\r\n                break;\r\n            }\r\n            this.currentResponseNum++;\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst FIREBASE_LONGPOLL_START_PARAM = 'start';\r\nconst FIREBASE_LONGPOLL_CLOSE_COMMAND = 'close';\r\nconst FIREBASE_LONGPOLL_COMMAND_CB_NAME = 'pLPCommand';\r\nconst FIREBASE_LONGPOLL_DATA_CB_NAME = 'pRTLPCB';\r\nconst FIREBASE_LONGPOLL_ID_PARAM = 'id';\r\nconst FIREBASE_LONGPOLL_PW_PARAM = 'pw';\r\nconst FIREBASE_LONGPOLL_SERIAL_PARAM = 'ser';\r\nconst FIREBASE_LONGPOLL_CALLBACK_ID_PARAM = 'cb';\r\nconst FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM = 'seg';\r\nconst FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET = 'ts';\r\nconst FIREBASE_LONGPOLL_DATA_PARAM = 'd';\r\nconst 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\nconst MAX_URL_DATA_SIZE = 1870;\r\nconst SEG_HEADER_SIZE = 30; //ie: &seg=8299234&ts=982389123&d=\r\nconst 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 */\r\nconst KEEPALIVE_REQUEST_INTERVAL = 25000;\r\n/**\r\n * How long to wait before aborting a long-polling connection attempt.\r\n */\r\nconst LP_CONNECT_TIMEOUT = 30000;\r\n/**\r\n * This class manages a single long-polling connection.\r\n */\r\nclass BrowserPollConnection {\r\n    /**\r\n     * @param connId An identifier for this connection, used for logging\r\n     * @param repoInfo The info for the endpoint to send data to.\r\n     * @param applicationId The Firebase App ID for this project.\r\n     * @param appCheckToken The AppCheck token for this client.\r\n     * @param authToken The AuthToken to use for this connection.\r\n     * @param transportSessionId Optional transportSessionid if we are\r\n     * reconnecting for an existing transport session\r\n     * @param lastSessionId Optional lastSessionId if the PersistentConnection has\r\n     * already created a connection previously\r\n     */\r\n    constructor(connId, repoInfo, applicationId, appCheckToken, authToken, transportSessionId, lastSessionId) {\r\n        this.connId = connId;\r\n        this.repoInfo = repoInfo;\r\n        this.applicationId = applicationId;\r\n        this.appCheckToken = appCheckToken;\r\n        this.authToken = authToken;\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_ = statsManagerGetCollection(repoInfo);\r\n        this.urlFn = (params) => {\r\n            // Always add the token if we have one.\r\n            if (this.appCheckToken) {\r\n                params[APP_CHECK_TOKEN_PARAM] = this.appCheckToken;\r\n            }\r\n            return repoInfoConnectionURL(repoInfo, LONG_POLLING, params);\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    open(onMessage, onDisconnect) {\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(() => {\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            // eslint-disable-next-line @typescript-eslint/no-explicit-any\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(() => {\r\n            if (this.isClosed_) {\r\n                return;\r\n            }\r\n            //Set up a callback that gets triggered once a connection is set up.\r\n            this.scriptTagHolder = new FirebaseIFrameScriptHolder((...args) => {\r\n                const [command, arg1, arg2, arg3, arg4] = args;\r\n                this.incrementIncomingBytes_(args);\r\n                if (!this.scriptTagHolder) {\r\n                    return; // we closed the connection.\r\n                }\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, () => {\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            }, (...args) => {\r\n                const [pN, data] = args;\r\n                this.incrementIncomingBytes_(args);\r\n                this.myPacketOrderer.handleResponse(pN, data);\r\n            }, () => {\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            const 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] =\r\n                    this.scriptTagHolder.uniqueCallbackIdentifier;\r\n            }\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 (this.applicationId) {\r\n                urlParams[APPLICATION_ID_PARAM] = this.applicationId;\r\n            }\r\n            if (this.appCheckToken) {\r\n                urlParams[APP_CHECK_TOKEN_PARAM] = this.appCheckToken;\r\n            }\r\n            if (typeof location !== 'undefined' &&\r\n                location.hostname &&\r\n                FORGE_DOMAIN_RE.test(location.hostname)) {\r\n                urlParams[REFERER_PARAM] = FORGE_REF;\r\n            }\r\n            const connectURL = this.urlFn(urlParams);\r\n            this.log_('Connecting via long-poll to ' + connectURL);\r\n            this.scriptTagHolder.addTag(connectURL, () => {\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    start() {\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    static forceAllow() {\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    static forceDisallow() {\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    static isAvailable() {\r\n        if (isNodeSdk()) {\r\n            return false;\r\n        }\r\n        else if (BrowserPollConnection.forceAllow_) {\r\n            return true;\r\n        }\r\n        else {\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.forceDisallow_ &&\r\n                typeof document !== 'undefined' &&\r\n                document.createElement != null &&\r\n                !isChromeExtensionContentScript() &&\r\n                !isWindowsStoreApp());\r\n        }\r\n    }\r\n    /**\r\n     * No-op for polling\r\n     */\r\n    markConnectionHealthy() { }\r\n    /**\r\n     * Stops polling and cleans up the iframe\r\n     */\r\n    shutdown_() {\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     */\r\n    onClosed_() {\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    close() {\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 data - The JSON data to transmit.\r\n     */\r\n    send(data) {\r\n        const 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        const 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        const 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 (let 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     */\r\n    addDisconnectPingFrame(id, pw) {\r\n        if (isNodeSdk()) {\r\n            return;\r\n        }\r\n        this.myDisconnFrame = document.createElement('iframe');\r\n        const 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     */\r\n    incrementIncomingBytes_(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        const bytesReceived = stringify(args).length;\r\n        this.bytesReceived += bytesReceived;\r\n        this.stats_.incrementCounter('bytes_received', bytesReceived);\r\n    }\r\n}\r\n/*********************************************************************************************\r\n * A wrapper around an iframe that is used as a long-polling script holder.\r\n *********************************************************************************************/\r\nclass FirebaseIFrameScriptHolder {\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    constructor(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        this.outstandingRequests = new Set();\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] =\r\n                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            let 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                const currentDomain = document.domain;\r\n                script = '<script>document.domain=\"' + currentDomain + '\";</script>';\r\n            }\r\n            const iframeContents = '<html><body>' + script + '</body></html>';\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     */\r\n    static createIFrame_() {\r\n        const 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                const 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                const 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            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        }\r\n        else if (iframe.document) {\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\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    close() {\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 textContent seems to be the safest way to do this.\r\n            this.myIFrame.doc.body.textContent = '';\r\n            setTimeout(() => {\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        // Protect from being called recursively.\r\n        const 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 id - The ID of this connection\r\n     * @param pw - The password for this connection\r\n     */\r\n    startLongPoll(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    newRequest_() {\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.size < (this.pendingSegs.length > 0 ? 2 : 1)) {\r\n            //construct our url\r\n            this.currentSerial++;\r\n            const 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            let theURL = this.urlFn(urlParams);\r\n            //Now add as much data as we can.\r\n            let curDataString = '';\r\n            let i = 0;\r\n            while (this.pendingSegs.length > 0) {\r\n                //first, lets see if the next segment will fit.\r\n                const nextSeg = this.pendingSegs[0];\r\n                if (nextSeg.d.length +\r\n                    SEG_HEADER_SIZE +\r\n                    curDataString.length <=\r\n                    MAX_URL_DATA_SIZE) {\r\n                    //great, the segment will fit. Lets append it.\r\n                    const 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    enqueueSegment(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 url - The URL of the script tag.\r\n     * @param serial - The serial number of the request.\r\n     */\r\n    addLongPollTag_(url, serial) {\r\n        //remember that we sent this request.\r\n        this.outstandingRequests.add(serial);\r\n        const doNewRequest = () => {\r\n            this.outstandingRequests.delete(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        const keepaliveTimeout = setTimeout(doNewRequest, Math.floor(KEEPALIVE_REQUEST_INTERVAL));\r\n        const readyStateCB = () => {\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 url - The URL for the script tag source.\r\n     * @param loadCB - A callback to be triggered once the script has loaded.\r\n     */\r\n    addTag(url, loadCB) {\r\n        if (isNodeSdk()) {\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            this.doNodeLongPoll(url, loadCB);\r\n        }\r\n        else {\r\n            setTimeout(() => {\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                    }\r\n                    const newScript = this.myIFrame.doc.createElement('script');\r\n                    newScript.type = 'text/javascript';\r\n                    newScript.async = true;\r\n                    newScript.src = url;\r\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                    newScript.onload = newScript.onreadystatechange =\r\n                        function () {\r\n                            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                            const rstate = newScript.readyState;\r\n                            if (!rstate || rstate === 'loaded' || rstate === 'complete') {\r\n                                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                newScript.onload = newScript.onreadystatechange = null;\r\n                                if (newScript.parentNode) {\r\n                                    newScript.parentNode.removeChild(newScript);\r\n                                }\r\n                                loadCB();\r\n                            }\r\n                        };\r\n                    newScript.onerror = () => {\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);\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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst WEBSOCKET_MAX_FRAME_SIZE = 16384;\r\nconst WEBSOCKET_KEEPALIVE_INTERVAL = 45000;\r\nlet 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 */\r\nclass WebSocketConnection {\r\n    /**\r\n     * @param connId identifier for this transport\r\n     * @param repoInfo The info for the websocket endpoint.\r\n     * @param applicationId The Firebase App ID for this project.\r\n     * @param appCheckToken The App Check Token for this client.\r\n     * @param authToken The Auth Token for this client.\r\n     * @param transportSessionId Optional transportSessionId if this is connecting\r\n     * to an existing transport session\r\n     * @param lastSessionId Optional lastSessionId if there was a previous\r\n     * connection\r\n     */\r\n    constructor(connId, repoInfo, applicationId, appCheckToken, authToken, transportSessionId, lastSessionId) {\r\n        this.connId = connId;\r\n        this.applicationId = applicationId;\r\n        this.appCheckToken = appCheckToken;\r\n        this.authToken = authToken;\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_ = statsManagerGetCollection(repoInfo);\r\n        this.connURL = WebSocketConnection.connectionURL_(repoInfo, transportSessionId, lastSessionId, appCheckToken, applicationId);\r\n        this.nodeAdmin = repoInfo.nodeAdmin;\r\n    }\r\n    /**\r\n     * @param repoInfo - The info for the websocket endpoint.\r\n     * @param transportSessionId - Optional transportSessionId if this is connecting to an existing transport\r\n     *                                         session\r\n     * @param lastSessionId - Optional lastSessionId if there was a previous connection\r\n     * @returns connection url\r\n     */\r\n    static connectionURL_(repoInfo, transportSessionId, lastSessionId, appCheckToken, applicationId) {\r\n        const urlParams = {};\r\n        urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\r\n        if (!isNodeSdk() &&\r\n            typeof location !== 'undefined' &&\r\n            location.hostname &&\r\n            FORGE_DOMAIN_RE.test(location.hostname)) {\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        if (appCheckToken) {\r\n            urlParams[APP_CHECK_TOKEN_PARAM] = appCheckToken;\r\n        }\r\n        if (applicationId) {\r\n            urlParams[APPLICATION_ID_PARAM] = applicationId;\r\n        }\r\n        return repoInfoConnectionURL(repoInfo, WEBSOCKET, urlParams);\r\n    }\r\n    /**\r\n     * @param onMessage - Callback when messages arrive\r\n     * @param onDisconnect - Callback with connection lost.\r\n     */\r\n    open(onMessage, onDisconnect) {\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            let options;\r\n            if (isNodeSdk()) {\r\n                const device = this.nodeAdmin ? 'AdminNode' : 'Node';\r\n                // UA Format: Firebase/<wire_protocol>/<sdk_version>/<platform>/<device>\r\n                options = {\r\n                    headers: {\r\n                        'User-Agent': `Firebase/${PROTOCOL_VERSION}/${SDK_VERSION}/${process.platform}/${device}`,\r\n                        'X-Firebase-GMPID': this.applicationId || ''\r\n                    }\r\n                };\r\n                // If using Node with admin creds, AppCheck-related checks are unnecessary.\r\n                // Note that we send the credentials here even if they aren't admin credentials, which is\r\n                // not a problem.\r\n                // Note that this header is just used to bypass appcheck, and the token should still be sent\r\n                // through the websocket connection once it is established.\r\n                if (this.authToken) {\r\n                    options.headers['Authorization'] = `Bearer ${this.authToken}`;\r\n                }\r\n                if (this.appCheckToken) {\r\n                    options.headers['X-Firebase-AppCheck'] = this.appCheckToken;\r\n                }\r\n                // Plumb appropriate http_proxy environment variable into faye-websocket if it exists.\r\n                const env = process['env'];\r\n                const 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            }\r\n            this.mySock = new WebSocketImpl(this.connURL, [], options);\r\n        }\r\n        catch (e) {\r\n            this.log_('Error instantiating WebSocket.');\r\n            const error = e.message || e.data;\r\n            if (error) {\r\n                this.log_(error);\r\n            }\r\n            this.onClosed_();\r\n            return;\r\n        }\r\n        this.mySock.onopen = () => {\r\n            this.log_('Websocket connected.');\r\n            this.everConnected_ = true;\r\n        };\r\n        this.mySock.onclose = () => {\r\n            this.log_('Websocket connection was disconnected.');\r\n            this.mySock = null;\r\n            this.onClosed_();\r\n        };\r\n        this.mySock.onmessage = m => {\r\n            this.handleIncomingFrame(m);\r\n        };\r\n        this.mySock.onerror = e => {\r\n            this.log_('WebSocket error.  Closing connection.');\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            const error = e.message || e.data;\r\n            if (error) {\r\n                this.log_(error);\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    start() { }\r\n    static forceDisallow() {\r\n        WebSocketConnection.forceDisallow_ = true;\r\n    }\r\n    static isAvailable() {\r\n        let isOldAndroid = false;\r\n        if (typeof navigator !== 'undefined' && navigator.userAgent) {\r\n            const oldAndroidRegex = /Android ([0-9]{0,}\\.[0-9]{0,})/;\r\n            const 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     */\r\n    static previouslyFailed() {\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    markConnectionHealthy() {\r\n        PersistentStorage.remove('previous_websocket_failure');\r\n    }\r\n    appendFrame_(data) {\r\n        this.frames.push(data);\r\n        if (this.frames.length === this.totalFrames) {\r\n            const fullMess = this.frames.join('');\r\n            this.frames = null;\r\n            const jsonMess = jsonEval(fullMess);\r\n            //handle the message\r\n            this.onMessage(jsonMess);\r\n        }\r\n    }\r\n    /**\r\n     * @param frameCount - The number of frames we are expecting from the server\r\n     */\r\n    handleNewFrameCount_(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     * @returns Any remaining data to be process, or null if there is none\r\n     */\r\n    extractFrameCount_(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            const 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    handleIncomingFrame(mess) {\r\n        if (this.mySock === null) {\r\n            return; // Chrome apparently delivers incoming packets even after we .close() the connection sometimes.\r\n        }\r\n        const 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            const 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 data - The JSON object to transmit\r\n     */\r\n    send(data) {\r\n        this.resetKeepAlive();\r\n        const 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        const 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 (let i = 0; i < dataSegs.length; i++) {\r\n            this.sendString_(dataSegs[i]);\r\n        }\r\n    }\r\n    shutdown_() {\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    onClosed_() {\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    close() {\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    resetKeepAlive() {\r\n        clearInterval(this.keepaliveTimer);\r\n        this.keepaliveTimer = setInterval(() => {\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            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        }, Math.floor(WEBSOCKET_KEEPALIVE_INTERVAL));\r\n    }\r\n    /**\r\n     * Send a string over the websocket.\r\n     *\r\n     * @param str - String to send.\r\n     */\r\n    sendString_(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/**\r\n * Number of response before we consider the connection \"healthy.\"\r\n */\r\nWebSocketConnection.responsesRequiredToBeHealthy = 2;\r\n/**\r\n * Time to wait for the connection te become healthy before giving up.\r\n */\r\nWebSocketConnection.healthyTimeout = 30000;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass TransportManager {\r\n    /**\r\n     * @param repoInfo - Metadata around the namespace we're connecting to\r\n     */\r\n    constructor(repoInfo) {\r\n        this.initTransports_(repoInfo);\r\n    }\r\n    static get ALL_TRANSPORTS() {\r\n        return [BrowserPollConnection, WebSocketConnection];\r\n    }\r\n    /**\r\n     * Returns whether transport has been selected to ensure WebSocketConnection or BrowserPollConnection are not called after\r\n     * TransportManager has already set up transports_\r\n     */\r\n    static get IS_TRANSPORT_INITIALIZED() {\r\n        return this.globalTransportInitialized_;\r\n    }\r\n    initTransports_(repoInfo) {\r\n        const isWebSocketsAvailable = WebSocketConnection && WebSocketConnection['isAvailable']();\r\n        let 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            }\r\n            isSkipPollConnection = true;\r\n        }\r\n        if (isSkipPollConnection) {\r\n            this.transports_ = [WebSocketConnection];\r\n        }\r\n        else {\r\n            const transports = (this.transports_ = []);\r\n            for (const transport of TransportManager.ALL_TRANSPORTS) {\r\n                if (transport && transport['isAvailable']()) {\r\n                    transports.push(transport);\r\n                }\r\n            }\r\n            TransportManager.globalTransportInitialized_ = true;\r\n        }\r\n    }\r\n    /**\r\n     * @returns The constructor for the initial transport to use\r\n     */\r\n    initialTransport() {\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     * @returns The constructor for the next transport, or null\r\n     */\r\n    upgradeTransport() {\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}\r\n// Keeps track of whether the TransportManager has already chosen a transport to use\r\nTransportManager.globalTransportInitialized_ = false;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst 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\nconst 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\nconst BYTES_SENT_HEALTHY_OVERRIDE = 10 * 1024;\r\nconst BYTES_RECEIVED_HEALTHY_OVERRIDE = 100 * 1024;\r\nconst MESSAGE_TYPE = 't';\r\nconst MESSAGE_DATA = 'd';\r\nconst CONTROL_SHUTDOWN = 's';\r\nconst CONTROL_RESET = 'r';\r\nconst CONTROL_ERROR = 'e';\r\nconst CONTROL_PONG = 'o';\r\nconst SWITCH_ACK = 'a';\r\nconst END_TRANSMISSION = 'n';\r\nconst PING = 'p';\r\nconst 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\nclass Connection {\r\n    /**\r\n     * @param id - an id for this connection\r\n     * @param repoInfo_ - the info for the endpoint to connect to\r\n     * @param applicationId_ - the Firebase App ID for this project\r\n     * @param appCheckToken_ - The App Check Token for this device.\r\n     * @param authToken_ - The auth token for this session.\r\n     * @param onMessage_ - the callback to be triggered when a server-push message arrives\r\n     * @param onReady_ - the callback to be triggered when this connection is ready to send messages.\r\n     * @param onDisconnect_ - the callback to be triggered when a connection was lost\r\n     * @param onKill_ - the callback to be triggered when this connection has permanently shut down.\r\n     * @param lastSessionId - last session id in persistent connection. is used to clean up old session in real-time server\r\n     */\r\n    constructor(id, repoInfo_, applicationId_, appCheckToken_, authToken_, onMessage_, onReady_, onDisconnect_, onKill_, lastSessionId) {\r\n        this.id = id;\r\n        this.repoInfo_ = repoInfo_;\r\n        this.applicationId_ = applicationId_;\r\n        this.appCheckToken_ = appCheckToken_;\r\n        this.authToken_ = authToken_;\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 /* RealtimeState.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     */\r\n    start_() {\r\n        const conn = this.transportManager_.initialTransport();\r\n        this.conn_ = new conn(this.nextTransportId_(), this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, null, 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        const onMessageReceived = this.connReceiver_(this.conn_);\r\n        const 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(() => {\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        const healthyTimeoutMS = conn['healthyTimeout'] || 0;\r\n        if (healthyTimeoutMS > 0) {\r\n            this.healthyTimeout_ = setTimeoutNonBlocking(() => {\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                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            }, Math.floor(healthyTimeoutMS));\r\n        }\r\n    }\r\n    nextTransportId_() {\r\n        return 'c:' + this.id + ':' + this.connectionCount++;\r\n    }\r\n    disconnReceiver_(conn) {\r\n        return 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    connReceiver_(conn) {\r\n        return (message) => {\r\n            if (this.state_ !== 2 /* RealtimeState.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     * @param dataMsg - An arbitrary data message to be sent to the server\r\n     */\r\n    sendRequest(dataMsg) {\r\n        // wrap in a data message envelope and send it on\r\n        const msg = { t: 'd', d: dataMsg };\r\n        this.sendData_(msg);\r\n    }\r\n    tryCleanupConnection() {\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    onSecondaryControl_(controlData) {\r\n        if (MESSAGE_TYPE in controlData) {\r\n            const 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    onSecondaryMessageReceived_(parsedData) {\r\n        const layer = requireKey('t', parsedData);\r\n        const 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    upgradeIfSecondaryHealthy_() {\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    proceedWithUpgrade_() {\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    onPrimaryMessageReceived_(parsedData) {\r\n        // Must refer to parsedData properties in quotes, so closure doesn't touch them.\r\n        const layer = requireKey('t', parsedData);\r\n        const 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    onDataMessage_(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    onPrimaryResponse_() {\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    onControl_(controlData) {\r\n        const cmd = requireKey(MESSAGE_TYPE, controlData);\r\n        if (MESSAGE_DATA in controlData) {\r\n            const payload = controlData[MESSAGE_DATA];\r\n            if (cmd === SERVER_HELLO) {\r\n                const handshakePayload = Object.assign({}, payload);\r\n                if (this.repoInfo_.isUsingEmulator) {\r\n                    // Upon connecting, the emulator will pass the hostname that it's aware of, but we prefer the user's set hostname via `connectDatabaseEmulator` over what the emulator passes.\r\n                    handshakePayload.h = this.repoInfo_.host;\r\n                }\r\n                this.onHandshake_(handshakePayload);\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 (let 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     * @param handshake - The handshake data returned from the server\r\n     */\r\n    onHandshake_(handshake) {\r\n        const timestamp = handshake.ts;\r\n        const version = handshake.v;\r\n        const host = handshake.h;\r\n        this.sessionId = handshake.s;\r\n        this.repoInfo_.host = host;\r\n        // if we've already closed the connection, then don't bother trying to progress further\r\n        if (this.state_ === 0 /* RealtimeState.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    tryStartUpgrade_() {\r\n        const conn = this.transportManager_.upgradeTransport();\r\n        if (conn) {\r\n            this.startUpgrade_(conn);\r\n        }\r\n    }\r\n    startUpgrade_(conn) {\r\n        this.secondaryConn_ = new conn(this.nextTransportId_(), this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, 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        const onMessage = this.connReceiver_(this.secondaryConn_);\r\n        const 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(() => {\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    onReset_(host) {\r\n        this.log_('Reset packet received.  New host: ' + host);\r\n        this.repoInfo_.host = 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 /* RealtimeState.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    onConnectionEstablished_(conn, timestamp) {\r\n        this.log_('Realtime connection established.');\r\n        this.conn_ = conn;\r\n        this.state_ = 1 /* RealtimeState.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(() => {\r\n                this.sendPingOnPrimaryIfNecessary_();\r\n            }, Math.floor(DELAY_BEFORE_SENDING_EXTRA_REQUESTS));\r\n        }\r\n    }\r\n    sendPingOnPrimaryIfNecessary_() {\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 /* RealtimeState.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    onSecondaryConnectionLost_() {\r\n        const 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     * @param everConnected - Whether or not the connection ever reached a server. Used to determine if\r\n     * we should flush the host cache\r\n     */\r\n    onConnectionLost_(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 /* RealtimeState.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. <ns>.firebaseio.com\r\n                this.repoInfo_.internalHost = this.repoInfo_.host;\r\n            }\r\n        }\r\n        else if (this.state_ === 1 /* RealtimeState.CONNECTED */) {\r\n            this.log_('Realtime connection lost.');\r\n        }\r\n        this.close();\r\n    }\r\n    onConnectionShutdown_(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    sendData_(data) {\r\n        if (this.state_ !== 1 /* RealtimeState.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    close() {\r\n        if (this.state_ !== 2 /* RealtimeState.DISCONNECTED */) {\r\n            this.log_('Closing realtime connection.');\r\n            this.state_ = 2 /* RealtimeState.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    closeConnections_() {\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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass ServerActions {\r\n    put(pathString, data, onComplete, hash) { }\r\n    merge(pathString, data, onComplete, hash) { }\r\n    /**\r\n     * Refreshes the auth token for the current connection.\r\n     * @param token - The authentication token\r\n     */\r\n    refreshAuthToken(token) { }\r\n    /**\r\n     * Refreshes the app check token for the current connection.\r\n     * @param token The app check token\r\n     */\r\n    refreshAppCheckToken(token) { }\r\n    onDisconnectPut(pathString, data, onComplete) { }\r\n    onDisconnectMerge(pathString, data, onComplete) { }\r\n    onDisconnectCancel(pathString, onComplete) { }\r\n    reportStats(stats) { }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass EventEmitter {\r\n    constructor(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     */\r\n    trigger(eventType, ...varArgs) {\r\n        if (Array.isArray(this.listeners_[eventType])) {\r\n            // Clone the list, since callbacks could add/remove listeners.\r\n            const listeners = [...this.listeners_[eventType]];\r\n            for (let i = 0; i < listeners.length; i++) {\r\n                listeners[i].callback.apply(listeners[i].context, varArgs);\r\n            }\r\n        }\r\n    }\r\n    on(eventType, callback, context) {\r\n        this.validateEventType_(eventType);\r\n        this.listeners_[eventType] = this.listeners_[eventType] || [];\r\n        this.listeners_[eventType].push({ callback, context });\r\n        const eventData = this.getInitialEvent(eventType);\r\n        if (eventData) {\r\n            callback.apply(context, eventData);\r\n        }\r\n    }\r\n    off(eventType, callback, context) {\r\n        this.validateEventType_(eventType);\r\n        const listeners = this.listeners_[eventType] || [];\r\n        for (let 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    validateEventType_(eventType) {\r\n        assert(this.allowedEvents_.find(et => {\r\n            return et === eventType;\r\n        }), 'Unknown event: ' + eventType);\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass OnlineMonitor extends EventEmitter {\r\n    constructor() {\r\n        super(['online']);\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', () => {\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', () => {\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    }\r\n    static getInstance() {\r\n        return new OnlineMonitor();\r\n    }\r\n    getInitialEvent(eventType) {\r\n        assert(eventType === 'online', 'Unknown event type: ' + eventType);\r\n        return [this.online_];\r\n    }\r\n    currentlyOnline() {\r\n        return this.online_;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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/** Maximum key depth. */\r\nconst MAX_PATH_DEPTH = 32;\r\n/** Maximum number of (UTF8) bytes in a Firebase path. */\r\nconst MAX_PATH_LENGTH_BYTES = 768;\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\nclass Path {\r\n    /**\r\n     * @param pathOrString - Path string to parse, or another path, or the raw\r\n     * tokens array\r\n     */\r\n    constructor(pathOrString, pieceNum) {\r\n        if (pieceNum === void 0) {\r\n            this.pieces_ = pathOrString.split('/');\r\n            // Remove empty pieces.\r\n            let copyTo = 0;\r\n            for (let 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    toString() {\r\n        let pathString = '';\r\n        for (let i = this.pieceNum_; i < this.pieces_.length; i++) {\r\n            if (this.pieces_[i] !== '') {\r\n                pathString += '/' + this.pieces_[i];\r\n            }\r\n        }\r\n        return pathString || '/';\r\n    }\r\n}\r\nfunction newEmptyPath() {\r\n    return new Path('');\r\n}\r\nfunction pathGetFront(path) {\r\n    if (path.pieceNum_ >= path.pieces_.length) {\r\n        return null;\r\n    }\r\n    return path.pieces_[path.pieceNum_];\r\n}\r\n/**\r\n * @returns The number of segments in this path\r\n */\r\nfunction pathGetLength(path) {\r\n    return path.pieces_.length - path.pieceNum_;\r\n}\r\nfunction pathPopFront(path) {\r\n    let pieceNum = path.pieceNum_;\r\n    if (pieceNum < path.pieces_.length) {\r\n        pieceNum++;\r\n    }\r\n    return new Path(path.pieces_, pieceNum);\r\n}\r\nfunction pathGetBack(path) {\r\n    if (path.pieceNum_ < path.pieces_.length) {\r\n        return path.pieces_[path.pieces_.length - 1];\r\n    }\r\n    return null;\r\n}\r\nfunction pathToUrlEncodedString(path) {\r\n    let pathString = '';\r\n    for (let i = path.pieceNum_; i < path.pieces_.length; i++) {\r\n        if (path.pieces_[i] !== '') {\r\n            pathString += '/' + encodeURIComponent(String(path.pieces_[i]));\r\n        }\r\n    }\r\n    return pathString || '/';\r\n}\r\n/**\r\n * Shallow copy of the parts of the path.\r\n *\r\n */\r\nfunction pathSlice(path, begin = 0) {\r\n    return path.pieces_.slice(path.pieceNum_ + begin);\r\n}\r\nfunction pathParent(path) {\r\n    if (path.pieceNum_ >= path.pieces_.length) {\r\n        return null;\r\n    }\r\n    const pieces = [];\r\n    for (let i = path.pieceNum_; i < path.pieces_.length - 1; i++) {\r\n        pieces.push(path.pieces_[i]);\r\n    }\r\n    return new Path(pieces, 0);\r\n}\r\nfunction pathChild(path, childPathObj) {\r\n    const pieces = [];\r\n    for (let i = path.pieceNum_; i < path.pieces_.length; i++) {\r\n        pieces.push(path.pieces_[i]);\r\n    }\r\n    if (childPathObj instanceof Path) {\r\n        for (let i = childPathObj.pieceNum_; i < childPathObj.pieces_.length; i++) {\r\n            pieces.push(childPathObj.pieces_[i]);\r\n        }\r\n    }\r\n    else {\r\n        const childPieces = childPathObj.split('/');\r\n        for (let 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    }\r\n    return new Path(pieces, 0);\r\n}\r\n/**\r\n * @returns True if there are no segments in this path\r\n */\r\nfunction pathIsEmpty(path) {\r\n    return path.pieceNum_ >= path.pieces_.length;\r\n}\r\n/**\r\n * @returns The path from outerPath to innerPath\r\n */\r\nfunction newRelativePath(outerPath, innerPath) {\r\n    const outer = pathGetFront(outerPath), inner = pathGetFront(innerPath);\r\n    if (outer === null) {\r\n        return innerPath;\r\n    }\r\n    else if (outer === inner) {\r\n        return newRelativePath(pathPopFront(outerPath), pathPopFront(innerPath));\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 * @returns -1, 0, 1 if left is less, equal, or greater than the right.\r\n */\r\nfunction pathCompare(left, right) {\r\n    const leftKeys = pathSlice(left, 0);\r\n    const rightKeys = pathSlice(right, 0);\r\n    for (let i = 0; i < leftKeys.length && i < rightKeys.length; i++) {\r\n        const cmp = nameCompare(leftKeys[i], rightKeys[i]);\r\n        if (cmp !== 0) {\r\n            return cmp;\r\n        }\r\n    }\r\n    if (leftKeys.length === rightKeys.length) {\r\n        return 0;\r\n    }\r\n    return leftKeys.length < rightKeys.length ? -1 : 1;\r\n}\r\n/**\r\n * @returns true if paths are the same.\r\n */\r\nfunction pathEquals(path, other) {\r\n    if (pathGetLength(path) !== pathGetLength(other)) {\r\n        return false;\r\n    }\r\n    for (let i = path.pieceNum_, j = other.pieceNum_; i <= path.pieces_.length; i++, j++) {\r\n        if (path.pieces_[i] !== other.pieces_[j]) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\n/**\r\n * @returns True if this path is a parent of (or the same as) other\r\n */\r\nfunction pathContains(path, other) {\r\n    let i = path.pieceNum_;\r\n    let j = other.pieceNum_;\r\n    if (pathGetLength(path) > pathGetLength(other)) {\r\n        return false;\r\n    }\r\n    while (i < path.pieces_.length) {\r\n        if (path.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/**\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\nclass ValidationPath {\r\n    /**\r\n     * @param path - Initial Path.\r\n     * @param errorPrefix_ - Prefix for any error messages.\r\n     */\r\n    constructor(path, errorPrefix_) {\r\n        this.errorPrefix_ = errorPrefix_;\r\n        this.parts_ = pathSlice(path, 0);\r\n        /** Initialize to number of '/' chars needed in path. */\r\n        this.byteLength_ = Math.max(1, this.parts_.length);\r\n        for (let i = 0; i < this.parts_.length; i++) {\r\n            this.byteLength_ += stringLength(this.parts_[i]);\r\n        }\r\n        validationPathCheckValid(this);\r\n    }\r\n}\r\nfunction validationPathPush(validationPath, child) {\r\n    // Count the needed '/'\r\n    if (validationPath.parts_.length > 0) {\r\n        validationPath.byteLength_ += 1;\r\n    }\r\n    validationPath.parts_.push(child);\r\n    validationPath.byteLength_ += stringLength(child);\r\n    validationPathCheckValid(validationPath);\r\n}\r\nfunction validationPathPop(validationPath) {\r\n    const last = validationPath.parts_.pop();\r\n    validationPath.byteLength_ -= stringLength(last);\r\n    // Un-count the previous '/'\r\n    if (validationPath.parts_.length > 0) {\r\n        validationPath.byteLength_ -= 1;\r\n    }\r\n}\r\nfunction validationPathCheckValid(validationPath) {\r\n    if (validationPath.byteLength_ > MAX_PATH_LENGTH_BYTES) {\r\n        throw new Error(validationPath.errorPrefix_ +\r\n            'has a key path longer than ' +\r\n            MAX_PATH_LENGTH_BYTES +\r\n            ' bytes (' +\r\n            validationPath.byteLength_ +\r\n            ').');\r\n    }\r\n    if (validationPath.parts_.length > MAX_PATH_DEPTH) {\r\n        throw new Error(validationPath.errorPrefix_ +\r\n            'path specified exceeds the maximum depth that can be written (' +\r\n            MAX_PATH_DEPTH +\r\n            ') or object contains a cycle ' +\r\n            validationPathToErrorString(validationPath));\r\n    }\r\n}\r\n/**\r\n * String for use in error messages - uses '.' notation for path.\r\n */\r\nfunction validationPathToErrorString(validationPath) {\r\n    if (validationPath.parts_.length === 0) {\r\n        return '';\r\n    }\r\n    return \"in property '\" + validationPath.parts_.join('.') + \"'\";\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass VisibilityMonitor extends EventEmitter {\r\n    constructor() {\r\n        super(['visible']);\r\n        let hidden;\r\n        let 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, () => {\r\n                const 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    }\r\n    static getInstance() {\r\n        return new VisibilityMonitor();\r\n    }\r\n    getInitialEvent(eventType) {\r\n        assert(eventType === 'visible', 'Unknown event type: ' + eventType);\r\n        return [this.visible_];\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst RECONNECT_MIN_DELAY = 1000;\r\nconst RECONNECT_MAX_DELAY_DEFAULT = 60 * 5 * 1000; // 5 minutes in milliseconds (Case: 1858)\r\nconst RECONNECT_MAX_DELAY_FOR_ADMINS = 30 * 1000; // 30 seconds for admin clients (likely to be a backend server)\r\nconst RECONNECT_DELAY_MULTIPLIER = 1.3;\r\nconst RECONNECT_DELAY_RESET_TIMEOUT = 30000; // Reset delay back to MIN_DELAY after being connected for 30sec.\r\nconst 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\nconst INVALID_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\nclass PersistentConnection extends ServerActions {\r\n    /**\r\n     * @param repoInfo_ - Data about the namespace we are connecting to\r\n     * @param applicationId_ - The Firebase App ID for this project\r\n     * @param onDataUpdate_ - A callback for new data from the server\r\n     */\r\n    constructor(repoInfo_, applicationId_, onDataUpdate_, onConnectStatus_, onServerInfoUpdate_, authTokenProvider_, appCheckTokenProvider_, authOverride_) {\r\n        super();\r\n        this.repoInfo_ = repoInfo_;\r\n        this.applicationId_ = applicationId_;\r\n        this.onDataUpdate_ = onDataUpdate_;\r\n        this.onConnectStatus_ = onConnectStatus_;\r\n        this.onServerInfoUpdate_ = onServerInfoUpdate_;\r\n        this.authTokenProvider_ = authTokenProvider_;\r\n        this.appCheckTokenProvider_ = appCheckTokenProvider_;\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        this.interruptReasons_ = {};\r\n        this.listens = new Map();\r\n        this.outstandingPuts_ = [];\r\n        this.outstandingGets_ = [];\r\n        this.outstandingPutCount_ = 0;\r\n        this.outstandingGetCount_ = 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        this.establishConnectionTimer_ = null;\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        this.realtime_ = null;\r\n        this.authToken_ = null;\r\n        this.appCheckToken_ = null;\r\n        this.forceTokenRefresh_ = false;\r\n        this.invalidAuthTokenCount_ = 0;\r\n        this.invalidAppCheckTokenCount_ = 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        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    }\r\n    sendRequest(action, body, onResponse) {\r\n        const curReqNum = ++this.requestNumber_;\r\n        const 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    get(query) {\r\n        this.initConnection_();\r\n        const deferred = new Deferred();\r\n        const request = {\r\n            p: query._path.toString(),\r\n            q: query._queryObject\r\n        };\r\n        const outstandingGet = {\r\n            action: 'g',\r\n            request,\r\n            onComplete: (message) => {\r\n                const payload = message['d'];\r\n                if (message['s'] === 'ok') {\r\n                    deferred.resolve(payload);\r\n                }\r\n                else {\r\n                    deferred.reject(payload);\r\n                }\r\n            }\r\n        };\r\n        this.outstandingGets_.push(outstandingGet);\r\n        this.outstandingGetCount_++;\r\n        const index = this.outstandingGets_.length - 1;\r\n        if (this.connected_) {\r\n            this.sendGet_(index);\r\n        }\r\n        return deferred.promise;\r\n    }\r\n    listen(query, currentHashFn, tag, onComplete) {\r\n        this.initConnection_();\r\n        const queryId = query._queryIdentifier;\r\n        const pathString = query._path.toString();\r\n        this.log_('Listen called for ' + pathString + ' ' + queryId);\r\n        if (!this.listens.has(pathString)) {\r\n            this.listens.set(pathString, new Map());\r\n        }\r\n        assert(query._queryParams.isDefault() || !query._queryParams.loadsAllData(), 'listen() called for non-default but complete query');\r\n        assert(!this.listens.get(pathString).has(queryId), `listen() called twice for same path/queryId.`);\r\n        const listenSpec = {\r\n            onComplete,\r\n            hashFn: currentHashFn,\r\n            query,\r\n            tag\r\n        };\r\n        this.listens.get(pathString).set(queryId, listenSpec);\r\n        if (this.connected_) {\r\n            this.sendListen_(listenSpec);\r\n        }\r\n    }\r\n    sendGet_(index) {\r\n        const get = this.outstandingGets_[index];\r\n        this.sendRequest('g', get.request, (message) => {\r\n            delete this.outstandingGets_[index];\r\n            this.outstandingGetCount_--;\r\n            if (this.outstandingGetCount_ === 0) {\r\n                this.outstandingGets_ = [];\r\n            }\r\n            if (get.onComplete) {\r\n                get.onComplete(message);\r\n            }\r\n        });\r\n    }\r\n    sendListen_(listenSpec) {\r\n        const query = listenSpec.query;\r\n        const pathString = query._path.toString();\r\n        const queryId = query._queryIdentifier;\r\n        this.log_('Listen on ' + pathString + ' for ' + queryId);\r\n        const req = { /*path*/ p: pathString };\r\n        const 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, (message) => {\r\n            const payload = message[ /*data*/'d'];\r\n            const status = message[ /*status*/'s'];\r\n            // print warnings in any case...\r\n            PersistentConnection.warnOnListenWarnings_(payload, query);\r\n            const currentListenSpec = this.listens.get(pathString) &&\r\n                this.listens.get(pathString).get(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    static warnOnListenWarnings_(payload, query) {\r\n        if (payload && typeof payload === 'object' && contains(payload, 'w')) {\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            const warnings = safeGet(payload, 'w');\r\n            if (Array.isArray(warnings) && ~warnings.indexOf('no_index')) {\r\n                const indexSpec = '\".indexOn\": \"' + query._queryParams.getIndex().toString() + '\"';\r\n                const 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    refreshAuthToken(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', {}, () => { });\r\n            }\r\n        }\r\n        this.reduceReconnectDelayIfAdminCredential_(token);\r\n    }\r\n    reduceReconnectDelayIfAdminCredential_(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        const 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    refreshAppCheckToken(token) {\r\n        this.appCheckToken_ = token;\r\n        this.log_('App check token refreshed');\r\n        if (this.appCheckToken_) {\r\n            this.tryAppCheck();\r\n        }\r\n        else {\r\n            //If we're connected we want to let the server know to unauthenticate us.\r\n            //If we're not connected, simply delete the credential so we dont become\r\n            // authenticated next time we connect.\r\n            if (this.connected_) {\r\n                this.sendRequest('unappeck', {}, () => { });\r\n            }\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    tryAuth() {\r\n        if (this.connected_ && this.authToken_) {\r\n            const token = this.authToken_;\r\n            const authMethod = isValidFormat(token) ? 'auth' : 'gauth';\r\n            const requestData = { cred: token };\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, (res) => {\r\n                const status = res[ /*status*/'s'];\r\n                const data = res[ /*data*/'d'] || 'error';\r\n                if (this.authToken_ === token) {\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     * Attempts to authenticate with the given token. If the authentication\r\n     * attempt fails, it's triggered like the token was revoked (the connection is\r\n     * closed).\r\n     */\r\n    tryAppCheck() {\r\n        if (this.connected_ && this.appCheckToken_) {\r\n            this.sendRequest('appcheck', { 'token': this.appCheckToken_ }, (res) => {\r\n                const status = res[ /*status*/'s'];\r\n                const data = res[ /*data*/'d'] || 'error';\r\n                if (status === 'ok') {\r\n                    this.invalidAppCheckTokenCount_ = 0;\r\n                }\r\n                else {\r\n                    this.onAppCheckRevoked_(status, data);\r\n                }\r\n            });\r\n        }\r\n    }\r\n    /**\r\n     * @inheritDoc\r\n     */\r\n    unlisten(query, tag) {\r\n        const pathString = query._path.toString();\r\n        const queryId = query._queryIdentifier;\r\n        this.log_('Unlisten called for ' + pathString + ' ' + queryId);\r\n        assert(query._queryParams.isDefault() || !query._queryParams.loadsAllData(), 'unlisten() called for non-default but complete query');\r\n        const 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    sendUnlisten_(pathString, queryId, queryObj, tag) {\r\n        this.log_('Unlisten on ' + pathString + ' for ' + queryId);\r\n        const req = { /*path*/ p: pathString };\r\n        const 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    onDisconnectPut(pathString, data, onComplete) {\r\n        this.initConnection_();\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,\r\n                action: 'o',\r\n                data,\r\n                onComplete\r\n            });\r\n        }\r\n    }\r\n    onDisconnectMerge(pathString, data, onComplete) {\r\n        this.initConnection_();\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,\r\n                action: 'om',\r\n                data,\r\n                onComplete\r\n            });\r\n        }\r\n    }\r\n    onDisconnectCancel(pathString, onComplete) {\r\n        this.initConnection_();\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,\r\n                action: 'oc',\r\n                data: null,\r\n                onComplete\r\n            });\r\n        }\r\n    }\r\n    sendOnDisconnect_(action, pathString, data, onComplete) {\r\n        const request = { /*path*/ p: pathString, /*data*/ d: data };\r\n        this.log_('onDisconnect ' + action, request);\r\n        this.sendRequest(action, request, (response) => {\r\n            if (onComplete) {\r\n                setTimeout(() => {\r\n                    onComplete(response[ /*status*/'s'], response[ /* data */'d']);\r\n                }, Math.floor(0));\r\n            }\r\n        });\r\n    }\r\n    put(pathString, data, onComplete, hash) {\r\n        this.putInternal('p', pathString, data, onComplete, hash);\r\n    }\r\n    merge(pathString, data, onComplete, hash) {\r\n        this.putInternal('m', pathString, data, onComplete, hash);\r\n    }\r\n    putInternal(action, pathString, data, onComplete, hash) {\r\n        this.initConnection_();\r\n        const 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        }\r\n        // TODO: Only keep track of the most recent put for a given path?\r\n        this.outstandingPuts_.push({\r\n            action,\r\n            request,\r\n            onComplete\r\n        });\r\n        this.outstandingPutCount_++;\r\n        const 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    sendPut_(index) {\r\n        const action = this.outstandingPuts_[index].action;\r\n        const request = this.outstandingPuts_[index].request;\r\n        const onComplete = this.outstandingPuts_[index].onComplete;\r\n        this.outstandingPuts_[index].queued = this.connected_;\r\n        this.sendRequest(action, request, (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    reportStats(stats) {\r\n        // If we're not connected, we just drop the stats.\r\n        if (this.connected_) {\r\n            const request = { /*counters*/ c: stats };\r\n            this.log_('reportStats', request);\r\n            this.sendRequest(/*stats*/ 's', request, result => {\r\n                const status = result[ /*status*/'s'];\r\n                if (status !== 'ok') {\r\n                    const errorReason = result[ /* data */'d'];\r\n                    this.log_('reportStats', 'Error sending stats: ' + errorReason);\r\n                }\r\n            });\r\n        }\r\n    }\r\n    onDataMessage_(message) {\r\n        if ('r' in message) {\r\n            // this is a response\r\n            this.log_('from server: ' + stringify(message));\r\n            const reqNum = message['r'];\r\n            const 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    onDataPush_(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        }\r\n        else if (action === 'm') {\r\n            this.onDataUpdate_(body[ /*path*/'p'], body[ /*data*/'d'], \r\n            /*isMerge=*/ true, body['t']);\r\n        }\r\n        else if (action === 'c') {\r\n            this.onListenRevoked_(body[ /*path*/'p'], body[ /*query*/'q']);\r\n        }\r\n        else if (action === 'ac') {\r\n            this.onAuthRevoked_(body[ /*status code*/'s'], body[ /* explanation */'d']);\r\n        }\r\n        else if (action === 'apc') {\r\n            this.onAppCheckRevoked_(body[ /*status code*/'s'], body[ /* explanation */'d']);\r\n        }\r\n        else if (action === 'sd') {\r\n            this.onSecurityDebugPacket_(body);\r\n        }\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    }\r\n    onReady_(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    scheduleConnect_(timeout) {\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(() => {\r\n            this.establishConnectionTimer_ = null;\r\n            this.establishConnection_();\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        }, Math.floor(timeout));\r\n    }\r\n    initConnection_() {\r\n        if (!this.realtime_ && this.firstConnection_) {\r\n            this.scheduleConnect_(0);\r\n        }\r\n    }\r\n    onVisible_(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    onOnline_(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    onRealtimeDisconnect_() {\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                const timeSinceLastConnectSucceeded = new Date().getTime() - this.lastConnectionEstablishedTime_;\r\n                if (timeSinceLastConnectSucceeded > RECONNECT_DELAY_RESET_TIMEOUT) {\r\n                    this.reconnectDelay_ = RECONNECT_MIN_DELAY;\r\n                }\r\n                this.lastConnectionEstablishedTime_ = null;\r\n            }\r\n            const timeSinceLastConnectAttempt = new Date().getTime() - this.lastConnectionAttemptTime_;\r\n            let 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    async establishConnection_() {\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            const onDataMessage = this.onDataMessage_.bind(this);\r\n            const onReady = this.onReady_.bind(this);\r\n            const onDisconnect = this.onRealtimeDisconnect_.bind(this);\r\n            const connId = this.id + ':' + PersistentConnection.nextConnectionId_++;\r\n            const lastSessionId = this.lastSessionId;\r\n            let canceled = false;\r\n            let connection = null;\r\n            const closeFn = function () {\r\n                if (connection) {\r\n                    connection.close();\r\n                }\r\n                else {\r\n                    canceled = true;\r\n                    onDisconnect();\r\n                }\r\n            };\r\n            const sendRequestFn = function (msg) {\r\n                assert(connection, \"sendRequest call when we're not connected not allowed.\");\r\n                connection.sendRequest(msg);\r\n            };\r\n            this.realtime_ = {\r\n                close: closeFn,\r\n                sendRequest: sendRequestFn\r\n            };\r\n            const forceRefresh = this.forceTokenRefresh_;\r\n            this.forceTokenRefresh_ = false;\r\n            try {\r\n                // First fetch auth and app check token, and establish connection after\r\n                // fetching the token was successful\r\n                const [authToken, appCheckToken] = await Promise.all([\r\n                    this.authTokenProvider_.getToken(forceRefresh),\r\n                    this.appCheckTokenProvider_.getToken(forceRefresh)\r\n                ]);\r\n                if (!canceled) {\r\n                    log('getToken() completed. Creating connection.');\r\n                    this.authToken_ = authToken && authToken.accessToken;\r\n                    this.appCheckToken_ = appCheckToken && appCheckToken.token;\r\n                    connection = new Connection(connId, this.repoInfo_, this.applicationId_, this.appCheckToken_, this.authToken_, onDataMessage, onReady, onDisconnect, \r\n                    /* onKill= */ reason => {\r\n                        warn(reason + ' (' + this.repoInfo_.toString() + ')');\r\n                        this.interrupt(SERVER_KILL_INTERRUPT_REASON);\r\n                    }, lastSessionId);\r\n                }\r\n                else {\r\n                    log('getToken() completed but was canceled');\r\n                }\r\n            }\r\n            catch (error) {\r\n                this.log_('Failed to get token: ' + error);\r\n                if (!canceled) {\r\n                    if (this.repoInfo_.nodeAdmin) {\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);\r\n                    }\r\n                    closeFn();\r\n                }\r\n            }\r\n        }\r\n    }\r\n    interrupt(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    resume(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    handleTimestamp_(timestamp) {\r\n        const delta = timestamp - new Date().getTime();\r\n        this.onServerInfoUpdate_({ serverTimeOffset: delta });\r\n    }\r\n    cancelSentTransactions_() {\r\n        for (let i = 0; i < this.outstandingPuts_.length; i++) {\r\n            const 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                }\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    onListenRevoked_(pathString, query) {\r\n        // Remove the listen and manufacture a \"permission_denied\" error for the failed listen.\r\n        let queryId;\r\n        if (!query) {\r\n            queryId = 'default';\r\n        }\r\n        else {\r\n            queryId = query.map(q => ObjectToUniqueKey(q)).join('$');\r\n        }\r\n        const listen = this.removeListen_(pathString, queryId);\r\n        if (listen && listen.onComplete) {\r\n            listen.onComplete('permission_denied');\r\n        }\r\n    }\r\n    removeListen_(pathString, queryId) {\r\n        const normalizedPathString = new Path(pathString).toString(); // normalize path.\r\n        let listen;\r\n        if (this.listens.has(normalizedPathString)) {\r\n            const map = this.listens.get(normalizedPathString);\r\n            listen = map.get(queryId);\r\n            map.delete(queryId);\r\n            if (map.size === 0) {\r\n                this.listens.delete(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    onAuthRevoked_(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_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    onAppCheckRevoked_(statusCode, explanation) {\r\n        log('App check token revoked: ' + statusCode + '/' + explanation);\r\n        this.appCheckToken_ = null;\r\n        this.forceTokenRefresh_ = true;\r\n        // Note: We don't close the connection as the developer may not have\r\n        // enforcement enabled. The backend closes connections with enforcements.\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.invalidAppCheckTokenCount_++;\r\n            if (this.invalidAppCheckTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\r\n                this.appCheckTokenProvider_.notifyForInvalidToken();\r\n            }\r\n        }\r\n    }\r\n    onSecurityDebugPacket_(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    restoreState_() {\r\n        //Re-authenticate ourselves if we have a credential stored.\r\n        this.tryAuth();\r\n        this.tryAppCheck();\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        for (const queries of this.listens.values()) {\r\n            for (const listenSpec of queries.values()) {\r\n                this.sendListen_(listenSpec);\r\n            }\r\n        }\r\n        for (let i = 0; i < this.outstandingPuts_.length; i++) {\r\n            if (this.outstandingPuts_[i]) {\r\n                this.sendPut_(i);\r\n            }\r\n        }\r\n        while (this.onDisconnectRequestQueue_.length) {\r\n            const request = this.onDisconnectRequestQueue_.shift();\r\n            this.sendOnDisconnect_(request.action, request.pathString, request.data, request.onComplete);\r\n        }\r\n        for (let i = 0; i < this.outstandingGets_.length; i++) {\r\n            if (this.outstandingGets_[i]) {\r\n                this.sendGet_(i);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Sends client stats for first connection\r\n     */\r\n    sendConnectStats_() {\r\n        const stats = {};\r\n        let clientName = 'js';\r\n        if (isNodeSdk()) {\r\n            if (this.repoInfo_.nodeAdmin) {\r\n                clientName = 'admin_node';\r\n            }\r\n            else {\r\n                clientName = 'node';\r\n            }\r\n        }\r\n        stats['sdk.' + clientName + '.' + 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    shouldReconnect_() {\r\n        const online = OnlineMonitor.getInstance().currentlyOnline();\r\n        return isEmpty(this.interruptReasons_) && online;\r\n    }\r\n}\r\nPersistentConnection.nextPersistentConnectionId_ = 0;\r\n/**\r\n * Counter for number of connections created. Mainly used for tagging in the logs\r\n */\r\nPersistentConnection.nextConnectionId_ = 0;\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass NamedNode {\r\n    constructor(name, node) {\r\n        this.name = name;\r\n        this.node = node;\r\n    }\r\n    static Wrap(name, node) {\r\n        return new NamedNode(name, node);\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass Index {\r\n    /**\r\n     * @returns A standalone comparison function for\r\n     * this index\r\n     */\r\n    getCompare() {\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     *\r\n     * @returns True if the portion of the snapshot being indexed changed between oldNode and newNode\r\n     */\r\n    indexedValueChanged(oldNode, newNode) {\r\n        const oldWrapped = new NamedNode(MIN_NAME, oldNode);\r\n        const newWrapped = new NamedNode(MIN_NAME, newNode);\r\n        return this.compare(oldWrapped, newWrapped) !== 0;\r\n    }\r\n    /**\r\n     * @returns a node wrapper that will sort equal to or less than\r\n     * any other node wrapper, using this index\r\n     */\r\n    minPost() {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        return NamedNode.MIN;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet __EMPTY_NODE;\r\nclass KeyIndex extends Index {\r\n    static get __EMPTY_NODE() {\r\n        return __EMPTY_NODE;\r\n    }\r\n    static set __EMPTY_NODE(val) {\r\n        __EMPTY_NODE = val;\r\n    }\r\n    compare(a, b) {\r\n        return nameCompare(a.name, b.name);\r\n    }\r\n    isDefinedOn(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    indexedValueChanged(oldNode, newNode) {\r\n        return false; // The key for a node never changes.\r\n    }\r\n    minPost() {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        return NamedNode.MIN;\r\n    }\r\n    maxPost() {\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    makePost(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     * @returns String representation for inclusion in a query spec\r\n     */\r\n    toString() {\r\n        return '.key';\r\n    }\r\n}\r\nconst KEY_INDEX = new KeyIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass SortedMapIterator {\r\n    /**\r\n     * @param node - Node to iterate.\r\n     * @param isReverse_ - Whether or not to iterate in reverse\r\n     */\r\n    constructor(node, startKey, comparator, isReverse_, resultGenerator_ = null) {\r\n        this.isReverse_ = isReverse_;\r\n        this.resultGenerator_ = resultGenerator_;\r\n        this.nodeStack_ = [];\r\n        let 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            }\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    getNext() {\r\n        if (this.nodeStack_.length === 0) {\r\n            return null;\r\n        }\r\n        let node = this.nodeStack_.pop();\r\n        let result;\r\n        if (this.resultGenerator_) {\r\n            result = this.resultGenerator_(node.key, node.value);\r\n        }\r\n        else {\r\n            result = { key: node.key, value: node.value };\r\n        }\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    hasNext() {\r\n        return this.nodeStack_.length > 0;\r\n    }\r\n    peek() {\r\n        if (this.nodeStack_.length === 0) {\r\n            return null;\r\n        }\r\n        const 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}\r\n/**\r\n * Represents a node in a Left-leaning Red-Black tree.\r\n */\r\nclass LLRBNode {\r\n    /**\r\n     * @param key - Key associated with this node.\r\n     * @param value - Value associated with this node.\r\n     * @param color - Whether this node is red.\r\n     * @param left - Left child.\r\n     * @param right - Right child.\r\n     */\r\n    constructor(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 key - New key for the node, or null.\r\n     * @param value - New value for the node, or null.\r\n     * @param color - New color for the node, or null.\r\n     * @param left - New left child for the node, or null.\r\n     * @param right - New right child for the node, or null.\r\n     * @returns The node copy.\r\n     */\r\n    copy(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     * @returns The total number of nodes in the tree.\r\n     */\r\n    count() {\r\n        return this.left.count() + 1 + this.right.count();\r\n    }\r\n    /**\r\n     * @returns True if the tree is empty.\r\n     */\r\n    isEmpty() {\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 action - Callback function to be called for each\r\n     *   node.  If it returns true, traversal is aborted.\r\n     * @returns The first truthy value returned by action, or the last falsey\r\n     *   value returned by action\r\n     */\r\n    inorderTraversal(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 action - Callback function to be called for each\r\n     * node.  If it returns true, traversal is aborted.\r\n     * @returns True if traversal was aborted.\r\n     */\r\n    reverseTraversal(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     * @returns The minimum node in the tree.\r\n     */\r\n    min_() {\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     * @returns The maximum key in the tree.\r\n     */\r\n    minKey() {\r\n        return this.min_().key;\r\n    }\r\n    /**\r\n     * @returns The maximum key in the tree.\r\n     */\r\n    maxKey() {\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     * @param key - Key to insert.\r\n     * @param value - Value to insert.\r\n     * @param comparator - Comparator.\r\n     * @returns New tree, with the key/value added.\r\n     */\r\n    insert(key, value, comparator) {\r\n        let n = this;\r\n        const 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     * @returns New tree, with the minimum key removed.\r\n     */\r\n    removeMin_() {\r\n        if (this.left.isEmpty()) {\r\n            return SortedMap.EMPTY_NODE;\r\n        }\r\n        let n = this;\r\n        if (!n.left.isRed_() && !n.left.left.isRed_()) {\r\n            n = n.moveRedLeft_();\r\n        }\r\n        n = n.copy(null, null, null, n.left.removeMin_(), null);\r\n        return n.fixUp_();\r\n    }\r\n    /**\r\n     * @param key - The key of the item to remove.\r\n     * @param comparator - Comparator.\r\n     * @returns New tree, with the specified item removed.\r\n     */\r\n    remove(key, comparator) {\r\n        let 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            }\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     * @returns Whether this is a RED node.\r\n     */\r\n    isRed_() {\r\n        return this.color;\r\n    }\r\n    /**\r\n     * @returns New tree after performing any needed rotations.\r\n     */\r\n    fixUp_() {\r\n        let n = this;\r\n        if (n.right.isRed_() && !n.left.isRed_()) {\r\n            n = n.rotateLeft_();\r\n        }\r\n        if (n.left.isRed_() && n.left.left.isRed_()) {\r\n            n = n.rotateRight_();\r\n        }\r\n        if (n.left.isRed_() && n.right.isRed_()) {\r\n            n = n.colorFlip_();\r\n        }\r\n        return n;\r\n    }\r\n    /**\r\n     * @returns New tree, after moveRedLeft.\r\n     */\r\n    moveRedLeft_() {\r\n        let 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     * @returns New tree, after moveRedRight.\r\n     */\r\n    moveRedRight_() {\r\n        let 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     * @returns New tree, after rotateLeft.\r\n     */\r\n    rotateLeft_() {\r\n        const 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     * @returns New tree, after rotateRight.\r\n     */\r\n    rotateRight_() {\r\n        const 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     * @returns Newt ree, after colorFlip.\r\n     */\r\n    colorFlip_() {\r\n        const left = this.left.copy(null, null, !this.left.color, null, null);\r\n        const 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     * @returns True if all is well.\r\n     */\r\n    checkMaxDepth_() {\r\n        const blackDepth = this.check_();\r\n        return Math.pow(2.0, blackDepth) <= this.count() + 1;\r\n    }\r\n    check_() {\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        const 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}\r\nLLRBNode.RED = true;\r\nLLRBNode.BLACK = false;\r\n/**\r\n * Represents an empty node (a leaf node in the Red-Black Tree).\r\n */\r\nclass LLRBEmptyNode {\r\n    /**\r\n     * Returns a copy of the current node.\r\n     *\r\n     * @returns The node copy.\r\n     */\r\n    copy(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 key - Key to be added.\r\n     * @param value - Value to be added.\r\n     * @param comparator - Comparator.\r\n     * @returns New tree, with item added.\r\n     */\r\n    insert(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 key - The key to remove.\r\n     * @param comparator - Comparator.\r\n     * @returns New tree, with item removed.\r\n     */\r\n    remove(key, comparator) {\r\n        return this;\r\n    }\r\n    /**\r\n     * @returns The total number of nodes in the tree.\r\n     */\r\n    count() {\r\n        return 0;\r\n    }\r\n    /**\r\n     * @returns True if the tree is empty.\r\n     */\r\n    isEmpty() {\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 action - Callback function to be called for each\r\n     * node.  If it returns true, traversal is aborted.\r\n     * @returns True if traversal was aborted.\r\n     */\r\n    inorderTraversal(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 action - Callback function to be called for each\r\n     * node.  If it returns true, traversal is aborted.\r\n     * @returns True if traversal was aborted.\r\n     */\r\n    reverseTraversal(action) {\r\n        return false;\r\n    }\r\n    minKey() {\r\n        return null;\r\n    }\r\n    maxKey() {\r\n        return null;\r\n    }\r\n    check_() {\r\n        return 0;\r\n    }\r\n    /**\r\n     * @returns Whether this node is red.\r\n     */\r\n    isRed_() {\r\n        return false;\r\n    }\r\n}\r\n/**\r\n * An immutable sorted map implementation, based on a Left-leaning Red-Black\r\n * tree.\r\n */\r\nclass SortedMap {\r\n    /**\r\n     * @param comparator_ - Key comparator.\r\n     * @param root_ - Optional root node for the map.\r\n     */\r\n    constructor(comparator_, 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 key - Key to be added.\r\n     * @param value - Value to be added.\r\n     * @returns New map, with item added.\r\n     */\r\n    insert(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 key - The key to remove.\r\n     * @returns New map, with item removed.\r\n     */\r\n    remove(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 key - The key to look up.\r\n     * @returns The value of the node with the given key, or null if the\r\n     * key doesn't exist.\r\n     */\r\n    get(key) {\r\n        let cmp;\r\n        let 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 key - The key to find the predecessor of\r\n     * @returns The predecessor key.\r\n     */\r\n    getPredecessorKey(key) {\r\n        let 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                    }\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     * @returns True if the map is empty.\r\n     */\r\n    isEmpty() {\r\n        return this.root_.isEmpty();\r\n    }\r\n    /**\r\n     * @returns The total number of nodes in the map.\r\n     */\r\n    count() {\r\n        return this.root_.count();\r\n    }\r\n    /**\r\n     * @returns The minimum key in the map.\r\n     */\r\n    minKey() {\r\n        return this.root_.minKey();\r\n    }\r\n    /**\r\n     * @returns The maximum key in the map.\r\n     */\r\n    maxKey() {\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 action - Callback function to be called\r\n     * for each key/value pair.  If action returns true, traversal is aborted.\r\n     * @returns The first truthy value returned by action, or the last falsey\r\n     *   value returned by action\r\n     */\r\n    inorderTraversal(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 action - Callback function to be called\r\n     * for each key/value pair.  If action returns true, traversal is aborted.\r\n     * @returns True if the traversal was aborted.\r\n     */\r\n    reverseTraversal(action) {\r\n        return this.root_.reverseTraversal(action);\r\n    }\r\n    /**\r\n     * Returns an iterator over the SortedMap.\r\n     * @returns The iterator.\r\n     */\r\n    getIterator(resultGenerator) {\r\n        return new SortedMapIterator(this.root_, null, this.comparator_, false, resultGenerator);\r\n    }\r\n    getIteratorFrom(key, resultGenerator) {\r\n        return new SortedMapIterator(this.root_, key, this.comparator_, false, resultGenerator);\r\n    }\r\n    getReverseIteratorFrom(key, resultGenerator) {\r\n        return new SortedMapIterator(this.root_, key, this.comparator_, true, resultGenerator);\r\n    }\r\n    getReverseIterator(resultGenerator) {\r\n        return new SortedMapIterator(this.root_, null, this.comparator_, true, resultGenerator);\r\n    }\r\n}\r\n/**\r\n * Always use the same empty node, to reduce memory.\r\n */\r\nSortedMap.EMPTY_NODE = new LLRBEmptyNode();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 * @license\r\n * Copyright 2017 Google LLC\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\nlet MAX_NODE$2;\r\nfunction setMaxNode$1(val) {\r\n    MAX_NODE$2 = val;\r\n}\r\nconst priorityHashText = function (priority) {\r\n    if (typeof priority === 'number') {\r\n        return 'number:' + doubleToIEEE754String(priority);\r\n    }\r\n    else {\r\n        return 'string:' + priority;\r\n    }\r\n};\r\n/**\r\n * Validates that a priority snapshot Node is valid.\r\n */\r\nconst validatePriorityNode = function (priorityNode) {\r\n    if (priorityNode.isLeafNode()) {\r\n        const 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$2 || 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$2 || priorityNode.getPriority().isEmpty(), \"Priority nodes can't have a priority of their own.\");\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet __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\nclass LeafNode {\r\n    /**\r\n     * @param value_ - The value to store in this leaf node. The object type is\r\n     * possible in the event of a deferred value\r\n     * @param priorityNode_ - The priority of this node.\r\n     */\r\n    constructor(value_, 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    static set __childrenNodeConstructor(val) {\r\n        __childrenNodeConstructor = val;\r\n    }\r\n    static get __childrenNodeConstructor() {\r\n        return __childrenNodeConstructor;\r\n    }\r\n    /** @inheritDoc */\r\n    isLeafNode() {\r\n        return true;\r\n    }\r\n    /** @inheritDoc */\r\n    getPriority() {\r\n        return this.priorityNode_;\r\n    }\r\n    /** @inheritDoc */\r\n    updatePriority(newPriorityNode) {\r\n        return new LeafNode(this.value_, newPriorityNode);\r\n    }\r\n    /** @inheritDoc */\r\n    getImmediateChild(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    getChild(path) {\r\n        if (pathIsEmpty(path)) {\r\n            return this;\r\n        }\r\n        else if (pathGetFront(path) === '.priority') {\r\n            return this.priorityNode_;\r\n        }\r\n        else {\r\n            return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\r\n        }\r\n    }\r\n    hasChild() {\r\n        return false;\r\n    }\r\n    /** @inheritDoc */\r\n    getPredecessorChildName(childName, childNode) {\r\n        return null;\r\n    }\r\n    /** @inheritDoc */\r\n    updateImmediateChild(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    updateChild(path, newChildNode) {\r\n        const front = pathGetFront(path);\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' || pathGetLength(path) === 1, '.priority must be the last token in a path');\r\n            return this.updateImmediateChild(front, LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateChild(pathPopFront(path), newChildNode));\r\n        }\r\n    }\r\n    /** @inheritDoc */\r\n    isEmpty() {\r\n        return false;\r\n    }\r\n    /** @inheritDoc */\r\n    numChildren() {\r\n        return 0;\r\n    }\r\n    /** @inheritDoc */\r\n    forEachChild(index, action) {\r\n        return false;\r\n    }\r\n    val(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        }\r\n        else {\r\n            return this.getValue();\r\n        }\r\n    }\r\n    /** @inheritDoc */\r\n    hash() {\r\n        if (this.lazyHash_ === null) {\r\n            let toHash = '';\r\n            if (!this.priorityNode_.isEmpty()) {\r\n                toHash +=\r\n                    'priority:' +\r\n                        priorityHashText(this.priorityNode_.val()) +\r\n                        ':';\r\n            }\r\n            const 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     * @returns The value of the node.\r\n     */\r\n    getValue() {\r\n        return this.value_;\r\n    }\r\n    compareTo(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     */\r\n    compareToLeafNode_(otherLeaf) {\r\n        const otherLeafType = typeof otherLeaf.value_;\r\n        const thisLeafType = typeof this.value_;\r\n        const otherIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(otherLeafType);\r\n        const 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    withIndex() {\r\n        return this;\r\n    }\r\n    isIndexed() {\r\n        return true;\r\n    }\r\n    equals(other) {\r\n        if (other === this) {\r\n            return true;\r\n        }\r\n        else if (other.isLeafNode()) {\r\n            const 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/**\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 */\r\nLeafNode.VALUE_TYPE_ORDER = ['object', 'boolean', 'number', 'string'];\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet nodeFromJSON$1;\r\nlet MAX_NODE$1;\r\nfunction setNodeFromJSON(val) {\r\n    nodeFromJSON$1 = val;\r\n}\r\nfunction setMaxNode(val) {\r\n    MAX_NODE$1 = val;\r\n}\r\nclass PriorityIndex extends Index {\r\n    compare(a, b) {\r\n        const aPriority = a.node.getPriority();\r\n        const bPriority = b.node.getPriority();\r\n        const 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    isDefinedOn(node) {\r\n        return !node.getPriority().isEmpty();\r\n    }\r\n    indexedValueChanged(oldNode, newNode) {\r\n        return !oldNode.getPriority().equals(newNode.getPriority());\r\n    }\r\n    minPost() {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        return NamedNode.MIN;\r\n    }\r\n    maxPost() {\r\n        return new NamedNode(MAX_NAME, new LeafNode('[PRIORITY-POST]', MAX_NODE$1));\r\n    }\r\n    makePost(indexValue, name) {\r\n        const priorityNode = nodeFromJSON$1(indexValue);\r\n        return new NamedNode(name, new LeafNode('[PRIORITY-POST]', priorityNode));\r\n    }\r\n    /**\r\n     * @returns String representation for inclusion in a query spec\r\n     */\r\n    toString() {\r\n        return '.priority';\r\n    }\r\n}\r\nconst PRIORITY_INDEX = new PriorityIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst LOG_2 = Math.log(2);\r\nclass Base12Num {\r\n    constructor(length) {\r\n        const logBase2 = (num) => \r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        parseInt((Math.log(num) / LOG_2), 10);\r\n        const bitMask = (bits) => parseInt(Array(bits + 1).join('1'), 2);\r\n        this.count = logBase2(length + 1);\r\n        this.current_ = this.count - 1;\r\n        const mask = bitMask(this.count);\r\n        this.bits_ = (length + 1) & mask;\r\n    }\r\n    nextBitIsOne() {\r\n        //noinspection JSBitwiseOperatorUsage\r\n        const result = !(this.bits_ & (0x1 << this.current_));\r\n        this.current_--;\r\n        return result;\r\n    }\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 * @param childList - Unsorted list of children\r\n * @param cmp - The comparison method to be used\r\n * @param keyFn - An optional function to extract K from a node wrapper, if K's\r\n * type is not NamedNode\r\n * @param mapSortFn - An optional override for comparator used by the generated sorted map\r\n */\r\nconst buildChildSet = function (childList, cmp, keyFn, mapSortFn) {\r\n    childList.sort(cmp);\r\n    const buildBalancedTree = function (low, high) {\r\n        const length = high - low;\r\n        let namedNode;\r\n        let 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            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            const middle = parseInt((length / 2), 10) + low;\r\n            const left = buildBalancedTree(low, middle);\r\n            const 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    const buildFrom12Array = function (base12) {\r\n        let node = null;\r\n        let root = null;\r\n        let index = childList.length;\r\n        const buildPennant = function (chunkSize, color) {\r\n            const low = index - chunkSize;\r\n            const high = index;\r\n            index -= chunkSize;\r\n            const childTree = buildBalancedTree(low + 1, high);\r\n            const namedNode = childList[low];\r\n            const key = keyFn ? keyFn(namedNode) : namedNode;\r\n            attachPennant(new LLRBNode(key, namedNode.node, color, null, childTree));\r\n        };\r\n        const 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 (let i = 0; i < base12.count; ++i) {\r\n            const isOne = base12.nextBitIsOne();\r\n            // The number of nodes taken in each slice is 2^(arr.length - (i + 1))\r\n            const 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    const base12 = new Base12Num(childList.length);\r\n    const root = buildFrom12Array(base12);\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    return new SortedMap(mapSortFn || cmp, root);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet _defaultIndexMap;\r\nconst fallbackObject = {};\r\nclass IndexMap {\r\n    constructor(indexes_, indexSet_) {\r\n        this.indexes_ = indexes_;\r\n        this.indexSet_ = indexSet_;\r\n    }\r\n    /**\r\n     * The default IndexMap for nodes without a priority\r\n     */\r\n    static get Default() {\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    get(indexKey) {\r\n        const sortedMap = safeGet(this.indexes_, indexKey);\r\n        if (!sortedMap) {\r\n            throw new Error('No index defined for ' + indexKey);\r\n        }\r\n        if (sortedMap instanceof SortedMap) {\r\n            return sortedMap;\r\n        }\r\n        else {\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    }\r\n    hasIndex(indexDefinition) {\r\n        return contains(this.indexSet_, indexDefinition.toString());\r\n    }\r\n    addIndex(indexDefinition, existingChildren) {\r\n        assert(indexDefinition !== KEY_INDEX, \"KeyIndex always exists and isn't meant to be added to the IndexMap.\");\r\n        const childList = [];\r\n        let sawIndexedValue = false;\r\n        const iter = existingChildren.getIterator(NamedNode.Wrap);\r\n        let 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        let 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        const indexName = indexDefinition.toString();\r\n        const newIndexSet = Object.assign({}, this.indexSet_);\r\n        newIndexSet[indexName] = indexDefinition;\r\n        const newIndexes = Object.assign({}, 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     */\r\n    addToIndexes(namedNode, existingChildren) {\r\n        const newIndexes = map(this.indexes_, (indexedChildren, indexName) => {\r\n            const 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                    const childList = [];\r\n                    const iter = existingChildren.getIterator(NamedNode.Wrap);\r\n                    let 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                const existingSnap = existingChildren.get(namedNode.name);\r\n                let 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     */\r\n    removeFromIndexes(namedNode, existingChildren) {\r\n        const newIndexes = map(this.indexes_, (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                const 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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet 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\nclass ChildrenNode {\r\n    /**\r\n     * @param children_ - List of children of this node..\r\n     * @param priorityNode_ - The priority of this node (as a snapshot node).\r\n     */\r\n    constructor(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    static get EMPTY_NODE() {\r\n        return (EMPTY_NODE ||\r\n            (EMPTY_NODE = new ChildrenNode(new SortedMap(NAME_COMPARATOR), null, IndexMap.Default)));\r\n    }\r\n    /** @inheritDoc */\r\n    isLeafNode() {\r\n        return false;\r\n    }\r\n    /** @inheritDoc */\r\n    getPriority() {\r\n        return this.priorityNode_ || EMPTY_NODE;\r\n    }\r\n    /** @inheritDoc */\r\n    updatePriority(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    getImmediateChild(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            const child = this.children_.get(childName);\r\n            return child === null ? EMPTY_NODE : child;\r\n        }\r\n    }\r\n    /** @inheritDoc */\r\n    getChild(path) {\r\n        const front = pathGetFront(path);\r\n        if (front === null) {\r\n            return this;\r\n        }\r\n        return this.getImmediateChild(front).getChild(pathPopFront(path));\r\n    }\r\n    /** @inheritDoc */\r\n    hasChild(childName) {\r\n        return this.children_.get(childName) !== null;\r\n    }\r\n    /** @inheritDoc */\r\n    updateImmediateChild(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            const namedNode = new NamedNode(childName, newChildNode);\r\n            let newChildren, newIndexMap;\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            const newPriority = newChildren.isEmpty()\r\n                ? EMPTY_NODE\r\n                : this.priorityNode_;\r\n            return new ChildrenNode(newChildren, newPriority, newIndexMap);\r\n        }\r\n    }\r\n    /** @inheritDoc */\r\n    updateChild(path, newChildNode) {\r\n        const front = pathGetFront(path);\r\n        if (front === null) {\r\n            return newChildNode;\r\n        }\r\n        else {\r\n            assert(pathGetFront(path) !== '.priority' || pathGetLength(path) === 1, '.priority must be the last token in a path');\r\n            const newImmediateChild = this.getImmediateChild(front).updateChild(pathPopFront(path), newChildNode);\r\n            return this.updateImmediateChild(front, newImmediateChild);\r\n        }\r\n    }\r\n    /** @inheritDoc */\r\n    isEmpty() {\r\n        return this.children_.isEmpty();\r\n    }\r\n    /** @inheritDoc */\r\n    numChildren() {\r\n        return this.children_.count();\r\n    }\r\n    /** @inheritDoc */\r\n    val(exportFormat) {\r\n        if (this.isEmpty()) {\r\n            return null;\r\n        }\r\n        const obj = {};\r\n        let numKeys = 0, maxKey = 0, allIntegerKeys = true;\r\n        this.forEachChild(PRIORITY_INDEX, (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            const array = [];\r\n            // eslint-disable-next-line guard-for-in\r\n            for (const key in obj) {\r\n                array[key] = obj[key];\r\n            }\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    hash() {\r\n        if (this.lazyHash_ === null) {\r\n            let toHash = '';\r\n            if (!this.getPriority().isEmpty()) {\r\n                toHash +=\r\n                    'priority:' +\r\n                        priorityHashText(this.getPriority().val()) +\r\n                        ':';\r\n            }\r\n            this.forEachChild(PRIORITY_INDEX, (key, childNode) => {\r\n                const childHash = childNode.hash();\r\n                if (childHash !== '') {\r\n                    toHash += ':' + key + ':' + childHash;\r\n                }\r\n            });\r\n            this.lazyHash_ = toHash === '' ? '' : sha1(toHash);\r\n        }\r\n        return this.lazyHash_;\r\n    }\r\n    /** @inheritDoc */\r\n    getPredecessorChildName(childName, childNode, index) {\r\n        const idx = this.resolveIndex_(index);\r\n        if (idx) {\r\n            const 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    getFirstChildName(indexDefinition) {\r\n        const idx = this.resolveIndex_(indexDefinition);\r\n        if (idx) {\r\n            const 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    getFirstChild(indexDefinition) {\r\n        const 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     */\r\n    getLastChildName(indexDefinition) {\r\n        const idx = this.resolveIndex_(indexDefinition);\r\n        if (idx) {\r\n            const 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    getLastChild(indexDefinition) {\r\n        const 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    forEachChild(index, action) {\r\n        const idx = this.resolveIndex_(index);\r\n        if (idx) {\r\n            return idx.inorderTraversal(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    getIterator(indexDefinition) {\r\n        return this.getIteratorFrom(indexDefinition.minPost(), indexDefinition);\r\n    }\r\n    getIteratorFrom(startPost, indexDefinition) {\r\n        const idx = this.resolveIndex_(indexDefinition);\r\n        if (idx) {\r\n            return idx.getIteratorFrom(startPost, key => key);\r\n        }\r\n        else {\r\n            const iterator = this.children_.getIteratorFrom(startPost.name, NamedNode.Wrap);\r\n            let 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    getReverseIterator(indexDefinition) {\r\n        return this.getReverseIteratorFrom(indexDefinition.maxPost(), indexDefinition);\r\n    }\r\n    getReverseIteratorFrom(endPost, indexDefinition) {\r\n        const idx = this.resolveIndex_(indexDefinition);\r\n        if (idx) {\r\n            return idx.getReverseIteratorFrom(endPost, key => {\r\n                return key;\r\n            });\r\n        }\r\n        else {\r\n            const iterator = this.children_.getReverseIteratorFrom(endPost.name, NamedNode.Wrap);\r\n            let 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    compareTo(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) {\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    withIndex(indexDefinition) {\r\n        if (indexDefinition === KEY_INDEX ||\r\n            this.indexMap_.hasIndex(indexDefinition)) {\r\n            return this;\r\n        }\r\n        else {\r\n            const newIndexMap = this.indexMap_.addIndex(indexDefinition, this.children_);\r\n            return new ChildrenNode(this.children_, this.priorityNode_, newIndexMap);\r\n        }\r\n    }\r\n    isIndexed(index) {\r\n        return index === KEY_INDEX || this.indexMap_.hasIndex(index);\r\n    }\r\n    equals(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            const 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                const thisIter = this.getIterator(PRIORITY_INDEX);\r\n                const otherIter = otherChildrenNode.getIterator(PRIORITY_INDEX);\r\n                let thisCurrent = thisIter.getNext();\r\n                let 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     */\r\n    resolveIndex_(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\nChildrenNode.INTEGER_REGEXP_ = /^(0|[1-9]\\d*)$/;\r\nclass MaxNode extends ChildrenNode {\r\n    constructor() {\r\n        super(new SortedMap(NAME_COMPARATOR), ChildrenNode.EMPTY_NODE, IndexMap.Default);\r\n    }\r\n    compareTo(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    equals(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    getPriority() {\r\n        return this;\r\n    }\r\n    getImmediateChild(childName) {\r\n        return ChildrenNode.EMPTY_NODE;\r\n    }\r\n    isEmpty() {\r\n        return false;\r\n    }\r\n}\r\n/**\r\n * Marker that will sort higher than any other snapshot.\r\n */\r\nconst MAX_NODE = 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)\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$1(MAX_NODE);\r\nsetMaxNode(MAX_NODE);\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst 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 priority - Optional priority to use.  This will be ignored if the\r\n * passed JSON contains a .priority property.\r\n */\r\nfunction nodeFromJSON(json, 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        const jsonLeaf = json;\r\n        return new LeafNode(jsonLeaf, nodeFromJSON(priority));\r\n    }\r\n    if (!(json instanceof Array) && USE_HINZE) {\r\n        const children = [];\r\n        let childrenHavePriority = false;\r\n        const hinzeJsonObj = json;\r\n        each(hinzeJsonObj, (key, child) => {\r\n            if (key.substring(0, 1) !== '.') {\r\n                // Ignore metadata nodes\r\n                const childNode = nodeFromJSON(child);\r\n                if (!childNode.isEmpty()) {\r\n                    childrenHavePriority =\r\n                        childrenHavePriority || !childNode.getPriority().isEmpty();\r\n                    children.push(new NamedNode(key, childNode));\r\n                }\r\n            }\r\n        });\r\n        if (children.length === 0) {\r\n            return ChildrenNode.EMPTY_NODE;\r\n        }\r\n        const childSet = buildChildSet(children, NAME_ONLY_COMPARATOR, namedNode => namedNode.name, NAME_COMPARATOR);\r\n        if (childrenHavePriority) {\r\n            const sortedChildSet = buildChildSet(children, PRIORITY_INDEX.getCompare());\r\n            return new ChildrenNode(childSet, nodeFromJSON(priority), new IndexMap({ '.priority': sortedChildSet }, { '.priority': PRIORITY_INDEX }));\r\n        }\r\n        else {\r\n            return new ChildrenNode(childSet, nodeFromJSON(priority), IndexMap.Default);\r\n        }\r\n    }\r\n    else {\r\n        let node = ChildrenNode.EMPTY_NODE;\r\n        each(json, (key, childData) => {\r\n            if (contains(json, key)) {\r\n                if (key.substring(0, 1) !== '.') {\r\n                    // ignore metadata nodes.\r\n                    const childNode = nodeFromJSON(childData);\r\n                    if (childNode.isLeafNode() || !childNode.isEmpty()) {\r\n                        node = node.updateImmediateChild(key, childNode);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        return node.updatePriority(nodeFromJSON(priority));\r\n    }\r\n}\r\nsetNodeFromJSON(nodeFromJSON);\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass PathIndex extends Index {\r\n    constructor(indexPath_) {\r\n        super();\r\n        this.indexPath_ = indexPath_;\r\n        assert(!pathIsEmpty(indexPath_) && pathGetFront(indexPath_) !== '.priority', \"Can't create PathIndex with empty path or .priority key\");\r\n    }\r\n    extractChild(snap) {\r\n        return snap.getChild(this.indexPath_);\r\n    }\r\n    isDefinedOn(node) {\r\n        return !node.getChild(this.indexPath_).isEmpty();\r\n    }\r\n    compare(a, b) {\r\n        const aChild = this.extractChild(a.node);\r\n        const bChild = this.extractChild(b.node);\r\n        const 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    makePost(indexValue, name) {\r\n        const valueNode = nodeFromJSON(indexValue);\r\n        const node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, valueNode);\r\n        return new NamedNode(name, node);\r\n    }\r\n    maxPost() {\r\n        const node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, MAX_NODE);\r\n        return new NamedNode(MAX_NAME, node);\r\n    }\r\n    toString() {\r\n        return pathSlice(this.indexPath_, 0).join('/');\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass ValueIndex extends Index {\r\n    compare(a, b) {\r\n        const 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    isDefinedOn(node) {\r\n        return true;\r\n    }\r\n    indexedValueChanged(oldNode, newNode) {\r\n        return !oldNode.equals(newNode);\r\n    }\r\n    minPost() {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        return NamedNode.MIN;\r\n    }\r\n    maxPost() {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        return NamedNode.MAX;\r\n    }\r\n    makePost(indexValue, name) {\r\n        const valueNode = nodeFromJSON(indexValue);\r\n        return new NamedNode(name, valueNode);\r\n    }\r\n    /**\r\n     * @returns String representation for inclusion in a query spec\r\n     */\r\n    toString() {\r\n        return '.value';\r\n    }\r\n}\r\nconst VALUE_INDEX = new ValueIndex();\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 changeValue(snapshotNode) {\r\n    return { type: \"value\" /* ChangeType.VALUE */, snapshotNode };\r\n}\r\nfunction changeChildAdded(childName, snapshotNode) {\r\n    return { type: \"child_added\" /* ChangeType.CHILD_ADDED */, snapshotNode, childName };\r\n}\r\nfunction changeChildRemoved(childName, snapshotNode) {\r\n    return { type: \"child_removed\" /* ChangeType.CHILD_REMOVED */, snapshotNode, childName };\r\n}\r\nfunction changeChildChanged(childName, snapshotNode, oldSnap) {\r\n    return {\r\n        type: \"child_changed\" /* ChangeType.CHILD_CHANGED */,\r\n        snapshotNode,\r\n        childName,\r\n        oldSnap\r\n    };\r\n}\r\nfunction changeChildMoved(childName, snapshotNode) {\r\n    return { type: \"child_moved\" /* ChangeType.CHILD_MOVED */, snapshotNode, childName };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass IndexedFilter {\r\n    constructor(index_) {\r\n        this.index_ = index_;\r\n    }\r\n    updateChild(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        const 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(changeChildRemoved(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(changeChildAdded(key, newChild));\r\n            }\r\n            else {\r\n                optChangeAccumulator.trackChildChange(changeChildChanged(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    updateFullNode(oldSnap, newSnap, optChangeAccumulator) {\r\n        if (optChangeAccumulator != null) {\r\n            if (!oldSnap.isLeafNode()) {\r\n                oldSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\r\n                    if (!newSnap.hasChild(key)) {\r\n                        optChangeAccumulator.trackChildChange(changeChildRemoved(key, childNode));\r\n                    }\r\n                });\r\n            }\r\n            if (!newSnap.isLeafNode()) {\r\n                newSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\r\n                    if (oldSnap.hasChild(key)) {\r\n                        const oldChild = oldSnap.getImmediateChild(key);\r\n                        if (!oldChild.equals(childNode)) {\r\n                            optChangeAccumulator.trackChildChange(changeChildChanged(key, childNode, oldChild));\r\n                        }\r\n                    }\r\n                    else {\r\n                        optChangeAccumulator.trackChildChange(changeChildAdded(key, childNode));\r\n                    }\r\n                });\r\n            }\r\n        }\r\n        return newSnap.withIndex(this.index_);\r\n    }\r\n    updatePriority(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    filtersNodes() {\r\n        return false;\r\n    }\r\n    getIndexedFilter() {\r\n        return this;\r\n    }\r\n    getIndex() {\r\n        return this.index_;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass RangedFilter {\r\n    constructor(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        this.startIsInclusive_ = !params.startAfterSet_;\r\n        this.endIsInclusive_ = !params.endBeforeSet_;\r\n    }\r\n    getStartPost() {\r\n        return this.startPost_;\r\n    }\r\n    getEndPost() {\r\n        return this.endPost_;\r\n    }\r\n    matches(node) {\r\n        const isWithinStart = this.startIsInclusive_\r\n            ? this.index_.compare(this.getStartPost(), node) <= 0\r\n            : this.index_.compare(this.getStartPost(), node) < 0;\r\n        const isWithinEnd = this.endIsInclusive_\r\n            ? this.index_.compare(node, this.getEndPost()) <= 0\r\n            : this.index_.compare(node, this.getEndPost()) < 0;\r\n        return isWithinStart && isWithinEnd;\r\n    }\r\n    updateChild(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    updateFullNode(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        let filtered = newSnap.withIndex(this.index_);\r\n        // Don't support priorities on queries\r\n        filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\r\n        const self = this;\r\n        newSnap.forEachChild(PRIORITY_INDEX, (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    updatePriority(oldSnap, newPriority) {\r\n        // Don't support priorities on queries\r\n        return oldSnap;\r\n    }\r\n    filtersNodes() {\r\n        return true;\r\n    }\r\n    getIndexedFilter() {\r\n        return this.indexedFilter_;\r\n    }\r\n    getIndex() {\r\n        return this.index_;\r\n    }\r\n    static getStartPost_(params) {\r\n        if (params.hasStart()) {\r\n            const 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    static getEndPost_(params) {\r\n        if (params.hasEnd()) {\r\n            const 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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass LimitedFilter {\r\n    constructor(params) {\r\n        this.withinDirectionalStart = (node) => this.reverse_ ? this.withinEndPost(node) : this.withinStartPost(node);\r\n        this.withinDirectionalEnd = (node) => this.reverse_ ? this.withinStartPost(node) : this.withinEndPost(node);\r\n        this.withinStartPost = (node) => {\r\n            const compareRes = this.index_.compare(this.rangedFilter_.getStartPost(), node);\r\n            return this.startIsInclusive_ ? compareRes <= 0 : compareRes < 0;\r\n        };\r\n        this.withinEndPost = (node) => {\r\n            const compareRes = this.index_.compare(node, this.rangedFilter_.getEndPost());\r\n            return this.endIsInclusive_ ? compareRes <= 0 : compareRes < 0;\r\n        };\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        this.startIsInclusive_ = !params.startAfterSet_;\r\n        this.endIsInclusive_ = !params.endBeforeSet_;\r\n    }\r\n    updateChild(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    updateFullNode(oldSnap, newSnap, optChangeAccumulator) {\r\n        let 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                let iterator;\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                let count = 0;\r\n                while (iterator.hasNext() && count < this.limit_) {\r\n                    const next = iterator.getNext();\r\n                    if (!this.withinDirectionalStart(next)) {\r\n                        // if we have not reached the start, skip to the next element\r\n                        continue;\r\n                    }\r\n                    else if (!this.withinDirectionalEnd(next)) {\r\n                        // if we have reached the end, stop adding elements\r\n                        break;\r\n                    }\r\n                    else {\r\n                        filtered = filtered.updateImmediateChild(next.name, next.node);\r\n                        count++;\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                let iterator;\r\n                if (this.reverse_) {\r\n                    iterator = filtered.getReverseIterator(this.index_);\r\n                }\r\n                else {\r\n                    iterator = filtered.getIterator(this.index_);\r\n                }\r\n                let count = 0;\r\n                while (iterator.hasNext()) {\r\n                    const next = iterator.getNext();\r\n                    const inRange = count < this.limit_ &&\r\n                        this.withinDirectionalStart(next) &&\r\n                        this.withinDirectionalEnd(next);\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    updatePriority(oldSnap, newPriority) {\r\n        // Don't support priorities on queries\r\n        return oldSnap;\r\n    }\r\n    filtersNodes() {\r\n        return true;\r\n    }\r\n    getIndexedFilter() {\r\n        return this.rangedFilter_.getIndexedFilter();\r\n    }\r\n    getIndex() {\r\n        return this.index_;\r\n    }\r\n    fullLimitUpdateChild_(snap, childKey, childSnap, source, changeAccumulator) {\r\n        // TODO: rename all cache stuff etc to general snap terminology\r\n        let cmp;\r\n        if (this.reverse_) {\r\n            const indexCmp = this.index_.getCompare();\r\n            cmp = (a, b) => indexCmp(b, a);\r\n        }\r\n        else {\r\n            cmp = this.index_.getCompare();\r\n        }\r\n        const oldEventCache = snap;\r\n        assert(oldEventCache.numChildren() === this.limit_, '');\r\n        const newChildNamedNode = new NamedNode(childKey, childSnap);\r\n        const windowBoundary = this.reverse_\r\n            ? oldEventCache.getFirstChild(this.index_)\r\n            : oldEventCache.getLastChild(this.index_);\r\n        const inRange = this.rangedFilter_.matches(newChildNamedNode);\r\n        if (oldEventCache.hasChild(childKey)) {\r\n            const oldChildSnap = oldEventCache.getImmediateChild(childKey);\r\n            let 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            const compareNext = nextChild == null ? 1 : cmp(nextChild, newChildNamedNode);\r\n            const remainsInWindow = inRange && !childSnap.isEmpty() && compareNext >= 0;\r\n            if (remainsInWindow) {\r\n                if (changeAccumulator != null) {\r\n                    changeAccumulator.trackChildChange(changeChildChanged(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(changeChildRemoved(childKey, oldChildSnap));\r\n                }\r\n                const newEventCache = oldEventCache.updateImmediateChild(childKey, ChildrenNode.EMPTY_NODE);\r\n                const nextChildInRange = nextChild != null && this.rangedFilter_.matches(nextChild);\r\n                if (nextChildInRange) {\r\n                    if (changeAccumulator != null) {\r\n                        changeAccumulator.trackChildChange(changeChildAdded(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(changeChildRemoved(windowBoundary.name, windowBoundary.node));\r\n                    changeAccumulator.trackChildChange(changeChildAdded(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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 *\r\n * @internal\r\n */\r\nclass QueryParams {\r\n    constructor() {\r\n        this.limitSet_ = false;\r\n        this.startSet_ = false;\r\n        this.startNameSet_ = false;\r\n        this.startAfterSet_ = false; // can only be true if startSet_ is true\r\n        this.endSet_ = false;\r\n        this.endNameSet_ = false;\r\n        this.endBeforeSet_ = false; // can only be true if endSet_ is true\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    hasStart() {\r\n        return this.startSet_;\r\n    }\r\n    /**\r\n     * @returns True if it would return from left.\r\n     */\r\n    isViewFromLeft() {\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_ === \"l\" /* WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT */;\r\n        }\r\n    }\r\n    /**\r\n     * Only valid to call if hasStart() returns true\r\n     */\r\n    getIndexStartValue() {\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     */\r\n    getIndexStartName() {\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    hasEnd() {\r\n        return this.endSet_;\r\n    }\r\n    /**\r\n     * Only valid to call if hasEnd() returns true.\r\n     */\r\n    getIndexEndValue() {\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     */\r\n    getIndexEndName() {\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    hasLimit() {\r\n        return this.limitSet_;\r\n    }\r\n    /**\r\n     * @returns True if a limit has been set and it has been explicitly anchored\r\n     */\r\n    hasAnchoredLimit() {\r\n        return this.limitSet_ && this.viewFrom_ !== '';\r\n    }\r\n    /**\r\n     * Only valid to call if hasLimit() returns true\r\n     */\r\n    getLimit() {\r\n        assert(this.limitSet_, 'Only valid if limit has been set');\r\n        return this.limit_;\r\n    }\r\n    getIndex() {\r\n        return this.index_;\r\n    }\r\n    loadsAllData() {\r\n        return !(this.startSet_ || this.endSet_ || this.limitSet_);\r\n    }\r\n    isDefault() {\r\n        return this.loadsAllData() && this.index_ === PRIORITY_INDEX;\r\n    }\r\n    copy() {\r\n        const copy = new QueryParams();\r\n        copy.limitSet_ = this.limitSet_;\r\n        copy.limit_ = this.limit_;\r\n        copy.startSet_ = this.startSet_;\r\n        copy.startAfterSet_ = this.startAfterSet_;\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.endBeforeSet_ = this.endBeforeSet_;\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\nfunction queryParamsGetNodeFilter(queryParams) {\r\n    if (queryParams.loadsAllData()) {\r\n        return new IndexedFilter(queryParams.getIndex());\r\n    }\r\n    else if (queryParams.hasLimit()) {\r\n        return new LimitedFilter(queryParams);\r\n    }\r\n    else {\r\n        return new RangedFilter(queryParams);\r\n    }\r\n}\r\nfunction queryParamsLimitToFirst(queryParams, newLimit) {\r\n    const newParams = queryParams.copy();\r\n    newParams.limitSet_ = true;\r\n    newParams.limit_ = newLimit;\r\n    newParams.viewFrom_ = \"l\" /* WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT */;\r\n    return newParams;\r\n}\r\nfunction queryParamsLimitToLast(queryParams, newLimit) {\r\n    const newParams = queryParams.copy();\r\n    newParams.limitSet_ = true;\r\n    newParams.limit_ = newLimit;\r\n    newParams.viewFrom_ = \"r\" /* WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_RIGHT */;\r\n    return newParams;\r\n}\r\nfunction queryParamsStartAt(queryParams, indexValue, key) {\r\n    const newParams = queryParams.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\nfunction queryParamsStartAfter(queryParams, indexValue, key) {\r\n    let params;\r\n    if (queryParams.index_ === KEY_INDEX || !!key) {\r\n        params = queryParamsStartAt(queryParams, indexValue, key);\r\n    }\r\n    else {\r\n        params = queryParamsStartAt(queryParams, indexValue, MAX_NAME);\r\n    }\r\n    params.startAfterSet_ = true;\r\n    return params;\r\n}\r\nfunction queryParamsEndAt(queryParams, indexValue, key) {\r\n    const newParams = queryParams.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\nfunction queryParamsEndBefore(queryParams, indexValue, key) {\r\n    let params;\r\n    if (queryParams.index_ === KEY_INDEX || !!key) {\r\n        params = queryParamsEndAt(queryParams, indexValue, key);\r\n    }\r\n    else {\r\n        params = queryParamsEndAt(queryParams, indexValue, MIN_NAME);\r\n    }\r\n    params.endBeforeSet_ = true;\r\n    return params;\r\n}\r\nfunction queryParamsOrderBy(queryParams, index) {\r\n    const newParams = queryParams.copy();\r\n    newParams.index_ = index;\r\n    return newParams;\r\n}\r\n/**\r\n * Returns a set of REST query string parameters representing this query.\r\n *\r\n * @returns query string parameters\r\n */\r\nfunction queryParamsToRestQueryStringParameters(queryParams) {\r\n    const qs = {};\r\n    if (queryParams.isDefault()) {\r\n        return qs;\r\n    }\r\n    let orderBy;\r\n    if (queryParams.index_ === PRIORITY_INDEX) {\r\n        orderBy = \"$priority\" /* REST_QUERY_CONSTANTS.PRIORITY_INDEX */;\r\n    }\r\n    else if (queryParams.index_ === VALUE_INDEX) {\r\n        orderBy = \"$value\" /* REST_QUERY_CONSTANTS.VALUE_INDEX */;\r\n    }\r\n    else if (queryParams.index_ === KEY_INDEX) {\r\n        orderBy = \"$key\" /* REST_QUERY_CONSTANTS.KEY_INDEX */;\r\n    }\r\n    else {\r\n        assert(queryParams.index_ instanceof PathIndex, 'Unrecognized index type!');\r\n        orderBy = queryParams.index_.toString();\r\n    }\r\n    qs[\"orderBy\" /* REST_QUERY_CONSTANTS.ORDER_BY */] = stringify(orderBy);\r\n    if (queryParams.startSet_) {\r\n        const startParam = queryParams.startAfterSet_\r\n            ? \"startAfter\" /* REST_QUERY_CONSTANTS.START_AFTER */\r\n            : \"startAt\" /* REST_QUERY_CONSTANTS.START_AT */;\r\n        qs[startParam] = stringify(queryParams.indexStartValue_);\r\n        if (queryParams.startNameSet_) {\r\n            qs[startParam] += ',' + stringify(queryParams.indexStartName_);\r\n        }\r\n    }\r\n    if (queryParams.endSet_) {\r\n        const endParam = queryParams.endBeforeSet_\r\n            ? \"endBefore\" /* REST_QUERY_CONSTANTS.END_BEFORE */\r\n            : \"endAt\" /* REST_QUERY_CONSTANTS.END_AT */;\r\n        qs[endParam] = stringify(queryParams.indexEndValue_);\r\n        if (queryParams.endNameSet_) {\r\n            qs[endParam] += ',' + stringify(queryParams.indexEndName_);\r\n        }\r\n    }\r\n    if (queryParams.limitSet_) {\r\n        if (queryParams.isViewFromLeft()) {\r\n            qs[\"limitToFirst\" /* REST_QUERY_CONSTANTS.LIMIT_TO_FIRST */] = queryParams.limit_;\r\n        }\r\n        else {\r\n            qs[\"limitToLast\" /* REST_QUERY_CONSTANTS.LIMIT_TO_LAST */] = queryParams.limit_;\r\n        }\r\n    }\r\n    return qs;\r\n}\r\nfunction queryParamsGetQueryObject(queryParams) {\r\n    const obj = {};\r\n    if (queryParams.startSet_) {\r\n        obj[\"sp\" /* WIRE_PROTOCOL_CONSTANTS.INDEX_START_VALUE */] =\r\n            queryParams.indexStartValue_;\r\n        if (queryParams.startNameSet_) {\r\n            obj[\"sn\" /* WIRE_PROTOCOL_CONSTANTS.INDEX_START_NAME */] =\r\n                queryParams.indexStartName_;\r\n        }\r\n        obj[\"sin\" /* WIRE_PROTOCOL_CONSTANTS.INDEX_START_IS_INCLUSIVE */] =\r\n            !queryParams.startAfterSet_;\r\n    }\r\n    if (queryParams.endSet_) {\r\n        obj[\"ep\" /* WIRE_PROTOCOL_CONSTANTS.INDEX_END_VALUE */] = queryParams.indexEndValue_;\r\n        if (queryParams.endNameSet_) {\r\n            obj[\"en\" /* WIRE_PROTOCOL_CONSTANTS.INDEX_END_NAME */] = queryParams.indexEndName_;\r\n        }\r\n        obj[\"ein\" /* WIRE_PROTOCOL_CONSTANTS.INDEX_END_IS_INCLUSIVE */] =\r\n            !queryParams.endBeforeSet_;\r\n    }\r\n    if (queryParams.limitSet_) {\r\n        obj[\"l\" /* WIRE_PROTOCOL_CONSTANTS.LIMIT */] = queryParams.limit_;\r\n        let viewFrom = queryParams.viewFrom_;\r\n        if (viewFrom === '') {\r\n            if (queryParams.isViewFromLeft()) {\r\n                viewFrom = \"l\" /* WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT */;\r\n            }\r\n            else {\r\n                viewFrom = \"r\" /* WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_RIGHT */;\r\n            }\r\n        }\r\n        obj[\"vf\" /* 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 (queryParams.index_ !== PRIORITY_INDEX) {\r\n        obj[\"i\" /* WIRE_PROTOCOL_CONSTANTS.INDEX */] = queryParams.index_.toString();\r\n    }\r\n    return obj;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass ReadonlyRestClient extends ServerActions {\r\n    /**\r\n     * @param repoInfo_ - Data about the namespace we are connecting to\r\n     * @param onDataUpdate_ - A callback for new data from the server\r\n     */\r\n    constructor(repoInfo_, onDataUpdate_, authTokenProvider_, appCheckTokenProvider_) {\r\n        super();\r\n        this.repoInfo_ = repoInfo_;\r\n        this.onDataUpdate_ = onDataUpdate_;\r\n        this.authTokenProvider_ = authTokenProvider_;\r\n        this.appCheckTokenProvider_ = appCheckTokenProvider_;\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        this.listens_ = {};\r\n    }\r\n    reportStats(stats) {\r\n        throw new Error('Method not implemented.');\r\n    }\r\n    static getListenId_(query, tag) {\r\n        if (tag !== undefined) {\r\n            return 'tag$' + tag;\r\n        }\r\n        else {\r\n            assert(query._queryParams.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    listen(query, currentHashFn, tag, onComplete) {\r\n        const 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        const listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n        const thisListen = {};\r\n        this.listens_[listenId] = thisListen;\r\n        const queryStringParameters = queryParamsToRestQueryStringParameters(query._queryParams);\r\n        this.restRequest_(pathString + '.json', queryStringParameters, (error, result) => {\r\n            let data = result;\r\n            if (error === 404) {\r\n                data = null;\r\n                error = null;\r\n            }\r\n            if (error === null) {\r\n                this.onDataUpdate_(pathString, data, /*isMerge=*/ false, tag);\r\n            }\r\n            if (safeGet(this.listens_, listenId) === thisListen) {\r\n                let status;\r\n                if (!error) {\r\n                    status = 'ok';\r\n                }\r\n                else if (error === 401) {\r\n                    status = 'permission_denied';\r\n                }\r\n                else {\r\n                    status = 'rest_error:' + error;\r\n                }\r\n                onComplete(status, null);\r\n            }\r\n        });\r\n    }\r\n    /** @inheritDoc */\r\n    unlisten(query, tag) {\r\n        const listenId = ReadonlyRestClient.getListenId_(query, tag);\r\n        delete this.listens_[listenId];\r\n    }\r\n    get(query) {\r\n        const queryStringParameters = queryParamsToRestQueryStringParameters(query._queryParams);\r\n        const pathString = query._path.toString();\r\n        const deferred = new Deferred();\r\n        this.restRequest_(pathString + '.json', queryStringParameters, (error, result) => {\r\n            let data = result;\r\n            if (error === 404) {\r\n                data = null;\r\n                error = null;\r\n            }\r\n            if (error === null) {\r\n                this.onDataUpdate_(pathString, data, \r\n                /*isMerge=*/ false, \r\n                /*tag=*/ null);\r\n                deferred.resolve(data);\r\n            }\r\n            else {\r\n                deferred.reject(new Error(data));\r\n            }\r\n        });\r\n        return deferred.promise;\r\n    }\r\n    /** @inheritDoc */\r\n    refreshAuthToken(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    restRequest_(pathString, queryStringParameters = {}, callback) {\r\n        queryStringParameters['format'] = 'export';\r\n        return Promise.all([\r\n            this.authTokenProvider_.getToken(/*forceRefresh=*/ false),\r\n            this.appCheckTokenProvider_.getToken(/*forceRefresh=*/ false)\r\n        ]).then(([authToken, appCheckToken]) => {\r\n            if (authToken && authToken.accessToken) {\r\n                queryStringParameters['auth'] = authToken.accessToken;\r\n            }\r\n            if (appCheckToken && appCheckToken.token) {\r\n                queryStringParameters['ac'] = appCheckToken.token;\r\n            }\r\n            const url = (this.repoInfo_.secure ? 'https://' : 'http://') +\r\n                this.repoInfo_.host +\r\n                pathString +\r\n                '?' +\r\n                'ns=' +\r\n                this.repoInfo_.namespace +\r\n                querystring(queryStringParameters);\r\n            this.log_('Sending REST request for ' + url);\r\n            const xhr = new XMLHttpRequest();\r\n            xhr.onreadystatechange = () => {\r\n                if (callback && xhr.readyState === 4) {\r\n                    this.log_('REST Response for ' + url + ' received. status:', xhr.status, 'response:', xhr.responseText);\r\n                    let 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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass SnapshotHolder {\r\n    constructor() {\r\n        this.rootNode_ = ChildrenNode.EMPTY_NODE;\r\n    }\r\n    getNode(path) {\r\n        return this.rootNode_.getChild(path);\r\n    }\r\n    updateSnapshot(path, newSnapshotNode) {\r\n        this.rootNode_ = this.rootNode_.updateChild(path, newSnapshotNode);\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 newSparseSnapshotTree() {\r\n    return {\r\n        value: null,\r\n        children: new Map()\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 to look up snapshot for.\r\n * @param data - The new data, or null.\r\n */\r\nfunction sparseSnapshotTreeRemember(sparseSnapshotTree, path, data) {\r\n    if (pathIsEmpty(path)) {\r\n        sparseSnapshotTree.value = data;\r\n        sparseSnapshotTree.children.clear();\r\n    }\r\n    else if (sparseSnapshotTree.value !== null) {\r\n        sparseSnapshotTree.value = sparseSnapshotTree.value.updateChild(path, data);\r\n    }\r\n    else {\r\n        const childKey = pathGetFront(path);\r\n        if (!sparseSnapshotTree.children.has(childKey)) {\r\n            sparseSnapshotTree.children.set(childKey, newSparseSnapshotTree());\r\n        }\r\n        const child = sparseSnapshotTree.children.get(childKey);\r\n        path = pathPopFront(path);\r\n        sparseSnapshotTreeRemember(child, 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 to look up snapshot for.\r\n * @returns True if this node should now be removed.\r\n */\r\nfunction sparseSnapshotTreeForget(sparseSnapshotTree, path) {\r\n    if (pathIsEmpty(path)) {\r\n        sparseSnapshotTree.value = null;\r\n        sparseSnapshotTree.children.clear();\r\n        return true;\r\n    }\r\n    else {\r\n        if (sparseSnapshotTree.value !== null) {\r\n            if (sparseSnapshotTree.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                const value = sparseSnapshotTree.value;\r\n                sparseSnapshotTree.value = null;\r\n                value.forEachChild(PRIORITY_INDEX, (key, tree) => {\r\n                    sparseSnapshotTreeRemember(sparseSnapshotTree, new Path(key), tree);\r\n                });\r\n                return sparseSnapshotTreeForget(sparseSnapshotTree, path);\r\n            }\r\n        }\r\n        else if (sparseSnapshotTree.children.size > 0) {\r\n            const childKey = pathGetFront(path);\r\n            path = pathPopFront(path);\r\n            if (sparseSnapshotTree.children.has(childKey)) {\r\n                const safeToRemove = sparseSnapshotTreeForget(sparseSnapshotTree.children.get(childKey), path);\r\n                if (safeToRemove) {\r\n                    sparseSnapshotTree.children.delete(childKey);\r\n                }\r\n            }\r\n            return sparseSnapshotTree.children.size === 0;\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 prefixPath - Path to look up node for.\r\n * @param func - The function to invoke for each tree.\r\n */\r\nfunction sparseSnapshotTreeForEachTree(sparseSnapshotTree, prefixPath, func) {\r\n    if (sparseSnapshotTree.value !== null) {\r\n        func(prefixPath, sparseSnapshotTree.value);\r\n    }\r\n    else {\r\n        sparseSnapshotTreeForEachChild(sparseSnapshotTree, (key, tree) => {\r\n            const path = new Path(prefixPath.toString() + '/' + key);\r\n            sparseSnapshotTreeForEachTree(tree, path, func);\r\n        });\r\n    }\r\n}\r\n/**\r\n * Iterates through each immediate child and triggers the callback.\r\n * Only seems to be used in tests.\r\n *\r\n * @param func - The function to invoke for each child.\r\n */\r\nfunction sparseSnapshotTreeForEachChild(sparseSnapshotTree, func) {\r\n    sparseSnapshotTree.children.forEach((tree, key) => {\r\n        func(key, tree);\r\n    });\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass StatsListener {\r\n    constructor(collection_) {\r\n        this.collection_ = collection_;\r\n        this.last_ = null;\r\n    }\r\n    get() {\r\n        const newStats = this.collection_.get();\r\n        const delta = Object.assign({}, newStats);\r\n        if (this.last_) {\r\n            each(this.last_, (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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst FIRST_STATS_MIN_TIME = 10 * 1000;\r\nconst FIRST_STATS_MAX_TIME = 30 * 1000;\r\n// We'll continue to report stats on average every 5 minutes.\r\nconst REPORT_STATS_INTERVAL = 5 * 60 * 1000;\r\nclass StatsReporter {\r\n    constructor(collection, server_) {\r\n        this.server_ = server_;\r\n        this.statsToReport_ = {};\r\n        this.statsListener_ = new StatsListener(collection);\r\n        const 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    reportStats_() {\r\n        const stats = this.statsListener_.get();\r\n        const reportedStats = {};\r\n        let haveStatsToReport = false;\r\n        each(stats, (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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nfunction newOperationSourceUser() {\r\n    return {\r\n        fromUser: true,\r\n        fromServer: false,\r\n        queryId: null,\r\n        tagged: false\r\n    };\r\n}\r\nfunction newOperationSourceServer() {\r\n    return {\r\n        fromUser: false,\r\n        fromServer: true,\r\n        queryId: null,\r\n        tagged: false\r\n    };\r\n}\r\nfunction newOperationSourceServerTaggedQuery(queryId) {\r\n    return {\r\n        fromUser: false,\r\n        fromServer: true,\r\n        queryId,\r\n        tagged: true\r\n    };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass AckUserWrite {\r\n    /**\r\n     * @param affectedTree - A tree containing true for each affected path. Affected paths can't overlap.\r\n     */\r\n    constructor(\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 = newOperationSourceUser();\r\n    }\r\n    operationForChild(childName) {\r\n        if (!pathIsEmpty(this.path)) {\r\n            assert(pathGetFront(this.path) === childName, 'operationForChild called for unrelated child.');\r\n            return new AckUserWrite(pathPopFront(this.path), 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            const childTree = this.affectedTree.subtree(new Path(childName));\r\n            return new AckUserWrite(newEmptyPath(), childTree, this.revert);\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass ListenComplete {\r\n    constructor(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    operationForChild(childName) {\r\n        if (pathIsEmpty(this.path)) {\r\n            return new ListenComplete(this.source, newEmptyPath());\r\n        }\r\n        else {\r\n            return new ListenComplete(this.source, pathPopFront(this.path));\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass Overwrite {\r\n    constructor(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    operationForChild(childName) {\r\n        if (pathIsEmpty(this.path)) {\r\n            return new Overwrite(this.source, newEmptyPath(), this.snap.getImmediateChild(childName));\r\n        }\r\n        else {\r\n            return new Overwrite(this.source, pathPopFront(this.path), this.snap);\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass Merge {\r\n    constructor(\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    operationForChild(childName) {\r\n        if (pathIsEmpty(this.path)) {\r\n            const 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, newEmptyPath(), childTree.value);\r\n            }\r\n            else {\r\n                // This is a merge at a deeper level\r\n                return new Merge(this.source, newEmptyPath(), childTree);\r\n            }\r\n        }\r\n        else {\r\n            assert(pathGetFront(this.path) === childName, \"Can't get a merge for a child not on the path of the operation\");\r\n            return new Merge(this.source, pathPopFront(this.path), this.children);\r\n        }\r\n    }\r\n    toString() {\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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass CacheNode {\r\n    constructor(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     */\r\n    isFullyInitialized() {\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     */\r\n    isFiltered() {\r\n        return this.filtered_;\r\n    }\r\n    isCompleteForPath(path) {\r\n        if (pathIsEmpty(path)) {\r\n            return this.isFullyInitialized() && !this.filtered_;\r\n        }\r\n        const childKey = pathGetFront(path);\r\n        return this.isCompleteForChild(childKey);\r\n    }\r\n    isCompleteForChild(key) {\r\n        return ((this.isFullyInitialized() && !this.filtered_) || this.node_.hasChild(key));\r\n    }\r\n    getNode() {\r\n        return this.node_;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass EventGenerator {\r\n    constructor(query_) {\r\n        this.query_ = query_;\r\n        this.index_ = this.query_._queryParams.getIndex();\r\n    }\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\nfunction eventGeneratorGenerateEventsForChanges(eventGenerator, changes, eventCache, eventRegistrations) {\r\n    const events = [];\r\n    const moves = [];\r\n    changes.forEach(change => {\r\n        if (change.type === \"child_changed\" /* ChangeType.CHILD_CHANGED */ &&\r\n            eventGenerator.index_.indexedValueChanged(change.oldSnap, change.snapshotNode)) {\r\n            moves.push(changeChildMoved(change.childName, change.snapshotNode));\r\n        }\r\n    });\r\n    eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_removed\" /* ChangeType.CHILD_REMOVED */, changes, eventRegistrations, eventCache);\r\n    eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_added\" /* ChangeType.CHILD_ADDED */, changes, eventRegistrations, eventCache);\r\n    eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_moved\" /* ChangeType.CHILD_MOVED */, moves, eventRegistrations, eventCache);\r\n    eventGeneratorGenerateEventsForType(eventGenerator, events, \"child_changed\" /* ChangeType.CHILD_CHANGED */, changes, eventRegistrations, eventCache);\r\n    eventGeneratorGenerateEventsForType(eventGenerator, events, \"value\" /* ChangeType.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\nfunction eventGeneratorGenerateEventsForType(eventGenerator, events, eventType, changes, registrations, eventCache) {\r\n    const filteredChanges = changes.filter(change => change.type === eventType);\r\n    filteredChanges.sort((a, b) => eventGeneratorCompareChanges(eventGenerator, a, b));\r\n    filteredChanges.forEach(change => {\r\n        const materializedChange = eventGeneratorMaterializeSingleChange(eventGenerator, change, eventCache);\r\n        registrations.forEach(registration => {\r\n            if (registration.respondsTo(change.type)) {\r\n                events.push(registration.createEvent(materializedChange, eventGenerator.query_));\r\n            }\r\n        });\r\n    });\r\n}\r\nfunction eventGeneratorMaterializeSingleChange(eventGenerator, 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(change.childName, change.snapshotNode, eventGenerator.index_);\r\n        return change;\r\n    }\r\n}\r\nfunction eventGeneratorCompareChanges(eventGenerator, a, b) {\r\n    if (a.childName == null || b.childName == null) {\r\n        throw assertionError('Should only compare child_ events.');\r\n    }\r\n    const aWrapped = new NamedNode(a.childName, a.snapshotNode);\r\n    const bWrapped = new NamedNode(b.childName, b.snapshotNode);\r\n    return eventGenerator.index_.compare(aWrapped, bWrapped);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 newViewCache(eventCache, serverCache) {\r\n    return { eventCache, serverCache };\r\n}\r\nfunction viewCacheUpdateEventSnap(viewCache, eventSnap, complete, filtered) {\r\n    return newViewCache(new CacheNode(eventSnap, complete, filtered), viewCache.serverCache);\r\n}\r\nfunction viewCacheUpdateServerSnap(viewCache, serverSnap, complete, filtered) {\r\n    return newViewCache(viewCache.eventCache, new CacheNode(serverSnap, complete, filtered));\r\n}\r\nfunction viewCacheGetCompleteEventSnap(viewCache) {\r\n    return viewCache.eventCache.isFullyInitialized()\r\n        ? viewCache.eventCache.getNode()\r\n        : null;\r\n}\r\nfunction viewCacheGetCompleteServerSnap(viewCache) {\r\n    return viewCache.serverCache.isFullyInitialized()\r\n        ? viewCache.serverCache.getNode()\r\n        : null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet emptyChildrenSingleton;\r\n/**\r\n * Singleton empty children collection.\r\n *\r\n */\r\nconst EmptyChildren = () => {\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\nclass ImmutableTree {\r\n    constructor(value, children = EmptyChildren()) {\r\n        this.value = value;\r\n        this.children = children;\r\n    }\r\n    static fromObject(obj) {\r\n        let tree = new ImmutableTree(null);\r\n        each(obj, (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     */\r\n    isEmpty() {\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:}`\r\n     * objects on the way back out, it may be better to pass down a pathSoFar obj.\r\n     *\r\n     * @param relativePath - The remainder of the path\r\n     * @param predicate - The predicate to satisfy to return a node\r\n     */\r\n    findRootMostMatchingPathAndValue(relativePath, predicate) {\r\n        if (this.value != null && predicate(this.value)) {\r\n            return { path: newEmptyPath(), value: this.value };\r\n        }\r\n        else {\r\n            if (pathIsEmpty(relativePath)) {\r\n                return null;\r\n            }\r\n            else {\r\n                const front = pathGetFront(relativePath);\r\n                const child = this.children.get(front);\r\n                if (child !== null) {\r\n                    const childExistingPathAndValue = child.findRootMostMatchingPathAndValue(pathPopFront(relativePath), predicate);\r\n                    if (childExistingPathAndValue != null) {\r\n                        const fullPath = pathChild(new Path(front), 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     */\r\n    findRootMostValueAndPath(relativePath) {\r\n        return this.findRootMostMatchingPathAndValue(relativePath, () => true);\r\n    }\r\n    /**\r\n     * @returns The subtree at the given path\r\n     */\r\n    subtree(relativePath) {\r\n        if (pathIsEmpty(relativePath)) {\r\n            return this;\r\n        }\r\n        else {\r\n            const front = pathGetFront(relativePath);\r\n            const childTree = this.children.get(front);\r\n            if (childTree !== null) {\r\n                return childTree.subtree(pathPopFront(relativePath));\r\n            }\r\n            else {\r\n                return new ImmutableTree(null);\r\n            }\r\n        }\r\n    }\r\n    /**\r\n     * Sets a value at the specified path.\r\n     *\r\n     * @param relativePath - Path to set value at.\r\n     * @param toSet - Value to set.\r\n     * @returns Resulting tree.\r\n     */\r\n    set(relativePath, toSet) {\r\n        if (pathIsEmpty(relativePath)) {\r\n            return new ImmutableTree(toSet, this.children);\r\n        }\r\n        else {\r\n            const front = pathGetFront(relativePath);\r\n            const child = this.children.get(front) || new ImmutableTree(null);\r\n            const newChild = child.set(pathPopFront(relativePath), toSet);\r\n            const 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 relativePath - Path to value to remove.\r\n     * @returns Resulting tree.\r\n     */\r\n    remove(relativePath) {\r\n        if (pathIsEmpty(relativePath)) {\r\n            if (this.children.isEmpty()) {\r\n                return new ImmutableTree(null);\r\n            }\r\n            else {\r\n                return new ImmutableTree(null, this.children);\r\n            }\r\n        }\r\n        else {\r\n            const front = pathGetFront(relativePath);\r\n            const child = this.children.get(front);\r\n            if (child) {\r\n                const newChild = child.remove(pathPopFront(relativePath));\r\n                let newChildren;\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 new ImmutableTree(null);\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 relativePath - Path to get value for.\r\n     * @returns Value at path, or null.\r\n     */\r\n    get(relativePath) {\r\n        if (pathIsEmpty(relativePath)) {\r\n            return this.value;\r\n        }\r\n        else {\r\n            const front = pathGetFront(relativePath);\r\n            const child = this.children.get(front);\r\n            if (child) {\r\n                return child.get(pathPopFront(relativePath));\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 relativePath - Path to replace subtree for.\r\n     * @param newTree - New tree.\r\n     * @returns Resulting tree.\r\n     */\r\n    setTree(relativePath, newTree) {\r\n        if (pathIsEmpty(relativePath)) {\r\n            return newTree;\r\n        }\r\n        else {\r\n            const front = pathGetFront(relativePath);\r\n            const child = this.children.get(front) || new ImmutableTree(null);\r\n            const newChild = child.setTree(pathPopFront(relativePath), newTree);\r\n            let newChildren;\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     */\r\n    fold(fn) {\r\n        return this.fold_(newEmptyPath(), fn);\r\n    }\r\n    /**\r\n     * Recursive helper for public-facing fold() method\r\n     */\r\n    fold_(pathSoFar, fn) {\r\n        const accum = {};\r\n        this.children.inorderTraversal((childKey, childTree) => {\r\n            accum[childKey] = childTree.fold_(pathChild(pathSoFar, 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     */\r\n    findOnPath(path, f) {\r\n        return this.findOnPath_(path, newEmptyPath(), f);\r\n    }\r\n    findOnPath_(pathToFollow, pathSoFar, f) {\r\n        const result = this.value ? f(pathSoFar, this.value) : false;\r\n        if (result) {\r\n            return result;\r\n        }\r\n        else {\r\n            if (pathIsEmpty(pathToFollow)) {\r\n                return null;\r\n            }\r\n            else {\r\n                const front = pathGetFront(pathToFollow);\r\n                const nextChild = this.children.get(front);\r\n                if (nextChild) {\r\n                    return nextChild.findOnPath_(pathPopFront(pathToFollow), pathChild(pathSoFar, front), f);\r\n                }\r\n                else {\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    foreachOnPath(path, f) {\r\n        return this.foreachOnPath_(path, newEmptyPath(), f);\r\n    }\r\n    foreachOnPath_(pathToFollow, currentRelativePath, f) {\r\n        if (pathIsEmpty(pathToFollow)) {\r\n            return this;\r\n        }\r\n        else {\r\n            if (this.value) {\r\n                f(currentRelativePath, this.value);\r\n            }\r\n            const front = pathGetFront(pathToFollow);\r\n            const nextChild = this.children.get(front);\r\n            if (nextChild) {\r\n                return nextChild.foreachOnPath_(pathPopFront(pathToFollow), pathChild(currentRelativePath, front), f);\r\n            }\r\n            else {\r\n                return new ImmutableTree(null);\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 f - A function to be called with the path from the root of the tree to\r\n     * a node, and the value at that node. Called in depth-first order.\r\n     */\r\n    foreach(f) {\r\n        this.foreach_(newEmptyPath(), f);\r\n    }\r\n    foreach_(currentRelativePath, f) {\r\n        this.children.inorderTraversal((childName, childTree) => {\r\n            childTree.foreach_(pathChild(currentRelativePath, childName), f);\r\n        });\r\n        if (this.value) {\r\n            f(currentRelativePath, this.value);\r\n        }\r\n    }\r\n    foreachChild(f) {\r\n        this.children.inorderTraversal((childName, childTree) => {\r\n            if (childTree.value) {\r\n                f(childName, childTree.value);\r\n            }\r\n        });\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass CompoundWrite {\r\n    constructor(writeTree_) {\r\n        this.writeTree_ = writeTree_;\r\n    }\r\n    static empty() {\r\n        return new CompoundWrite(new ImmutableTree(null));\r\n    }\r\n}\r\nfunction compoundWriteAddWrite(compoundWrite, path, node) {\r\n    if (pathIsEmpty(path)) {\r\n        return new CompoundWrite(new ImmutableTree(node));\r\n    }\r\n    else {\r\n        const rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\r\n        if (rootmost != null) {\r\n            const rootMostPath = rootmost.path;\r\n            let value = rootmost.value;\r\n            const relativePath = newRelativePath(rootMostPath, path);\r\n            value = value.updateChild(relativePath, node);\r\n            return new CompoundWrite(compoundWrite.writeTree_.set(rootMostPath, value));\r\n        }\r\n        else {\r\n            const subtree = new ImmutableTree(node);\r\n            const newWriteTree = compoundWrite.writeTree_.setTree(path, subtree);\r\n            return new CompoundWrite(newWriteTree);\r\n        }\r\n    }\r\n}\r\nfunction compoundWriteAddWrites(compoundWrite, path, updates) {\r\n    let newWrite = compoundWrite;\r\n    each(updates, (childKey, node) => {\r\n        newWrite = compoundWriteAddWrite(newWrite, pathChild(path, 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 <em>not</em> 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 compoundWrite - The CompoundWrite to remove.\r\n * @param path - The path at which a write and all deeper writes should be removed\r\n * @returns The new CompoundWrite with the removed path\r\n */\r\nfunction compoundWriteRemoveWrite(compoundWrite, path) {\r\n    if (pathIsEmpty(path)) {\r\n        return CompoundWrite.empty();\r\n    }\r\n    else {\r\n        const newWriteTree = compoundWrite.writeTree_.setTree(path, new ImmutableTree(null));\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 compoundWrite - The CompoundWrite to check.\r\n * @param path - The path to check for\r\n * @returns Whether there is a complete write at that path\r\n */\r\nfunction compoundWriteHasCompleteWrite(compoundWrite, path) {\r\n    return compoundWriteGetCompleteNode(compoundWrite, 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 compoundWrite - The CompoundWrite to get the node from.\r\n * @param path - The path to get a complete write\r\n * @returns The node if complete at that path, or null otherwise.\r\n */\r\nfunction compoundWriteGetCompleteNode(compoundWrite, path) {\r\n    const rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\r\n    if (rootmost != null) {\r\n        return compoundWrite.writeTree_\r\n            .get(rootmost.path)\r\n            .getChild(newRelativePath(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 * @param compoundWrite - The CompoundWrite to get children from.\r\n * @returns A list of all complete children.\r\n */\r\nfunction compoundWriteGetCompleteChildren(compoundWrite) {\r\n    const children = [];\r\n    const node = compoundWrite.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, (childName, childNode) => {\r\n                children.push(new NamedNode(childName, childNode));\r\n            });\r\n        }\r\n    }\r\n    else {\r\n        compoundWrite.writeTree_.children.inorderTraversal((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\nfunction compoundWriteChildCompoundWrite(compoundWrite, path) {\r\n    if (pathIsEmpty(path)) {\r\n        return compoundWrite;\r\n    }\r\n    else {\r\n        const shadowingNode = compoundWriteGetCompleteNode(compoundWrite, path);\r\n        if (shadowingNode != null) {\r\n            return new CompoundWrite(new ImmutableTree(shadowingNode));\r\n        }\r\n        else {\r\n            return new CompoundWrite(compoundWrite.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 * @returns Whether this CompoundWrite is empty\r\n */\r\nfunction compoundWriteIsEmpty(compoundWrite) {\r\n    return compoundWrite.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 - The node to apply this CompoundWrite to\r\n * @returns The node with all writes applied\r\n */\r\nfunction compoundWriteApply(compoundWrite, node) {\r\n    return applySubtreeWrite(newEmptyPath(), compoundWrite.writeTree_, node);\r\n}\r\nfunction applySubtreeWrite(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        let priorityWrite = null;\r\n        writeTree.children.inorderTraversal((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 = childTree.value;\r\n            }\r\n            else {\r\n                node = applySubtreeWrite(pathChild(relativePath, 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 !== null) {\r\n            node = node.updateChild(pathChild(relativePath, '.priority'), priorityWrite);\r\n        }\r\n        return node;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 * Create a new WriteTreeRef for the given path. For use with a new sync point at the given path.\r\n *\r\n */\r\nfunction writeTreeChildWrites(writeTree, path) {\r\n    return newWriteTreeRef(path, writeTree);\r\n}\r\n/**\r\n * Record a new overwrite from user code.\r\n *\r\n * @param visible - This is set to false by some transactions. It should be excluded from event caches\r\n */\r\nfunction writeTreeAddOverwrite(writeTree, path, snap, writeId, visible) {\r\n    assert(writeId > writeTree.lastWriteId, 'Stacking an older write on top of newer ones');\r\n    if (visible === undefined) {\r\n        visible = true;\r\n    }\r\n    writeTree.allWrites.push({\r\n        path,\r\n        snap,\r\n        writeId,\r\n        visible\r\n    });\r\n    if (visible) {\r\n        writeTree.visibleWrites = compoundWriteAddWrite(writeTree.visibleWrites, path, snap);\r\n    }\r\n    writeTree.lastWriteId = writeId;\r\n}\r\n/**\r\n * Record a new merge from user code.\r\n */\r\nfunction writeTreeAddMerge(writeTree, path, changedChildren, writeId) {\r\n    assert(writeId > writeTree.lastWriteId, 'Stacking an older merge on top of newer ones');\r\n    writeTree.allWrites.push({\r\n        path,\r\n        children: changedChildren,\r\n        writeId,\r\n        visible: true\r\n    });\r\n    writeTree.visibleWrites = compoundWriteAddWrites(writeTree.visibleWrites, path, changedChildren);\r\n    writeTree.lastWriteId = writeId;\r\n}\r\nfunction writeTreeGetWrite(writeTree, writeId) {\r\n    for (let i = 0; i < writeTree.allWrites.length; i++) {\r\n        const record = writeTree.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 * @returns true if the write may have been visible (meaning we'll need to reevaluate / raise\r\n * events as a result).\r\n */\r\nfunction writeTreeRemoveWrite(writeTree, 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    const idx = writeTree.allWrites.findIndex(s => {\r\n        return s.writeId === writeId;\r\n    });\r\n    assert(idx >= 0, 'removeWrite called with nonexistent writeId.');\r\n    const writeToRemove = writeTree.allWrites[idx];\r\n    writeTree.allWrites.splice(idx, 1);\r\n    let removedWriteWasVisible = writeToRemove.visible;\r\n    let removedWriteOverlapsWithOtherWrites = false;\r\n    let i = writeTree.allWrites.length - 1;\r\n    while (removedWriteWasVisible && i >= 0) {\r\n        const currentWrite = writeTree.allWrites[i];\r\n        if (currentWrite.visible) {\r\n            if (i >= idx &&\r\n                writeTreeRecordContainsPath_(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 (pathContains(writeToRemove.path, 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        writeTreeResetTree_(writeTree);\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            writeTree.visibleWrites = compoundWriteRemoveWrite(writeTree.visibleWrites, writeToRemove.path);\r\n        }\r\n        else {\r\n            const children = writeToRemove.children;\r\n            each(children, (childName) => {\r\n                writeTree.visibleWrites = compoundWriteRemoveWrite(writeTree.visibleWrites, pathChild(writeToRemove.path, childName));\r\n            });\r\n        }\r\n        return true;\r\n    }\r\n}\r\nfunction writeTreeRecordContainsPath_(writeRecord, path) {\r\n    if (writeRecord.snap) {\r\n        return pathContains(writeRecord.path, path);\r\n    }\r\n    else {\r\n        for (const childName in writeRecord.children) {\r\n            if (writeRecord.children.hasOwnProperty(childName) &&\r\n                pathContains(pathChild(writeRecord.path, childName), path)) {\r\n                return true;\r\n            }\r\n        }\r\n        return false;\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 */\r\nfunction writeTreeResetTree_(writeTree) {\r\n    writeTree.visibleWrites = writeTreeLayerTree_(writeTree.allWrites, writeTreeDefaultFilter_, newEmptyPath());\r\n    if (writeTree.allWrites.length > 0) {\r\n        writeTree.lastWriteId =\r\n            writeTree.allWrites[writeTree.allWrites.length - 1].writeId;\r\n    }\r\n    else {\r\n        writeTree.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\nfunction writeTreeDefaultFilter_(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\nfunction writeTreeLayerTree_(writes, filter, treeRoot) {\r\n    let compoundWrite = CompoundWrite.empty();\r\n    for (let i = 0; i < writes.length; ++i) {\r\n        const 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            const writePath = write.path;\r\n            let relativePath;\r\n            if (write.snap) {\r\n                if (pathContains(treeRoot, writePath)) {\r\n                    relativePath = newRelativePath(treeRoot, writePath);\r\n                    compoundWrite = compoundWriteAddWrite(compoundWrite, relativePath, write.snap);\r\n                }\r\n                else if (pathContains(writePath, treeRoot)) {\r\n                    relativePath = newRelativePath(writePath, treeRoot);\r\n                    compoundWrite = compoundWriteAddWrite(compoundWrite, newEmptyPath(), write.snap.getChild(relativePath));\r\n                }\r\n                else ;\r\n            }\r\n            else if (write.children) {\r\n                if (pathContains(treeRoot, writePath)) {\r\n                    relativePath = newRelativePath(treeRoot, writePath);\r\n                    compoundWrite = compoundWriteAddWrites(compoundWrite, relativePath, write.children);\r\n                }\r\n                else if (pathContains(writePath, treeRoot)) {\r\n                    relativePath = newRelativePath(writePath, treeRoot);\r\n                    if (pathIsEmpty(relativePath)) {\r\n                        compoundWrite = compoundWriteAddWrites(compoundWrite, newEmptyPath(), write.children);\r\n                    }\r\n                    else {\r\n                        const child = safeGet(write.children, pathGetFront(relativePath));\r\n                        if (child) {\r\n                            // There exists a child in this node that matches the root path\r\n                            const deepNode = child.getChild(pathPopFront(relativePath));\r\n                            compoundWrite = compoundWriteAddWrite(compoundWrite, newEmptyPath(), deepNode);\r\n                        }\r\n                    }\r\n                }\r\n                else ;\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/**\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 writeIdsToExclude - An optional set to be excluded\r\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\r\n */\r\nfunction writeTreeCalcCompleteEventCache(writeTree, treePath, completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n    if (!writeIdsToExclude && !includeHiddenWrites) {\r\n        const shadowingNode = compoundWriteGetCompleteNode(writeTree.visibleWrites, treePath);\r\n        if (shadowingNode != null) {\r\n            return shadowingNode;\r\n        }\r\n        else {\r\n            const subMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n            if (compoundWriteIsEmpty(subMerge)) {\r\n                return completeServerCache;\r\n            }\r\n            else if (completeServerCache == null &&\r\n                !compoundWriteHasCompleteWrite(subMerge, newEmptyPath())) {\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                const layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n                return compoundWriteApply(subMerge, layeredCache);\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        const merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n        if (!includeHiddenWrites && compoundWriteIsEmpty(merge)) {\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                !compoundWriteHasCompleteWrite(merge, newEmptyPath())) {\r\n                return null;\r\n            }\r\n            else {\r\n                const filter = function (write) {\r\n                    return ((write.visible || includeHiddenWrites) &&\r\n                        (!writeIdsToExclude ||\r\n                            !~writeIdsToExclude.indexOf(write.writeId)) &&\r\n                        (pathContains(write.path, treePath) ||\r\n                            pathContains(treePath, write.path)));\r\n                };\r\n                const mergeAtPath = writeTreeLayerTree_(writeTree.allWrites, filter, treePath);\r\n                const layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\r\n                return compoundWriteApply(mergeAtPath, 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\nfunction writeTreeCalcCompleteEventChildren(writeTree, treePath, completeServerChildren) {\r\n    let completeChildren = ChildrenNode.EMPTY_NODE;\r\n    const topLevelSet = compoundWriteGetCompleteNode(writeTree.visibleWrites, 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, (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        const merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n        completeServerChildren.forEachChild(PRIORITY_INDEX, (childName, childNode) => {\r\n            const node = compoundWriteApply(compoundWriteChildCompoundWrite(merge, new Path(childName)), childNode);\r\n            completeChildren = completeChildren.updateImmediateChild(childName, node);\r\n        });\r\n        // Add any complete children we have from the set\r\n        compoundWriteGetCompleteChildren(merge).forEach(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        const merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n        compoundWriteGetCompleteChildren(merge).forEach(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\nfunction writeTreeCalcEventCacheAfterServerOverwrite(writeTree, treePath, childPath, existingEventSnap, existingServerSnap) {\r\n    assert(existingEventSnap || existingServerSnap, 'Either existingEventSnap or existingServerSnap must exist');\r\n    const path = pathChild(treePath, childPath);\r\n    if (compoundWriteHasCompleteWrite(writeTree.visibleWrites, 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        const childMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, path);\r\n        if (compoundWriteIsEmpty(childMerge)) {\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 compoundWriteApply(childMerge, 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\nfunction writeTreeCalcCompleteChild(writeTree, treePath, childKey, existingServerSnap) {\r\n    const path = pathChild(treePath, childKey);\r\n    const shadowingNode = compoundWriteGetCompleteNode(writeTree.visibleWrites, path);\r\n    if (shadowingNode != null) {\r\n        return shadowingNode;\r\n    }\r\n    else {\r\n        if (existingServerSnap.isCompleteForChild(childKey)) {\r\n            const childMerge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, path);\r\n            return compoundWriteApply(childMerge, 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\nfunction writeTreeShadowingWrite(writeTree, path) {\r\n    return compoundWriteGetCompleteNode(writeTree.visibleWrites, 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\nfunction writeTreeCalcIndexedSlice(writeTree, treePath, completeServerData, startPost, count, reverse, index) {\r\n    let toIterate;\r\n    const merge = compoundWriteChildCompoundWrite(writeTree.visibleWrites, treePath);\r\n    const shadowingNode = compoundWriteGetCompleteNode(merge, newEmptyPath());\r\n    if (shadowingNode != null) {\r\n        toIterate = shadowingNode;\r\n    }\r\n    else if (completeServerData != null) {\r\n        toIterate = compoundWriteApply(merge, 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        const nodes = [];\r\n        const cmp = index.getCompare();\r\n        const iter = reverse\r\n            ? toIterate.getReverseIteratorFrom(startPost, index)\r\n            : toIterate.getIteratorFrom(startPost, index);\r\n        let 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\nfunction newWriteTree() {\r\n    return {\r\n        visibleWrites: CompoundWrite.empty(),\r\n        allWrites: [],\r\n        lastWriteId: -1\r\n    };\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 writeIdsToExclude - Optional writes to exclude.\r\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\r\n */\r\nfunction writeTreeRefCalcCompleteEventCache(writeTreeRef, completeServerCache, writeIdsToExclude, includeHiddenWrites) {\r\n    return writeTreeCalcCompleteEventCache(writeTreeRef.writeTree, writeTreeRef.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 */\r\nfunction writeTreeRefCalcCompleteEventChildren(writeTreeRef, completeServerChildren) {\r\n    return writeTreeCalcCompleteEventChildren(writeTreeRef.writeTree, writeTreeRef.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 *\r\n */\r\nfunction writeTreeRefCalcEventCacheAfterServerOverwrite(writeTreeRef, path, existingEventSnap, existingServerSnap) {\r\n    return writeTreeCalcEventCacheAfterServerOverwrite(writeTreeRef.writeTree, writeTreeRef.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 */\r\nfunction writeTreeRefShadowingWrite(writeTreeRef, path) {\r\n    return writeTreeShadowingWrite(writeTreeRef.writeTree, pathChild(writeTreeRef.treePath, 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\nfunction writeTreeRefCalcIndexedSlice(writeTreeRef, completeServerData, startPost, count, reverse, index) {\r\n    return writeTreeCalcIndexedSlice(writeTreeRef.writeTree, writeTreeRef.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\nfunction writeTreeRefCalcCompleteChild(writeTreeRef, childKey, existingServerCache) {\r\n    return writeTreeCalcCompleteChild(writeTreeRef.writeTree, writeTreeRef.treePath, childKey, existingServerCache);\r\n}\r\n/**\r\n * Return a WriteTreeRef for a child.\r\n */\r\nfunction writeTreeRefChild(writeTreeRef, childName) {\r\n    return newWriteTreeRef(pathChild(writeTreeRef.treePath, childName), writeTreeRef.writeTree);\r\n}\r\nfunction newWriteTreeRef(path, writeTree) {\r\n    return {\r\n        treePath: path,\r\n        writeTree\r\n    };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass ChildChangeAccumulator {\r\n    constructor() {\r\n        this.changeMap = new Map();\r\n    }\r\n    trackChildChange(change) {\r\n        const type = change.type;\r\n        const childKey = change.childName;\r\n        assert(type === \"child_added\" /* ChangeType.CHILD_ADDED */ ||\r\n            type === \"child_changed\" /* ChangeType.CHILD_CHANGED */ ||\r\n            type === \"child_removed\" /* ChangeType.CHILD_REMOVED */, 'Only child changes supported for tracking');\r\n        assert(childKey !== '.priority', 'Only non-priority child changes can be tracked.');\r\n        const oldChange = this.changeMap.get(childKey);\r\n        if (oldChange) {\r\n            const oldType = oldChange.type;\r\n            if (type === \"child_added\" /* ChangeType.CHILD_ADDED */ &&\r\n                oldType === \"child_removed\" /* ChangeType.CHILD_REMOVED */) {\r\n                this.changeMap.set(childKey, changeChildChanged(childKey, change.snapshotNode, oldChange.snapshotNode));\r\n            }\r\n            else if (type === \"child_removed\" /* ChangeType.CHILD_REMOVED */ &&\r\n                oldType === \"child_added\" /* ChangeType.CHILD_ADDED */) {\r\n                this.changeMap.delete(childKey);\r\n            }\r\n            else if (type === \"child_removed\" /* ChangeType.CHILD_REMOVED */ &&\r\n                oldType === \"child_changed\" /* ChangeType.CHILD_CHANGED */) {\r\n                this.changeMap.set(childKey, changeChildRemoved(childKey, oldChange.oldSnap));\r\n            }\r\n            else if (type === \"child_changed\" /* ChangeType.CHILD_CHANGED */ &&\r\n                oldType === \"child_added\" /* ChangeType.CHILD_ADDED */) {\r\n                this.changeMap.set(childKey, changeChildAdded(childKey, change.snapshotNode));\r\n            }\r\n            else if (type === \"child_changed\" /* ChangeType.CHILD_CHANGED */ &&\r\n                oldType === \"child_changed\" /* ChangeType.CHILD_CHANGED */) {\r\n                this.changeMap.set(childKey, changeChildChanged(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.set(childKey, change);\r\n        }\r\n    }\r\n    getChanges() {\r\n        return Array.from(this.changeMap.values());\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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// eslint-disable-next-line @typescript-eslint/naming-convention\r\nclass NoCompleteChildSource_ {\r\n    getCompleteChild(childKey) {\r\n        return null;\r\n    }\r\n    getChildAfterChild(index, child, reverse) {\r\n        return null;\r\n    }\r\n}\r\n/**\r\n * Singleton instance.\r\n */\r\nconst 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\nclass WriteTreeCompleteChildSource {\r\n    constructor(writes_, viewCache_, optCompleteServerCache_ = null) {\r\n        this.writes_ = writes_;\r\n        this.viewCache_ = viewCache_;\r\n        this.optCompleteServerCache_ = optCompleteServerCache_;\r\n    }\r\n    getCompleteChild(childKey) {\r\n        const node = this.viewCache_.eventCache;\r\n        if (node.isCompleteForChild(childKey)) {\r\n            return node.getNode().getImmediateChild(childKey);\r\n        }\r\n        else {\r\n            const serverNode = this.optCompleteServerCache_ != null\r\n                ? new CacheNode(this.optCompleteServerCache_, true, false)\r\n                : this.viewCache_.serverCache;\r\n            return writeTreeRefCalcCompleteChild(this.writes_, childKey, serverNode);\r\n        }\r\n    }\r\n    getChildAfterChild(index, child, reverse) {\r\n        const completeServerData = this.optCompleteServerCache_ != null\r\n            ? this.optCompleteServerCache_\r\n            : viewCacheGetCompleteServerSnap(this.viewCache_);\r\n        const nodes = writeTreeRefCalcIndexedSlice(this.writes_, 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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 newViewProcessor(filter) {\r\n    return { filter };\r\n}\r\nfunction viewProcessorAssertIndexed(viewProcessor, viewCache) {\r\n    assert(viewCache.eventCache.getNode().isIndexed(viewProcessor.filter.getIndex()), 'Event snap not indexed');\r\n    assert(viewCache.serverCache.getNode().isIndexed(viewProcessor.filter.getIndex()), 'Server snap not indexed');\r\n}\r\nfunction viewProcessorApplyOperation(viewProcessor, oldViewCache, operation, writesCache, completeCache) {\r\n    const accumulator = new ChildChangeAccumulator();\r\n    let newViewCache, filterServerNode;\r\n    if (operation.type === OperationType.OVERWRITE) {\r\n        const overwrite = operation;\r\n        if (overwrite.source.fromUser) {\r\n            newViewCache = viewProcessorApplyUserOverwrite(viewProcessor, 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.serverCache.isFiltered() && !pathIsEmpty(overwrite.path));\r\n            newViewCache = viewProcessorApplyServerOverwrite(viewProcessor, oldViewCache, overwrite.path, overwrite.snap, writesCache, completeCache, filterServerNode, accumulator);\r\n        }\r\n    }\r\n    else if (operation.type === OperationType.MERGE) {\r\n        const merge = operation;\r\n        if (merge.source.fromUser) {\r\n            newViewCache = viewProcessorApplyUserMerge(viewProcessor, 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.serverCache.isFiltered();\r\n            newViewCache = viewProcessorApplyServerMerge(viewProcessor, 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        const ackUserWrite = operation;\r\n        if (!ackUserWrite.revert) {\r\n            newViewCache = viewProcessorAckUserWrite(viewProcessor, oldViewCache, ackUserWrite.path, ackUserWrite.affectedTree, writesCache, completeCache, accumulator);\r\n        }\r\n        else {\r\n            newViewCache = viewProcessorRevertUserWrite(viewProcessor, oldViewCache, ackUserWrite.path, writesCache, completeCache, accumulator);\r\n        }\r\n    }\r\n    else if (operation.type === OperationType.LISTEN_COMPLETE) {\r\n        newViewCache = viewProcessorListenComplete(viewProcessor, oldViewCache, operation.path, writesCache, accumulator);\r\n    }\r\n    else {\r\n        throw assertionError('Unknown operation type: ' + operation.type);\r\n    }\r\n    const changes = accumulator.getChanges();\r\n    viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, changes);\r\n    return { viewCache: newViewCache, changes };\r\n}\r\nfunction viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, accumulator) {\r\n    const eventSnap = newViewCache.eventCache;\r\n    if (eventSnap.isFullyInitialized()) {\r\n        const isLeafOrEmpty = eventSnap.getNode().isLeafNode() || eventSnap.getNode().isEmpty();\r\n        const oldCompleteSnap = viewCacheGetCompleteEventSnap(oldViewCache);\r\n        if (accumulator.length > 0 ||\r\n            !oldViewCache.eventCache.isFullyInitialized() ||\r\n            (isLeafOrEmpty && !eventSnap.getNode().equals(oldCompleteSnap)) ||\r\n            !eventSnap.getNode().getPriority().equals(oldCompleteSnap.getPriority())) {\r\n            accumulator.push(changeValue(viewCacheGetCompleteEventSnap(newViewCache)));\r\n        }\r\n    }\r\n}\r\nfunction viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, viewCache, changePath, writesCache, source, accumulator) {\r\n    const oldEventSnap = viewCache.eventCache;\r\n    if (writeTreeRefShadowingWrite(writesCache, changePath) != null) {\r\n        // we have a shadowing write, ignore changes\r\n        return viewCache;\r\n    }\r\n    else {\r\n        let newEventCache, serverNode;\r\n        if (pathIsEmpty(changePath)) {\r\n            // TODO: figure out how this plays with \"sliding ack windows\"\r\n            assert(viewCache.serverCache.isFullyInitialized(), 'If change path is empty, we must have complete server data');\r\n            if (viewCache.serverCache.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                const serverCache = viewCacheGetCompleteServerSnap(viewCache);\r\n                const completeChildren = serverCache instanceof ChildrenNode\r\n                    ? serverCache\r\n                    : ChildrenNode.EMPTY_NODE;\r\n                const completeEventChildren = writeTreeRefCalcCompleteEventChildren(writesCache, completeChildren);\r\n                newEventCache = viewProcessor.filter.updateFullNode(viewCache.eventCache.getNode(), completeEventChildren, accumulator);\r\n            }\r\n            else {\r\n                const completeNode = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n                newEventCache = viewProcessor.filter.updateFullNode(viewCache.eventCache.getNode(), completeNode, accumulator);\r\n            }\r\n        }\r\n        else {\r\n            const childKey = pathGetFront(changePath);\r\n            if (childKey === '.priority') {\r\n                assert(pathGetLength(changePath) === 1, \"Can't have a priority with additional path components\");\r\n                const oldEventNode = oldEventSnap.getNode();\r\n                serverNode = viewCache.serverCache.getNode();\r\n                // we might have overwrites for this priority\r\n                const updatedPriority = writeTreeRefCalcEventCacheAfterServerOverwrite(writesCache, changePath, oldEventNode, serverNode);\r\n                if (updatedPriority != null) {\r\n                    newEventCache = viewProcessor.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                const childChangePath = pathPopFront(changePath);\r\n                // update child\r\n                let newEventChild;\r\n                if (oldEventSnap.isCompleteForChild(childKey)) {\r\n                    serverNode = viewCache.serverCache.getNode();\r\n                    const eventChildUpdate = writeTreeRefCalcEventCacheAfterServerOverwrite(writesCache, 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.getNode().getImmediateChild(childKey);\r\n                    }\r\n                }\r\n                else {\r\n                    newEventChild = writeTreeRefCalcCompleteChild(writesCache, childKey, viewCache.serverCache);\r\n                }\r\n                if (newEventChild != null) {\r\n                    newEventCache = viewProcessor.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 viewCacheUpdateEventSnap(viewCache, newEventCache, oldEventSnap.isFullyInitialized() || pathIsEmpty(changePath), viewProcessor.filter.filtersNodes());\r\n    }\r\n}\r\nfunction viewProcessorApplyServerOverwrite(viewProcessor, oldViewCache, changePath, changedSnap, writesCache, completeCache, filterServerNode, accumulator) {\r\n    const oldServerSnap = oldViewCache.serverCache;\r\n    let newServerCache;\r\n    const serverFilter = filterServerNode\r\n        ? viewProcessor.filter\r\n        : viewProcessor.filter.getIndexedFilter();\r\n    if (pathIsEmpty(changePath)) {\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        const 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        const childKey = pathGetFront(changePath);\r\n        if (!oldServerSnap.isCompleteForPath(changePath) &&\r\n            pathGetLength(changePath) > 1) {\r\n            // We don't update incomplete nodes with updates intended for other listeners\r\n            return oldViewCache;\r\n        }\r\n        const childChangePath = pathPopFront(changePath);\r\n        const childNode = oldServerSnap.getNode().getImmediateChild(childKey);\r\n        const 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    const newViewCache = viewCacheUpdateServerSnap(oldViewCache, newServerCache, oldServerSnap.isFullyInitialized() || pathIsEmpty(changePath), serverFilter.filtersNodes());\r\n    const source = new WriteTreeCompleteChildSource(writesCache, newViewCache, completeCache);\r\n    return viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, newViewCache, changePath, writesCache, source, accumulator);\r\n}\r\nfunction viewProcessorApplyUserOverwrite(viewProcessor, oldViewCache, changePath, changedSnap, writesCache, completeCache, accumulator) {\r\n    const oldEventSnap = oldViewCache.eventCache;\r\n    let newViewCache, newEventCache;\r\n    const source = new WriteTreeCompleteChildSource(writesCache, oldViewCache, completeCache);\r\n    if (pathIsEmpty(changePath)) {\r\n        newEventCache = viewProcessor.filter.updateFullNode(oldViewCache.eventCache.getNode(), changedSnap, accumulator);\r\n        newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventCache, true, viewProcessor.filter.filtersNodes());\r\n    }\r\n    else {\r\n        const childKey = pathGetFront(changePath);\r\n        if (childKey === '.priority') {\r\n            newEventCache = viewProcessor.filter.updatePriority(oldViewCache.eventCache.getNode(), changedSnap);\r\n            newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventCache, oldEventSnap.isFullyInitialized(), oldEventSnap.isFiltered());\r\n        }\r\n        else {\r\n            const childChangePath = pathPopFront(changePath);\r\n            const oldChild = oldEventSnap.getNode().getImmediateChild(childKey);\r\n            let newChild;\r\n            if (pathIsEmpty(childChangePath)) {\r\n                // Child overwrite, we can replace the child\r\n                newChild = changedSnap;\r\n            }\r\n            else {\r\n                const childNode = source.getCompleteChild(childKey);\r\n                if (childNode != null) {\r\n                    if (pathGetBack(childChangePath) === '.priority' &&\r\n                        childNode.getChild(pathParent(childChangePath)).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                const newEventSnap = viewProcessor.filter.updateChild(oldEventSnap.getNode(), childKey, newChild, childChangePath, source, accumulator);\r\n                newViewCache = viewCacheUpdateEventSnap(oldViewCache, newEventSnap, oldEventSnap.isFullyInitialized(), viewProcessor.filter.filtersNodes());\r\n            }\r\n            else {\r\n                newViewCache = oldViewCache;\r\n            }\r\n        }\r\n    }\r\n    return newViewCache;\r\n}\r\nfunction viewProcessorCacheHasChild(viewCache, childKey) {\r\n    return viewCache.eventCache.isCompleteForChild(childKey);\r\n}\r\nfunction viewProcessorApplyUserMerge(viewProcessor, viewCache, path, changedChildren, writesCache, serverCache, accumulator) {\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    let curViewCache = viewCache;\r\n    changedChildren.foreach((relativePath, childNode) => {\r\n        const writePath = pathChild(path, relativePath);\r\n        if (viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\r\n            curViewCache = viewProcessorApplyUserOverwrite(viewProcessor, curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n        }\r\n    });\r\n    changedChildren.foreach((relativePath, childNode) => {\r\n        const writePath = pathChild(path, relativePath);\r\n        if (!viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\r\n            curViewCache = viewProcessorApplyUserOverwrite(viewProcessor, curViewCache, writePath, childNode, writesCache, serverCache, accumulator);\r\n        }\r\n    });\r\n    return curViewCache;\r\n}\r\nfunction viewProcessorApplyMerge(viewProcessor, node, merge) {\r\n    merge.foreach((relativePath, childNode) => {\r\n        node = node.updateChild(relativePath, childNode);\r\n    });\r\n    return node;\r\n}\r\nfunction viewProcessorApplyServerMerge(viewProcessor, viewCache, path, changedChildren, writesCache, serverCache, filterServerNode, accumulator) {\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.serverCache.getNode().isEmpty() &&\r\n        !viewCache.serverCache.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    let curViewCache = viewCache;\r\n    let viewMergeTree;\r\n    if (pathIsEmpty(path)) {\r\n        viewMergeTree = changedChildren;\r\n    }\r\n    else {\r\n        viewMergeTree = new ImmutableTree(null).setTree(path, changedChildren);\r\n    }\r\n    const serverNode = viewCache.serverCache.getNode();\r\n    viewMergeTree.children.inorderTraversal((childKey, childTree) => {\r\n        if (serverNode.hasChild(childKey)) {\r\n            const serverChild = viewCache.serverCache\r\n                .getNode()\r\n                .getImmediateChild(childKey);\r\n            const newChild = viewProcessorApplyMerge(viewProcessor, serverChild, childTree);\r\n            curViewCache = viewProcessorApplyServerOverwrite(viewProcessor, curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n        }\r\n    });\r\n    viewMergeTree.children.inorderTraversal((childKey, childMergeTree) => {\r\n        const isUnknownDeepMerge = !viewCache.serverCache.isCompleteForChild(childKey) &&\r\n            childMergeTree.value === null;\r\n        if (!serverNode.hasChild(childKey) && !isUnknownDeepMerge) {\r\n            const serverChild = viewCache.serverCache\r\n                .getNode()\r\n                .getImmediateChild(childKey);\r\n            const newChild = viewProcessorApplyMerge(viewProcessor, serverChild, childMergeTree);\r\n            curViewCache = viewProcessorApplyServerOverwrite(viewProcessor, curViewCache, new Path(childKey), newChild, writesCache, serverCache, filterServerNode, accumulator);\r\n        }\r\n    });\r\n    return curViewCache;\r\n}\r\nfunction viewProcessorAckUserWrite(viewProcessor, viewCache, ackPath, affectedTree, writesCache, completeCache, accumulator) {\r\n    if (writeTreeRefShadowingWrite(writesCache, ackPath) != null) {\r\n        return viewCache;\r\n    }\r\n    // Only filter server node if it is currently filtered\r\n    const filterServerNode = viewCache.serverCache.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    const serverCache = viewCache.serverCache;\r\n    if (affectedTree.value != null) {\r\n        // This is an overwrite.\r\n        if ((pathIsEmpty(ackPath) && serverCache.isFullyInitialized()) ||\r\n            serverCache.isCompleteForPath(ackPath)) {\r\n            return viewProcessorApplyServerOverwrite(viewProcessor, viewCache, ackPath, serverCache.getNode().getChild(ackPath), writesCache, completeCache, filterServerNode, accumulator);\r\n        }\r\n        else if (pathIsEmpty(ackPath)) {\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            let changedChildren = new ImmutableTree(null);\r\n            serverCache.getNode().forEachChild(KEY_INDEX, (name, node) => {\r\n                changedChildren = changedChildren.set(new Path(name), node);\r\n            });\r\n            return viewProcessorApplyServerMerge(viewProcessor, viewCache, ackPath, changedChildren, 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        let changedChildren = new ImmutableTree(null);\r\n        affectedTree.foreach((mergePath, value) => {\r\n            const serverCachePath = pathChild(ackPath, mergePath);\r\n            if (serverCache.isCompleteForPath(serverCachePath)) {\r\n                changedChildren = changedChildren.set(mergePath, serverCache.getNode().getChild(serverCachePath));\r\n            }\r\n        });\r\n        return viewProcessorApplyServerMerge(viewProcessor, viewCache, ackPath, changedChildren, writesCache, completeCache, filterServerNode, accumulator);\r\n    }\r\n}\r\nfunction viewProcessorListenComplete(viewProcessor, viewCache, path, writesCache, accumulator) {\r\n    const oldServerNode = viewCache.serverCache;\r\n    const newViewCache = viewCacheUpdateServerSnap(viewCache, oldServerNode.getNode(), oldServerNode.isFullyInitialized() || pathIsEmpty(path), oldServerNode.isFiltered());\r\n    return viewProcessorGenerateEventCacheAfterServerEvent(viewProcessor, newViewCache, path, writesCache, NO_COMPLETE_CHILD_SOURCE, accumulator);\r\n}\r\nfunction viewProcessorRevertUserWrite(viewProcessor, viewCache, path, writesCache, completeServerCache, accumulator) {\r\n    let complete;\r\n    if (writeTreeRefShadowingWrite(writesCache, path) != null) {\r\n        return viewCache;\r\n    }\r\n    else {\r\n        const source = new WriteTreeCompleteChildSource(writesCache, viewCache, completeServerCache);\r\n        const oldEventCache = viewCache.eventCache.getNode();\r\n        let newEventCache;\r\n        if (pathIsEmpty(path) || pathGetFront(path) === '.priority') {\r\n            let newNode;\r\n            if (viewCache.serverCache.isFullyInitialized()) {\r\n                newNode = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n            }\r\n            else {\r\n                const serverChildren = viewCache.serverCache.getNode();\r\n                assert(serverChildren instanceof ChildrenNode, 'serverChildren would be complete if leaf node');\r\n                newNode = writeTreeRefCalcCompleteEventChildren(writesCache, serverChildren);\r\n            }\r\n            newNode = newNode;\r\n            newEventCache = viewProcessor.filter.updateFullNode(oldEventCache, newNode, accumulator);\r\n        }\r\n        else {\r\n            const childKey = pathGetFront(path);\r\n            let newChild = writeTreeRefCalcCompleteChild(writesCache, childKey, viewCache.serverCache);\r\n            if (newChild == null &&\r\n                viewCache.serverCache.isCompleteForChild(childKey)) {\r\n                newChild = oldEventCache.getImmediateChild(childKey);\r\n            }\r\n            if (newChild != null) {\r\n                newEventCache = viewProcessor.filter.updateChild(oldEventCache, childKey, newChild, pathPopFront(path), source, accumulator);\r\n            }\r\n            else if (viewCache.eventCache.getNode().hasChild(childKey)) {\r\n                // No complete child available, delete the existing one, if any\r\n                newEventCache = viewProcessor.filter.updateChild(oldEventCache, childKey, ChildrenNode.EMPTY_NODE, pathPopFront(path), source, accumulator);\r\n            }\r\n            else {\r\n                newEventCache = oldEventCache;\r\n            }\r\n            if (newEventCache.isEmpty() &&\r\n                viewCache.serverCache.isFullyInitialized()) {\r\n                // We might have reverted all child writes. Maybe the old event was a leaf node\r\n                complete = writeTreeRefCalcCompleteEventCache(writesCache, viewCacheGetCompleteServerSnap(viewCache));\r\n                if (complete.isLeafNode()) {\r\n                    newEventCache = viewProcessor.filter.updateFullNode(newEventCache, complete, accumulator);\r\n                }\r\n            }\r\n        }\r\n        complete =\r\n            viewCache.serverCache.isFullyInitialized() ||\r\n                writeTreeRefShadowingWrite(writesCache, newEmptyPath()) != null;\r\n        return viewCacheUpdateEventSnap(viewCache, newEventCache, complete, viewProcessor.filter.filtersNodes());\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass View {\r\n    constructor(query_, initialViewCache) {\r\n        this.query_ = query_;\r\n        this.eventRegistrations_ = [];\r\n        const params = this.query_._queryParams;\r\n        const indexFilter = new IndexedFilter(params.getIndex());\r\n        const filter = queryParamsGetNodeFilter(params);\r\n        this.processor_ = newViewProcessor(filter);\r\n        const initialServerCache = initialViewCache.serverCache;\r\n        const initialEventCache = initialViewCache.eventCache;\r\n        // Don't filter server node with other filter than index, wait for tagged listen\r\n        const serverSnap = indexFilter.updateFullNode(ChildrenNode.EMPTY_NODE, initialServerCache.getNode(), null);\r\n        const eventSnap = filter.updateFullNode(ChildrenNode.EMPTY_NODE, initialEventCache.getNode(), null);\r\n        const newServerCache = new CacheNode(serverSnap, initialServerCache.isFullyInitialized(), indexFilter.filtersNodes());\r\n        const newEventCache = new CacheNode(eventSnap, initialEventCache.isFullyInitialized(), filter.filtersNodes());\r\n        this.viewCache_ = newViewCache(newEventCache, newServerCache);\r\n        this.eventGenerator_ = new EventGenerator(this.query_);\r\n    }\r\n    get query() {\r\n        return this.query_;\r\n    }\r\n}\r\nfunction viewGetServerCache(view) {\r\n    return view.viewCache_.serverCache.getNode();\r\n}\r\nfunction viewGetCompleteNode(view) {\r\n    return viewCacheGetCompleteEventSnap(view.viewCache_);\r\n}\r\nfunction viewGetCompleteServerCache(view, path) {\r\n    const cache = viewCacheGetCompleteServerSnap(view.viewCache_);\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 (view.query._queryParams.loadsAllData() ||\r\n            (!pathIsEmpty(path) &&\r\n                !cache.getImmediateChild(pathGetFront(path)).isEmpty())) {\r\n            return cache.getChild(path);\r\n        }\r\n    }\r\n    return null;\r\n}\r\nfunction viewIsEmpty(view) {\r\n    return view.eventRegistrations_.length === 0;\r\n}\r\nfunction viewAddEventRegistration(view, eventRegistration) {\r\n    view.eventRegistrations_.push(eventRegistration);\r\n}\r\n/**\r\n * @param eventRegistration - If null, remove all callbacks.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns Cancel events, if cancelError was provided.\r\n */\r\nfunction viewRemoveEventRegistration(view, eventRegistration, cancelError) {\r\n    const cancelEvents = [];\r\n    if (cancelError) {\r\n        assert(eventRegistration == null, 'A cancel should cancel all event registrations.');\r\n        const path = view.query._path;\r\n        view.eventRegistrations_.forEach(registration => {\r\n            const maybeEvent = registration.createCancelEvent(cancelError, path);\r\n            if (maybeEvent) {\r\n                cancelEvents.push(maybeEvent);\r\n            }\r\n        });\r\n    }\r\n    if (eventRegistration) {\r\n        let remaining = [];\r\n        for (let i = 0; i < view.eventRegistrations_.length; ++i) {\r\n            const existing = view.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(view.eventRegistrations_.slice(i + 1));\r\n                break;\r\n            }\r\n        }\r\n        view.eventRegistrations_ = remaining;\r\n    }\r\n    else {\r\n        view.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\nfunction viewApplyOperation(view, operation, writesCache, completeServerCache) {\r\n    if (operation.type === OperationType.MERGE &&\r\n        operation.source.queryId !== null) {\r\n        assert(viewCacheGetCompleteServerSnap(view.viewCache_), 'We should always have a full cache before handling merges');\r\n        assert(viewCacheGetCompleteEventSnap(view.viewCache_), 'Missing event cache, even though we have a server cache');\r\n    }\r\n    const oldViewCache = view.viewCache_;\r\n    const result = viewProcessorApplyOperation(view.processor_, oldViewCache, operation, writesCache, completeServerCache);\r\n    viewProcessorAssertIndexed(view.processor_, result.viewCache);\r\n    assert(result.viewCache.serverCache.isFullyInitialized() ||\r\n        !oldViewCache.serverCache.isFullyInitialized(), 'Once a server snap is complete, it should never go back');\r\n    view.viewCache_ = result.viewCache;\r\n    return viewGenerateEventsForChanges_(view, result.changes, result.viewCache.eventCache.getNode(), null);\r\n}\r\nfunction viewGetInitialEvents(view, registration) {\r\n    const eventSnap = view.viewCache_.eventCache;\r\n    const initialChanges = [];\r\n    if (!eventSnap.getNode().isLeafNode()) {\r\n        const eventNode = eventSnap.getNode();\r\n        eventNode.forEachChild(PRIORITY_INDEX, (key, childNode) => {\r\n            initialChanges.push(changeChildAdded(key, childNode));\r\n        });\r\n    }\r\n    if (eventSnap.isFullyInitialized()) {\r\n        initialChanges.push(changeValue(eventSnap.getNode()));\r\n    }\r\n    return viewGenerateEventsForChanges_(view, initialChanges, eventSnap.getNode(), registration);\r\n}\r\nfunction viewGenerateEventsForChanges_(view, changes, eventCache, eventRegistration) {\r\n    const registrations = eventRegistration\r\n        ? [eventRegistration]\r\n        : view.eventRegistrations_;\r\n    return eventGeneratorGenerateEventsForChanges(view.eventGenerator_, changes, eventCache, registrations);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet 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\nclass SyncPoint {\r\n    constructor() {\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        this.views = new Map();\r\n    }\r\n}\r\nfunction syncPointSetReferenceConstructor(val) {\r\n    assert(!referenceConstructor$1, '__referenceConstructor has already been defined');\r\n    referenceConstructor$1 = val;\r\n}\r\nfunction syncPointGetReferenceConstructor() {\r\n    assert(referenceConstructor$1, 'Reference.ts has not been loaded');\r\n    return referenceConstructor$1;\r\n}\r\nfunction syncPointIsEmpty(syncPoint) {\r\n    return syncPoint.views.size === 0;\r\n}\r\nfunction syncPointApplyOperation(syncPoint, operation, writesCache, optCompleteServerCache) {\r\n    const queryId = operation.source.queryId;\r\n    if (queryId !== null) {\r\n        const view = syncPoint.views.get(queryId);\r\n        assert(view != null, 'SyncTree gave us an op for an invalid query.');\r\n        return viewApplyOperation(view, operation, writesCache, optCompleteServerCache);\r\n    }\r\n    else {\r\n        let events = [];\r\n        for (const view of syncPoint.views.values()) {\r\n            events = events.concat(viewApplyOperation(view, operation, writesCache, optCompleteServerCache));\r\n        }\r\n        return events;\r\n    }\r\n}\r\n/**\r\n * Get a view for the specified query.\r\n *\r\n * @param query - The query to return a view for\r\n * @param writesCache\r\n * @param serverCache\r\n * @param serverCacheComplete\r\n * @returns Events to raise.\r\n */\r\nfunction syncPointGetView(syncPoint, query, writesCache, serverCache, serverCacheComplete) {\r\n    const queryId = query._queryIdentifier;\r\n    const view = syncPoint.views.get(queryId);\r\n    if (!view) {\r\n        // TODO: make writesCache take flag for complete server node\r\n        let eventCache = writeTreeRefCalcCompleteEventCache(writesCache, serverCacheComplete ? serverCache : null);\r\n        let eventCacheComplete = false;\r\n        if (eventCache) {\r\n            eventCacheComplete = true;\r\n        }\r\n        else if (serverCache instanceof ChildrenNode) {\r\n            eventCache = writeTreeRefCalcCompleteEventChildren(writesCache, serverCache);\r\n            eventCacheComplete = false;\r\n        }\r\n        else {\r\n            eventCache = ChildrenNode.EMPTY_NODE;\r\n            eventCacheComplete = false;\r\n        }\r\n        const viewCache = newViewCache(new CacheNode(eventCache, eventCacheComplete, false), new CacheNode(serverCache, serverCacheComplete, false));\r\n        return new View(query, viewCache);\r\n    }\r\n    return view;\r\n}\r\n/**\r\n * Add an event callback for the specified query.\r\n *\r\n * @param query\r\n * @param eventRegistration\r\n * @param writesCache\r\n * @param serverCache - Complete server cache, if we have it.\r\n * @param serverCacheComplete\r\n * @returns Events to raise.\r\n */\r\nfunction syncPointAddEventRegistration(syncPoint, query, eventRegistration, writesCache, serverCache, serverCacheComplete) {\r\n    const view = syncPointGetView(syncPoint, query, writesCache, serverCache, serverCacheComplete);\r\n    if (!syncPoint.views.has(query._queryIdentifier)) {\r\n        syncPoint.views.set(query._queryIdentifier, view);\r\n    }\r\n    // This is guaranteed to exist now, we just created anything that was missing\r\n    viewAddEventRegistration(view, eventRegistration);\r\n    return viewGetInitialEvents(view, 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 eventRegistration - If null, remove all callbacks.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @returns removed queries and any cancel events\r\n */\r\nfunction syncPointRemoveEventRegistration(syncPoint, query, eventRegistration, cancelError) {\r\n    const queryId = query._queryIdentifier;\r\n    const removed = [];\r\n    let cancelEvents = [];\r\n    const hadCompleteView = syncPointHasCompleteView(syncPoint);\r\n    if (queryId === 'default') {\r\n        // When you do ref.off(...), we search all views for the registration to remove.\r\n        for (const [viewQueryId, view] of syncPoint.views.entries()) {\r\n            cancelEvents = cancelEvents.concat(viewRemoveEventRegistration(view, eventRegistration, cancelError));\r\n            if (viewIsEmpty(view)) {\r\n                syncPoint.views.delete(viewQueryId);\r\n                // We'll deal with complete views later.\r\n                if (!view.query._queryParams.loadsAllData()) {\r\n                    removed.push(view.query);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        // remove the callback from the specific view.\r\n        const view = syncPoint.views.get(queryId);\r\n        if (view) {\r\n            cancelEvents = cancelEvents.concat(viewRemoveEventRegistration(view, eventRegistration, cancelError));\r\n            if (viewIsEmpty(view)) {\r\n                syncPoint.views.delete(queryId);\r\n                // We'll deal with complete views later.\r\n                if (!view.query._queryParams.loadsAllData()) {\r\n                    removed.push(view.query);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    if (hadCompleteView && !syncPointHasCompleteView(syncPoint)) {\r\n        // We removed our last complete view.\r\n        removed.push(new (syncPointGetReferenceConstructor())(query._repo, query._path));\r\n    }\r\n    return { removed, events: cancelEvents };\r\n}\r\nfunction syncPointGetQueryViews(syncPoint) {\r\n    const result = [];\r\n    for (const view of syncPoint.views.values()) {\r\n        if (!view.query._queryParams.loadsAllData()) {\r\n            result.push(view);\r\n        }\r\n    }\r\n    return result;\r\n}\r\n/**\r\n * @param path - The path to the desired complete snapshot\r\n * @returns A complete cache, if it exists\r\n */\r\nfunction syncPointGetCompleteServerCache(syncPoint, path) {\r\n    let serverCache = null;\r\n    for (const view of syncPoint.views.values()) {\r\n        serverCache = serverCache || viewGetCompleteServerCache(view, path);\r\n    }\r\n    return serverCache;\r\n}\r\nfunction syncPointViewForQuery(syncPoint, query) {\r\n    const params = query._queryParams;\r\n    if (params.loadsAllData()) {\r\n        return syncPointGetCompleteView(syncPoint);\r\n    }\r\n    else {\r\n        const queryId = query._queryIdentifier;\r\n        return syncPoint.views.get(queryId);\r\n    }\r\n}\r\nfunction syncPointViewExistsForQuery(syncPoint, query) {\r\n    return syncPointViewForQuery(syncPoint, query) != null;\r\n}\r\nfunction syncPointHasCompleteView(syncPoint) {\r\n    return syncPointGetCompleteView(syncPoint) != null;\r\n}\r\nfunction syncPointGetCompleteView(syncPoint) {\r\n    for (const view of syncPoint.views.values()) {\r\n        if (view.query._queryParams.loadsAllData()) {\r\n            return view;\r\n        }\r\n    }\r\n    return null;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nlet referenceConstructor;\r\nfunction syncTreeSetReferenceConstructor(val) {\r\n    assert(!referenceConstructor, '__referenceConstructor has already been defined');\r\n    referenceConstructor = val;\r\n}\r\nfunction syncTreeGetReferenceConstructor() {\r\n    assert(referenceConstructor, 'Reference.ts has not been loaded');\r\n    return referenceConstructor;\r\n}\r\n/**\r\n * Static tracker for next query tag.\r\n */\r\nlet syncTreeNextQueryTag_ = 1;\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 */\r\nclass SyncTree {\r\n    /**\r\n     * @param listenProvider_ - Used by SyncTree to start / stop listening\r\n     *   to server data.\r\n     */\r\n    constructor(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         */\r\n        this.syncPointTree_ = new ImmutableTree(null);\r\n        /**\r\n         * A tree of all pending user writes (user-initiated set()'s, transaction()'s, update()'s, etc.).\r\n         */\r\n        this.pendingWriteTree_ = newWriteTree();\r\n        this.tagToQueryMap = new Map();\r\n        this.queryToTagMap = new Map();\r\n    }\r\n}\r\n/**\r\n * Apply the data changes for a user-generated set() or transaction() call.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyUserOverwrite(syncTree, path, newData, writeId, visible) {\r\n    // Record pending write.\r\n    writeTreeAddOverwrite(syncTree.pendingWriteTree_, path, newData, writeId, visible);\r\n    if (!visible) {\r\n        return [];\r\n    }\r\n    else {\r\n        return syncTreeApplyOperationToSyncPoints_(syncTree, new Overwrite(newOperationSourceUser(), path, newData));\r\n    }\r\n}\r\n/**\r\n * Apply the data from a user-generated update() call\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyUserMerge(syncTree, path, changedChildren, writeId) {\r\n    // Record pending merge.\r\n    writeTreeAddMerge(syncTree.pendingWriteTree_, path, changedChildren, writeId);\r\n    const changeTree = ImmutableTree.fromObject(changedChildren);\r\n    return syncTreeApplyOperationToSyncPoints_(syncTree, new Merge(newOperationSourceUser(), 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 revert - True if the given write failed and needs to be reverted\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeAckUserWrite(syncTree, writeId, revert = false) {\r\n    const write = writeTreeGetWrite(syncTree.pendingWriteTree_, writeId);\r\n    const needToReevaluate = writeTreeRemoveWrite(syncTree.pendingWriteTree_, writeId);\r\n    if (!needToReevaluate) {\r\n        return [];\r\n    }\r\n    else {\r\n        let affectedTree = new ImmutableTree(null);\r\n        if (write.snap != null) {\r\n            // overwrite\r\n            affectedTree = affectedTree.set(newEmptyPath(), true);\r\n        }\r\n        else {\r\n            each(write.children, (pathString) => {\r\n                affectedTree = affectedTree.set(new Path(pathString), true);\r\n            });\r\n        }\r\n        return syncTreeApplyOperationToSyncPoints_(syncTree, new AckUserWrite(write.path, affectedTree, revert));\r\n    }\r\n}\r\n/**\r\n * Apply new server data for the specified path..\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyServerOverwrite(syncTree, path, newData) {\r\n    return syncTreeApplyOperationToSyncPoints_(syncTree, new Overwrite(newOperationSourceServer(), path, newData));\r\n}\r\n/**\r\n * Apply new server data to be merged in at the specified path.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyServerMerge(syncTree, path, changedChildren) {\r\n    const changeTree = ImmutableTree.fromObject(changedChildren);\r\n    return syncTreeApplyOperationToSyncPoints_(syncTree, new Merge(newOperationSourceServer(), path, changeTree));\r\n}\r\n/**\r\n * Apply a listen complete for a query\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyListenComplete(syncTree, path) {\r\n    return syncTreeApplyOperationToSyncPoints_(syncTree, new ListenComplete(newOperationSourceServer(), path));\r\n}\r\n/**\r\n * Apply a listen complete for a tagged query\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedListenComplete(syncTree, path, tag) {\r\n    const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n    if (queryKey) {\r\n        const r = syncTreeParseQueryKey_(queryKey);\r\n        const queryPath = r.path, queryId = r.queryId;\r\n        const relativePath = newRelativePath(queryPath, path);\r\n        const op = new ListenComplete(newOperationSourceServerTaggedQuery(queryId), relativePath);\r\n        return syncTreeApplyTaggedOperation_(syncTree, 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 * 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 eventRegistration - If null, all callbacks are removed.\r\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\r\n * @param skipListenerDedup - When performing a `get()`, we don't add any new listeners, so no\r\n *  deduping needs to take place. This flag allows toggling of that behavior\r\n * @returns Cancel events, if cancelError was provided.\r\n */\r\nfunction syncTreeRemoveEventRegistration(syncTree, query, eventRegistration, cancelError, skipListenerDedup = false) {\r\n    // Find the syncPoint first. Then deal with whether or not it has matching listeners\r\n    const path = query._path;\r\n    const maybeSyncPoint = syncTree.syncPointTree_.get(path);\r\n    let 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            syncPointViewExistsForQuery(maybeSyncPoint, query))) {\r\n        const removedAndEvents = syncPointRemoveEventRegistration(maybeSyncPoint, query, eventRegistration, cancelError);\r\n        if (syncPointIsEmpty(maybeSyncPoint)) {\r\n            syncTree.syncPointTree_ = syncTree.syncPointTree_.remove(path);\r\n        }\r\n        const removed = removedAndEvents.removed;\r\n        cancelEvents = removedAndEvents.events;\r\n        if (!skipListenerDedup) {\r\n            /**\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            const removingDefault = -1 !==\r\n                removed.findIndex(query => {\r\n                    return query._queryParams.loadsAllData();\r\n                });\r\n            const covered = syncTree.syncPointTree_.findOnPath(path, (relativePath, parentSyncPoint) => syncPointHasCompleteView(parentSyncPoint));\r\n            if (removingDefault && !covered) {\r\n                const subtree = syncTree.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                    const newViews = syncTreeCollectDistinctViewsForSubTree_(subtree);\r\n                    // Ok, we've collected all the listens we need. Set them up.\r\n                    for (let i = 0; i < newViews.length; ++i) {\r\n                        const view = newViews[i], newQuery = view.query;\r\n                        const listener = syncTreeCreateListenerForView_(syncTree, view);\r\n                        syncTree.listenProvider_.startListening(syncTreeQueryForListening_(newQuery), syncTreeTagForQuery(syncTree, newQuery), listener.hashFn, listener.onComplete);\r\n                    }\r\n                }\r\n                // Otherwise there's nothing below us, so nothing we need to start listening on\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                    const defaultTag = null;\r\n                    syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(query), defaultTag);\r\n                }\r\n                else {\r\n                    removed.forEach((queryToRemove) => {\r\n                        const tagToRemove = syncTree.queryToTagMap.get(syncTreeMakeQueryKey_(queryToRemove));\r\n                        syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(queryToRemove), tagToRemove);\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        // Now, clear all of the tags we're tracking for the removed listens\r\n        syncTreeRemoveTags_(syncTree, removed);\r\n    }\r\n    return cancelEvents;\r\n}\r\n/**\r\n * Apply new server data for the specified tagged query.\r\n *\r\n * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedQueryOverwrite(syncTree, path, snap, tag) {\r\n    const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n    if (queryKey != null) {\r\n        const r = syncTreeParseQueryKey_(queryKey);\r\n        const queryPath = r.path, queryId = r.queryId;\r\n        const relativePath = newRelativePath(queryPath, path);\r\n        const op = new Overwrite(newOperationSourceServerTaggedQuery(queryId), relativePath, snap);\r\n        return syncTreeApplyTaggedOperation_(syncTree, 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 * @returns Events to raise.\r\n */\r\nfunction syncTreeApplyTaggedQueryMerge(syncTree, path, changedChildren, tag) {\r\n    const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\r\n    if (queryKey) {\r\n        const r = syncTreeParseQueryKey_(queryKey);\r\n        const queryPath = r.path, queryId = r.queryId;\r\n        const relativePath = newRelativePath(queryPath, path);\r\n        const changeTree = ImmutableTree.fromObject(changedChildren);\r\n        const op = new Merge(newOperationSourceServerTaggedQuery(queryId), relativePath, changeTree);\r\n        return syncTreeApplyTaggedOperation_(syncTree, 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 * @returns Events to raise.\r\n */\r\nfunction syncTreeAddEventRegistration(syncTree, query, eventRegistration, skipSetupListener = false) {\r\n    const path = query._path;\r\n    let serverCache = null;\r\n    let 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    syncTree.syncPointTree_.foreachOnPath(path, (pathToSyncPoint, sp) => {\r\n        const relativePath = newRelativePath(pathToSyncPoint, path);\r\n        serverCache =\r\n            serverCache || syncPointGetCompleteServerCache(sp, relativePath);\r\n        foundAncestorDefaultView =\r\n            foundAncestorDefaultView || syncPointHasCompleteView(sp);\r\n    });\r\n    let syncPoint = syncTree.syncPointTree_.get(path);\r\n    if (!syncPoint) {\r\n        syncPoint = new SyncPoint();\r\n        syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\r\n    }\r\n    else {\r\n        foundAncestorDefaultView =\r\n            foundAncestorDefaultView || syncPointHasCompleteView(syncPoint);\r\n        serverCache =\r\n            serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n    }\r\n    let 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        const subtree = syncTree.syncPointTree_.subtree(path);\r\n        subtree.foreachChild((childName, childSyncPoint) => {\r\n            const completeCache = syncPointGetCompleteServerCache(childSyncPoint, newEmptyPath());\r\n            if (completeCache) {\r\n                serverCache = serverCache.updateImmediateChild(childName, completeCache);\r\n            }\r\n        });\r\n    }\r\n    const viewAlreadyExists = syncPointViewExistsForQuery(syncPoint, query);\r\n    if (!viewAlreadyExists && !query._queryParams.loadsAllData()) {\r\n        // We need to track a tag for this query\r\n        const queryKey = syncTreeMakeQueryKey_(query);\r\n        assert(!syncTree.queryToTagMap.has(queryKey), 'View does not exist, but we have a tag');\r\n        const tag = syncTreeGetNextQueryTag_();\r\n        syncTree.queryToTagMap.set(queryKey, tag);\r\n        syncTree.tagToQueryMap.set(tag, queryKey);\r\n    }\r\n    const writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, path);\r\n    let events = syncPointAddEventRegistration(syncPoint, query, eventRegistration, writesCache, serverCache, serverCacheComplete);\r\n    if (!viewAlreadyExists && !foundAncestorDefaultView && !skipSetupListener) {\r\n        const view = syncPointViewForQuery(syncPoint, query);\r\n        events = events.concat(syncTreeSetupListener_(syncTree, query, view));\r\n    }\r\n    return events;\r\n}\r\n/**\r\n * Returns a complete cache, if we have one, of the data at a particular path. If the location does not have a\r\n * listener above it, we will get a false \"null\". This shouldn't be a problem because transactions will always\r\n * have a listener above, and atomic operations would correctly show a jitter of <increment value> ->\r\n *     <incremented total> as the write is applied locally and then acknowledged at the server.\r\n *\r\n * Note: this method will *include* hidden writes from transaction with applyLocally set to false.\r\n *\r\n * @param path - The path to the data we want\r\n * @param writeIdsToExclude - A specific set to be excluded\r\n */\r\nfunction syncTreeCalcCompleteEventCache(syncTree, path, writeIdsToExclude) {\r\n    const includeHiddenSets = true;\r\n    const writeTree = syncTree.pendingWriteTree_;\r\n    const serverCache = syncTree.syncPointTree_.findOnPath(path, (pathSoFar, syncPoint) => {\r\n        const relativePath = newRelativePath(pathSoFar, path);\r\n        const serverCache = syncPointGetCompleteServerCache(syncPoint, relativePath);\r\n        if (serverCache) {\r\n            return serverCache;\r\n        }\r\n    });\r\n    return writeTreeCalcCompleteEventCache(writeTree, path, serverCache, writeIdsToExclude, includeHiddenSets);\r\n}\r\nfunction syncTreeGetServerValue(syncTree, query) {\r\n    const path = query._path;\r\n    let serverCache = null;\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    syncTree.syncPointTree_.foreachOnPath(path, (pathToSyncPoint, sp) => {\r\n        const relativePath = newRelativePath(pathToSyncPoint, path);\r\n        serverCache =\r\n            serverCache || syncPointGetCompleteServerCache(sp, relativePath);\r\n    });\r\n    let syncPoint = syncTree.syncPointTree_.get(path);\r\n    if (!syncPoint) {\r\n        syncPoint = new SyncPoint();\r\n        syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\r\n    }\r\n    else {\r\n        serverCache =\r\n            serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n    }\r\n    const serverCacheComplete = serverCache != null;\r\n    const serverCacheNode = serverCacheComplete\r\n        ? new CacheNode(serverCache, true, false)\r\n        : null;\r\n    const writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, query._path);\r\n    const view = syncPointGetView(syncPoint, query, writesCache, serverCacheComplete ? serverCacheNode.getNode() : ChildrenNode.EMPTY_NODE, serverCacheComplete);\r\n    return viewGetCompleteNode(view);\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 *\r\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 *\r\n * - We concatenate all of the events returned by each SyncPoint and return the result.\r\n */\r\nfunction syncTreeApplyOperationToSyncPoints_(syncTree, operation) {\r\n    return syncTreeApplyOperationHelper_(operation, syncTree.syncPointTree_, \r\n    /*serverCache=*/ null, writeTreeChildWrites(syncTree.pendingWriteTree_, newEmptyPath()));\r\n}\r\n/**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n */\r\nfunction syncTreeApplyOperationHelper_(operation, syncPointTree, serverCache, writesCache) {\r\n    if (pathIsEmpty(operation.path)) {\r\n        return syncTreeApplyOperationDescendantsHelper_(operation, syncPointTree, serverCache, writesCache);\r\n    }\r\n    else {\r\n        const syncPoint = syncPointTree.get(newEmptyPath());\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 = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n        }\r\n        let events = [];\r\n        const childName = pathGetFront(operation.path);\r\n        const childOperation = operation.operationForChild(childName);\r\n        const childTree = syncPointTree.children.get(childName);\r\n        if (childTree && childOperation) {\r\n            const childServerCache = serverCache\r\n                ? serverCache.getImmediateChild(childName)\r\n                : null;\r\n            const childWritesCache = writeTreeRefChild(writesCache, childName);\r\n            events = events.concat(syncTreeApplyOperationHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n        }\r\n        if (syncPoint) {\r\n            events = events.concat(syncPointApplyOperation(syncPoint, operation, writesCache, serverCache));\r\n        }\r\n        return events;\r\n    }\r\n}\r\n/**\r\n * Recursive helper for applyOperationToSyncPoints_\r\n */\r\nfunction syncTreeApplyOperationDescendantsHelper_(operation, syncPointTree, serverCache, writesCache) {\r\n    const syncPoint = syncPointTree.get(newEmptyPath());\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 = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\r\n    }\r\n    let events = [];\r\n    syncPointTree.children.inorderTraversal((childName, childTree) => {\r\n        const childServerCache = serverCache\r\n            ? serverCache.getImmediateChild(childName)\r\n            : null;\r\n        const childWritesCache = writeTreeRefChild(writesCache, childName);\r\n        const childOperation = operation.operationForChild(childName);\r\n        if (childOperation) {\r\n            events = events.concat(syncTreeApplyOperationDescendantsHelper_(childOperation, childTree, childServerCache, childWritesCache));\r\n        }\r\n    });\r\n    if (syncPoint) {\r\n        events = events.concat(syncPointApplyOperation(syncPoint, operation, writesCache, serverCache));\r\n    }\r\n    return events;\r\n}\r\nfunction syncTreeCreateListenerForView_(syncTree, view) {\r\n    const query = view.query;\r\n    const tag = syncTreeTagForQuery(syncTree, query);\r\n    return {\r\n        hashFn: () => {\r\n            const cache = viewGetServerCache(view) || ChildrenNode.EMPTY_NODE;\r\n            return cache.hash();\r\n        },\r\n        onComplete: (status) => {\r\n            if (status === 'ok') {\r\n                if (tag) {\r\n                    return syncTreeApplyTaggedListenComplete(syncTree, query._path, tag);\r\n                }\r\n                else {\r\n                    return syncTreeApplyListenComplete(syncTree, 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                const error = errorForServerCode(status, query);\r\n                return syncTreeRemoveEventRegistration(syncTree, query, \r\n                /*eventRegistration*/ null, error);\r\n            }\r\n        }\r\n    };\r\n}\r\n/**\r\n * Return the tag associated with the given query.\r\n */\r\nfunction syncTreeTagForQuery(syncTree, query) {\r\n    const queryKey = syncTreeMakeQueryKey_(query);\r\n    return syncTree.queryToTagMap.get(queryKey);\r\n}\r\n/**\r\n * Given a query, computes a \"queryKey\" suitable for use in our queryToTagMap_.\r\n */\r\nfunction syncTreeMakeQueryKey_(query) {\r\n    return query._path.toString() + '$' + query._queryIdentifier;\r\n}\r\n/**\r\n * Return the query associated with the given tag, if we have one\r\n */\r\nfunction syncTreeQueryKeyForTag_(syncTree, tag) {\r\n    return syncTree.tagToQueryMap.get(tag);\r\n}\r\n/**\r\n * Given a queryKey (created by makeQueryKey), parse it back into a path and queryId.\r\n */\r\nfunction syncTreeParseQueryKey_(queryKey) {\r\n    const 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 * A helper method to apply tagged operations\r\n */\r\nfunction syncTreeApplyTaggedOperation_(syncTree, queryPath, operation) {\r\n    const syncPoint = syncTree.syncPointTree_.get(queryPath);\r\n    assert(syncPoint, \"Missing sync point for query tag that we're tracking\");\r\n    const writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, queryPath);\r\n    return syncPointApplyOperation(syncPoint, operation, writesCache, null);\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\nfunction syncTreeCollectDistinctViewsForSubTree_(subtree) {\r\n    return subtree.fold((relativePath, maybeChildSyncPoint, childMap) => {\r\n        if (maybeChildSyncPoint && syncPointHasCompleteView(maybeChildSyncPoint)) {\r\n            const completeView = syncPointGetCompleteView(maybeChildSyncPoint);\r\n            return [completeView];\r\n        }\r\n        else {\r\n            // No complete view here, flatten any deeper listens into an array\r\n            let views = [];\r\n            if (maybeChildSyncPoint) {\r\n                views = syncPointGetQueryViews(maybeChildSyncPoint);\r\n            }\r\n            each(childMap, (_key, childViews) => {\r\n                views = views.concat(childViews);\r\n            });\r\n            return views;\r\n        }\r\n    });\r\n}\r\n/**\r\n * Normalizes a query to a query we send the server for listening\r\n *\r\n * @returns The normalized query\r\n */\r\nfunction syncTreeQueryForListening_(query) {\r\n    if (query._queryParams.loadsAllData() && !query._queryParams.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 new (syncTreeGetReferenceConstructor())(query._repo, query._path);\r\n    }\r\n    else {\r\n        return query;\r\n    }\r\n}\r\nfunction syncTreeRemoveTags_(syncTree, queries) {\r\n    for (let j = 0; j < queries.length; ++j) {\r\n        const removedQuery = queries[j];\r\n        if (!removedQuery._queryParams.loadsAllData()) {\r\n            // We should have a tag for this\r\n            const removedQueryKey = syncTreeMakeQueryKey_(removedQuery);\r\n            const removedQueryTag = syncTree.queryToTagMap.get(removedQueryKey);\r\n            syncTree.queryToTagMap.delete(removedQueryKey);\r\n            syncTree.tagToQueryMap.delete(removedQueryTag);\r\n        }\r\n    }\r\n}\r\n/**\r\n * Static accessor for query tags.\r\n */\r\nfunction syncTreeGetNextQueryTag_() {\r\n    return syncTreeNextQueryTag_++;\r\n}\r\n/**\r\n * For a given new listen, manage the de-duplication of outstanding subscriptions.\r\n *\r\n * @returns This method can return events to support synchronous data sources\r\n */\r\nfunction syncTreeSetupListener_(syncTree, query, view) {\r\n    const path = query._path;\r\n    const tag = syncTreeTagForQuery(syncTree, query);\r\n    const listener = syncTreeCreateListenerForView_(syncTree, view);\r\n    const events = syncTree.listenProvider_.startListening(syncTreeQueryForListening_(query), tag, listener.hashFn, listener.onComplete);\r\n    const subtree = syncTree.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(!syncPointHasCompleteView(subtree.value), \"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        const queriesToStop = subtree.fold((relativePath, maybeChildSyncPoint, childMap) => {\r\n            if (!pathIsEmpty(relativePath) &&\r\n                maybeChildSyncPoint &&\r\n                syncPointHasCompleteView(maybeChildSyncPoint)) {\r\n                return [syncPointGetCompleteView(maybeChildSyncPoint).query];\r\n            }\r\n            else {\r\n                // No default listener here, flatten any deeper queries into an array\r\n                let queries = [];\r\n                if (maybeChildSyncPoint) {\r\n                    queries = queries.concat(syncPointGetQueryViews(maybeChildSyncPoint).map(view => view.query));\r\n                }\r\n                each(childMap, (_key, childQueries) => {\r\n                    queries = queries.concat(childQueries);\r\n                });\r\n                return queries;\r\n            }\r\n        });\r\n        for (let i = 0; i < queriesToStop.length; ++i) {\r\n            const queryToStop = queriesToStop[i];\r\n            syncTree.listenProvider_.stopListening(syncTreeQueryForListening_(queryToStop), syncTreeTagForQuery(syncTree, queryToStop));\r\n        }\r\n    }\r\n    return events;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nclass ExistingValueProvider {\r\n    constructor(node_) {\r\n        this.node_ = node_;\r\n    }\r\n    getImmediateChild(childName) {\r\n        const child = this.node_.getImmediateChild(childName);\r\n        return new ExistingValueProvider(child);\r\n    }\r\n    node() {\r\n        return this.node_;\r\n    }\r\n}\r\nclass DeferredValueProvider {\r\n    constructor(syncTree, path) {\r\n        this.syncTree_ = syncTree;\r\n        this.path_ = path;\r\n    }\r\n    getImmediateChild(childName) {\r\n        const childPath = pathChild(this.path_, childName);\r\n        return new DeferredValueProvider(this.syncTree_, childPath);\r\n    }\r\n    node() {\r\n        return syncTreeCalcCompleteEventCache(this.syncTree_, this.path_);\r\n    }\r\n}\r\n/**\r\n * Generate placeholders for deferred values.\r\n */\r\nconst 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 */\r\nconst resolveDeferredLeafValue = function (value, existingVal, serverValues) {\r\n    if (!value || typeof value !== 'object') {\r\n        return value;\r\n    }\r\n    assert('.sv' in value, 'Unexpected leaf node or priority contents');\r\n    if (typeof value['.sv'] === 'string') {\r\n        return resolveScalarDeferredValue(value['.sv'], existingVal, serverValues);\r\n    }\r\n    else if (typeof value['.sv'] === 'object') {\r\n        return resolveComplexDeferredValue(value['.sv'], existingVal);\r\n    }\r\n    else {\r\n        assert(false, 'Unexpected server value: ' + JSON.stringify(value, null, 2));\r\n    }\r\n};\r\nconst resolveScalarDeferredValue = function (op, existing, serverValues) {\r\n    switch (op) {\r\n        case 'timestamp':\r\n            return serverValues['timestamp'];\r\n        default:\r\n            assert(false, 'Unexpected server value: ' + op);\r\n    }\r\n};\r\nconst resolveComplexDeferredValue = function (op, existing, unused) {\r\n    if (!op.hasOwnProperty('increment')) {\r\n        assert(false, 'Unexpected server value: ' + JSON.stringify(op, null, 2));\r\n    }\r\n    const delta = op['increment'];\r\n    if (typeof delta !== 'number') {\r\n        assert(false, 'Unexpected increment value: ' + delta);\r\n    }\r\n    const existingNode = existing.node();\r\n    assert(existingNode !== null && typeof existingNode !== 'undefined', 'Expected ChildrenNode.EMPTY_NODE for nulls');\r\n    // Incrementing a non-number sets the value to the incremented amount\r\n    if (!existingNode.isLeafNode()) {\r\n        return delta;\r\n    }\r\n    const leaf = existingNode;\r\n    const existingVal = leaf.getValue();\r\n    if (typeof existingVal !== 'number') {\r\n        return delta;\r\n    }\r\n    // No need to do over/underflow arithmetic here because JS only handles floats under the covers\r\n    return existingVal + delta;\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 path - path to which write is relative\r\n * @param node - new data written at path\r\n * @param syncTree - current data\r\n */\r\nconst resolveDeferredValueTree = function (path, node, syncTree, serverValues) {\r\n    return resolveDeferredValue(node, new DeferredValueProvider(syncTree, path), serverValues);\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 */\r\nconst resolveDeferredValueSnapshot = function (node, existing, serverValues) {\r\n    return resolveDeferredValue(node, new ExistingValueProvider(existing), serverValues);\r\n};\r\nfunction resolveDeferredValue(node, existingVal, serverValues) {\r\n    const rawPri = node.getPriority().val();\r\n    const priority = resolveDeferredLeafValue(rawPri, existingVal.getImmediateChild('.priority'), serverValues);\r\n    let newNode;\r\n    if (node.isLeafNode()) {\r\n        const leafNode = node;\r\n        const value = resolveDeferredLeafValue(leafNode.getValue(), existingVal, serverValues);\r\n        if (value !== leafNode.getValue() ||\r\n            priority !== leafNode.getPriority().val()) {\r\n            return new LeafNode(value, nodeFromJSON(priority));\r\n        }\r\n        else {\r\n            return node;\r\n        }\r\n    }\r\n    else {\r\n        const 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, (childName, childNode) => {\r\n            const newChildNode = resolveDeferredValue(childNode, existingVal.getImmediateChild(childName), 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 * @license\r\n * Copyright 2017 Google LLC\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 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\nclass Tree {\r\n    /**\r\n     * @param name - Optional name of the node.\r\n     * @param parent - Optional parent node.\r\n     * @param node - Optional node to wrap.\r\n     */\r\n    constructor(name = '', parent = null, node = { children: {}, childCount: 0 }) {\r\n        this.name = name;\r\n        this.parent = parent;\r\n        this.node = node;\r\n    }\r\n}\r\n/**\r\n * Returns a sub-Tree for the given path.\r\n *\r\n * @param pathObj - Path to look up.\r\n * @returns Tree for path.\r\n */\r\nfunction treeSubTree(tree, pathObj) {\r\n    // TODO: Require pathObj to be Path?\r\n    let path = pathObj instanceof Path ? pathObj : new Path(pathObj);\r\n    let child = tree, next = pathGetFront(path);\r\n    while (next !== null) {\r\n        const childNode = safeGet(child.node.children, next) || {\r\n            children: {},\r\n            childCount: 0\r\n        };\r\n        child = new Tree(next, child, childNode);\r\n        path = pathPopFront(path);\r\n        next = pathGetFront(path);\r\n    }\r\n    return child;\r\n}\r\n/**\r\n * Returns the data associated with this tree node.\r\n *\r\n * @returns The data or null if no data exists.\r\n */\r\nfunction treeGetValue(tree) {\r\n    return tree.node.value;\r\n}\r\n/**\r\n * Sets data to this tree node.\r\n *\r\n * @param value - Value to set.\r\n */\r\nfunction treeSetValue(tree, value) {\r\n    tree.node.value = value;\r\n    treeUpdateParents(tree);\r\n}\r\n/**\r\n * @returns Whether the tree has any children.\r\n */\r\nfunction treeHasChildren(tree) {\r\n    return tree.node.childCount > 0;\r\n}\r\n/**\r\n * @returns Whethe rthe tree is empty (no value or children).\r\n */\r\nfunction treeIsEmpty(tree) {\r\n    return treeGetValue(tree) === undefined && !treeHasChildren(tree);\r\n}\r\n/**\r\n * Calls action for each child of this tree node.\r\n *\r\n * @param action - Action to be called for each child.\r\n */\r\nfunction treeForEachChild(tree, action) {\r\n    each(tree.node.children, (child, childTree) => {\r\n        action(new Tree(child, tree, 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 action - Action to be called for each child.\r\n * @param includeSelf - Whether to call action on this node as well. Defaults to\r\n *   false.\r\n * @param childrenFirst - Whether to call action on children before calling it on\r\n *   parent.\r\n */\r\nfunction treeForEachDescendant(tree, action, includeSelf, childrenFirst) {\r\n    if (includeSelf && !childrenFirst) {\r\n        action(tree);\r\n    }\r\n    treeForEachChild(tree, child => {\r\n        treeForEachDescendant(child, action, true, childrenFirst);\r\n    });\r\n    if (includeSelf && childrenFirst) {\r\n        action(tree);\r\n    }\r\n}\r\n/**\r\n * Calls action on each ancestor node.\r\n *\r\n * @param action - Action to be called on each parent; return\r\n *   true to abort.\r\n * @param includeSelf - Whether to call action on this node as well.\r\n * @returns true if the action callback returned true.\r\n */\r\nfunction treeForEachAncestor(tree, action, includeSelf) {\r\n    let node = includeSelf ? tree : tree.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 * @returns The path of this tree node, as a Path.\r\n */\r\nfunction treeGetPath(tree) {\r\n    return new Path(tree.parent === null\r\n        ? tree.name\r\n        : treeGetPath(tree.parent) + '/' + tree.name);\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\nfunction treeUpdateParents(tree) {\r\n    if (tree.parent !== null) {\r\n        treeUpdateChild(tree.parent, tree.name, tree);\r\n    }\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 childName - The name of the child to update.\r\n * @param child - The child to update.\r\n */\r\nfunction treeUpdateChild(tree, childName, child) {\r\n    const childEmpty = treeIsEmpty(child);\r\n    const childExists = contains(tree.node.children, childName);\r\n    if (childEmpty && childExists) {\r\n        delete tree.node.children[childName];\r\n        tree.node.childCount--;\r\n        treeUpdateParents(tree);\r\n    }\r\n    else if (!childEmpty && !childExists) {\r\n        tree.node.children[childName] = child.node;\r\n        tree.node.childCount++;\r\n        treeUpdateParents(tree);\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nconst INVALID_KEY_REGEX_ = /[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * True for invalid Firebase paths.\r\n * Allows '/' in paths.\r\n */\r\nconst INVALID_PATH_REGEX_ = /[\\[\\].#$\\u0000-\\u001F\\u007F]/;\r\n/**\r\n * Maximum number of characters to allow in leaf value\r\n */\r\nconst MAX_LEAF_SIZE_ = 10 * 1024 * 1024;\r\nconst isValidKey = function (key) {\r\n    return (typeof key === 'string' && key.length !== 0 && !INVALID_KEY_REGEX_.test(key));\r\n};\r\nconst isValidPathString = function (pathString) {\r\n    return (typeof pathString === 'string' &&\r\n        pathString.length !== 0 &&\r\n        !INVALID_PATH_REGEX_.test(pathString));\r\n};\r\nconst 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\nconst isValidPriority = function (priority) {\r\n    return (priority === null ||\r\n        typeof priority === 'string' ||\r\n        (typeof priority === 'number' && !isInvalidJSONNumber(priority)) ||\r\n        (priority &&\r\n            typeof priority === 'object' &&\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            contains(priority, '.sv')));\r\n};\r\n/**\r\n * Pre-validate a datum passed as an argument to Firebase function.\r\n */\r\nconst validateFirebaseDataArg = function (fnName, value, path, optional) {\r\n    if (optional && value === undefined) {\r\n        return;\r\n    }\r\n    validateFirebaseData(errorPrefix(fnName, 'value'), value, path);\r\n};\r\n/**\r\n * Validate a data object client-side before sending to server.\r\n */\r\nconst validateFirebaseData = function (errorPrefix, data, path_) {\r\n    const path = path_ instanceof Path ? new ValidationPath(path_, errorPrefix) : path_;\r\n    if (data === undefined) {\r\n        throw new Error(errorPrefix + 'contains undefined ' + validationPathToErrorString(path));\r\n    }\r\n    if (typeof data === 'function') {\r\n        throw new Error(errorPrefix +\r\n            'contains a function ' +\r\n            validationPathToErrorString(path) +\r\n            ' with contents = ' +\r\n            data.toString());\r\n    }\r\n    if (isInvalidJSONNumber(data)) {\r\n        throw new Error(errorPrefix +\r\n            'contains ' +\r\n            data.toString() +\r\n            ' ' +\r\n            validationPathToErrorString(path));\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 +\r\n            'contains a string greater than ' +\r\n            MAX_LEAF_SIZE_ +\r\n            ' utf8 bytes ' +\r\n            validationPathToErrorString(path) +\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        let hasDotValue = false;\r\n        let hasActualChild = false;\r\n        each(data, (key, value) => {\r\n            if (key === '.value') {\r\n                hasDotValue = true;\r\n            }\r\n            else if (key !== '.priority' && key !== '.sv') {\r\n                hasActualChild = true;\r\n                if (!isValidKey(key)) {\r\n                    throw new Error(errorPrefix +\r\n                        ' contains an invalid key (' +\r\n                        key +\r\n                        ') ' +\r\n                        validationPathToErrorString(path) +\r\n                        '.  Keys must be non-empty strings ' +\r\n                        'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"');\r\n                }\r\n            }\r\n            validationPathPush(path, key);\r\n            validateFirebaseData(errorPrefix, value, path);\r\n            validationPathPop(path);\r\n        });\r\n        if (hasDotValue && hasActualChild) {\r\n            throw new Error(errorPrefix +\r\n                ' contains \".value\" child ' +\r\n                validationPathToErrorString(path) +\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\nconst validateFirebaseMergePaths = function (errorPrefix, mergePaths) {\r\n    let i, curPath;\r\n    for (i = 0; i < mergePaths.length; i++) {\r\n        curPath = mergePaths[i];\r\n        const keys = pathSlice(curPath);\r\n        for (let j = 0; j < keys.length; j++) {\r\n            if (keys[j] === '.priority' && j === keys.length - 1) ;\r\n            else if (!isValidKey(keys[j])) {\r\n                throw new Error(errorPrefix +\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(pathCompare);\r\n    let prevPath = null;\r\n    for (i = 0; i < mergePaths.length; i++) {\r\n        curPath = mergePaths[i];\r\n        if (prevPath !== null && pathContains(prevPath, curPath)) {\r\n            throw new Error(errorPrefix +\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\nconst validateFirebaseMergeDataArg = function (fnName, data, path, optional) {\r\n    if (optional && data === undefined) {\r\n        return;\r\n    }\r\n    const errorPrefix$1 = errorPrefix(fnName, 'values');\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    const mergePaths = [];\r\n    each(data, (key, value) => {\r\n        const curPath = new Path(key);\r\n        validateFirebaseData(errorPrefix$1, value, pathChild(path, curPath));\r\n        if (pathGetBack(curPath) === '.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\nconst validatePriority = function (fnName, priority, optional) {\r\n    if (optional && priority === undefined) {\r\n        return;\r\n    }\r\n    if (isInvalidJSONNumber(priority)) {\r\n        throw new Error(errorPrefix(fnName, 'priority') +\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    }\r\n    // Special case to allow importing data with a .sv.\r\n    if (!isValidPriority(priority)) {\r\n        throw new Error(errorPrefix(fnName, 'priority') +\r\n            'must be a valid Firebase priority ' +\r\n            '(a string, finite number, server value, or null).');\r\n    }\r\n};\r\nconst validateKey = function (fnName, argumentName, key, optional) {\r\n    if (optional && key === undefined) {\r\n        return;\r\n    }\r\n    if (!isValidKey(key)) {\r\n        throw new Error(errorPrefix(fnName, argumentName) +\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\n};\r\n/**\r\n * @internal\r\n */\r\nconst validatePathString = function (fnName, argumentName, pathString, optional) {\r\n    if (optional && pathString === undefined) {\r\n        return;\r\n    }\r\n    if (!isValidPathString(pathString)) {\r\n        throw new Error(errorPrefix(fnName, argumentName) +\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\n};\r\nconst validateRootPathString = function (fnName, argumentName, 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, argumentName, pathString, optional);\r\n};\r\n/**\r\n * @internal\r\n */\r\nconst validateWritablePath = function (fnName, path) {\r\n    if (pathGetFront(path) === '.info') {\r\n        throw new Error(fnName + \" failed = Can't modify data under /.info/\");\r\n    }\r\n};\r\nconst validateUrl = function (fnName, parsedUrl) {\r\n    // TODO = Validate server better.\r\n    const 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, 'url') +\r\n            'must be a valid firebase URL and ' +\r\n            'the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".');\r\n    }\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass EventQueue {\r\n    constructor() {\r\n        this.eventLists_ = [];\r\n        /**\r\n         * Tracks recursion depth of raiseQueuedEvents_, for debugging purposes.\r\n         */\r\n        this.recursionDepth_ = 0;\r\n    }\r\n}\r\n/**\r\n * @param eventDataList - The new events to queue.\r\n */\r\nfunction eventQueueQueueEvents(eventQueue, 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    let currList = null;\r\n    for (let i = 0; i < eventDataList.length; i++) {\r\n        const data = eventDataList[i];\r\n        const path = data.getPath();\r\n        if (currList !== null && !pathEquals(path, currList.path)) {\r\n            eventQueue.eventLists_.push(currList);\r\n            currList = null;\r\n        }\r\n        if (currList === null) {\r\n            currList = { events: [], path };\r\n        }\r\n        currList.events.push(data);\r\n    }\r\n    if (currList) {\r\n        eventQueue.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 - The path to raise events for.\r\n * @param eventDataList - The new events to raise.\r\n */\r\nfunction eventQueueRaiseEventsAtPath(eventQueue, path, eventDataList) {\r\n    eventQueueQueueEvents(eventQueue, eventDataList);\r\n    eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, eventPath => pathEquals(eventPath, path));\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 changedPath - The path to raise events for.\r\n * @param eventDataList - The events to raise\r\n */\r\nfunction eventQueueRaiseEventsForChangedPath(eventQueue, changedPath, eventDataList) {\r\n    eventQueueQueueEvents(eventQueue, eventDataList);\r\n    eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, eventPath => pathContains(eventPath, changedPath) ||\r\n        pathContains(changedPath, eventPath));\r\n}\r\nfunction eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, predicate) {\r\n    eventQueue.recursionDepth_++;\r\n    let sentAll = true;\r\n    for (let i = 0; i < eventQueue.eventLists_.length; i++) {\r\n        const eventList = eventQueue.eventLists_[i];\r\n        if (eventList) {\r\n            const eventPath = eventList.path;\r\n            if (predicate(eventPath)) {\r\n                eventListRaise(eventQueue.eventLists_[i]);\r\n                eventQueue.eventLists_[i] = null;\r\n            }\r\n            else {\r\n                sentAll = false;\r\n            }\r\n        }\r\n    }\r\n    if (sentAll) {\r\n        eventQueue.eventLists_ = [];\r\n    }\r\n    eventQueue.recursionDepth_--;\r\n}\r\n/**\r\n * Iterates through the list and raises each event\r\n */\r\nfunction eventListRaise(eventList) {\r\n    for (let i = 0; i < eventList.events.length; i++) {\r\n        const eventData = eventList.events[i];\r\n        if (eventData !== null) {\r\n            eventList.events[i] = null;\r\n            const 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}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nconst INTERRUPT_REASON = 'repo_interrupt';\r\n/**\r\n * If a transaction does not succeed after 25 retries, we abort it. Among other\r\n * things this ensure that if there's ever a bug causing a mismatch between\r\n * client / server hashes for some data, we won't retry indefinitely.\r\n */\r\nconst MAX_TRANSACTION_RETRIES = 25;\r\n/**\r\n * A connection to a single data repository.\r\n */\r\nclass Repo {\r\n    constructor(repoInfo_, forceRestClient_, authTokenProvider_, appCheckProvider_) {\r\n        this.repoInfo_ = repoInfo_;\r\n        this.forceRestClient_ = forceRestClient_;\r\n        this.authTokenProvider_ = authTokenProvider_;\r\n        this.appCheckProvider_ = appCheckProvider_;\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_ = newSparseSnapshotTree();\r\n        /** Stores queues of outstanding transactions for Firebase locations. */\r\n        this.transactionQueueTree_ = new Tree();\r\n        // TODO: This should be @private but it's used by test_access.js and internal.js\r\n        this.persistentConnection_ = null;\r\n        // This key is intentionally not updated if RepoInfo is later changed or replaced\r\n        this.key = this.repoInfo_.toURLString();\r\n    }\r\n    /**\r\n     * @returns The URL corresponding to the root of this Firebase.\r\n     */\r\n    toString() {\r\n        return ((this.repoInfo_.secure ? 'https://' : 'http://') + this.repoInfo_.host);\r\n    }\r\n}\r\nfunction repoStart(repo, appId, authOverride) {\r\n    repo.stats_ = statsManagerGetCollection(repo.repoInfo_);\r\n    if (repo.forceRestClient_ || beingCrawled()) {\r\n        repo.server_ = new ReadonlyRestClient(repo.repoInfo_, (pathString, data, isMerge, tag) => {\r\n            repoOnDataUpdate(repo, pathString, data, isMerge, tag);\r\n        }, repo.authTokenProvider_, repo.appCheckProvider_);\r\n        // Minor hack: Fire onConnect immediately, since there's no actual connection.\r\n        setTimeout(() => repoOnConnectStatus(repo, /* connectStatus= */ true), 0);\r\n    }\r\n    else {\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        repo.persistentConnection_ = new PersistentConnection(repo.repoInfo_, appId, (pathString, data, isMerge, tag) => {\r\n            repoOnDataUpdate(repo, pathString, data, isMerge, tag);\r\n        }, (connectStatus) => {\r\n            repoOnConnectStatus(repo, connectStatus);\r\n        }, (updates) => {\r\n            repoOnServerInfoUpdate(repo, updates);\r\n        }, repo.authTokenProvider_, repo.appCheckProvider_, authOverride);\r\n        repo.server_ = repo.persistentConnection_;\r\n    }\r\n    repo.authTokenProvider_.addTokenChangeListener(token => {\r\n        repo.server_.refreshAuthToken(token);\r\n    });\r\n    repo.appCheckProvider_.addTokenChangeListener(result => {\r\n        repo.server_.refreshAppCheckToken(result.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    repo.statsReporter_ = statsManagerGetOrCreateReporter(repo.repoInfo_, () => new StatsReporter(repo.stats_, repo.server_));\r\n    // Used for .info.\r\n    repo.infoData_ = new SnapshotHolder();\r\n    repo.infoSyncTree_ = new SyncTree({\r\n        startListening: (query, tag, currentHashFn, onComplete) => {\r\n            let infoEvents = [];\r\n            const node = repo.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 = syncTreeApplyServerOverwrite(repo.infoSyncTree_, query._path, node);\r\n                setTimeout(() => {\r\n                    onComplete('ok');\r\n                }, 0);\r\n            }\r\n            return infoEvents;\r\n        },\r\n        stopListening: () => { }\r\n    });\r\n    repoUpdateInfo(repo, 'connected', false);\r\n    repo.serverSyncTree_ = new SyncTree({\r\n        startListening: (query, tag, currentHashFn, onComplete) => {\r\n            repo.server_.listen(query, currentHashFn, tag, (status, data) => {\r\n                const events = onComplete(status, data);\r\n                eventQueueRaiseEventsForChangedPath(repo.eventQueue_, query._path, events);\r\n            });\r\n            // No synchronous events for network-backed sync trees\r\n            return [];\r\n        },\r\n        stopListening: (query, tag) => {\r\n            repo.server_.unlisten(query, tag);\r\n        }\r\n    });\r\n}\r\n/**\r\n * @returns The time in milliseconds, taking the server offset into account if we have one.\r\n */\r\nfunction repoServerTime(repo) {\r\n    const offsetNode = repo.infoData_.getNode(new Path('.info/serverTimeOffset'));\r\n    const 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 */\r\nfunction repoGenerateServerValues(repo) {\r\n    return generateWithValues({\r\n        timestamp: repoServerTime(repo)\r\n    });\r\n}\r\n/**\r\n * Called by realtime when we get new messages from the server.\r\n */\r\nfunction repoOnDataUpdate(repo, pathString, data, isMerge, tag) {\r\n    // For testing.\r\n    repo.dataUpdateCount++;\r\n    const path = new Path(pathString);\r\n    data = repo.interceptServerDataCallback_\r\n        ? repo.interceptServerDataCallback_(pathString, data)\r\n        : data;\r\n    let events = [];\r\n    if (tag) {\r\n        if (isMerge) {\r\n            const taggedChildren = map(data, (raw) => nodeFromJSON(raw));\r\n            events = syncTreeApplyTaggedQueryMerge(repo.serverSyncTree_, path, taggedChildren, tag);\r\n        }\r\n        else {\r\n            const taggedSnap = nodeFromJSON(data);\r\n            events = syncTreeApplyTaggedQueryOverwrite(repo.serverSyncTree_, path, taggedSnap, tag);\r\n        }\r\n    }\r\n    else if (isMerge) {\r\n        const changedChildren = map(data, (raw) => nodeFromJSON(raw));\r\n        events = syncTreeApplyServerMerge(repo.serverSyncTree_, path, changedChildren);\r\n    }\r\n    else {\r\n        const snap = nodeFromJSON(data);\r\n        events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap);\r\n    }\r\n    let 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 = repoRerunTransactions(repo, path);\r\n    }\r\n    eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, events);\r\n}\r\nfunction repoOnConnectStatus(repo, connectStatus) {\r\n    repoUpdateInfo(repo, 'connected', connectStatus);\r\n    if (connectStatus === false) {\r\n        repoRunOnDisconnectEvents(repo);\r\n    }\r\n}\r\nfunction repoOnServerInfoUpdate(repo, updates) {\r\n    each(updates, (key, value) => {\r\n        repoUpdateInfo(repo, key, value);\r\n    });\r\n}\r\nfunction repoUpdateInfo(repo, pathString, value) {\r\n    const path = new Path('/.info/' + pathString);\r\n    const newNode = nodeFromJSON(value);\r\n    repo.infoData_.updateSnapshot(path, newNode);\r\n    const events = syncTreeApplyServerOverwrite(repo.infoSyncTree_, path, newNode);\r\n    eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n}\r\nfunction repoGetNextWriteId(repo) {\r\n    return repo.nextWriteId_++;\r\n}\r\n/**\r\n * The purpose of `getValue` is to return the latest known value\r\n * satisfying `query`.\r\n *\r\n * This method will first check for in-memory cached values\r\n * belonging to active listeners. If they are found, such values\r\n * are considered to be the most up-to-date.\r\n *\r\n * If the client is not connected, this method will wait until the\r\n *  repo has established a connection and then request the value for `query`.\r\n * If the client is not able to retrieve the query result for another reason,\r\n * it reports an error.\r\n *\r\n * @param query - The query to surface a value for.\r\n */\r\nfunction repoGetValue(repo, query, eventRegistration) {\r\n    // Only active queries are cached. There is no persisted cache.\r\n    const cached = syncTreeGetServerValue(repo.serverSyncTree_, query);\r\n    if (cached != null) {\r\n        return Promise.resolve(cached);\r\n    }\r\n    return repo.server_.get(query).then(payload => {\r\n        const node = nodeFromJSON(payload).withIndex(query._queryParams.getIndex());\r\n        /**\r\n         * Below we simulate the actions of an `onlyOnce` `onValue()` event where:\r\n         * Add an event registration,\r\n         * Update data at the path,\r\n         * Raise any events,\r\n         * Cleanup the SyncTree\r\n         */\r\n        syncTreeAddEventRegistration(repo.serverSyncTree_, query, eventRegistration, true);\r\n        let events;\r\n        if (query._queryParams.loadsAllData()) {\r\n            events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, query._path, node);\r\n        }\r\n        else {\r\n            const tag = syncTreeTagForQuery(repo.serverSyncTree_, query);\r\n            events = syncTreeApplyTaggedQueryOverwrite(repo.serverSyncTree_, query._path, node, tag);\r\n        }\r\n        /*\r\n         * We need to raise events in the scenario where `get()` is called at a parent path, and\r\n         * while the `get()` is pending, `onValue` is called at a child location. While get() is waiting\r\n         * for the data, `onValue` will register a new event. Then, get() will come back, and update the syncTree\r\n         * and its corresponding serverCache, including the child location where `onValue` is called. Then,\r\n         * `onValue` will receive the event from the server, but look at the syncTree and see that the data received\r\n         * from the server is already at the SyncPoint, and so the `onValue` callback will never get fired.\r\n         * Calling `eventQueueRaiseEventsForChangedPath()` is the correct way to propagate the events and\r\n         * ensure the corresponding child events will get fired.\r\n         */\r\n        eventQueueRaiseEventsForChangedPath(repo.eventQueue_, query._path, events);\r\n        syncTreeRemoveEventRegistration(repo.serverSyncTree_, query, eventRegistration, null, true);\r\n        return node;\r\n    }, err => {\r\n        repoLog(repo, 'get for query ' + stringify(query) + ' failed: ' + err);\r\n        return Promise.reject(new Error(err));\r\n    });\r\n}\r\nfunction repoSetWithPriority(repo, path, newVal, newPriority, onComplete) {\r\n    repoLog(repo, '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    const serverValues = repoGenerateServerValues(repo);\r\n    const newNodeUnresolved = nodeFromJSON(newVal, newPriority);\r\n    const existing = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path);\r\n    const newNode = resolveDeferredValueSnapshot(newNodeUnresolved, existing, serverValues);\r\n    const writeId = repoGetNextWriteId(repo);\r\n    const events = syncTreeApplyUserOverwrite(repo.serverSyncTree_, path, newNode, writeId, true);\r\n    eventQueueQueueEvents(repo.eventQueue_, events);\r\n    repo.server_.put(path.toString(), newNodeUnresolved.val(/*export=*/ true), (status, errorReason) => {\r\n        const success = status === 'ok';\r\n        if (!success) {\r\n            warn('set at ' + path + ' failed: ' + status);\r\n        }\r\n        const clearEvents = syncTreeAckUserWrite(repo.serverSyncTree_, writeId, !success);\r\n        eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, clearEvents);\r\n        repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n    });\r\n    const affectedPath = repoAbortTransactions(repo, path);\r\n    repoRerunTransactions(repo, affectedPath);\r\n    // We queued the events above, so just flush the queue here\r\n    eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, []);\r\n}\r\nfunction repoUpdate(repo, path, childrenToMerge, onComplete) {\r\n    repoLog(repo, 'update', { path: path.toString(), value: childrenToMerge });\r\n    // Start with our existing data and merge each child into it.\r\n    let empty = true;\r\n    const serverValues = repoGenerateServerValues(repo);\r\n    const changedChildren = {};\r\n    each(childrenToMerge, (changedKey, changedValue) => {\r\n        empty = false;\r\n        changedChildren[changedKey] = resolveDeferredValueTree(pathChild(path, changedKey), nodeFromJSON(changedValue), repo.serverSyncTree_, serverValues);\r\n    });\r\n    if (!empty) {\r\n        const writeId = repoGetNextWriteId(repo);\r\n        const events = syncTreeApplyUserMerge(repo.serverSyncTree_, path, changedChildren, writeId);\r\n        eventQueueQueueEvents(repo.eventQueue_, events);\r\n        repo.server_.merge(path.toString(), childrenToMerge, (status, errorReason) => {\r\n            const success = status === 'ok';\r\n            if (!success) {\r\n                warn('update at ' + path + ' failed: ' + status);\r\n            }\r\n            const clearEvents = syncTreeAckUserWrite(repo.serverSyncTree_, writeId, !success);\r\n            const affectedPath = clearEvents.length > 0 ? repoRerunTransactions(repo, path) : path;\r\n            eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, clearEvents);\r\n            repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n        });\r\n        each(childrenToMerge, (changedPath) => {\r\n            const affectedPath = repoAbortTransactions(repo, pathChild(path, changedPath));\r\n            repoRerunTransactions(repo, affectedPath);\r\n        });\r\n        // We queued the events above, so just flush the queue here\r\n        eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, []);\r\n    }\r\n    else {\r\n        log(\"update() called with empty data.  Don't do anything.\");\r\n        repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\r\n    }\r\n}\r\n/**\r\n * Applies all of the changes stored up in the onDisconnect_ tree.\r\n */\r\nfunction repoRunOnDisconnectEvents(repo) {\r\n    repoLog(repo, 'onDisconnectEvents');\r\n    const serverValues = repoGenerateServerValues(repo);\r\n    const resolvedOnDisconnectTree = newSparseSnapshotTree();\r\n    sparseSnapshotTreeForEachTree(repo.onDisconnect_, newEmptyPath(), (path, node) => {\r\n        const resolved = resolveDeferredValueTree(path, node, repo.serverSyncTree_, serverValues);\r\n        sparseSnapshotTreeRemember(resolvedOnDisconnectTree, path, resolved);\r\n    });\r\n    let events = [];\r\n    sparseSnapshotTreeForEachTree(resolvedOnDisconnectTree, newEmptyPath(), (path, snap) => {\r\n        events = events.concat(syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap));\r\n        const affectedPath = repoAbortTransactions(repo, path);\r\n        repoRerunTransactions(repo, affectedPath);\r\n    });\r\n    repo.onDisconnect_ = newSparseSnapshotTree();\r\n    eventQueueRaiseEventsForChangedPath(repo.eventQueue_, newEmptyPath(), events);\r\n}\r\nfunction repoOnDisconnectCancel(repo, path, onComplete) {\r\n    repo.server_.onDisconnectCancel(path.toString(), (status, errorReason) => {\r\n        if (status === 'ok') {\r\n            sparseSnapshotTreeForget(repo.onDisconnect_, path);\r\n        }\r\n        repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n    });\r\n}\r\nfunction repoOnDisconnectSet(repo, path, value, onComplete) {\r\n    const newNode = nodeFromJSON(value);\r\n    repo.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), (status, errorReason) => {\r\n        if (status === 'ok') {\r\n            sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\r\n        }\r\n        repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n    });\r\n}\r\nfunction repoOnDisconnectSetWithPriority(repo, path, value, priority, onComplete) {\r\n    const newNode = nodeFromJSON(value, priority);\r\n    repo.server_.onDisconnectPut(path.toString(), newNode.val(/*export=*/ true), (status, errorReason) => {\r\n        if (status === 'ok') {\r\n            sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\r\n        }\r\n        repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n    });\r\n}\r\nfunction repoOnDisconnectUpdate(repo, path, childrenToMerge, onComplete) {\r\n    if (isEmpty(childrenToMerge)) {\r\n        log(\"onDisconnect().update() called with empty data.  Don't do anything.\");\r\n        repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\r\n        return;\r\n    }\r\n    repo.server_.onDisconnectMerge(path.toString(), childrenToMerge, (status, errorReason) => {\r\n        if (status === 'ok') {\r\n            each(childrenToMerge, (childName, childNode) => {\r\n                const newChildNode = nodeFromJSON(childNode);\r\n                sparseSnapshotTreeRemember(repo.onDisconnect_, pathChild(path, childName), newChildNode);\r\n            });\r\n        }\r\n        repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\r\n    });\r\n}\r\nfunction repoAddEventCallbackForQuery(repo, query, eventRegistration) {\r\n    let events;\r\n    if (pathGetFront(query._path) === '.info') {\r\n        events = syncTreeAddEventRegistration(repo.infoSyncTree_, query, eventRegistration);\r\n    }\r\n    else {\r\n        events = syncTreeAddEventRegistration(repo.serverSyncTree_, query, eventRegistration);\r\n    }\r\n    eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n}\r\nfunction repoRemoveEventCallbackForQuery(repo, 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    let events;\r\n    if (pathGetFront(query._path) === '.info') {\r\n        events = syncTreeRemoveEventRegistration(repo.infoSyncTree_, query, eventRegistration);\r\n    }\r\n    else {\r\n        events = syncTreeRemoveEventRegistration(repo.serverSyncTree_, query, eventRegistration);\r\n    }\r\n    eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\r\n}\r\nfunction repoInterrupt(repo) {\r\n    if (repo.persistentConnection_) {\r\n        repo.persistentConnection_.interrupt(INTERRUPT_REASON);\r\n    }\r\n}\r\nfunction repoResume(repo) {\r\n    if (repo.persistentConnection_) {\r\n        repo.persistentConnection_.resume(INTERRUPT_REASON);\r\n    }\r\n}\r\nfunction repoLog(repo, ...varArgs) {\r\n    let prefix = '';\r\n    if (repo.persistentConnection_) {\r\n        prefix = repo.persistentConnection_.id + ':';\r\n    }\r\n    log(prefix, ...varArgs);\r\n}\r\nfunction repoCallOnCompleteCallback(repo, callback, status, errorReason) {\r\n    if (callback) {\r\n        exceptionGuard(() => {\r\n            if (status === 'ok') {\r\n                callback(null);\r\n            }\r\n            else {\r\n                const code = (status || 'error').toUpperCase();\r\n                let message = code;\r\n                if (errorReason) {\r\n                    message += ': ' + errorReason;\r\n                }\r\n                const error = new Error(message);\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                error.code = code;\r\n                callback(error);\r\n            }\r\n        });\r\n    }\r\n}\r\n/**\r\n * Creates a new transaction, adds it to the transactions we're tracking, and\r\n * sends it to the server if possible.\r\n *\r\n * @param path - Path at which to do transaction.\r\n * @param transactionUpdate - Update callback.\r\n * @param onComplete - Completion callback.\r\n * @param unwatcher - Function that will be called when the transaction no longer\r\n * need data updates for `path`.\r\n * @param applyLocally - Whether or not to make intermediate results visible\r\n */\r\nfunction repoStartTransaction(repo, path, transactionUpdate, onComplete, unwatcher, applyLocally) {\r\n    repoLog(repo, 'transaction on ' + path);\r\n    // Initialize transaction.\r\n    const transaction = {\r\n        path,\r\n        update: transactionUpdate,\r\n        onComplete,\r\n        // One of TransactionStatus enums.\r\n        status: null,\r\n        // Used when combining transactions at different locations to figure out\r\n        // which one goes first.\r\n        order: LUIDGenerator(),\r\n        // Whether to raise local events for this transaction.\r\n        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,\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    const currentState = repoGetLatestState(repo, path, undefined);\r\n    transaction.currentInputSnapshot = currentState;\r\n    const 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            transaction.onComplete(null, false, transaction.currentInputSnapshot);\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 = 0 /* TransactionStatus.RUN */;\r\n        const queueNode = treeSubTree(repo.transactionQueueTree_, path);\r\n        const nodeQueue = treeGetValue(queueNode) || [];\r\n        nodeQueue.push(transaction);\r\n        treeSetValue(queueNode, nodeQueue);\r\n        // Update visibleData and raise events\r\n        // Note: We intentionally raise events after updating all of our\r\n        // transaction state, since the user could start new transactions from the\r\n        // event callbacks.\r\n        let priorityForNode;\r\n        if (typeof newVal === 'object' &&\r\n            newVal !== null &&\r\n            contains(newVal, '.priority')) {\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\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            const currentNode = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path) ||\r\n                ChildrenNode.EMPTY_NODE;\r\n            priorityForNode = currentNode.getPriority().val();\r\n        }\r\n        const serverValues = repoGenerateServerValues(repo);\r\n        const newNodeUnresolved = nodeFromJSON(newVal, priorityForNode);\r\n        const newNode = resolveDeferredValueSnapshot(newNodeUnresolved, currentState, serverValues);\r\n        transaction.currentOutputSnapshotRaw = newNodeUnresolved;\r\n        transaction.currentOutputSnapshotResolved = newNode;\r\n        transaction.currentWriteId = repoGetNextWriteId(repo);\r\n        const events = syncTreeApplyUserOverwrite(repo.serverSyncTree_, path, newNode, transaction.currentWriteId, transaction.applyLocally);\r\n        eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n        repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n    }\r\n}\r\n/**\r\n * @param excludeSets - A specific set to exclude\r\n */\r\nfunction repoGetLatestState(repo, path, excludeSets) {\r\n    return (syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path, excludeSets) ||\r\n        ChildrenNode.EMPTY_NODE);\r\n}\r\n/**\r\n * Sends any already-run transactions that aren't waiting for outstanding\r\n * transactions to complete.\r\n *\r\n * Externally it's called with no arguments, but it calls itself recursively\r\n * with a particular transactionQueueTree node to recurse through the tree.\r\n *\r\n * @param node - transactionQueueTree node to start at.\r\n */\r\nfunction repoSendReadyTransactions(repo, node = repo.transactionQueueTree_) {\r\n    // Before recursing, make sure any completed transactions are removed.\r\n    if (!node) {\r\n        repoPruneCompletedTransactionsBelowNode(repo, node);\r\n    }\r\n    if (treeGetValue(node)) {\r\n        const queue = repoBuildTransactionQueue(repo, node);\r\n        assert(queue.length > 0, 'Sending zero length transaction queue');\r\n        const allRun = queue.every((transaction) => transaction.status === 0 /* 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            repoSendTransactionQueue(repo, treeGetPath(node), queue);\r\n        }\r\n    }\r\n    else if (treeHasChildren(node)) {\r\n        treeForEachChild(node, childNode => {\r\n            repoSendReadyTransactions(repo, 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\r\n * the result (success or failure).\r\n *\r\n * @param path - The location of the queue.\r\n * @param queue - Queue of transactions under the specified location.\r\n */\r\nfunction repoSendTransactionQueue(repo, path, queue) {\r\n    // Mark transactions as sent and increment retry count!\r\n    const setsToIgnore = queue.map(txn => {\r\n        return txn.currentWriteId;\r\n    });\r\n    const latestState = repoGetLatestState(repo, path, setsToIgnore);\r\n    let snapToSend = latestState;\r\n    const latestHash = latestState.hash();\r\n    for (let i = 0; i < queue.length; i++) {\r\n        const txn = queue[i];\r\n        assert(txn.status === 0 /* TransactionStatus.RUN */, 'tryToSendTransactionQueue_: items in queue should all be run.');\r\n        txn.status = 1 /* TransactionStatus.SENT */;\r\n        txn.retryCount++;\r\n        const relativePath = newRelativePath(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    const dataToSend = snapToSend.val(true);\r\n    const pathToSend = path;\r\n    // Send the put.\r\n    repo.server_.put(pathToSend.toString(), dataToSend, (status) => {\r\n        repoLog(repo, 'transaction put response', {\r\n            path: pathToSend.toString(),\r\n            status\r\n        });\r\n        let events = [];\r\n        if (status === 'ok') {\r\n            // Queue up the callbacks and fire them after cleaning up all of our\r\n            // transaction state, since the callback could trigger more\r\n            // transactions or sets.\r\n            const callbacks = [];\r\n            for (let i = 0; i < queue.length; i++) {\r\n                queue[i].status = 2 /* TransactionStatus.COMPLETED */;\r\n                events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId));\r\n                if (queue[i].onComplete) {\r\n                    // We never unset the output snapshot, and given that this\r\n                    // transaction is complete, it should be set\r\n                    callbacks.push(() => queue[i].onComplete(null, true, queue[i].currentOutputSnapshotResolved));\r\n                }\r\n                queue[i].unwatcher();\r\n            }\r\n            // Now remove the completed transactions.\r\n            repoPruneCompletedTransactionsBelowNode(repo, treeSubTree(repo.transactionQueueTree_, path));\r\n            // There may be pending transactions that we can now send.\r\n            repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n            eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n            // Finally, trigger onComplete callbacks.\r\n            for (let 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 (let i = 0; i < queue.length; i++) {\r\n                    if (queue[i].status === 3 /* TransactionStatus.SENT_NEEDS_ABORT */) {\r\n                        queue[i].status = 4 /* TransactionStatus.NEEDS_ABORT */;\r\n                    }\r\n                    else {\r\n                        queue[i].status = 0 /* TransactionStatus.RUN */;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                warn('transaction at ' + pathToSend.toString() + ' failed: ' + status);\r\n                for (let i = 0; i < queue.length; i++) {\r\n                    queue[i].status = 4 /* TransactionStatus.NEEDS_ABORT */;\r\n                    queue[i].abortReason = status;\r\n                }\r\n            }\r\n            repoRerunTransactions(repo, 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\r\n * is the path at which events need to be raised for.\r\n *\r\n * @param changedPath - The path in mergedData that changed.\r\n * @returns The rootmost path that was affected by rerunning transactions.\r\n */\r\nfunction repoRerunTransactions(repo, changedPath) {\r\n    const rootMostTransactionNode = repoGetAncestorTransactionNode(repo, changedPath);\r\n    const path = treeGetPath(rootMostTransactionNode);\r\n    const queue = repoBuildTransactionQueue(repo, rootMostTransactionNode);\r\n    repoRerunTransactionQueue(repo, 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\r\n * transactions and whatnot).\r\n *\r\n * @param queue - The queue of transactions to run.\r\n * @param path - The path the queue is for.\r\n */\r\nfunction repoRerunTransactionQueue(repo, 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\r\n    // transaction state, since the callback could trigger more transactions or\r\n    // sets.\r\n    const callbacks = [];\r\n    let events = [];\r\n    // Ignore all of the sets we're going to re-run.\r\n    const txnsToRerun = queue.filter(q => {\r\n        return q.status === 0 /* TransactionStatus.RUN */;\r\n    });\r\n    const setsToIgnore = txnsToRerun.map(q => {\r\n        return q.currentWriteId;\r\n    });\r\n    for (let i = 0; i < queue.length; i++) {\r\n        const transaction = queue[i];\r\n        const relativePath = newRelativePath(path, transaction.path);\r\n        let abortTransaction = false, abortReason;\r\n        assert(relativePath !== null, 'rerunTransactionsUnderNode_: relativePath should not be null.');\r\n        if (transaction.status === 4 /* TransactionStatus.NEEDS_ABORT */) {\r\n            abortTransaction = true;\r\n            abortReason = transaction.abortReason;\r\n            events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n        }\r\n        else if (transaction.status === 0 /* TransactionStatus.RUN */) {\r\n            if (transaction.retryCount >= MAX_TRANSACTION_RETRIES) {\r\n                abortTransaction = true;\r\n                abortReason = 'maxretry';\r\n                events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n            }\r\n            else {\r\n                // This code reruns a transaction\r\n                const currentNode = repoGetLatestState(repo, transaction.path, setsToIgnore);\r\n                transaction.currentInputSnapshot = currentNode;\r\n                const newData = queue[i].update(currentNode.val());\r\n                if (newData !== undefined) {\r\n                    validateFirebaseData('transaction failed: Data returned ', newData, transaction.path);\r\n                    let newDataNode = nodeFromJSON(newData);\r\n                    const 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                    const oldWriteId = transaction.currentWriteId;\r\n                    const serverValues = repoGenerateServerValues(repo);\r\n                    const newNodeResolved = resolveDeferredValueSnapshot(newDataNode, currentNode, serverValues);\r\n                    transaction.currentOutputSnapshotRaw = newDataNode;\r\n                    transaction.currentOutputSnapshotResolved = newNodeResolved;\r\n                    transaction.currentWriteId = repoGetNextWriteId(repo);\r\n                    // Mutates setsToIgnore in place\r\n                    setsToIgnore.splice(setsToIgnore.indexOf(oldWriteId), 1);\r\n                    events = events.concat(syncTreeApplyUserOverwrite(repo.serverSyncTree_, transaction.path, newNodeResolved, transaction.currentWriteId, transaction.applyLocally));\r\n                    events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, oldWriteId, true));\r\n                }\r\n                else {\r\n                    abortTransaction = true;\r\n                    abortReason = 'nodata';\r\n                    events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, transaction.currentWriteId, true));\r\n                }\r\n            }\r\n        }\r\n        eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\r\n        events = [];\r\n        if (abortTransaction) {\r\n            // Abort.\r\n            queue[i].status = 2 /* TransactionStatus.COMPLETED */;\r\n            // Removing a listener can trigger pruning which can muck with\r\n            // mergedData/visibleData (as it prunes data). So defer the unwatcher\r\n            // 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                    callbacks.push(() => queue[i].onComplete(null, false, queue[i].currentInputSnapshot));\r\n                }\r\n                else {\r\n                    callbacks.push(() => queue[i].onComplete(new Error(abortReason), false, null));\r\n                }\r\n            }\r\n        }\r\n    }\r\n    // Clean up completed transactions.\r\n    repoPruneCompletedTransactionsBelowNode(repo, repo.transactionQueueTree_);\r\n    // Now fire callbacks, now that we're in a good, known state.\r\n    for (let 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    repoSendReadyTransactions(repo, repo.transactionQueueTree_);\r\n}\r\n/**\r\n * Returns the rootmost ancestor node of the specified path that has a pending\r\n * transaction on it, or just returns the node for the given path if there are\r\n * no pending transactions on any ancestor.\r\n *\r\n * @param path - The location to start at.\r\n * @returns The rootmost node with a transaction.\r\n */\r\nfunction repoGetAncestorTransactionNode(repo, path) {\r\n    let front;\r\n    // Start at the root and walk deeper into the tree towards path until we\r\n    // find a node with pending transactions.\r\n    let transactionNode = repo.transactionQueueTree_;\r\n    front = pathGetFront(path);\r\n    while (front !== null && treeGetValue(transactionNode) === undefined) {\r\n        transactionNode = treeSubTree(transactionNode, front);\r\n        path = pathPopFront(path);\r\n        front = pathGetFront(path);\r\n    }\r\n    return transactionNode;\r\n}\r\n/**\r\n * Builds the queue of all transactions at or below the specified\r\n * transactionNode.\r\n *\r\n * @param transactionNode\r\n * @returns The generated queue.\r\n */\r\nfunction repoBuildTransactionQueue(repo, transactionNode) {\r\n    // Walk any child transaction queues and aggregate them into a single queue.\r\n    const transactionQueue = [];\r\n    repoAggregateTransactionQueuesForNode(repo, transactionNode, transactionQueue);\r\n    // Sort them by the order the transactions were created.\r\n    transactionQueue.sort((a, b) => a.order - b.order);\r\n    return transactionQueue;\r\n}\r\nfunction repoAggregateTransactionQueuesForNode(repo, node, queue) {\r\n    const nodeQueue = treeGetValue(node);\r\n    if (nodeQueue) {\r\n        for (let i = 0; i < nodeQueue.length; i++) {\r\n            queue.push(nodeQueue[i]);\r\n        }\r\n    }\r\n    treeForEachChild(node, child => {\r\n        repoAggregateTransactionQueuesForNode(repo, child, queue);\r\n    });\r\n}\r\n/**\r\n * Remove COMPLETED transactions at or below this node in the transactionQueueTree_.\r\n */\r\nfunction repoPruneCompletedTransactionsBelowNode(repo, node) {\r\n    const queue = treeGetValue(node);\r\n    if (queue) {\r\n        let to = 0;\r\n        for (let from = 0; from < queue.length; from++) {\r\n            if (queue[from].status !== 2 /* TransactionStatus.COMPLETED */) {\r\n                queue[to] = queue[from];\r\n                to++;\r\n            }\r\n        }\r\n        queue.length = to;\r\n        treeSetValue(node, queue.length > 0 ? queue : undefined);\r\n    }\r\n    treeForEachChild(node, childNode => {\r\n        repoPruneCompletedTransactionsBelowNode(repo, childNode);\r\n    });\r\n}\r\n/**\r\n * Aborts all transactions on ancestors or descendants of the specified path.\r\n * Called when doing a set() or update() since we consider them incompatible\r\n * with transactions.\r\n *\r\n * @param path - Path for which we want to abort related transactions.\r\n */\r\nfunction repoAbortTransactions(repo, path) {\r\n    const affectedPath = treeGetPath(repoGetAncestorTransactionNode(repo, path));\r\n    const transactionNode = treeSubTree(repo.transactionQueueTree_, path);\r\n    treeForEachAncestor(transactionNode, (node) => {\r\n        repoAbortTransactionsOnNode(repo, node);\r\n    });\r\n    repoAbortTransactionsOnNode(repo, transactionNode);\r\n    treeForEachDescendant(transactionNode, (node) => {\r\n        repoAbortTransactionsOnNode(repo, 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 node - Node to abort transactions for.\r\n */\r\nfunction repoAbortTransactionsOnNode(repo, node) {\r\n    const queue = treeGetValue(node);\r\n    if (queue) {\r\n        // Queue up the callbacks and fire them after cleaning up all of our\r\n        // transaction state, since the callback could trigger more transactions\r\n        // or sets.\r\n        const callbacks = [];\r\n        // Go through queue.  Any already-sent transactions must be marked for\r\n        // abort, while the unsent ones can be immediately aborted and removed.\r\n        let events = [];\r\n        let lastSent = -1;\r\n        for (let i = 0; i < queue.length; i++) {\r\n            if (queue[i].status === 3 /* TransactionStatus.SENT_NEEDS_ABORT */) ;\r\n            else if (queue[i].status === 1 /* 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 = 3 /* TransactionStatus.SENT_NEEDS_ABORT */;\r\n                queue[i].abortReason = 'set';\r\n            }\r\n            else {\r\n                assert(queue[i].status === 0 /* TransactionStatus.RUN */, 'Unexpected transaction status in abort');\r\n                // We can abort it immediately.\r\n                queue[i].unwatcher();\r\n                events = events.concat(syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId, true));\r\n                if (queue[i].onComplete) {\r\n                    callbacks.push(queue[i].onComplete.bind(null, new Error('set'), false, null));\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            treeSetValue(node, undefined);\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        eventQueueRaiseEventsForChangedPath(repo.eventQueue_, treeGetPath(node), events);\r\n        for (let i = 0; i < callbacks.length; i++) {\r\n            exceptionGuard(callbacks[i]);\r\n        }\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 decodePath(pathString) {\r\n    let pathStringDecoded = '';\r\n    const pieces = pathString.split('/');\r\n    for (let i = 0; i < pieces.length; i++) {\r\n        if (pieces[i].length > 0) {\r\n            let 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 * @returns key value hash\r\n */\r\nfunction decodeQuery(queryString) {\r\n    const results = {};\r\n    if (queryString.charAt(0) === '?') {\r\n        queryString = queryString.substring(1);\r\n    }\r\n    for (const segment of queryString.split('&')) {\r\n        if (segment.length === 0) {\r\n            continue;\r\n        }\r\n        const 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\nconst parseRepoInfo = function (dataURL, nodeAdmin) {\r\n    const parsedUrl = parseDatabaseURL(dataURL), namespace = parsedUrl.namespace;\r\n    if (parsedUrl.domain === 'firebase.com') {\r\n        fatal(parsedUrl.host +\r\n            ' is no longer supported. ' +\r\n            'Please use <YOUR FIREBASE>.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://<YOUR FIREBASE>.firebaseio.com');\r\n    }\r\n    if (!parsedUrl.secure) {\r\n        warnIfPageIsSecure();\r\n    }\r\n    const webSocketOnly = parsedUrl.scheme === 'ws' || parsedUrl.scheme === 'wss';\r\n    return {\r\n        repoInfo: new RepoInfo(parsedUrl.host, parsedUrl.secure, namespace, webSocketOnly, nodeAdmin, \r\n        /*persistenceKey=*/ '', \r\n        /*includeNamespaceInQueryParams=*/ namespace !== parsedUrl.subdomain),\r\n        path: new Path(parsedUrl.pathString)\r\n    };\r\n};\r\nconst parseDatabaseURL = function (dataURL) {\r\n    // Default to empty strings in the event of a malformed string.\r\n    let host = '', domain = '', subdomain = '', pathString = '', namespace = '';\r\n    // Always default to SSL, unless otherwise specified.\r\n    let 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        let 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        let slashInd = dataURL.indexOf('/');\r\n        if (slashInd === -1) {\r\n            slashInd = dataURL.length;\r\n        }\r\n        let 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        const 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 = host.length;\r\n        }\r\n        const hostWithoutPort = host.slice(0, colonInd);\r\n        if (hostWithoutPort.toLowerCase() === 'localhost') {\r\n            domain = 'localhost';\r\n        }\r\n        else if (hostWithoutPort.split('.').length <= 2) {\r\n            domain = hostWithoutPort;\r\n        }\r\n        else {\r\n            // Interpret the subdomain of a 3 or more component URL as the namespace name.\r\n            const dotInd = host.indexOf('.');\r\n            subdomain = host.substring(0, dotInd).toLowerCase();\r\n            domain = host.substring(dotInd + 1);\r\n            // Normalize namespaces to lowercase to share storage / connection.\r\n            namespace = subdomain;\r\n        }\r\n        // Always treat the value of the `ns` as the namespace name if it is present.\r\n        if ('ns' in queryParams) {\r\n            namespace = queryParams['ns'];\r\n        }\r\n    }\r\n    return {\r\n        host,\r\n        port,\r\n        domain,\r\n        subdomain,\r\n        secure,\r\n        scheme,\r\n        pathString,\r\n        namespace\r\n    };\r\n};\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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// Modeled after base64 web-safe chars, but ordered by ASCII.\r\nconst PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\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\nconst nextPushId = (function () {\r\n    // Timestamp of last push, used to prevent local collisions if you push twice\r\n    // in one ms.\r\n    let 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    const lastRandChars = [];\r\n    return function (now) {\r\n        const duplicateTime = now === lastPushTime;\r\n        lastPushTime = now;\r\n        let i;\r\n        const 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        let 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 * @license\r\n * Copyright 2017 Google LLC\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 */\r\nclass DataEvent {\r\n    /**\r\n     * @param eventType - One of: value, child_added, child_changed, child_moved, child_removed\r\n     * @param eventRegistration - The function to call to with the event data. User provided\r\n     * @param snapshot - The data backing the event\r\n     * @param prevName - Optional, the name of the previous child for child_* events.\r\n     */\r\n    constructor(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    getPath() {\r\n        const ref = this.snapshot.ref;\r\n        if (this.eventType === 'value') {\r\n            return ref._path;\r\n        }\r\n        else {\r\n            return ref.parent._path;\r\n        }\r\n    }\r\n    getEventType() {\r\n        return this.eventType;\r\n    }\r\n    getEventRunner() {\r\n        return this.eventRegistration.getEventRunner(this);\r\n    }\r\n    toString() {\r\n        return (this.getPath().toString() +\r\n            ':' +\r\n            this.eventType +\r\n            ':' +\r\n            stringify(this.snapshot.exportVal()));\r\n    }\r\n}\r\nclass CancelEvent {\r\n    constructor(eventRegistration, error, path) {\r\n        this.eventRegistration = eventRegistration;\r\n        this.error = error;\r\n        this.path = path;\r\n    }\r\n    getPath() {\r\n        return this.path;\r\n    }\r\n    getEventType() {\r\n        return 'cancel';\r\n    }\r\n    getEventRunner() {\r\n        return this.eventRegistration.getEventRunner(this);\r\n    }\r\n    toString() {\r\n        return this.path.toString() + ':cancel';\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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 wrapper class that converts events from the database@exp SDK to the legacy\r\n * Database SDK. Events are not converted directly as event registration relies\r\n * on reference comparison of the original user callback (see `matches()`) and\r\n * relies on equality of the legacy SDK's `context` object.\r\n */\r\nclass CallbackContext {\r\n    constructor(snapshotCallback, cancelCallback) {\r\n        this.snapshotCallback = snapshotCallback;\r\n        this.cancelCallback = cancelCallback;\r\n    }\r\n    onValue(expDataSnapshot, previousChildName) {\r\n        this.snapshotCallback.call(null, expDataSnapshot, previousChildName);\r\n    }\r\n    onCancel(error) {\r\n        assert(this.hasCancelCallback, 'Raising a cancel event on a listener with no cancel callback');\r\n        return this.cancelCallback.call(null, error);\r\n    }\r\n    get hasCancelCallback() {\r\n        return !!this.cancelCallback;\r\n    }\r\n    matches(other) {\r\n        return (this.snapshotCallback === other.snapshotCallback ||\r\n            (this.snapshotCallback.userCallback !== undefined &&\r\n                this.snapshotCallback.userCallback ===\r\n                    other.snapshotCallback.userCallback &&\r\n                this.snapshotCallback.context === other.snapshotCallback.context));\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\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 `onDisconnect` class allows you to write or clear data when your client\r\n * disconnects from the Database server. These updates occur whether your\r\n * client disconnects cleanly or not, so you can rely on them to clean up data\r\n * even if a connection is dropped or a client crashes.\r\n *\r\n * The `onDisconnect` class is most commonly used to manage presence in\r\n * applications where it is useful to detect how many clients are connected and\r\n * when other clients disconnect. See\r\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\r\n * for more information.\r\n *\r\n * To avoid problems when a connection is dropped before the requests can be\r\n * transferred to the Database server, these functions should be called before\r\n * writing any data.\r\n *\r\n * Note that `onDisconnect` operations are only triggered once. If you want an\r\n * operation to occur each time a disconnect occurs, you'll need to re-establish\r\n * the `onDisconnect` operations each time you reconnect.\r\n */\r\nclass OnDisconnect {\r\n    /** @hideconstructor */\r\n    constructor(_repo, _path) {\r\n        this._repo = _repo;\r\n        this._path = _path;\r\n    }\r\n    /**\r\n     * Cancels all previously queued `onDisconnect()` set or update events for this\r\n     * location and all children.\r\n     *\r\n     * If a write has been queued for this location via a `set()` or `update()` at a\r\n     * parent location, the write at this location will be canceled, though writes\r\n     * to sibling locations will still occur.\r\n     *\r\n     * @returns Resolves when synchronization to the server is complete.\r\n     */\r\n    cancel() {\r\n        const deferred = new Deferred();\r\n        repoOnDisconnectCancel(this._repo, this._path, deferred.wrapCallback(() => { }));\r\n        return deferred.promise;\r\n    }\r\n    /**\r\n     * Ensures the data at this location is deleted when the client is disconnected\r\n     * (due to closing the browser, navigating to a new page, or network issues).\r\n     *\r\n     * @returns Resolves when synchronization to the server is complete.\r\n     */\r\n    remove() {\r\n        validateWritablePath('OnDisconnect.remove', this._path);\r\n        const deferred = new Deferred();\r\n        repoOnDisconnectSet(this._repo, this._path, null, deferred.wrapCallback(() => { }));\r\n        return deferred.promise;\r\n    }\r\n    /**\r\n     * Ensures the data at this location is set to the specified value when the\r\n     * client is disconnected (due to closing the browser, navigating to a new page,\r\n     * or network issues).\r\n     *\r\n     * `set()` is especially useful for implementing \"presence\" systems, where a\r\n     * value should be changed or cleared when a user disconnects so that they\r\n     * appear \"offline\" to other users. See\r\n     * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\r\n     * for more information.\r\n     *\r\n     * Note that `onDisconnect` operations are only triggered once. If you want an\r\n     * operation to occur each time a disconnect occurs, you'll need to re-establish\r\n     * the `onDisconnect` operations each time.\r\n     *\r\n     * @param value - The value to be written to this location on disconnect (can\r\n     * be an object, array, string, number, boolean, or null).\r\n     * @returns Resolves when synchronization to the Database is complete.\r\n     */\r\n    set(value) {\r\n        validateWritablePath('OnDisconnect.set', this._path);\r\n        validateFirebaseDataArg('OnDisconnect.set', value, this._path, false);\r\n        const deferred = new Deferred();\r\n        repoOnDisconnectSet(this._repo, this._path, value, deferred.wrapCallback(() => { }));\r\n        return deferred.promise;\r\n    }\r\n    /**\r\n     * Ensures the data at this location is set to the specified value and priority\r\n     * when the client is disconnected (due to closing the browser, navigating to a\r\n     * new page, or network issues).\r\n     *\r\n     * @param value - The value to be written to this location on disconnect (can\r\n     * be an object, array, string, number, boolean, or null).\r\n     * @param priority - The priority to be written (string, number, or null).\r\n     * @returns Resolves when synchronization to the Database is complete.\r\n     */\r\n    setWithPriority(value, priority) {\r\n        validateWritablePath('OnDisconnect.setWithPriority', this._path);\r\n        validateFirebaseDataArg('OnDisconnect.setWithPriority', value, this._path, false);\r\n        validatePriority('OnDisconnect.setWithPriority', priority, false);\r\n        const deferred = new Deferred();\r\n        repoOnDisconnectSetWithPriority(this._repo, this._path, value, priority, deferred.wrapCallback(() => { }));\r\n        return deferred.promise;\r\n    }\r\n    /**\r\n     * Writes multiple values at this location when the client is disconnected (due\r\n     * to closing the browser, navigating to a new page, or network issues).\r\n     *\r\n     * The `values` argument contains multiple property-value pairs that will be\r\n     * written to the Database together. Each child property can either be a simple\r\n     * property (for example, \"name\") or a relative path (for example, \"name/first\")\r\n     * from the current location to the data to update.\r\n     *\r\n     * As opposed to the `set()` method, `update()` can be use to selectively update\r\n     * only the referenced properties at the current location (instead of replacing\r\n     * all the child properties at the current location).\r\n     *\r\n     * @param values - Object containing multiple values.\r\n     * @returns Resolves when synchronization to the Database is complete.\r\n     */\r\n    update(values) {\r\n        validateWritablePath('OnDisconnect.update', this._path);\r\n        validateFirebaseMergeDataArg('OnDisconnect.update', values, this._path, false);\r\n        const deferred = new Deferred();\r\n        repoOnDisconnectUpdate(this._repo, this._path, values, deferred.wrapCallback(() => { }));\r\n        return deferred.promise;\r\n    }\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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\r\n */\r\nclass QueryImpl {\r\n    /**\r\n     * @hideconstructor\r\n     */\r\n    constructor(_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    get key() {\r\n        if (pathIsEmpty(this._path)) {\r\n            return null;\r\n        }\r\n        else {\r\n            return pathGetBack(this._path);\r\n        }\r\n    }\r\n    get ref() {\r\n        return new ReferenceImpl(this._repo, this._path);\r\n    }\r\n    get _queryIdentifier() {\r\n        const obj = queryParamsGetQueryObject(this._queryParams);\r\n        const id = ObjectToUniqueKey(obj);\r\n        return id === '{}' ? 'default' : id;\r\n    }\r\n    /**\r\n     * An object representation of the query parameters used by this Query.\r\n     */\r\n    get _queryObject() {\r\n        return queryParamsGetQueryObject(this._queryParams);\r\n    }\r\n    isEqual(other) {\r\n        other = getModularInstance(other);\r\n        if (!(other instanceof QueryImpl)) {\r\n            return false;\r\n        }\r\n        const sameRepo = this._repo === other._repo;\r\n        const samePath = pathEquals(this._path, other._path);\r\n        const sameQueryIdentifier = this._queryIdentifier === other._queryIdentifier;\r\n        return sameRepo && samePath && sameQueryIdentifier;\r\n    }\r\n    toJSON() {\r\n        return this.toString();\r\n    }\r\n    toString() {\r\n        return this._repo.toString() + pathToUrlEncodedString(this._path);\r\n    }\r\n}\r\n/**\r\n * Validates that no other order by call has been made\r\n */\r\nfunction validateNoPreviousOrderByCall(query, fnName) {\r\n    if (query._orderByCalled === true) {\r\n        throw new Error(fnName + \": You can't combine multiple orderBy calls.\");\r\n    }\r\n}\r\n/**\r\n * Validates start/end values for queries.\r\n */\r\nfunction validateQueryEndpoints(params) {\r\n    let startNode = null;\r\n    let 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        const tooManyArgsError = 'Query: When ordering by key, you may only pass one argument to ' +\r\n            'startAt(), endAt(), or equalTo().';\r\n        const wrongArgTypeError = 'Query: When ordering by key, the argument passed to startAt(), startAfter(), ' +\r\n            'endAt(), endBefore(), or equalTo() must be a string.';\r\n        if (params.hasStart()) {\r\n            const 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            const 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                'startAfter() endAt(), endBefore(), or equalTo() must be a valid priority value ' +\r\n                '(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(), startAfter(), endAt(), endBefore(), or ' +\r\n                'equalTo() cannot be 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 */\r\nfunction validateLimit(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(), startAfter(), endAt(), endBefore(), and limit(). Use \" +\r\n            'limitToFirst() or limitToLast() instead.');\r\n    }\r\n}\r\n/**\r\n * @internal\r\n */\r\nclass ReferenceImpl extends QueryImpl {\r\n    /** @hideconstructor */\r\n    constructor(repo, path) {\r\n        super(repo, path, new QueryParams(), false);\r\n    }\r\n    get parent() {\r\n        const parentPath = pathParent(this._path);\r\n        return parentPath === null\r\n            ? null\r\n            : new ReferenceImpl(this._repo, parentPath);\r\n    }\r\n    get root() {\r\n        let ref = this;\r\n        while (ref.parent !== null) {\r\n            ref = ref.parent;\r\n        }\r\n        return ref;\r\n    }\r\n}\r\n/**\r\n * A `DataSnapshot` contains data from a Database location.\r\n *\r\n * Any time you read data from the Database, you receive the data as a\r\n * `DataSnapshot`. A `DataSnapshot` is passed to the event callbacks you attach\r\n * with `on()` or `once()`. You can extract the contents of the snapshot as a\r\n * JavaScript object by calling the `val()` method. Alternatively, you can\r\n * traverse into the snapshot by calling `child()` to return child snapshots\r\n * (which you could then call `val()` on).\r\n *\r\n * A `DataSnapshot` is an efficiently generated, immutable copy of the data at\r\n * a Database location. It cannot be modified and will never change (to modify\r\n * data, you always call the `set()` method on a `Reference` directly).\r\n */\r\nclass DataSnapshot {\r\n    /**\r\n     * @param _node - A SnapshotNode to wrap.\r\n     * @param ref - The location this snapshot came from.\r\n     * @param _index - The iteration order for this snapshot\r\n     * @hideconstructor\r\n     */\r\n    constructor(_node, \r\n    /**\r\n     * The location of this DataSnapshot.\r\n     */\r\n    ref, _index) {\r\n        this._node = _node;\r\n        this.ref = ref;\r\n        this._index = _index;\r\n    }\r\n    /**\r\n     * Gets the priority value of the data in this `DataSnapshot`.\r\n     *\r\n     * Applications need not use priority but can order collections by\r\n     * ordinary properties (see\r\n     * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data |Sorting and filtering data}\r\n     * ).\r\n     */\r\n    get priority() {\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     * The key (last part of the path) of the location of this `DataSnapshot`.\r\n     *\r\n     * The last token in a Database location is considered its key. For example,\r\n     * \"ada\" is the key for the /users/ada/ node. Accessing the key on any\r\n     * `DataSnapshot` will return the key for the location that generated it.\r\n     * However, accessing the key on the root URL of a Database will return\r\n     * `null`.\r\n     */\r\n    get key() {\r\n        return this.ref.key;\r\n    }\r\n    /** Returns the number of child properties of this `DataSnapshot`. */\r\n    get size() {\r\n        return this._node.numChildren();\r\n    }\r\n    /**\r\n     * Gets another `DataSnapshot` for the location at the specified relative path.\r\n     *\r\n     * Passing a relative path to the `child()` method of a DataSnapshot returns\r\n     * another `DataSnapshot` for the location at the specified relative path. The\r\n     * relative path can either be a simple child name (for example, \"ada\") or a\r\n     * deeper, slash-separated path (for example, \"ada/name/first\"). If the child\r\n     * location has no data, an empty `DataSnapshot` (that is, a `DataSnapshot`\r\n     * whose value is `null`) is returned.\r\n     *\r\n     * @param path - A relative path to the location of child data.\r\n     */\r\n    child(path) {\r\n        const childPath = new Path(path);\r\n        const childRef = child(this.ref, path);\r\n        return new DataSnapshot(this._node.getChild(childPath), childRef, PRIORITY_INDEX);\r\n    }\r\n    /**\r\n     * Returns true if this `DataSnapshot` contains any data. It is slightly more\r\n     * efficient than using `snapshot.val() !== null`.\r\n     */\r\n    exists() {\r\n        return !this._node.isEmpty();\r\n    }\r\n    /**\r\n     * Exports the entire contents of the DataSnapshot as a JavaScript object.\r\n     *\r\n     * The `exportVal()` method is similar to `val()`, except priority information\r\n     * is included (if available), making it suitable for backing up your data.\r\n     *\r\n     * @returns The DataSnapshot's contents as a JavaScript value (Object,\r\n     *   Array, string, number, boolean, or `null`).\r\n     */\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    exportVal() {\r\n        return this._node.val(true);\r\n    }\r\n    /**\r\n     * Enumerates the top-level children in the `IteratedDataSnapshot`.\r\n     *\r\n     * Because of the way JavaScript objects work, the ordering of data in the\r\n     * JavaScript object returned by `val()` is not guaranteed to match the\r\n     * ordering on the server nor the ordering of `onChildAdded()` events. That is\r\n     * where `forEach()` comes in handy. It guarantees the children of a\r\n     * `DataSnapshot` will be iterated in their query order.\r\n     *\r\n     * If no explicit `orderBy*()` method is used, results are returned\r\n     * ordered by key (unless priorities are used, in which case, results are\r\n     * returned by priority).\r\n     *\r\n     * @param action - A function that will be called for each child DataSnapshot.\r\n     * The callback can return true to cancel further enumeration.\r\n     * @returns true if enumeration was canceled due to your callback returning\r\n     * true.\r\n     */\r\n    forEach(action) {\r\n        if (this._node.isLeafNode()) {\r\n            return false;\r\n        }\r\n        const 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, (key, node) => {\r\n            return action(new DataSnapshot(node, child(this.ref, key), PRIORITY_INDEX));\r\n        });\r\n    }\r\n    /**\r\n     * Returns true if the specified child path has (non-null) data.\r\n     *\r\n     * @param path - A relative path to the location of a potential child.\r\n     * @returns `true` if data exists at the specified child path; else\r\n     *  `false`.\r\n     */\r\n    hasChild(path) {\r\n        const childPath = new Path(path);\r\n        return !this._node.getChild(childPath).isEmpty();\r\n    }\r\n    /**\r\n     * Returns whether or not the `DataSnapshot` has any non-`null` child\r\n     * properties.\r\n     *\r\n     * You can use `hasChildren()` to determine if a `DataSnapshot` has any\r\n     * children. If it does, you can enumerate them using `forEach()`. If it\r\n     * doesn't, then either this snapshot contains a primitive value (which can be\r\n     * retrieved with `val()`) or it is empty (in which case, `val()` will return\r\n     * `null`).\r\n     *\r\n     * @returns true if this snapshot has any children; else false.\r\n     */\r\n    hasChildren() {\r\n        if (this._node.isLeafNode()) {\r\n            return false;\r\n        }\r\n        else {\r\n            return !this._node.isEmpty();\r\n        }\r\n    }\r\n    /**\r\n     * Returns a JSON-serializable representation of this object.\r\n     */\r\n    toJSON() {\r\n        return this.exportVal();\r\n    }\r\n    /**\r\n     * Extracts a JavaScript value from a `DataSnapshot`.\r\n     *\r\n     * Depending on the data in a `DataSnapshot`, the `val()` method may return a\r\n     * scalar type (string, number, or boolean), an array, or an object. It may\r\n     * also return null, indicating that the `DataSnapshot` is empty (contains no\r\n     * data).\r\n     *\r\n     * @returns The DataSnapshot's contents as a JavaScript value (Object,\r\n     *   Array, string, number, boolean, or `null`).\r\n     */\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    val() {\r\n        return this._node.val();\r\n    }\r\n}\r\n/**\r\n *\r\n * Returns a `Reference` representing the location in the Database\r\n * corresponding to the provided path. If no path is provided, the `Reference`\r\n * will point to the root of the Database.\r\n *\r\n * @param db - The database instance to obtain a reference for.\r\n * @param path - Optional path representing the location the returned\r\n *   `Reference` will point. If not provided, the returned `Reference` will\r\n *   point to the root of the Database.\r\n * @returns If a path is provided, a `Reference`\r\n *   pointing to the provided path. Otherwise, a `Reference` pointing to the\r\n *   root of the Database.\r\n */\r\nfunction ref(db, path) {\r\n    db = getModularInstance(db);\r\n    db._checkNotDeleted('ref');\r\n    return path !== undefined ? child(db._root, path) : db._root;\r\n}\r\n/**\r\n * Returns a `Reference` representing the location in the Database\r\n * corresponding to the provided Firebase URL.\r\n *\r\n * An exception is thrown if the URL is not a valid Firebase Database URL or it\r\n * has a different domain than the current `Database` instance.\r\n *\r\n * Note that all query parameters (`orderBy`, `limitToLast`, etc.) are ignored\r\n * and are not applied to the returned `Reference`.\r\n *\r\n * @param db - The database instance to obtain a reference for.\r\n * @param url - The Firebase URL at which the returned `Reference` will\r\n *   point.\r\n * @returns A `Reference` pointing to the provided\r\n *   Firebase URL.\r\n */\r\nfunction refFromURL(db, url) {\r\n    db = getModularInstance(db);\r\n    db._checkNotDeleted('refFromURL');\r\n    const parsedURL = parseRepoInfo(url, db._repo.repoInfo_.nodeAdmin);\r\n    validateUrl('refFromURL', parsedURL);\r\n    const repoInfo = parsedURL.repoInfo;\r\n    if (!db._repo.repoInfo_.isCustomHost() &&\r\n        repoInfo.host !== db._repo.repoInfo_.host) {\r\n        fatal('refFromURL' +\r\n            ': Host name does not match the current database: ' +\r\n            '(found ' +\r\n            repoInfo.host +\r\n            ' but expected ' +\r\n            db._repo.repoInfo_.host +\r\n            ')');\r\n    }\r\n    return ref(db, parsedURL.path.toString());\r\n}\r\n/**\r\n * Gets a `Reference` for the location at the specified relative path.\r\n *\r\n * The relative path can either be a simple child name (for example, \"ada\") or\r\n * a deeper slash-separated path (for example, \"ada/name/first\").\r\n *\r\n * @param parent - The parent location.\r\n * @param path - A relative path from this location to the desired child\r\n *   location.\r\n * @returns The specified child location.\r\n */\r\nfunction child(parent, path) {\r\n    parent = getModularInstance(parent);\r\n    if (pathGetFront(parent._path) === null) {\r\n        validateRootPathString('child', 'path', path, false);\r\n    }\r\n    else {\r\n        validatePathString('child', 'path', path, false);\r\n    }\r\n    return new ReferenceImpl(parent._repo, pathChild(parent._path, path));\r\n}\r\n/**\r\n * Returns an `OnDisconnect` object - see\r\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\r\n * for more information on how to use it.\r\n *\r\n * @param ref - The reference to add OnDisconnect triggers for.\r\n */\r\nfunction onDisconnect(ref) {\r\n    ref = getModularInstance(ref);\r\n    return new OnDisconnect(ref._repo, ref._path);\r\n}\r\n/**\r\n * Generates a new child location using a unique key and returns its\r\n * `Reference`.\r\n *\r\n * This is the most common pattern for adding data to a collection of items.\r\n *\r\n * If you provide a value to `push()`, the value is written to the\r\n * generated location. If you don't pass a value, nothing is written to the\r\n * database and the child remains empty (but you can use the `Reference`\r\n * elsewhere).\r\n *\r\n * The unique keys generated by `push()` are ordered by the current time, so the\r\n * resulting list of items is chronologically sorted. The keys are also\r\n * designed to be unguessable (they contain 72 random bits of entropy).\r\n *\r\n * See {@link https://firebase.google.com/docs/database/web/lists-of-data#append_to_a_list_of_data | Append to a list of data}.\r\n * See {@link https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html | The 2^120 Ways to Ensure Unique Identifiers}.\r\n *\r\n * @param parent - The parent location.\r\n * @param value - Optional value to be written at the generated location.\r\n * @returns Combined `Promise` and `Reference`; resolves when write is complete,\r\n * but can be used immediately as the `Reference` to the child location.\r\n */\r\nfunction push(parent, value) {\r\n    parent = getModularInstance(parent);\r\n    validateWritablePath('push', parent._path);\r\n    validateFirebaseDataArg('push', value, parent._path, true);\r\n    const now = repoServerTime(parent._repo);\r\n    const name = nextPushId(now);\r\n    // push() returns a ThennableReference whose promise is fulfilled with a\r\n    // regular Reference. We use child() to create handles to two different\r\n    // references. The first is turned into a ThennableReference below by adding\r\n    // then() and catch() methods and is used as the return value of push(). The\r\n    // second remains a regular Reference and is used as the fulfilled value of\r\n    // the first ThennableReference.\r\n    const thennablePushRef = child(parent, name);\r\n    const pushRef = child(parent, name);\r\n    let promise;\r\n    if (value != null) {\r\n        promise = set(pushRef, value).then(() => 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    return thennablePushRef;\r\n}\r\n/**\r\n * Removes the data at this Database location.\r\n *\r\n * Any data at child locations will also be deleted.\r\n *\r\n * The effect of the remove will be visible immediately and the corresponding\r\n * event 'value' will be triggered. Synchronization of the remove to the\r\n * Firebase servers will also be started, and the returned Promise will resolve\r\n * when complete. If provided, the onComplete callback will be called\r\n * asynchronously after synchronization has finished.\r\n *\r\n * @param ref - The location to remove.\r\n * @returns Resolves when remove on server is complete.\r\n */\r\nfunction remove(ref) {\r\n    validateWritablePath('remove', ref._path);\r\n    return set(ref, null);\r\n}\r\n/**\r\n * Writes data to this Database location.\r\n *\r\n * This will overwrite any data at this location and all child locations.\r\n *\r\n * The effect of the write will be visible immediately, and the corresponding\r\n * events (\"value\", \"child_added\", etc.) will be triggered. Synchronization of\r\n * the data to the Firebase servers will also be started, and the returned\r\n * Promise will resolve when complete. If provided, the `onComplete` callback\r\n * will be called asynchronously after synchronization has finished.\r\n *\r\n * Passing `null` for the new value is equivalent to calling `remove()`; namely,\r\n * all data at this location and all child locations will be deleted.\r\n *\r\n * `set()` will remove any priority stored at this location, so if priority is\r\n * meant to be preserved, you need to use `setWithPriority()` instead.\r\n *\r\n * Note that modifying data with `set()` will cancel any pending transactions\r\n * at that location, so extreme care should be taken if mixing `set()` and\r\n * `transaction()` to modify the same data.\r\n *\r\n * A single `set()` will generate a single \"value\" event at the location where\r\n * the `set()` was performed.\r\n *\r\n * @param ref - The location to write to.\r\n * @param value - The value to be written (string, number, boolean, object,\r\n *   array, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction set(ref, value) {\r\n    ref = getModularInstance(ref);\r\n    validateWritablePath('set', ref._path);\r\n    validateFirebaseDataArg('set', value, ref._path, false);\r\n    const deferred = new Deferred();\r\n    repoSetWithPriority(ref._repo, ref._path, value, \r\n    /*priority=*/ null, deferred.wrapCallback(() => { }));\r\n    return deferred.promise;\r\n}\r\n/**\r\n * Sets a priority for the data at this Database location.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\r\n * ).\r\n *\r\n * @param ref - The location to write to.\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction setPriority(ref, priority) {\r\n    ref = getModularInstance(ref);\r\n    validateWritablePath('setPriority', ref._path);\r\n    validatePriority('setPriority', priority, false);\r\n    const deferred = new Deferred();\r\n    repoSetWithPriority(ref._repo, pathChild(ref._path, '.priority'), priority, null, deferred.wrapCallback(() => { }));\r\n    return deferred.promise;\r\n}\r\n/**\r\n * Writes data the Database location. Like `set()` but also specifies the\r\n * priority for that data.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\r\n * ).\r\n *\r\n * @param ref - The location to write to.\r\n * @param value - The value to be written (string, number, boolean, object,\r\n *   array, or null).\r\n * @param priority - The priority to be written (string, number, or null).\r\n * @returns Resolves when write to server is complete.\r\n */\r\nfunction setWithPriority(ref, value, priority) {\r\n    validateWritablePath('setWithPriority', ref._path);\r\n    validateFirebaseDataArg('setWithPriority', value, ref._path, false);\r\n    validatePriority('setWithPriority', priority, false);\r\n    if (ref.key === '.length' || ref.key === '.keys') {\r\n        throw 'setWithPriority failed: ' + ref.key + ' is a read-only object.';\r\n    }\r\n    const deferred = new Deferred();\r\n    repoSetWithPriority(ref._repo, ref._path, value, priority, deferred.wrapCallback(() => { }));\r\n    return deferred.promise;\r\n}\r\n/**\r\n * Writes multiple values to the Database at once.\r\n *\r\n * The `values` argument contains multiple property-value pairs that will be\r\n * written to the Database together. Each child property can either be a simple\r\n * property (for example, \"name\") or a relative path (for example,\r\n * \"name/first\") from the current location to the data to update.\r\n *\r\n * As opposed to the `set()` method, `update()` can be use to selectively update\r\n * only the referenced properties at the current location (instead of replacing\r\n * all the child properties at the current location).\r\n *\r\n * The effect of the write will be visible immediately, and the corresponding\r\n * events ('value', 'child_added', etc.) will be triggered. Synchronization of\r\n * the data to the Firebase servers will also be started, and the returned\r\n * Promise will resolve when complete. If provided, the `onComplete` callback\r\n * will be called asynchronously after synchronization has finished.\r\n *\r\n * A single `update()` will generate a single \"value\" event at the location\r\n * where the `update()` was performed, regardless of how many children were\r\n * modified.\r\n *\r\n * Note that modifying data with `update()` will cancel any pending\r\n * transactions at that location, so extreme care should be taken if mixing\r\n * `update()` and `transaction()` to modify the same data.\r\n *\r\n * Passing `null` to `update()` will remove the data at this location.\r\n *\r\n * See\r\n * {@link https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html | Introducing multi-location updates and more}.\r\n *\r\n * @param ref - The location to write to.\r\n * @param values - Object containing multiple values.\r\n * @returns Resolves when update on server is complete.\r\n */\r\nfunction update(ref, values) {\r\n    validateFirebaseMergeDataArg('update', values, ref._path, false);\r\n    const deferred = new Deferred();\r\n    repoUpdate(ref._repo, ref._path, values, deferred.wrapCallback(() => { }));\r\n    return deferred.promise;\r\n}\r\n/**\r\n * Gets the most up-to-date result for this query.\r\n *\r\n * @param query - The query to run.\r\n * @returns A `Promise` which resolves to the resulting DataSnapshot if a value is\r\n * available, or rejects if the client is unable to return a value (e.g., if the\r\n * server is unreachable and there is nothing cached).\r\n */\r\nfunction get(query) {\r\n    query = getModularInstance(query);\r\n    const callbackContext = new CallbackContext(() => { });\r\n    const container = new ValueEventRegistration(callbackContext);\r\n    return repoGetValue(query._repo, query, container).then(node => {\r\n        return new DataSnapshot(node, new ReferenceImpl(query._repo, query._path), query._queryParams.getIndex());\r\n    });\r\n}\r\n/**\r\n * Represents registration for 'value' events.\r\n */\r\nclass ValueEventRegistration {\r\n    constructor(callbackContext) {\r\n        this.callbackContext = callbackContext;\r\n    }\r\n    respondsTo(eventType) {\r\n        return eventType === 'value';\r\n    }\r\n    createEvent(change, query) {\r\n        const index = query._queryParams.getIndex();\r\n        return new DataEvent('value', this, new DataSnapshot(change.snapshotNode, new ReferenceImpl(query._repo, query._path), index));\r\n    }\r\n    getEventRunner(eventData) {\r\n        if (eventData.getEventType() === 'cancel') {\r\n            return () => this.callbackContext.onCancel(eventData.error);\r\n        }\r\n        else {\r\n            return () => this.callbackContext.onValue(eventData.snapshot, null);\r\n        }\r\n    }\r\n    createCancelEvent(error, path) {\r\n        if (this.callbackContext.hasCancelCallback) {\r\n            return new CancelEvent(this, error, path);\r\n        }\r\n        else {\r\n            return null;\r\n        }\r\n    }\r\n    matches(other) {\r\n        if (!(other instanceof ValueEventRegistration)) {\r\n            return false;\r\n        }\r\n        else if (!other.callbackContext || !this.callbackContext) {\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.callbackContext.matches(this.callbackContext);\r\n        }\r\n    }\r\n    hasAnyCallback() {\r\n        return this.callbackContext !== null;\r\n    }\r\n}\r\n/**\r\n * Represents the registration of a child_x event.\r\n */\r\nclass ChildEventRegistration {\r\n    constructor(eventType, callbackContext) {\r\n        this.eventType = eventType;\r\n        this.callbackContext = callbackContext;\r\n    }\r\n    respondsTo(eventType) {\r\n        let eventToCheck = eventType === 'children_added' ? 'child_added' : eventType;\r\n        eventToCheck =\r\n            eventToCheck === 'children_removed' ? 'child_removed' : eventToCheck;\r\n        return this.eventType === eventToCheck;\r\n    }\r\n    createCancelEvent(error, path) {\r\n        if (this.callbackContext.hasCancelCallback) {\r\n            return new CancelEvent(this, error, path);\r\n        }\r\n        else {\r\n            return null;\r\n        }\r\n    }\r\n    createEvent(change, query) {\r\n        assert(change.childName != null, 'Child events should have a childName.');\r\n        const childRef = child(new ReferenceImpl(query._repo, query._path), change.childName);\r\n        const index = query._queryParams.getIndex();\r\n        return new DataEvent(change.type, this, new DataSnapshot(change.snapshotNode, childRef, index), change.prevName);\r\n    }\r\n    getEventRunner(eventData) {\r\n        if (eventData.getEventType() === 'cancel') {\r\n            return () => this.callbackContext.onCancel(eventData.error);\r\n        }\r\n        else {\r\n            return () => this.callbackContext.onValue(eventData.snapshot, eventData.prevName);\r\n        }\r\n    }\r\n    matches(other) {\r\n        if (other instanceof ChildEventRegistration) {\r\n            return (this.eventType === other.eventType &&\r\n                (!this.callbackContext ||\r\n                    !other.callbackContext ||\r\n                    this.callbackContext.matches(other.callbackContext)));\r\n        }\r\n        return false;\r\n    }\r\n    hasAnyCallback() {\r\n        return !!this.callbackContext;\r\n    }\r\n}\r\nfunction addEventListener(query, eventType, callback, cancelCallbackOrListenOptions, options) {\r\n    let cancelCallback;\r\n    if (typeof cancelCallbackOrListenOptions === 'object') {\r\n        cancelCallback = undefined;\r\n        options = cancelCallbackOrListenOptions;\r\n    }\r\n    if (typeof cancelCallbackOrListenOptions === 'function') {\r\n        cancelCallback = cancelCallbackOrListenOptions;\r\n    }\r\n    if (options && options.onlyOnce) {\r\n        const userCallback = callback;\r\n        const onceCallback = (dataSnapshot, previousChildName) => {\r\n            repoRemoveEventCallbackForQuery(query._repo, query, container);\r\n            userCallback(dataSnapshot, previousChildName);\r\n        };\r\n        onceCallback.userCallback = callback.userCallback;\r\n        onceCallback.context = callback.context;\r\n        callback = onceCallback;\r\n    }\r\n    const callbackContext = new CallbackContext(callback, cancelCallback || undefined);\r\n    const container = eventType === 'value'\r\n        ? new ValueEventRegistration(callbackContext)\r\n        : new ChildEventRegistration(eventType, callbackContext);\r\n    repoAddEventCallbackForQuery(query._repo, query, container);\r\n    return () => repoRemoveEventCallbackForQuery(query._repo, query, container);\r\n}\r\nfunction onValue(query, callback, cancelCallbackOrListenOptions, options) {\r\n    return addEventListener(query, 'value', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildAdded(query, callback, cancelCallbackOrListenOptions, options) {\r\n    return addEventListener(query, 'child_added', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildChanged(query, callback, cancelCallbackOrListenOptions, options) {\r\n    return addEventListener(query, 'child_changed', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildMoved(query, callback, cancelCallbackOrListenOptions, options) {\r\n    return addEventListener(query, 'child_moved', callback, cancelCallbackOrListenOptions, options);\r\n}\r\nfunction onChildRemoved(query, callback, cancelCallbackOrListenOptions, options) {\r\n    return addEventListener(query, 'child_removed', callback, cancelCallbackOrListenOptions, options);\r\n}\r\n/**\r\n * Detaches a callback previously attached with the corresponding `on*()` (`onValue`, `onChildAdded`) listener.\r\n * Note: This is not the recommended way to remove a listener. Instead, please use the returned callback function from\r\n * the respective `on*` callbacks.\r\n *\r\n * Detach a callback previously attached with `on*()`. Calling `off()` on a parent listener\r\n * will not automatically remove listeners registered on child nodes, `off()`\r\n * must also be called on any child listeners to remove the callback.\r\n *\r\n * If a callback is not specified, all callbacks for the specified eventType\r\n * will be removed. Similarly, if no eventType is specified, all callbacks\r\n * for the `Reference` will be removed.\r\n *\r\n * Individual listeners can also be removed by invoking their unsubscribe\r\n * callbacks.\r\n *\r\n * @param query - The query that the listener was registered with.\r\n * @param eventType - One of the following strings: \"value\", \"child_added\",\r\n * \"child_changed\", \"child_removed\", or \"child_moved.\" If omitted, all callbacks\r\n * for the `Reference` will be removed.\r\n * @param callback - The callback function that was passed to `on()` or\r\n * `undefined` to remove all callbacks.\r\n */\r\nfunction off(query, eventType, callback) {\r\n    let container = null;\r\n    const expCallback = callback ? new CallbackContext(callback) : null;\r\n    if (eventType === 'value') {\r\n        container = new ValueEventRegistration(expCallback);\r\n    }\r\n    else if (eventType) {\r\n        container = new ChildEventRegistration(eventType, expCallback);\r\n    }\r\n    repoRemoveEventCallbackForQuery(query._repo, query, container);\r\n}\r\n/**\r\n * A `QueryConstraint` is used to narrow the set of documents returned by a\r\n * Database query. `QueryConstraint`s are created by invoking {@link endAt},\r\n * {@link endBefore}, {@link startAt}, {@link startAfter}, {@link\r\n * limitToFirst}, {@link limitToLast}, {@link orderByChild},\r\n * {@link orderByChild}, {@link orderByKey} , {@link orderByPriority} ,\r\n * {@link orderByValue}  or {@link equalTo} and\r\n * can then be passed to {@link query} to create a new query instance that\r\n * also contains this `QueryConstraint`.\r\n */\r\nclass QueryConstraint {\r\n}\r\nclass QueryEndAtConstraint extends QueryConstraint {\r\n    constructor(_value, _key) {\r\n        super();\r\n        this._value = _value;\r\n        this._key = _key;\r\n        this.type = 'endAt';\r\n    }\r\n    _apply(query) {\r\n        validateFirebaseDataArg('endAt', this._value, query._path, true);\r\n        const newParams = queryParamsEndAt(query._queryParams, this._value, this._key);\r\n        validateLimit(newParams);\r\n        validateQueryEndpoints(newParams);\r\n        if (query._queryParams.hasEnd()) {\r\n            throw new Error('endAt: Starting point was already set (by another call to endAt, ' +\r\n                'endBefore or equalTo).');\r\n        }\r\n        return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n    }\r\n}\r\n/**\r\n * Creates a `QueryConstraint` with the specified ending point.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The ending point is inclusive, so children with exactly the specified value\r\n * will be included in the query. The optional key argument can be used to\r\n * further limit the range of the query. If it is specified, then children that\r\n * have exactly the specified value must also have a key name less than or equal\r\n * to the specified key.\r\n *\r\n * You can read more about `endAt()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to end at. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to end at, among the children with the previously\r\n * specified priority. This argument is only allowed if ordering by child,\r\n * value, or priority.\r\n */\r\nfunction endAt(value, key) {\r\n    validateKey('endAt', 'key', key, true);\r\n    return new QueryEndAtConstraint(value, key);\r\n}\r\nclass QueryEndBeforeConstraint extends QueryConstraint {\r\n    constructor(_value, _key) {\r\n        super();\r\n        this._value = _value;\r\n        this._key = _key;\r\n        this.type = 'endBefore';\r\n    }\r\n    _apply(query) {\r\n        validateFirebaseDataArg('endBefore', this._value, query._path, false);\r\n        const newParams = queryParamsEndBefore(query._queryParams, this._value, this._key);\r\n        validateLimit(newParams);\r\n        validateQueryEndpoints(newParams);\r\n        if (query._queryParams.hasEnd()) {\r\n            throw new Error('endBefore: Starting point was already set (by another call to endAt, ' +\r\n                'endBefore or equalTo).');\r\n        }\r\n        return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n    }\r\n}\r\n/**\r\n * Creates a `QueryConstraint` with the specified ending point (exclusive).\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The ending point is exclusive. If only a value is provided, children\r\n * with a value less than the specified value will be included in the query.\r\n * If a key is specified, then children must have a value less than or equal\r\n * to the specified value and a key name less than the specified key.\r\n *\r\n * @param value - The value to end before. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to end before, among the children with the\r\n * previously specified priority. This argument is only allowed if ordering by\r\n * child, value, or priority.\r\n */\r\nfunction endBefore(value, key) {\r\n    validateKey('endBefore', 'key', key, true);\r\n    return new QueryEndBeforeConstraint(value, key);\r\n}\r\nclass QueryStartAtConstraint extends QueryConstraint {\r\n    constructor(_value, _key) {\r\n        super();\r\n        this._value = _value;\r\n        this._key = _key;\r\n        this.type = 'startAt';\r\n    }\r\n    _apply(query) {\r\n        validateFirebaseDataArg('startAt', this._value, query._path, true);\r\n        const newParams = queryParamsStartAt(query._queryParams, this._value, this._key);\r\n        validateLimit(newParams);\r\n        validateQueryEndpoints(newParams);\r\n        if (query._queryParams.hasStart()) {\r\n            throw new Error('startAt: Starting point was already set (by another call to startAt, ' +\r\n                'startBefore or equalTo).');\r\n        }\r\n        return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n    }\r\n}\r\n/**\r\n * Creates a `QueryConstraint` with the specified starting point.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The starting point is inclusive, so children with exactly the specified value\r\n * will be included in the query. The optional key argument can be used to\r\n * further limit the range of the query. If it is specified, then children that\r\n * have exactly the specified value must also have a key name greater than or\r\n * equal to the specified key.\r\n *\r\n * You can read more about `startAt()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to start at. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start at. This argument is only allowed if\r\n * ordering by child, value, or priority.\r\n */\r\nfunction startAt(value = null, key) {\r\n    validateKey('startAt', 'key', key, true);\r\n    return new QueryStartAtConstraint(value, key);\r\n}\r\nclass QueryStartAfterConstraint extends QueryConstraint {\r\n    constructor(_value, _key) {\r\n        super();\r\n        this._value = _value;\r\n        this._key = _key;\r\n        this.type = 'startAfter';\r\n    }\r\n    _apply(query) {\r\n        validateFirebaseDataArg('startAfter', this._value, query._path, false);\r\n        const newParams = queryParamsStartAfter(query._queryParams, this._value, this._key);\r\n        validateLimit(newParams);\r\n        validateQueryEndpoints(newParams);\r\n        if (query._queryParams.hasStart()) {\r\n            throw new Error('startAfter: Starting point was already set (by another call to startAt, ' +\r\n                'startAfter, or equalTo).');\r\n        }\r\n        return new QueryImpl(query._repo, query._path, newParams, query._orderByCalled);\r\n    }\r\n}\r\n/**\r\n * Creates a `QueryConstraint` with the specified starting point (exclusive).\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The starting point is exclusive. If only a value is provided, children\r\n * with a value greater than the specified value will be included in the query.\r\n * If a key is specified, then children must have a value greater than or equal\r\n * to the specified value and a a key name greater than the specified key.\r\n *\r\n * @param value - The value to start after. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start after. This argument is only allowed if\r\n * ordering by child, value, or priority.\r\n */\r\nfunction startAfter(value, key) {\r\n    validateKey('startAfter', 'key', key, true);\r\n    return new QueryStartAfterConstraint(value, key);\r\n}\r\nclass QueryLimitToFirstConstraint extends QueryConstraint {\r\n    constructor(_limit) {\r\n        super();\r\n        this._limit = _limit;\r\n        this.type = 'limitToFirst';\r\n    }\r\n    _apply(query) {\r\n        if (query._queryParams.hasLimit()) {\r\n            throw new Error('limitToFirst: Limit was already set (by another call to limitToFirst ' +\r\n                'or limitToLast).');\r\n        }\r\n        return new QueryImpl(query._repo, query._path, queryParamsLimitToFirst(query._queryParams, this._limit), query._orderByCalled);\r\n    }\r\n}\r\n/**\r\n * Creates a new `QueryConstraint` that if limited to the first specific number\r\n * of children.\r\n *\r\n * The `limitToFirst()` method is used to set a maximum number of children to be\r\n * synced for a given callback. If we set a limit of 100, we will initially only\r\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\r\n * stored in our Database, a `child_added` event will fire for each message.\r\n * However, if we have over 100 messages, we will only receive a `child_added`\r\n * event for the first 100 ordered messages. As items change, we will receive\r\n * `child_removed` events for each item that drops out of the active list so\r\n * that the total number stays at 100.\r\n *\r\n * You can read more about `limitToFirst()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param limit - The maximum number of nodes to include in this query.\r\n */\r\nfunction limitToFirst(limit) {\r\n    if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\r\n        throw new Error('limitToFirst: First argument must be a positive integer.');\r\n    }\r\n    return new QueryLimitToFirstConstraint(limit);\r\n}\r\nclass QueryLimitToLastConstraint extends QueryConstraint {\r\n    constructor(_limit) {\r\n        super();\r\n        this._limit = _limit;\r\n        this.type = 'limitToLast';\r\n    }\r\n    _apply(query) {\r\n        if (query._queryParams.hasLimit()) {\r\n            throw new Error('limitToLast: Limit was already set (by another call to limitToFirst ' +\r\n                'or limitToLast).');\r\n        }\r\n        return new QueryImpl(query._repo, query._path, queryParamsLimitToLast(query._queryParams, this._limit), query._orderByCalled);\r\n    }\r\n}\r\n/**\r\n * Creates a new `QueryConstraint` that is limited to return only the last\r\n * specified number of children.\r\n *\r\n * The `limitToLast()` method is used to set a maximum number of children to be\r\n * synced for a given callback. If we set a limit of 100, we will initially only\r\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\r\n * stored in our Database, a `child_added` event will fire for each message.\r\n * However, if we have over 100 messages, we will only receive a `child_added`\r\n * event for the last 100 ordered messages. As items change, we will receive\r\n * `child_removed` events for each item that drops out of the active list so\r\n * that the total number stays at 100.\r\n *\r\n * You can read more about `limitToLast()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param limit - The maximum number of nodes to include in this query.\r\n */\r\nfunction limitToLast(limit) {\r\n    if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\r\n        throw new Error('limitToLast: First argument must be a positive integer.');\r\n    }\r\n    return new QueryLimitToLastConstraint(limit);\r\n}\r\nclass QueryOrderByChildConstraint extends QueryConstraint {\r\n    constructor(_path) {\r\n        super();\r\n        this._path = _path;\r\n        this.type = 'orderByChild';\r\n    }\r\n    _apply(query) {\r\n        validateNoPreviousOrderByCall(query, 'orderByChild');\r\n        const parsedPath = new Path(this._path);\r\n        if (pathIsEmpty(parsedPath)) {\r\n            throw new Error('orderByChild: cannot pass in empty path. Use orderByValue() instead.');\r\n        }\r\n        const index = new PathIndex(parsedPath);\r\n        const newParams = queryParamsOrderBy(query._queryParams, index);\r\n        validateQueryEndpoints(newParams);\r\n        return new QueryImpl(query._repo, query._path, newParams, \r\n        /*orderByCalled=*/ true);\r\n    }\r\n}\r\n/**\r\n * Creates a new `QueryConstraint` that orders by the specified child key.\r\n *\r\n * Queries can only order by one key at a time. Calling `orderByChild()`\r\n * multiple times on the same query is an error.\r\n *\r\n * Firebase queries allow you to order your data by any child key on the fly.\r\n * However, if you know in advance what your indexes will be, you can define\r\n * them via the .indexOn rule in your Security Rules for better performance. See\r\n * the{@link https://firebase.google.com/docs/database/security/indexing-data}\r\n * rule for more information.\r\n *\r\n * You can read more about `orderByChild()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n *\r\n * @param path - The path to order by.\r\n */\r\nfunction orderByChild(path) {\r\n    if (path === '$key') {\r\n        throw new Error('orderByChild: \"$key\" is invalid.  Use orderByKey() instead.');\r\n    }\r\n    else if (path === '$priority') {\r\n        throw new Error('orderByChild: \"$priority\" is invalid.  Use orderByPriority() instead.');\r\n    }\r\n    else if (path === '$value') {\r\n        throw new Error('orderByChild: \"$value\" is invalid.  Use orderByValue() instead.');\r\n    }\r\n    validatePathString('orderByChild', 'path', path, false);\r\n    return new QueryOrderByChildConstraint(path);\r\n}\r\nclass QueryOrderByKeyConstraint extends QueryConstraint {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.type = 'orderByKey';\r\n    }\r\n    _apply(query) {\r\n        validateNoPreviousOrderByCall(query, 'orderByKey');\r\n        const newParams = queryParamsOrderBy(query._queryParams, KEY_INDEX);\r\n        validateQueryEndpoints(newParams);\r\n        return new QueryImpl(query._repo, query._path, newParams, \r\n        /*orderByCalled=*/ true);\r\n    }\r\n}\r\n/**\r\n * Creates a new `QueryConstraint` that orders by the key.\r\n *\r\n * Sorts the results of a query by their (ascending) key values.\r\n *\r\n * You can read more about `orderByKey()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n */\r\nfunction orderByKey() {\r\n    return new QueryOrderByKeyConstraint();\r\n}\r\nclass QueryOrderByPriorityConstraint extends QueryConstraint {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.type = 'orderByPriority';\r\n    }\r\n    _apply(query) {\r\n        validateNoPreviousOrderByCall(query, 'orderByPriority');\r\n        const newParams = queryParamsOrderBy(query._queryParams, PRIORITY_INDEX);\r\n        validateQueryEndpoints(newParams);\r\n        return new QueryImpl(query._repo, query._path, newParams, \r\n        /*orderByCalled=*/ true);\r\n    }\r\n}\r\n/**\r\n * Creates a new `QueryConstraint` that orders by priority.\r\n *\r\n * Applications need not use priority but can order collections by\r\n * ordinary properties (see\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}\r\n * for alternatives to priority.\r\n */\r\nfunction orderByPriority() {\r\n    return new QueryOrderByPriorityConstraint();\r\n}\r\nclass QueryOrderByValueConstraint extends QueryConstraint {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.type = 'orderByValue';\r\n    }\r\n    _apply(query) {\r\n        validateNoPreviousOrderByCall(query, 'orderByValue');\r\n        const newParams = queryParamsOrderBy(query._queryParams, VALUE_INDEX);\r\n        validateQueryEndpoints(newParams);\r\n        return new QueryImpl(query._repo, query._path, newParams, \r\n        /*orderByCalled=*/ true);\r\n    }\r\n}\r\n/**\r\n * Creates a new `QueryConstraint` that orders by value.\r\n *\r\n * If the children of a query are all scalar values (string, number, or\r\n * boolean), you can order the results by their (ascending) values.\r\n *\r\n * You can read more about `orderByValue()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\r\n */\r\nfunction orderByValue() {\r\n    return new QueryOrderByValueConstraint();\r\n}\r\nclass QueryEqualToValueConstraint extends QueryConstraint {\r\n    constructor(_value, _key) {\r\n        super();\r\n        this._value = _value;\r\n        this._key = _key;\r\n        this.type = 'equalTo';\r\n    }\r\n    _apply(query) {\r\n        validateFirebaseDataArg('equalTo', this._value, query._path, false);\r\n        if (query._queryParams.hasStart()) {\r\n            throw new Error('equalTo: Starting point was already set (by another call to startAt/startAfter or ' +\r\n                'equalTo).');\r\n        }\r\n        if (query._queryParams.hasEnd()) {\r\n            throw new Error('equalTo: Ending point was already set (by another call to endAt/endBefore or ' +\r\n                'equalTo).');\r\n        }\r\n        return new QueryEndAtConstraint(this._value, this._key)._apply(new QueryStartAtConstraint(this._value, this._key)._apply(query));\r\n    }\r\n}\r\n/**\r\n * Creates a `QueryConstraint` that includes children that match the specified\r\n * value.\r\n *\r\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\r\n * allows you to choose arbitrary starting and ending points for your queries.\r\n *\r\n * The optional key argument can be used to further limit the range of the\r\n * query. If it is specified, then children that have exactly the specified\r\n * value must also have exactly the specified key as their key name. This can be\r\n * used to filter result sets with many matches for the same value.\r\n *\r\n * You can read more about `equalTo()` in\r\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\r\n *\r\n * @param value - The value to match for. The argument type depends on which\r\n * `orderBy*()` function was used in this query. Specify a value that matches\r\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\r\n * value must be a string.\r\n * @param key - The child key to start at, among the children with the\r\n * previously specified priority. This argument is only allowed if ordering by\r\n * child, value, or priority.\r\n */\r\nfunction equalTo(value, key) {\r\n    validateKey('equalTo', 'key', key, true);\r\n    return new QueryEqualToValueConstraint(value, key);\r\n}\r\n/**\r\n * Creates a new immutable instance of `Query` that is extended to also include\r\n * additional query constraints.\r\n *\r\n * @param query - The Query instance to use as a base for the new constraints.\r\n * @param queryConstraints - The list of `QueryConstraint`s to apply.\r\n * @throws if any of the provided query constraints cannot be combined with the\r\n * existing or new constraints.\r\n */\r\nfunction query(query, ...queryConstraints) {\r\n    let queryImpl = getModularInstance(query);\r\n    for (const constraint of queryConstraints) {\r\n        queryImpl = constraint._apply(queryImpl);\r\n    }\r\n    return queryImpl;\r\n}\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\nsyncPointSetReferenceConstructor(ReferenceImpl);\r\nsyncTreeSetReferenceConstructor(ReferenceImpl);\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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 variable is also defined in the firebase Node.js Admin SDK. Before\r\n * modifying this definition, consult the definition in:\r\n *\r\n * https://github.com/firebase/firebase-admin-node\r\n *\r\n * and make sure the two are consistent.\r\n */\r\nconst FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST';\r\n/**\r\n * Creates and caches `Repo` instances.\r\n */\r\nconst repos = {};\r\n/**\r\n * If true, any new `Repo` will be created to use `ReadonlyRestClient` (for testing purposes).\r\n */\r\nlet useRestClient = false;\r\n/**\r\n * Update an existing `Repo` in place to point to a new host/port.\r\n */\r\nfunction repoManagerApplyEmulatorSettings(repo, host, port, tokenProvider) {\r\n    repo.repoInfo_ = new RepoInfo(`${host}:${port}`, \r\n    /* secure= */ false, repo.repoInfo_.namespace, repo.repoInfo_.webSocketOnly, repo.repoInfo_.nodeAdmin, repo.repoInfo_.persistenceKey, repo.repoInfo_.includeNamespaceInQueryParams, \r\n    /*isUsingEmulator=*/ true);\r\n    if (tokenProvider) {\r\n        repo.authTokenProvider_ = tokenProvider;\r\n    }\r\n}\r\n/**\r\n * This function should only ever be called to CREATE a new database instance.\r\n * @internal\r\n */\r\nfunction repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url, nodeAdmin) {\r\n    let dbUrl = url || app.options.databaseURL;\r\n    if (dbUrl === undefined) {\r\n        if (!app.options.projectId) {\r\n            fatal(\"Can't determine Firebase Database URL. Be sure to include \" +\r\n                ' a Project ID when calling firebase.initializeApp().');\r\n        }\r\n        log('Using default host for project ', app.options.projectId);\r\n        dbUrl = `${app.options.projectId}-default-rtdb.firebaseio.com`;\r\n    }\r\n    let parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\r\n    let repoInfo = parsedUrl.repoInfo;\r\n    let isEmulator;\r\n    let dbEmulatorHost = undefined;\r\n    if (typeof process !== 'undefined' && process.env) {\r\n        dbEmulatorHost = process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];\r\n    }\r\n    if (dbEmulatorHost) {\r\n        isEmulator = true;\r\n        dbUrl = `http://${dbEmulatorHost}?ns=${repoInfo.namespace}`;\r\n        parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\r\n        repoInfo = parsedUrl.repoInfo;\r\n    }\r\n    else {\r\n        isEmulator = !parsedUrl.repoInfo.secure;\r\n    }\r\n    const authTokenProvider = nodeAdmin && isEmulator\r\n        ? new EmulatorTokenProvider(EmulatorTokenProvider.OWNER)\r\n        : new FirebaseAuthTokenProvider(app.name, app.options, authProvider);\r\n    validateUrl('Invalid Firebase Database URL', parsedUrl);\r\n    if (!pathIsEmpty(parsedUrl.path)) {\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    const repo = repoManagerCreateRepo(repoInfo, app, authTokenProvider, new AppCheckTokenProvider(app.name, appCheckProvider));\r\n    return new Database(repo, app);\r\n}\r\n/**\r\n * Remove the repo and make sure it is disconnected.\r\n *\r\n */\r\nfunction repoManagerDeleteRepo(repo, appName) {\r\n    const appRepos = repos[appName];\r\n    // This should never happen...\r\n    if (!appRepos || appRepos[repo.key] !== repo) {\r\n        fatal(`Database ${appName}(${repo.repoInfo_}) has already been deleted.`);\r\n    }\r\n    repoInterrupt(repo);\r\n    delete appRepos[repo.key];\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 - The metadata about the Repo\r\n * @returns The Repo object for the specified server / repoName.\r\n */\r\nfunction repoManagerCreateRepo(repoInfo, app, authTokenProvider, appCheckProvider) {\r\n    let appRepos = repos[app.name];\r\n    if (!appRepos) {\r\n        appRepos = {};\r\n        repos[app.name] = appRepos;\r\n    }\r\n    let repo = 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, useRestClient, authTokenProvider, appCheckProvider);\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 */\r\nfunction repoManagerForceRestClient(forceRestClient) {\r\n    useRestClient = forceRestClient;\r\n}\r\n/**\r\n * Class representing a Firebase Realtime Database.\r\n */\r\nclass Database {\r\n    /** @hideconstructor */\r\n    constructor(_repoInternal, \r\n    /** The {@link @firebase/app#FirebaseApp} associated with this Realtime Database instance. */\r\n    app) {\r\n        this._repoInternal = _repoInternal;\r\n        this.app = app;\r\n        /** Represents a `Database` instance. */\r\n        this['type'] = 'database';\r\n        /** Track if the instance has been used (root or repo accessed) */\r\n        this._instanceStarted = false;\r\n    }\r\n    get _repo() {\r\n        if (!this._instanceStarted) {\r\n            repoStart(this._repoInternal, this.app.options.appId, this.app.options['databaseAuthVariableOverride']);\r\n            this._instanceStarted = true;\r\n        }\r\n        return this._repoInternal;\r\n    }\r\n    get _root() {\r\n        if (!this._rootInternal) {\r\n            this._rootInternal = new ReferenceImpl(this._repo, newEmptyPath());\r\n        }\r\n        return this._rootInternal;\r\n    }\r\n    _delete() {\r\n        if (this._rootInternal !== null) {\r\n            repoManagerDeleteRepo(this._repo, this.app.name);\r\n            this._repoInternal = null;\r\n            this._rootInternal = null;\r\n        }\r\n        return Promise.resolve();\r\n    }\r\n    _checkNotDeleted(apiName) {\r\n        if (this._rootInternal === null) {\r\n            fatal('Cannot call ' + apiName + ' on a deleted database.');\r\n        }\r\n    }\r\n}\r\nfunction checkTransportInit() {\r\n    if (TransportManager.IS_TRANSPORT_INITIALIZED) {\r\n        warn('Transport has already been initialized. Please call this function before calling ref or setting up a listener');\r\n    }\r\n}\r\n/**\r\n * Force the use of websockets instead of longPolling.\r\n */\r\nfunction forceWebSockets() {\r\n    checkTransportInit();\r\n    BrowserPollConnection.forceDisallow();\r\n}\r\n/**\r\n * Force the use of longPolling instead of websockets. This will be ignored if websocket protocol is used in databaseURL.\r\n */\r\nfunction forceLongPolling() {\r\n    checkTransportInit();\r\n    WebSocketConnection.forceDisallow();\r\n    BrowserPollConnection.forceAllow();\r\n}\r\n/**\r\n * Returns the instance of the Realtime Database SDK that is associated\r\n * with the provided {@link @firebase/app#FirebaseApp}. Initializes a new instance with\r\n * with default settings if no instance exists or if the existing instance uses\r\n * a custom database URL.\r\n *\r\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned Realtime\r\n * Database instance is associated with.\r\n * @param url - The URL of the Realtime Database instance to connect to. If not\r\n * provided, the SDK connects to the default instance of the Firebase App.\r\n * @returns The `Database` instance of the provided app.\r\n */\r\nfunction getDatabase(app = getApp(), url) {\r\n    const db = _getProvider(app, 'database').getImmediate({\r\n        identifier: url\r\n    });\r\n    if (!db._instanceStarted) {\r\n        const emulator = getDefaultEmulatorHostnameAndPort('database');\r\n        if (emulator) {\r\n            connectDatabaseEmulator(db, ...emulator);\r\n        }\r\n    }\r\n    return db;\r\n}\r\n/**\r\n * Modify the provided instance to communicate with the Realtime Database\r\n * emulator.\r\n *\r\n * <p>Note: This method must be called before performing any other operation.\r\n *\r\n * @param db - The instance to modify.\r\n * @param host - The emulator host (ex: localhost)\r\n * @param port - The emulator port (ex: 8080)\r\n * @param options.mockUserToken - the mock auth token to use for unit testing Security Rules\r\n */\r\nfunction connectDatabaseEmulator(db, host, port, options = {}) {\r\n    db = getModularInstance(db);\r\n    db._checkNotDeleted('useEmulator');\r\n    if (db._instanceStarted) {\r\n        fatal('Cannot call useEmulator() after instance has already been initialized.');\r\n    }\r\n    const repo = db._repoInternal;\r\n    let tokenProvider = undefined;\r\n    if (repo.repoInfo_.nodeAdmin) {\r\n        if (options.mockUserToken) {\r\n            fatal('mockUserToken is not supported by the Admin SDK. For client access with mock users, please use the \"firebase\" package instead of \"firebase-admin\".');\r\n        }\r\n        tokenProvider = new EmulatorTokenProvider(EmulatorTokenProvider.OWNER);\r\n    }\r\n    else if (options.mockUserToken) {\r\n        const token = typeof options.mockUserToken === 'string'\r\n            ? options.mockUserToken\r\n            : createMockUserToken(options.mockUserToken, db.app.options.projectId);\r\n        tokenProvider = new EmulatorTokenProvider(token);\r\n    }\r\n    // Modify the repo to apply emulator settings\r\n    repoManagerApplyEmulatorSettings(repo, host, port, tokenProvider);\r\n}\r\n/**\r\n * Disconnects from the server (all Database operations will be completed\r\n * offline).\r\n *\r\n * The client automatically maintains a persistent connection to the Database\r\n * server, which will remain active indefinitely and reconnect when\r\n * disconnected. However, the `goOffline()` and `goOnline()` methods may be used\r\n * to control the client connection in cases where a persistent connection is\r\n * undesirable.\r\n *\r\n * While offline, the client will no longer receive data updates from the\r\n * Database. However, all Database operations performed locally will continue to\r\n * immediately fire events, allowing your application to continue behaving\r\n * normally. Additionally, each operation performed locally will automatically\r\n * be queued and retried upon reconnection to the Database server.\r\n *\r\n * To reconnect to the Database and begin receiving remote events, see\r\n * `goOnline()`.\r\n *\r\n * @param db - The instance to disconnect.\r\n */\r\nfunction goOffline(db) {\r\n    db = getModularInstance(db);\r\n    db._checkNotDeleted('goOffline');\r\n    repoInterrupt(db._repo);\r\n}\r\n/**\r\n * Reconnects to the server and synchronizes the offline Database state\r\n * with the server state.\r\n *\r\n * This method should be used after disabling the active connection with\r\n * `goOffline()`. Once reconnected, the client will transmit the proper data\r\n * and fire the appropriate events so that your client \"catches up\"\r\n * automatically.\r\n *\r\n * @param db - The instance to reconnect.\r\n */\r\nfunction goOnline(db) {\r\n    db = getModularInstance(db);\r\n    db._checkNotDeleted('goOnline');\r\n    repoResume(db._repo);\r\n}\r\nfunction enableLogging(logger, persistent) {\r\n    enableLogging$1(logger, persistent);\r\n}\n\n/**\r\n * @license\r\n * Copyright 2021 Google LLC\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 registerDatabase(variant) {\r\n    setSDKVersion(SDK_VERSION$1);\r\n    _registerComponent(new Component('database', (container, { instanceIdentifier: url }) => {\r\n        const app = container.getProvider('app').getImmediate();\r\n        const authProvider = container.getProvider('auth-internal');\r\n        const appCheckProvider = container.getProvider('app-check-internal');\r\n        return repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url);\r\n    }, \"PUBLIC\" /* ComponentType.PUBLIC */).setMultipleInstances(true));\r\n    registerVersion(name, version, variant);\r\n    // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation\r\n    registerVersion(name, version, 'esm2017');\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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\nconst SERVER_TIMESTAMP = {\r\n    '.sv': 'timestamp'\r\n};\r\n/**\r\n * Returns a placeholder value for auto-populating the current timestamp (time\r\n * since the Unix epoch, in milliseconds) as determined by the Firebase\r\n * servers.\r\n */\r\nfunction serverTimestamp() {\r\n    return SERVER_TIMESTAMP;\r\n}\r\n/**\r\n * Returns a placeholder value that can be used to atomically increment the\r\n * current database value by the provided delta.\r\n *\r\n * @param delta - the amount to modify the current value atomically.\r\n * @returns A placeholder value for modifying data atomically server-side.\r\n */\r\nfunction increment(delta) {\r\n    return {\r\n        '.sv': {\r\n            'increment': delta\r\n        }\r\n    };\r\n}\n\n/**\r\n * @license\r\n * Copyright 2020 Google LLC\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 type for the resolve value of {@link runTransaction}.\r\n */\r\nclass TransactionResult {\r\n    /** @hideconstructor */\r\n    constructor(\r\n    /** Whether the transaction was successfully committed. */\r\n    committed, \r\n    /** The resulting data snapshot. */\r\n    snapshot) {\r\n        this.committed = committed;\r\n        this.snapshot = snapshot;\r\n    }\r\n    /** Returns a JSON-serializable representation of this object. */\r\n    toJSON() {\r\n        return { committed: this.committed, snapshot: this.snapshot.toJSON() };\r\n    }\r\n}\r\n/**\r\n * Atomically modifies the data at this location.\r\n *\r\n * Atomically modify the data at this location. Unlike a normal `set()`, which\r\n * just overwrites the data regardless of its previous value, `runTransaction()` is\r\n * used to modify the existing value to a new value, ensuring there are no\r\n * conflicts with other clients writing to the same location at the same time.\r\n *\r\n * To accomplish this, you pass `runTransaction()` an update function which is\r\n * used to transform the current value into a new value. If another client\r\n * writes to the location before your new value is successfully written, your\r\n * update function will be called again with the new current value, and the\r\n * write will be retried. This will happen repeatedly until your write succeeds\r\n * without conflict or you abort the transaction by not returning a value from\r\n * your update function.\r\n *\r\n * Note: Modifying data with `set()` will cancel any pending transactions at\r\n * that location, so extreme care should be taken if mixing `set()` and\r\n * `runTransaction()` to update the same data.\r\n *\r\n * Note: When using transactions with Security and Firebase Rules in place, be\r\n * aware that a client needs `.read` access in addition to `.write` access in\r\n * order to perform a transaction. This is because the client-side nature of\r\n * transactions requires the client to read the data in order to transactionally\r\n * update it.\r\n *\r\n * @param ref - The location to atomically modify.\r\n * @param transactionUpdate - A developer-supplied function which will be passed\r\n * the current data stored at this location (as a JavaScript object). The\r\n * function should return the new value it would like written (as a JavaScript\r\n * object). If `undefined` is returned (i.e. you return with no arguments) the\r\n * transaction will be aborted and the data at this location will not be\r\n * modified.\r\n * @param options - An options object to configure transactions.\r\n * @returns A `Promise` that can optionally be used instead of the `onComplete`\r\n * callback to handle success and failure.\r\n */\r\nfunction runTransaction(ref, \r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntransactionUpdate, options) {\r\n    var _a;\r\n    ref = getModularInstance(ref);\r\n    validateWritablePath('Reference.transaction', ref._path);\r\n    if (ref.key === '.length' || ref.key === '.keys') {\r\n        throw ('Reference.transaction failed: ' + ref.key + ' is a read-only object.');\r\n    }\r\n    const applyLocally = (_a = options === null || options === void 0 ? void 0 : options.applyLocally) !== null && _a !== void 0 ? _a : true;\r\n    const deferred = new Deferred();\r\n    const promiseComplete = (error, committed, node) => {\r\n        let dataSnapshot = null;\r\n        if (error) {\r\n            deferred.reject(error);\r\n        }\r\n        else {\r\n            dataSnapshot = new DataSnapshot(node, new ReferenceImpl(ref._repo, ref._path), PRIORITY_INDEX);\r\n            deferred.resolve(new TransactionResult(committed, dataSnapshot));\r\n        }\r\n    };\r\n    // Add a watch to make sure we get server updates.\r\n    const unwatcher = onValue(ref, () => { });\r\n    repoStartTransaction(ref._repo, ref._path, transactionUpdate, promiseComplete, unwatcher, applyLocally);\r\n    return deferred.promise;\r\n}\n\n/**\r\n * @license\r\n * Copyright 2017 Google LLC\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\nPersistentConnection;\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nPersistentConnection.prototype.simpleListen = function (pathString, onComplete) {\r\n    this.sendRequest('q', { p: pathString }, onComplete);\r\n};\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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\nConnection;\r\n/**\r\n * @internal\r\n */\r\nconst hijackHash = function (newHash) {\r\n    const oldPut = PersistentConnection.prototype.put;\r\n    PersistentConnection.prototype.put = function (pathString, data, onComplete, hash) {\r\n        if (hash !== undefined) {\r\n            hash = newHash();\r\n        }\r\n        oldPut.call(this, pathString, data, onComplete, hash);\r\n    };\r\n    return function () {\r\n        PersistentConnection.prototype.put = oldPut;\r\n    };\r\n};\r\nRepoInfo;\r\n/**\r\n * Forces the RepoManager to create Repos that use ReadonlyRestClient instead of PersistentConnection.\r\n * @internal\r\n */\r\nconst forceRestClient = function (forceRestClient) {\r\n    repoManagerForceRestClient(forceRestClient);\r\n};\n\n/**\r\n * @license\r\n * Copyright 2023 Google LLC\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 * Used by console to create a database based on the app,\r\n * passed database URL and a custom auth implementation.\r\n * @internal\r\n * @param app - A valid FirebaseApp-like object\r\n * @param url - A valid Firebase databaseURL\r\n * @param version - custom version e.g. firebase-admin version\r\n * @param customAppCheckImpl - custom app check implementation\r\n * @param customAuthImpl - custom auth implementation\r\n */\r\nfunction _initStandalone({ app, url, version, customAuthImpl, customAppCheckImpl, nodeAdmin = false }) {\r\n    setSDKVersion(version);\r\n    /**\r\n     * ComponentContainer('database-standalone') is just a placeholder that doesn't perform\r\n     * any actual function.\r\n     */\r\n    const componentContainer = new ComponentContainer('database-standalone');\r\n    const authProvider = new Provider('auth-internal', componentContainer);\r\n    let appCheckProvider;\r\n    if (customAppCheckImpl) {\r\n        appCheckProvider = new Provider('app-check-internal', componentContainer);\r\n        appCheckProvider.setComponent(new Component('app-check-internal', () => customAppCheckImpl, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n    }\r\n    authProvider.setComponent(new Component('auth-internal', () => customAuthImpl, \"PRIVATE\" /* ComponentType.PRIVATE */));\r\n    return repoManagerDatabaseFromApp(app, authProvider, appCheckProvider, url, nodeAdmin);\r\n}\n\n/**\r\n * Firebase Realtime Database\r\n *\r\n * @packageDocumentation\r\n */\r\nregisterDatabase();\n\nexport { DataSnapshot, Database, OnDisconnect, QueryConstraint, TransactionResult, QueryImpl as _QueryImpl, QueryParams as _QueryParams, ReferenceImpl as _ReferenceImpl, forceRestClient as _TEST_ACCESS_forceRestClient, hijackHash as _TEST_ACCESS_hijackHash, _initStandalone, repoManagerDatabaseFromApp as _repoManagerDatabaseFromApp, setSDKVersion as _setSDKVersion, validatePathString as _validatePathString, validateWritablePath as _validateWritablePath, child, connectDatabaseEmulator, enableLogging, endAt, endBefore, equalTo, forceLongPolling, forceWebSockets, get, getDatabase, goOffline, goOnline, increment, limitToFirst, limitToLast, off, onChildAdded, onChildChanged, onChildMoved, onChildRemoved, onDisconnect, onValue, orderByChild, orderByKey, orderByPriority, orderByValue, push, query, ref, refFromURL, remove, runTransaction, serverTimestamp, set, setPriority, setWithPriority, startAfter, startAt, update };\n//# sourceMappingURL=index.esm2017.js.map\n","import {\n  Analytics,\n  getAnalytics,\n  isSupported,\n  logEvent,\n} from \"firebase/analytics\";\nimport { FirebaseApp, initializeApp } from \"firebase/app\";\nimport {\n  child,\n  forceWebSockets,\n  getDatabase,\n  onValue,\n  ref,\n} from \"firebase/database\";\n\ntype MetersPerSecond = number;\ntype Degrees = number;\ntype Meters = number;\ntype BeatsPerMinute = number;\ntype Steps = number;\ntype Watts = number;\ntype Location = { latitude: Degrees; longitude: Degrees };\ntype PublicLocation = Location & { reportedAt: number };\ntype UUID = string;\n\nexport type ConnectionOptions = {\n  /**\n   * Forces Firebase Realtime Database to use WebSockets instead of falling back\n   * to long polling. This must be set before the first database listener is\n   * created.\n   */\n  forceWebSockets?: boolean;\n};\n\nexport function addLocationListener(\n  pullKey: string,\n  callback: (location: Location) => void,\n  options?: ConnectionOptions,\n) {\n  return forPullKey(pullKey, options).addLocationListener(callback);\n}\n\nexport function addSpeedListener(\n  pullKey: string,\n  callback: (speed: MetersPerSecond) => void,\n  options?: ConnectionOptions,\n) {\n  return forPullKey(pullKey, options).addSpeedListener(callback);\n}\n\nexport function addHeadingListener(\n  pullKey: string,\n  callback: (heading: Degrees) => void,\n  options?: ConnectionOptions,\n) {\n  return forPullKey(pullKey, options).addHeadingListener(callback);\n}\n\nexport function addAltitudeListener(\n  pullKey: string,\n  callback: (altitude: Meters) => void,\n  options?: ConnectionOptions,\n) {\n  return forPullKey(pullKey, options).addAltitudeListener(callback);\n}\n\nexport function addSessionIdListener(\n  pullKey: string,\n  callback: (sessionId: UUID | null) => void,\n  options?: ConnectionOptions,\n) {\n  return forPullKey(pullKey, options).addSessionIdListener(callback);\n}\n\n/** Creates a listener source for a streamer's private data with a pull key. */\nexport function forPullKey(pullKey: string, options?: ConnectionOptions) {\n  const app = getApp(options);\n  const db = getDatabase(app);\n  const analytics = getAnalytics(app);\n  const reference = child(ref(db, \"pullables\"), pullKey);\n  const safeLogEvent = (eventName: string, eventParams?: any) => {\n    isSupported()\n      .then((supported) => {\n        if (supported) {\n          logEvent(analytics, eventName, eventParams);\n        }\n      })\n      .catch(() => {});\n  };\n\n  return {\n    addLocationListener(callback: (location: Location) => void) {\n      safeLogEvent(\"listener\", { type: \"location\", pullKey });\n      return onValue(child(reference, \"location\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    addSpeedListener(callback: (speed: MetersPerSecond) => void) {\n      safeLogEvent(\"listener\", { type: \"speed\", pullKey });\n      return onValue(child(reference, \"speed\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    addHeadingListener(callback: (heading: Degrees) => void) {\n      safeLogEvent(\"listener\", { type: \"heading\", pullKey });\n      return onValue(child(reference, \"heading\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    addAltitudeListener(callback: (altitude: Meters) => void) {\n      safeLogEvent(\"listener\", { type: \"altitude\", pullKey });\n      return onValue(child(reference, \"altitude\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    addHeartRateListener(callback: (altitude: BeatsPerMinute) => void) {\n      safeLogEvent(\"listener\", { type: \"heartRate\", pullKey });\n      return onValue(child(reference, \"heartRate\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    addCyclingPowerListener(callback: (power: Watts) => void) {\n      safeLogEvent(\"listener\", { type: \"cyclingPower\", pullKey });\n      return onValue(child(reference, \"cyclingPower\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    addCyclingCrankListener(callback: (power: Watts) => void) {\n      safeLogEvent(\"listener\", { type: \"cyclingCrank\", pullKey });\n      return onValue(child(reference, \"cyclingCrank\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    addCyclingWheelListener(callback: (power: Watts) => void) {\n      safeLogEvent(\"listener\", { type: \"cyclingWheel\", pullKey });\n      return onValue(child(reference, \"cyclingWheel\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    /**\n     * This listener reports the number of steps taken so far. Note that this\n     * number does not reset when the streamer goes offline. It is up to the\n     * client to reset the number when the streamer goes offline or online.\n     * Instead, the number is reported as the total number of steps taken since\n     * an arbitrary point in time, and guaranteed to be monotonically increasing\n     * for a given session id.\n     */\n    addPedometerStepsListener(callback: (steps: Steps) => void) {\n      safeLogEvent(\"listener\", { type: \"pedometerSteps\", pullKey });\n      return onValue(child(reference, \"pedometerSteps\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n    /**\n     * This listener is useful for accessing unstructured data associated with\n     * the pull key. It includes the above fields as well as other fields such\n     * as bluetooth heart rate or telemetry data.\n     */\n    addListener(callback: (data: any) => void) {\n      safeLogEvent(\"listener\", { type: \"root\", pullKey });\n      return onValue(reference, (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"root\", pullKey });\n      });\n    },\n    /**\n     * This listener detects changes in the active session id. When a streamer\n     * goes online, a new session id is created and this listener is triggered.\n     * null sessionId's indicate the streamer is offline. Note that it is\n     * possible for two sequential non-null sessionIds to be sent.\n     */\n    addSessionIdListener(callback: (sessionId: UUID | null) => void) {\n      safeLogEvent(\"listener\", { type: \"sessionId\", pullKey });\n      return onValue(child(reference, \"sessionId\"), (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"sessionId\", pullKey });\n      });\n    },\n  };\n}\n\n/** Creates a listener source for a streamer's public data. */\nexport function forStreamer(\n  provider: \"twitch\",\n  userId: string,\n  options?: ConnectionOptions,\n) {\n  const app = getApp(options);\n  const db = getDatabase(app);\n  const analytics = getAnalytics(app);\n  const locationReference = child(\n    ref(db, \"locations\"),\n    `${provider}:${userId}`,\n  );\n  const safeLogEvent = (eventName: string, eventParams?: any) => {\n    isSupported()\n      .then((supported) => {\n        if (supported) {\n          logEvent(analytics, eventName, eventParams);\n        }\n      })\n      .catch(() => {});\n  };\n\n  return {\n    /** If the public location is hidden (eg streamer is offline), null is passed. */\n    addLocationListener(callback: (location: PublicLocation | null) => void) {\n      safeLogEvent(\"listener\", { type: \"location\", provider, userId });\n      return onValue(locationReference, (snapshot) => {\n        callback(snapshot.val());\n        safeLogEvent(\"data\", { type: \"location\", provider, userId });\n      });\n    },\n  };\n}\n\nlet app: FirebaseApp | null = null;\nlet forceWebSocketsApplied = false;\n\nfunction getApp(options?: ConnectionOptions) {\n  if (options?.forceWebSockets && !forceWebSocketsApplied) {\n    forceWebSockets();\n    forceWebSocketsApplied = true;\n  }\n\n  if (!app) {\n    app = initializeApp(\n      {\n        apiKey: \"AIzaSyC4L8ICZbJDufxe8bimRdB5cAulPCaYVQQ\",\n        databaseURL: \"https://rtirl-a1d7f-default-rtdb.firebaseio.com\",\n        projectId: \"rtirl-a1d7f\",\n        appId: \"1:684852107701:web:d77a8ed0ee5095279a61fc\",\n        measurementId: \"G-TR97D81LT3\",\n      },\n      \"rtirl-api\",\n    );\n  }\n  return app;\n}\n"],"names":["isValidKey","DEFAULT_ENTRY_NAME","version$1","logger","name$3","name$2","name$1","name","version","ERRORS","ERROR_FACTORY","SDK_VERSION","getApp","dbPromise","getDbPromise","getHeaders"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}