{"version":3,"file":"firebase-storage.js","sources":["../storage/dist/index.esm.js"],"sourcesContent":["import firebase from '@firebase/app';\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Constants used in the Firebase Storage library.\r\n */\r\n/**\r\n * Domain and scheme for API calls.\r\n */\r\nvar domainBase = 'https://firebasestorage.googleapis.com';\r\n/**\r\n * Domain and scheme for object downloads.\r\n */\r\nvar downloadBase = 'https://firebasestorage.googleapis.com';\r\n/**\r\n * Base URL for non-upload calls to the API.\r\n */\r\nvar apiBaseUrl = '/v0';\r\n/**\r\n * Base URL for upload calls to the API.\r\n */\r\nvar apiUploadBaseUrl = '/v0';\r\nvar configOption = 'storageBucket';\r\n/**\r\n * 2 minutes\r\n */\r\nvar defaultMaxOperationRetryTime = 2 * 60 * 1000;\r\n/**\r\n * 10 minutes\r\n */\r\nvar defaultMaxUploadRetryTime = 10 * 60 * 100;\r\n/**\r\n * This is the value of Number.MIN_SAFE_INTEGER, which is not well supported\r\n * enough for us to use it directly.\r\n */\r\nvar minSafeInteger = -9007199254740991;\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar FirebaseStorageError = /** @class */ (function () {\r\n function FirebaseStorageError(code, message) {\r\n this.code_ = prependCode(code);\r\n this.message_ = 'Firebase Storage: ' + message;\r\n this.serverResponse_ = null;\r\n this.name_ = 'FirebaseError';\r\n }\r\n FirebaseStorageError.prototype.codeProp = function () {\r\n return this.code;\r\n };\r\n FirebaseStorageError.prototype.codeEquals = function (code) {\r\n return prependCode(code) === this.codeProp();\r\n };\r\n FirebaseStorageError.prototype.serverResponseProp = function () {\r\n return this.serverResponse_;\r\n };\r\n FirebaseStorageError.prototype.setServerResponseProp = function (serverResponse) {\r\n this.serverResponse_ = serverResponse;\r\n };\r\n Object.defineProperty(FirebaseStorageError.prototype, \"name\", {\r\n get: function () {\r\n return this.name_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"code\", {\r\n get: function () {\r\n return this.code_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"message\", {\r\n get: function () {\r\n return this.message_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(FirebaseStorageError.prototype, \"serverResponse\", {\r\n get: function () {\r\n return this.serverResponse_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return FirebaseStorageError;\r\n}());\r\nvar Code = {\r\n // Shared between all platforms\r\n UNKNOWN: 'unknown',\r\n OBJECT_NOT_FOUND: 'object-not-found',\r\n BUCKET_NOT_FOUND: 'bucket-not-found',\r\n PROJECT_NOT_FOUND: 'project-not-found',\r\n QUOTA_EXCEEDED: 'quota-exceeded',\r\n UNAUTHENTICATED: 'unauthenticated',\r\n UNAUTHORIZED: 'unauthorized',\r\n RETRY_LIMIT_EXCEEDED: 'retry-limit-exceeded',\r\n INVALID_CHECKSUM: 'invalid-checksum',\r\n CANCELED: 'canceled',\r\n // JS specific\r\n INVALID_EVENT_NAME: 'invalid-event-name',\r\n INVALID_URL: 'invalid-url',\r\n INVALID_DEFAULT_BUCKET: 'invalid-default-bucket',\r\n NO_DEFAULT_BUCKET: 'no-default-bucket',\r\n CANNOT_SLICE_BLOB: 'cannot-slice-blob',\r\n SERVER_FILE_WRONG_SIZE: 'server-file-wrong-size',\r\n NO_DOWNLOAD_URL: 'no-download-url',\r\n INVALID_ARGUMENT: 'invalid-argument',\r\n INVALID_ARGUMENT_COUNT: 'invalid-argument-count',\r\n APP_DELETED: 'app-deleted',\r\n INVALID_ROOT_OPERATION: 'invalid-root-operation',\r\n INVALID_FORMAT: 'invalid-format',\r\n INTERNAL_ERROR: 'internal-error'\r\n};\r\nfunction prependCode(code) {\r\n return 'storage/' + code;\r\n}\r\nfunction unknown() {\r\n var message = 'An unknown error occurred, please check the error payload for ' +\r\n 'server response.';\r\n return new FirebaseStorageError(Code.UNKNOWN, message);\r\n}\r\nfunction objectNotFound(path) {\r\n return new FirebaseStorageError(Code.OBJECT_NOT_FOUND, \"Object '\" + path + \"' does not exist.\");\r\n}\r\nfunction quotaExceeded(bucket) {\r\n return new FirebaseStorageError(Code.QUOTA_EXCEEDED, \"Quota for bucket '\" +\r\n bucket +\r\n \"' exceeded, please view quota on \" +\r\n 'https://firebase.google.com/pricing/.');\r\n}\r\nfunction unauthenticated() {\r\n var message = 'User is not authenticated, please authenticate using Firebase ' +\r\n 'Authentication and try again.';\r\n return new FirebaseStorageError(Code.UNAUTHENTICATED, message);\r\n}\r\nfunction unauthorized(path) {\r\n return new FirebaseStorageError(Code.UNAUTHORIZED, \"User does not have permission to access '\" + path + \"'.\");\r\n}\r\nfunction retryLimitExceeded() {\r\n return new FirebaseStorageError(Code.RETRY_LIMIT_EXCEEDED, 'Max retry time for operation exceeded, please try again.');\r\n}\r\nfunction canceled() {\r\n return new FirebaseStorageError(Code.CANCELED, 'User canceled the upload/download.');\r\n}\r\nfunction invalidUrl(url) {\r\n return new FirebaseStorageError(Code.INVALID_URL, \"Invalid URL '\" + url + \"'.\");\r\n}\r\nfunction invalidDefaultBucket(bucket) {\r\n return new FirebaseStorageError(Code.INVALID_DEFAULT_BUCKET, \"Invalid default bucket '\" + bucket + \"'.\");\r\n}\r\nfunction cannotSliceBlob() {\r\n return new FirebaseStorageError(Code.CANNOT_SLICE_BLOB, 'Cannot slice blob for upload. Please retry the upload.');\r\n}\r\nfunction serverFileWrongSize() {\r\n return new FirebaseStorageError(Code.SERVER_FILE_WRONG_SIZE, 'Server recorded incorrect upload file size, please retry the upload.');\r\n}\r\nfunction noDownloadURL() {\r\n return new FirebaseStorageError(Code.NO_DOWNLOAD_URL, 'The given file does not have any download URLs.');\r\n}\r\nfunction invalidArgument(index, fnName, message) {\r\n return new FirebaseStorageError(Code.INVALID_ARGUMENT, 'Invalid argument in `' + fnName + '` at index ' + index + ': ' + message);\r\n}\r\nfunction invalidArgumentCount(argMin, argMax, fnName, real) {\r\n var countPart;\r\n var plural;\r\n if (argMin === argMax) {\r\n countPart = argMin;\r\n plural = argMin === 1 ? 'argument' : 'arguments';\r\n }\r\n else {\r\n countPart = 'between ' + argMin + ' and ' + argMax;\r\n plural = 'arguments';\r\n }\r\n return new FirebaseStorageError(Code.INVALID_ARGUMENT_COUNT, 'Invalid argument count in `' +\r\n fnName +\r\n '`: Expected ' +\r\n countPart +\r\n ' ' +\r\n plural +\r\n ', received ' +\r\n real +\r\n '.');\r\n}\r\nfunction appDeleted() {\r\n return new FirebaseStorageError(Code.APP_DELETED, 'The Firebase app was deleted.');\r\n}\r\n/**\r\n * @param name The name of the operation that was invalid.\r\n */\r\nfunction invalidRootOperation(name) {\r\n return new FirebaseStorageError(Code.INVALID_ROOT_OPERATION, \"The operation '\" +\r\n name +\r\n \"' cannot be performed on a root reference, create a non-root \" +\r\n \"reference using child, such as .child('file.png').\");\r\n}\r\n/**\r\n * @param format The format that was not valid.\r\n * @param message A message describing the format violation.\r\n */\r\nfunction invalidFormat(format, message) {\r\n return new FirebaseStorageError(Code.INVALID_FORMAT, \"String does not match format '\" + format + \"': \" + message);\r\n}\r\n/**\r\n * @param message A message describing the internal error.\r\n */\r\nfunction internalError(message) {\r\n throw new FirebaseStorageError(Code.INTERNAL_ERROR, 'Internal error: ' + message);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar StringFormat = {\r\n RAW: 'raw',\r\n BASE64: 'base64',\r\n BASE64URL: 'base64url',\r\n DATA_URL: 'data_url'\r\n};\r\nfunction formatValidator(stringFormat) {\r\n switch (stringFormat) {\r\n case StringFormat.RAW:\r\n case StringFormat.BASE64:\r\n case StringFormat.BASE64URL:\r\n case StringFormat.DATA_URL:\r\n return;\r\n default:\r\n throw 'Expected one of the event types: [' +\r\n StringFormat.RAW +\r\n ', ' +\r\n StringFormat.BASE64 +\r\n ', ' +\r\n StringFormat.BASE64URL +\r\n ', ' +\r\n StringFormat.DATA_URL +\r\n '].';\r\n }\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar StringData = /** @class */ (function () {\r\n function StringData(data, opt_contentType) {\r\n this.data = data;\r\n this.contentType = opt_contentType || null;\r\n }\r\n return StringData;\r\n}());\r\nfunction dataFromString(format, string) {\r\n switch (format) {\r\n case StringFormat.RAW:\r\n return new StringData(utf8Bytes_(string));\r\n case StringFormat.BASE64:\r\n case StringFormat.BASE64URL:\r\n return new StringData(base64Bytes_(format, string));\r\n case StringFormat.DATA_URL:\r\n return new StringData(dataURLBytes_(string), dataURLContentType_(string));\r\n }\r\n // assert(false);\r\n throw unknown();\r\n}\r\nfunction utf8Bytes_(string) {\r\n var b = [];\r\n for (var i = 0; i < string.length; i++) {\r\n var c = string.charCodeAt(i);\r\n if (c <= 127) {\r\n b.push(c);\r\n }\r\n else {\r\n if (c <= 2047) {\r\n b.push(192 | (c >> 6), 128 | (c & 63));\r\n }\r\n else {\r\n if ((c & 64512) == 55296) {\r\n // The start of a surrogate pair.\r\n var valid = i < string.length - 1 &&\r\n (string.charCodeAt(i + 1) & 64512) == 56320;\r\n if (!valid) {\r\n // The second surrogate wasn't there.\r\n b.push(239, 191, 189);\r\n }\r\n else {\r\n var hi = c;\r\n var lo = string.charCodeAt(++i);\r\n c = 65536 | ((hi & 1023) << 10) | (lo & 1023);\r\n b.push(240 | (c >> 18), 128 | ((c >> 12) & 63), 128 | ((c >> 6) & 63), 128 | (c & 63));\r\n }\r\n }\r\n else {\r\n if ((c & 64512) == 56320) {\r\n // Invalid low surrogate.\r\n b.push(239, 191, 189);\r\n }\r\n else {\r\n b.push(224 | (c >> 12), 128 | ((c >> 6) & 63), 128 | (c & 63));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return new Uint8Array(b);\r\n}\r\nfunction percentEncodedBytes_(string) {\r\n var decoded;\r\n try {\r\n decoded = decodeURIComponent(string);\r\n }\r\n catch (e) {\r\n throw invalidFormat(StringFormat.DATA_URL, 'Malformed data URL.');\r\n }\r\n return utf8Bytes_(decoded);\r\n}\r\nfunction base64Bytes_(format, string) {\r\n switch (format) {\r\n case StringFormat.BASE64: {\r\n var hasMinus = string.indexOf('-') !== -1;\r\n var hasUnder = string.indexOf('_') !== -1;\r\n if (hasMinus || hasUnder) {\r\n var invalidChar = hasMinus ? '-' : '_';\r\n throw invalidFormat(format, \"Invalid character '\" +\r\n invalidChar +\r\n \"' found: is it base64url encoded?\");\r\n }\r\n break;\r\n }\r\n case StringFormat.BASE64URL: {\r\n var hasPlus = string.indexOf('+') !== -1;\r\n var hasSlash = string.indexOf('/') !== -1;\r\n if (hasPlus || hasSlash) {\r\n var invalidChar = hasPlus ? '+' : '/';\r\n throw invalidFormat(format, \"Invalid character '\" + invalidChar + \"' found: is it base64 encoded?\");\r\n }\r\n string = string.replace(/-/g, '+').replace(/_/g, '/');\r\n break;\r\n }\r\n }\r\n var bytes;\r\n try {\r\n bytes = atob(string);\r\n }\r\n catch (e) {\r\n throw invalidFormat(format, 'Invalid character found');\r\n }\r\n var array = new Uint8Array(bytes.length);\r\n for (var i = 0; i < bytes.length; i++) {\r\n array[i] = bytes.charCodeAt(i);\r\n }\r\n return array;\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar DataURLParts = /** @class */ (function () {\r\n function DataURLParts(dataURL) {\r\n this.base64 = false;\r\n this.contentType = null;\r\n var matches = dataURL.match(/^data:([^,]+)?,/);\r\n if (matches === null) {\r\n throw invalidFormat(StringFormat.DATA_URL, \"Must be formatted 'data:[][;base64],\");\r\n }\r\n var middle = matches[1] || null;\r\n if (middle != null) {\r\n this.base64 = endsWith(middle, ';base64');\r\n this.contentType = this.base64\r\n ? middle.substring(0, middle.length - ';base64'.length)\r\n : middle;\r\n }\r\n this.rest = dataURL.substring(dataURL.indexOf(',') + 1);\r\n }\r\n return DataURLParts;\r\n}());\r\nfunction dataURLBytes_(string) {\r\n var parts = new DataURLParts(string);\r\n if (parts.base64) {\r\n return base64Bytes_(StringFormat.BASE64, parts.rest);\r\n }\r\n else {\r\n return percentEncodedBytes_(parts.rest);\r\n }\r\n}\r\nfunction dataURLContentType_(string) {\r\n var parts = new DataURLParts(string);\r\n return parts.contentType;\r\n}\r\nfunction endsWith(s, end) {\r\n var longEnough = s.length >= end.length;\r\n if (!longEnough) {\r\n return false;\r\n }\r\n return s.substring(s.length - end.length) === end;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nvar TaskEvent = {\r\n /** Triggered whenever the task changes or progress is updated. */\r\n STATE_CHANGED: 'state_changed'\r\n};\r\nvar InternalTaskState = {\r\n RUNNING: 'running',\r\n PAUSING: 'pausing',\r\n PAUSED: 'paused',\r\n SUCCESS: 'success',\r\n CANCELING: 'canceling',\r\n CANCELED: 'canceled',\r\n ERROR: 'error'\r\n};\r\nvar TaskState = {\r\n /** The task is currently transferring data. */\r\n RUNNING: 'running',\r\n /** The task was paused by the user. */\r\n PAUSED: 'paused',\r\n /** The task completed successfully. */\r\n SUCCESS: 'success',\r\n /** The task was canceled. */\r\n CANCELED: 'canceled',\r\n /** The task failed with an error. */\r\n ERROR: 'error'\r\n};\r\nfunction taskStateFromInternalTaskState(state) {\r\n switch (state) {\r\n case InternalTaskState.RUNNING:\r\n case InternalTaskState.PAUSING:\r\n case InternalTaskState.CANCELING:\r\n return TaskState.RUNNING;\r\n case InternalTaskState.PAUSED:\r\n return TaskState.PAUSED;\r\n case InternalTaskState.SUCCESS:\r\n return TaskState.SUCCESS;\r\n case InternalTaskState.CANCELED:\r\n return TaskState.CANCELED;\r\n case InternalTaskState.ERROR:\r\n return TaskState.ERROR;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n return TaskState.ERROR;\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Contains methods for working with objects.\r\n */\r\nfunction contains(obj, prop) {\r\n return Object.prototype.hasOwnProperty.call(obj, prop);\r\n}\r\nfunction forEach(obj, f) {\r\n for (var key in obj) {\r\n if (contains(obj, key)) {\r\n f(key, obj[key]);\r\n }\r\n }\r\n}\r\nfunction clone(obj) {\r\n if (obj == null) {\r\n return {};\r\n }\r\n var c = {};\r\n forEach(obj, function (key, val) {\r\n c[key] = val;\r\n });\r\n return c;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Implements the promise abstraction interface for external\r\n * (public SDK) packaging, which just passes through to the firebase-app impl.\r\n */\r\n/**\r\n * @template T\r\n * @param {function((function(T): void),\r\n * (function(!Error): void))} resolver\r\n */\r\nfunction make(resolver) {\r\n return new Promise(resolver);\r\n}\r\n/**\r\n * @template T\r\n */\r\nfunction resolve(value) {\r\n return Promise.resolve(value);\r\n}\r\nfunction reject(error) {\r\n return Promise.reject(error);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @return False if the object is undefined or null, true otherwise.\r\n */\r\nfunction isDef(p) {\r\n return p != null;\r\n}\r\nfunction isJustDef(p) {\r\n return p !== void 0;\r\n}\r\nfunction isFunction(p) {\r\n return typeof p === 'function';\r\n}\r\nfunction isObject(p) {\r\n return typeof p === 'object';\r\n}\r\nfunction isNonNullObject(p) {\r\n return isObject(p) && p !== null;\r\n}\r\nfunction isNonArrayObject(p) {\r\n return isObject(p) && !Array.isArray(p);\r\n}\r\nfunction isString(p) {\r\n return typeof p === 'string' || p instanceof String;\r\n}\r\nfunction isNumber(p) {\r\n return typeof p === 'number' || p instanceof Number;\r\n}\r\nfunction isNativeBlob(p) {\r\n return isNativeBlobDefined() && p instanceof Blob;\r\n}\r\nfunction isNativeBlobDefined() {\r\n return typeof Blob !== 'undefined';\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @enum{number}\r\n */\r\nvar ErrorCode;\r\n(function (ErrorCode) {\r\n ErrorCode[ErrorCode[\"NO_ERROR\"] = 0] = \"NO_ERROR\";\r\n ErrorCode[ErrorCode[\"NETWORK_ERROR\"] = 1] = \"NETWORK_ERROR\";\r\n ErrorCode[ErrorCode[\"ABORT\"] = 2] = \"ABORT\";\r\n})(ErrorCode || (ErrorCode = {}));\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * We use this instead of goog.net.XhrIo because goog.net.XhrIo is hyuuuuge and\r\n * doesn't work in React Native on Android.\r\n */\r\nvar NetworkXhrIo = /** @class */ (function () {\r\n function NetworkXhrIo() {\r\n var _this = this;\r\n this.sent_ = false;\r\n this.xhr_ = new XMLHttpRequest();\r\n this.errorCode_ = ErrorCode.NO_ERROR;\r\n this.sendPromise_ = make(function (resolve$$1, reject$$1) {\r\n _this.xhr_.addEventListener('abort', function (event) {\r\n _this.errorCode_ = ErrorCode.ABORT;\r\n resolve$$1(_this);\r\n });\r\n _this.xhr_.addEventListener('error', function (event) {\r\n _this.errorCode_ = ErrorCode.NETWORK_ERROR;\r\n resolve$$1(_this);\r\n });\r\n _this.xhr_.addEventListener('load', function (event) {\r\n resolve$$1(_this);\r\n });\r\n });\r\n }\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.send = function (url, method, opt_body, opt_headers) {\r\n var _this = this;\r\n if (this.sent_) {\r\n throw internalError('cannot .send() more than once');\r\n }\r\n this.sent_ = true;\r\n this.xhr_.open(method, url, true);\r\n if (isDef(opt_headers)) {\r\n var headers = opt_headers;\r\n forEach(headers, function (key, val) {\r\n _this.xhr_.setRequestHeader(key, val.toString());\r\n });\r\n }\r\n if (isDef(opt_body)) {\r\n this.xhr_.send(opt_body);\r\n }\r\n else {\r\n this.xhr_.send();\r\n }\r\n return this.sendPromise_;\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getErrorCode = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getErrorCode() before sending');\r\n }\r\n return this.errorCode_;\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getStatus = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getStatus() before sending');\r\n }\r\n try {\r\n return this.xhr_.status;\r\n }\r\n catch (e) {\r\n return -1;\r\n }\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getResponseText = function () {\r\n if (!this.sent_) {\r\n throw internalError('cannot .getResponseText() before sending');\r\n }\r\n return this.xhr_.responseText;\r\n };\r\n /**\r\n * Aborts the request.\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.abort = function () {\r\n this.xhr_.abort();\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.getResponseHeader = function (header) {\r\n return this.xhr_.getResponseHeader(header);\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.addUploadProgressListener = function (listener) {\r\n if (isDef(this.xhr_.upload)) {\r\n this.xhr_.upload.addEventListener('progress', listener);\r\n }\r\n };\r\n /**\r\n * @override\r\n */\r\n NetworkXhrIo.prototype.removeUploadProgressListener = function (listener) {\r\n if (isDef(this.xhr_.upload)) {\r\n this.xhr_.upload.removeEventListener('progress', listener);\r\n }\r\n };\r\n return NetworkXhrIo;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Factory-like class for creating XhrIo instances.\r\n */\r\nvar XhrIoPool = /** @class */ (function () {\r\n function XhrIoPool() {\r\n }\r\n XhrIoPool.prototype.createXhrIo = function () {\r\n return new NetworkXhrIo();\r\n };\r\n return XhrIoPool;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns the Object resulting from parsing the given JSON, or null if the\r\n * given string does not represent a JSON object.\r\n */\r\nfunction jsonObjectOrNull(s) {\r\n var obj;\r\n try {\r\n obj = JSON.parse(s);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n if (isNonArrayObject(obj)) {\r\n return obj;\r\n }\r\n else {\r\n return null;\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar Location = /** @class */ (function () {\r\n function Location(bucket, path) {\r\n this.bucket = bucket;\r\n this.path_ = path;\r\n }\r\n Object.defineProperty(Location.prototype, \"path\", {\r\n get: function () {\r\n return this.path_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Location.prototype.fullServerUrl = function () {\r\n var encode = encodeURIComponent;\r\n return '/b/' + encode(this.bucket) + '/o/' + encode(this.path);\r\n };\r\n Location.prototype.bucketOnlyServerUrl = function () {\r\n var encode = encodeURIComponent;\r\n return '/b/' + encode(this.bucket) + '/o';\r\n };\r\n Location.makeFromBucketSpec = function (bucketString) {\r\n var bucketLocation;\r\n try {\r\n bucketLocation = Location.makeFromUrl(bucketString);\r\n }\r\n catch (e) {\r\n // Not valid URL, use as-is. This lets you put bare bucket names in\r\n // config.\r\n return new Location(bucketString, '');\r\n }\r\n if (bucketLocation.path === '') {\r\n return bucketLocation;\r\n }\r\n else {\r\n throw invalidDefaultBucket(bucketString);\r\n }\r\n };\r\n Location.makeFromUrl = function (url) {\r\n var location = null;\r\n var bucketDomain = '([A-Za-z0-9.\\\\-]+)';\r\n function gsModify(loc) {\r\n if (loc.path.charAt(loc.path.length - 1) === '/') {\r\n loc.path_ = loc.path_.slice(0, -1);\r\n }\r\n }\r\n var gsPath = '(/(.*))?$';\r\n var path = '(/([^?#]*).*)?$';\r\n var gsRegex = new RegExp('^gs://' + bucketDomain + gsPath, 'i');\r\n var gsIndices = { bucket: 1, path: 3 };\r\n function httpModify(loc) {\r\n loc.path_ = decodeURIComponent(loc.path);\r\n }\r\n var version = 'v[A-Za-z0-9_]+';\r\n var httpRegex = new RegExp('^https?://firebasestorage\\\\.googleapis\\\\.com/' +\r\n version +\r\n '/b/' +\r\n bucketDomain +\r\n '/o' +\r\n path, 'i');\r\n var httpIndices = { bucket: 1, path: 3 };\r\n var groups = [\r\n { regex: gsRegex, indices: gsIndices, postModify: gsModify },\r\n { regex: httpRegex, indices: httpIndices, postModify: httpModify }\r\n ];\r\n for (var i = 0; i < groups.length; i++) {\r\n var group = groups[i];\r\n var captures = group.regex.exec(url);\r\n if (captures) {\r\n var bucketValue = captures[group.indices.bucket];\r\n var pathValue = captures[group.indices.path];\r\n if (!pathValue) {\r\n pathValue = '';\r\n }\r\n location = new Location(bucketValue, pathValue);\r\n group.postModify(location);\r\n break;\r\n }\r\n }\r\n if (location == null) {\r\n throw invalidUrl(url);\r\n }\r\n return location;\r\n };\r\n return Location;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @fileoverview Contains helper methods for manipulating paths.\r\n */\r\n/**\r\n * @return Null if the path is already at the root.\r\n */\r\nfunction parent(path) {\r\n if (path.length == 0) {\r\n return null;\r\n }\r\n var index = path.lastIndexOf('/');\r\n if (index === -1) {\r\n return '';\r\n }\r\n var newPath = path.slice(0, index);\r\n return newPath;\r\n}\r\nfunction child(path, childPath) {\r\n var canonicalChildPath = childPath\r\n .split('/')\r\n .filter(function (component) {\r\n return component.length > 0;\r\n })\r\n .join('/');\r\n if (path.length === 0) {\r\n return canonicalChildPath;\r\n }\r\n else {\r\n return path + '/' + canonicalChildPath;\r\n }\r\n}\r\n/**\r\n * Returns the last component of a path.\r\n * '/foo/bar' -> 'bar'\r\n * '/foo/bar/baz/' -> 'baz/'\r\n * '/a' -> 'a'\r\n */\r\nfunction lastComponent(path) {\r\n var index = path.lastIndexOf('/', path.length - 2);\r\n if (index === -1) {\r\n return path;\r\n }\r\n else {\r\n return path.slice(index + 1);\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction makeNormalUrl(urlPart) {\r\n return domainBase + apiBaseUrl + urlPart;\r\n}\r\nfunction makeDownloadUrl(urlPart) {\r\n return downloadBase + apiBaseUrl + urlPart;\r\n}\r\nfunction makeUploadUrl(urlPart) {\r\n return domainBase + apiUploadBaseUrl + urlPart;\r\n}\r\nfunction makeQueryString(params) {\r\n var encode = encodeURIComponent;\r\n var queryPart = '?';\r\n forEach(params, function (key, val) {\r\n var nextPart = encode(key) + '=' + encode(val);\r\n queryPart = queryPart + nextPart + '&';\r\n });\r\n // Chop off the extra '&' or '?' on the end\r\n queryPart = queryPart.slice(0, -1);\r\n return queryPart;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\nfunction noXform_(metadata, value) {\r\n return value;\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar Mapping = /** @class */ (function () {\r\n function Mapping(server, opt_local, opt_writable, opt_xform) {\r\n this.server = server;\r\n this.local = opt_local || server;\r\n this.writable = !!opt_writable;\r\n this.xform = opt_xform || noXform_;\r\n }\r\n return Mapping;\r\n}());\r\nvar mappings_ = null;\r\nfunction xformPath(fullPath) {\r\n var valid = isString(fullPath);\r\n if (!valid || fullPath.length < 2) {\r\n return fullPath;\r\n }\r\n else {\r\n fullPath = fullPath;\r\n return lastComponent(fullPath);\r\n }\r\n}\r\nfunction getMappings() {\r\n if (mappings_) {\r\n return mappings_;\r\n }\r\n var mappings = [];\r\n mappings.push(new Mapping('bucket'));\r\n mappings.push(new Mapping('generation'));\r\n mappings.push(new Mapping('metageneration'));\r\n mappings.push(new Mapping('name', 'fullPath', true));\r\n function mappingsXformPath(metadata, fullPath) {\r\n return xformPath(fullPath);\r\n }\r\n var nameMapping = new Mapping('name');\r\n nameMapping.xform = mappingsXformPath;\r\n mappings.push(nameMapping);\r\n /**\r\n * Coerces the second param to a number, if it is defined.\r\n */\r\n function xformSize(metadata, size) {\r\n if (isDef(size)) {\r\n return +size;\r\n }\r\n else {\r\n return size;\r\n }\r\n }\r\n var sizeMapping = new Mapping('size');\r\n sizeMapping.xform = xformSize;\r\n mappings.push(sizeMapping);\r\n mappings.push(new Mapping('timeCreated'));\r\n mappings.push(new Mapping('updated'));\r\n mappings.push(new Mapping('md5Hash', null, true));\r\n mappings.push(new Mapping('cacheControl', null, true));\r\n mappings.push(new Mapping('contentDisposition', null, true));\r\n mappings.push(new Mapping('contentEncoding', null, true));\r\n mappings.push(new Mapping('contentLanguage', null, true));\r\n mappings.push(new Mapping('contentType', null, true));\r\n mappings.push(new Mapping('metadata', 'customMetadata', true));\r\n /**\r\n * Transforms a comma-separated string of tokens into a list of download\r\n * URLs.\r\n */\r\n function xformTokens(metadata, tokens) {\r\n var valid = isString(tokens) && tokens.length > 0;\r\n if (!valid) {\r\n // This can happen if objects are uploaded through GCS and retrieved\r\n // through list, so we don't want to throw an Error.\r\n return [];\r\n }\r\n var encode = encodeURIComponent;\r\n var tokensList = tokens.split(',');\r\n var urls = tokensList.map(function (token) {\r\n var bucket = metadata['bucket'];\r\n var path = metadata['fullPath'];\r\n var urlPart = '/b/' + encode(bucket) + '/o/' + encode(path);\r\n var base = makeDownloadUrl(urlPart);\r\n var queryString = makeQueryString({\r\n alt: 'media',\r\n token: token\r\n });\r\n return base + queryString;\r\n });\r\n return urls;\r\n }\r\n mappings.push(new Mapping('downloadTokens', 'downloadURLs', false, xformTokens));\r\n mappings_ = mappings;\r\n return mappings_;\r\n}\r\nfunction addRef(metadata, authWrapper) {\r\n function generateRef() {\r\n var bucket = metadata['bucket'];\r\n var path = metadata['fullPath'];\r\n var loc = new Location(bucket, path);\r\n return authWrapper.makeStorageReference(loc);\r\n }\r\n Object.defineProperty(metadata, 'ref', { get: generateRef });\r\n}\r\nfunction fromResource(authWrapper, resource, mappings) {\r\n var metadata = {};\r\n metadata['type'] = 'file';\r\n var len = mappings.length;\r\n for (var i = 0; i < len; i++) {\r\n var mapping = mappings[i];\r\n metadata[mapping.local] = mapping.xform(metadata, resource[mapping.server]);\r\n }\r\n addRef(metadata, authWrapper);\r\n return metadata;\r\n}\r\nfunction fromResourceString(authWrapper, resourceString, mappings) {\r\n var obj = jsonObjectOrNull(resourceString);\r\n if (obj === null) {\r\n return null;\r\n }\r\n var resource = obj;\r\n return fromResource(authWrapper, resource, mappings);\r\n}\r\nfunction toResourceString(metadata, mappings) {\r\n var resource = {};\r\n var len = mappings.length;\r\n for (var i = 0; i < len; i++) {\r\n var mapping = mappings[i];\r\n if (mapping.writable) {\r\n resource[mapping.server] = metadata[mapping.local];\r\n }\r\n }\r\n return JSON.stringify(resource);\r\n}\r\nfunction metadataValidator(p) {\r\n var validType = p && isObject(p);\r\n if (!validType) {\r\n throw 'Expected Metadata object.';\r\n }\r\n for (var key in p) {\r\n var val = p[key];\r\n if (key === 'customMetadata') {\r\n if (!isObject(val)) {\r\n throw 'Expected object for \\'customMetadata\\' mapping.';\r\n }\r\n }\r\n else {\r\n if (isNonNullObject(val)) {\r\n throw \"Mapping for '\" + key + \"' cannot be an object.\";\r\n }\r\n }\r\n }\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param name Name of the function.\r\n * @param specs Argument specs.\r\n * @param passed The actual arguments passed to the function.\r\n * @throws {fbs.Error} If the arguments are invalid.\r\n */\r\nfunction validate(name, specs, passed) {\r\n var minArgs = specs.length;\r\n var maxArgs = specs.length;\r\n for (var i = 0; i < specs.length; i++) {\r\n if (specs[i].optional) {\r\n minArgs = i;\r\n break;\r\n }\r\n }\r\n var validLength = minArgs <= passed.length && passed.length <= maxArgs;\r\n if (!validLength) {\r\n throw invalidArgumentCount(minArgs, maxArgs, name, passed.length);\r\n }\r\n for (var i = 0; i < passed.length; i++) {\r\n try {\r\n specs[i].validator(passed[i]);\r\n }\r\n catch (e) {\r\n if (e instanceof Error) {\r\n throw invalidArgument(i, name, e.message);\r\n }\r\n else {\r\n throw invalidArgument(i, name, e);\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * @struct\r\n */\r\nvar ArgSpec = /** @class */ (function () {\r\n function ArgSpec(validator, opt_optional) {\r\n var self = this;\r\n this.validator = function (p) {\r\n if (self.optional && !isJustDef(p)) {\r\n return;\r\n }\r\n validator(p);\r\n };\r\n this.optional = !!opt_optional;\r\n }\r\n return ArgSpec;\r\n}());\r\nfunction and_(v1, v2) {\r\n return function (p) {\r\n v1(p);\r\n v2(p);\r\n };\r\n}\r\nfunction stringSpec(opt_validator, opt_optional) {\r\n function stringValidator(p) {\r\n if (!isString(p)) {\r\n throw 'Expected string.';\r\n }\r\n }\r\n var validator;\r\n if (opt_validator) {\r\n validator = and_(stringValidator, opt_validator);\r\n }\r\n else {\r\n validator = stringValidator;\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\r\nfunction uploadDataSpec() {\r\n function validator(p) {\r\n var valid = p instanceof Uint8Array ||\r\n p instanceof ArrayBuffer ||\r\n (isNativeBlobDefined() && p instanceof Blob);\r\n if (!valid) {\r\n throw 'Expected Blob or File.';\r\n }\r\n }\r\n return new ArgSpec(validator);\r\n}\r\nfunction metadataSpec(opt_optional) {\r\n return new ArgSpec(metadataValidator, opt_optional);\r\n}\r\nfunction nonNegativeNumberSpec() {\r\n function validator(p) {\r\n var valid = isNumber(p) && p >= 0;\r\n if (!valid) {\r\n throw 'Expected a number 0 or greater.';\r\n }\r\n }\r\n return new ArgSpec(validator);\r\n}\r\nfunction looseObjectSpec(opt_validator, opt_optional) {\r\n function validator(p) {\r\n var isLooseObject = p === null || (isDef(p) && p instanceof Object);\r\n if (!isLooseObject) {\r\n throw 'Expected an Object.';\r\n }\r\n if (opt_validator !== undefined && opt_validator !== null) {\r\n opt_validator(p);\r\n }\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\r\nfunction nullFunctionSpec(opt_optional) {\r\n function validator(p) {\r\n var valid = p === null || isFunction(p);\r\n if (!valid) {\r\n throw 'Expected a Function.';\r\n }\r\n }\r\n return new ArgSpec(validator, opt_optional);\r\n}\n\nfunction getBlobBuilder() {\r\n if (typeof BlobBuilder !== 'undefined') {\r\n return BlobBuilder;\r\n }\r\n else if (typeof WebKitBlobBuilder !== 'undefined') {\r\n return WebKitBlobBuilder;\r\n }\r\n else {\r\n return undefined;\r\n }\r\n}\r\n/**\r\n * Concatenates one or more values together and converts them to a Blob.\r\n *\r\n * @param var_args The values that will make up the resulting blob.\r\n * @return The blob.\r\n */\r\nfunction getBlob() {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n var BlobBuilder = getBlobBuilder();\r\n if (BlobBuilder !== undefined) {\r\n var bb = new BlobBuilder();\r\n for (var i = 0; i < var_args.length; i++) {\r\n bb.append(var_args[i]);\r\n }\r\n return bb.getBlob();\r\n }\r\n else {\r\n if (isNativeBlobDefined()) {\r\n return new Blob(var_args);\r\n }\r\n else {\r\n throw Error(\"This browser doesn't seem to support creating Blobs\");\r\n }\r\n }\r\n}\r\n/**\r\n * Slices the blob. The returned blob contains data from the start byte\r\n * (inclusive) till the end byte (exclusive). Negative indices cannot be used.\r\n *\r\n * @param blob The blob to be sliced.\r\n * @param start Index of the starting byte.\r\n * @param end Index of the ending byte.\r\n * @return The blob slice or null if not supported.\r\n */\r\nfunction sliceBlob(blob, start, end) {\r\n if (blob.webkitSlice) {\r\n return blob.webkitSlice(start, end);\r\n }\r\n else if (blob.mozSlice) {\r\n return blob.mozSlice(start, end);\r\n }\r\n else if (blob.slice) {\r\n return blob.slice(start, end);\r\n }\r\n return null;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param opt_elideCopy If true, doesn't copy mutable input data\r\n * (e.g. Uint8Arrays). Pass true only if you know the objects will not be\r\n * modified after this blob's construction.\r\n */\r\nvar FbsBlob = /** @class */ (function () {\r\n function FbsBlob(data, opt_elideCopy) {\r\n var size = 0;\r\n var blobType = '';\r\n if (isNativeBlob(data)) {\r\n this.data_ = data;\r\n size = data.size;\r\n blobType = data.type;\r\n }\r\n else if (data instanceof ArrayBuffer) {\r\n if (opt_elideCopy) {\r\n this.data_ = new Uint8Array(data);\r\n }\r\n else {\r\n this.data_ = new Uint8Array(data.byteLength);\r\n this.data_.set(new Uint8Array(data));\r\n }\r\n size = this.data_.length;\r\n }\r\n else if (data instanceof Uint8Array) {\r\n if (opt_elideCopy) {\r\n this.data_ = data;\r\n }\r\n else {\r\n this.data_ = new Uint8Array(data.length);\r\n this.data_.set(data);\r\n }\r\n size = data.length;\r\n }\r\n this.size_ = size;\r\n this.type_ = blobType;\r\n }\r\n FbsBlob.prototype.size = function () {\r\n return this.size_;\r\n };\r\n FbsBlob.prototype.type = function () {\r\n return this.type_;\r\n };\r\n FbsBlob.prototype.slice = function (startByte, endByte) {\r\n if (isNativeBlob(this.data_)) {\r\n var realBlob = this.data_;\r\n var sliced = sliceBlob(realBlob, startByte, endByte);\r\n if (sliced === null) {\r\n return null;\r\n }\r\n return new FbsBlob(sliced);\r\n }\r\n else {\r\n var slice = new Uint8Array(this.data_.buffer, startByte, endByte - startByte);\r\n return new FbsBlob(slice, true);\r\n }\r\n };\r\n FbsBlob.getBlob = function () {\r\n var var_args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n var_args[_i] = arguments[_i];\r\n }\r\n if (isNativeBlobDefined()) {\r\n var blobby = var_args.map(function (val) {\r\n if (val instanceof FbsBlob) {\r\n return val.data_;\r\n }\r\n else {\r\n return val;\r\n }\r\n });\r\n return new FbsBlob(getBlob.apply(null, blobby));\r\n }\r\n else {\r\n var uint8Arrays = var_args.map(function (val) {\r\n if (isString(val)) {\r\n return dataFromString(StringFormat.RAW, val).data;\r\n }\r\n else {\r\n // Blobs don't exist, so this has to be a Uint8Array.\r\n return val.data_;\r\n }\r\n });\r\n var finalLength_1 = 0;\r\n uint8Arrays.forEach(function (array) {\r\n finalLength_1 += array.byteLength;\r\n });\r\n var merged_1 = new Uint8Array(finalLength_1);\r\n var index_1 = 0;\r\n uint8Arrays.forEach(function (array) {\r\n for (var i = 0; i < array.length; i++) {\r\n merged_1[index_1++] = array[i];\r\n }\r\n });\r\n return new FbsBlob(merged_1, true);\r\n }\r\n };\r\n FbsBlob.prototype.uploadData = function () {\r\n return this.data_;\r\n };\r\n return FbsBlob;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns true if the object is contained in the array (compared with ===).\r\n * @template T\r\n */\r\nfunction contains$1(array, elem) {\r\n return array.indexOf(elem) !== -1;\r\n}\r\n/**\r\n * Returns a shallow copy of the array or array-like object (e.g. arguments).\r\n * @template T\r\n */\r\nfunction clone$1(arraylike) {\r\n return Array.prototype.slice.call(arraylike);\r\n}\r\n/**\r\n * Removes the given element from the given array, if it is contained.\r\n * Directly modifies the passed-in array.\r\n * @template T\r\n */\r\nfunction remove(array, elem) {\r\n var i = array.indexOf(elem);\r\n if (i !== -1) {\r\n array.splice(i, 1);\r\n }\r\n}\n\nvar RequestInfo = /** @class */ (function () {\r\n function RequestInfo(url, method, \r\n /**\r\n * Returns the value with which to resolve the request's promise. Only called\r\n * if the request is successful. Throw from this function to reject the\r\n * returned Request's promise with the thrown error.\r\n * Note: The XhrIo passed to this function may be reused after this callback\r\n * returns. Do not keep a reference to it in any way.\r\n */\r\n handler, timeout) {\r\n this.url = url;\r\n this.method = method;\r\n this.handler = handler;\r\n this.timeout = timeout;\r\n this.urlParams = {};\r\n this.headers = {};\r\n this.body = null;\r\n this.errorHandler = null;\r\n /**\r\n * Called with the current number of bytes uploaded and total size (-1 if not\r\n * computable) of the request body (i.e. used to report upload progress).\r\n */\r\n this.progressCallback = null;\r\n this.successCodes = [200];\r\n this.additionalRetryCodes = [];\r\n }\r\n return RequestInfo;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Throws the UNKNOWN FirebaseStorageError if cndn is false.\r\n */\r\nfunction handlerCheck(cndn) {\r\n if (!cndn) {\r\n throw unknown();\r\n }\r\n}\r\nfunction metadataHandler(authWrapper, mappings) {\r\n function handler(xhr, text) {\r\n var metadata = fromResourceString(authWrapper, text, mappings);\r\n handlerCheck(metadata !== null);\r\n return metadata;\r\n }\r\n return handler;\r\n}\r\nfunction sharedErrorHandler(location) {\r\n function errorHandler(xhr, err) {\r\n var newErr;\r\n if (xhr.getStatus() === 401) {\r\n newErr = unauthenticated();\r\n }\r\n else {\r\n if (xhr.getStatus() === 402) {\r\n newErr = quotaExceeded(location.bucket);\r\n }\r\n else {\r\n if (xhr.getStatus() === 403) {\r\n newErr = unauthorized(location.path);\r\n }\r\n else {\r\n newErr = err;\r\n }\r\n }\r\n }\r\n newErr.setServerResponseProp(err.serverResponseProp());\r\n return newErr;\r\n }\r\n return errorHandler;\r\n}\r\nfunction objectErrorHandler(location) {\r\n var shared = sharedErrorHandler(location);\r\n function errorHandler(xhr, err) {\r\n var newErr = shared(xhr, err);\r\n if (xhr.getStatus() === 404) {\r\n newErr = objectNotFound(location.path);\r\n }\r\n newErr.setServerResponseProp(err.serverResponseProp());\r\n return newErr;\r\n }\r\n return errorHandler;\r\n}\r\nfunction getMetadata(authWrapper, location, mappings) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'GET';\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction updateMetadata(authWrapper, location, metadata, mappings) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'PATCH';\r\n var body = toResourceString(metadata, mappings);\r\n var headers = { 'Content-Type': 'application/json; charset=utf-8' };\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.body = body;\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction deleteObject(authWrapper, location) {\r\n var urlPart = location.fullServerUrl();\r\n var url = makeNormalUrl(urlPart);\r\n var method = 'DELETE';\r\n var timeout = authWrapper.maxOperationRetryTime();\r\n function handler(xhr, text) { }\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.successCodes = [200, 204];\r\n requestInfo.errorHandler = objectErrorHandler(location);\r\n return requestInfo;\r\n}\r\nfunction determineContentType_(metadata, blob) {\r\n return ((metadata && metadata['contentType']) ||\r\n (blob && blob.type()) ||\r\n 'application/octet-stream');\r\n}\r\nfunction metadataForUpload_(location, blob, opt_metadata) {\r\n var metadata = clone(opt_metadata);\r\n metadata['fullPath'] = location.path;\r\n metadata['size'] = blob.size();\r\n if (!metadata['contentType']) {\r\n metadata['contentType'] = determineContentType_(null, blob);\r\n }\r\n return metadata;\r\n}\r\nfunction multipartUpload(authWrapper, location, mappings, blob, opt_metadata) {\r\n var urlPart = location.bucketOnlyServerUrl();\r\n var headers = {\r\n 'X-Goog-Upload-Protocol': 'multipart'\r\n };\r\n function genBoundary() {\r\n var str = '';\r\n for (var i = 0; i < 2; i++) {\r\n str =\r\n str +\r\n Math.random()\r\n .toString()\r\n .slice(2);\r\n }\r\n return str;\r\n }\r\n var boundary = genBoundary();\r\n headers['Content-Type'] = 'multipart/related; boundary=' + boundary;\r\n var metadata = metadataForUpload_(location, blob, opt_metadata);\r\n var metadataString = toResourceString(metadata, mappings);\r\n var preBlobPart = '--' +\r\n boundary +\r\n '\\r\\n' +\r\n 'Content-Type: application/json; charset=utf-8\\r\\n\\r\\n' +\r\n metadataString +\r\n '\\r\\n--' +\r\n boundary +\r\n '\\r\\n' +\r\n 'Content-Type: ' +\r\n metadata['contentType'] +\r\n '\\r\\n\\r\\n';\r\n var postBlobPart = '\\r\\n--' + boundary + '--';\r\n var body = FbsBlob.getBlob(preBlobPart, blob, postBlobPart);\r\n if (body === null) {\r\n throw cannotSliceBlob();\r\n }\r\n var urlParams = { name: metadata['fullPath'] };\r\n var url = makeUploadUrl(urlPart);\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, metadataHandler(authWrapper, mappings), timeout);\r\n requestInfo.urlParams = urlParams;\r\n requestInfo.headers = headers;\r\n requestInfo.body = body.uploadData();\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * @param current The number of bytes that have been uploaded so far.\r\n * @param total The total number of bytes in the upload.\r\n * @param opt_finalized True if the server has finished the upload.\r\n * @param opt_metadata The upload metadata, should\r\n * only be passed if opt_finalized is true.\r\n * @struct\r\n */\r\nvar ResumableUploadStatus = /** @class */ (function () {\r\n function ResumableUploadStatus(current, total, finalized, metadata) {\r\n this.current = current;\r\n this.total = total;\r\n this.finalized = !!finalized;\r\n this.metadata = metadata || null;\r\n }\r\n return ResumableUploadStatus;\r\n}());\r\nfunction checkResumeHeader_(xhr, opt_allowed) {\r\n var status;\r\n try {\r\n status = xhr.getResponseHeader('X-Goog-Upload-Status');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n var allowed = opt_allowed || ['active'];\r\n handlerCheck(contains$1(allowed, status));\r\n return status;\r\n}\r\nfunction createResumableUpload(authWrapper, location, mappings, blob, opt_metadata) {\r\n var urlPart = location.bucketOnlyServerUrl();\r\n var metadata = metadataForUpload_(location, blob, opt_metadata);\r\n var urlParams = { name: metadata['fullPath'] };\r\n var url = makeUploadUrl(urlPart);\r\n var method = 'POST';\r\n var headers = {\r\n 'X-Goog-Upload-Protocol': 'resumable',\r\n 'X-Goog-Upload-Command': 'start',\r\n 'X-Goog-Upload-Header-Content-Length': blob.size(),\r\n 'X-Goog-Upload-Header-Content-Type': metadata['contentType'],\r\n 'Content-Type': 'application/json; charset=utf-8'\r\n };\r\n var body = toResourceString(metadata, mappings);\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n function handler(xhr, text) {\r\n checkResumeHeader_(xhr);\r\n var url;\r\n try {\r\n url = xhr.getResponseHeader('X-Goog-Upload-URL');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n handlerCheck(isString(url));\r\n return url;\r\n }\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.urlParams = urlParams;\r\n requestInfo.headers = headers;\r\n requestInfo.body = body;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * @param url From a call to fbs.requests.createResumableUpload.\r\n */\r\nfunction getResumableUploadStatus(authWrapper, location, url, blob) {\r\n var headers = { 'X-Goog-Upload-Command': 'query' };\r\n function handler(xhr, text) {\r\n var status = checkResumeHeader_(xhr, ['active', 'final']);\r\n var sizeString;\r\n try {\r\n sizeString = xhr.getResponseHeader('X-Goog-Upload-Size-Received');\r\n }\r\n catch (e) {\r\n handlerCheck(false);\r\n }\r\n var size = parseInt(sizeString, 10);\r\n handlerCheck(!isNaN(size));\r\n return new ResumableUploadStatus(size, blob.size(), status === 'final');\r\n }\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\r\n/**\r\n * Any uploads via the resumable upload API must transfer a number of bytes\r\n * that is a multiple of this number.\r\n */\r\nvar resumableUploadChunkSize = 256 * 1024;\r\n/**\r\n * @param url From a call to fbs.requests.createResumableUpload.\r\n * @param chunkSize Number of bytes to upload.\r\n * @param opt_status The previous status.\r\n * If not passed or null, we start from the beginning.\r\n * @throws fbs.Error If the upload is already complete, the passed in status\r\n * has a final size inconsistent with the blob, or the blob cannot be sliced\r\n * for upload.\r\n */\r\nfunction continueResumableUpload(location, authWrapper, url, blob, chunkSize, mappings, opt_status, opt_progressCallback) {\r\n // TODO(andysoto): standardize on internal asserts\r\n // assert(!(opt_status && opt_status.finalized));\r\n var status = new ResumableUploadStatus(0, 0);\r\n if (opt_status) {\r\n status.current = opt_status.current;\r\n status.total = opt_status.total;\r\n }\r\n else {\r\n status.current = 0;\r\n status.total = blob.size();\r\n }\r\n if (blob.size() !== status.total) {\r\n throw serverFileWrongSize();\r\n }\r\n var bytesLeft = status.total - status.current;\r\n var bytesToUpload = bytesLeft;\r\n if (chunkSize > 0) {\r\n bytesToUpload = Math.min(bytesToUpload, chunkSize);\r\n }\r\n var startByte = status.current;\r\n var endByte = startByte + bytesToUpload;\r\n var uploadCommand = bytesToUpload === bytesLeft ? 'upload, finalize' : 'upload';\r\n var headers = {\r\n 'X-Goog-Upload-Command': uploadCommand,\r\n 'X-Goog-Upload-Offset': status.current\r\n };\r\n var body = blob.slice(startByte, endByte);\r\n if (body === null) {\r\n throw cannotSliceBlob();\r\n }\r\n function handler(xhr, text) {\r\n // TODO(andysoto): Verify the MD5 of each uploaded range:\r\n // the 'x-range-md5' header comes back with status code 308 responses.\r\n // We'll only be able to bail out though, because you can't re-upload a\r\n // range that you previously uploaded.\r\n var uploadStatus = checkResumeHeader_(xhr, ['active', 'final']);\r\n var newCurrent = status.current + bytesToUpload;\r\n var size = blob.size();\r\n var metadata;\r\n if (uploadStatus === 'final') {\r\n metadata = metadataHandler(authWrapper, mappings)(xhr, text);\r\n }\r\n else {\r\n metadata = null;\r\n }\r\n return new ResumableUploadStatus(newCurrent, size, uploadStatus === 'final', metadata);\r\n }\r\n var method = 'POST';\r\n var timeout = authWrapper.maxUploadRetryTime();\r\n var requestInfo = new RequestInfo(url, method, handler, timeout);\r\n requestInfo.headers = headers;\r\n requestInfo.body = body.uploadData();\r\n requestInfo.progressCallback = opt_progressCallback || null;\r\n requestInfo.errorHandler = sharedErrorHandler(location);\r\n return requestInfo;\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar Observer = /** @class */ (function () {\r\n function Observer(nextOrObserver, opt_error, opt_complete) {\r\n var asFunctions = isFunction(nextOrObserver) ||\r\n isDef(opt_error) ||\r\n isDef(opt_complete);\r\n if (asFunctions) {\r\n this.next = nextOrObserver;\r\n this.error = opt_error || null;\r\n this.complete = opt_complete || null;\r\n }\r\n else {\r\n var observer = nextOrObserver;\r\n this.next = observer.next || null;\r\n this.error = observer.error || null;\r\n this.complete = observer.complete || null;\r\n }\r\n }\r\n return Observer;\r\n}());\n\nvar UploadTaskSnapshot = /** @class */ (function () {\r\n function UploadTaskSnapshot(bytesTransferred, totalBytes, state, metadata, task, ref) {\r\n this.bytesTransferred = bytesTransferred;\r\n this.totalBytes = totalBytes;\r\n this.state = state;\r\n this.metadata = metadata;\r\n this.task = task;\r\n this.ref = ref;\r\n }\r\n Object.defineProperty(UploadTaskSnapshot.prototype, \"downloadURL\", {\r\n get: function () {\r\n if (this.metadata !== null) {\r\n var urls = this.metadata['downloadURLs'];\r\n if (urls != null && urls[0] != null) {\r\n return urls[0];\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return UploadTaskSnapshot;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Returns a function that invokes f with its arguments asynchronously as a\r\n * microtask, i.e. as soon as possible after the current script returns back\r\n * into browser code.\r\n */\r\nfunction async(f) {\r\n return function () {\r\n var argsToForward = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n argsToForward[_i] = arguments[_i];\r\n }\r\n resolve(true).then(function () {\r\n f.apply(null, argsToForward);\r\n });\r\n };\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Represents a blob being uploaded. Can be used to pause/resume/cancel the\r\n * upload and manage callbacks for various events.\r\n */\r\nvar UploadTask = /** @class */ (function () {\r\n /**\r\n * @param ref The firebaseStorage.Reference object this task came\r\n * from, untyped to avoid cyclic dependencies.\r\n * @param blob The blob to upload.\r\n */\r\n function UploadTask(ref, authWrapper, location, mappings, blob, metadata) {\r\n if (metadata === void 0) { metadata = null; }\r\n var _this = this;\r\n this.transferred_ = 0;\r\n this.needToFetchStatus_ = false;\r\n this.needToFetchMetadata_ = false;\r\n this.observers_ = [];\r\n this.error_ = null;\r\n this.uploadUrl_ = null;\r\n this.request_ = null;\r\n this.chunkMultiplier_ = 1;\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n this.ref_ = ref;\r\n this.authWrapper_ = authWrapper;\r\n this.location_ = location;\r\n this.blob_ = blob;\r\n this.metadata_ = metadata;\r\n this.mappings_ = mappings;\r\n this.resumable_ = this.shouldDoResumable_(this.blob_);\r\n this.state_ = InternalTaskState.RUNNING;\r\n this.errorHandler_ = function (error) {\r\n _this.request_ = null;\r\n _this.chunkMultiplier_ = 1;\r\n if (error.codeEquals(Code.CANCELED)) {\r\n _this.needToFetchStatus_ = true;\r\n _this.completeTransitions_();\r\n }\r\n else {\r\n _this.error_ = error;\r\n _this.transition_(InternalTaskState.ERROR);\r\n }\r\n };\r\n this.metadataErrorHandler_ = function (error) {\r\n _this.request_ = null;\r\n if (error.codeEquals(Code.CANCELED)) {\r\n _this.completeTransitions_();\r\n }\r\n else {\r\n _this.error_ = error;\r\n _this.transition_(InternalTaskState.ERROR);\r\n }\r\n };\r\n this.promise_ = make(function (resolve$$1, reject$$1) {\r\n _this.resolve_ = resolve$$1;\r\n _this.reject_ = reject$$1;\r\n _this.start_();\r\n });\r\n // Prevent uncaught rejections on the internal promise from bubbling out\r\n // to the top level with a dummy handler.\r\n this.promise_.then(null, function () { });\r\n }\r\n UploadTask.prototype.makeProgressCallback_ = function () {\r\n var _this = this;\r\n var sizeBefore = this.transferred_;\r\n return function (loaded, total) {\r\n _this.updateProgress_(sizeBefore + loaded);\r\n };\r\n };\r\n UploadTask.prototype.shouldDoResumable_ = function (blob) {\r\n return blob.size() > 256 * 1024;\r\n };\r\n UploadTask.prototype.start_ = function () {\r\n if (this.state_ !== InternalTaskState.RUNNING) {\r\n // This can happen if someone pauses us in a resume callback, for example.\r\n return;\r\n }\r\n if (this.request_ !== null) {\r\n return;\r\n }\r\n if (this.resumable_) {\r\n if (this.uploadUrl_ === null) {\r\n this.createResumable_();\r\n }\r\n else {\r\n if (this.needToFetchStatus_) {\r\n this.fetchStatus_();\r\n }\r\n else {\r\n if (this.needToFetchMetadata_) {\r\n // Happens if we miss the metadata on upload completion.\r\n this.fetchMetadata_();\r\n }\r\n else {\r\n this.continueUpload_();\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n this.oneShotUpload_();\r\n }\r\n };\r\n UploadTask.prototype.resolveToken_ = function (callback) {\r\n var _this = this;\r\n this.authWrapper_.getAuthToken().then(function (authToken) {\r\n switch (_this.state_) {\r\n case InternalTaskState.RUNNING:\r\n callback(authToken);\r\n break;\r\n case InternalTaskState.CANCELING:\r\n _this.transition_(InternalTaskState.CANCELED);\r\n break;\r\n case InternalTaskState.PAUSING:\r\n _this.transition_(InternalTaskState.PAUSED);\r\n break;\r\n default:\r\n }\r\n });\r\n };\r\n // TODO(andysoto): assert false\r\n UploadTask.prototype.createResumable_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = createResumableUpload(_this.authWrapper_, _this.location_, _this.mappings_, _this.blob_, _this.metadata_);\r\n var createRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = createRequest;\r\n createRequest.getPromise().then(function (url) {\r\n _this.request_ = null;\r\n _this.uploadUrl_ = url;\r\n _this.needToFetchStatus_ = false;\r\n _this.completeTransitions_();\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.fetchStatus_ = function () {\r\n var _this = this;\r\n // TODO(andysoto): assert(this.uploadUrl_ !== null);\r\n var url = this.uploadUrl_;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = getResumableUploadStatus(_this.authWrapper_, _this.location_, url, _this.blob_);\r\n var statusRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = statusRequest;\r\n statusRequest.getPromise().then(function (status) {\r\n status = status;\r\n _this.request_ = null;\r\n _this.updateProgress_(status.current);\r\n _this.needToFetchStatus_ = false;\r\n if (status.finalized) {\r\n _this.needToFetchMetadata_ = true;\r\n }\r\n _this.completeTransitions_();\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.continueUpload_ = function () {\r\n var _this = this;\r\n var chunkSize = resumableUploadChunkSize * this.chunkMultiplier_;\r\n var status = new ResumableUploadStatus(this.transferred_, this.blob_.size());\r\n // TODO(andysoto): assert(this.uploadUrl_ !== null);\r\n var url = this.uploadUrl_;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo;\r\n try {\r\n requestInfo = continueResumableUpload(_this.location_, _this.authWrapper_, url, _this.blob_, chunkSize, _this.mappings_, status, _this.makeProgressCallback_());\r\n }\r\n catch (e) {\r\n _this.error_ = e;\r\n _this.transition_(InternalTaskState.ERROR);\r\n return;\r\n }\r\n var uploadRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = uploadRequest;\r\n uploadRequest\r\n .getPromise()\r\n .then(function (newStatus) {\r\n _this.increaseMultiplier_();\r\n _this.request_ = null;\r\n _this.updateProgress_(newStatus.current);\r\n if (newStatus.finalized) {\r\n _this.metadata_ = newStatus.metadata;\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }\r\n else {\r\n _this.completeTransitions_();\r\n }\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.increaseMultiplier_ = function () {\r\n var currentSize = resumableUploadChunkSize * this.chunkMultiplier_;\r\n // Max chunk size is 32M.\r\n if (currentSize < 32 * 1024 * 1024) {\r\n this.chunkMultiplier_ *= 2;\r\n }\r\n };\r\n UploadTask.prototype.fetchMetadata_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = getMetadata(_this.authWrapper_, _this.location_, _this.mappings_);\r\n var metadataRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = metadataRequest;\r\n metadataRequest.getPromise().then(function (metadata) {\r\n _this.request_ = null;\r\n _this.metadata_ = metadata;\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }, _this.metadataErrorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.oneShotUpload_ = function () {\r\n var _this = this;\r\n this.resolveToken_(function (authToken) {\r\n var requestInfo = multipartUpload(_this.authWrapper_, _this.location_, _this.mappings_, _this.blob_, _this.metadata_);\r\n var multipartRequest = _this.authWrapper_.makeRequest(requestInfo, authToken);\r\n _this.request_ = multipartRequest;\r\n multipartRequest.getPromise().then(function (metadata) {\r\n _this.request_ = null;\r\n _this.metadata_ = metadata;\r\n _this.updateProgress_(_this.blob_.size());\r\n _this.transition_(InternalTaskState.SUCCESS);\r\n }, _this.errorHandler_);\r\n });\r\n };\r\n UploadTask.prototype.updateProgress_ = function (transferred) {\r\n var old = this.transferred_;\r\n this.transferred_ = transferred;\r\n // A progress update can make the \"transferred\" value smaller (e.g. a\r\n // partial upload not completed by server, after which the \"transferred\"\r\n // value may reset to the value at the beginning of the request).\r\n if (this.transferred_ !== old) {\r\n this.notifyObservers_();\r\n }\r\n };\r\n UploadTask.prototype.transition_ = function (state) {\r\n if (this.state_ === state) {\r\n return;\r\n }\r\n switch (state) {\r\n case InternalTaskState.CANCELING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING);\r\n this.state_ = state;\r\n if (this.request_ !== null) {\r\n this.request_.cancel();\r\n }\r\n break;\r\n case InternalTaskState.PAUSING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING);\r\n this.state_ = state;\r\n if (this.request_ !== null) {\r\n this.request_.cancel();\r\n }\r\n break;\r\n case InternalTaskState.RUNNING:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSED ||\r\n // this.state_ === InternalTaskState.PAUSING);\r\n var wasPaused = this.state_ === InternalTaskState.PAUSED;\r\n this.state_ = state;\r\n if (wasPaused) {\r\n this.notifyObservers_();\r\n this.start_();\r\n }\r\n break;\r\n case InternalTaskState.PAUSED:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.CANCELED:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.PAUSED ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.error_ = canceled();\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.ERROR:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n case InternalTaskState.SUCCESS:\r\n // TODO(andysoto):\r\n // assert(this.state_ === InternalTaskState.RUNNING ||\r\n // this.state_ === InternalTaskState.PAUSING ||\r\n // this.state_ === InternalTaskState.CANCELING);\r\n this.state_ = state;\r\n this.notifyObservers_();\r\n break;\r\n }\r\n };\r\n UploadTask.prototype.completeTransitions_ = function () {\r\n switch (this.state_) {\r\n case InternalTaskState.PAUSING:\r\n this.transition_(InternalTaskState.PAUSED);\r\n break;\r\n case InternalTaskState.CANCELING:\r\n this.transition_(InternalTaskState.CANCELED);\r\n break;\r\n case InternalTaskState.RUNNING:\r\n this.start_();\r\n break;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n break;\r\n }\r\n };\r\n Object.defineProperty(UploadTask.prototype, \"snapshot\", {\r\n get: function () {\r\n var externalState = taskStateFromInternalTaskState(this.state_);\r\n return new UploadTaskSnapshot(this.transferred_, this.blob_.size(), externalState, this.metadata_, this, this.ref_);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Adds a callback for an event.\r\n * @param type The type of event to listen for.\r\n */\r\n UploadTask.prototype.on = function (type, nextOrObserver, error, completed) {\r\n if (nextOrObserver === void 0) { nextOrObserver = undefined; }\r\n if (error === void 0) { error = undefined; }\r\n if (completed === void 0) { completed = undefined; }\r\n function typeValidator(_p) {\r\n if (type !== TaskEvent.STATE_CHANGED) {\r\n throw \"Expected one of the event types: [\" + TaskEvent.STATE_CHANGED + \"].\";\r\n }\r\n }\r\n var nextOrObserverMessage = 'Expected a function or an Object with one of ' +\r\n '`next`, `error`, `complete` properties.';\r\n var nextValidator = nullFunctionSpec(true).validator;\r\n var observerValidator = looseObjectSpec(null, true).validator;\r\n function nextOrObserverValidator(p) {\r\n try {\r\n nextValidator(p);\r\n return;\r\n }\r\n catch (e) { }\r\n try {\r\n observerValidator(p);\r\n var anyDefined = isJustDef(p['next']) ||\r\n isJustDef(p['error']) ||\r\n isJustDef(p['complete']);\r\n if (!anyDefined) {\r\n throw '';\r\n }\r\n return;\r\n }\r\n catch (e) {\r\n throw nextOrObserverMessage;\r\n }\r\n }\r\n var specs = [\r\n stringSpec(typeValidator),\r\n looseObjectSpec(nextOrObserverValidator, true),\r\n nullFunctionSpec(true),\r\n nullFunctionSpec(true)\r\n ];\r\n validate('on', specs, arguments);\r\n var self = this;\r\n function makeBinder(specs) {\r\n function binder(nextOrObserver, error, opt_complete) {\r\n if (specs !== null) {\r\n validate('on', specs, arguments);\r\n }\r\n var observer = new Observer(nextOrObserver, error, completed);\r\n self.addObserver_(observer);\r\n return function () {\r\n self.removeObserver_(observer);\r\n };\r\n }\r\n return binder;\r\n }\r\n function binderNextOrObserverValidator(p) {\r\n if (p === null) {\r\n throw nextOrObserverMessage;\r\n }\r\n nextOrObserverValidator(p);\r\n }\r\n var binderSpecs = [\r\n looseObjectSpec(binderNextOrObserverValidator),\r\n nullFunctionSpec(true),\r\n nullFunctionSpec(true)\r\n ];\r\n var typeOnly = !(isJustDef(nextOrObserver) ||\r\n isJustDef(error) ||\r\n isJustDef(completed));\r\n if (typeOnly) {\r\n return makeBinder(binderSpecs);\r\n }\r\n else {\r\n return makeBinder(null)(nextOrObserver, error, completed);\r\n }\r\n };\r\n /**\r\n * This object behaves like a Promise, and resolves with its snapshot data\r\n * when the upload completes.\r\n * @param onFulfilled The fulfillment callback. Promise chaining works as normal.\r\n * @param onRejected The rejection callback.\r\n */\r\n UploadTask.prototype.then = function (onFulfilled, onRejected) {\r\n // These casts are needed so that TypeScript can infer the types of the\r\n // resulting Promise.\r\n return this.promise_.then(onFulfilled, onRejected);\r\n };\r\n /**\r\n * Equivalent to calling `then(null, onRejected)`.\r\n */\r\n UploadTask.prototype.catch = function (onRejected) {\r\n return this.then(null, onRejected);\r\n };\r\n /**\r\n * Adds the given observer.\r\n */\r\n UploadTask.prototype.addObserver_ = function (observer) {\r\n this.observers_.push(observer);\r\n this.notifyObserver_(observer);\r\n };\r\n /**\r\n * Removes the given observer.\r\n */\r\n UploadTask.prototype.removeObserver_ = function (observer) {\r\n remove(this.observers_, observer);\r\n };\r\n UploadTask.prototype.notifyObservers_ = function () {\r\n var _this = this;\r\n this.finishPromise_();\r\n var observers = clone$1(this.observers_);\r\n observers.forEach(function (observer) {\r\n _this.notifyObserver_(observer);\r\n });\r\n };\r\n UploadTask.prototype.finishPromise_ = function () {\r\n if (this.resolve_ !== null) {\r\n var triggered = true;\r\n switch (taskStateFromInternalTaskState(this.state_)) {\r\n case TaskState.SUCCESS:\r\n async(this.resolve_.bind(null, this.snapshot))();\r\n break;\r\n case TaskState.CANCELED:\r\n case TaskState.ERROR:\r\n var toCall = this.reject_;\r\n async(toCall.bind(null, this.error_))();\r\n break;\r\n default:\r\n triggered = false;\r\n break;\r\n }\r\n if (triggered) {\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n }\r\n }\r\n };\r\n UploadTask.prototype.notifyObserver_ = function (observer) {\r\n var externalState = taskStateFromInternalTaskState(this.state_);\r\n switch (externalState) {\r\n case TaskState.RUNNING:\r\n case TaskState.PAUSED:\r\n if (observer.next !== null) {\r\n async(observer.next.bind(observer, this.snapshot))();\r\n }\r\n break;\r\n case TaskState.SUCCESS:\r\n if (observer.complete !== null) {\r\n async(observer.complete.bind(observer))();\r\n }\r\n break;\r\n case TaskState.CANCELED:\r\n case TaskState.ERROR:\r\n if (observer.error !== null) {\r\n async(observer.error.bind(observer, this.error_))();\r\n }\r\n break;\r\n default:\r\n // TODO(andysoto): assert(false);\r\n if (observer.error !== null) {\r\n async(observer.error.bind(observer, this.error_))();\r\n }\r\n }\r\n };\r\n /**\r\n * Resumes a paused task. Has no effect on a currently running or failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.resume = function () {\r\n validate('resume', [], arguments);\r\n var valid = this.state_ === InternalTaskState.PAUSED ||\r\n this.state_ === InternalTaskState.PAUSING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.RUNNING);\r\n }\r\n return valid;\r\n };\r\n /**\r\n * Pauses a currently running task. Has no effect on a paused or failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.pause = function () {\r\n validate('pause', [], arguments);\r\n var valid = this.state_ === InternalTaskState.RUNNING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.PAUSING);\r\n }\r\n return valid;\r\n };\r\n /**\r\n * Cancels a currently running or paused task. Has no effect on a complete or\r\n * failed task.\r\n * @return True if the operation took effect, false if ignored.\r\n */\r\n UploadTask.prototype.cancel = function () {\r\n validate('cancel', [], arguments);\r\n var valid = this.state_ === InternalTaskState.RUNNING ||\r\n this.state_ === InternalTaskState.PAUSING;\r\n if (valid) {\r\n this.transition_(InternalTaskState.CANCELING);\r\n }\r\n return valid;\r\n };\r\n return UploadTask;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Provides methods to interact with a bucket in the Firebase Storage service.\r\n * @param location An fbs.location, or the URL at\r\n * which to base this object, in one of the following forms:\r\n * gs:///\r\n * http[s]://firebasestorage.googleapis.com/\r\n * /b//o/\r\n * Any query or fragment strings will be ignored in the http[s]\r\n * format. If no value is passed, the storage object will use a URL based on\r\n * the project ID of the base firebase.App instance.\r\n */\r\nvar Reference = /** @class */ (function () {\r\n function Reference(authWrapper, location) {\r\n this.authWrapper = authWrapper;\r\n if (location instanceof Location) {\r\n this.location = location;\r\n }\r\n else {\r\n this.location = Location.makeFromUrl(location);\r\n }\r\n }\r\n /**\r\n * @return The URL for the bucket and path this object references,\r\n * in the form gs:///\r\n * @override\r\n */\r\n Reference.prototype.toString = function () {\r\n validate('toString', [], arguments);\r\n return 'gs://' + this.location.bucket + '/' + this.location.path;\r\n };\r\n Reference.prototype.newRef = function (authWrapper, location) {\r\n return new Reference(authWrapper, location);\r\n };\r\n Reference.prototype.mappings = function () {\r\n return getMappings();\r\n };\r\n /**\r\n * @return A reference to the object obtained by\r\n * appending childPath, removing any duplicate, beginning, or trailing\r\n * slashes.\r\n */\r\n Reference.prototype.child = function (childPath) {\r\n validate('child', [stringSpec()], arguments);\r\n var newPath = child(this.location.path, childPath);\r\n var location = new Location(this.location.bucket, newPath);\r\n return this.newRef(this.authWrapper, location);\r\n };\r\n Object.defineProperty(Reference.prototype, \"parent\", {\r\n /**\r\n * @return A reference to the parent of the\r\n * current object, or null if the current object is the root.\r\n */\r\n get: function () {\r\n var newPath = parent(this.location.path);\r\n if (newPath === null) {\r\n return null;\r\n }\r\n var location = new Location(this.location.bucket, newPath);\r\n return this.newRef(this.authWrapper, location);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"root\", {\r\n /**\r\n * @return An reference to the root of this\r\n * object's bucket.\r\n */\r\n get: function () {\r\n var location = new Location(this.location.bucket, '');\r\n return this.newRef(this.authWrapper, location);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"bucket\", {\r\n get: function () {\r\n return this.location.bucket;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"fullPath\", {\r\n get: function () {\r\n return this.location.path;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"name\", {\r\n get: function () {\r\n return lastComponent(this.location.path);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Reference.prototype, \"storage\", {\r\n get: function () {\r\n return this.authWrapper.service();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Uploads a blob to this object's location.\r\n * @param data The blob to upload.\r\n * @return An UploadTask that lets you control and\r\n * observe the upload.\r\n */\r\n Reference.prototype.put = function (data, metadata) {\r\n if (metadata === void 0) { metadata = null; }\r\n validate('put', [uploadDataSpec(), metadataSpec(true)], arguments);\r\n this.throwIfRoot_('put');\r\n return new UploadTask(this, this.authWrapper, this.location, this.mappings(), new FbsBlob(data), metadata);\r\n };\r\n /**\r\n * Uploads a string to this object's location.\r\n * @param string The string to upload.\r\n * @param opt_format The format of the string to upload.\r\n * @return An UploadTask that lets you control and\r\n * observe the upload.\r\n */\r\n Reference.prototype.putString = function (string, format, opt_metadata) {\r\n if (format === void 0) { format = StringFormat.RAW; }\r\n validate('putString', [\r\n stringSpec(),\r\n stringSpec(formatValidator, true),\r\n metadataSpec(true)\r\n ], arguments);\r\n this.throwIfRoot_('putString');\r\n var data = dataFromString(format, string);\r\n var metadata = clone(opt_metadata);\r\n if (!isDef(metadata['contentType']) && isDef(data.contentType)) {\r\n metadata['contentType'] = data.contentType;\r\n }\r\n return new UploadTask(this, this.authWrapper, this.location, this.mappings(), new FbsBlob(data.data, true), metadata);\r\n };\r\n /**\r\n * Deletes the object at this location.\r\n * @return A promise that resolves if the deletion succeeds.\r\n */\r\n Reference.prototype.delete = function () {\r\n validate('delete', [], arguments);\r\n this.throwIfRoot_('delete');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = deleteObject(self.authWrapper, self.location);\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * A promise that resolves with the metadata for this object. If this\r\n * object doesn't exist or metadata cannot be retreived, the promise is\r\n * rejected.\r\n */\r\n Reference.prototype.getMetadata = function () {\r\n validate('getMetadata', [], arguments);\r\n this.throwIfRoot_('getMetadata');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = getMetadata(self.authWrapper, self.location, self.mappings());\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * Updates the metadata for this object.\r\n * @param metadata The new metadata for the object.\r\n * Only values that have been explicitly set will be changed. Explicitly\r\n * setting a value to null will remove the metadata.\r\n * @return A promise that resolves\r\n * with the new metadata for this object.\r\n * @see firebaseStorage.Reference.prototype.getMetadata\r\n */\r\n Reference.prototype.updateMetadata = function (metadata) {\r\n validate('updateMetadata', [metadataSpec()], arguments);\r\n this.throwIfRoot_('updateMetadata');\r\n var self = this;\r\n return this.authWrapper.getAuthToken().then(function (authToken) {\r\n var requestInfo = updateMetadata(self.authWrapper, self.location, metadata, self.mappings());\r\n return self.authWrapper.makeRequest(requestInfo, authToken).getPromise();\r\n });\r\n };\r\n /**\r\n * @return A promise that resolves with the download\r\n * URL for this object.\r\n */\r\n Reference.prototype.getDownloadURL = function () {\r\n validate('getDownloadURL', [], arguments);\r\n this.throwIfRoot_('getDownloadURL');\r\n return this.getMetadata().then(function (metadata) {\r\n var url = metadata['downloadURLs'][0];\r\n if (isDef(url)) {\r\n return url;\r\n }\r\n else {\r\n throw noDownloadURL();\r\n }\r\n });\r\n };\r\n Reference.prototype.throwIfRoot_ = function (name) {\r\n if (this.location.path === '') {\r\n throw invalidRootOperation(name);\r\n }\r\n };\r\n return Reference;\r\n}());\n\n/**\r\n * A request whose promise always fails.\r\n * @struct\r\n * @template T\r\n */\r\nvar FailRequest = /** @class */ (function () {\r\n function FailRequest(error) {\r\n this.promise_ = reject(error);\r\n }\r\n /** @inheritDoc */\r\n FailRequest.prototype.getPromise = function () {\r\n return this.promise_;\r\n };\r\n /** @inheritDoc */\r\n FailRequest.prototype.cancel = function (appDelete) {\r\n if (appDelete === void 0) { appDelete = false; }\r\n };\r\n return FailRequest;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n */\r\nvar RequestMap = /** @class */ (function () {\r\n function RequestMap() {\r\n this.map_ = {};\r\n this.id_ = minSafeInteger;\r\n }\r\n /**\r\n * Registers the given request with this map.\r\n * The request is unregistered when it completes.\r\n * @param r The request to register.\r\n */\r\n RequestMap.prototype.addRequest = function (r) {\r\n var id = this.id_;\r\n this.id_++;\r\n this.map_[id] = r;\r\n var self = this;\r\n function unmap() {\r\n delete self.map_[id];\r\n }\r\n r.getPromise().then(unmap, unmap);\r\n };\r\n /**\r\n * Cancels all registered requests.\r\n */\r\n RequestMap.prototype.clear = function () {\r\n forEach(this.map_, function (key, val) {\r\n if (val) {\r\n val.cancel(true);\r\n }\r\n });\r\n this.map_ = {};\r\n };\r\n return RequestMap;\r\n}());\n\n/**\r\n * @param app If null, getAuthToken always resolves with null.\r\n * @param service The storage service associated with this auth wrapper.\r\n * Untyped to avoid circular type dependencies.\r\n * @struct\r\n */\r\nvar AuthWrapper = /** @class */ (function () {\r\n function AuthWrapper(app, maker, requestMaker, service, pool) {\r\n this.bucket_ = null;\r\n this.deleted_ = false;\r\n this.app_ = app;\r\n if (this.app_ !== null) {\r\n var options = this.app_.options;\r\n if (isDef(options)) {\r\n this.bucket_ = AuthWrapper.extractBucket_(options);\r\n }\r\n }\r\n this.storageRefMaker_ = maker;\r\n this.requestMaker_ = requestMaker;\r\n this.pool_ = pool;\r\n this.service_ = service;\r\n this.maxOperationRetryTime_ = defaultMaxOperationRetryTime;\r\n this.maxUploadRetryTime_ = defaultMaxUploadRetryTime;\r\n this.requestMap_ = new RequestMap();\r\n }\r\n AuthWrapper.extractBucket_ = function (config) {\r\n var bucketString = config[configOption] || null;\r\n if (bucketString == null) {\r\n return null;\r\n }\r\n var loc = Location.makeFromBucketSpec(bucketString);\r\n return loc.bucket;\r\n };\r\n AuthWrapper.prototype.getAuthToken = function () {\r\n // TODO(andysoto): remove ifDef checks after firebase-app implements stubs\r\n // (b/28673818).\r\n if (this.app_ !== null &&\r\n isDef(this.app_.INTERNAL) &&\r\n isDef(this.app_.INTERNAL.getToken)) {\r\n return this.app_.INTERNAL.getToken().then(function (response) {\r\n if (response !== null) {\r\n return response.accessToken;\r\n }\r\n else {\r\n return null;\r\n }\r\n }, function (_error) {\r\n return null;\r\n });\r\n }\r\n else {\r\n return resolve(null);\r\n }\r\n };\r\n AuthWrapper.prototype.bucket = function () {\r\n if (this.deleted_) {\r\n throw appDeleted();\r\n }\r\n else {\r\n return this.bucket_;\r\n }\r\n };\r\n /**\r\n * The service associated with this auth wrapper. Untyped to avoid circular\r\n * type dependencies.\r\n */\r\n AuthWrapper.prototype.service = function () {\r\n return this.service_;\r\n };\r\n /**\r\n * Returns a new firebaseStorage.Reference object referencing this AuthWrapper\r\n * at the given Location.\r\n * @param loc The Location.\r\n * @return Actually a firebaseStorage.Reference, typing not allowed\r\n * because of circular dependency problems.\r\n */\r\n AuthWrapper.prototype.makeStorageReference = function (loc) {\r\n return this.storageRefMaker_(this, loc);\r\n };\r\n AuthWrapper.prototype.makeRequest = function (requestInfo, authToken) {\r\n if (!this.deleted_) {\r\n var request = this.requestMaker_(requestInfo, authToken, this.pool_);\r\n this.requestMap_.addRequest(request);\r\n return request;\r\n }\r\n else {\r\n return new FailRequest(appDeleted());\r\n }\r\n };\r\n /**\r\n * Stop running requests and prevent more from being created.\r\n */\r\n AuthWrapper.prototype.deleteApp = function () {\r\n this.deleted_ = true;\r\n this.app_ = null;\r\n this.requestMap_.clear();\r\n };\r\n AuthWrapper.prototype.maxUploadRetryTime = function () {\r\n return this.maxUploadRetryTime_;\r\n };\r\n AuthWrapper.prototype.setMaxUploadRetryTime = function (time) {\r\n this.maxUploadRetryTime_ = time;\r\n };\r\n AuthWrapper.prototype.maxOperationRetryTime = function () {\r\n return this.maxOperationRetryTime_;\r\n };\r\n AuthWrapper.prototype.setMaxOperationRetryTime = function (time) {\r\n this.maxOperationRetryTime_ = time;\r\n };\r\n return AuthWrapper;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @param f May be invoked\r\n * before the function returns.\r\n * @param callback Get all the arguments passed to the function\r\n * passed to f, including the initial boolean.\r\n */\r\nfunction start(f, callback, timeout) {\r\n // TODO(andysoto): make this code cleaner (probably refactor into an actual\r\n // type instead of a bunch of functions with state shared in the closure)\r\n var waitSeconds = 1;\r\n // Would type this as \"number\" but that doesn't work for Node so ¯\\_(ツ)_/¯\r\n var timeoutId = null;\r\n var hitTimeout = false;\r\n var cancelState = 0;\r\n function canceled() {\r\n return cancelState === 2;\r\n }\r\n var triggeredCallback = false;\r\n function triggerCallback() {\r\n if (!triggeredCallback) {\r\n triggeredCallback = true;\r\n callback.apply(null, arguments);\r\n }\r\n }\r\n function callWithDelay(millis) {\r\n timeoutId = setTimeout(function () {\r\n timeoutId = null;\r\n f(handler, canceled());\r\n }, millis);\r\n }\r\n function handler(success) {\r\n var var_args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n var_args[_i - 1] = arguments[_i];\r\n }\r\n if (triggeredCallback) {\r\n return;\r\n }\r\n if (success) {\r\n triggerCallback.apply(null, arguments);\r\n return;\r\n }\r\n var mustStop = canceled() || hitTimeout;\r\n if (mustStop) {\r\n triggerCallback.apply(null, arguments);\r\n return;\r\n }\r\n if (waitSeconds < 64) {\r\n /* TODO(andysoto): don't back off so quickly if we know we're offline. */\r\n waitSeconds *= 2;\r\n }\r\n var waitMillis;\r\n if (cancelState === 1) {\r\n cancelState = 2;\r\n waitMillis = 0;\r\n }\r\n else {\r\n waitMillis = (waitSeconds + Math.random()) * 1000;\r\n }\r\n callWithDelay(waitMillis);\r\n }\r\n var stopped = false;\r\n function stop(wasTimeout) {\r\n if (stopped) {\r\n return;\r\n }\r\n stopped = true;\r\n if (triggeredCallback) {\r\n return;\r\n }\r\n if (timeoutId !== null) {\r\n if (!wasTimeout) {\r\n cancelState = 2;\r\n }\r\n clearTimeout(timeoutId);\r\n callWithDelay(0);\r\n }\r\n else {\r\n if (!wasTimeout) {\r\n cancelState = 1;\r\n }\r\n }\r\n }\r\n callWithDelay(0);\r\n setTimeout(function () {\r\n hitTimeout = true;\r\n stop(true);\r\n }, timeout);\r\n return stop;\r\n}\r\n/**\r\n * Stops the retry loop from repeating.\r\n * If the function is currently \"in between\" retries, it is invoked immediately\r\n * with the second parameter as \"true\". Otherwise, it will be invoked once more\r\n * after the current invocation finishes iff the current invocation would have\r\n * triggered another retry.\r\n */\r\nfunction stop(id) {\r\n id(false);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * @struct\r\n * @template T\r\n */\r\nvar NetworkRequest = /** @class */ (function () {\r\n function NetworkRequest(url, method, headers, body, successCodes, additionalRetryCodes, callback, errorCallback, timeout, progressCallback, pool) {\r\n this.pendingXhr_ = null;\r\n this.backoffId_ = null;\r\n this.resolve_ = null;\r\n this.reject_ = null;\r\n this.canceled_ = false;\r\n this.appDelete_ = false;\r\n this.url_ = url;\r\n this.method_ = method;\r\n this.headers_ = headers;\r\n this.body_ = body;\r\n this.successCodes_ = successCodes.slice();\r\n this.additionalRetryCodes_ = additionalRetryCodes.slice();\r\n this.callback_ = callback;\r\n this.errorCallback_ = errorCallback;\r\n this.progressCallback_ = progressCallback;\r\n this.timeout_ = timeout;\r\n this.pool_ = pool;\r\n var self = this;\r\n this.promise_ = make(function (resolve$$1, reject$$1) {\r\n self.resolve_ = resolve$$1;\r\n self.reject_ = reject$$1;\r\n self.start_();\r\n });\r\n }\r\n /**\r\n * Actually starts the retry loop.\r\n */\r\n NetworkRequest.prototype.start_ = function () {\r\n var self = this;\r\n function doTheRequest(backoffCallback, canceled$$1) {\r\n if (canceled$$1) {\r\n backoffCallback(false, new RequestEndStatus(false, null, true));\r\n return;\r\n }\r\n var xhr = self.pool_.createXhrIo();\r\n self.pendingXhr_ = xhr;\r\n function progressListener(progressEvent) {\r\n var loaded = progressEvent.loaded;\r\n var total = progressEvent.lengthComputable ? progressEvent.total : -1;\r\n if (self.progressCallback_ !== null) {\r\n self.progressCallback_(loaded, total);\r\n }\r\n }\r\n if (self.progressCallback_ !== null) {\r\n xhr.addUploadProgressListener(progressListener);\r\n }\r\n xhr\r\n .send(self.url_, self.method_, self.body_, self.headers_)\r\n .then(function (xhr) {\r\n if (self.progressCallback_ !== null) {\r\n xhr.removeUploadProgressListener(progressListener);\r\n }\r\n self.pendingXhr_ = null;\r\n xhr = xhr;\r\n var hitServer = xhr.getErrorCode() === ErrorCode.NO_ERROR;\r\n var status = xhr.getStatus();\r\n if (!hitServer || self.isRetryStatusCode_(status)) {\r\n var wasCanceled = xhr.getErrorCode() === ErrorCode.ABORT;\r\n backoffCallback(false, new RequestEndStatus(false, null, wasCanceled));\r\n return;\r\n }\r\n var successCode = contains$1(self.successCodes_, status);\r\n backoffCallback(true, new RequestEndStatus(successCode, xhr));\r\n });\r\n }\r\n /**\r\n * @param requestWentThrough True if the request eventually went\r\n * through, false if it hit the retry limit or was canceled.\r\n */\r\n function backoffDone(requestWentThrough, status) {\r\n var resolve$$1 = self.resolve_;\r\n var reject$$1 = self.reject_;\r\n var xhr = status.xhr;\r\n if (status.wasSuccessCode) {\r\n try {\r\n var result = self.callback_(xhr, xhr.getResponseText());\r\n if (isJustDef(result)) {\r\n resolve$$1(result);\r\n }\r\n else {\r\n resolve$$1();\r\n }\r\n }\r\n catch (e) {\r\n reject$$1(e);\r\n }\r\n }\r\n else {\r\n if (xhr !== null) {\r\n var err = unknown();\r\n err.setServerResponseProp(xhr.getResponseText());\r\n if (self.errorCallback_) {\r\n reject$$1(self.errorCallback_(xhr, err));\r\n }\r\n else {\r\n reject$$1(err);\r\n }\r\n }\r\n else {\r\n if (status.canceled) {\r\n var err = self.appDelete_\r\n ? appDeleted()\r\n : canceled();\r\n reject$$1(err);\r\n }\r\n else {\r\n var err = retryLimitExceeded();\r\n reject$$1(err);\r\n }\r\n }\r\n }\r\n }\r\n if (this.canceled_) {\r\n backoffDone(false, new RequestEndStatus(false, null, true));\r\n }\r\n else {\r\n this.backoffId_ = start(doTheRequest, backoffDone, this.timeout_);\r\n }\r\n };\r\n /** @inheritDoc */\r\n NetworkRequest.prototype.getPromise = function () {\r\n return this.promise_;\r\n };\r\n /** @inheritDoc */\r\n NetworkRequest.prototype.cancel = function (appDelete) {\r\n this.canceled_ = true;\r\n this.appDelete_ = appDelete || false;\r\n if (this.backoffId_ !== null) {\r\n stop(this.backoffId_);\r\n }\r\n if (this.pendingXhr_ !== null) {\r\n this.pendingXhr_.abort();\r\n }\r\n };\r\n NetworkRequest.prototype.isRetryStatusCode_ = function (status) {\r\n // The codes for which to retry came from this page:\r\n // https://cloud.google.com/storage/docs/exponential-backoff\r\n var isFiveHundredCode = status >= 500 && status < 600;\r\n var extraRetryCodes = [\r\n // Request Timeout: web server didn't receive full request in time.\r\n 408,\r\n // Too Many Requests: you're getting rate-limited, basically.\r\n 429\r\n ];\r\n var isExtraRetryCode = contains$1(extraRetryCodes, status);\r\n var isRequestSpecificRetryCode = contains$1(this.additionalRetryCodes_, status);\r\n return isFiveHundredCode || isExtraRetryCode || isRequestSpecificRetryCode;\r\n };\r\n return NetworkRequest;\r\n}());\r\n/**\r\n * A collection of information about the result of a network request.\r\n * @param opt_canceled Defaults to false.\r\n * @struct\r\n */\r\nvar RequestEndStatus = /** @class */ (function () {\r\n function RequestEndStatus(wasSuccessCode, xhr, opt_canceled) {\r\n this.wasSuccessCode = wasSuccessCode;\r\n this.xhr = xhr;\r\n this.canceled = !!opt_canceled;\r\n }\r\n return RequestEndStatus;\r\n}());\r\nfunction addAuthHeader_(headers, authToken) {\r\n if (authToken !== null && authToken.length > 0) {\r\n headers['Authorization'] = 'Firebase ' + authToken;\r\n }\r\n}\r\nfunction addVersionHeader_(headers) {\r\n var number = typeof firebase !== 'undefined' ? firebase.SDK_VERSION : 'AppManager';\r\n headers['X-Firebase-Storage-Version'] = 'webjs/' + number;\r\n}\r\n/**\r\n * @template T\r\n */\r\nfunction makeRequest(requestInfo, authToken, pool) {\r\n var queryPart = makeQueryString(requestInfo.urlParams);\r\n var url = requestInfo.url + queryPart;\r\n var headers = clone(requestInfo.headers);\r\n addAuthHeader_(headers, authToken);\r\n addVersionHeader_(headers);\r\n return new NetworkRequest(url, requestInfo.method, headers, requestInfo.body, requestInfo.successCodes, requestInfo.additionalRetryCodes, requestInfo.handler, requestInfo.errorHandler, requestInfo.timeout, requestInfo.progressCallback, pool);\r\n}\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * A service that provides firebaseStorage.Reference instances.\r\n * @param opt_url gs:// url to a custom Storage Bucket\r\n *\r\n * @struct\r\n */\r\nvar Service = /** @class */ (function () {\r\n function Service(app, pool, url) {\r\n this.bucket_ = null;\r\n function maker(authWrapper, loc) {\r\n return new Reference(authWrapper, loc);\r\n }\r\n this.authWrapper_ = new AuthWrapper(app, maker, makeRequest, this, pool);\r\n this.app_ = app;\r\n if (url != null) {\r\n this.bucket_ = Location.makeFromBucketSpec(url);\r\n }\r\n else {\r\n var authWrapperBucket = this.authWrapper_.bucket();\r\n if (authWrapperBucket != null) {\r\n this.bucket_ = new Location(authWrapperBucket, '');\r\n }\r\n }\r\n this.internals_ = new ServiceInternals(this);\r\n }\r\n /**\r\n * Returns a firebaseStorage.Reference for the given path in the default\r\n * bucket.\r\n */\r\n Service.prototype.ref = function (path) {\r\n function validator(path) {\r\n if (/^[A-Za-z]+:\\/\\//.test(path)) {\r\n throw 'Expected child path but got a URL, use refFromURL instead.';\r\n }\r\n }\r\n validate('ref', [stringSpec(validator, true)], arguments);\r\n if (this.bucket_ == null) {\r\n throw new Error('No Storage Bucket defined in Firebase Options.');\r\n }\r\n var ref = new Reference(this.authWrapper_, this.bucket_);\r\n if (path != null) {\r\n return ref.child(path);\r\n }\r\n else {\r\n return ref;\r\n }\r\n };\r\n /**\r\n * Returns a firebaseStorage.Reference object for the given absolute URL,\r\n * which must be a gs:// or http[s]:// URL.\r\n */\r\n Service.prototype.refFromURL = function (url) {\r\n function validator(p) {\r\n if (!/^[A-Za-z]+:\\/\\//.test(p)) {\r\n throw 'Expected full URL but got a child path, use ref instead.';\r\n }\r\n try {\r\n Location.makeFromUrl(p);\r\n }\r\n catch (e) {\r\n throw 'Expected valid full URL but got an invalid one.';\r\n }\r\n }\r\n validate('refFromURL', [stringSpec(validator, false)], arguments);\r\n return new Reference(this.authWrapper_, url);\r\n };\r\n Object.defineProperty(Service.prototype, \"maxUploadRetryTime\", {\r\n get: function () {\r\n return this.authWrapper_.maxUploadRetryTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Service.prototype.setMaxUploadRetryTime = function (time) {\r\n validate('setMaxUploadRetryTime', [nonNegativeNumberSpec()], arguments);\r\n this.authWrapper_.setMaxUploadRetryTime(time);\r\n };\r\n Object.defineProperty(Service.prototype, \"maxOperationRetryTime\", {\r\n get: function () {\r\n return this.authWrapper_.maxOperationRetryTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Service.prototype.setMaxOperationRetryTime = function (time) {\r\n validate('setMaxOperationRetryTime', [nonNegativeNumberSpec()], arguments);\r\n this.authWrapper_.setMaxOperationRetryTime(time);\r\n };\r\n Object.defineProperty(Service.prototype, \"app\", {\r\n get: function () {\r\n return this.app_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Service.prototype, \"INTERNAL\", {\r\n get: function () {\r\n return this.internals_;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Service;\r\n}());\r\n/**\r\n * @struct\r\n */\r\nvar ServiceInternals = /** @class */ (function () {\r\n function ServiceInternals(service) {\r\n this.service_ = service;\r\n }\r\n /**\r\n * Called when the associated app is deleted.\r\n * @see {!fbs.AuthWrapper.prototype.deleteApp}\r\n */\r\n ServiceInternals.prototype.delete = function () {\r\n this.service_.authWrapper_.deleteApp();\r\n return resolve(undefined);\r\n };\r\n return ServiceInternals;\r\n}());\n\n/**\r\n * Copyright 2017 Google Inc.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n/**\r\n * Type constant for Firebase Storage.\r\n */\r\nvar STORAGE_TYPE = 'storage';\r\nfunction factory(app, unused, opt_url) {\r\n return new Service(app, new XhrIoPool(), opt_url);\r\n}\r\nfunction registerStorage(instance) {\r\n var namespaceExports = {\r\n // no-inline\r\n TaskState: TaskState,\r\n TaskEvent: TaskEvent,\r\n StringFormat: StringFormat,\r\n Storage: Service,\r\n Reference: Reference\r\n };\r\n instance.INTERNAL.registerService(STORAGE_TYPE, factory, namespaceExports, undefined, \r\n // Allow multiple storage instances per app.\r\n true);\r\n}\r\nregisterStorage(firebase);\n\nexport { registerStorage };\n"],"names":["domainBase","downloadBase","apiBaseUrl","apiUploadBaseUrl","defaultMaxOperationRetryTime","defaultMaxUploadRetryTime","minSafeInteger","FirebaseStorageError","code","message","this","code_","prependCode","message_","serverResponse_","name_","prototype","codeProp","codeEquals","serverResponseProp","setServerResponseProp","serverResponse","Object","defineProperty","get","enumerable","configurable","Code","UNKNOWN","OBJECT_NOT_FOUND","BUCKET_NOT_FOUND","PROJECT_NOT_FOUND","QUOTA_EXCEEDED","UNAUTHENTICATED","UNAUTHORIZED","RETRY_LIMIT_EXCEEDED","INVALID_CHECKSUM","CANCELED","INVALID_EVENT_NAME","INVALID_URL","INVALID_DEFAULT_BUCKET","NO_DEFAULT_BUCKET","CANNOT_SLICE_BLOB","SERVER_FILE_WRONG_SIZE","NO_DOWNLOAD_URL","INVALID_ARGUMENT","INVALID_ARGUMENT_COUNT","APP_DELETED","INVALID_ROOT_OPERATION","INVALID_FORMAT","INTERNAL_ERROR","unknown","canceled","cannotSliceBlob","invalidArgument","index","fnName","appDeleted","invalidFormat","format","internalError","StringFormat","RAW","BASE64","BASE64URL","DATA_URL","formatValidator","stringFormat","StringData","data","opt_contentType","contentType","dataFromString","string","utf8Bytes_","base64Bytes_","parts","DataURLParts","base64","rest","decoded","decodeURIComponent","e","percentEncodedBytes_","dataURLBytes_","dataURLContentType_","b","i","length","c","charCodeAt","push","Uint8Array","hasMinus","indexOf","hasUnder","hasPlus","hasSlash","replace","bytes","atob","array","dataURL","matches","match","middle","s","end","substring","ErrorCode","TaskEvent","STATE_CHANGED","InternalTaskState","RUNNING","PAUSING","PAUSED","SUCCESS","CANCELING","ERROR","TaskState","taskStateFromInternalTaskState","state","contains","obj","prop","hasOwnProperty","call","forEach","f","key","clone","val","make","resolver","Promise","resolve","value","isDef","p","isJustDef","isFunction","isObject","isNonNullObject","isString","String","isNativeBlob","isNativeBlobDefined","Blob","NetworkXhrIo","_this","sent_","xhr_","XMLHttpRequest","errorCode_","NO_ERROR","sendPromise_","resolve$$1","reject$$1","addEventListener","event","ABORT","NETWORK_ERROR","send","url","method","opt_body","opt_headers","open","setRequestHeader","toString","getErrorCode","getStatus","status","getResponseText","responseText","abort","getResponseHeader","header","addUploadProgressListener","listener","upload","removeUploadProgressListener","removeEventListener","XhrIoPool","createXhrIo","jsonObjectOrNull","JSON","parse","Array","isArray","Location","bucket","path","path_","fullServerUrl","encode","encodeURIComponent","bucketOnlyServerUrl","makeFromBucketSpec","bucketString","bucketLocation","makeFromUrl","location","groups","regex","RegExp","indices","postModify","loc","charAt","slice","group","captures","exec","bucketValue","pathValue","invalidUrl","lastComponent","lastIndexOf","makeNormalUrl","urlPart","makeUploadUrl","makeQueryString","params","queryPart","nextPart","noXform_","metadata","Mapping","server","opt_local","opt_writable","opt_xform","local","writable","xform","mappings_","getMappings","mappings","nameMapping","fullPath","xformPath","sizeMapping","size","tokens","split","map","token","makeDownloadUrl","alt","fromResource","authWrapper","resource","type","len","mapping","makeStorageReference","addRef","toResourceString","stringify","metadataValidator","validate","name","specs","passed","minArgs","maxArgs","optional","argMin","argMax","real","countPart","plural","validator","Error","ArgSpec","opt_optional","self","stringSpec","opt_validator","stringValidator","v1","v2","metadataSpec","nonNegativeNumberSpec","Number","isNumber","looseObjectSpec","undefined","nullFunctionSpec","getBlobBuilder","BlobBuilder","WebKitBlobBuilder","FbsBlob","opt_elideCopy","blobType","data_","ArrayBuffer","byteLength","set","size_","type_","startByte","endByte","realBlob","sliced","start","blob","webkitSlice","mozSlice","buffer","getBlob","var_args","_i","arguments","blobby","bb","append","apply","uint8Arrays","finalLength_1","merged_1","index_1","uploadData","contains$1","elem","RequestInfo","handler","timeout","urlParams","headers","body","errorHandler","progressCallback","successCodes","additionalRetryCodes","handlerCheck","cndn","metadataHandler","xhr","text","resourceString","fromResourceString","sharedErrorHandler","err","newErr","objectErrorHandler","shared","getMetadata","maxOperationRetryTime","requestInfo","metadataForUpload_","opt_metadata","determineContentType_","ResumableUploadStatus","current","total","finalized","checkResumeHeader_","opt_allowed","continueResumableUpload","chunkSize","opt_status","opt_progressCallback","bytesLeft","bytesToUpload","Math","min","X-Goog-Upload-Command","X-Goog-Upload-Offset","maxUploadRetryTime","uploadStatus","newCurrent","Observer","nextOrObserver","opt_error","opt_complete","next","error","complete","observer","UploadTaskSnapshot","bytesTransferred","totalBytes","task","ref","urls","async","argsToForward","then","UploadTask","transferred_","needToFetchStatus_","needToFetchMetadata_","observers_","error_","uploadUrl_","request_","chunkMultiplier_","resolve_","reject_","ref_","authWrapper_","location_","blob_","metadata_","resumable_","shouldDoResumable_","state_","errorHandler_","completeTransitions_","transition_","metadataErrorHandler_","promise_","start_","makeProgressCallback_","sizeBefore","loaded","updateProgress_","createResumable_","fetchStatus_","fetchMetadata_","continueUpload_","oneShotUpload_","resolveToken_","callback","getAuthToken","authToken","X-Goog-Upload-Protocol","X-Goog-Upload-Header-Content-Length","X-Goog-Upload-Header-Content-Type","Content-Type","createResumableUpload","createRequest","makeRequest","getPromise","sizeString","parseInt","isNaN","getResumableUploadStatus","statusRequest","uploadRequest","newStatus","increaseMultiplier_","metadataRequest","boundary","str","random","genBoundary","preBlobPart","postBlobPart","multipartUpload","multipartRequest","transferred","old","notifyObservers_","cancel","wasPaused","externalState","on","completed","nextOrObserverMessage","nextValidator","observerValidator","nextOrObserverValidator","_p","makeBinder","addObserver_","removeObserver_","binderSpecs","onFulfilled","onRejected","catch","notifyObserver_","splice","arraylike","finishPromise_","triggered","bind","snapshot","resume","valid","pause","Reference","newRef","child","childPath","newPath","canonicalChildPath","filter","component","join","parent","service","put","throwIfRoot_","putString","delete","deleteObject","updateMetadata","getDownloadURL","invalidRootOperation","FailRequest","reject","appDelete","RequestMap","map_","id_","addRequest","r","id","unmap","clear","AuthWrapper","app","maker","requestMaker","pool","bucket_","deleted_","app_","options","extractBucket_","storageRefMaker_","requestMaker_","pool_","service_","maxOperationRetryTime_","maxUploadRetryTime_","requestMap_","config","INTERNAL","getToken","response","accessToken","_error","request","deleteApp","setMaxUploadRetryTime","time","setMaxOperationRetryTime","NetworkRequest","errorCallback","pendingXhr_","backoffId_","canceled_","appDelete_","url_","method_","headers_","body_","successCodes_","additionalRetryCodes_","callback_","errorCallback_","progressCallback_","timeout_","backoffDone","requestWentThrough","wasSuccessCode","result","RequestEndStatus","waitSeconds","timeoutId","hitTimeout","cancelState","triggeredCallback","triggerCallback","callWithDelay","millis","setTimeout","success","waitMillis","stopped","stop","wasTimeout","clearTimeout","backoffCallback","canceled$$1","progressListener","hitServer","isRetryStatusCode_","successCode","wasCanceled","progressEvent","lengthComputable","isFiveHundredCode","isExtraRetryCode","isRequestSpecificRetryCode","opt_canceled","addAuthHeader_","number","firebase","SDK_VERSION","addVersionHeader_","Service","authWrapperBucket","internals_","ServiceInternals","test","refFromURL","STORAGE_TYPE","factory","unused","opt_url","namespaceExports","Storage","registerService"],"mappings":"6EAuBA,IAAIA,EAAa,yCAIbC,EAAe,yCAIfC,EAAa,MAIbC,EAAmB,MAKnBC,EAA+B,KAI/BC,EAA4B,IAK5BC,GAAkB,iBAiBlBC,EAAsC,WACtC,SAASA,EAAqBC,EAAMC,GAChCC,KAAKC,MAAQC,EAAYJ,GACzBE,KAAKG,SAAW,qBAAuBJ,EACvCC,KAAKI,gBAAkB,KACvBJ,KAAKK,MAAQ,gBA0CjB,OAxCAR,EAAqBS,UAAUC,SAAW,WACtC,OAAOP,KAAKF,MAEhBD,EAAqBS,UAAUE,WAAa,SAAUV,GAClD,OAAOI,EAAYJ,KAAUE,KAAKO,YAEtCV,EAAqBS,UAAUG,mBAAqB,WAChD,OAAOT,KAAKI,iBAEhBP,EAAqBS,UAAUI,sBAAwB,SAAUC,GAC7DX,KAAKI,gBAAkBO,GAE3BC,OAAOC,eAAehB,EAAqBS,UAAW,QAClDQ,IAAK,WACD,OAAOd,KAAKK,OAEhBU,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAehB,EAAqBS,UAAW,QAClDQ,IAAK,WACD,OAAOd,KAAKC,OAEhBc,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAehB,EAAqBS,UAAW,WAClDQ,IAAK,WACD,OAAOd,KAAKG,UAEhBY,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAehB,EAAqBS,UAAW,kBAClDQ,IAAK,WACD,OAAOd,KAAKI,iBAEhBW,YAAY,EACZC,cAAc,IAEXnB,KAEPoB,GAEAC,QAAS,UACTC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,kBAAmB,oBACnBC,eAAgB,iBAChBC,gBAAiB,kBACjBC,aAAc,eACdC,qBAAsB,uBACtBC,iBAAkB,mBAClBC,SAAU,WAEVC,mBAAoB,qBACpBC,YAAa,cACbC,uBAAwB,yBACxBC,kBAAmB,oBACnBC,kBAAmB,oBACnBC,uBAAwB,yBACxBC,gBAAiB,kBACjBC,iBAAkB,mBAClBC,uBAAwB,yBACxBC,YAAa,cACbC,uBAAwB,yBACxBC,eAAgB,iBAChBC,eAAgB,kBAEpB,SAAStC,EAAYJ,GACjB,MAAO,WAAaA,EAExB,SAAS2C,IAGL,OAAO,IAAI5C,EAAqBoB,EAAKC,QAFvB,kFAwBlB,SAASwB,IACL,OAAO,IAAI7C,EAAqBoB,EAAKU,SAAU,sCAQnD,SAASgB,IACL,OAAO,IAAI9C,EAAqBoB,EAAKe,kBAAmB,0DAQ5D,SAASY,EAAgBC,EAAOC,EAAQ/C,GACpC,OAAO,IAAIF,EAAqBoB,EAAKkB,iBAAkB,wBAA0BW,EAAS,cAAgBD,EAAQ,KAAO9C,GAuB7H,SAASgD,IACL,OAAO,IAAIlD,EAAqBoB,EAAKoB,YAAa,iCAetD,SAASW,EAAcC,EAAQlD,GAC3B,OAAO,IAAIF,EAAqBoB,EAAKsB,eAAgB,iCAAmCU,EAAS,MAAQlD,GAK7G,SAASmD,EAAcnD,GACnB,MAAM,IAAIF,EAAqBoB,EAAKuB,eAAgB,mBAAqBzC,GAkB7E,IAAIoD,GACAC,IAAK,MACLC,OAAQ,SACRC,UAAW,YACXC,SAAU,YAEd,SAASC,EAAgBC,GACrB,OAAQA,GACJ,KAAKN,EAAaC,IAClB,KAAKD,EAAaE,OAClB,KAAKF,EAAaG,UAClB,KAAKH,EAAaI,SACd,OACJ,QACI,KAAM,qCACFJ,EAAaC,IACb,KACAD,EAAaE,OACb,KACAF,EAAaG,UACb,KACAH,EAAaI,SACb,MAMhB,IAAIG,EAA4B,WAK5B,OAJA,SAAoBC,EAAMC,GACtB5D,KAAK2D,KAAOA,EACZ3D,KAAK6D,YAAcD,GAAmB,SAI9C,SAASE,EAAeb,EAAQc,GAC5B,OAAQd,GACJ,KAAKE,EAAaC,IACd,OAAO,IAAIM,EAAWM,EAAWD,IACrC,KAAKZ,EAAaE,OAClB,KAAKF,EAAaG,UACd,OAAO,IAAII,EAAWO,EAAahB,EAAQc,IAC/C,KAAKZ,EAAaI,SACd,OAAO,IAAIG,EAmHvB,SAAuBK,GACnB,IAAIG,EAAQ,IAAIC,EAAaJ,GAC7B,OAAIG,EAAME,OACCH,EAAad,EAAaE,OAAQa,EAAMG,MAxEvD,SAA8BN,GAC1B,IAAIO,EACJ,IACIA,EAAUC,mBAAmBR,GAEjC,MAAOS,GACH,MAAMxB,EAAcG,EAAaI,SAAU,uBAE/C,OAAOS,EAAWM,GAmEPG,CAAqBP,EAAMG,MAzHRK,CAAcX,GA4HhD,SAA6BA,GAEzB,OADY,IAAII,EAAaJ,GAChBF,YA9HwCc,CAAoBZ,IAGzE,MAAMtB,IAEV,SAASuB,EAAWD,GAEhB,IADA,IAAIa,KACKC,EAAI,EAAGA,EAAId,EAAOe,OAAQD,IAAK,CACpC,IAAIE,EAAIhB,EAAOiB,WAAWH,GAC1B,GAAIE,GAAK,IACLH,EAAEK,KAAKF,QAGP,GAAIA,GAAK,KACLH,EAAEK,KAAK,IAAOF,GAAK,EAAI,IAAW,GAAJA,QAG9B,GAAmB,QAAV,MAAJA,GAID,GAFYF,EAAId,EAAOe,OAAS,GACU,QAAV,MAA3Bf,EAAOiB,WAAWH,EAAI,IAQvBE,EAAI,OAAe,KAFVA,IAEmB,GAAY,KAD/BhB,EAAOiB,aAAaH,GAE7BD,EAAEK,KAAK,IAAOF,GAAK,GAAK,IAAQA,GAAK,GAAM,GAAK,IAAQA,GAAK,EAAK,GAAK,IAAW,GAAJA,QAN9EH,EAAEK,KAAK,IAAK,IAAK,UAUF,QAAV,MAAJF,GAEDH,EAAEK,KAAK,IAAK,IAAK,KAGjBL,EAAEK,KAAK,IAAOF,GAAK,GAAK,IAAQA,GAAK,EAAK,GAAK,IAAW,GAAJA,GAM1E,OAAO,IAAIG,WAAWN,GAY1B,SAASX,EAAahB,EAAQc,GAC1B,OAAQd,GACJ,KAAKE,EAAaE,OACd,IAAI8B,GAAoC,IAAzBpB,EAAOqB,QAAQ,KAC1BC,GAAoC,IAAzBtB,EAAOqB,QAAQ,KAC9B,GAAID,GAAYE,EAEZ,MAAMrC,EAAcC,EAAQ,uBADVkC,EAAW,IAAM,KAG/B,qCAER,MAEJ,KAAKhC,EAAaG,UACd,IAAIgC,GAAmC,IAAzBvB,EAAOqB,QAAQ,KACzBG,GAAoC,IAAzBxB,EAAOqB,QAAQ,KAC9B,GAAIE,GAAWC,EAEX,MAAMvC,EAAcC,EAAQ,uBADVqC,EAAU,IAAM,KACgC,kCAEtEvB,EAASA,EAAOyB,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAIzD,IAAIC,EACJ,IACIA,EAAQC,KAAK3B,GAEjB,MAAOS,GACH,MAAMxB,EAAcC,EAAQ,2BAGhC,IADA,IAAI0C,EAAQ,IAAIT,WAAWO,EAAMX,QACxBD,EAAI,EAAGA,EAAIY,EAAMX,OAAQD,IAC9Bc,EAAMd,GAAKY,EAAMT,WAAWH,GAEhC,OAAOc,EAKX,IAAIxB,EAA8B,WAiB9B,OAhBA,SAAsByB,GAClB5F,KAAKoE,QAAS,EACdpE,KAAK6D,YAAc,KACnB,IAAIgC,EAAUD,EAAQE,MAAM,mBAC5B,GAAgB,OAAZD,EACA,MAAM7C,EAAcG,EAAaI,SAAU,yDAE/C,IAAIwC,EAASF,EAAQ,IAAM,KACb,MAAVE,IACA/F,KAAKoE,QAsBC4B,EAtBiBD,EAsBdE,EAtBsB,UAuBtBD,EAAElB,QAAUmB,EAAInB,QAI1BkB,EAAEE,UAAUF,EAAElB,OAASmB,EAAInB,UAAYmB,GA1BtCjG,KAAK6D,YAAc7D,KAAKoE,OAClB2B,EAAOG,UAAU,EAAGH,EAAOjB,OAAS,UAAUA,QAC9CiB,GAEV/F,KAAKqE,KAAOuB,EAAQM,UAAUN,EAAQR,QAAQ,KAAO,GAiB7D,IAAkBY,EAAGC,MAuBrB,IA4LIE,EA5LAC,GAEAC,cAAe,iBAEfC,GACAC,QAAS,UACTC,QAAS,UACTC,OAAQ,SACRC,QAAS,UACTC,UAAW,YACXhF,SAAU,WACViF,MAAO,SAEPC,GAEAN,QAAS,UAETE,OAAQ,SAERC,QAAS,UAET/E,SAAU,WAEViF,MAAO,SAEX,SAASE,EAA+BC,GACpC,OAAQA,GACJ,KAAKT,EAAkBC,QACvB,KAAKD,EAAkBE,QACvB,KAAKF,EAAkBK,UACnB,OAAOE,EAAUN,QACrB,KAAKD,EAAkBG,OACnB,OAAOI,EAAUJ,OACrB,KAAKH,EAAkBI,QACnB,OAAOG,EAAUH,QACrB,KAAKJ,EAAkB3E,SACnB,OAAOkF,EAAUlF,SACrB,KAAK2E,EAAkBM,MAEvB,QAEI,OAAOC,EAAUD,OAsB7B,SAASI,EAASC,EAAKC,GACnB,OAAOtG,OAAON,UAAU6G,eAAeC,KAAKH,EAAKC,GAErD,SAASG,EAAQJ,EAAKK,GAClB,IAAK,IAAIC,KAAON,EACRD,EAASC,EAAKM,IACdD,EAAEC,EAAKN,EAAIM,IAIvB,SAASC,EAAMP,GACX,GAAW,MAAPA,EACA,SAEJ,IAAIlC,KAIJ,OAHAsC,EAAQJ,EAAK,SAAUM,EAAKE,GACxB1C,EAAEwC,GAAOE,IAEN1C,EA2BX,SAAS2C,EAAKC,GACV,OAAO,IAAIC,QAAQD,GAKvB,SAASE,EAAQC,GACb,OAAOF,QAAQC,QAAQC,GAwB3B,SAASC,EAAMC,GACX,OAAY,MAALA,EAEX,SAASC,EAAUD,GACf,YAAa,IAANA,EAEX,SAASE,EAAWF,GAChB,MAAoB,mBAANA,EAElB,SAASG,EAASH,GACd,MAAoB,iBAANA,EAElB,SAASI,EAAgBJ,GACrB,OAAOG,EAASH,IAAY,OAANA,EAK1B,SAASK,EAASL,GACd,MAAoB,iBAANA,GAAkBA,aAAaM,OAKjD,SAASC,EAAaP,GAClB,OAAOQ,KAAyBR,aAAaS,KAEjD,SAASD,IACL,MAAuB,oBAATC,MAsBlB,SAAWtC,GACPA,EAAUA,EAAoB,SAAI,GAAK,WACvCA,EAAUA,EAAyB,cAAI,GAAK,gBAC5CA,EAAUA,EAAiB,MAAI,GAAK,QAHxC,CAIGA,IAAcA,OAqBjB,IAAIuC,EAA8B,WAC9B,SAASA,IACL,IAAIC,EAAQ3I,KACZA,KAAK4I,OAAQ,EACb5I,KAAK6I,KAAO,IAAIC,eAChB9I,KAAK+I,WAAa5C,EAAU6C,SAC5BhJ,KAAKiJ,aAAevB,EAAK,SAAUwB,EAAYC,GAC3CR,EAAME,KAAKO,iBAAiB,QAAS,SAAUC,GAC3CV,EAAMI,WAAa5C,EAAUmD,MAC7BJ,EAAWP,KAEfA,EAAME,KAAKO,iBAAiB,QAAS,SAAUC,GAC3CV,EAAMI,WAAa5C,EAAUoD,cAC7BL,EAAWP,KAEfA,EAAME,KAAKO,iBAAiB,OAAQ,SAAUC,GAC1CH,EAAWP,OAyFvB,OAlFAD,EAAapI,UAAUkJ,KAAO,SAAUC,EAAKC,EAAQC,EAAUC,GAC3D,IAAIjB,EAAQ3I,KACZ,GAAIA,KAAK4I,MACL,MAAM1F,EAAc,kCAExBlD,KAAK4I,OAAQ,EACb5I,KAAK6I,KAAKgB,KAAKH,EAAQD,GAAK,GACxB1B,EAAM6B,KAENvC,EADcuC,EACG,SAAUrC,EAAKE,GAC5BkB,EAAME,KAAKiB,iBAAiBvC,EAAKE,EAAIsC,cAS7C,OANIhC,EAAM4B,GACN3J,KAAK6I,KAAKW,KAAKG,GAGf3J,KAAK6I,KAAKW,OAEPxJ,KAAKiJ,cAKhBP,EAAapI,UAAU0J,aAAe,WAClC,IAAKhK,KAAK4I,MACN,MAAM1F,EAAc,yCAExB,OAAOlD,KAAK+I,YAKhBL,EAAapI,UAAU2J,UAAY,WAC/B,IAAKjK,KAAK4I,MACN,MAAM1F,EAAc,sCAExB,IACI,OAAOlD,KAAK6I,KAAKqB,OAErB,MAAO1F,GACH,OAAQ,IAMhBkE,EAAapI,UAAU6J,gBAAkB,WACrC,IAAKnK,KAAK4I,MACN,MAAM1F,EAAc,4CAExB,OAAOlD,KAAK6I,KAAKuB,cAMrB1B,EAAapI,UAAU+J,MAAQ,WAC3BrK,KAAK6I,KAAKwB,SAKd3B,EAAapI,UAAUgK,kBAAoB,SAAUC,GACjD,OAAOvK,KAAK6I,KAAKyB,kBAAkBC,IAKvC7B,EAAapI,UAAUkK,0BAA4B,SAAUC,GACrD1C,EAAM/H,KAAK6I,KAAK6B,SAChB1K,KAAK6I,KAAK6B,OAAOtB,iBAAiB,WAAYqB,IAMtD/B,EAAapI,UAAUqK,6BAA+B,SAAUF,GACxD1C,EAAM/H,KAAK6I,KAAK6B,SAChB1K,KAAK6I,KAAK6B,OAAOE,oBAAoB,WAAYH,IAGlD/B,KAqBPmC,EAA2B,WAC3B,SAASA,KAKT,OAHAA,EAAUvK,UAAUwK,YAAc,WAC9B,OAAO,IAAIpC,GAERmC,KAsBX,SAASE,EAAiB/E,GACtB,IAAIiB,EAvNkBe,EAwNtB,IACIf,EAAM+D,KAAKC,MAAMjF,GAErB,MAAOxB,GACH,OAAO,KAEX,OA7NO2D,EADeH,EA8NDf,KA7NEiE,MAAMC,QAAQnD,GA8N1Bf,EAGA,KAsBf,IAAImE,EAA0B,WAC1B,SAASA,EAASC,EAAQC,GACtBtL,KAAKqL,OAASA,EACdrL,KAAKuL,MAAQD,EAgFjB,OA9EA1K,OAAOC,eAAeuK,EAAS9K,UAAW,QACtCQ,IAAK,WACD,OAAOd,KAAKuL,OAEhBxK,YAAY,EACZC,cAAc,IAElBoK,EAAS9K,UAAUkL,cAAgB,WAC/B,IAAIC,EAASC,mBACb,MAAO,MAAQD,EAAOzL,KAAKqL,QAAU,MAAQI,EAAOzL,KAAKsL,OAE7DF,EAAS9K,UAAUqL,oBAAsB,WAErC,MAAO,MADMD,mBACS1L,KAAKqL,QAAU,MAEzCD,EAASQ,mBAAqB,SAAUC,GACpC,IAAIC,EAtrBkBT,EAurBtB,IACIS,EAAiBV,EAASW,YAAYF,GAE1C,MAAOrH,GAGH,OAAO,IAAI4G,EAASS,EAAc,IAEtC,GAA4B,KAAxBC,EAAeR,KACf,OAAOQ,EAGP,MAnsBkBT,EAmsBSQ,EAlsB5B,IAAIhM,EAAqBoB,EAAKa,uBAAwB,2BAA6BuJ,EAAS,OAqsBnGD,EAASW,YAAc,SAAUtC,GAC7B,IAAIuC,EAAW,KA0Bf,IAZA,IAQIC,IACEC,MAdQ,IAAIC,OAAO,oCAAkC,KAcrCC,SAbJf,OAAQ,EAAGC,KAAM,GAaOe,WArB1C,SAAkBC,GAC+B,MAAzCA,EAAIhB,KAAKiB,OAAOD,EAAIhB,KAAKxG,OAAS,KAClCwH,EAAIf,MAAQe,EAAIf,MAAMiB,MAAM,GAAI,OAoBlCN,MATU,IAAIC,OAAO,oGAKjB,KAIcC,SAHJf,OAAQ,EAAGC,KAAM,GAGSe,WAb9C,SAAoBC,GAChBA,EAAIf,MAAQhH,mBAAmB+H,EAAIhB,SAc9BzG,EAAI,EAAGA,EAAIoH,EAAOnH,OAAQD,IAAK,CACpC,IAAI4H,EAAQR,EAAOpH,GACf6H,EAAWD,EAAMP,MAAMS,KAAKlD,GAChC,GAAIiD,EAAU,CACV,IAAIE,EAAcF,EAASD,EAAML,QAAQf,QACrCwB,EAAYH,EAASD,EAAML,QAAQd,MAClCuB,IACDA,EAAY,IAEhBb,EAAW,IAAIZ,EAASwB,EAAaC,GACrCJ,EAAMJ,WAAWL,GACjB,OAGR,GAAgB,MAAZA,EACA,MAnvBZ,SAAoBvC,GAChB,OAAO,IAAI5J,EAAqBoB,EAAKY,YAAa,gBAAkB4H,EAAM,MAkvB5DqD,CAAWrD,GAErB,OAAOuC,GAEJZ,KAuDX,SAAS2B,EAAczB,GACnB,IAAIzI,EAAQyI,EAAK0B,YAAY,IAAK1B,EAAKxG,OAAS,GAChD,OAAe,IAAXjC,EACOyI,EAGAA,EAAKkB,MAAM3J,EAAQ,GAmBlC,SAASoK,EAAcC,GACnB,OAAO5N,EAAaE,EAAa0N,EAKrC,SAASC,EAAcD,GACnB,OAAO5N,EAAaG,EAAmByN,EAE3C,SAASE,EAAgBC,GACrB,IAAI5B,EAASC,mBACT4B,EAAY,IAOhB,OANAjG,EAAQgG,EAAQ,SAAU9F,EAAKE,GAC3B,IAAI8F,EAAW9B,EAAOlE,GAAO,IAAMkE,EAAOhE,GAC1C6F,EAAYA,EAAYC,EAAW,MAGvCD,EAAYA,EAAUd,MAAM,GAAI,GAmBpC,SAASgB,EAASC,EAAU3F,GACxB,OAAOA,EAKX,IAAI4F,EAAyB,WAOzB,OANA,SAAiBC,EAAQC,EAAWC,EAAcC,GAC9C9N,KAAK2N,OAASA,EACd3N,KAAK+N,MAAQH,GAAaD,EAC1B3N,KAAKgO,WAAaH,EAClB7N,KAAKiO,MAAQH,GAAaN,MAI9BU,GAAY,KAWhB,SAASC,KACL,GAAID,GACA,OAAOA,GAEX,IAAIE,KACJA,EAASnJ,KAAK,IAAIyI,EAAQ,WAC1BU,EAASnJ,KAAK,IAAIyI,EAAQ,eAC1BU,EAASnJ,KAAK,IAAIyI,EAAQ,mBAC1BU,EAASnJ,KAAK,IAAIyI,EAAQ,OAAQ,YAAY,IAI9C,IAAIW,EAAc,IAAIX,EAAQ,QAC9BW,EAAYJ,MAJZ,SAA2BR,EAAUa,GACjC,OApBR,SAAmBA,GAEf,OADYjG,EAASiG,IACPA,EAASxJ,OAAS,EACrBwJ,EAIAvB,EADPuB,EAAWA,GAcJC,CAAUD,IAIrBF,EAASnJ,KAAKoJ,GAYd,IAAIG,EAAc,IAAId,EAAQ,QAwC9B,OAvCAc,EAAYP,MATZ,SAAmBR,EAAUgB,GACzB,OAAI1G,EAAM0G,IACEA,EAGDA,GAKfL,EAASnJ,KAAKuJ,GACdJ,EAASnJ,KAAK,IAAIyI,EAAQ,gBAC1BU,EAASnJ,KAAK,IAAIyI,EAAQ,YAC1BU,EAASnJ,KAAK,IAAIyI,EAAQ,UAAW,MAAM,IAC3CU,EAASnJ,KAAK,IAAIyI,EAAQ,eAAgB,MAAM,IAChDU,EAASnJ,KAAK,IAAIyI,EAAQ,qBAAsB,MAAM,IACtDU,EAASnJ,KAAK,IAAIyI,EAAQ,kBAAmB,MAAM,IACnDU,EAASnJ,KAAK,IAAIyI,EAAQ,kBAAmB,MAAM,IACnDU,EAASnJ,KAAK,IAAIyI,EAAQ,cAAe,MAAM,IAC/CU,EAASnJ,KAAK,IAAIyI,EAAQ,WAAY,kBAAkB,IA2BxDU,EAASnJ,KAAK,IAAIyI,EAAQ,iBAAkB,gBAAgB,EAtB5D,SAAqBD,EAAUiB,GAE3B,KADYrG,EAASqG,IAAWA,EAAO5J,OAAS,GAI5C,SAEJ,IAAI2G,EAASC,mBAab,OAZiBgD,EAAOC,MAAM,KACRC,IAAI,SAAUC,GAChC,IAAIxD,EAASoC,EAAiB,OAC1BnC,EAAOmC,EAAmB,SAO9B,OAvHZ,SAAyBP,GACrB,OAAO3N,EAAeC,EAAa0N,EAiHhB4B,CADG,MAAQrD,EAAOJ,GAAU,MAAQI,EAAOH,IAEpC8B,GACd2B,IAAK,QACLF,MAAOA,SAOnBX,GAAYE,EAYhB,SAASY,GAAaC,EAAaC,EAAUd,GAIzC,IAHA,IAAIX,GACJ0B,KAAmB,QACfC,EAAMhB,EAAStJ,OACVD,EAAI,EAAGA,EAAIuK,EAAKvK,IAAK,CAC1B,IAAIwK,EAAUjB,EAASvJ,GACvB4I,EAAS4B,EAAQtB,OAASsB,EAAQpB,MAAMR,EAAUyB,EAASG,EAAQ1B,SAGvE,OAlBJ,SAAgBF,EAAUwB,GAOtBrO,OAAOC,eAAe4M,EAAU,OAAS3M,IANzC,WACI,IAAIuK,EAASoC,EAAiB,OAC1BnC,EAAOmC,EAAmB,SAC1BnB,EAAM,IAAIlB,EAASC,EAAQC,GAC/B,OAAO2D,EAAYK,qBAAqBhD,MAY5CiD,CAAO9B,EAAUwB,GACVxB,EAUX,SAAS+B,GAAiB/B,EAAUW,GAGhC,IAFA,IAAIc,KACAE,EAAMhB,EAAStJ,OACVD,EAAI,EAAGA,EAAIuK,EAAKvK,IAAK,CAC1B,IAAIwK,EAAUjB,EAASvJ,GACnBwK,EAAQrB,WACRkB,EAASG,EAAQ1B,QAAUF,EAAS4B,EAAQtB,QAGpD,OAAO/C,KAAKyE,UAAUP,GAE1B,SAASQ,GAAkB1H,GAEvB,KADgBA,GAAKG,EAASH,IAE1B,KAAM,4BAEV,IAAK,IAAIT,KAAOS,EAAG,CACf,IAAIP,EAAMO,EAAET,GACZ,GAAY,mBAARA,GACA,IAAKY,EAASV,GACV,KAAM,qDAIV,GAAIW,EAAgBX,GAChB,KAAM,gBAAkBF,EAAM,0BA2B9C,SAASoI,GAASC,EAAMC,EAAOC,GAG3B,IAFA,IAAIC,EAAUF,EAAM/K,OAChBkL,EAAUH,EAAM/K,OACXD,EAAI,EAAGA,EAAIgL,EAAM/K,OAAQD,IAC9B,GAAIgL,EAAMhL,GAAGoL,SAAU,CACnBF,EAAUlL,EACV,MAGR,IAhhC0BqL,EAAQC,EAAQrN,EAAQsN,EAC9CC,EACAC,EA+gCJ,KADkBP,GAAWD,EAAOhL,QAAUgL,EAAOhL,QAAUkL,GAE3D,MAlhCsBE,EAkhCKH,EAlhCGI,EAkhCMH,EAlhCElN,EAkhCO8M,EAlhCCQ,EAkhCKN,EAAOhL,OA/gC1DoL,IAAWC,GACXE,EAAYH,EACZI,EAAoB,IAAXJ,EAAe,WAAa,cAGrCG,EAAY,WAAaH,EAAS,QAAUC,EAC5CG,EAAS,aAEN,IAAIzQ,EAAqBoB,EAAKmB,uBAAwB,8BACzDU,EACA,eACAuN,EACA,IACAC,EACA,cACAF,EACA,KAigCJ,IAASvL,EAAI,EAAGA,EAAIiL,EAAOhL,OAAQD,IAC/B,IACIgL,EAAMhL,GAAG0L,UAAUT,EAAOjL,IAE9B,MAAOL,GACH,MAAIA,aAAagM,MACP5N,EAAgBiC,EAAG+K,EAAMpL,EAAEzE,SAG3B6C,EAAgBiC,EAAG+K,EAAMpL,IAQ/C,IAAIiM,GAAyB,WAWzB,OAVA,SAAiBF,EAAWG,GACxB,IAAIC,EAAO3Q,KACXA,KAAKuQ,UAAY,SAAUvI,GACnB2I,EAAKV,WAAahI,EAAUD,IAGhCuI,EAAUvI,IAEdhI,KAAKiQ,WAAaS,MAU1B,SAASE,GAAWC,EAAeH,GAC/B,SAASI,EAAgB9I,GACrB,IAAKK,EAASL,GACV,KAAM,mBAGd,IAAIuI,EAZMQ,EAAIC,EAmBd,OANIH,GAbME,EAcWD,EAdPE,EAcwBH,EAAlCN,EAbG,SAAUvI,GACb+I,EAAG/I,GACHgJ,EAAGhJ,KAcHuI,EAAYO,EAET,IAAIL,GAAQF,EAAWG,GAalC,SAASO,GAAaP,GAClB,OAAO,IAAID,GAAQf,GAAmBgB,GAE1C,SAASQ,KAOL,OAAO,IAAIT,GANX,SAAmBzI,GAEf,KAxrBR,SAAkBA,GACd,MAAoB,iBAANA,GAAkBA,aAAamJ,OAsrB7BC,CAASpJ,IAAMA,GAAK,GAE5B,KAAM,oCAKlB,SAASqJ,GAAgBR,EAAeH,GAUpC,OAAO,IAAID,GATX,SAAmBzI,GAEf,KAD0B,OAANA,GAAeD,EAAMC,IAAMA,aAAapH,QAExD,KAAM,2BAEY0Q,IAAlBT,GAAiD,OAAlBA,GAC/BA,EAAc7I,IAGQ0I,GAElC,SAASa,GAAiBb,GAOtB,OAAO,IAAID,GANX,SAAmBzI,GAEf,GADkB,OAANA,IAAcE,EAAWF,GAEjC,KAAM,wBAGgB0I,GAGlC,SAASc,KACL,MAA2B,oBAAhBC,YACAA,YAE2B,oBAAtBC,kBACLA,uBAGP,EAyER,IAAIC,GAAyB,WACzB,SAASA,EAAQhO,EAAMiO,GACnB,IAAInD,EAAO,EACPoD,EAAW,GACXtJ,EAAa5E,IACb3D,KAAK8R,MAAQnO,EACb8K,EAAO9K,EAAK8K,KACZoD,EAAWlO,EAAKwL,MAEXxL,aAAgBoO,aACjBH,EACA5R,KAAK8R,MAAQ,IAAI5M,WAAWvB,IAG5B3D,KAAK8R,MAAQ,IAAI5M,WAAWvB,EAAKqO,YACjChS,KAAK8R,MAAMG,IAAI,IAAI/M,WAAWvB,KAElC8K,EAAOzO,KAAK8R,MAAMhN,QAEbnB,aAAgBuB,aACjB0M,EACA5R,KAAK8R,MAAQnO,GAGb3D,KAAK8R,MAAQ,IAAI5M,WAAWvB,EAAKmB,QACjC9E,KAAK8R,MAAMG,IAAItO,IAEnB8K,EAAO9K,EAAKmB,QAEhB9E,KAAKkS,MAAQzD,EACbzO,KAAKmS,MAAQN,EAiEjB,OA/DAF,EAAQrR,UAAUmO,KAAO,WACrB,OAAOzO,KAAKkS,OAEhBP,EAAQrR,UAAU6O,KAAO,WACrB,OAAOnP,KAAKmS,OAEhBR,EAAQrR,UAAUkM,MAAQ,SAAU4F,EAAWC,GAC3C,GAAI9J,EAAavI,KAAK8R,OAAQ,CAC1B,IAAIQ,EAAWtS,KAAK8R,MAChBS,GA1ESC,EA0EoBJ,EA1EbnM,EA0EwBoM,GA1ErCI,EA0EgBH,GAzEtBI,YACED,EAAKC,YAAYF,EAAOvM,GAE1BwM,EAAKE,SACHF,EAAKE,SAASH,EAAOvM,GAEvBwM,EAAKjG,MACHiG,EAAKjG,MAAMgG,EAAOvM,GAEtB,MAiEC,OAAe,OAAXsM,EACO,KAEJ,IAAIZ,EAAQY,GAGnB,IAjFOE,EAAMD,EAAOvM,EAkFpB,OAAO,IAAI0L,EADC,IAAIzM,WAAWlF,KAAK8R,MAAMc,OAAQR,EAAWC,EAAUD,IACzC,IAGlCT,EAAQkB,QAAU,WAEd,IADA,IAAIC,KACKC,EAAK,EAAGA,EAAKC,UAAUlO,OAAQiO,IACpCD,EAASC,GAAMC,UAAUD,GAE7B,GAAIvK,IAAuB,CACvB,IAAIyK,EAASH,EAASlE,IAAI,SAAUnH,GAChC,OAAIA,aAAekK,EACRlK,EAAIqK,MAGJrK,IAGf,OAAO,IAAIkK,EAlIvB,WAEI,IADA,IAAImB,KACKC,EAAK,EAAGA,EAAKC,UAAUlO,OAAQiO,IACpCD,EAASC,GAAMC,UAAUD,GAE7B,IAAItB,EAAcD,KAClB,QAAoBF,IAAhBG,EAA2B,CAE3B,IADA,IAAIyB,EAAK,IAAIzB,EACJ5M,EAAI,EAAGA,EAAIiO,EAAShO,OAAQD,IACjCqO,EAAGC,OAAOL,EAASjO,IAEvB,OAAOqO,EAAGL,UAGV,GAAIrK,IACA,OAAO,IAAIC,KAAKqK,GAGhB,MAAMtC,MAAM,wDAgHe4C,MAAM,KAAMH,IAGvC,IAAII,EAAcP,EAASlE,IAAI,SAAUnH,GACrC,OAAIY,EAASZ,GACF3D,EAAeX,EAAaC,IAAKqE,GAAK9D,KAItC8D,EAAIqK,QAGfwB,EAAgB,EACpBD,EAAYhM,QAAQ,SAAU1B,GAC1B2N,GAAiB3N,EAAMqM,aAE3B,IAAIuB,EAAW,IAAIrO,WAAWoO,GAC1BE,EAAU,EAMd,OALAH,EAAYhM,QAAQ,SAAU1B,GAC1B,IAAK,IAAId,EAAI,EAAGA,EAAIc,EAAMb,OAAQD,IAC9B0O,EAASC,KAAa7N,EAAMd,KAG7B,IAAI8M,EAAQ4B,GAAU,IAGrC5B,EAAQrR,UAAUmT,WAAa,WAC3B,OAAOzT,KAAK8R,OAETH,KAsBX,SAAS+B,GAAW/N,EAAOgO,GACvB,OAAgC,IAAzBhO,EAAMP,QAAQuO,GAqBzB,IAAIC,GAA6B,WA0B7B,OAzBA,SAAqBnK,EAAKC,EAQ1BmK,EAASC,GACL9T,KAAKyJ,IAAMA,EACXzJ,KAAK0J,OAASA,EACd1J,KAAK6T,QAAUA,EACf7T,KAAK8T,QAAUA,EACf9T,KAAK+T,aACL/T,KAAKgU,WACLhU,KAAKiU,KAAO,KACZjU,KAAKkU,aAAe,KAKpBlU,KAAKmU,iBAAmB,KACxBnU,KAAKoU,cAAgB,KACrBpU,KAAKqU,4BAuBb,SAASC,GAAaC,GAClB,IAAKA,EACD,MAAM9R,IAGd,SAAS+R,GAAgBvF,EAAab,GAMlC,OALA,SAAiBqG,EAAKC,GAClB,IAAIjH,EA3bZ,SAA4BwB,EAAa0F,EAAgBvG,GACrD,IAAInH,EAAM8D,EAAiB4J,GAC3B,OAAY,OAAR1N,EACO,KAGJ+H,GAAaC,EADLhI,EAC4BmH,GAqbxBwG,CAAmB3F,EAAayF,EAAMtG,GAErD,OADAkG,GAA0B,OAAb7G,GACNA,GAIf,SAASoH,GAAmB7I,GAsBxB,OArBA,SAAsByI,EAAKK,GACvB,IAAIC,EAz6CUzJ,EAXCD,EAs8Cf,OAjBwB,MAApBoJ,EAAIxK,YACJ8K,EA76CD,IAAIlV,EAAqBoB,EAAKM,gBAFvB,+FAk7CkB,MAApBkT,EAAIxK,aAz7CGoB,EA07CgBW,EAASX,OAAhC0J,EAz7CL,IAAIlV,EAAqBoB,EAAKK,eAAgB,qBACjD+J,EACA,2EA07CgC,MAApBoJ,EAAIxK,aAl7CFqB,EAm7CoBU,EAASV,KAA/ByJ,EAl7CT,IAAIlV,EAAqBoB,EAAKO,aAAc,4CAA8C8J,EAAO,OAq7CxFyJ,EAASD,EAIrBC,EAAOrU,sBAAsBoU,EAAIrU,sBAC1BsU,GAIf,SAASC,GAAmBhJ,GACxB,IAAIiJ,EAASJ,GAAmB7I,GAShC,OARA,SAAsByI,EAAKK,GACvB,IAh9CgBxJ,EAg9CZyJ,EAASE,EAAOR,EAAKK,GAKzB,OAJwB,MAApBL,EAAIxK,cAj9CQqB,EAk9CYU,EAASV,KAAjCyJ,EAj9CD,IAAIlV,EAAqBoB,EAAKE,iBAAkB,WAAamK,EAAO,sBAm9CvEyJ,EAAOrU,sBAAsBoU,EAAIrU,sBAC1BsU,GAIf,SAASG,GAAYjG,EAAajD,EAAUoC,GACxC,IACI3E,EAAMwD,EADIjB,EAASR,iBAGnBsI,EAAU7E,EAAYkG,wBACtBC,EAAc,IAAIxB,GAAYnK,EAFrB,MAEkC+K,GAAgBvF,EAAab,GAAW0F,GAEvF,OADAsB,EAAYlB,aAAec,GAAmBhJ,GACvCoJ,EA+BX,SAASC,GAAmBrJ,EAAUyG,EAAM6C,GACxC,IAAI7H,EAAWjG,EAAM8N,GAMrB,OALA7H,EAAmB,SAAIzB,EAASV,KAChCmC,EAAe,KAAIgF,EAAKhE,OACnBhB,EAAsB,cACvBA,EAAsB,YAV9B,SAA+BA,EAAUgF,GACrC,OAAShF,GAAYA,EAAsB,aACtCgF,GAAQA,EAAKtD,QACd,2BAO0BoG,CAAsB,KAAM9C,IAEnDhF,EAyDX,IAAI+H,GAAuC,WAOvC,OANA,SAA+BC,EAASC,EAAOC,EAAWlI,GACtDzN,KAAKyV,QAAUA,EACfzV,KAAK0V,MAAQA,EACb1V,KAAK2V,YAAcA,EACnB3V,KAAKyN,SAAWA,GAAY,SAIpC,SAASmI,GAAmBnB,EAAKoB,GAC7B,IAAI3L,EACJ,IACIA,EAASuK,EAAInK,kBAAkB,wBAEnC,MAAO9F,GACH8P,IAAa,GAIjB,OADAA,GAAaZ,GADCmC,IAAgB,UACG3L,IAC1BA,EA2EX,SAAS4L,GAAwB9J,EAAUiD,EAAaxF,EAAKgJ,EAAMsD,EAAW3H,EAAU4H,EAAYC,GAGhG,IAAI/L,EAAS,IAAIsL,GAAsB,EAAG,GAS1C,GARIQ,GACA9L,EAAOuL,QAAUO,EAAWP,QAC5BvL,EAAOwL,MAAQM,EAAWN,QAG1BxL,EAAOuL,QAAU,EACjBvL,EAAOwL,MAAQjD,EAAKhE,QAEpBgE,EAAKhE,SAAWvE,EAAOwL,MACvB,MAzoDG,IAAI7V,EAAqBoB,EAAKgB,uBAAwB,wEA2oD7D,IAAIiU,EAAYhM,EAAOwL,MAAQxL,EAAOuL,QAClCU,EAAgBD,EAChBH,EAAY,IACZI,EAAgBC,KAAKC,IAAIF,EAAeJ,IAE5C,IAAI3D,EAAYlI,EAAOuL,QACnBpD,EAAUD,EAAY+D,EAEtBnC,GACAsC,wBAFgBH,IAAkBD,EAAY,mBAAqB,SAGnEK,uBAAwBrM,EAAOuL,SAE/BxB,EAAOxB,EAAKjG,MAAM4F,EAAWC,GACjC,GAAa,OAAT4B,EACA,MAAMtR,IAmBV,IACImR,EAAU7E,EAAYuH,qBACtBpB,EAAc,IAAIxB,GAAYnK,EAFrB,OAjBb,SAAiBgL,EAAKC,GAKlB,IAGIjH,EAHAgJ,EAAeb,GAAmBnB,GAAM,SAAU,UAClDiC,EAAaxM,EAAOuL,QAAUU,EAC9B1H,EAAOgE,EAAKhE,OAQhB,OALIhB,EADiB,UAAjBgJ,EACWjC,GAAgBvF,EAAab,EAA7BoG,CAAuCC,EAAKC,GAG5C,KAER,IAAIc,GAAsBkB,EAAYjI,EAAuB,UAAjBgI,EAA0BhJ,IAIzBqG,GAKxD,OAJAsB,EAAYpB,QAAUA,EACtBoB,EAAYnB,KAAOA,EAAKR,aACxB2B,EAAYjB,iBAAmB8B,GAAwB,KACvDb,EAAYlB,aAAeW,GAAmB7I,GACvCoJ,EAqBX,IAAIuB,GAA0B,WAiB1B,OAhBA,SAAkBC,EAAgBC,EAAWC,GAIzC,GAHkB5O,EAAW0O,IACzB7O,EAAM8O,IACN9O,EAAM+O,GAEN9W,KAAK+W,KAAOH,EACZ5W,KAAKgX,MAAQH,GAAa,KAC1B7W,KAAKiX,SAAWH,GAAgB,SAE/B,CACD,IAAII,EAAWN,EACf5W,KAAK+W,KAAOG,EAASH,MAAQ,KAC7B/W,KAAKgX,MAAQE,EAASF,OAAS,KAC/BhX,KAAKiX,SAAWC,EAASD,UAAY,UAM7CE,GAAoC,WACpC,SAASA,EAAmBC,EAAkBC,EAAYtQ,EAAO0G,EAAU6J,EAAMC,GAC7EvX,KAAKoX,iBAAmBA,EACxBpX,KAAKqX,WAAaA,EAClBrX,KAAK+G,MAAQA,EACb/G,KAAKyN,SAAWA,EAChBzN,KAAKsX,KAAOA,EACZtX,KAAKuX,IAAMA,EAoBf,OAlBA3W,OAAOC,eAAesW,EAAmB7W,UAAW,eAChDQ,IAAK,WACD,GAAsB,OAAlBd,KAAKyN,SAAmB,CACxB,IAAI+J,EAAOxX,KAAKyN,SAAuB,aACvC,OAAY,MAAR+J,GAA2B,MAAXA,EAAK,GACdA,EAAK,GAGL,KAIX,OAAO,MAGfzW,YAAY,EACZC,cAAc,IAEXmW,KAuBX,SAASM,GAAMnQ,GACX,OAAO,WAEH,IADA,IAAIoQ,KACK3E,EAAK,EAAGA,EAAKC,UAAUlO,OAAQiO,IACpC2E,EAAc3E,GAAMC,UAAUD,GAElClL,GAAQ,GAAM8P,KAAK,WACfrQ,EAAE8L,MAAM,KAAMsE,MAwB1B,IAAIE,GAA4B,WAM5B,SAASA,EAAWL,EAAKtI,EAAajD,EAAUoC,EAAUqE,EAAMhF,QAC3C,IAAbA,IAAuBA,EAAW,MACtC,IAAI9E,EAAQ3I,KACZA,KAAK6X,aAAe,EACpB7X,KAAK8X,oBAAqB,EAC1B9X,KAAK+X,sBAAuB,EAC5B/X,KAAKgY,cACLhY,KAAKiY,OAAS,KACdjY,KAAKkY,WAAa,KAClBlY,KAAKmY,SAAW,KAChBnY,KAAKoY,iBAAmB,EACxBpY,KAAKqY,SAAW,KAChBrY,KAAKsY,QAAU,KACftY,KAAKuY,KAAOhB,EACZvX,KAAKwY,aAAevJ,EACpBjP,KAAKyY,UAAYzM,EACjBhM,KAAK0Y,MAAQjG,EACbzS,KAAK2Y,UAAYlL,EACjBzN,KAAKkO,UAAYE,EACjBpO,KAAK4Y,WAAa5Y,KAAK6Y,mBAAmB7Y,KAAK0Y,OAC/C1Y,KAAK8Y,OAASxS,EAAkBC,QAChCvG,KAAK+Y,cAAgB,SAAU/B,GAC3BrO,EAAMwP,SAAW,KACjBxP,EAAMyP,iBAAmB,EACrBpB,EAAMxW,WAAWS,EAAKU,WACtBgH,EAAMmP,oBAAqB,EAC3BnP,EAAMqQ,yBAGNrQ,EAAMsP,OAASjB,EACfrO,EAAMsQ,YAAY3S,EAAkBM,SAG5C5G,KAAKkZ,sBAAwB,SAAUlC,GACnCrO,EAAMwP,SAAW,KACbnB,EAAMxW,WAAWS,EAAKU,UACtBgH,EAAMqQ,wBAGNrQ,EAAMsP,OAASjB,EACfrO,EAAMsQ,YAAY3S,EAAkBM,SAG5C5G,KAAKmZ,SAAWzR,EAAK,SAAUwB,EAAYC,GACvCR,EAAM0P,SAAWnP,EACjBP,EAAM2P,QAAUnP,EAChBR,EAAMyQ,WAIVpZ,KAAKmZ,SAASxB,KAAK,KAAM,cAmd7B,OAjdAC,EAAWtX,UAAU+Y,sBAAwB,WACzC,IAAI1Q,EAAQ3I,KACRsZ,EAAatZ,KAAK6X,aACtB,OAAO,SAAU0B,EAAQ7D,GACrB/M,EAAM6Q,gBAAgBF,EAAaC,KAG3C3B,EAAWtX,UAAUuY,mBAAqB,SAAUpG,GAChD,OAAOA,EAAKhE,OAAS,QAEzBmJ,EAAWtX,UAAU8Y,OAAS,WACtBpZ,KAAK8Y,SAAWxS,EAAkBC,SAIhB,OAAlBvG,KAAKmY,WAGLnY,KAAK4Y,WACmB,OAApB5Y,KAAKkY,WACLlY,KAAKyZ,mBAGDzZ,KAAK8X,mBACL9X,KAAK0Z,eAGD1Z,KAAK+X,qBAEL/X,KAAK2Z,iBAGL3Z,KAAK4Z,kBAMjB5Z,KAAK6Z,mBAGbjC,EAAWtX,UAAUwZ,cAAgB,SAAUC,GAC3C,IAAIpR,EAAQ3I,KACZA,KAAKwY,aAAawB,eAAerC,KAAK,SAAUsC,GAC5C,OAAQtR,EAAMmQ,QACV,KAAKxS,EAAkBC,QACnBwT,EAASE,GACT,MACJ,KAAK3T,EAAkBK,UACnBgC,EAAMsQ,YAAY3S,EAAkB3E,UACpC,MACJ,KAAK2E,EAAkBE,QACnBmC,EAAMsQ,YAAY3S,EAAkBG,YAOpDmR,EAAWtX,UAAUmZ,iBAAmB,WACpC,IAAI9Q,EAAQ3I,KACZA,KAAK8Z,cAAc,SAAUG,GACzB,IAAI7E,EAlXhB,SAA+BnG,EAAajD,EAAUoC,EAAUqE,EAAM6C,GAClE,IAAIpI,EAAUlB,EAASL,sBACnB8B,EAAW4H,GAAmBrJ,EAAUyG,EAAM6C,GAC9CvB,GAAcnE,KAAMnC,EAAmB,UACvChE,EAAM0D,EAAcD,GAEpB8G,GACAkG,yBAA0B,YAC1B5D,wBAAyB,QACzB6D,sCAAuC1H,EAAKhE,OAC5C2L,oCAAqC3M,EAAsB,YAC3D4M,eAAgB,mCAEhBpG,EAAOzE,GAAiB/B,EAAUW,GAClC0F,EAAU7E,EAAYuH,qBAatBpB,EAAc,IAAIxB,GAAYnK,EAtBrB,OAUb,SAAiBgL,EAAKC,GAElB,IAAIjL,EADJmM,GAAmBnB,GAEnB,IACIhL,EAAMgL,EAAInK,kBAAkB,qBAEhC,MAAO9F,GACH8P,IAAa,GAGjB,OADAA,GAAajM,EAASoB,IACfA,GAE6CqK,GAKxD,OAJAsB,EAAYrB,UAAYA,EACxBqB,EAAYpB,QAAUA,EACtBoB,EAAYnB,KAAOA,EACnBmB,EAAYlB,aAAeW,GAAmB7I,GACvCoJ,EAkVmBkF,CAAsB3R,EAAM6P,aAAc7P,EAAM8P,UAAW9P,EAAMuF,UAAWvF,EAAM+P,MAAO/P,EAAMgQ,WAC7G4B,EAAgB5R,EAAM6P,aAAagC,YAAYpF,EAAa6E,GAChEtR,EAAMwP,SAAWoC,EACjBA,EAAcE,aAAa9C,KAAK,SAAUlO,GACtCd,EAAMwP,SAAW,KACjBxP,EAAMuP,WAAazO,EACnBd,EAAMmP,oBAAqB,EAC3BnP,EAAMqQ,wBACPrQ,EAAMoQ,kBAGjBnB,EAAWtX,UAAUoZ,aAAe,WAChC,IAAI/Q,EAAQ3I,KAERyJ,EAAMzJ,KAAKkY,WACflY,KAAK8Z,cAAc,SAAUG,GACzB,IAAI7E,EA7VhB,SAAkCnG,EAAajD,EAAUvC,EAAKgJ,GAe1D,IACIqB,EAAU7E,EAAYuH,qBACtBpB,EAAc,IAAIxB,GAAYnK,EAFrB,OAbb,SAAiBgL,EAAKC,GAClB,IACIgG,EADAxQ,EAAS0L,GAAmBnB,GAAM,SAAU,UAEhD,IACIiG,EAAajG,EAAInK,kBAAkB,+BAEvC,MAAO9F,GACH8P,IAAa,GAEjB,IAAI7F,EAAOkM,SAASD,EAAY,IAEhC,OADApG,IAAcsG,MAAMnM,IACb,IAAI+G,GAAsB/G,EAAMgE,EAAKhE,OAAmB,UAAXvE,IAIA4J,GAGxD,OAFAsB,EAAYpB,SAjBIsC,wBAAyB,SAkBzClB,EAAYlB,aAAeW,GAAmB7I,GACvCoJ,EAyUmByF,CAAyBlS,EAAM6P,aAAc7P,EAAM8P,UAAWhP,EAAKd,EAAM+P,OACvFoC,EAAgBnS,EAAM6P,aAAagC,YAAYpF,EAAa6E,GAChEtR,EAAMwP,SAAW2C,EACjBA,EAAcL,aAAa9C,KAAK,SAAUzN,GACtCA,EAASA,EACTvB,EAAMwP,SAAW,KACjBxP,EAAM6Q,gBAAgBtP,EAAOuL,SAC7B9M,EAAMmP,oBAAqB,EACvB5N,EAAOyL,YACPhN,EAAMoP,sBAAuB,GAEjCpP,EAAMqQ,wBACPrQ,EAAMoQ,kBAGjBnB,EAAWtX,UAAUsZ,gBAAkB,WACnC,IAAIjR,EAAQ3I,KACR+V,EApVmB,OAoVoB/V,KAAKoY,iBAC5ClO,EAAS,IAAIsL,GAAsBxV,KAAK6X,aAAc7X,KAAK0Y,MAAMjK,QAEjEhF,EAAMzJ,KAAKkY,WACflY,KAAK8Z,cAAc,SAAUG,GACzB,IAAI7E,EACJ,IACIA,EAAcU,GAAwBnN,EAAM8P,UAAW9P,EAAM6P,aAAc/O,EAAKd,EAAM+P,MAAO3C,EAAWpN,EAAMuF,UAAWhE,EAAQvB,EAAM0Q,yBAE3I,MAAO7U,GAGH,OAFAmE,EAAMsP,OAASzT,OACfmE,EAAMsQ,YAAY3S,EAAkBM,OAGxC,IAAImU,EAAgBpS,EAAM6P,aAAagC,YAAYpF,EAAa6E,GAChEtR,EAAMwP,SAAW4C,EACjBA,EACKN,aACA9C,KAAK,SAAUqD,GAChBrS,EAAMsS,sBACNtS,EAAMwP,SAAW,KACjBxP,EAAM6Q,gBAAgBwB,EAAUvF,SAC5BuF,EAAUrF,WACVhN,EAAMgQ,UAAYqC,EAAUvN,SAC5B9E,EAAMsQ,YAAY3S,EAAkBI,UAGpCiC,EAAMqQ,wBAEXrQ,EAAMoQ,kBAGjBnB,EAAWtX,UAAU2a,oBAAsB,WApXhB,OAqXsBjb,KAAKoY,iBAEhC,WACdpY,KAAKoY,kBAAoB,IAGjCR,EAAWtX,UAAUqZ,eAAiB,WAClC,IAAIhR,EAAQ3I,KACZA,KAAK8Z,cAAc,SAAUG,GACzB,IAAI7E,EAAcF,GAAYvM,EAAM6P,aAAc7P,EAAM8P,UAAW9P,EAAMuF,WACrEgN,EAAkBvS,EAAM6P,aAAagC,YAAYpF,EAAa6E,GAClEtR,EAAMwP,SAAW+C,EACjBA,EAAgBT,aAAa9C,KAAK,SAAUlK,GACxC9E,EAAMwP,SAAW,KACjBxP,EAAMgQ,UAAYlL,EAClB9E,EAAMsQ,YAAY3S,EAAkBI,UACrCiC,EAAMuQ,0BAGjBtB,EAAWtX,UAAUuZ,eAAiB,WAClC,IAAIlR,EAAQ3I,KACZA,KAAK8Z,cAAc,SAAUG,GACzB,IAAI7E,EAthBhB,SAAyBnG,EAAajD,EAAUoC,EAAUqE,EAAM6C,GAC5D,IAAIpI,EAAUlB,EAASL,sBACnBqI,GACAkG,yBAA0B,aAa1BiB,EAXJ,WAEI,IADA,IAAIC,EAAM,GACDvW,EAAI,EAAGA,EAAI,EAAGA,IACnBuW,GAEQhF,KAAKiF,SACAtR,WACAyC,MAAM,GAEvB,OAAO4O,EAEIE,GACftH,EAAQ,gBAAkB,+BAAiCmH,EAC3D,IAAI1N,EAAW4H,GAAmBrJ,EAAUyG,EAAM6C,GAE9CiG,EAAc,KACdJ,EACA,4DAHiB3L,GAAiB/B,EAAUW,GAM5C,SACA+M,EACA,qBAEA1N,EAAsB,YACtB,WACA+N,EAAe,SAAWL,EAAW,KACrClH,EAAOtC,GAAQkB,QAAQ0I,EAAa9I,EAAM+I,GAC9C,GAAa,OAATvH,EACA,MAAMtR,IAEV,IAAIoR,GAAcnE,KAAMnC,EAAmB,UACvChE,EAAM0D,EAAcD,GAEpB4G,EAAU7E,EAAYuH,qBACtBpB,EAAc,IAAIxB,GAAYnK,EAFrB,OAEkC+K,GAAgBvF,EAAab,GAAW0F,GAKvF,OAJAsB,EAAYrB,UAAYA,EACxBqB,EAAYpB,QAAUA,EACtBoB,EAAYnB,KAAOA,EAAKR,aACxB2B,EAAYlB,aAAeW,GAAmB7I,GACvCoJ,EAyemBqG,CAAgB9S,EAAM6P,aAAc7P,EAAM8P,UAAW9P,EAAMuF,UAAWvF,EAAM+P,MAAO/P,EAAMgQ,WACvG+C,EAAmB/S,EAAM6P,aAAagC,YAAYpF,EAAa6E,GACnEtR,EAAMwP,SAAWuD,EACjBA,EAAiBjB,aAAa9C,KAAK,SAAUlK,GACzC9E,EAAMwP,SAAW,KACjBxP,EAAMgQ,UAAYlL,EAClB9E,EAAM6Q,gBAAgB7Q,EAAM+P,MAAMjK,QAClC9F,EAAMsQ,YAAY3S,EAAkBI,UACrCiC,EAAMoQ,kBAGjBnB,EAAWtX,UAAUkZ,gBAAkB,SAAUmC,GAC7C,IAAIC,EAAM5b,KAAK6X,aACf7X,KAAK6X,aAAe8D,EAIhB3b,KAAK6X,eAAiB+D,GACtB5b,KAAK6b,oBAGbjE,EAAWtX,UAAU2Y,YAAc,SAAUlS,GACzC,GAAI/G,KAAK8Y,SAAW/R,EAGpB,OAAQA,GACJ,KAAKT,EAAkBK,UASvB,KAAKL,EAAkBE,QAGnBxG,KAAK8Y,OAAS/R,EACQ,OAAlB/G,KAAKmY,UACLnY,KAAKmY,SAAS2D,SAElB,MACJ,KAAKxV,EAAkBC,QAInB,IAAIwV,EAAY/b,KAAK8Y,SAAWxS,EAAkBG,OAClDzG,KAAK8Y,OAAS/R,EACVgV,IACA/b,KAAK6b,mBACL7b,KAAKoZ,UAET,MACJ,KAAK9S,EAAkBG,OAGnBzG,KAAK8Y,OAAS/R,EACd/G,KAAK6b,mBACL,MACJ,KAAKvV,EAAkB3E,SAInB3B,KAAKiY,OAASvV,IACd1C,KAAK8Y,OAAS/R,EACd/G,KAAK6b,mBACL,MACJ,KAAKvV,EAAkBM,MAQvB,KAAKN,EAAkBI,QAKnB1G,KAAK8Y,OAAS/R,EACd/G,KAAK6b,qBAIjBjE,EAAWtX,UAAU0Y,qBAAuB,WACxC,OAAQhZ,KAAK8Y,QACT,KAAKxS,EAAkBE,QACnBxG,KAAKiZ,YAAY3S,EAAkBG,QACnC,MACJ,KAAKH,EAAkBK,UACnB3G,KAAKiZ,YAAY3S,EAAkB3E,UACnC,MACJ,KAAK2E,EAAkBC,QACnBvG,KAAKoZ,WAOjBxY,OAAOC,eAAe+W,EAAWtX,UAAW,YACxCQ,IAAK,WACD,IAAIkb,EAAgBlV,EAA+B9G,KAAK8Y,QACxD,OAAO,IAAI3B,GAAmBnX,KAAK6X,aAAc7X,KAAK0Y,MAAMjK,OAAQuN,EAAehc,KAAK2Y,UAAW3Y,KAAMA,KAAKuY,OAElHxX,YAAY,EACZC,cAAc,IAMlB4W,EAAWtX,UAAU2b,GAAK,SAAU9M,EAAMyH,EAAgBI,EAAOkF,QACtC,IAAnBtF,IAA6BA,OAAiBtF,QACpC,IAAV0F,IAAoBA,OAAQ1F,QACd,IAAd4K,IAAwBA,OAAY5K,GAMxC,IAAI6K,EAAwB,uFAExBC,EAAgB7K,IAAiB,GAAMhB,UACvC8L,EAAoBhL,GAAgB,MAAM,GAAMd,UACpD,SAAS+L,EAAwBtU,GAC7B,IAEI,YADAoU,EAAcpU,GAGlB,MAAOxD,IACP,IAKI,GAJA6X,EAAkBrU,KACDC,EAAUD,EAAQ,OAC/BC,EAAUD,EAAS,QACnBC,EAAUD,EAAY,WAEtB,KAAM,GAEV,OAEJ,MAAOxD,GACH,MAAM2X,GASdxM,GAAS,MALLiB,GA9BJ,SAAuB2L,GACnB,GAAIpN,IAAS/I,EAAUC,cACnB,KAAM,qCAAuCD,EAAUC,cAAgB,OA6B3EgL,GAAgBiL,GAAyB,GACzC/K,IAAiB,GACjBA,IAAiB,IAECyB,WACtB,IAAIrC,EAAO3Q,KACX,SAASwc,EAAW3M,GAWhB,OAVA,SAAgB+G,EAAgBI,EAAOF,GACrB,OAAVjH,GACAF,GAAS,KAAME,EAAOmD,WAE1B,IAAIkE,EAAW,IAAIP,GAASC,EAAgBI,EAAOkF,GAEnD,OADAvL,EAAK8L,aAAavF,GACX,WACHvG,EAAK+L,gBAAgBxF,KAWjC,IAAIyF,GACAtL,GAPJ,SAAuCrJ,GACnC,GAAU,OAANA,EACA,MAAMmU,EAEVG,EAAwBtU,KAIxBuJ,IAAiB,GACjBA,IAAiB,IAKrB,QAHiBtJ,EAAU2O,IACvB3O,EAAU+O,IACV/O,EAAUiU,IAEHM,EAAWG,GAGXH,EAAW,KAAXA,CAAiB5F,EAAgBI,EAAOkF,IASvDtE,EAAWtX,UAAUqX,KAAO,SAAUiF,EAAaC,GAG/C,OAAO7c,KAAKmZ,SAASxB,KAAKiF,EAAaC,IAK3CjF,EAAWtX,UAAUwc,MAAQ,SAAUD,GACnC,OAAO7c,KAAK2X,KAAK,KAAMkF,IAK3BjF,EAAWtX,UAAUmc,aAAe,SAAUvF,GAC1ClX,KAAKgY,WAAW/S,KAAKiS,GACrBlX,KAAK+c,gBAAgB7F,IAKzBU,EAAWtX,UAAUoc,gBAAkB,SAAUxF,GAp4BrD,IAAgBvR,EAAOgO,EACf9O,EADQc,EAq4BD3F,KAAKgY,WAr4BGrE,EAq4BSuD,GAn4BjB,KADPrS,EAAIc,EAAMP,QAAQuO,KAElBhO,EAAMqX,OAAOnY,EAAG,IAo4BpB+S,EAAWtX,UAAUub,iBAAmB,WACpC,IAh5BSoB,EAg5BLtU,EAAQ3I,KACZA,KAAKkd,kBAj5BID,EAk5Bejd,KAAKgY,WAj5B1B9M,MAAM5K,UAAUkM,MAAMpF,KAAK6V,IAk5BpB5V,QAAQ,SAAU6P,GACxBvO,EAAMoU,gBAAgB7F,MAG9BU,EAAWtX,UAAU4c,eAAiB,WAClC,GAAsB,OAAlBld,KAAKqY,SAAmB,CACxB,IAAI8E,GAAY,EAChB,OAAQrW,EAA+B9G,KAAK8Y,SACxC,KAAKjS,EAAUH,QACX+Q,GAAMzX,KAAKqY,SAAS+E,KAAK,KAAMpd,KAAKqd,UAApC5F,GACA,MACJ,KAAK5Q,EAAUlF,SACf,KAAKkF,EAAUD,MAEX6Q,GADazX,KAAKsY,QACL8E,KAAK,KAAMpd,KAAKiY,QAA7BR,GACA,MACJ,QACI0F,GAAY,EAGhBA,IACAnd,KAAKqY,SAAW,KAChBrY,KAAKsY,QAAU,QAI3BV,EAAWtX,UAAUyc,gBAAkB,SAAU7F,GAE7C,OADoBpQ,EAA+B9G,KAAK8Y,SAEpD,KAAKjS,EAAUN,QACf,KAAKM,EAAUJ,OACW,OAAlByQ,EAASH,MACTU,GAAMP,EAASH,KAAKqG,KAAKlG,EAAUlX,KAAKqd,UAAxC5F,GAEJ,MACJ,KAAK5Q,EAAUH,QACe,OAAtBwQ,EAASD,UACTQ,GAAMP,EAASD,SAASmG,KAAKlG,GAA7BO,GAEJ,MACJ,KAAK5Q,EAAUlF,SACf,KAAKkF,EAAUD,MACY,OAAnBsQ,EAASF,OACTS,GAAMP,EAASF,MAAMoG,KAAKlG,EAAUlX,KAAKiY,QAAzCR,GAEJ,MACJ,QAE2B,OAAnBP,EAASF,OACTS,GAAMP,EAASF,MAAMoG,KAAKlG,EAAUlX,KAAKiY,QAAzCR,KAQhBG,EAAWtX,UAAUgd,OAAS,WAC1B3N,GAAS,YAAcqD,WACvB,IAAIuK,EAAQvd,KAAK8Y,SAAWxS,EAAkBG,QAC1CzG,KAAK8Y,SAAWxS,EAAkBE,QAItC,OAHI+W,GACAvd,KAAKiZ,YAAY3S,EAAkBC,SAEhCgX,GAMX3F,EAAWtX,UAAUkd,MAAQ,WACzB7N,GAAS,WAAaqD,WACtB,IAAIuK,EAAQvd,KAAK8Y,SAAWxS,EAAkBC,QAI9C,OAHIgX,GACAvd,KAAKiZ,YAAY3S,EAAkBE,SAEhC+W,GAOX3F,EAAWtX,UAAUwb,OAAS,WAC1BnM,GAAS,YAAcqD,WACvB,IAAIuK,EAAQvd,KAAK8Y,SAAWxS,EAAkBC,SAC1CvG,KAAK8Y,SAAWxS,EAAkBE,QAItC,OAHI+W,GACAvd,KAAKiZ,YAAY3S,EAAkBK,WAEhC4W,GAEJ3F,KA6BP6F,GAA2B,WAC3B,SAASA,EAAUxO,EAAajD,GAC5BhM,KAAKiP,YAAcA,EAEfjP,KAAKgM,SADLA,aAAoBZ,EACJY,EAGAZ,EAASW,YAAYC,GA0L7C,OAlLAyR,EAAUnd,UAAUyJ,SAAW,WAE3B,OADA4F,GAAS,cAAgBqD,WAClB,QAAUhT,KAAKgM,SAASX,OAAS,IAAMrL,KAAKgM,SAASV,MAEhEmS,EAAUnd,UAAUod,OAAS,SAAUzO,EAAajD,GAChD,OAAO,IAAIyR,EAAUxO,EAAajD,IAEtCyR,EAAUnd,UAAU8N,SAAW,WAC3B,OAAOD,MAOXsP,EAAUnd,UAAUqd,MAAQ,SAAUC,GAClCjO,GAAS,SAAUiB,MAAeoC,WAClC,IAAI6K,EArmDZ,SAAevS,EAAMsS,GACjB,IAAIE,EAAqBF,EACpBjP,MAAM,KACNoP,OAAO,SAAUC,GAClB,OAAOA,EAAUlZ,OAAS,IAEzBmZ,KAAK,KACV,OAAoB,IAAhB3S,EAAKxG,OACEgZ,EAGAxS,EAAO,IAAMwS,EA0lDNH,CAAM3d,KAAKgM,SAASV,KAAMsS,GACpC5R,EAAW,IAAIZ,EAASpL,KAAKgM,SAASX,OAAQwS,GAClD,OAAO7d,KAAK0d,OAAO1d,KAAKiP,YAAajD,IAEzCpL,OAAOC,eAAe4c,EAAUnd,UAAW,UAKvCQ,IAAK,WACD,IAAI+c,EA1nDhB,SAAgBvS,GACZ,GAAmB,GAAfA,EAAKxG,OACL,OAAO,KAEX,IAAIjC,EAAQyI,EAAK0B,YAAY,KAC7B,OAAe,IAAXnK,EACO,GAEGyI,EAAKkB,MAAM,EAAG3J,GAknDNqb,CAAOle,KAAKgM,SAASV,MACnC,GAAgB,OAAZuS,EACA,OAAO,KAEX,IAAI7R,EAAW,IAAIZ,EAASpL,KAAKgM,SAASX,OAAQwS,GAClD,OAAO7d,KAAK0d,OAAO1d,KAAKiP,YAAajD,IAEzCjL,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAe4c,EAAUnd,UAAW,QAKvCQ,IAAK,WACD,IAAIkL,EAAW,IAAIZ,EAASpL,KAAKgM,SAASX,OAAQ,IAClD,OAAOrL,KAAK0d,OAAO1d,KAAKiP,YAAajD,IAEzCjL,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAe4c,EAAUnd,UAAW,UACvCQ,IAAK,WACD,OAAOd,KAAKgM,SAASX,QAEzBtK,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAe4c,EAAUnd,UAAW,YACvCQ,IAAK,WACD,OAAOd,KAAKgM,SAASV,MAEzBvK,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAe4c,EAAUnd,UAAW,QACvCQ,IAAK,WACD,OAAOiM,EAAc/M,KAAKgM,SAASV,OAEvCvK,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAe4c,EAAUnd,UAAW,WACvCQ,IAAK,WACD,OAAOd,KAAKiP,YAAYkP,WAE5Bpd,YAAY,EACZC,cAAc,IAQlByc,EAAUnd,UAAU8d,IAAM,SAAUza,EAAM8J,GAItC,YAHiB,IAAbA,IAAuBA,EAAW,MACtCkC,GAAS,OAj2CN,IAAIc,GARX,SAAmBzI,GAIf,KAHYA,aAAa9C,YACrB8C,aAAa+J,aACZvJ,KAAyBR,aAAaS,MAEvC,KAAM,2BAo2CyBwI,IAAa,IAAQ+B,WACxDhT,KAAKqe,aAAa,OACX,IAAIzG,GAAW5X,KAAMA,KAAKiP,YAAajP,KAAKgM,SAAUhM,KAAKoO,WAAY,IAAIuD,GAAQhO,GAAO8J,IASrGgQ,EAAUnd,UAAUge,UAAY,SAAUva,EAAQd,EAAQqS,QACvC,IAAXrS,IAAqBA,EAASE,EAAaC,KAC/CuM,GAAS,aACLiB,KACAA,GAAWpN,GAAiB,GAC5ByN,IAAa,IACd+B,WACHhT,KAAKqe,aAAa,aAClB,IAAI1a,EAAOG,EAAeb,EAAQc,GAC9B0J,EAAWjG,EAAM8N,GAIrB,OAHKvN,EAAM0F,EAAsB,cAAM1F,EAAMpE,EAAKE,eAC9C4J,EAAsB,YAAI9J,EAAKE,aAE5B,IAAI+T,GAAW5X,KAAMA,KAAKiP,YAAajP,KAAKgM,SAAUhM,KAAKoO,WAAY,IAAIuD,GAAQhO,EAAKA,MAAM,GAAO8J,IAMhHgQ,EAAUnd,UAAUie,OAAS,WACzB5O,GAAS,YAAcqD,WACvBhT,KAAKqe,aAAa,UAClB,IAAI1N,EAAO3Q,KACX,OAAOA,KAAKiP,YAAY+K,eAAerC,KAAK,SAAUsC,GAClD,IAAI7E,EA9gChB,SAAsBnG,EAAajD,GAC/B,IACIvC,EAAMwD,EADIjB,EAASR,iBAGnBsI,EAAU7E,EAAYkG,wBAEtBC,EAAc,IAAIxB,GAAYnK,EAHrB,SAEb,SAAiBgL,EAAKC,KACkCZ,GAGxD,OAFAsB,EAAYhB,cAAgB,IAAK,KACjCgB,EAAYlB,aAAec,GAAmBhJ,GACvCoJ,EAqgCmBoJ,CAAa7N,EAAK1B,YAAa0B,EAAK3E,UACtD,OAAO2E,EAAK1B,YAAYuL,YAAYpF,EAAa6E,GAAWQ,gBAQpEgD,EAAUnd,UAAU4U,YAAc,WAC9BvF,GAAS,iBAAmBqD,WAC5BhT,KAAKqe,aAAa,eAClB,IAAI1N,EAAO3Q,KACX,OAAOA,KAAKiP,YAAY+K,eAAerC,KAAK,SAAUsC,GAClD,IAAI7E,EAAcF,GAAYvE,EAAK1B,YAAa0B,EAAK3E,SAAU2E,EAAKvC,YACpE,OAAOuC,EAAK1B,YAAYuL,YAAYpF,EAAa6E,GAAWQ,gBAYpEgD,EAAUnd,UAAUme,eAAiB,SAAUhR,GAC3CkC,GAAS,kBAAmBsB,MAAiB+B,WAC7ChT,KAAKqe,aAAa,kBAClB,IAAI1N,EAAO3Q,KACX,OAAOA,KAAKiP,YAAY+K,eAAerC,KAAK,SAAUsC,GAClD,IAAI7E,EA3jChB,SAAwBnG,EAAajD,EAAUyB,EAAUW,GACrD,IACI3E,EAAMwD,EADIjB,EAASR,iBAGnByI,EAAOzE,GAAiB/B,EAAUW,GAElC0F,EAAU7E,EAAYkG,wBACtBC,EAAc,IAAIxB,GAAYnK,EAJrB,QAIkC+K,GAAgBvF,EAAab,GAAW0F,GAIvF,OAHAsB,EAAYpB,SAHIqG,eAAgB,mCAIhCjF,EAAYnB,KAAOA,EACnBmB,EAAYlB,aAAec,GAAmBhJ,GACvCoJ,EAgjCmBqJ,CAAe9N,EAAK1B,YAAa0B,EAAK3E,SAAUyB,EAAUkD,EAAKvC,YACjF,OAAOuC,EAAK1B,YAAYuL,YAAYpF,EAAa6E,GAAWQ,gBAOpEgD,EAAUnd,UAAUoe,eAAiB,WAGjC,OAFA/O,GAAS,oBAAsBqD,WAC/BhT,KAAKqe,aAAa,kBACXre,KAAKkV,cAAcyC,KAAK,SAAUlK,GACrC,IAAIhE,EAAMgE,EAAuB,aAAE,GACnC,GAAI1F,EAAM0B,GACN,OAAOA,EAGP,MA1gFL,IAAI5J,EAAqBoB,EAAKiB,gBAAiB,sDA8gFtDub,EAAUnd,UAAU+d,aAAe,SAAUzO,GACzC,GAA2B,KAAvB5P,KAAKgM,SAASV,KACd,MAh/EZ,SAA8BsE,GAC1B,OAAO,IAAI/P,EAAqBoB,EAAKqB,uBAAwB,kBACzDsN,EACA,mHA6+EU+O,CAAqB/O,IAG5B6N,KAQPmB,GAA6B,WAC7B,SAASA,EAAY5H,GACjBhX,KAAKmZ,SAnqEb,SAAgBnC,GACZ,OAAOpP,QAAQiX,OAAO7H,GAkqEF6H,CAAO7H,GAU3B,OAPA4H,EAAYte,UAAUma,WAAa,WAC/B,OAAOza,KAAKmZ,UAGhByF,EAAYte,UAAUwb,OAAS,SAAUgD,QACnB,IAAdA,IAAwBA,GAAY,IAErCF,KAqBPG,GAA4B,WAC5B,SAASA,IACL/e,KAAKgf,QACLhf,KAAKif,IAAMrf,EA4Bf,OArBAmf,EAAWze,UAAU4e,WAAa,SAAUC,GACxC,IAAIC,EAAKpf,KAAKif,IACdjf,KAAKif,MACLjf,KAAKgf,KAAKI,GAAMD,EAChB,IAAIxO,EAAO3Q,KACX,SAASqf,WACE1O,EAAKqO,KAAKI,GAErBD,EAAE1E,aAAa9C,KAAK0H,EAAOA,IAK/BN,EAAWze,UAAUgf,MAAQ,WACzBjY,EAAQrH,KAAKgf,KAAM,SAAUzX,EAAKE,GAC1BA,GACAA,EAAIqU,QAAO,KAGnB9b,KAAKgf,SAEFD,KASPQ,GAA6B,WAC7B,SAASA,EAAYC,EAAKC,EAAOC,EAAcvB,EAASwB,GAIpD,GAHA3f,KAAK4f,QAAU,KACf5f,KAAK6f,UAAW,EAChB7f,KAAK8f,KAAON,EACM,OAAdxf,KAAK8f,KAAe,CACpB,IAAIC,EAAU/f,KAAK8f,KAAKC,QACpBhY,EAAMgY,KACN/f,KAAK4f,QAAUL,EAAYS,eAAeD,IAGlD/f,KAAKigB,iBAAmBR,EACxBzf,KAAKkgB,cAAgBR,EACrB1f,KAAKmgB,MAAQR,EACb3f,KAAKogB,SAAWjC,EAChBne,KAAKqgB,uBAAyB3gB,EAC9BM,KAAKsgB,oBAAsB3gB,EAC3BK,KAAKugB,YAAc,IAAIxB,GAsF3B,OApFAQ,EAAYS,eAAiB,SAAUQ,GACnC,IAAI3U,EAAe2U,EAAmB,eAAK,KAC3C,OAAoB,MAAhB3U,EACO,KAEDT,EAASQ,mBAAmBC,GAC3BR,QAEfkU,EAAYjf,UAAU0Z,aAAe,WAGjC,OAAkB,OAAdha,KAAK8f,MACL/X,EAAM/H,KAAK8f,KAAKW,WAChB1Y,EAAM/H,KAAK8f,KAAKW,SAASC,UAClB1gB,KAAK8f,KAAKW,SAASC,WAAW/I,KAAK,SAAUgJ,GAChD,OAAiB,OAAbA,EACOA,EAASC,YAGT,MAEZ,SAAUC,GACT,OAAO,OAIJhZ,EAAQ,OAGvB0X,EAAYjf,UAAU+K,OAAS,WAC3B,GAAIrL,KAAK6f,SACL,MAAM9c,IAGN,OAAO/C,KAAK4f,SAOpBL,EAAYjf,UAAU6d,QAAU,WAC5B,OAAOne,KAAKogB,UAShBb,EAAYjf,UAAUgP,qBAAuB,SAAUhD,GACnD,OAAOtM,KAAKigB,iBAAiBjgB,KAAMsM,IAEvCiT,EAAYjf,UAAUka,YAAc,SAAUpF,EAAa6E,GACvD,GAAKja,KAAK6f,SAMN,OAAO,IAAIjB,GAAY7b,KALvB,IAAI+d,EAAU9gB,KAAKkgB,cAAc9K,EAAa6E,EAAWja,KAAKmgB,OAE9D,OADAngB,KAAKugB,YAAYrB,WAAW4B,GACrBA,GASfvB,EAAYjf,UAAUygB,UAAY,WAC9B/gB,KAAK6f,UAAW,EAChB7f,KAAK8f,KAAO,KACZ9f,KAAKugB,YAAYjB,SAErBC,EAAYjf,UAAUkW,mBAAqB,WACvC,OAAOxW,KAAKsgB,qBAEhBf,EAAYjf,UAAU0gB,sBAAwB,SAAUC,GACpDjhB,KAAKsgB,oBAAsBW,GAE/B1B,EAAYjf,UAAU6U,sBAAwB,WAC1C,OAAOnV,KAAKqgB,wBAEhBd,EAAYjf,UAAU4gB,yBAA2B,SAAUD,GACvDjhB,KAAKqgB,uBAAyBY,GAE3B1B,KA0IX,IAAI4B,GAAgC,WAChC,SAASA,EAAe1X,EAAKC,EAAQsK,EAASC,EAAMG,EAAcC,EAAsB0F,EAAUqH,EAAetN,EAASK,EAAkBwL,GACxI3f,KAAKqhB,YAAc,KACnBrhB,KAAKshB,WAAa,KAClBthB,KAAKqY,SAAW,KAChBrY,KAAKsY,QAAU,KACftY,KAAKuhB,WAAY,EACjBvhB,KAAKwhB,YAAa,EAClBxhB,KAAKyhB,KAAOhY,EACZzJ,KAAK0hB,QAAUhY,EACf1J,KAAK2hB,SAAW3N,EAChBhU,KAAK4hB,MAAQ3N,EACbjU,KAAK6hB,cAAgBzN,EAAa5H,QAClCxM,KAAK8hB,sBAAwBzN,EAAqB7H,QAClDxM,KAAK+hB,UAAYhI,EACjB/Z,KAAKgiB,eAAiBZ,EACtBphB,KAAKiiB,kBAAoB9N,EACzBnU,KAAKkiB,SAAWpO,EAChB9T,KAAKmgB,MAAQR,EACb,IAAIhP,EAAO3Q,KACXA,KAAKmZ,SAAWzR,EAAK,SAAUwB,EAAYC,GACvCwH,EAAK0H,SAAWnP,EAChByH,EAAK2H,QAAUnP,EACfwH,EAAKyI,WA+Hb,OAzHA+H,EAAe7gB,UAAU8Y,OAAS,WAC9B,IAAIzI,EAAO3Q,KAyCX,SAASmiB,EAAYC,EAAoBlY,GACrC,IAoCgB4K,EApCZ5L,EAAayH,EAAK0H,SAClBlP,EAAYwH,EAAK2H,QACjB7D,EAAMvK,EAAOuK,IACjB,GAAIvK,EAAOmY,eACP,IACI,IAAIC,EAAS3R,EAAKoR,UAAUtN,EAAKA,EAAItK,mBACjClC,EAAUqa,GACVpZ,EAAWoZ,GAGXpZ,IAGR,MAAO1E,GACH2E,EAAU3E,QAIF,OAARiQ,IACIK,EAAMrS,KACN/B,sBAAsB+T,EAAItK,mBAC1BwG,EAAKqR,eACL7Y,EAAUwH,EAAKqR,eAAevN,EAAKK,IAGnC3L,EAAU2L,IAIV5K,EAAOxH,SAIPyG,EAHI2L,EAAMnE,EAAK6Q,WACTze,IACAL,KAKNyG,EADI2L,EAn9FjB,IAAIjV,EAAqBoB,EAAKQ,qBAAsB,6DAy9FnDzB,KAAKuhB,UACLY,EAAY,EAAO,IAAII,IAAiB,EAAO,MAAM,IAGrDviB,KAAKshB,WAxOjB,SAAeha,EAAGyS,EAAUjG,GAGxB,IAAI0O,EAAc,EAEdC,EAAY,KACZC,GAAa,EACbC,EAAc,EAClB,SAASjgB,IACL,OAAuB,IAAhBigB,EAEX,IAAIC,GAAoB,EACxB,SAASC,IACAD,IACDA,GAAoB,EACpB7I,EAAS3G,MAAM,KAAMJ,YAG7B,SAAS8P,EAAcC,GACnBN,EAAYO,WAAW,WACnBP,EAAY,KACZnb,EAAEuM,EAASnR,MACZqgB,GAEP,SAASlP,EAAQoP,GAEb,IADA,IAoBIC,EApBApQ,KACKC,EAAK,EAAGA,EAAKC,UAAUlO,OAAQiO,IACpCD,EAASC,EAAK,GAAKC,UAAUD,GAE7B6P,IAGAK,EACAJ,EAAgBzP,MAAM,KAAMJ,WAGjBtQ,KAAcggB,EAEzBG,EAAgBzP,MAAM,KAAMJ,YAG5BwP,EAAc,KAEdA,GAAe,GAGC,IAAhBG,GACAA,EAAc,EACdO,EAAa,GAGbA,EAA6C,KAA/BV,EAAcpM,KAAKiF,UAErCyH,EAAcI,KAElB,IAAIC,GAAU,EACd,SAASC,EAAKC,GACNF,IAGJA,GAAU,EACNP,IAGc,OAAdH,GACKY,IACDV,EAAc,GAElBW,aAAab,GACbK,EAAc,IAGTO,IACDV,EAAc,KAS1B,OALAG,EAAc,GACdE,WAAW,WACPN,GAAa,EACbU,GAAK,IACNtP,GACIsP,EAsJmB5Q,CAvFtB,SAAsB+Q,EAAiBC,GACnC,GAAIA,EACAD,GAAgB,EAAO,IAAIhB,IAAiB,EAAO,MAAM,QAD7D,CAIA,IAAI9N,EAAM9D,EAAKwP,MAAMrV,cACrB6F,EAAK0Q,YAAc5M,EAQY,OAA3B9D,EAAKsR,mBACLxN,EAAIjK,0BAA0BiZ,GAElChP,EACKjL,KAAKmH,EAAK8Q,KAAM9Q,EAAK+Q,QAAS/Q,EAAKiR,MAAOjR,EAAKgR,UAC/ChK,KAAK,SAAUlD,GACe,OAA3B9D,EAAKsR,mBACLxN,EAAI9J,6BAA6B8Y,GAErC9S,EAAK0Q,YAAc,KAEnB,IAAIqC,GADJjP,EAAMA,GACczK,iBAAmB7D,EAAU6C,SAC7CkB,EAASuK,EAAIxK,YACjB,GAAKyZ,IAAa/S,EAAKgT,mBAAmBzZ,GAA1C,CAKA,IAAI0Z,EAAclQ,GAAW/C,EAAKkR,cAAe3X,GACjDqZ,GAAgB,EAAM,IAAIhB,GAAiBqB,EAAanP,QANxD,CACI,IAAIoP,EAAcpP,EAAIzK,iBAAmB7D,EAAUmD,MACnDia,GAAgB,EAAO,IAAIhB,IAAiB,EAAO,KAAMsB,OAtBjE,SAASJ,EAAiBK,GACtB,IAAIvK,EAASuK,EAAcvK,OACvB7D,EAAQoO,EAAcC,iBAAmBD,EAAcpO,OAAS,EACrC,OAA3B/E,EAAKsR,mBACLtR,EAAKsR,kBAAkB1I,EAAQ7D,KA4EDyM,EAAaniB,KAAKkiB,WAIhEf,EAAe7gB,UAAUma,WAAa,WAClC,OAAOza,KAAKmZ,UAGhBgI,EAAe7gB,UAAUwb,OAAS,SAAUgD,GACxC9e,KAAKuhB,WAAY,EACjBvhB,KAAKwhB,WAAa1C,IAAa,EACP,OAApB9e,KAAKshB,aACL8B,EAAKpjB,KAAKshB,aAxJf,GA0J0B,OAArBthB,KAAKqhB,aACLrhB,KAAKqhB,YAAYhX,SAGzB8W,EAAe7gB,UAAUqjB,mBAAqB,SAAUzZ,GAGpD,IAAI8Z,EAAoB9Z,GAAU,KAAOA,EAAS,IAO9C+Z,EAAmBvQ,IAJnB,IAEA,KAE+CxJ,GAC/Cga,EAA6BxQ,GAAW1T,KAAK8hB,sBAAuB5X,GACxE,OAAO8Z,GAAqBC,GAAoBC,GAE7C/C,KAOPoB,GAAkC,WAMlC,OALA,SAA0BF,EAAgB5N,EAAK0P,GAC3CnkB,KAAKqiB,eAAiBA,EACtBriB,KAAKyU,IAAMA,EACXzU,KAAK0C,WAAayhB,MAgB1B,SAAS3J,GAAYpF,EAAa6E,EAAW0F,GACzC,IAAIrS,EAAYF,EAAgBgI,EAAYrB,WACxCtK,EAAM2L,EAAY3L,IAAM6D,EACxB0G,EAAUxM,EAAM4N,EAAYpB,SAGhC,OAlBJ,SAAwBA,EAASiG,GACX,OAAdA,GAAsBA,EAAUnV,OAAS,IACzCkP,EAAuB,cAAI,YAAciG,GAc7CmK,CAAepQ,EAASiG,GAX5B,SAA2BjG,GACvB,IAAIqQ,OAA6B,IAAbC,EAA2BA,EAASC,YAAc,aACtEvQ,EAAQ,8BAAgC,SAAWqQ,EAUnDG,CAAkBxQ,GACX,IAAImN,GAAe1X,EAAK2L,EAAY1L,OAAQsK,EAASoB,EAAYnB,KAAMmB,EAAYhB,aAAcgB,EAAYf,qBAAsBe,EAAYvB,QAASuB,EAAYlB,aAAckB,EAAYtB,QAASsB,EAAYjB,iBAAkBwL,GAwBhP,IAAI8E,GAAyB,WACzB,SAASA,EAAQjF,EAAKG,EAAMlW,GAOxB,GANAzJ,KAAK4f,QAAU,KAIf5f,KAAKwY,aAAe,IAAI+G,GAAYC,EAHpC,SAAevQ,EAAa3C,GACxB,OAAO,IAAImR,GAAUxO,EAAa3C,IAEUkO,GAAaxa,KAAM2f,GACnE3f,KAAK8f,KAAON,EACD,MAAP/V,EACAzJ,KAAK4f,QAAUxU,EAASQ,mBAAmBnC,OAE1C,CACD,IAAIib,EAAoB1kB,KAAKwY,aAAanN,SACjB,MAArBqZ,IACA1kB,KAAK4f,QAAU,IAAIxU,EAASsZ,EAAmB,KAGvD1kB,KAAK2kB,WAAa,IAAIC,GAAiB5kB,MA+E3C,OAzEAykB,EAAQnkB,UAAUiX,IAAM,SAAUjM,GAO9B,GADAqE,GAAS,OAAQiB,GALjB,SAAmBtF,GACf,GAAI,kBAAkBuZ,KAAKvZ,GACvB,KAAM,+DAGyB,IAAQ0H,WAC3B,MAAhBhT,KAAK4f,QACL,MAAM,IAAIpP,MAAM,kDAEpB,IAAI+G,EAAM,IAAIkG,GAAUzd,KAAKwY,aAAcxY,KAAK4f,SAChD,OAAY,MAARtU,EACOiM,EAAIoG,MAAMrS,GAGViM,GAOfkN,EAAQnkB,UAAUwkB,WAAa,SAAUrb,GAarC,OADAkG,GAAS,cAAeiB,GAXxB,SAAmB5I,GACf,IAAK,kBAAkB6c,KAAK7c,GACxB,KAAM,2DAEV,IACIoD,EAASW,YAAY/D,GAEzB,MAAOxD,GACH,KAAM,qDAGgC,IAASwO,WAChD,IAAIyK,GAAUzd,KAAKwY,aAAc/O,IAE5C7I,OAAOC,eAAe4jB,EAAQnkB,UAAW,sBACrCQ,IAAK,WACD,OAAOd,KAAKwY,aAAahC,sBAE7BzV,YAAY,EACZC,cAAc,IAElByjB,EAAQnkB,UAAU0gB,sBAAwB,SAAUC,GAChDtR,GAAS,yBAA0BuB,MAA0B8B,WAC7DhT,KAAKwY,aAAawI,sBAAsBC,IAE5CrgB,OAAOC,eAAe4jB,EAAQnkB,UAAW,yBACrCQ,IAAK,WACD,OAAOd,KAAKwY,aAAarD,yBAE7BpU,YAAY,EACZC,cAAc,IAElByjB,EAAQnkB,UAAU4gB,yBAA2B,SAAUD,GACnDtR,GAAS,4BAA6BuB,MAA0B8B,WAChEhT,KAAKwY,aAAa0I,yBAAyBD,IAE/CrgB,OAAOC,eAAe4jB,EAAQnkB,UAAW,OACrCQ,IAAK,WACD,OAAOd,KAAK8f,MAEhB/e,YAAY,EACZC,cAAc,IAElBJ,OAAOC,eAAe4jB,EAAQnkB,UAAW,YACrCQ,IAAK,WACD,OAAOd,KAAK2kB,YAEhB5jB,YAAY,EACZC,cAAc,IAEXyjB,KAKPG,GAAkC,WAClC,SAASA,EAAiBzG,GACtBne,KAAKogB,SAAWjC,EAUpB,OAJAyG,EAAiBtkB,UAAUie,OAAS,WAEhC,OADAve,KAAKogB,SAAS5H,aAAauI,YACpBlZ,OAAQyJ,IAEZsT,KAqBPG,GAAe,UACnB,SAASC,GAAQxF,EAAKyF,EAAQC,GAC1B,OAAO,IAAIT,GAAQjF,EAAK,IAAI3U,EAAaqa,GAGrCC,IAEAte,UAAWA,EACXT,UAAWA,EACXjD,aAAcA,EACdiiB,QAASX,GACThH,UAAWA,IAMH6G,EAJH7D,SAAS4E,gBAAgBN,GAAcC,GAASG,QAAkB7T,GAE3E,sIAXJ,IACQ6T"}