1 line
No EOL
334 KiB
JSON
1 line
No EOL
334 KiB
JSON
{"ast":null,"code":"import _asyncToGenerator from \"/home/poule/encrypted/stockage-syncable/www/development/html/ng-implementation/implem/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\n/**\n * @license Angular v20.1.4\n * (c) 2010-2025 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport * as i0 from '@angular/core';\nimport { ɵRuntimeError as _RuntimeError, Injectable, InjectionToken, inject, NgZone, DestroyRef, ɵformatRuntimeError as _formatRuntimeError, PendingTasks, ɵConsole as _Console, runInInjectionContext, DOCUMENT, Inject, makeEnvironmentProviders, NgModule } from '@angular/core';\nimport { concatMap, filter, map, finalize, switchMap } from 'rxjs/operators';\nimport { of, Observable, from } from 'rxjs';\nimport { XhrFactory, parseCookieValue } from './xhr.mjs';\n\n/**\n * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a\n * `HttpResponse`.\n *\n * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the\n * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the\n * `HttpBackend`.\n *\n * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.\n *\n * @publicApi\n */\nclass HttpHandler {}\n/**\n * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.\n *\n * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.\n *\n * When injected, `HttpBackend` dispatches requests directly to the backend, without going\n * through the interceptor chain.\n *\n * @publicApi\n */\nclass HttpBackend {}\n\n/**\n * Represents the header configuration options for an HTTP request.\n * Instances are immutable. Modifying methods return a cloned\n * instance with the change. The original object is never changed.\n *\n * @publicApi\n */\nclass HttpHeaders {\n /**\n * Internal map of lowercase header names to values.\n */\n headers;\n /**\n * Internal map of lowercased header names to the normalized\n * form of the name (the form seen first).\n */\n normalizedNames = new Map();\n /**\n * Complete the lazy initialization of this object (needed before reading).\n */\n lazyInit;\n /**\n * Queued updates to be materialized the next initialization.\n */\n lazyUpdate = null;\n /** Constructs a new HTTP header object with the given values.*/\n constructor(headers) {\n if (!headers) {\n this.headers = new Map();\n } else if (typeof headers === 'string') {\n this.lazyInit = () => {\n this.headers = new Map();\n headers.split('\\n').forEach(line => {\n const index = line.indexOf(':');\n if (index > 0) {\n const name = line.slice(0, index);\n const value = line.slice(index + 1).trim();\n this.addHeaderEntry(name, value);\n }\n });\n };\n } else if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n this.headers = new Map();\n headers.forEach((value, name) => {\n this.addHeaderEntry(name, value);\n });\n } else {\n this.lazyInit = () => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n assertValidHeaders(headers);\n }\n this.headers = new Map();\n Object.entries(headers).forEach(([name, values]) => {\n this.setHeaderEntries(name, values);\n });\n };\n }\n }\n /**\n * Checks for existence of a given header.\n *\n * @param name The header name to check for existence.\n *\n * @returns True if the header exists, false otherwise.\n */\n has(name) {\n this.init();\n return this.headers.has(name.toLowerCase());\n }\n /**\n * Retrieves the first value of a given header.\n *\n * @param name The header name.\n *\n * @returns The value string if the header exists, null otherwise\n */\n get(name) {\n this.init();\n const values = this.headers.get(name.toLowerCase());\n return values && values.length > 0 ? values[0] : null;\n }\n /**\n * Retrieves the names of the headers.\n *\n * @returns A list of header names.\n */\n keys() {\n this.init();\n return Array.from(this.normalizedNames.values());\n }\n /**\n * Retrieves a list of values for a given header.\n *\n * @param name The header name from which to retrieve values.\n *\n * @returns A string of values if the header exists, null otherwise.\n */\n getAll(name) {\n this.init();\n return this.headers.get(name.toLowerCase()) || null;\n }\n /**\n * Appends a new value to the existing set of values for a header\n * and returns them in a clone of the original instance.\n *\n * @param name The header name for which to append the values.\n * @param value The value to append.\n *\n * @returns A clone of the HTTP headers object with the value appended to the given header.\n */\n append(name, value) {\n return this.clone({\n name,\n value,\n op: 'a'\n });\n }\n /**\n * Sets or modifies a value for a given header in a clone of the original instance.\n * If the header already exists, its value is replaced with the given value\n * in the returned object.\n *\n * @param name The header name.\n * @param value The value or values to set or override for the given header.\n *\n * @returns A clone of the HTTP headers object with the newly set header value.\n */\n set(name, value) {\n return this.clone({\n name,\n value,\n op: 's'\n });\n }\n /**\n * Deletes values for a given header in a clone of the original instance.\n *\n * @param name The header name.\n * @param value The value or values to delete for the given header.\n *\n * @returns A clone of the HTTP headers object with the given value deleted.\n */\n delete(name, value) {\n return this.clone({\n name,\n value,\n op: 'd'\n });\n }\n maybeSetNormalizedName(name, lcName) {\n if (!this.normalizedNames.has(lcName)) {\n this.normalizedNames.set(lcName, name);\n }\n }\n init() {\n if (!!this.lazyInit) {\n if (this.lazyInit instanceof HttpHeaders) {\n this.copyFrom(this.lazyInit);\n } else {\n this.lazyInit();\n }\n this.lazyInit = null;\n if (!!this.lazyUpdate) {\n this.lazyUpdate.forEach(update => this.applyUpdate(update));\n this.lazyUpdate = null;\n }\n }\n }\n copyFrom(other) {\n other.init();\n Array.from(other.headers.keys()).forEach(key => {\n this.headers.set(key, other.headers.get(key));\n this.normalizedNames.set(key, other.normalizedNames.get(key));\n });\n }\n clone(update) {\n const clone = new HttpHeaders();\n clone.lazyInit = !!this.lazyInit && this.lazyInit instanceof HttpHeaders ? this.lazyInit : this;\n clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);\n return clone;\n }\n applyUpdate(update) {\n const key = update.name.toLowerCase();\n switch (update.op) {\n case 'a':\n case 's':\n let value = update.value;\n if (typeof value === 'string') {\n value = [value];\n }\n if (value.length === 0) {\n return;\n }\n this.maybeSetNormalizedName(update.name, key);\n const base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];\n base.push(...value);\n this.headers.set(key, base);\n break;\n case 'd':\n const toDelete = update.value;\n if (!toDelete) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n } else {\n let existing = this.headers.get(key);\n if (!existing) {\n return;\n }\n existing = existing.filter(value => toDelete.indexOf(value) === -1);\n if (existing.length === 0) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n } else {\n this.headers.set(key, existing);\n }\n }\n break;\n }\n }\n addHeaderEntry(name, value) {\n const key = name.toLowerCase();\n this.maybeSetNormalizedName(name, key);\n if (this.headers.has(key)) {\n this.headers.get(key).push(value);\n } else {\n this.headers.set(key, [value]);\n }\n }\n setHeaderEntries(name, values) {\n const headerValues = (Array.isArray(values) ? values : [values]).map(value => value.toString());\n const key = name.toLowerCase();\n this.headers.set(key, headerValues);\n this.maybeSetNormalizedName(name, key);\n }\n /**\n * @internal\n */\n forEach(fn) {\n this.init();\n Array.from(this.normalizedNames.keys()).forEach(key => fn(this.normalizedNames.get(key), this.headers.get(key)));\n }\n}\n/**\n * Verifies that the headers object has the right shape: the values\n * must be either strings, numbers or arrays. Throws an error if an invalid\n * header value is present.\n */\nfunction assertValidHeaders(headers) {\n for (const [key, value] of Object.entries(headers)) {\n if (!(typeof value === 'string' || typeof value === 'number') && !Array.isArray(value)) {\n throw new Error(`Unexpected value of the \\`${key}\\` header provided. ` + `Expecting either a string, a number or an array, but got: \\`${value}\\`.`);\n }\n }\n}\n\n/**\n * Provides encoding and decoding of URL parameter and query-string values.\n *\n * Serializes and parses URL parameter keys and values to encode and decode them.\n * If you pass URL query parameters without encoding,\n * the query parameters can be misinterpreted at the receiving end.\n *\n *\n * @publicApi\n */\nclass HttpUrlEncodingCodec {\n /**\n * Encodes a key name for a URL parameter or query-string.\n * @param key The key name.\n * @returns The encoded key name.\n */\n encodeKey(key) {\n return standardEncoding(key);\n }\n /**\n * Encodes the value of a URL parameter or query-string.\n * @param value The value.\n * @returns The encoded value.\n */\n encodeValue(value) {\n return standardEncoding(value);\n }\n /**\n * Decodes an encoded URL parameter or query-string key.\n * @param key The encoded key name.\n * @returns The decoded key name.\n */\n decodeKey(key) {\n return decodeURIComponent(key);\n }\n /**\n * Decodes an encoded URL parameter or query-string value.\n * @param value The encoded value.\n * @returns The decoded value.\n */\n decodeValue(value) {\n return decodeURIComponent(value);\n }\n}\nfunction paramParser(rawParams, codec) {\n const map = new Map();\n if (rawParams.length > 0) {\n // The `window.location.search` can be used while creating an instance of the `HttpParams` class\n // (e.g. `new HttpParams({ fromString: window.location.search })`). The `window.location.search`\n // may start with the `?` char, so we strip it if it's present.\n const params = rawParams.replace(/^\\?/, '').split('&');\n params.forEach(param => {\n const eqIdx = param.indexOf('=');\n const [key, val] = eqIdx == -1 ? [codec.decodeKey(param), ''] : [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];\n const list = map.get(key) || [];\n list.push(val);\n map.set(key, list);\n });\n }\n return map;\n}\n/**\n * Encode input string with standard encodeURIComponent and then un-encode specific characters.\n */\nconst STANDARD_ENCODING_REGEX = /%(\\d[a-f0-9])/gi;\nconst STANDARD_ENCODING_REPLACEMENTS = {\n '40': '@',\n '3A': ':',\n '24': '$',\n '2C': ',',\n '3B': ';',\n '3D': '=',\n '3F': '?',\n '2F': '/'\n};\nfunction standardEncoding(v) {\n return encodeURIComponent(v).replace(STANDARD_ENCODING_REGEX, (s, t) => STANDARD_ENCODING_REPLACEMENTS[t] ?? s);\n}\nfunction valueToString(value) {\n return `${value}`;\n}\n/**\n * An HTTP request/response body that represents serialized parameters,\n * per the MIME type `application/x-www-form-urlencoded`.\n *\n * This class is immutable; all mutation operations return a new instance.\n *\n * @publicApi\n */\nclass HttpParams {\n map;\n encoder;\n updates = null;\n cloneFrom = null;\n constructor(options = {}) {\n this.encoder = options.encoder || new HttpUrlEncodingCodec();\n if (options.fromString) {\n if (options.fromObject) {\n throw new _RuntimeError(2805 /* RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT */, ngDevMode && 'Cannot specify both fromString and fromObject.');\n }\n this.map = paramParser(options.fromString, this.encoder);\n } else if (!!options.fromObject) {\n this.map = new Map();\n Object.keys(options.fromObject).forEach(key => {\n const value = options.fromObject[key];\n // convert the values to strings\n const values = Array.isArray(value) ? value.map(valueToString) : [valueToString(value)];\n this.map.set(key, values);\n });\n } else {\n this.map = null;\n }\n }\n /**\n * Reports whether the body includes one or more values for a given parameter.\n * @param param The parameter name.\n * @returns True if the parameter has one or more values,\n * false if it has no value or is not present.\n */\n has(param) {\n this.init();\n return this.map.has(param);\n }\n /**\n * Retrieves the first value for a parameter.\n * @param param The parameter name.\n * @returns The first value of the given parameter,\n * or `null` if the parameter is not present.\n */\n get(param) {\n this.init();\n const res = this.map.get(param);\n return !!res ? res[0] : null;\n }\n /**\n * Retrieves all values for a parameter.\n * @param param The parameter name.\n * @returns All values in a string array,\n * or `null` if the parameter not present.\n */\n getAll(param) {\n this.init();\n return this.map.get(param) || null;\n }\n /**\n * Retrieves all the parameters for this body.\n * @returns The parameter names in a string array.\n */\n keys() {\n this.init();\n return Array.from(this.map.keys());\n }\n /**\n * Appends a new value to existing values for a parameter.\n * @param param The parameter name.\n * @param value The new value to add.\n * @return A new body with the appended value.\n */\n append(param, value) {\n return this.clone({\n param,\n value,\n op: 'a'\n });\n }\n /**\n * Constructs a new body with appended values for the given parameter name.\n * @param params parameters and values\n * @return A new body with the new value.\n */\n appendAll(params) {\n const updates = [];\n Object.keys(params).forEach(param => {\n const value = params[param];\n if (Array.isArray(value)) {\n value.forEach(_value => {\n updates.push({\n param,\n value: _value,\n op: 'a'\n });\n });\n } else {\n updates.push({\n param,\n value: value,\n op: 'a'\n });\n }\n });\n return this.clone(updates);\n }\n /**\n * Replaces the value for a parameter.\n * @param param The parameter name.\n * @param value The new value.\n * @return A new body with the new value.\n */\n set(param, value) {\n return this.clone({\n param,\n value,\n op: 's'\n });\n }\n /**\n * Removes a given value or all values from a parameter.\n * @param param The parameter name.\n * @param value The value to remove, if provided.\n * @return A new body with the given value removed, or with all values\n * removed if no value is specified.\n */\n delete(param, value) {\n return this.clone({\n param,\n value,\n op: 'd'\n });\n }\n /**\n * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are\n * separated by `&`s.\n */\n toString() {\n this.init();\n return this.keys().map(key => {\n const eKey = this.encoder.encodeKey(key);\n // `a: ['1']` produces `'a=1'`\n // `b: []` produces `''`\n // `c: ['1', '2']` produces `'c=1&c=2'`\n return this.map.get(key).map(value => eKey + '=' + this.encoder.encodeValue(value)).join('&');\n })\n // filter out empty values because `b: []` produces `''`\n // which results in `a=1&&c=1&c=2` instead of `a=1&c=1&c=2` if we don't\n .filter(param => param !== '').join('&');\n }\n clone(update) {\n const clone = new HttpParams({\n encoder: this.encoder\n });\n clone.cloneFrom = this.cloneFrom || this;\n clone.updates = (this.updates || []).concat(update);\n return clone;\n }\n init() {\n if (this.map === null) {\n this.map = new Map();\n }\n if (this.cloneFrom !== null) {\n this.cloneFrom.init();\n this.cloneFrom.keys().forEach(key => this.map.set(key, this.cloneFrom.map.get(key)));\n this.updates.forEach(update => {\n switch (update.op) {\n case 'a':\n case 's':\n const base = (update.op === 'a' ? this.map.get(update.param) : undefined) || [];\n base.push(valueToString(update.value));\n this.map.set(update.param, base);\n break;\n case 'd':\n if (update.value !== undefined) {\n let base = this.map.get(update.param) || [];\n const idx = base.indexOf(valueToString(update.value));\n if (idx !== -1) {\n base.splice(idx, 1);\n }\n if (base.length > 0) {\n this.map.set(update.param, base);\n } else {\n this.map.delete(update.param);\n }\n } else {\n this.map.delete(update.param);\n break;\n }\n }\n });\n this.cloneFrom = this.updates = null;\n }\n }\n}\n\n/**\n * A token used to manipulate and access values stored in `HttpContext`.\n *\n * @publicApi\n */\nclass HttpContextToken {\n defaultValue;\n constructor(defaultValue) {\n this.defaultValue = defaultValue;\n }\n}\n/**\n * Http context stores arbitrary user defined values and ensures type safety without\n * actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.\n *\n * This context is mutable and is shared between cloned requests unless explicitly specified.\n *\n * @usageNotes\n *\n * ### Usage Example\n *\n * ```ts\n * // inside cache.interceptors.ts\n * export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);\n *\n * export class CacheInterceptor implements HttpInterceptor {\n *\n * intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {\n * if (req.context.get(IS_CACHE_ENABLED) === true) {\n * return ...;\n * }\n * return delegate.handle(req);\n * }\n * }\n *\n * // inside a service\n *\n * this.httpClient.get('/api/weather', {\n * context: new HttpContext().set(IS_CACHE_ENABLED, true)\n * }).subscribe(...);\n * ```\n *\n * @publicApi\n */\nclass HttpContext {\n map = new Map();\n /**\n * Store a value in the context. If a value is already present it will be overwritten.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n * @param value The value to store.\n *\n * @returns A reference to itself for easy chaining.\n */\n set(token, value) {\n this.map.set(token, value);\n return this;\n }\n /**\n * Retrieve the value associated with the given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns The stored value or default if one is defined.\n */\n get(token) {\n if (!this.map.has(token)) {\n this.map.set(token, token.defaultValue());\n }\n return this.map.get(token);\n }\n /**\n * Delete the value associated with the given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns A reference to itself for easy chaining.\n */\n delete(token) {\n this.map.delete(token);\n return this;\n }\n /**\n * Checks for existence of a given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns True if the token exists, false otherwise.\n */\n has(token) {\n return this.map.has(token);\n }\n /**\n * @returns a list of tokens currently stored in the context.\n */\n keys() {\n return this.map.keys();\n }\n}\n\n/**\n * Determine whether the given HTTP method may include a body.\n */\nfunction mightHaveBody(method) {\n switch (method) {\n case 'DELETE':\n case 'GET':\n case 'HEAD':\n case 'OPTIONS':\n case 'JSONP':\n return false;\n default:\n return true;\n }\n}\n/**\n * Safely assert whether the given value is an ArrayBuffer.\n *\n * In some execution environments ArrayBuffer is not defined.\n */\nfunction isArrayBuffer(value) {\n return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n}\n/**\n * Safely assert whether the given value is a Blob.\n *\n * In some execution environments Blob is not defined.\n */\nfunction isBlob(value) {\n return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n/**\n * Safely assert whether the given value is a FormData instance.\n *\n * In some execution environments FormData is not defined.\n */\nfunction isFormData(value) {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n/**\n * Safely assert whether the given value is a URLSearchParams instance.\n *\n * In some execution environments URLSearchParams is not defined.\n */\nfunction isUrlSearchParams(value) {\n return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n/**\n * `Content-Type` is an HTTP header used to indicate the media type\n * (also known as MIME type) of the resource being sent to the client\n * or received from the server.\n */\nconst CONTENT_TYPE_HEADER = 'Content-Type';\n/**\n * The `Accept` header is an HTTP request header that indicates the media types\n * (or content types) the client is willing to receive from the server.\n */\nconst ACCEPT_HEADER = 'Accept';\n/**\n * `X-Request-URL` is a custom HTTP header used in older browser versions,\n * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer,\n * to include the full URL of the request in cross-origin requests.\n */\nconst X_REQUEST_URL_HEADER = 'X-Request-URL';\n/**\n * `text/plain` is a content type used to indicate that the content being\n * sent is plain text with no special formatting or structured data\n * like HTML, XML, or JSON.\n */\nconst TEXT_CONTENT_TYPE = 'text/plain';\n/**\n * `application/json` is a content type used to indicate that the content\n * being sent is in the JSON format.\n */\nconst JSON_CONTENT_TYPE = 'application/json';\n/**\n * `application/json, text/plain, *\\/*` is a content negotiation string often seen in the\n * Accept header of HTTP requests. It indicates the types of content the client is willing\n * to accept from the server, with a preference for `application/json` and `text/plain`,\n * but also accepting any other type (*\\/*).\n */\nconst ACCEPT_HEADER_VALUE = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`;\n/**\n * An outgoing HTTP request with an optional typed body.\n *\n * `HttpRequest` represents an outgoing request, including URL, method,\n * headers, body, and other request configuration options. Instances should be\n * assumed to be immutable. To modify a `HttpRequest`, the `clone`\n * method should be used.\n *\n * @publicApi\n */\nclass HttpRequest {\n url;\n /**\n * The request body, or `null` if one isn't set.\n *\n * Bodies are not enforced to be immutable, as they can include a reference to any\n * user-defined data type. However, interceptors should take care to preserve\n * idempotence by treating them as such.\n */\n body = null;\n /**\n * Outgoing headers for this request.\n */\n headers;\n /**\n * Shared and mutable context that can be used by interceptors\n */\n context;\n /**\n * Whether this request should be made in a way that exposes progress events.\n *\n * Progress events are expensive (change detection runs on each event) and so\n * they should only be requested if the consumer intends to monitor them.\n *\n * Note: The `FetchBackend` doesn't support progress report on uploads.\n */\n reportProgress = false;\n /**\n * Whether this request should be sent with outgoing credentials (cookies).\n */\n withCredentials = false;\n /**\n * The credentials mode of the request, which determines how cookies and HTTP authentication are handled.\n * This can affect whether cookies are sent with the request, and how authentication is handled.\n */\n credentials;\n /**\n * When using the fetch implementation and set to `true`, the browser will not abort the associated request if the page that initiated it is unloaded before the request is complete.\n */\n keepalive = false;\n /**\n * Controls how the request will interact with the browser's HTTP cache.\n * This affects whether a response is retrieved from the cache, how it is stored, or if it bypasses the cache altogether.\n */\n cache;\n /**\n * Indicates the relative priority of the request. This may be used by the browser to decide the order in which requests are dispatched and resources fetched.\n */\n priority;\n /**\n * The mode of the request, which determines how the request will interact with the browser's security model.\n * This can affect things like CORS (Cross-Origin Resource Sharing) and same-origin policies.\n */\n mode;\n /**\n * The redirect mode of the request, which determines how redirects are handled.\n * This can affect whether the request follows redirects automatically, or if it fails when a redirect occurs.\n */\n redirect;\n /**\n * The expected response type of the server.\n *\n * This is used to parse the response appropriately before returning it to\n * the requestee.\n */\n responseType = 'json';\n /**\n * The outgoing HTTP request method.\n */\n method;\n /**\n * Outgoing URL parameters.\n *\n * To pass a string representation of HTTP parameters in the URL-query-string format,\n * the `HttpParamsOptions`' `fromString` may be used. For example:\n *\n * ```ts\n * new HttpParams({fromString: 'angular=awesome'})\n * ```\n */\n params;\n /**\n * The outgoing URL with all URL parameters set.\n */\n urlWithParams;\n /**\n * The HttpTransferCache option for the request\n */\n transferCache;\n /**\n * The timeout for the backend HTTP request in ms.\n */\n timeout;\n constructor(method, url, third, fourth) {\n this.url = url;\n this.method = method.toUpperCase();\n // Next, need to figure out which argument holds the HttpRequestInit\n // options, if any.\n let options;\n // Check whether a body argument is expected. The only valid way to omit\n // the body argument is to use a known no-body method like GET.\n if (mightHaveBody(this.method) || !!fourth) {\n // Body is the third argument, options are the fourth.\n this.body = third !== undefined ? third : null;\n options = fourth;\n } else {\n // No body required, options are the third argument. The body stays null.\n options = third;\n }\n // If options have been passed, interpret them.\n if (options) {\n // Normalize reportProgress and withCredentials.\n this.reportProgress = !!options.reportProgress;\n this.withCredentials = !!options.withCredentials;\n this.keepalive = !!options.keepalive;\n // Override default response type of 'json' if one is provided.\n if (!!options.responseType) {\n this.responseType = options.responseType;\n }\n // Override headers if they're provided.\n if (options.headers) {\n this.headers = options.headers;\n }\n if (options.context) {\n this.context = options.context;\n }\n if (options.params) {\n this.params = options.params;\n }\n if (options.priority) {\n this.priority = options.priority;\n }\n if (options.cache) {\n this.cache = options.cache;\n }\n if (options.credentials) {\n this.credentials = options.credentials;\n }\n if (typeof options.timeout === 'number') {\n // XHR will ignore any value below 1. AbortSignals only accept unsigned integers.\n if (options.timeout < 1 || !Number.isInteger(options.timeout)) {\n // TODO: create a runtime error\n throw new Error(ngDevMode ? '`timeout` must be a positive integer value' : '');\n }\n this.timeout = options.timeout;\n }\n if (options.mode) {\n this.mode = options.mode;\n }\n if (options.redirect) {\n this.redirect = options.redirect;\n }\n // We do want to assign transferCache even if it's falsy (false is valid value)\n this.transferCache = options.transferCache;\n }\n // If no headers have been passed in, construct a new HttpHeaders instance.\n this.headers ??= new HttpHeaders();\n // If no context have been passed in, construct a new HttpContext instance.\n this.context ??= new HttpContext();\n // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.\n if (!this.params) {\n this.params = new HttpParams();\n this.urlWithParams = url;\n } else {\n // Encode the parameters to a string in preparation for inclusion in the URL.\n const params = this.params.toString();\n if (params.length === 0) {\n // No parameters, the visible URL is just the URL given at creation time.\n this.urlWithParams = url;\n } else {\n // Does the URL already have query parameters? Look for '?'.\n const qIdx = url.indexOf('?');\n // There are 3 cases to handle:\n // 1) No existing parameters -> append '?' followed by params.\n // 2) '?' exists and is followed by existing query string ->\n // append '&' followed by params.\n // 3) '?' exists at the end of the url -> append params directly.\n // This basically amounts to determining the character, if any, with\n // which to join the URL and parameters.\n const sep = qIdx === -1 ? '?' : qIdx < url.length - 1 ? '&' : '';\n this.urlWithParams = url + sep + params;\n }\n }\n }\n /**\n * Transform the free-form body into a serialized format suitable for\n * transmission to the server.\n */\n serializeBody() {\n // If no body is present, no need to serialize it.\n if (this.body === null) {\n return null;\n }\n // Check whether the body is already in a serialized form. If so,\n // it can just be returned directly.\n if (typeof this.body === 'string' || isArrayBuffer(this.body) || isBlob(this.body) || isFormData(this.body) || isUrlSearchParams(this.body)) {\n return this.body;\n }\n // Check whether the body is an instance of HttpUrlEncodedParams.\n if (this.body instanceof HttpParams) {\n return this.body.toString();\n }\n // Check whether the body is an object or array, and serialize with JSON if so.\n if (typeof this.body === 'object' || typeof this.body === 'boolean' || Array.isArray(this.body)) {\n return JSON.stringify(this.body);\n }\n // Fall back on toString() for everything else.\n return this.body.toString();\n }\n /**\n * Examine the body and attempt to infer an appropriate MIME type\n * for it.\n *\n * If no such type can be inferred, this method will return `null`.\n */\n detectContentTypeHeader() {\n // An empty body has no content type.\n if (this.body === null) {\n return null;\n }\n // FormData bodies rely on the browser's content type assignment.\n if (isFormData(this.body)) {\n return null;\n }\n // Blobs usually have their own content type. If it doesn't, then\n // no type can be inferred.\n if (isBlob(this.body)) {\n return this.body.type || null;\n }\n // Array buffers have unknown contents and thus no type can be inferred.\n if (isArrayBuffer(this.body)) {\n return null;\n }\n // Technically, strings could be a form of JSON data, but it's safe enough\n // to assume they're plain strings.\n if (typeof this.body === 'string') {\n return TEXT_CONTENT_TYPE;\n }\n // `HttpUrlEncodedParams` has its own content-type.\n if (this.body instanceof HttpParams) {\n return 'application/x-www-form-urlencoded;charset=UTF-8';\n }\n // Arrays, objects, boolean and numbers will be encoded as JSON.\n if (typeof this.body === 'object' || typeof this.body === 'number' || typeof this.body === 'boolean') {\n return JSON_CONTENT_TYPE;\n }\n // No type could be inferred.\n return null;\n }\n clone(update = {}) {\n // For method, url, and responseType, take the current value unless\n // it is overridden in the update hash.\n const method = update.method || this.method;\n const url = update.url || this.url;\n const responseType = update.responseType || this.responseType;\n const keepalive = update.keepalive ?? this.keepalive;\n const priority = update.priority || this.priority;\n const cache = update.cache || this.cache;\n const mode = update.mode || this.mode;\n const redirect = update.redirect || this.redirect;\n const credentials = update.credentials || this.credentials;\n // Carefully handle the transferCache to differentiate between\n // `false` and `undefined` in the update args.\n const transferCache = update.transferCache ?? this.transferCache;\n const timeout = update.timeout ?? this.timeout;\n // The body is somewhat special - a `null` value in update.body means\n // whatever current body is present is being overridden with an empty\n // body, whereas an `undefined` value in update.body implies no\n // override.\n const body = update.body !== undefined ? update.body : this.body;\n // Carefully handle the boolean options to differentiate between\n // `false` and `undefined` in the update args.\n const withCredentials = update.withCredentials ?? this.withCredentials;\n const reportProgress = update.reportProgress ?? this.reportProgress;\n // Headers and params may be appended to if `setHeaders` or\n // `setParams` are used.\n let headers = update.headers || this.headers;\n let params = update.params || this.params;\n // Pass on context if needed\n const context = update.context ?? this.context;\n // Check whether the caller has asked to add headers.\n if (update.setHeaders !== undefined) {\n // Set every requested header.\n headers = Object.keys(update.setHeaders).reduce((headers, name) => headers.set(name, update.setHeaders[name]), headers);\n }\n // Check whether the caller has asked to set params.\n if (update.setParams) {\n // Set every requested param.\n params = Object.keys(update.setParams).reduce((params, param) => params.set(param, update.setParams[param]), params);\n }\n // Finally, construct the new HttpRequest using the pieces from above.\n return new HttpRequest(method, url, body, {\n params,\n headers,\n context,\n reportProgress,\n responseType,\n withCredentials,\n transferCache,\n keepalive,\n cache,\n priority,\n timeout,\n mode,\n redirect,\n credentials\n });\n }\n}\n\n/**\n * Type enumeration for the different kinds of `HttpEvent`.\n *\n * @publicApi\n */\nvar HttpEventType;\n(function (HttpEventType) {\n /**\n * The request was sent out over the wire.\n */\n HttpEventType[HttpEventType[\"Sent\"] = 0] = \"Sent\";\n /**\n * An upload progress event was received.\n *\n * Note: The `FetchBackend` doesn't support progress report on uploads.\n */\n HttpEventType[HttpEventType[\"UploadProgress\"] = 1] = \"UploadProgress\";\n /**\n * The response status code and headers were received.\n */\n HttpEventType[HttpEventType[\"ResponseHeader\"] = 2] = \"ResponseHeader\";\n /**\n * A download progress event was received.\n */\n HttpEventType[HttpEventType[\"DownloadProgress\"] = 3] = \"DownloadProgress\";\n /**\n * The full response including the body was received.\n */\n HttpEventType[HttpEventType[\"Response\"] = 4] = \"Response\";\n /**\n * A custom event from an interceptor or a backend.\n */\n HttpEventType[HttpEventType[\"User\"] = 5] = \"User\";\n})(HttpEventType || (HttpEventType = {}));\n/**\n * Base class for both `HttpResponse` and `HttpHeaderResponse`.\n *\n * @publicApi\n */\nclass HttpResponseBase {\n /**\n * All response headers.\n */\n headers;\n /**\n * Response status code.\n */\n status;\n /**\n * Textual description of response status code, defaults to OK.\n *\n * Do not depend on this.\n */\n statusText;\n /**\n * URL of the resource retrieved, or null if not available.\n */\n url;\n /**\n * Whether the status code falls in the 2xx range.\n */\n ok;\n /**\n * Type of the response, narrowed to either the full response or the header.\n */\n type;\n /**\n * Super-constructor for all responses.\n *\n * The single parameter accepted is an initialization hash. Any properties\n * of the response passed there will override the default values.\n */\n constructor(init, defaultStatus = 200, defaultStatusText = 'OK') {\n // If the hash has values passed, use them to initialize the response.\n // Otherwise use the default values.\n this.headers = init.headers || new HttpHeaders();\n this.status = init.status !== undefined ? init.status : defaultStatus;\n this.statusText = init.statusText || defaultStatusText;\n this.url = init.url || null;\n // Cache the ok value to avoid defining a getter.\n this.ok = this.status >= 200 && this.status < 300;\n }\n}\n/**\n * A partial HTTP response which only includes the status and header data,\n * but no response body.\n *\n * `HttpHeaderResponse` is a `HttpEvent` available on the response\n * event stream, only when progress events are requested.\n *\n * @publicApi\n */\nclass HttpHeaderResponse extends HttpResponseBase {\n /**\n * Create a new `HttpHeaderResponse` with the given parameters.\n */\n constructor(init = {}) {\n super(init);\n }\n type = HttpEventType.ResponseHeader;\n /**\n * Copy this `HttpHeaderResponse`, overriding its contents with the\n * given parameter hash.\n */\n clone(update = {}) {\n // Perform a straightforward initialization of the new HttpHeaderResponse,\n // overriding the current parameters with new ones if given.\n return new HttpHeaderResponse({\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined\n });\n }\n}\n/**\n * A full HTTP response, including a typed response body (which may be `null`\n * if one was not returned).\n *\n * `HttpResponse` is a `HttpEvent` available on the response event\n * stream.\n *\n * @publicApi\n */\nclass HttpResponse extends HttpResponseBase {\n /**\n * The response body, or `null` if one was not returned.\n */\n body;\n /**\n * Construct a new `HttpResponse`.\n */\n constructor(init = {}) {\n super(init);\n this.body = init.body !== undefined ? init.body : null;\n }\n type = HttpEventType.Response;\n clone(update = {}) {\n return new HttpResponse({\n body: update.body !== undefined ? update.body : this.body,\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined\n });\n }\n}\n/**\n * A response that represents an error or failure, either from a\n * non-successful HTTP status, an error while executing the request,\n * or some other failure which occurred during the parsing of the response.\n *\n * Any error returned on the `Observable` response stream will be\n * wrapped in an `HttpErrorResponse` to provide additional context about\n * the state of the HTTP layer when the error occurred. The error property\n * will contain either a wrapped Error object or the error response returned\n * from the server.\n *\n * @publicApi\n */\nclass HttpErrorResponse extends HttpResponseBase {\n name = 'HttpErrorResponse';\n message;\n error;\n /**\n * Errors are never okay, even when the status code is in the 2xx success range.\n */\n ok = false;\n constructor(init) {\n // Initialize with a default status of 0 / Unknown Error.\n super(init, 0, 'Unknown Error');\n // If the response was successful, then this was a parse error. Otherwise, it was\n // a protocol-level failure of some sort. Either the request failed in transit\n // or the server returned an unsuccessful status code.\n if (this.status >= 200 && this.status < 300) {\n this.message = `Http failure during parsing for ${init.url || '(unknown url)'}`;\n } else {\n this.message = `Http failure response for ${init.url || '(unknown url)'}: ${init.status} ${init.statusText}`;\n }\n this.error = init.error || null;\n }\n}\n/**\n * We use these constant to prevent pulling the whole HttpStatusCode enum\n * Those are the only ones referenced directly by the framework\n */\nconst HTTP_STATUS_CODE_OK = 200;\nconst HTTP_STATUS_CODE_NO_CONTENT = 204;\n/**\n * Http status codes.\n * As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n * @publicApi\n */\nvar HttpStatusCode;\n(function (HttpStatusCode) {\n HttpStatusCode[HttpStatusCode[\"Continue\"] = 100] = \"Continue\";\n HttpStatusCode[HttpStatusCode[\"SwitchingProtocols\"] = 101] = \"SwitchingProtocols\";\n HttpStatusCode[HttpStatusCode[\"Processing\"] = 102] = \"Processing\";\n HttpStatusCode[HttpStatusCode[\"EarlyHints\"] = 103] = \"EarlyHints\";\n HttpStatusCode[HttpStatusCode[\"Ok\"] = 200] = \"Ok\";\n HttpStatusCode[HttpStatusCode[\"Created\"] = 201] = \"Created\";\n HttpStatusCode[HttpStatusCode[\"Accepted\"] = 202] = \"Accepted\";\n HttpStatusCode[HttpStatusCode[\"NonAuthoritativeInformation\"] = 203] = \"NonAuthoritativeInformation\";\n HttpStatusCode[HttpStatusCode[\"NoContent\"] = 204] = \"NoContent\";\n HttpStatusCode[HttpStatusCode[\"ResetContent\"] = 205] = \"ResetContent\";\n HttpStatusCode[HttpStatusCode[\"PartialContent\"] = 206] = \"PartialContent\";\n HttpStatusCode[HttpStatusCode[\"MultiStatus\"] = 207] = \"MultiStatus\";\n HttpStatusCode[HttpStatusCode[\"AlreadyReported\"] = 208] = \"AlreadyReported\";\n HttpStatusCode[HttpStatusCode[\"ImUsed\"] = 226] = \"ImUsed\";\n HttpStatusCode[HttpStatusCode[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpStatusCode[HttpStatusCode[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpStatusCode[HttpStatusCode[\"Found\"] = 302] = \"Found\";\n HttpStatusCode[HttpStatusCode[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpStatusCode[HttpStatusCode[\"NotModified\"] = 304] = \"NotModified\";\n HttpStatusCode[HttpStatusCode[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpStatusCode[HttpStatusCode[\"Unused\"] = 306] = \"Unused\";\n HttpStatusCode[HttpStatusCode[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpStatusCode[HttpStatusCode[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpStatusCode[HttpStatusCode[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpStatusCode[HttpStatusCode[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpStatusCode[HttpStatusCode[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpStatusCode[HttpStatusCode[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpStatusCode[HttpStatusCode[\"NotFound\"] = 404] = \"NotFound\";\n HttpStatusCode[HttpStatusCode[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpStatusCode[HttpStatusCode[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpStatusCode[HttpStatusCode[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpStatusCode[HttpStatusCode[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpStatusCode[HttpStatusCode[\"Conflict\"] = 409] = \"Conflict\";\n HttpStatusCode[HttpStatusCode[\"Gone\"] = 410] = \"Gone\";\n HttpStatusCode[HttpStatusCode[\"LengthRequired\"] = 411] = \"LengthRequired\";\n HttpStatusCode[HttpStatusCode[\"PreconditionFailed\"] = 412] = \"PreconditionFailed\";\n HttpStatusCode[HttpStatusCode[\"PayloadTooLarge\"] = 413] = \"PayloadTooLarge\";\n HttpStatusCode[HttpStatusCode[\"UriTooLong\"] = 414] = \"UriTooLong\";\n HttpStatusCode[HttpStatusCode[\"UnsupportedMediaType\"] = 415] = \"UnsupportedMediaType\";\n HttpStatusCode[HttpStatusCode[\"RangeNotSatisfiable\"] = 416] = \"RangeNotSatisfiable\";\n HttpStatusCode[HttpStatusCode[\"ExpectationFailed\"] = 417] = \"ExpectationFailed\";\n HttpStatusCode[HttpStatusCode[\"ImATeapot\"] = 418] = \"ImATeapot\";\n HttpStatusCode[HttpStatusCode[\"MisdirectedRequest\"] = 421] = \"MisdirectedRequest\";\n HttpStatusCode[HttpStatusCode[\"UnprocessableEntity\"] = 422] = \"UnprocessableEntity\";\n HttpStatusCode[HttpStatusCode[\"Locked\"] = 423] = \"Locked\";\n HttpStatusCode[HttpStatusCode[\"FailedDependency\"] = 424] = \"FailedDependency\";\n HttpStatusCode[HttpStatusCode[\"TooEarly\"] = 425] = \"TooEarly\";\n HttpStatusCode[HttpStatusCode[\"UpgradeRequired\"] = 426] = \"UpgradeRequired\";\n HttpStatusCode[HttpStatusCode[\"PreconditionRequired\"] = 428] = \"PreconditionRequired\";\n HttpStatusCode[HttpStatusCode[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpStatusCode[HttpStatusCode[\"RequestHeaderFieldsTooLarge\"] = 431] = \"RequestHeaderFieldsTooLarge\";\n HttpStatusCode[HttpStatusCode[\"UnavailableForLegalReasons\"] = 451] = \"UnavailableForLegalReasons\";\n HttpStatusCode[HttpStatusCode[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpStatusCode[HttpStatusCode[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpStatusCode[HttpStatusCode[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpStatusCode[HttpStatusCode[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpStatusCode[HttpStatusCode[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n HttpStatusCode[HttpStatusCode[\"HttpVersionNotSupported\"] = 505] = \"HttpVersionNotSupported\";\n HttpStatusCode[HttpStatusCode[\"VariantAlsoNegotiates\"] = 506] = \"VariantAlsoNegotiates\";\n HttpStatusCode[HttpStatusCode[\"InsufficientStorage\"] = 507] = \"InsufficientStorage\";\n HttpStatusCode[HttpStatusCode[\"LoopDetected\"] = 508] = \"LoopDetected\";\n HttpStatusCode[HttpStatusCode[\"NotExtended\"] = 510] = \"NotExtended\";\n HttpStatusCode[HttpStatusCode[\"NetworkAuthenticationRequired\"] = 511] = \"NetworkAuthenticationRequired\";\n})(HttpStatusCode || (HttpStatusCode = {}));\n\n/**\n * Constructs an instance of `HttpRequestOptions<T>` from a source `HttpMethodOptions` and\n * the given `body`. This function clones the object and adds the body.\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n */\nfunction addBody(options, body) {\n return {\n body,\n headers: options.headers,\n context: options.context,\n observe: options.observe,\n params: options.params,\n reportProgress: options.reportProgress,\n responseType: options.responseType,\n withCredentials: options.withCredentials,\n transferCache: options.transferCache,\n keepalive: options.keepalive,\n priority: options.priority,\n cache: options.cache,\n mode: options.mode,\n redirect: options.redirect\n };\n}\n/**\n * Performs HTTP requests.\n * This service is available as an injectable class, with methods to perform HTTP requests.\n * Each request method has multiple signatures, and the return type varies based on\n * the signature that is called (mainly the values of `observe` and `responseType`).\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n * @usageNotes\n *\n * ### HTTP Request Example\n *\n * ```ts\n * // GET heroes whose name contains search term\n * searchHeroes(term: string): observable<Hero[]>{\n *\n * const params = new HttpParams({fromString: 'name=term'});\n * return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});\n * }\n * ```\n *\n * Alternatively, the parameter string can be used without invoking HttpParams\n * by directly joining to the URL.\n * ```ts\n * this.httpClient.request('GET', this.heroesUrl + '?' + 'name=term', {responseType:'json'});\n * ```\n *\n *\n * ### JSONP Example\n * ```ts\n * requestJsonp(url, callback = 'callback') {\n * return this.httpClient.jsonp(this.heroesURL, callback);\n * }\n * ```\n *\n * ### PATCH Example\n * ```ts\n * // PATCH one of the heroes' name\n * patchHero (id: number, heroName: string): Observable<{}> {\n * const url = `${this.heroesUrl}/${id}`; // PATCH api/heroes/42\n * return this.httpClient.patch(url, {name: heroName}, httpOptions)\n * .pipe(catchError(this.handleError('patchHero')));\n * }\n * ```\n *\n * @see [HTTP Guide](guide/http)\n * @see [HTTP Request](api/common/http/HttpRequest)\n *\n * @publicApi\n */\nclass HttpClient {\n handler;\n constructor(handler) {\n this.handler = handler;\n }\n /**\n * Constructs an observable for a generic HTTP request that, when subscribed,\n * fires the request through the chain of registered interceptors and on to the\n * server.\n *\n * You can pass an `HttpRequest` directly as the only parameter. In this case,\n * the call returns an observable of the raw `HttpEvent` stream.\n *\n * Alternatively you can pass an HTTP method as the first parameter,\n * a URL string as the second, and an options hash containing the request body as the third.\n * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the\n * type of returned observable.\n * * The `responseType` value determines how a successful response body is parsed.\n * * If `responseType` is the default `json`, you can pass a type interface for the resulting\n * object as a type parameter to the call.\n *\n * The `observe` value determines the return type, according to what you are interested in\n * observing.\n * * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including\n * progress events by default.\n * * An `observe` value of response returns an observable of `HttpResponse<T>`,\n * where the `T` parameter depends on the `responseType` and any optionally provided type\n * parameter.\n * * An `observe` value of body returns an observable of `<T>` with the same `T` body type.\n *\n */\n request(first, url, options = {}) {\n let req;\n // First, check whether the primary argument is an instance of `HttpRequest`.\n if (first instanceof HttpRequest) {\n // It is. The other arguments must be undefined (per the signatures) and can be\n // ignored.\n req = first;\n } else {\n // It's a string, so it represents a URL. Construct a request based on it,\n // and incorporate the remaining arguments (assuming `GET` unless a method is\n // provided.\n // Figure out the headers.\n let headers = undefined;\n if (options.headers instanceof HttpHeaders) {\n headers = options.headers;\n } else {\n headers = new HttpHeaders(options.headers);\n }\n // Sort out parameters.\n let params = undefined;\n if (!!options.params) {\n if (options.params instanceof HttpParams) {\n params = options.params;\n } else {\n params = new HttpParams({\n fromObject: options.params\n });\n }\n }\n // Construct the request.\n req = new HttpRequest(first, url, options.body !== undefined ? options.body : null, {\n headers,\n context: options.context,\n params,\n reportProgress: options.reportProgress,\n // By default, JSON is assumed to be returned for all calls.\n responseType: options.responseType || 'json',\n withCredentials: options.withCredentials,\n transferCache: options.transferCache,\n keepalive: options.keepalive,\n priority: options.priority,\n cache: options.cache,\n mode: options.mode,\n redirect: options.redirect,\n credentials: options.credentials\n });\n }\n // Start with an Observable.of() the initial request, and run the handler (which\n // includes all interceptors) inside a concatMap(). This way, the handler runs\n // inside an Observable chain, which causes interceptors to be re-run on every\n // subscription (this also makes retries re-run the handler, including interceptors).\n const events$ = of(req).pipe(concatMap(req => this.handler.handle(req)));\n // If coming via the API signature which accepts a previously constructed HttpRequest,\n // the only option is to get the event stream. Otherwise, return the event stream if\n // that is what was requested.\n if (first instanceof HttpRequest || options.observe === 'events') {\n return events$;\n }\n // The requested stream contains either the full response or the body. In either\n // case, the first step is to filter the event stream to extract a stream of\n // responses(s).\n const res$ = events$.pipe(filter(event => event instanceof HttpResponse));\n // Decide which stream to return.\n switch (options.observe || 'body') {\n case 'body':\n // The requested stream is the body. Map the response stream to the response\n // body. This could be done more simply, but a misbehaving interceptor might\n // transform the response body into a different format and ignore the requested\n // responseType. Guard against this by validating that the response is of the\n // requested type.\n switch (req.responseType) {\n case 'arraybuffer':\n return res$.pipe(map(res => {\n // Validate that the body is an ArrayBuffer.\n if (res.body !== null && !(res.body instanceof ArrayBuffer)) {\n throw new _RuntimeError(2806 /* RuntimeErrorCode.RESPONSE_IS_NOT_AN_ARRAY_BUFFER */, ngDevMode && 'Response is not an ArrayBuffer.');\n }\n return res.body;\n }));\n case 'blob':\n return res$.pipe(map(res => {\n // Validate that the body is a Blob.\n if (res.body !== null && !(res.body instanceof Blob)) {\n throw new _RuntimeError(2807 /* RuntimeErrorCode.RESPONSE_IS_NOT_A_BLOB */, ngDevMode && 'Response is not a Blob.');\n }\n return res.body;\n }));\n case 'text':\n return res$.pipe(map(res => {\n // Validate that the body is a string.\n if (res.body !== null && typeof res.body !== 'string') {\n throw new _RuntimeError(2808 /* RuntimeErrorCode.RESPONSE_IS_NOT_A_STRING */, ngDevMode && 'Response is not a string.');\n }\n return res.body;\n }));\n case 'json':\n default:\n // No validation needed for JSON responses, as they can be of any type.\n return res$.pipe(map(res => res.body));\n }\n case 'response':\n // The response stream was requested directly, so return it.\n return res$;\n default:\n // Guard against new future observe types being added.\n throw new _RuntimeError(2809 /* RuntimeErrorCode.UNHANDLED_OBSERVE_TYPE */, ngDevMode && `Unreachable: unhandled observe type ${options.observe}}`);\n }\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `DELETE` request to execute on the server. See the individual overloads for\n * details on the return type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n */\n delete(url, options = {}) {\n return this.request('DELETE', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `GET` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n get(url, options = {}) {\n return this.request('GET', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `HEAD` request to execute on the server. The `HEAD` method returns\n * meta information about the resource without transferring the\n * resource itself. See the individual overloads for\n * details on the return type.\n */\n head(url, options = {}) {\n return this.request('HEAD', url, options);\n }\n /**\n * Constructs an `Observable` that, when subscribed, causes a request with the special method\n * `JSONP` to be dispatched via the interceptor pipeline.\n * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain\n * API endpoints that don't support newer,\n * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.\n * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the\n * requests even if the API endpoint is not located on the same domain (origin) as the client-side\n * application making the request.\n * The endpoint API must support JSONP callback for JSONP requests to work.\n * The resource API returns the JSON response wrapped in a callback function.\n * You can pass the callback function name as one of the query parameters.\n * Note that JSONP requests can only be used with `GET` requests.\n *\n * @param url The resource URL.\n * @param callbackParam The callback function name.\n *\n */\n jsonp(url, callbackParam) {\n return this.request('JSONP', url, {\n params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),\n observe: 'body',\n responseType: 'json'\n });\n }\n /**\n * Constructs an `Observable` that, when subscribed, causes the configured\n * `OPTIONS` request to execute on the server. This method allows the client\n * to determine the supported HTTP methods and other capabilities of an endpoint,\n * without implying a resource action. See the individual overloads for\n * details on the return type.\n */\n options(url, options = {}) {\n return this.request('OPTIONS', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PATCH` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n patch(url, body, options = {}) {\n return this.request('PATCH', url, addBody(options, body));\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `POST` request to execute on the server. The server responds with the location of\n * the replaced resource. See the individual overloads for\n * details on the return type.\n */\n post(url, body, options = {}) {\n return this.request('POST', url, addBody(options, body));\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PUT` request to execute on the server. The `PUT` method replaces an existing resource\n * with a new set of values.\n * See the individual overloads for details on the return type.\n */\n put(url, body, options = {}) {\n return this.request('PUT', url, addBody(options, body));\n }\n static ɵfac = function HttpClient_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClient)(i0.ɵɵinject(HttpHandler));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpClient,\n factory: HttpClient.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpClient, [{\n type: Injectable\n }], () => [{\n type: HttpHandler\n }], null);\n})();\nconst XSSI_PREFIX$1 = /^\\)\\]\\}',?\\n/;\n/**\n * Determine an appropriate URL for the response, by checking either\n * response url or the X-Request-URL header.\n */\nfunction getResponseUrl$1(response) {\n if (response.url) {\n return response.url;\n }\n // stored as lowercase in the map\n const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase();\n return response.headers.get(xRequestUrl);\n}\n/**\n * An internal injection token to reference `FetchBackend` implementation\n * in a tree-shakable way.\n */\nconst FETCH_BACKEND = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '');\n/**\n * Uses `fetch` to send requests to a backend server.\n *\n * This `FetchBackend` requires the support of the\n * [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) which is available on all\n * supported browsers and on Node.js v18 or later.\n *\n * @see {@link HttpHandler}\n *\n * @publicApi\n */\nclass FetchBackend {\n // We use an arrow function to always reference the current global implementation of `fetch`.\n // This is helpful for cases when the global `fetch` implementation is modified by external code,\n // see https://github.com/angular/angular/issues/57527.\n fetchImpl = inject(FetchFactory, {\n optional: true\n })?.fetch ?? ((...args) => globalThis.fetch(...args));\n ngZone = inject(NgZone);\n destroyRef = inject(DestroyRef);\n destroyed = false;\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.destroyed = true;\n });\n }\n handle(request) {\n return new Observable(observer => {\n const aborter = new AbortController();\n this.doRequest(request, aborter.signal, observer).then(noop, error => observer.error(new HttpErrorResponse({\n error\n })));\n let timeoutId;\n if (request.timeout) {\n // TODO: Replace with AbortSignal.any([aborter.signal, AbortSignal.timeout(request.timeout)])\n // when AbortSignal.any support is Baseline widely available (NET nov. 2026)\n timeoutId = this.ngZone.runOutsideAngular(() => setTimeout(() => {\n if (!aborter.signal.aborted) {\n aborter.abort(new DOMException('signal timed out', 'TimeoutError'));\n }\n }, request.timeout));\n }\n return () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n aborter.abort();\n };\n });\n }\n doRequest(request, signal, observer) {\n var _this = this;\n return _asyncToGenerator(function* () {\n const init = _this.createRequestInit(request);\n let response;\n try {\n // Run fetch outside of Angular zone.\n // This is due to Node.js fetch implementation (Undici) which uses a number of setTimeouts to check if\n // the response should eventually timeout which causes extra CD cycles every 500ms\n const fetchPromise = _this.ngZone.runOutsideAngular(() => _this.fetchImpl(request.urlWithParams, {\n signal,\n ...init\n }));\n // Make sure Zone.js doesn't trigger false-positive unhandled promise\n // error in case the Promise is rejected synchronously. See function\n // description for additional information.\n silenceSuperfluousUnhandledPromiseRejection(fetchPromise);\n // Send the `Sent` event before awaiting the response.\n observer.next({\n type: HttpEventType.Sent\n });\n response = yield fetchPromise;\n } catch (error) {\n observer.error(new HttpErrorResponse({\n error,\n status: error.status ?? 0,\n statusText: error.statusText,\n url: request.urlWithParams,\n headers: error.headers\n }));\n return;\n }\n const headers = new HttpHeaders(response.headers);\n const statusText = response.statusText;\n const url = getResponseUrl$1(response) ?? request.urlWithParams;\n let status = response.status;\n let body = null;\n if (request.reportProgress) {\n observer.next(new HttpHeaderResponse({\n headers,\n status,\n statusText,\n url\n }));\n }\n if (response.body) {\n // Read Progress\n const contentLength = response.headers.get('content-length');\n const chunks = [];\n const reader = response.body.getReader();\n let receivedLength = 0;\n let decoder;\n let partialText;\n // We have to check whether the Zone is defined in the global scope because this may be called\n // when the zone is nooped.\n const reqZone = typeof Zone !== 'undefined' && Zone.current;\n let canceled = false;\n // Perform response processing outside of Angular zone to\n // ensure no excessive change detection runs are executed\n // Here calling the async ReadableStreamDefaultReader.read() is responsible for triggering CD\n yield _this.ngZone.runOutsideAngular(/*#__PURE__*/_asyncToGenerator(function* () {\n while (true) {\n // Prevent reading chunks if the app is destroyed. Otherwise, we risk doing\n // unnecessary work or triggering side effects after teardown.\n // This may happen if the app was explicitly destroyed before\n // the response returned entirely.\n if (_this.destroyed) {\n // Streams left in a pending state (due to `break` without cancel) may\n // continue consuming or holding onto data behind the scenes.\n // Calling `reader.cancel()` allows the browser or the underlying\n // system to release any network or memory resources associated with the stream.\n yield reader.cancel();\n canceled = true;\n break;\n }\n const {\n done,\n value\n } = yield reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n receivedLength += value.length;\n if (request.reportProgress) {\n partialText = request.responseType === 'text' ? (partialText ?? '') + (decoder ??= new TextDecoder()).decode(value, {\n stream: true\n }) : undefined;\n const reportProgress = () => observer.next({\n type: HttpEventType.DownloadProgress,\n total: contentLength ? +contentLength : undefined,\n loaded: receivedLength,\n partialText\n });\n reqZone ? reqZone.run(reportProgress) : reportProgress();\n }\n }\n }));\n // We need to manage the canceled state — because the Streams API does not\n // expose a direct `.state` property on the reader.\n // We need to `return` because `parseBody` may not be able to parse chunks\n // that were only partially read (due to cancellation caused by app destruction).\n if (canceled) {\n observer.complete();\n return;\n }\n // Combine all chunks.\n const chunksAll = _this.concatChunks(chunks, receivedLength);\n try {\n const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? '';\n body = _this.parseBody(request, chunksAll, contentType, status);\n } catch (error) {\n // Body loading or parsing failed\n observer.error(new HttpErrorResponse({\n error,\n headers: new HttpHeaders(response.headers),\n status: response.status,\n statusText: response.statusText,\n url: getResponseUrl$1(response) ?? request.urlWithParams\n }));\n return;\n }\n }\n // Same behavior as the XhrBackend\n if (status === 0) {\n status = body ? HTTP_STATUS_CODE_OK : 0;\n }\n // ok determines whether the response will be transmitted on the event or\n // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n // but a successful status code can still result in an error if the user\n // asked for JSON data and the body cannot be parsed as such.\n const ok = status >= 200 && status < 300;\n if (ok) {\n observer.next(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url\n }));\n // The full body has been received and delivered, no further events\n // are possible. This request is complete.\n observer.complete();\n } else {\n observer.error(new HttpErrorResponse({\n error: body,\n headers,\n status,\n statusText,\n url\n }));\n }\n })();\n }\n parseBody(request, binContent, contentType, status) {\n switch (request.responseType) {\n case 'json':\n // stripping the XSSI when present\n const text = new TextDecoder().decode(binContent).replace(XSSI_PREFIX$1, '');\n if (text === '') {\n return null;\n }\n try {\n return JSON.parse(text);\n } catch (e) {\n // Allow handling non-JSON errors (!) as plain text, same as the XHR\n // backend. Without this special sauce, any non-JSON error would be\n // completely inaccessible downstream as the `HttpErrorResponse.error`\n // would be set to the `SyntaxError` from then failing `JSON.parse`.\n if (status < 200 || status >= 300) {\n return text;\n }\n throw e;\n }\n case 'text':\n return new TextDecoder().decode(binContent);\n case 'blob':\n return new Blob([binContent], {\n type: contentType\n });\n case 'arraybuffer':\n return binContent.buffer;\n }\n }\n createRequestInit(req) {\n // We could share some of this logic with the XhrBackend\n const headers = {};\n let credentials;\n // If the request has a credentials property, use it.\n // Otherwise, if the request has withCredentials set to true, use 'include'.\n credentials = req.credentials;\n // If withCredentials is true should be set to 'include', for compatibility\n if (req.withCredentials) {\n // A warning is logged in development mode if the request has both\n (typeof ngDevMode === 'undefined' || ngDevMode) && warningOptionsMessage(req);\n credentials = 'include';\n }\n // Setting all the requested headers.\n req.headers.forEach((name, values) => headers[name] = values.join(','));\n // Add an Accept header if one isn't present already.\n if (!req.headers.has(ACCEPT_HEADER)) {\n headers[ACCEPT_HEADER] = ACCEPT_HEADER_VALUE;\n }\n // Auto-detect the Content-Type header if one isn't present already.\n if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n const detectedType = req.detectContentTypeHeader();\n // Sometimes Content-Type detection fails.\n if (detectedType !== null) {\n headers[CONTENT_TYPE_HEADER] = detectedType;\n }\n }\n return {\n body: req.serializeBody(),\n method: req.method,\n headers,\n credentials,\n keepalive: req.keepalive,\n cache: req.cache,\n priority: req.priority,\n mode: req.mode,\n redirect: req.redirect\n };\n }\n concatChunks(chunks, totalLength) {\n const chunksAll = new Uint8Array(totalLength);\n let position = 0;\n for (const chunk of chunks) {\n chunksAll.set(chunk, position);\n position += chunk.length;\n }\n return chunksAll;\n }\n static ɵfac = function FetchBackend_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || FetchBackend)();\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: FetchBackend,\n factory: FetchBackend.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(FetchBackend, [{\n type: Injectable\n }], () => [], null);\n})();\n/**\n * Abstract class to provide a mocked implementation of `fetch()`\n */\nclass FetchFactory {}\nfunction noop() {}\nfunction warningOptionsMessage(req) {\n if (req.credentials && req.withCredentials) {\n console.warn(_formatRuntimeError(2819 /* RuntimeErrorCode.WITH_CREDENTIALS_OVERRIDES_EXPLICIT_CREDENTIALS */, `Angular detected that a \\`HttpClient\\` request has both \\`withCredentials: true\\` and \\`credentials: '${req.credentials}'\\` options. The \\`withCredentials\\` option is overriding the explicit \\`credentials\\` setting to 'include'. Consider removing \\`withCredentials\\` and using \\`credentials: '${req.credentials}'\\` directly for clarity.`));\n }\n}\n/**\n * Zone.js treats a rejected promise that has not yet been awaited\n * as an unhandled error. This function adds a noop `.then` to make\n * sure that Zone.js doesn't throw an error if the Promise is rejected\n * synchronously.\n */\nfunction silenceSuperfluousUnhandledPromiseRejection(promise) {\n promise.then(noop, noop);\n}\nfunction interceptorChainEndFn(req, finalHandlerFn) {\n return finalHandlerFn(req);\n}\n/**\n * Constructs a `ChainedInterceptorFn` which adapts a legacy `HttpInterceptor` to the\n * `ChainedInterceptorFn` interface.\n */\nfunction adaptLegacyInterceptorToChain(chainTailFn, interceptor) {\n return (initialRequest, finalHandlerFn) => interceptor.intercept(initialRequest, {\n handle: downstreamRequest => chainTailFn(downstreamRequest, finalHandlerFn)\n });\n}\n/**\n * Constructs a `ChainedInterceptorFn` which wraps and invokes a functional interceptor in the given\n * injector.\n */\nfunction chainedInterceptorFn(chainTailFn, interceptorFn, injector) {\n return (initialRequest, finalHandlerFn) => runInInjectionContext(injector, () => interceptorFn(initialRequest, downstreamRequest => chainTailFn(downstreamRequest, finalHandlerFn)));\n}\n/**\n * A multi-provider token that represents the array of registered\n * `HttpInterceptor` objects.\n *\n * @publicApi\n */\nconst HTTP_INTERCEPTORS = new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTORS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s.\n */\nconst HTTP_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTOR_FNS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s that are only set in root.\n */\nconst HTTP_ROOT_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? 'HTTP_ROOT_INTERCEPTOR_FNS' : '');\n// TODO(atscott): We need a larger discussion about stability and what should contribute to stability.\n// Should the whole interceptor chain contribute to stability or just the backend request #55075?\n// Should HttpClient contribute to stability automatically at all?\nconst REQUESTS_CONTRIBUTE_TO_STABILITY = new InjectionToken(ngDevMode ? 'REQUESTS_CONTRIBUTE_TO_STABILITY' : '', {\n providedIn: 'root',\n factory: () => true\n});\n/**\n * Creates an `HttpInterceptorFn` which lazily initializes an interceptor chain from the legacy\n * class-based interceptors and runs the request through it.\n */\nfunction legacyInterceptorFnFactory() {\n let chain = null;\n return (req, handler) => {\n if (chain === null) {\n const interceptors = inject(HTTP_INTERCEPTORS, {\n optional: true\n }) ?? [];\n // Note: interceptors are wrapped right-to-left so that final execution order is\n // left-to-right. That is, if `interceptors` is the array `[a, b, c]`, we want to\n // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n // out.\n chain = interceptors.reduceRight(adaptLegacyInterceptorToChain, interceptorChainEndFn);\n }\n const pendingTasks = inject(PendingTasks);\n const contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n if (contributeToStability) {\n const removeTask = pendingTasks.add();\n return chain(req, handler).pipe(finalize(removeTask));\n } else {\n return chain(req, handler);\n }\n };\n}\nlet fetchBackendWarningDisplayed = false;\nclass HttpInterceptorHandler extends HttpHandler {\n backend;\n injector;\n chain = null;\n pendingTasks = inject(PendingTasks);\n contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n constructor(backend, injector) {\n super();\n this.backend = backend;\n this.injector = injector;\n // We strongly recommend using fetch backend for HTTP calls when SSR is used\n // for an application. The logic below checks if that's the case and produces\n // a warning otherwise.\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !fetchBackendWarningDisplayed) {\n // This flag is necessary because provideHttpClientTesting() overrides the backend\n // even if `withFetch()` is used within the test. When the testing HTTP backend is provided,\n // no HTTP calls are actually performed during the test, so producing a warning would be\n // misleading.\n const isTestingBackend = this.backend.isTestingBackend;\n if (typeof ngServerMode !== 'undefined' && ngServerMode && !(this.backend instanceof FetchBackend) && !isTestingBackend) {\n fetchBackendWarningDisplayed = true;\n injector.get(_Console).warn(_formatRuntimeError(2801 /* RuntimeErrorCode.NOT_USING_FETCH_BACKEND_IN_SSR */, 'Angular detected that `HttpClient` is not configured ' + \"to use `fetch` APIs. It's strongly recommended to \" + 'enable `fetch` for applications that use Server-Side Rendering ' + 'for better performance and compatibility. ' + 'To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` ' + 'call at the root of the application.'));\n }\n }\n }\n handle(initialRequest) {\n if (this.chain === null) {\n const dedupedInterceptorFns = Array.from(new Set([...this.injector.get(HTTP_INTERCEPTOR_FNS), ...this.injector.get(HTTP_ROOT_INTERCEPTOR_FNS, [])]));\n // Note: interceptors are wrapped right-to-left so that final execution order is\n // left-to-right. That is, if `dedupedInterceptorFns` is the array `[a, b, c]`, we want to\n // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n // out.\n this.chain = dedupedInterceptorFns.reduceRight((nextSequencedFn, interceptorFn) => chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector), interceptorChainEndFn);\n }\n if (this.contributeToStability) {\n const removeTask = this.pendingTasks.add();\n return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest)).pipe(finalize(removeTask));\n } else {\n return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest));\n }\n }\n static ɵfac = function HttpInterceptorHandler_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpInterceptorHandler)(i0.ɵɵinject(HttpBackend), i0.ɵɵinject(i0.EnvironmentInjector));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpInterceptorHandler,\n factory: HttpInterceptorHandler.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpInterceptorHandler, [{\n type: Injectable\n }], () => [{\n type: HttpBackend\n }, {\n type: i0.EnvironmentInjector\n }], null);\n})();\n\n// Every request made through JSONP needs a callback name that's unique across the\n// whole page. Each request is assigned an id and the callback name is constructed\n// from that. The next id to be assigned is tracked in a global variable here that\n// is shared among all applications on the page.\nlet nextRequestId = 0;\n/**\n * When a pending <script> is unsubscribed we'll move it to this document, so it won't be\n * executed.\n */\nlet foreignDocument;\n// Error text given when a JSONP script is injected, but doesn't invoke the callback\n// passed in its URL.\nconst JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n// Error text given when a request is passed to the JsonpClientBackend that doesn't\n// have a request method JSONP.\nconst JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';\nconst JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';\n// Error text given when a request is passed to the JsonpClientBackend that has\n// headers set\nconst JSONP_ERR_HEADERS_NOT_SUPPORTED = 'JSONP requests do not support headers.';\n/**\n * DI token/abstract type representing a map of JSONP callbacks.\n *\n * In the browser, this should always be the `window` object.\n *\n *\n */\nclass JsonpCallbackContext {}\n/**\n * Factory function that determines where to store JSONP callbacks.\n *\n * Ordinarily JSONP callbacks are stored on the `window` object, but this may not exist\n * in test environments. In that case, callbacks are stored on an anonymous object instead.\n *\n *\n */\nfunction jsonpCallbackContext() {\n if (typeof window === 'object') {\n return window;\n }\n return {};\n}\n/**\n * Processes an `HttpRequest` with the JSONP method,\n * by performing JSONP style requests.\n * @see {@link HttpHandler}\n * @see {@link HttpXhrBackend}\n *\n * @publicApi\n */\nclass JsonpClientBackend {\n callbackMap;\n document;\n /**\n * A resolved promise that can be used to schedule microtasks in the event handlers.\n */\n resolvedPromise = Promise.resolve();\n constructor(callbackMap, document) {\n this.callbackMap = callbackMap;\n this.document = document;\n }\n /**\n * Get the name of the next callback method, by incrementing the global `nextRequestId`.\n */\n nextCallback() {\n return `ng_jsonp_callback_${nextRequestId++}`;\n }\n /**\n * Processes a JSONP request and returns an event stream of the results.\n * @param req The request object.\n * @returns An observable of the response events.\n *\n */\n handle(req) {\n // Firstly, check both the method and response type. If either doesn't match\n // then the request was improperly routed here and cannot be handled.\n if (req.method !== 'JSONP') {\n throw new _RuntimeError(2810 /* RuntimeErrorCode.JSONP_WRONG_METHOD */, ngDevMode && JSONP_ERR_WRONG_METHOD);\n } else if (req.responseType !== 'json') {\n throw new _RuntimeError(2811 /* RuntimeErrorCode.JSONP_WRONG_RESPONSE_TYPE */, ngDevMode && JSONP_ERR_WRONG_RESPONSE_TYPE);\n }\n // Check the request headers. JSONP doesn't support headers and\n // cannot set any that were supplied.\n if (req.headers.keys().length > 0) {\n throw new _RuntimeError(2812 /* RuntimeErrorCode.JSONP_HEADERS_NOT_SUPPORTED */, ngDevMode && JSONP_ERR_HEADERS_NOT_SUPPORTED);\n }\n // Everything else happens inside the Observable boundary.\n return new Observable(observer => {\n // The first step to make a request is to generate the callback name, and replace the\n // callback placeholder in the URL with the name. Care has to be taken here to ensure\n // a trailing &, if matched, gets inserted back into the URL in the correct place.\n const callback = this.nextCallback();\n const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);\n // Construct the <script> tag and point it at the URL.\n const node = this.document.createElement('script');\n node.src = url;\n // A JSONP request requires waiting for multiple callbacks. These variables\n // are closed over and track state across those callbacks.\n // The response object, if one has been received, or null otherwise.\n let body = null;\n // Whether the response callback has been called.\n let finished = false;\n // Set the response callback in this.callbackMap (which will be the window\n // object in the browser. The script being loaded via the <script> tag will\n // eventually call this callback.\n this.callbackMap[callback] = data => {\n // Data has been received from the JSONP script. Firstly, delete this callback.\n delete this.callbackMap[callback];\n // Set state to indicate data was received.\n body = data;\n finished = true;\n };\n // cleanup() is a utility closure that removes the <script> from the page and\n // the response callback from the window. This logic is used in both the\n // success, error, and cancellation paths, so it's extracted out for convenience.\n const cleanup = () => {\n node.removeEventListener('load', onLoad);\n node.removeEventListener('error', onError);\n // Remove the <script> tag if it's still on the page.\n node.remove();\n // Remove the response callback from the callbackMap (window object in the\n // browser).\n delete this.callbackMap[callback];\n };\n // onLoad() is the success callback which runs after the response callback\n // if the JSONP script loads successfully. The event itself is unimportant.\n // If something went wrong, onLoad() may run without the response callback\n // having been invoked.\n const onLoad = () => {\n // We wrap it in an extra Promise, to ensure the microtask\n // is scheduled after the loaded endpoint has executed any potential microtask itself,\n // which is not guaranteed in Internet Explorer and EdgeHTML. See issue #39496\n this.resolvedPromise.then(() => {\n // Cleanup the page.\n cleanup();\n // Check whether the response callback has run.\n if (!finished) {\n // It hasn't, something went wrong with the request. Return an error via\n // the Observable error path. All JSONP errors have status 0.\n observer.error(new HttpErrorResponse({\n url,\n status: 0,\n statusText: 'JSONP Error',\n error: new Error(JSONP_ERR_NO_CALLBACK)\n }));\n return;\n }\n // Success. body either contains the response body or null if none was\n // returned.\n observer.next(new HttpResponse({\n body,\n status: HTTP_STATUS_CODE_OK,\n statusText: 'OK',\n url\n }));\n // Complete the stream, the response is over.\n observer.complete();\n });\n };\n // onError() is the error callback, which runs if the script returned generates\n // a Javascript error. It emits the error via the Observable error channel as\n // a HttpErrorResponse.\n const onError = error => {\n cleanup();\n // Wrap the error in a HttpErrorResponse.\n observer.error(new HttpErrorResponse({\n error,\n status: 0,\n statusText: 'JSONP Error',\n url\n }));\n };\n // Subscribe to both the success (load) and error events on the <script> tag,\n // and add it to the page.\n node.addEventListener('load', onLoad);\n node.addEventListener('error', onError);\n this.document.body.appendChild(node);\n // The request has now been successfully sent.\n observer.next({\n type: HttpEventType.Sent\n });\n // Cancellation handler.\n return () => {\n if (!finished) {\n this.removeListeners(node);\n }\n // And finally, clean up the page.\n cleanup();\n };\n });\n }\n removeListeners(script) {\n // Issue #34818\n // Changing <script>'s ownerDocument will prevent it from execution.\n // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block\n foreignDocument ??= this.document.implementation.createHTMLDocument();\n foreignDocument.adoptNode(script);\n }\n static ɵfac = function JsonpClientBackend_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || JsonpClientBackend)(i0.ɵɵinject(JsonpCallbackContext), i0.ɵɵinject(DOCUMENT));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: JsonpClientBackend,\n factory: JsonpClientBackend.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(JsonpClientBackend, [{\n type: Injectable\n }], () => [{\n type: JsonpCallbackContext\n }, {\n type: undefined,\n decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }]\n }], null);\n})();\n/**\n * Identifies requests with the method JSONP and shifts them to the `JsonpClientBackend`.\n */\nfunction jsonpInterceptorFn(req, next) {\n if (req.method === 'JSONP') {\n return inject(JsonpClientBackend).handle(req);\n }\n // Fall through for normal HTTP requests.\n return next(req);\n}\n/**\n * Identifies requests with the method JSONP and\n * shifts them to the `JsonpClientBackend`.\n *\n * @see {@link HttpInterceptor}\n *\n * @publicApi\n */\nclass JsonpInterceptor {\n injector;\n constructor(injector) {\n this.injector = injector;\n }\n /**\n * Identifies and handles a given JSONP request.\n * @param initialRequest The outgoing request object to handle.\n * @param next The next interceptor in the chain, or the backend\n * if no interceptors remain in the chain.\n * @returns An observable of the event stream.\n */\n intercept(initialRequest, next) {\n return runInInjectionContext(this.injector, () => jsonpInterceptorFn(initialRequest, downstreamRequest => next.handle(downstreamRequest)));\n }\n static ɵfac = function JsonpInterceptor_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || JsonpInterceptor)(i0.ɵɵinject(i0.EnvironmentInjector));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: JsonpInterceptor,\n factory: JsonpInterceptor.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(JsonpInterceptor, [{\n type: Injectable\n }], () => [{\n type: i0.EnvironmentInjector\n }], null);\n})();\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\nconst X_REQUEST_URL_REGEXP = RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm');\n/**\n * Determine an appropriate URL for the response, by checking either\n * XMLHttpRequest.responseURL or the X-Request-URL header.\n */\nfunction getResponseUrl(xhr) {\n if ('responseURL' in xhr && xhr.responseURL) {\n return xhr.responseURL;\n }\n if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader(X_REQUEST_URL_HEADER);\n }\n return null;\n}\n/**\n * Validates whether the request is compatible with the XHR backend.\n * Show a warning if the request contains options that are not supported by XHR.\n */\nfunction validateXhrCompatibility(req) {\n const unsupportedOptions = [{\n property: 'keepalive',\n errorCode: 2813 /* RuntimeErrorCode.KEEPALIVE_NOT_SUPPORTED_WITH_XHR */\n }, {\n property: 'cache',\n errorCode: 2814 /* RuntimeErrorCode.CACHE_NOT_SUPPORTED_WITH_XHR */\n }, {\n property: 'priority',\n errorCode: 2815 /* RuntimeErrorCode.PRIORITY_NOT_SUPPORTED_WITH_XHR */\n }, {\n property: 'mode',\n errorCode: 2816 /* RuntimeErrorCode.MODE_NOT_SUPPORTED_WITH_XHR */\n }, {\n property: 'redirect',\n errorCode: 2817 /* RuntimeErrorCode.REDIRECT_NOT_SUPPORTED_WITH_XHR */\n }, {\n property: 'credentials',\n errorCode: 2818 /* RuntimeErrorCode.CREDENTIALS_NOT_SUPPORTED_WITH_XHR */\n }];\n // Check each unsupported option and warn if present\n for (const {\n property,\n errorCode\n } of unsupportedOptions) {\n if (req[property]) {\n console.warn(_formatRuntimeError(errorCode, `Angular detected that a \\`HttpClient\\` request with the \\`${property}\\` option was sent using XHR, which does not support it. To use the \\`${property}\\` option, enable Fetch API support by passing \\`withFetch()\\` as an argument to \\`provideHttpClient()\\`.`));\n }\n }\n}\n/**\n * Uses `XMLHttpRequest` to send requests to a backend server.\n * @see {@link HttpHandler}\n * @see {@link JsonpClientBackend}\n *\n * @publicApi\n */\nclass HttpXhrBackend {\n xhrFactory;\n constructor(xhrFactory) {\n this.xhrFactory = xhrFactory;\n }\n /**\n * Processes a request and returns a stream of response events.\n * @param req The request object.\n * @returns An observable of the response events.\n */\n handle(req) {\n // Quick check to give a better error message when a user attempts to use\n // HttpClient.jsonp() without installing the HttpClientJsonpModule\n if (req.method === 'JSONP') {\n throw new _RuntimeError(-2800 /* RuntimeErrorCode.MISSING_JSONP_MODULE */, (typeof ngDevMode === 'undefined' || ngDevMode) && `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \\`withJsonpSupport()\\` call (if \\`provideHttpClient()\\` is used) or import the \\`HttpClientJsonpModule\\` in the root NgModule.`);\n }\n // Validate that the request is compatible with the XHR backend.\n ngDevMode && validateXhrCompatibility(req);\n // Check whether this factory has a special function to load an XHR implementation\n // for various non-browser environments. We currently limit it to only `ServerXhr`\n // class, which needs to load an XHR implementation.\n const xhrFactory = this.xhrFactory;\n const source =\n // Note that `ɵloadImpl` is never defined in client bundles and can be\n // safely dropped whenever we're running in the browser.\n // This branching is redundant.\n // The `ngServerMode` guard also enables tree-shaking of the `from()`\n // function from the common bundle, as it's only used in server code.\n typeof ngServerMode !== 'undefined' && ngServerMode && xhrFactory.ɵloadImpl ? from(xhrFactory.ɵloadImpl()) : of(null);\n return source.pipe(switchMap(() => {\n // Everything happens on Observable subscription.\n return new Observable(observer => {\n // Start by setting up the XHR object with request method, URL, and withCredentials\n // flag.\n const xhr = xhrFactory.build();\n xhr.open(req.method, req.urlWithParams);\n if (req.withCredentials) {\n xhr.withCredentials = true;\n }\n // Add all the requested headers.\n req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(',')));\n // Add an Accept header if one isn't present already.\n if (!req.headers.has(ACCEPT_HEADER)) {\n xhr.setRequestHeader(ACCEPT_HEADER, ACCEPT_HEADER_VALUE);\n }\n // Auto-detect the Content-Type header if one isn't present already.\n if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n const detectedType = req.detectContentTypeHeader();\n // Sometimes Content-Type detection fails.\n if (detectedType !== null) {\n xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType);\n }\n }\n if (req.timeout) {\n xhr.timeout = req.timeout;\n }\n // Set the responseType if one was requested.\n if (req.responseType) {\n const responseType = req.responseType.toLowerCase();\n // JSON responses need to be processed as text. This is because if the server\n // returns an XSSI-prefixed JSON response, the browser will fail to parse it,\n // xhr.response will be null, and xhr.responseText cannot be accessed to\n // retrieve the prefixed JSON data in order to strip the prefix. Thus, all JSON\n // is parsed by first requesting text and then applying JSON.parse.\n xhr.responseType = responseType !== 'json' ? responseType : 'text';\n }\n // Serialize the request body if one is present. If not, this will be set to null.\n const reqBody = req.serializeBody();\n // If progress events are enabled, response headers will be delivered\n // in two events - the HttpHeaderResponse event and the full HttpResponse\n // event. However, since response headers don't change in between these\n // two events, it doesn't make sense to parse them twice. So headerResponse\n // caches the data extracted from the response whenever it's first parsed,\n // to ensure parsing isn't duplicated.\n let headerResponse = null;\n // partialFromXhr extracts the HttpHeaderResponse from the current XMLHttpRequest\n // state, and memoizes it into headerResponse.\n const partialFromXhr = () => {\n if (headerResponse !== null) {\n return headerResponse;\n }\n const statusText = xhr.statusText || 'OK';\n // Parse headers from XMLHttpRequest - this step is lazy.\n const headers = new HttpHeaders(xhr.getAllResponseHeaders());\n // Read the response URL from the XMLHttpResponse instance and fall back on the\n // request URL.\n const url = getResponseUrl(xhr) || req.url;\n // Construct the HttpHeaderResponse and memoize it.\n headerResponse = new HttpHeaderResponse({\n headers,\n status: xhr.status,\n statusText,\n url\n });\n return headerResponse;\n };\n // Next, a few closures are defined for the various events which XMLHttpRequest can\n // emit. This allows them to be unregistered as event listeners later.\n // First up is the load event, which represents a response being fully available.\n const onLoad = () => {\n // Read response state from the memoized partial data.\n let {\n headers,\n status,\n statusText,\n url\n } = partialFromXhr();\n // The body will be read out if present.\n let body = null;\n if (status !== HTTP_STATUS_CODE_NO_CONTENT) {\n // Use XMLHttpRequest.response if set, responseText otherwise.\n body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;\n }\n // Normalize another potential bug (this one comes from CORS).\n if (status === 0) {\n status = !!body ? HTTP_STATUS_CODE_OK : 0;\n }\n // ok determines whether the response will be transmitted on the event or\n // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n // but a successful status code can still result in an error if the user\n // asked for JSON data and the body cannot be parsed as such.\n let ok = status >= 200 && status < 300;\n // Check whether the body needs to be parsed as JSON (in many cases the browser\n // will have done that already).\n if (req.responseType === 'json' && typeof body === 'string') {\n // Save the original body, before attempting XSSI prefix stripping.\n const originalBody = body;\n body = body.replace(XSSI_PREFIX, '');\n try {\n // Attempt the parse. If it fails, a parse error should be delivered to the\n // user.\n body = body !== '' ? JSON.parse(body) : null;\n } catch (error) {\n // Since the JSON.parse failed, it's reasonable to assume this might not have\n // been a JSON response. Restore the original body (including any XSSI prefix)\n // to deliver a better error response.\n body = originalBody;\n // If this was an error request to begin with, leave it as a string, it\n // probably just isn't JSON. Otherwise, deliver the parsing error to the user.\n if (ok) {\n // Even though the response status was 2xx, this is still an error.\n ok = false;\n // The parse error contains the text of the body that failed to parse.\n body = {\n error,\n text: body\n };\n }\n }\n }\n if (ok) {\n // A successful response is delivered on the event stream.\n observer.next(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url: url || undefined\n }));\n // The full body has been received and delivered, no further events\n // are possible. This request is complete.\n observer.complete();\n } else {\n // An unsuccessful request is delivered on the error channel.\n observer.error(new HttpErrorResponse({\n // The error in this case is the response body (error from the server).\n error: body,\n headers,\n status,\n statusText,\n url: url || undefined\n }));\n }\n };\n // The onError callback is called when something goes wrong at the network level.\n // Connection timeout, DNS error, offline, etc. These are actual errors, and are\n // transmitted on the error channel.\n const onError = error => {\n const {\n url\n } = partialFromXhr();\n const res = new HttpErrorResponse({\n error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n url: url || undefined\n });\n observer.error(res);\n };\n let onTimeout = onError;\n if (req.timeout) {\n onTimeout = _ => {\n const {\n url\n } = partialFromXhr();\n const res = new HttpErrorResponse({\n error: new DOMException('Request timed out', 'TimeoutError'),\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Request timeout',\n url: url || undefined\n });\n observer.error(res);\n };\n }\n // The sentHeaders flag tracks whether the HttpResponseHeaders event\n // has been sent on the stream. This is necessary to track if progress\n // is enabled since the event will be sent on only the first download\n // progress event.\n let sentHeaders = false;\n // The download progress event handler, which is only registered if\n // progress events are enabled.\n const onDownProgress = event => {\n // Send the HttpResponseHeaders event if it hasn't been sent already.\n if (!sentHeaders) {\n observer.next(partialFromXhr());\n sentHeaders = true;\n }\n // Start building the download progress event to deliver on the response\n // event stream.\n let progressEvent = {\n type: HttpEventType.DownloadProgress,\n loaded: event.loaded\n };\n // Set the total number of bytes in the event if it's available.\n if (event.lengthComputable) {\n progressEvent.total = event.total;\n }\n // If the request was for text content and a partial response is\n // available on XMLHttpRequest, include it in the progress event\n // to allow for streaming reads.\n if (req.responseType === 'text' && !!xhr.responseText) {\n progressEvent.partialText = xhr.responseText;\n }\n // Finally, fire the event.\n observer.next(progressEvent);\n };\n // The upload progress event handler, which is only registered if\n // progress events are enabled.\n const onUpProgress = event => {\n // Upload progress events are simpler. Begin building the progress\n // event.\n let progress = {\n type: HttpEventType.UploadProgress,\n loaded: event.loaded\n };\n // If the total number of bytes being uploaded is available, include\n // it.\n if (event.lengthComputable) {\n progress.total = event.total;\n }\n // Send the event.\n observer.next(progress);\n };\n // By default, register for load and error events.\n xhr.addEventListener('load', onLoad);\n xhr.addEventListener('error', onError);\n xhr.addEventListener('timeout', onTimeout);\n xhr.addEventListener('abort', onError);\n // Progress events are only enabled if requested.\n if (req.reportProgress) {\n // Download progress is always enabled if requested.\n xhr.addEventListener('progress', onDownProgress);\n // Upload progress depends on whether there is a body to upload.\n if (reqBody !== null && xhr.upload) {\n xhr.upload.addEventListener('progress', onUpProgress);\n }\n }\n // Fire the request, and notify the event stream that it was fired.\n xhr.send(reqBody);\n observer.next({\n type: HttpEventType.Sent\n });\n // This is the return from the Observable function, which is the\n // request cancellation handler.\n return () => {\n // On a cancellation, remove all registered event listeners.\n xhr.removeEventListener('error', onError);\n xhr.removeEventListener('abort', onError);\n xhr.removeEventListener('load', onLoad);\n xhr.removeEventListener('timeout', onTimeout);\n if (req.reportProgress) {\n xhr.removeEventListener('progress', onDownProgress);\n if (reqBody !== null && xhr.upload) {\n xhr.upload.removeEventListener('progress', onUpProgress);\n }\n }\n // Finally, abort the in-flight request.\n if (xhr.readyState !== xhr.DONE) {\n xhr.abort();\n }\n };\n });\n }));\n }\n static ɵfac = function HttpXhrBackend_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpXhrBackend)(i0.ɵɵinject(XhrFactory));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpXhrBackend,\n factory: HttpXhrBackend.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpXhrBackend, [{\n type: Injectable\n }], () => [{\n type: XhrFactory\n }], null);\n})();\nconst XSRF_ENABLED = new InjectionToken(ngDevMode ? 'XSRF_ENABLED' : '');\nconst XSRF_DEFAULT_COOKIE_NAME = 'XSRF-TOKEN';\nconst XSRF_COOKIE_NAME = new InjectionToken(ngDevMode ? 'XSRF_COOKIE_NAME' : '', {\n providedIn: 'root',\n factory: () => XSRF_DEFAULT_COOKIE_NAME\n});\nconst XSRF_DEFAULT_HEADER_NAME = 'X-XSRF-TOKEN';\nconst XSRF_HEADER_NAME = new InjectionToken(ngDevMode ? 'XSRF_HEADER_NAME' : '', {\n providedIn: 'root',\n factory: () => XSRF_DEFAULT_HEADER_NAME\n});\n/**\n * Retrieves the current XSRF token to use with the next outgoing request.\n *\n * @publicApi\n */\nclass HttpXsrfTokenExtractor {}\n/**\n * `HttpXsrfTokenExtractor` which retrieves the token from a cookie.\n */\nclass HttpXsrfCookieExtractor {\n doc;\n cookieName;\n lastCookieString = '';\n lastToken = null;\n /**\n * @internal for testing\n */\n parseCount = 0;\n constructor(doc, cookieName) {\n this.doc = doc;\n this.cookieName = cookieName;\n }\n getToken() {\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n return null;\n }\n const cookieString = this.doc.cookie || '';\n if (cookieString !== this.lastCookieString) {\n this.parseCount++;\n this.lastToken = parseCookieValue(cookieString, this.cookieName);\n this.lastCookieString = cookieString;\n }\n return this.lastToken;\n }\n static ɵfac = function HttpXsrfCookieExtractor_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpXsrfCookieExtractor)(i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(XSRF_COOKIE_NAME));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpXsrfCookieExtractor,\n factory: HttpXsrfCookieExtractor.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpXsrfCookieExtractor, [{\n type: Injectable\n }], () => [{\n type: undefined,\n decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }]\n }, {\n type: undefined,\n decorators: [{\n type: Inject,\n args: [XSRF_COOKIE_NAME]\n }]\n }], null);\n})();\nfunction xsrfInterceptorFn(req, next) {\n const lcUrl = req.url.toLowerCase();\n // Skip both non-mutating requests and absolute URLs.\n // Non-mutating requests don't require a token, and absolute URLs require special handling\n // anyway as the cookie set\n // on our origin is not the same as the token expected by another origin.\n if (!inject(XSRF_ENABLED) || req.method === 'GET' || req.method === 'HEAD' || lcUrl.startsWith('http://') || lcUrl.startsWith('https://')) {\n return next(req);\n }\n const token = inject(HttpXsrfTokenExtractor).getToken();\n const headerName = inject(XSRF_HEADER_NAME);\n // Be careful not to overwrite an existing header of the same name.\n if (token != null && !req.headers.has(headerName)) {\n req = req.clone({\n headers: req.headers.set(headerName, token)\n });\n }\n return next(req);\n}\n/**\n * `HttpInterceptor` which adds an XSRF token to eligible outgoing requests.\n */\nclass HttpXsrfInterceptor {\n injector;\n constructor(injector) {\n this.injector = injector;\n }\n intercept(initialRequest, next) {\n return runInInjectionContext(this.injector, () => xsrfInterceptorFn(initialRequest, downstreamRequest => next.handle(downstreamRequest)));\n }\n static ɵfac = function HttpXsrfInterceptor_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpXsrfInterceptor)(i0.ɵɵinject(i0.EnvironmentInjector));\n };\n static ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: HttpXsrfInterceptor,\n factory: HttpXsrfInterceptor.ɵfac\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpXsrfInterceptor, [{\n type: Injectable\n }], () => [{\n type: i0.EnvironmentInjector\n }], null);\n})();\n\n/**\n * Identifies a particular kind of `HttpFeature`.\n *\n * @publicApi\n */\nvar HttpFeatureKind;\n(function (HttpFeatureKind) {\n HttpFeatureKind[HttpFeatureKind[\"Interceptors\"] = 0] = \"Interceptors\";\n HttpFeatureKind[HttpFeatureKind[\"LegacyInterceptors\"] = 1] = \"LegacyInterceptors\";\n HttpFeatureKind[HttpFeatureKind[\"CustomXsrfConfiguration\"] = 2] = \"CustomXsrfConfiguration\";\n HttpFeatureKind[HttpFeatureKind[\"NoXsrfProtection\"] = 3] = \"NoXsrfProtection\";\n HttpFeatureKind[HttpFeatureKind[\"JsonpSupport\"] = 4] = \"JsonpSupport\";\n HttpFeatureKind[HttpFeatureKind[\"RequestsMadeViaParent\"] = 5] = \"RequestsMadeViaParent\";\n HttpFeatureKind[HttpFeatureKind[\"Fetch\"] = 6] = \"Fetch\";\n})(HttpFeatureKind || (HttpFeatureKind = {}));\nfunction makeHttpFeature(kind, providers) {\n return {\n ɵkind: kind,\n ɵproviders: providers\n };\n}\n/**\n * Configures Angular's `HttpClient` service to be available for injection.\n *\n * By default, `HttpClient` will be configured for injection with its default options for XSRF\n * protection of outgoing requests. Additional configuration options can be provided by passing\n * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the\n * `withInterceptors(...)` feature.\n *\n * <div class=\"docs-alert docs-alert-helpful\">\n *\n * It's strongly recommended to enable\n * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use\n * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add\n * `withFetch()` feature to the `provideHttpClient()` call at the root of the application:\n *\n * ```ts\n * provideHttpClient(withFetch());\n * ```\n *\n * </div>\n *\n * @see {@link withInterceptors}\n * @see {@link withInterceptorsFromDi}\n * @see {@link withXsrfConfiguration}\n * @see {@link withNoXsrfProtection}\n * @see {@link withJsonpSupport}\n * @see {@link withRequestsMadeViaParent}\n * @see {@link withFetch}\n */\nfunction provideHttpClient(...features) {\n if (ngDevMode) {\n const featureKinds = new Set(features.map(f => f.ɵkind));\n if (featureKinds.has(HttpFeatureKind.NoXsrfProtection) && featureKinds.has(HttpFeatureKind.CustomXsrfConfiguration)) {\n throw new Error(ngDevMode ? `Configuration error: found both withXsrfConfiguration() and withNoXsrfProtection() in the same call to provideHttpClient(), which is a contradiction.` : '');\n }\n }\n const providers = [HttpClient, HttpXhrBackend, HttpInterceptorHandler, {\n provide: HttpHandler,\n useExisting: HttpInterceptorHandler\n }, {\n provide: HttpBackend,\n useFactory: () => {\n return inject(FETCH_BACKEND, {\n optional: true\n }) ?? inject(HttpXhrBackend);\n }\n }, {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: xsrfInterceptorFn,\n multi: true\n }, {\n provide: XSRF_ENABLED,\n useValue: true\n }, {\n provide: HttpXsrfTokenExtractor,\n useClass: HttpXsrfCookieExtractor\n }];\n for (const feature of features) {\n providers.push(...feature.ɵproviders);\n }\n return makeEnvironmentProviders(providers);\n}\n/**\n * Adds one or more functional-style HTTP interceptors to the configuration of the `HttpClient`\n * instance.\n *\n * @see {@link HttpInterceptorFn}\n * @see {@link provideHttpClient}\n * @publicApi\n */\nfunction withInterceptors(interceptorFns) {\n return makeHttpFeature(HttpFeatureKind.Interceptors, interceptorFns.map(interceptorFn => {\n return {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: interceptorFn,\n multi: true\n };\n }));\n}\nconst LEGACY_INTERCEPTOR_FN = new InjectionToken(ngDevMode ? 'LEGACY_INTERCEPTOR_FN' : '');\n/**\n * Includes class-based interceptors configured using a multi-provider in the current injector into\n * the configured `HttpClient` instance.\n *\n * Prefer `withInterceptors` and functional interceptors instead, as support for DI-provided\n * interceptors may be phased out in a later release.\n *\n * @see {@link HttpInterceptor}\n * @see {@link HTTP_INTERCEPTORS}\n * @see {@link provideHttpClient}\n */\nfunction withInterceptorsFromDi() {\n // Note: the legacy interceptor function is provided here via an intermediate token\n // (`LEGACY_INTERCEPTOR_FN`), using a pattern which guarantees that if these providers are\n // included multiple times, all of the multi-provider entries will have the same instance of the\n // interceptor function. That way, the `HttpINterceptorHandler` will dedup them and legacy\n // interceptors will not run multiple times.\n return makeHttpFeature(HttpFeatureKind.LegacyInterceptors, [{\n provide: LEGACY_INTERCEPTOR_FN,\n useFactory: legacyInterceptorFnFactory\n }, {\n provide: HTTP_INTERCEPTOR_FNS,\n useExisting: LEGACY_INTERCEPTOR_FN,\n multi: true\n }]);\n}\n/**\n * Customizes the XSRF protection for the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withNoXsrfProtection` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withXsrfConfiguration({\n cookieName,\n headerName\n}) {\n const providers = [];\n if (cookieName !== undefined) {\n providers.push({\n provide: XSRF_COOKIE_NAME,\n useValue: cookieName\n });\n }\n if (headerName !== undefined) {\n providers.push({\n provide: XSRF_HEADER_NAME,\n useValue: headerName\n });\n }\n return makeHttpFeature(HttpFeatureKind.CustomXsrfConfiguration, providers);\n}\n/**\n * Disables XSRF protection in the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withXsrfConfiguration` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withNoXsrfProtection() {\n return makeHttpFeature(HttpFeatureKind.NoXsrfProtection, [{\n provide: XSRF_ENABLED,\n useValue: false\n }]);\n}\n/**\n * Add JSONP support to the configuration of the current `HttpClient` instance.\n *\n * @see {@link provideHttpClient}\n */\nfunction withJsonpSupport() {\n return makeHttpFeature(HttpFeatureKind.JsonpSupport, [JsonpClientBackend, {\n provide: JsonpCallbackContext,\n useFactory: jsonpCallbackContext\n }, {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: jsonpInterceptorFn,\n multi: true\n }]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests via the parent injector's\n * `HttpClient` instead of directly.\n *\n * By default, `provideHttpClient` configures `HttpClient` in its injector to be an independent\n * instance. For example, even if `HttpClient` is configured in the parent injector with\n * one or more interceptors, they will not intercept requests made via this instance.\n *\n * With this option enabled, once the request has passed through the current injector's\n * interceptors, it will be delegated to the parent injector's `HttpClient` chain instead of\n * dispatched directly, and interceptors in the parent configuration will be applied to the request.\n *\n * If there are several `HttpClient` instances in the injector hierarchy, it's possible for\n * `withRequestsMadeViaParent` to be used at multiple levels, which will cause the request to\n * \"bubble up\" until either reaching the root level or an `HttpClient` which was not configured with\n * this option.\n *\n * @see {@link provideHttpClient}\n * @publicApi 19.0\n */\nfunction withRequestsMadeViaParent() {\n return makeHttpFeature(HttpFeatureKind.RequestsMadeViaParent, [{\n provide: HttpBackend,\n useFactory: () => {\n const handlerFromParent = inject(HttpHandler, {\n skipSelf: true,\n optional: true\n });\n if (ngDevMode && handlerFromParent === null) {\n throw new Error('withRequestsMadeViaParent() can only be used when the parent injector also configures HttpClient');\n }\n return handlerFromParent;\n }\n }]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests using the fetch API.\n *\n * Note: The Fetch API doesn't support progress report on uploads.\n *\n * @publicApi\n */\nfunction withFetch() {\n return makeHttpFeature(HttpFeatureKind.Fetch, [FetchBackend, {\n provide: FETCH_BACKEND,\n useExisting: FetchBackend\n }, {\n provide: HttpBackend,\n useExisting: FetchBackend\n }]);\n}\n\n/**\n * Configures XSRF protection support for outgoing requests.\n *\n * For a server that supports a cookie-based XSRF protection system,\n * use directly to configure XSRF protection with the correct\n * cookie and header names.\n *\n * If no names are supplied, the default cookie name is `XSRF-TOKEN`\n * and the default header name is `X-XSRF-TOKEN`.\n *\n * @publicApi\n * @deprecated Use withXsrfConfiguration({cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN'}) as\n * providers instead or `withNoXsrfProtection` if you want to disabled XSRF protection.\n */\nclass HttpClientXsrfModule {\n /**\n * Disable the default XSRF protection.\n */\n static disable() {\n return {\n ngModule: HttpClientXsrfModule,\n providers: [withNoXsrfProtection().ɵproviders]\n };\n }\n /**\n * Configure XSRF protection.\n * @param options An object that can specify either or both\n * cookie name or header name.\n * - Cookie name default is `XSRF-TOKEN`.\n * - Header name default is `X-XSRF-TOKEN`.\n *\n */\n static withOptions(options = {}) {\n return {\n ngModule: HttpClientXsrfModule,\n providers: withXsrfConfiguration(options).ɵproviders\n };\n }\n static ɵfac = function HttpClientXsrfModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClientXsrfModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: HttpClientXsrfModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [HttpXsrfInterceptor, {\n provide: HTTP_INTERCEPTORS,\n useExisting: HttpXsrfInterceptor,\n multi: true\n }, {\n provide: HttpXsrfTokenExtractor,\n useClass: HttpXsrfCookieExtractor\n }, withXsrfConfiguration({\n cookieName: XSRF_DEFAULT_COOKIE_NAME,\n headerName: XSRF_DEFAULT_HEADER_NAME\n }).ɵproviders, {\n provide: XSRF_ENABLED,\n useValue: true\n }]\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpClientXsrfModule, [{\n type: NgModule,\n args: [{\n providers: [HttpXsrfInterceptor, {\n provide: HTTP_INTERCEPTORS,\n useExisting: HttpXsrfInterceptor,\n multi: true\n }, {\n provide: HttpXsrfTokenExtractor,\n useClass: HttpXsrfCookieExtractor\n }, withXsrfConfiguration({\n cookieName: XSRF_DEFAULT_COOKIE_NAME,\n headerName: XSRF_DEFAULT_HEADER_NAME\n }).ɵproviders, {\n provide: XSRF_ENABLED,\n useValue: true\n }]\n }]\n }], null, null);\n})();\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for XSRF. Automatically imported by `HttpClientModule`.\n *\n * You can add interceptors to the chain behind `HttpClient` by binding them to the\n * multiprovider for built-in DI token `HTTP_INTERCEPTORS`.\n *\n * @publicApi\n * @deprecated use `provideHttpClient(withInterceptorsFromDi())` as providers instead\n */\nclass HttpClientModule {\n static ɵfac = function HttpClientModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClientModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: HttpClientModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [provideHttpClient(withInterceptorsFromDi())]\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpClientModule, [{\n type: NgModule,\n args: [{\n /**\n * Configures the dependency injector where it is imported\n * with supporting services for HTTP communications.\n */\n providers: [provideHttpClient(withInterceptorsFromDi())]\n }]\n }], null, null);\n})();\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for JSONP.\n * Without this module, Jsonp requests reach the backend\n * with method JSONP, where they are rejected.\n *\n * @publicApi\n * @deprecated `withJsonpSupport()` as providers instead\n */\nclass HttpClientJsonpModule {\n static ɵfac = function HttpClientJsonpModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || HttpClientJsonpModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: HttpClientJsonpModule\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n providers: [withJsonpSupport().ɵproviders]\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(HttpClientJsonpModule, [{\n type: NgModule,\n args: [{\n providers: [withJsonpSupport().ɵproviders]\n }]\n }], null, null);\n})();\nexport { FetchBackend, HTTP_INTERCEPTORS, HTTP_ROOT_INTERCEPTOR_FNS, HttpBackend, HttpClient, HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpErrorResponse, HttpEventType, HttpFeatureKind, HttpHandler, HttpHeaderResponse, HttpHeaders, HttpInterceptorHandler, HttpParams, HttpRequest, HttpResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, REQUESTS_CONTRIBUTE_TO_STABILITY, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration };\n//# sourceMappingURL=module.mjs.map","map":{"version":3,"names":["i0","ɵRuntimeError","_RuntimeError","Injectable","InjectionToken","inject","NgZone","DestroyRef","ɵformatRuntimeError","_formatRuntimeError","PendingTasks","ɵConsole","_Console","runInInjectionContext","DOCUMENT","Inject","makeEnvironmentProviders","NgModule","concatMap","filter","map","finalize","switchMap","of","Observable","from","XhrFactory","parseCookieValue","HttpHandler","HttpBackend","HttpHeaders","headers","normalizedNames","Map","lazyInit","lazyUpdate","constructor","split","forEach","line","index","indexOf","name","slice","value","trim","addHeaderEntry","Headers","ngDevMode","assertValidHeaders","Object","entries","values","setHeaderEntries","has","init","toLowerCase","get","length","keys","Array","getAll","append","clone","op","set","delete","maybeSetNormalizedName","lcName","copyFrom","update","applyUpdate","other","key","concat","base","undefined","push","toDelete","existing","headerValues","isArray","toString","fn","Error","HttpUrlEncodingCodec","encodeKey","standardEncoding","encodeValue","decodeKey","decodeURIComponent","decodeValue","paramParser","rawParams","codec","params","replace","param","eqIdx","val","list","STANDARD_ENCODING_REGEX","STANDARD_ENCODING_REPLACEMENTS","v","encodeURIComponent","s","t","valueToString","HttpParams","encoder","updates","cloneFrom","options","fromString","fromObject","res","appendAll","_value","eKey","join","idx","splice","HttpContextToken","defaultValue","HttpContext","token","mightHaveBody","method","isArrayBuffer","ArrayBuffer","isBlob","Blob","isFormData","FormData","isUrlSearchParams","URLSearchParams","CONTENT_TYPE_HEADER","ACCEPT_HEADER","X_REQUEST_URL_HEADER","TEXT_CONTENT_TYPE","JSON_CONTENT_TYPE","ACCEPT_HEADER_VALUE","HttpRequest","url","body","context","reportProgress","withCredentials","credentials","keepalive","cache","priority","mode","redirect","responseType","urlWithParams","transferCache","timeout","third","fourth","toUpperCase","Number","isInteger","qIdx","sep","serializeBody","JSON","stringify","detectContentTypeHeader","type","setHeaders","reduce","setParams","HttpEventType","HttpResponseBase","status","statusText","ok","defaultStatus","defaultStatusText","HttpHeaderResponse","ResponseHeader","HttpResponse","Response","HttpErrorResponse","message","error","HTTP_STATUS_CODE_OK","HTTP_STATUS_CODE_NO_CONTENT","HttpStatusCode","addBody","observe","HttpClient","handler","request","first","req","events$","pipe","handle","res$","event","head","jsonp","callbackParam","patch","post","put","ɵfac","HttpClient_Factory","__ngFactoryType__","ɵɵinject","ɵprov","ɵɵdefineInjectable","factory","ɵsetClassMetadata","XSSI_PREFIX$1","getResponseUrl$1","response","xRequestUrl","toLocaleLowerCase","FETCH_BACKEND","FetchBackend","fetchImpl","FetchFactory","optional","fetch","args","globalThis","ngZone","destroyRef","destroyed","onDestroy","observer","aborter","AbortController","doRequest","signal","then","noop","timeoutId","runOutsideAngular","setTimeout","aborted","abort","DOMException","clearTimeout","_this","_asyncToGenerator","createRequestInit","fetchPromise","silenceSuperfluousUnhandledPromiseRejection","next","Sent","contentLength","chunks","reader","getReader","receivedLength","decoder","partialText","reqZone","Zone","current","canceled","cancel","done","read","TextDecoder","decode","stream","DownloadProgress","total","loaded","run","complete","chunksAll","concatChunks","contentType","parseBody","binContent","text","parse","e","buffer","warningOptionsMessage","detectedType","totalLength","Uint8Array","position","chunk","FetchBackend_Factory","console","warn","promise","interceptorChainEndFn","finalHandlerFn","adaptLegacyInterceptorToChain","chainTailFn","interceptor","initialRequest","intercept","downstreamRequest","chainedInterceptorFn","interceptorFn","injector","HTTP_INTERCEPTORS","HTTP_INTERCEPTOR_FNS","HTTP_ROOT_INTERCEPTOR_FNS","REQUESTS_CONTRIBUTE_TO_STABILITY","providedIn","legacyInterceptorFnFactory","chain","interceptors","reduceRight","pendingTasks","contributeToStability","removeTask","add","fetchBackendWarningDisplayed","HttpInterceptorHandler","backend","isTestingBackend","ngServerMode","dedupedInterceptorFns","Set","nextSequencedFn","HttpInterceptorHandler_Factory","EnvironmentInjector","nextRequestId","foreignDocument","JSONP_ERR_NO_CALLBACK","JSONP_ERR_WRONG_METHOD","JSONP_ERR_WRONG_RESPONSE_TYPE","JSONP_ERR_HEADERS_NOT_SUPPORTED","JsonpCallbackContext","jsonpCallbackContext","window","JsonpClientBackend","callbackMap","document","resolvedPromise","Promise","resolve","nextCallback","callback","node","createElement","src","finished","data","cleanup","removeEventListener","onLoad","onError","remove","addEventListener","appendChild","removeListeners","script","implementation","createHTMLDocument","adoptNode","JsonpClientBackend_Factory","decorators","jsonpInterceptorFn","JsonpInterceptor","JsonpInterceptor_Factory","XSSI_PREFIX","X_REQUEST_URL_REGEXP","RegExp","getResponseUrl","xhr","responseURL","test","getAllResponseHeaders","getResponseHeader","validateXhrCompatibility","unsupportedOptions","property","errorCode","HttpXhrBackend","xhrFactory","source","ɵloadImpl","build","open","setRequestHeader","reqBody","headerResponse","partialFromXhr","responseText","originalBody","onTimeout","_","sentHeaders","onDownProgress","progressEvent","lengthComputable","onUpProgress","progress","UploadProgress","upload","send","readyState","DONE","HttpXhrBackend_Factory","XSRF_ENABLED","XSRF_DEFAULT_COOKIE_NAME","XSRF_COOKIE_NAME","XSRF_DEFAULT_HEADER_NAME","XSRF_HEADER_NAME","HttpXsrfTokenExtractor","HttpXsrfCookieExtractor","doc","cookieName","lastCookieString","lastToken","parseCount","getToken","cookieString","cookie","HttpXsrfCookieExtractor_Factory","xsrfInterceptorFn","lcUrl","startsWith","headerName","HttpXsrfInterceptor","HttpXsrfInterceptor_Factory","HttpFeatureKind","makeHttpFeature","kind","providers","ɵkind","ɵproviders","provideHttpClient","features","featureKinds","f","NoXsrfProtection","CustomXsrfConfiguration","provide","useExisting","useFactory","useValue","multi","useClass","feature","withInterceptors","interceptorFns","Interceptors","LEGACY_INTERCEPTOR_FN","withInterceptorsFromDi","LegacyInterceptors","withXsrfConfiguration","withNoXsrfProtection","withJsonpSupport","JsonpSupport","withRequestsMadeViaParent","RequestsMadeViaParent","handlerFromParent","skipSelf","withFetch","Fetch","HttpClientXsrfModule","disable","ngModule","withOptions","HttpClientXsrfModule_Factory","ɵmod","ɵɵdefineNgModule","ɵinj","ɵɵdefineInjector","HttpClientModule","HttpClientModule_Factory","HttpClientJsonpModule","HttpClientJsonpModule_Factory"],"sources":["/home/poule/encrypted/stockage-syncable/www/development/html/ng-implementation/implem/node_modules/@angular/common/fesm2022/module.mjs"],"sourcesContent":["/**\n * @license Angular v20.1.4\n * (c) 2010-2025 Google LLC. https://angular.io/\n * License: MIT\n */\n\nimport * as i0 from '@angular/core';\nimport { ɵRuntimeError as _RuntimeError, Injectable, InjectionToken, inject, NgZone, DestroyRef, ɵformatRuntimeError as _formatRuntimeError, PendingTasks, ɵConsole as _Console, runInInjectionContext, DOCUMENT, Inject, makeEnvironmentProviders, NgModule } from '@angular/core';\nimport { concatMap, filter, map, finalize, switchMap } from 'rxjs/operators';\nimport { of, Observable, from } from 'rxjs';\nimport { XhrFactory, parseCookieValue } from './xhr.mjs';\n\n/**\n * Transforms an `HttpRequest` into a stream of `HttpEvent`s, one of which will likely be a\n * `HttpResponse`.\n *\n * `HttpHandler` is injectable. When injected, the handler instance dispatches requests to the\n * first interceptor in the chain, which dispatches to the second, etc, eventually reaching the\n * `HttpBackend`.\n *\n * In an `HttpInterceptor`, the `HttpHandler` parameter is the next interceptor in the chain.\n *\n * @publicApi\n */\nclass HttpHandler {\n}\n/**\n * A final `HttpHandler` which will dispatch the request via browser HTTP APIs to a backend.\n *\n * Interceptors sit between the `HttpClient` interface and the `HttpBackend`.\n *\n * When injected, `HttpBackend` dispatches requests directly to the backend, without going\n * through the interceptor chain.\n *\n * @publicApi\n */\nclass HttpBackend {\n}\n\n/**\n * Represents the header configuration options for an HTTP request.\n * Instances are immutable. Modifying methods return a cloned\n * instance with the change. The original object is never changed.\n *\n * @publicApi\n */\nclass HttpHeaders {\n /**\n * Internal map of lowercase header names to values.\n */\n headers;\n /**\n * Internal map of lowercased header names to the normalized\n * form of the name (the form seen first).\n */\n normalizedNames = new Map();\n /**\n * Complete the lazy initialization of this object (needed before reading).\n */\n lazyInit;\n /**\n * Queued updates to be materialized the next initialization.\n */\n lazyUpdate = null;\n /** Constructs a new HTTP header object with the given values.*/\n constructor(headers) {\n if (!headers) {\n this.headers = new Map();\n }\n else if (typeof headers === 'string') {\n this.lazyInit = () => {\n this.headers = new Map();\n headers.split('\\n').forEach((line) => {\n const index = line.indexOf(':');\n if (index > 0) {\n const name = line.slice(0, index);\n const value = line.slice(index + 1).trim();\n this.addHeaderEntry(name, value);\n }\n });\n };\n }\n else if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n this.headers = new Map();\n headers.forEach((value, name) => {\n this.addHeaderEntry(name, value);\n });\n }\n else {\n this.lazyInit = () => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n assertValidHeaders(headers);\n }\n this.headers = new Map();\n Object.entries(headers).forEach(([name, values]) => {\n this.setHeaderEntries(name, values);\n });\n };\n }\n }\n /**\n * Checks for existence of a given header.\n *\n * @param name The header name to check for existence.\n *\n * @returns True if the header exists, false otherwise.\n */\n has(name) {\n this.init();\n return this.headers.has(name.toLowerCase());\n }\n /**\n * Retrieves the first value of a given header.\n *\n * @param name The header name.\n *\n * @returns The value string if the header exists, null otherwise\n */\n get(name) {\n this.init();\n const values = this.headers.get(name.toLowerCase());\n return values && values.length > 0 ? values[0] : null;\n }\n /**\n * Retrieves the names of the headers.\n *\n * @returns A list of header names.\n */\n keys() {\n this.init();\n return Array.from(this.normalizedNames.values());\n }\n /**\n * Retrieves a list of values for a given header.\n *\n * @param name The header name from which to retrieve values.\n *\n * @returns A string of values if the header exists, null otherwise.\n */\n getAll(name) {\n this.init();\n return this.headers.get(name.toLowerCase()) || null;\n }\n /**\n * Appends a new value to the existing set of values for a header\n * and returns them in a clone of the original instance.\n *\n * @param name The header name for which to append the values.\n * @param value The value to append.\n *\n * @returns A clone of the HTTP headers object with the value appended to the given header.\n */\n append(name, value) {\n return this.clone({ name, value, op: 'a' });\n }\n /**\n * Sets or modifies a value for a given header in a clone of the original instance.\n * If the header already exists, its value is replaced with the given value\n * in the returned object.\n *\n * @param name The header name.\n * @param value The value or values to set or override for the given header.\n *\n * @returns A clone of the HTTP headers object with the newly set header value.\n */\n set(name, value) {\n return this.clone({ name, value, op: 's' });\n }\n /**\n * Deletes values for a given header in a clone of the original instance.\n *\n * @param name The header name.\n * @param value The value or values to delete for the given header.\n *\n * @returns A clone of the HTTP headers object with the given value deleted.\n */\n delete(name, value) {\n return this.clone({ name, value, op: 'd' });\n }\n maybeSetNormalizedName(name, lcName) {\n if (!this.normalizedNames.has(lcName)) {\n this.normalizedNames.set(lcName, name);\n }\n }\n init() {\n if (!!this.lazyInit) {\n if (this.lazyInit instanceof HttpHeaders) {\n this.copyFrom(this.lazyInit);\n }\n else {\n this.lazyInit();\n }\n this.lazyInit = null;\n if (!!this.lazyUpdate) {\n this.lazyUpdate.forEach((update) => this.applyUpdate(update));\n this.lazyUpdate = null;\n }\n }\n }\n copyFrom(other) {\n other.init();\n Array.from(other.headers.keys()).forEach((key) => {\n this.headers.set(key, other.headers.get(key));\n this.normalizedNames.set(key, other.normalizedNames.get(key));\n });\n }\n clone(update) {\n const clone = new HttpHeaders();\n clone.lazyInit = !!this.lazyInit && this.lazyInit instanceof HttpHeaders ? this.lazyInit : this;\n clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);\n return clone;\n }\n applyUpdate(update) {\n const key = update.name.toLowerCase();\n switch (update.op) {\n case 'a':\n case 's':\n let value = update.value;\n if (typeof value === 'string') {\n value = [value];\n }\n if (value.length === 0) {\n return;\n }\n this.maybeSetNormalizedName(update.name, key);\n const base = (update.op === 'a' ? this.headers.get(key) : undefined) || [];\n base.push(...value);\n this.headers.set(key, base);\n break;\n case 'd':\n const toDelete = update.value;\n if (!toDelete) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n }\n else {\n let existing = this.headers.get(key);\n if (!existing) {\n return;\n }\n existing = existing.filter((value) => toDelete.indexOf(value) === -1);\n if (existing.length === 0) {\n this.headers.delete(key);\n this.normalizedNames.delete(key);\n }\n else {\n this.headers.set(key, existing);\n }\n }\n break;\n }\n }\n addHeaderEntry(name, value) {\n const key = name.toLowerCase();\n this.maybeSetNormalizedName(name, key);\n if (this.headers.has(key)) {\n this.headers.get(key).push(value);\n }\n else {\n this.headers.set(key, [value]);\n }\n }\n setHeaderEntries(name, values) {\n const headerValues = (Array.isArray(values) ? values : [values]).map((value) => value.toString());\n const key = name.toLowerCase();\n this.headers.set(key, headerValues);\n this.maybeSetNormalizedName(name, key);\n }\n /**\n * @internal\n */\n forEach(fn) {\n this.init();\n Array.from(this.normalizedNames.keys()).forEach((key) => fn(this.normalizedNames.get(key), this.headers.get(key)));\n }\n}\n/**\n * Verifies that the headers object has the right shape: the values\n * must be either strings, numbers or arrays. Throws an error if an invalid\n * header value is present.\n */\nfunction assertValidHeaders(headers) {\n for (const [key, value] of Object.entries(headers)) {\n if (!(typeof value === 'string' || typeof value === 'number') && !Array.isArray(value)) {\n throw new Error(`Unexpected value of the \\`${key}\\` header provided. ` +\n `Expecting either a string, a number or an array, but got: \\`${value}\\`.`);\n }\n }\n}\n\n/**\n * Provides encoding and decoding of URL parameter and query-string values.\n *\n * Serializes and parses URL parameter keys and values to encode and decode them.\n * If you pass URL query parameters without encoding,\n * the query parameters can be misinterpreted at the receiving end.\n *\n *\n * @publicApi\n */\nclass HttpUrlEncodingCodec {\n /**\n * Encodes a key name for a URL parameter or query-string.\n * @param key The key name.\n * @returns The encoded key name.\n */\n encodeKey(key) {\n return standardEncoding(key);\n }\n /**\n * Encodes the value of a URL parameter or query-string.\n * @param value The value.\n * @returns The encoded value.\n */\n encodeValue(value) {\n return standardEncoding(value);\n }\n /**\n * Decodes an encoded URL parameter or query-string key.\n * @param key The encoded key name.\n * @returns The decoded key name.\n */\n decodeKey(key) {\n return decodeURIComponent(key);\n }\n /**\n * Decodes an encoded URL parameter or query-string value.\n * @param value The encoded value.\n * @returns The decoded value.\n */\n decodeValue(value) {\n return decodeURIComponent(value);\n }\n}\nfunction paramParser(rawParams, codec) {\n const map = new Map();\n if (rawParams.length > 0) {\n // The `window.location.search` can be used while creating an instance of the `HttpParams` class\n // (e.g. `new HttpParams({ fromString: window.location.search })`). The `window.location.search`\n // may start with the `?` char, so we strip it if it's present.\n const params = rawParams.replace(/^\\?/, '').split('&');\n params.forEach((param) => {\n const eqIdx = param.indexOf('=');\n const [key, val] = eqIdx == -1\n ? [codec.decodeKey(param), '']\n : [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];\n const list = map.get(key) || [];\n list.push(val);\n map.set(key, list);\n });\n }\n return map;\n}\n/**\n * Encode input string with standard encodeURIComponent and then un-encode specific characters.\n */\nconst STANDARD_ENCODING_REGEX = /%(\\d[a-f0-9])/gi;\nconst STANDARD_ENCODING_REPLACEMENTS = {\n '40': '@',\n '3A': ':',\n '24': '$',\n '2C': ',',\n '3B': ';',\n '3D': '=',\n '3F': '?',\n '2F': '/',\n};\nfunction standardEncoding(v) {\n return encodeURIComponent(v).replace(STANDARD_ENCODING_REGEX, (s, t) => STANDARD_ENCODING_REPLACEMENTS[t] ?? s);\n}\nfunction valueToString(value) {\n return `${value}`;\n}\n/**\n * An HTTP request/response body that represents serialized parameters,\n * per the MIME type `application/x-www-form-urlencoded`.\n *\n * This class is immutable; all mutation operations return a new instance.\n *\n * @publicApi\n */\nclass HttpParams {\n map;\n encoder;\n updates = null;\n cloneFrom = null;\n constructor(options = {}) {\n this.encoder = options.encoder || new HttpUrlEncodingCodec();\n if (options.fromString) {\n if (options.fromObject) {\n throw new _RuntimeError(2805 /* RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT */, ngDevMode && 'Cannot specify both fromString and fromObject.');\n }\n this.map = paramParser(options.fromString, this.encoder);\n }\n else if (!!options.fromObject) {\n this.map = new Map();\n Object.keys(options.fromObject).forEach((key) => {\n const value = options.fromObject[key];\n // convert the values to strings\n const values = Array.isArray(value) ? value.map(valueToString) : [valueToString(value)];\n this.map.set(key, values);\n });\n }\n else {\n this.map = null;\n }\n }\n /**\n * Reports whether the body includes one or more values for a given parameter.\n * @param param The parameter name.\n * @returns True if the parameter has one or more values,\n * false if it has no value or is not present.\n */\n has(param) {\n this.init();\n return this.map.has(param);\n }\n /**\n * Retrieves the first value for a parameter.\n * @param param The parameter name.\n * @returns The first value of the given parameter,\n * or `null` if the parameter is not present.\n */\n get(param) {\n this.init();\n const res = this.map.get(param);\n return !!res ? res[0] : null;\n }\n /**\n * Retrieves all values for a parameter.\n * @param param The parameter name.\n * @returns All values in a string array,\n * or `null` if the parameter not present.\n */\n getAll(param) {\n this.init();\n return this.map.get(param) || null;\n }\n /**\n * Retrieves all the parameters for this body.\n * @returns The parameter names in a string array.\n */\n keys() {\n this.init();\n return Array.from(this.map.keys());\n }\n /**\n * Appends a new value to existing values for a parameter.\n * @param param The parameter name.\n * @param value The new value to add.\n * @return A new body with the appended value.\n */\n append(param, value) {\n return this.clone({ param, value, op: 'a' });\n }\n /**\n * Constructs a new body with appended values for the given parameter name.\n * @param params parameters and values\n * @return A new body with the new value.\n */\n appendAll(params) {\n const updates = [];\n Object.keys(params).forEach((param) => {\n const value = params[param];\n if (Array.isArray(value)) {\n value.forEach((_value) => {\n updates.push({ param, value: _value, op: 'a' });\n });\n }\n else {\n updates.push({ param, value: value, op: 'a' });\n }\n });\n return this.clone(updates);\n }\n /**\n * Replaces the value for a parameter.\n * @param param The parameter name.\n * @param value The new value.\n * @return A new body with the new value.\n */\n set(param, value) {\n return this.clone({ param, value, op: 's' });\n }\n /**\n * Removes a given value or all values from a parameter.\n * @param param The parameter name.\n * @param value The value to remove, if provided.\n * @return A new body with the given value removed, or with all values\n * removed if no value is specified.\n */\n delete(param, value) {\n return this.clone({ param, value, op: 'd' });\n }\n /**\n * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are\n * separated by `&`s.\n */\n toString() {\n this.init();\n return (this.keys()\n .map((key) => {\n const eKey = this.encoder.encodeKey(key);\n // `a: ['1']` produces `'a=1'`\n // `b: []` produces `''`\n // `c: ['1', '2']` produces `'c=1&c=2'`\n return this.map.get(key)\n .map((value) => eKey + '=' + this.encoder.encodeValue(value))\n .join('&');\n })\n // filter out empty values because `b: []` produces `''`\n // which results in `a=1&&c=1&c=2` instead of `a=1&c=1&c=2` if we don't\n .filter((param) => param !== '')\n .join('&'));\n }\n clone(update) {\n const clone = new HttpParams({ encoder: this.encoder });\n clone.cloneFrom = this.cloneFrom || this;\n clone.updates = (this.updates || []).concat(update);\n return clone;\n }\n init() {\n if (this.map === null) {\n this.map = new Map();\n }\n if (this.cloneFrom !== null) {\n this.cloneFrom.init();\n this.cloneFrom.keys().forEach((key) => this.map.set(key, this.cloneFrom.map.get(key)));\n this.updates.forEach((update) => {\n switch (update.op) {\n case 'a':\n case 's':\n const base = (update.op === 'a' ? this.map.get(update.param) : undefined) || [];\n base.push(valueToString(update.value));\n this.map.set(update.param, base);\n break;\n case 'd':\n if (update.value !== undefined) {\n let base = this.map.get(update.param) || [];\n const idx = base.indexOf(valueToString(update.value));\n if (idx !== -1) {\n base.splice(idx, 1);\n }\n if (base.length > 0) {\n this.map.set(update.param, base);\n }\n else {\n this.map.delete(update.param);\n }\n }\n else {\n this.map.delete(update.param);\n break;\n }\n }\n });\n this.cloneFrom = this.updates = null;\n }\n }\n}\n\n/**\n * A token used to manipulate and access values stored in `HttpContext`.\n *\n * @publicApi\n */\nclass HttpContextToken {\n defaultValue;\n constructor(defaultValue) {\n this.defaultValue = defaultValue;\n }\n}\n/**\n * Http context stores arbitrary user defined values and ensures type safety without\n * actually knowing the types. It is backed by a `Map` and guarantees that keys do not clash.\n *\n * This context is mutable and is shared between cloned requests unless explicitly specified.\n *\n * @usageNotes\n *\n * ### Usage Example\n *\n * ```ts\n * // inside cache.interceptors.ts\n * export const IS_CACHE_ENABLED = new HttpContextToken<boolean>(() => false);\n *\n * export class CacheInterceptor implements HttpInterceptor {\n *\n * intercept(req: HttpRequest<any>, delegate: HttpHandler): Observable<HttpEvent<any>> {\n * if (req.context.get(IS_CACHE_ENABLED) === true) {\n * return ...;\n * }\n * return delegate.handle(req);\n * }\n * }\n *\n * // inside a service\n *\n * this.httpClient.get('/api/weather', {\n * context: new HttpContext().set(IS_CACHE_ENABLED, true)\n * }).subscribe(...);\n * ```\n *\n * @publicApi\n */\nclass HttpContext {\n map = new Map();\n /**\n * Store a value in the context. If a value is already present it will be overwritten.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n * @param value The value to store.\n *\n * @returns A reference to itself for easy chaining.\n */\n set(token, value) {\n this.map.set(token, value);\n return this;\n }\n /**\n * Retrieve the value associated with the given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns The stored value or default if one is defined.\n */\n get(token) {\n if (!this.map.has(token)) {\n this.map.set(token, token.defaultValue());\n }\n return this.map.get(token);\n }\n /**\n * Delete the value associated with the given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns A reference to itself for easy chaining.\n */\n delete(token) {\n this.map.delete(token);\n return this;\n }\n /**\n * Checks for existence of a given token.\n *\n * @param token The reference to an instance of `HttpContextToken`.\n *\n * @returns True if the token exists, false otherwise.\n */\n has(token) {\n return this.map.has(token);\n }\n /**\n * @returns a list of tokens currently stored in the context.\n */\n keys() {\n return this.map.keys();\n }\n}\n\n/**\n * Determine whether the given HTTP method may include a body.\n */\nfunction mightHaveBody(method) {\n switch (method) {\n case 'DELETE':\n case 'GET':\n case 'HEAD':\n case 'OPTIONS':\n case 'JSONP':\n return false;\n default:\n return true;\n }\n}\n/**\n * Safely assert whether the given value is an ArrayBuffer.\n *\n * In some execution environments ArrayBuffer is not defined.\n */\nfunction isArrayBuffer(value) {\n return typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n}\n/**\n * Safely assert whether the given value is a Blob.\n *\n * In some execution environments Blob is not defined.\n */\nfunction isBlob(value) {\n return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n/**\n * Safely assert whether the given value is a FormData instance.\n *\n * In some execution environments FormData is not defined.\n */\nfunction isFormData(value) {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n/**\n * Safely assert whether the given value is a URLSearchParams instance.\n *\n * In some execution environments URLSearchParams is not defined.\n */\nfunction isUrlSearchParams(value) {\n return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n/**\n * `Content-Type` is an HTTP header used to indicate the media type\n * (also known as MIME type) of the resource being sent to the client\n * or received from the server.\n */\nconst CONTENT_TYPE_HEADER = 'Content-Type';\n/**\n * The `Accept` header is an HTTP request header that indicates the media types\n * (or content types) the client is willing to receive from the server.\n */\nconst ACCEPT_HEADER = 'Accept';\n/**\n * `X-Request-URL` is a custom HTTP header used in older browser versions,\n * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer,\n * to include the full URL of the request in cross-origin requests.\n */\nconst X_REQUEST_URL_HEADER = 'X-Request-URL';\n/**\n * `text/plain` is a content type used to indicate that the content being\n * sent is plain text with no special formatting or structured data\n * like HTML, XML, or JSON.\n */\nconst TEXT_CONTENT_TYPE = 'text/plain';\n/**\n * `application/json` is a content type used to indicate that the content\n * being sent is in the JSON format.\n */\nconst JSON_CONTENT_TYPE = 'application/json';\n/**\n * `application/json, text/plain, *\\/*` is a content negotiation string often seen in the\n * Accept header of HTTP requests. It indicates the types of content the client is willing\n * to accept from the server, with a preference for `application/json` and `text/plain`,\n * but also accepting any other type (*\\/*).\n */\nconst ACCEPT_HEADER_VALUE = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`;\n/**\n * An outgoing HTTP request with an optional typed body.\n *\n * `HttpRequest` represents an outgoing request, including URL, method,\n * headers, body, and other request configuration options. Instances should be\n * assumed to be immutable. To modify a `HttpRequest`, the `clone`\n * method should be used.\n *\n * @publicApi\n */\nclass HttpRequest {\n url;\n /**\n * The request body, or `null` if one isn't set.\n *\n * Bodies are not enforced to be immutable, as they can include a reference to any\n * user-defined data type. However, interceptors should take care to preserve\n * idempotence by treating them as such.\n */\n body = null;\n /**\n * Outgoing headers for this request.\n */\n headers;\n /**\n * Shared and mutable context that can be used by interceptors\n */\n context;\n /**\n * Whether this request should be made in a way that exposes progress events.\n *\n * Progress events are expensive (change detection runs on each event) and so\n * they should only be requested if the consumer intends to monitor them.\n *\n * Note: The `FetchBackend` doesn't support progress report on uploads.\n */\n reportProgress = false;\n /**\n * Whether this request should be sent with outgoing credentials (cookies).\n */\n withCredentials = false;\n /**\n * The credentials mode of the request, which determines how cookies and HTTP authentication are handled.\n * This can affect whether cookies are sent with the request, and how authentication is handled.\n */\n credentials;\n /**\n * When using the fetch implementation and set to `true`, the browser will not abort the associated request if the page that initiated it is unloaded before the request is complete.\n */\n keepalive = false;\n /**\n * Controls how the request will interact with the browser's HTTP cache.\n * This affects whether a response is retrieved from the cache, how it is stored, or if it bypasses the cache altogether.\n */\n cache;\n /**\n * Indicates the relative priority of the request. This may be used by the browser to decide the order in which requests are dispatched and resources fetched.\n */\n priority;\n /**\n * The mode of the request, which determines how the request will interact with the browser's security model.\n * This can affect things like CORS (Cross-Origin Resource Sharing) and same-origin policies.\n */\n mode;\n /**\n * The redirect mode of the request, which determines how redirects are handled.\n * This can affect whether the request follows redirects automatically, or if it fails when a redirect occurs.\n */\n redirect;\n /**\n * The expected response type of the server.\n *\n * This is used to parse the response appropriately before returning it to\n * the requestee.\n */\n responseType = 'json';\n /**\n * The outgoing HTTP request method.\n */\n method;\n /**\n * Outgoing URL parameters.\n *\n * To pass a string representation of HTTP parameters in the URL-query-string format,\n * the `HttpParamsOptions`' `fromString` may be used. For example:\n *\n * ```ts\n * new HttpParams({fromString: 'angular=awesome'})\n * ```\n */\n params;\n /**\n * The outgoing URL with all URL parameters set.\n */\n urlWithParams;\n /**\n * The HttpTransferCache option for the request\n */\n transferCache;\n /**\n * The timeout for the backend HTTP request in ms.\n */\n timeout;\n constructor(method, url, third, fourth) {\n this.url = url;\n this.method = method.toUpperCase();\n // Next, need to figure out which argument holds the HttpRequestInit\n // options, if any.\n let options;\n // Check whether a body argument is expected. The only valid way to omit\n // the body argument is to use a known no-body method like GET.\n if (mightHaveBody(this.method) || !!fourth) {\n // Body is the third argument, options are the fourth.\n this.body = third !== undefined ? third : null;\n options = fourth;\n }\n else {\n // No body required, options are the third argument. The body stays null.\n options = third;\n }\n // If options have been passed, interpret them.\n if (options) {\n // Normalize reportProgress and withCredentials.\n this.reportProgress = !!options.reportProgress;\n this.withCredentials = !!options.withCredentials;\n this.keepalive = !!options.keepalive;\n // Override default response type of 'json' if one is provided.\n if (!!options.responseType) {\n this.responseType = options.responseType;\n }\n // Override headers if they're provided.\n if (options.headers) {\n this.headers = options.headers;\n }\n if (options.context) {\n this.context = options.context;\n }\n if (options.params) {\n this.params = options.params;\n }\n if (options.priority) {\n this.priority = options.priority;\n }\n if (options.cache) {\n this.cache = options.cache;\n }\n if (options.credentials) {\n this.credentials = options.credentials;\n }\n if (typeof options.timeout === 'number') {\n // XHR will ignore any value below 1. AbortSignals only accept unsigned integers.\n if (options.timeout < 1 || !Number.isInteger(options.timeout)) {\n // TODO: create a runtime error\n throw new Error(ngDevMode ? '`timeout` must be a positive integer value' : '');\n }\n this.timeout = options.timeout;\n }\n if (options.mode) {\n this.mode = options.mode;\n }\n if (options.redirect) {\n this.redirect = options.redirect;\n }\n // We do want to assign transferCache even if it's falsy (false is valid value)\n this.transferCache = options.transferCache;\n }\n // If no headers have been passed in, construct a new HttpHeaders instance.\n this.headers ??= new HttpHeaders();\n // If no context have been passed in, construct a new HttpContext instance.\n this.context ??= new HttpContext();\n // If no parameters have been passed in, construct a new HttpUrlEncodedParams instance.\n if (!this.params) {\n this.params = new HttpParams();\n this.urlWithParams = url;\n }\n else {\n // Encode the parameters to a string in preparation for inclusion in the URL.\n const params = this.params.toString();\n if (params.length === 0) {\n // No parameters, the visible URL is just the URL given at creation time.\n this.urlWithParams = url;\n }\n else {\n // Does the URL already have query parameters? Look for '?'.\n const qIdx = url.indexOf('?');\n // There are 3 cases to handle:\n // 1) No existing parameters -> append '?' followed by params.\n // 2) '?' exists and is followed by existing query string ->\n // append '&' followed by params.\n // 3) '?' exists at the end of the url -> append params directly.\n // This basically amounts to determining the character, if any, with\n // which to join the URL and parameters.\n const sep = qIdx === -1 ? '?' : qIdx < url.length - 1 ? '&' : '';\n this.urlWithParams = url + sep + params;\n }\n }\n }\n /**\n * Transform the free-form body into a serialized format suitable for\n * transmission to the server.\n */\n serializeBody() {\n // If no body is present, no need to serialize it.\n if (this.body === null) {\n return null;\n }\n // Check whether the body is already in a serialized form. If so,\n // it can just be returned directly.\n if (typeof this.body === 'string' ||\n isArrayBuffer(this.body) ||\n isBlob(this.body) ||\n isFormData(this.body) ||\n isUrlSearchParams(this.body)) {\n return this.body;\n }\n // Check whether the body is an instance of HttpUrlEncodedParams.\n if (this.body instanceof HttpParams) {\n return this.body.toString();\n }\n // Check whether the body is an object or array, and serialize with JSON if so.\n if (typeof this.body === 'object' ||\n typeof this.body === 'boolean' ||\n Array.isArray(this.body)) {\n return JSON.stringify(this.body);\n }\n // Fall back on toString() for everything else.\n return this.body.toString();\n }\n /**\n * Examine the body and attempt to infer an appropriate MIME type\n * for it.\n *\n * If no such type can be inferred, this method will return `null`.\n */\n detectContentTypeHeader() {\n // An empty body has no content type.\n if (this.body === null) {\n return null;\n }\n // FormData bodies rely on the browser's content type assignment.\n if (isFormData(this.body)) {\n return null;\n }\n // Blobs usually have their own content type. If it doesn't, then\n // no type can be inferred.\n if (isBlob(this.body)) {\n return this.body.type || null;\n }\n // Array buffers have unknown contents and thus no type can be inferred.\n if (isArrayBuffer(this.body)) {\n return null;\n }\n // Technically, strings could be a form of JSON data, but it's safe enough\n // to assume they're plain strings.\n if (typeof this.body === 'string') {\n return TEXT_CONTENT_TYPE;\n }\n // `HttpUrlEncodedParams` has its own content-type.\n if (this.body instanceof HttpParams) {\n return 'application/x-www-form-urlencoded;charset=UTF-8';\n }\n // Arrays, objects, boolean and numbers will be encoded as JSON.\n if (typeof this.body === 'object' ||\n typeof this.body === 'number' ||\n typeof this.body === 'boolean') {\n return JSON_CONTENT_TYPE;\n }\n // No type could be inferred.\n return null;\n }\n clone(update = {}) {\n // For method, url, and responseType, take the current value unless\n // it is overridden in the update hash.\n const method = update.method || this.method;\n const url = update.url || this.url;\n const responseType = update.responseType || this.responseType;\n const keepalive = update.keepalive ?? this.keepalive;\n const priority = update.priority || this.priority;\n const cache = update.cache || this.cache;\n const mode = update.mode || this.mode;\n const redirect = update.redirect || this.redirect;\n const credentials = update.credentials || this.credentials;\n // Carefully handle the transferCache to differentiate between\n // `false` and `undefined` in the update args.\n const transferCache = update.transferCache ?? this.transferCache;\n const timeout = update.timeout ?? this.timeout;\n // The body is somewhat special - a `null` value in update.body means\n // whatever current body is present is being overridden with an empty\n // body, whereas an `undefined` value in update.body implies no\n // override.\n const body = update.body !== undefined ? update.body : this.body;\n // Carefully handle the boolean options to differentiate between\n // `false` and `undefined` in the update args.\n const withCredentials = update.withCredentials ?? this.withCredentials;\n const reportProgress = update.reportProgress ?? this.reportProgress;\n // Headers and params may be appended to if `setHeaders` or\n // `setParams` are used.\n let headers = update.headers || this.headers;\n let params = update.params || this.params;\n // Pass on context if needed\n const context = update.context ?? this.context;\n // Check whether the caller has asked to add headers.\n if (update.setHeaders !== undefined) {\n // Set every requested header.\n headers = Object.keys(update.setHeaders).reduce((headers, name) => headers.set(name, update.setHeaders[name]), headers);\n }\n // Check whether the caller has asked to set params.\n if (update.setParams) {\n // Set every requested param.\n params = Object.keys(update.setParams).reduce((params, param) => params.set(param, update.setParams[param]), params);\n }\n // Finally, construct the new HttpRequest using the pieces from above.\n return new HttpRequest(method, url, body, {\n params,\n headers,\n context,\n reportProgress,\n responseType,\n withCredentials,\n transferCache,\n keepalive,\n cache,\n priority,\n timeout,\n mode,\n redirect,\n credentials,\n });\n }\n}\n\n/**\n * Type enumeration for the different kinds of `HttpEvent`.\n *\n * @publicApi\n */\nvar HttpEventType;\n(function (HttpEventType) {\n /**\n * The request was sent out over the wire.\n */\n HttpEventType[HttpEventType[\"Sent\"] = 0] = \"Sent\";\n /**\n * An upload progress event was received.\n *\n * Note: The `FetchBackend` doesn't support progress report on uploads.\n */\n HttpEventType[HttpEventType[\"UploadProgress\"] = 1] = \"UploadProgress\";\n /**\n * The response status code and headers were received.\n */\n HttpEventType[HttpEventType[\"ResponseHeader\"] = 2] = \"ResponseHeader\";\n /**\n * A download progress event was received.\n */\n HttpEventType[HttpEventType[\"DownloadProgress\"] = 3] = \"DownloadProgress\";\n /**\n * The full response including the body was received.\n */\n HttpEventType[HttpEventType[\"Response\"] = 4] = \"Response\";\n /**\n * A custom event from an interceptor or a backend.\n */\n HttpEventType[HttpEventType[\"User\"] = 5] = \"User\";\n})(HttpEventType || (HttpEventType = {}));\n/**\n * Base class for both `HttpResponse` and `HttpHeaderResponse`.\n *\n * @publicApi\n */\nclass HttpResponseBase {\n /**\n * All response headers.\n */\n headers;\n /**\n * Response status code.\n */\n status;\n /**\n * Textual description of response status code, defaults to OK.\n *\n * Do not depend on this.\n */\n statusText;\n /**\n * URL of the resource retrieved, or null if not available.\n */\n url;\n /**\n * Whether the status code falls in the 2xx range.\n */\n ok;\n /**\n * Type of the response, narrowed to either the full response or the header.\n */\n type;\n /**\n * Super-constructor for all responses.\n *\n * The single parameter accepted is an initialization hash. Any properties\n * of the response passed there will override the default values.\n */\n constructor(init, defaultStatus = 200, defaultStatusText = 'OK') {\n // If the hash has values passed, use them to initialize the response.\n // Otherwise use the default values.\n this.headers = init.headers || new HttpHeaders();\n this.status = init.status !== undefined ? init.status : defaultStatus;\n this.statusText = init.statusText || defaultStatusText;\n this.url = init.url || null;\n // Cache the ok value to avoid defining a getter.\n this.ok = this.status >= 200 && this.status < 300;\n }\n}\n/**\n * A partial HTTP response which only includes the status and header data,\n * but no response body.\n *\n * `HttpHeaderResponse` is a `HttpEvent` available on the response\n * event stream, only when progress events are requested.\n *\n * @publicApi\n */\nclass HttpHeaderResponse extends HttpResponseBase {\n /**\n * Create a new `HttpHeaderResponse` with the given parameters.\n */\n constructor(init = {}) {\n super(init);\n }\n type = HttpEventType.ResponseHeader;\n /**\n * Copy this `HttpHeaderResponse`, overriding its contents with the\n * given parameter hash.\n */\n clone(update = {}) {\n // Perform a straightforward initialization of the new HttpHeaderResponse,\n // overriding the current parameters with new ones if given.\n return new HttpHeaderResponse({\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined,\n });\n }\n}\n/**\n * A full HTTP response, including a typed response body (which may be `null`\n * if one was not returned).\n *\n * `HttpResponse` is a `HttpEvent` available on the response event\n * stream.\n *\n * @publicApi\n */\nclass HttpResponse extends HttpResponseBase {\n /**\n * The response body, or `null` if one was not returned.\n */\n body;\n /**\n * Construct a new `HttpResponse`.\n */\n constructor(init = {}) {\n super(init);\n this.body = init.body !== undefined ? init.body : null;\n }\n type = HttpEventType.Response;\n clone(update = {}) {\n return new HttpResponse({\n body: update.body !== undefined ? update.body : this.body,\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined,\n });\n }\n}\n/**\n * A response that represents an error or failure, either from a\n * non-successful HTTP status, an error while executing the request,\n * or some other failure which occurred during the parsing of the response.\n *\n * Any error returned on the `Observable` response stream will be\n * wrapped in an `HttpErrorResponse` to provide additional context about\n * the state of the HTTP layer when the error occurred. The error property\n * will contain either a wrapped Error object or the error response returned\n * from the server.\n *\n * @publicApi\n */\nclass HttpErrorResponse extends HttpResponseBase {\n name = 'HttpErrorResponse';\n message;\n error;\n /**\n * Errors are never okay, even when the status code is in the 2xx success range.\n */\n ok = false;\n constructor(init) {\n // Initialize with a default status of 0 / Unknown Error.\n super(init, 0, 'Unknown Error');\n // If the response was successful, then this was a parse error. Otherwise, it was\n // a protocol-level failure of some sort. Either the request failed in transit\n // or the server returned an unsuccessful status code.\n if (this.status >= 200 && this.status < 300) {\n this.message = `Http failure during parsing for ${init.url || '(unknown url)'}`;\n }\n else {\n this.message = `Http failure response for ${init.url || '(unknown url)'}: ${init.status} ${init.statusText}`;\n }\n this.error = init.error || null;\n }\n}\n/**\n * We use these constant to prevent pulling the whole HttpStatusCode enum\n * Those are the only ones referenced directly by the framework\n */\nconst HTTP_STATUS_CODE_OK = 200;\nconst HTTP_STATUS_CODE_NO_CONTENT = 204;\n/**\n * Http status codes.\n * As per https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n * @publicApi\n */\nvar HttpStatusCode;\n(function (HttpStatusCode) {\n HttpStatusCode[HttpStatusCode[\"Continue\"] = 100] = \"Continue\";\n HttpStatusCode[HttpStatusCode[\"SwitchingProtocols\"] = 101] = \"SwitchingProtocols\";\n HttpStatusCode[HttpStatusCode[\"Processing\"] = 102] = \"Processing\";\n HttpStatusCode[HttpStatusCode[\"EarlyHints\"] = 103] = \"EarlyHints\";\n HttpStatusCode[HttpStatusCode[\"Ok\"] = 200] = \"Ok\";\n HttpStatusCode[HttpStatusCode[\"Created\"] = 201] = \"Created\";\n HttpStatusCode[HttpStatusCode[\"Accepted\"] = 202] = \"Accepted\";\n HttpStatusCode[HttpStatusCode[\"NonAuthoritativeInformation\"] = 203] = \"NonAuthoritativeInformation\";\n HttpStatusCode[HttpStatusCode[\"NoContent\"] = 204] = \"NoContent\";\n HttpStatusCode[HttpStatusCode[\"ResetContent\"] = 205] = \"ResetContent\";\n HttpStatusCode[HttpStatusCode[\"PartialContent\"] = 206] = \"PartialContent\";\n HttpStatusCode[HttpStatusCode[\"MultiStatus\"] = 207] = \"MultiStatus\";\n HttpStatusCode[HttpStatusCode[\"AlreadyReported\"] = 208] = \"AlreadyReported\";\n HttpStatusCode[HttpStatusCode[\"ImUsed\"] = 226] = \"ImUsed\";\n HttpStatusCode[HttpStatusCode[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpStatusCode[HttpStatusCode[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpStatusCode[HttpStatusCode[\"Found\"] = 302] = \"Found\";\n HttpStatusCode[HttpStatusCode[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpStatusCode[HttpStatusCode[\"NotModified\"] = 304] = \"NotModified\";\n HttpStatusCode[HttpStatusCode[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpStatusCode[HttpStatusCode[\"Unused\"] = 306] = \"Unused\";\n HttpStatusCode[HttpStatusCode[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpStatusCode[HttpStatusCode[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpStatusCode[HttpStatusCode[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpStatusCode[HttpStatusCode[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpStatusCode[HttpStatusCode[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpStatusCode[HttpStatusCode[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpStatusCode[HttpStatusCode[\"NotFound\"] = 404] = \"NotFound\";\n HttpStatusCode[HttpStatusCode[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpStatusCode[HttpStatusCode[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpStatusCode[HttpStatusCode[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpStatusCode[HttpStatusCode[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpStatusCode[HttpStatusCode[\"Conflict\"] = 409] = \"Conflict\";\n HttpStatusCode[HttpStatusCode[\"Gone\"] = 410] = \"Gone\";\n HttpStatusCode[HttpStatusCode[\"LengthRequired\"] = 411] = \"LengthRequired\";\n HttpStatusCode[HttpStatusCode[\"PreconditionFailed\"] = 412] = \"PreconditionFailed\";\n HttpStatusCode[HttpStatusCode[\"PayloadTooLarge\"] = 413] = \"PayloadTooLarge\";\n HttpStatusCode[HttpStatusCode[\"UriTooLong\"] = 414] = \"UriTooLong\";\n HttpStatusCode[HttpStatusCode[\"UnsupportedMediaType\"] = 415] = \"UnsupportedMediaType\";\n HttpStatusCode[HttpStatusCode[\"RangeNotSatisfiable\"] = 416] = \"RangeNotSatisfiable\";\n HttpStatusCode[HttpStatusCode[\"ExpectationFailed\"] = 417] = \"ExpectationFailed\";\n HttpStatusCode[HttpStatusCode[\"ImATeapot\"] = 418] = \"ImATeapot\";\n HttpStatusCode[HttpStatusCode[\"MisdirectedRequest\"] = 421] = \"MisdirectedRequest\";\n HttpStatusCode[HttpStatusCode[\"UnprocessableEntity\"] = 422] = \"UnprocessableEntity\";\n HttpStatusCode[HttpStatusCode[\"Locked\"] = 423] = \"Locked\";\n HttpStatusCode[HttpStatusCode[\"FailedDependency\"] = 424] = \"FailedDependency\";\n HttpStatusCode[HttpStatusCode[\"TooEarly\"] = 425] = \"TooEarly\";\n HttpStatusCode[HttpStatusCode[\"UpgradeRequired\"] = 426] = \"UpgradeRequired\";\n HttpStatusCode[HttpStatusCode[\"PreconditionRequired\"] = 428] = \"PreconditionRequired\";\n HttpStatusCode[HttpStatusCode[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpStatusCode[HttpStatusCode[\"RequestHeaderFieldsTooLarge\"] = 431] = \"RequestHeaderFieldsTooLarge\";\n HttpStatusCode[HttpStatusCode[\"UnavailableForLegalReasons\"] = 451] = \"UnavailableForLegalReasons\";\n HttpStatusCode[HttpStatusCode[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpStatusCode[HttpStatusCode[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpStatusCode[HttpStatusCode[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpStatusCode[HttpStatusCode[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpStatusCode[HttpStatusCode[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n HttpStatusCode[HttpStatusCode[\"HttpVersionNotSupported\"] = 505] = \"HttpVersionNotSupported\";\n HttpStatusCode[HttpStatusCode[\"VariantAlsoNegotiates\"] = 506] = \"VariantAlsoNegotiates\";\n HttpStatusCode[HttpStatusCode[\"InsufficientStorage\"] = 507] = \"InsufficientStorage\";\n HttpStatusCode[HttpStatusCode[\"LoopDetected\"] = 508] = \"LoopDetected\";\n HttpStatusCode[HttpStatusCode[\"NotExtended\"] = 510] = \"NotExtended\";\n HttpStatusCode[HttpStatusCode[\"NetworkAuthenticationRequired\"] = 511] = \"NetworkAuthenticationRequired\";\n})(HttpStatusCode || (HttpStatusCode = {}));\n\n/**\n * Constructs an instance of `HttpRequestOptions<T>` from a source `HttpMethodOptions` and\n * the given `body`. This function clones the object and adds the body.\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n */\nfunction addBody(options, body) {\n return {\n body,\n headers: options.headers,\n context: options.context,\n observe: options.observe,\n params: options.params,\n reportProgress: options.reportProgress,\n responseType: options.responseType,\n withCredentials: options.withCredentials,\n transferCache: options.transferCache,\n keepalive: options.keepalive,\n priority: options.priority,\n cache: options.cache,\n mode: options.mode,\n redirect: options.redirect,\n };\n}\n/**\n * Performs HTTP requests.\n * This service is available as an injectable class, with methods to perform HTTP requests.\n * Each request method has multiple signatures, and the return type varies based on\n * the signature that is called (mainly the values of `observe` and `responseType`).\n *\n * Note that the `responseType` *options* value is a String that identifies the\n * single data type of the response.\n * A single overload version of the method handles each response type.\n * The value of `responseType` cannot be a union, as the combined signature could imply.\n *\n * @usageNotes\n *\n * ### HTTP Request Example\n *\n * ```ts\n * // GET heroes whose name contains search term\n * searchHeroes(term: string): observable<Hero[]>{\n *\n * const params = new HttpParams({fromString: 'name=term'});\n * return this.httpClient.request('GET', this.heroesUrl, {responseType:'json', params});\n * }\n * ```\n *\n * Alternatively, the parameter string can be used without invoking HttpParams\n * by directly joining to the URL.\n * ```ts\n * this.httpClient.request('GET', this.heroesUrl + '?' + 'name=term', {responseType:'json'});\n * ```\n *\n *\n * ### JSONP Example\n * ```ts\n * requestJsonp(url, callback = 'callback') {\n * return this.httpClient.jsonp(this.heroesURL, callback);\n * }\n * ```\n *\n * ### PATCH Example\n * ```ts\n * // PATCH one of the heroes' name\n * patchHero (id: number, heroName: string): Observable<{}> {\n * const url = `${this.heroesUrl}/${id}`; // PATCH api/heroes/42\n * return this.httpClient.patch(url, {name: heroName}, httpOptions)\n * .pipe(catchError(this.handleError('patchHero')));\n * }\n * ```\n *\n * @see [HTTP Guide](guide/http)\n * @see [HTTP Request](api/common/http/HttpRequest)\n *\n * @publicApi\n */\nclass HttpClient {\n handler;\n constructor(handler) {\n this.handler = handler;\n }\n /**\n * Constructs an observable for a generic HTTP request that, when subscribed,\n * fires the request through the chain of registered interceptors and on to the\n * server.\n *\n * You can pass an `HttpRequest` directly as the only parameter. In this case,\n * the call returns an observable of the raw `HttpEvent` stream.\n *\n * Alternatively you can pass an HTTP method as the first parameter,\n * a URL string as the second, and an options hash containing the request body as the third.\n * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the\n * type of returned observable.\n * * The `responseType` value determines how a successful response body is parsed.\n * * If `responseType` is the default `json`, you can pass a type interface for the resulting\n * object as a type parameter to the call.\n *\n * The `observe` value determines the return type, according to what you are interested in\n * observing.\n * * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including\n * progress events by default.\n * * An `observe` value of response returns an observable of `HttpResponse<T>`,\n * where the `T` parameter depends on the `responseType` and any optionally provided type\n * parameter.\n * * An `observe` value of body returns an observable of `<T>` with the same `T` body type.\n *\n */\n request(first, url, options = {}) {\n let req;\n // First, check whether the primary argument is an instance of `HttpRequest`.\n if (first instanceof HttpRequest) {\n // It is. The other arguments must be undefined (per the signatures) and can be\n // ignored.\n req = first;\n }\n else {\n // It's a string, so it represents a URL. Construct a request based on it,\n // and incorporate the remaining arguments (assuming `GET` unless a method is\n // provided.\n // Figure out the headers.\n let headers = undefined;\n if (options.headers instanceof HttpHeaders) {\n headers = options.headers;\n }\n else {\n headers = new HttpHeaders(options.headers);\n }\n // Sort out parameters.\n let params = undefined;\n if (!!options.params) {\n if (options.params instanceof HttpParams) {\n params = options.params;\n }\n else {\n params = new HttpParams({ fromObject: options.params });\n }\n }\n // Construct the request.\n req = new HttpRequest(first, url, options.body !== undefined ? options.body : null, {\n headers,\n context: options.context,\n params,\n reportProgress: options.reportProgress,\n // By default, JSON is assumed to be returned for all calls.\n responseType: options.responseType || 'json',\n withCredentials: options.withCredentials,\n transferCache: options.transferCache,\n keepalive: options.keepalive,\n priority: options.priority,\n cache: options.cache,\n mode: options.mode,\n redirect: options.redirect,\n credentials: options.credentials,\n });\n }\n // Start with an Observable.of() the initial request, and run the handler (which\n // includes all interceptors) inside a concatMap(). This way, the handler runs\n // inside an Observable chain, which causes interceptors to be re-run on every\n // subscription (this also makes retries re-run the handler, including interceptors).\n const events$ = of(req).pipe(concatMap((req) => this.handler.handle(req)));\n // If coming via the API signature which accepts a previously constructed HttpRequest,\n // the only option is to get the event stream. Otherwise, return the event stream if\n // that is what was requested.\n if (first instanceof HttpRequest || options.observe === 'events') {\n return events$;\n }\n // The requested stream contains either the full response or the body. In either\n // case, the first step is to filter the event stream to extract a stream of\n // responses(s).\n const res$ = (events$.pipe(filter((event) => event instanceof HttpResponse)));\n // Decide which stream to return.\n switch (options.observe || 'body') {\n case 'body':\n // The requested stream is the body. Map the response stream to the response\n // body. This could be done more simply, but a misbehaving interceptor might\n // transform the response body into a different format and ignore the requested\n // responseType. Guard against this by validating that the response is of the\n // requested type.\n switch (req.responseType) {\n case 'arraybuffer':\n return res$.pipe(map((res) => {\n // Validate that the body is an ArrayBuffer.\n if (res.body !== null && !(res.body instanceof ArrayBuffer)) {\n throw new _RuntimeError(2806 /* RuntimeErrorCode.RESPONSE_IS_NOT_AN_ARRAY_BUFFER */, ngDevMode && 'Response is not an ArrayBuffer.');\n }\n return res.body;\n }));\n case 'blob':\n return res$.pipe(map((res) => {\n // Validate that the body is a Blob.\n if (res.body !== null && !(res.body instanceof Blob)) {\n throw new _RuntimeError(2807 /* RuntimeErrorCode.RESPONSE_IS_NOT_A_BLOB */, ngDevMode && 'Response is not a Blob.');\n }\n return res.body;\n }));\n case 'text':\n return res$.pipe(map((res) => {\n // Validate that the body is a string.\n if (res.body !== null && typeof res.body !== 'string') {\n throw new _RuntimeError(2808 /* RuntimeErrorCode.RESPONSE_IS_NOT_A_STRING */, ngDevMode && 'Response is not a string.');\n }\n return res.body;\n }));\n case 'json':\n default:\n // No validation needed for JSON responses, as they can be of any type.\n return res$.pipe(map((res) => res.body));\n }\n case 'response':\n // The response stream was requested directly, so return it.\n return res$;\n default:\n // Guard against new future observe types being added.\n throw new _RuntimeError(2809 /* RuntimeErrorCode.UNHANDLED_OBSERVE_TYPE */, ngDevMode && `Unreachable: unhandled observe type ${options.observe}}`);\n }\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `DELETE` request to execute on the server. See the individual overloads for\n * details on the return type.\n *\n * @param url The endpoint URL.\n * @param options The HTTP options to send with the request.\n *\n */\n delete(url, options = {}) {\n return this.request('DELETE', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `GET` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n get(url, options = {}) {\n return this.request('GET', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `HEAD` request to execute on the server. The `HEAD` method returns\n * meta information about the resource without transferring the\n * resource itself. See the individual overloads for\n * details on the return type.\n */\n head(url, options = {}) {\n return this.request('HEAD', url, options);\n }\n /**\n * Constructs an `Observable` that, when subscribed, causes a request with the special method\n * `JSONP` to be dispatched via the interceptor pipeline.\n * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain\n * API endpoints that don't support newer,\n * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.\n * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the\n * requests even if the API endpoint is not located on the same domain (origin) as the client-side\n * application making the request.\n * The endpoint API must support JSONP callback for JSONP requests to work.\n * The resource API returns the JSON response wrapped in a callback function.\n * You can pass the callback function name as one of the query parameters.\n * Note that JSONP requests can only be used with `GET` requests.\n *\n * @param url The resource URL.\n * @param callbackParam The callback function name.\n *\n */\n jsonp(url, callbackParam) {\n return this.request('JSONP', url, {\n params: new HttpParams().append(callbackParam, 'JSONP_CALLBACK'),\n observe: 'body',\n responseType: 'json',\n });\n }\n /**\n * Constructs an `Observable` that, when subscribed, causes the configured\n * `OPTIONS` request to execute on the server. This method allows the client\n * to determine the supported HTTP methods and other capabilities of an endpoint,\n * without implying a resource action. See the individual overloads for\n * details on the return type.\n */\n options(url, options = {}) {\n return this.request('OPTIONS', url, options);\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PATCH` request to execute on the server. See the individual overloads for\n * details on the return type.\n */\n patch(url, body, options = {}) {\n return this.request('PATCH', url, addBody(options, body));\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `POST` request to execute on the server. The server responds with the location of\n * the replaced resource. See the individual overloads for\n * details on the return type.\n */\n post(url, body, options = {}) {\n return this.request('POST', url, addBody(options, body));\n }\n /**\n * Constructs an observable that, when subscribed, causes the configured\n * `PUT` request to execute on the server. The `PUT` method replaces an existing resource\n * with a new set of values.\n * See the individual overloads for details on the return type.\n */\n put(url, body, options = {}) {\n return this.request('PUT', url, addBody(options, body));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClient, deps: [{ token: HttpHandler }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClient });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClient, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: HttpHandler }] });\n\nconst XSSI_PREFIX$1 = /^\\)\\]\\}',?\\n/;\n/**\n * Determine an appropriate URL for the response, by checking either\n * response url or the X-Request-URL header.\n */\nfunction getResponseUrl$1(response) {\n if (response.url) {\n return response.url;\n }\n // stored as lowercase in the map\n const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase();\n return response.headers.get(xRequestUrl);\n}\n/**\n * An internal injection token to reference `FetchBackend` implementation\n * in a tree-shakable way.\n */\nconst FETCH_BACKEND = new InjectionToken(typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '');\n/**\n * Uses `fetch` to send requests to a backend server.\n *\n * This `FetchBackend` requires the support of the\n * [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) which is available on all\n * supported browsers and on Node.js v18 or later.\n *\n * @see {@link HttpHandler}\n *\n * @publicApi\n */\nclass FetchBackend {\n // We use an arrow function to always reference the current global implementation of `fetch`.\n // This is helpful for cases when the global `fetch` implementation is modified by external code,\n // see https://github.com/angular/angular/issues/57527.\n fetchImpl = inject(FetchFactory, { optional: true })?.fetch ?? ((...args) => globalThis.fetch(...args));\n ngZone = inject(NgZone);\n destroyRef = inject(DestroyRef);\n destroyed = false;\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.destroyed = true;\n });\n }\n handle(request) {\n return new Observable((observer) => {\n const aborter = new AbortController();\n this.doRequest(request, aborter.signal, observer).then(noop, (error) => observer.error(new HttpErrorResponse({ error })));\n let timeoutId;\n if (request.timeout) {\n // TODO: Replace with AbortSignal.any([aborter.signal, AbortSignal.timeout(request.timeout)])\n // when AbortSignal.any support is Baseline widely available (NET nov. 2026)\n timeoutId = this.ngZone.runOutsideAngular(() => setTimeout(() => {\n if (!aborter.signal.aborted) {\n aborter.abort(new DOMException('signal timed out', 'TimeoutError'));\n }\n }, request.timeout));\n }\n return () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n aborter.abort();\n };\n });\n }\n async doRequest(request, signal, observer) {\n const init = this.createRequestInit(request);\n let response;\n try {\n // Run fetch outside of Angular zone.\n // This is due to Node.js fetch implementation (Undici) which uses a number of setTimeouts to check if\n // the response should eventually timeout which causes extra CD cycles every 500ms\n const fetchPromise = this.ngZone.runOutsideAngular(() => this.fetchImpl(request.urlWithParams, { signal, ...init }));\n // Make sure Zone.js doesn't trigger false-positive unhandled promise\n // error in case the Promise is rejected synchronously. See function\n // description for additional information.\n silenceSuperfluousUnhandledPromiseRejection(fetchPromise);\n // Send the `Sent` event before awaiting the response.\n observer.next({ type: HttpEventType.Sent });\n response = await fetchPromise;\n }\n catch (error) {\n observer.error(new HttpErrorResponse({\n error,\n status: error.status ?? 0,\n statusText: error.statusText,\n url: request.urlWithParams,\n headers: error.headers,\n }));\n return;\n }\n const headers = new HttpHeaders(response.headers);\n const statusText = response.statusText;\n const url = getResponseUrl$1(response) ?? request.urlWithParams;\n let status = response.status;\n let body = null;\n if (request.reportProgress) {\n observer.next(new HttpHeaderResponse({ headers, status, statusText, url }));\n }\n if (response.body) {\n // Read Progress\n const contentLength = response.headers.get('content-length');\n const chunks = [];\n const reader = response.body.getReader();\n let receivedLength = 0;\n let decoder;\n let partialText;\n // We have to check whether the Zone is defined in the global scope because this may be called\n // when the zone is nooped.\n const reqZone = typeof Zone !== 'undefined' && Zone.current;\n let canceled = false;\n // Perform response processing outside of Angular zone to\n // ensure no excessive change detection runs are executed\n // Here calling the async ReadableStreamDefaultReader.read() is responsible for triggering CD\n await this.ngZone.runOutsideAngular(async () => {\n while (true) {\n // Prevent reading chunks if the app is destroyed. Otherwise, we risk doing\n // unnecessary work or triggering side effects after teardown.\n // This may happen if the app was explicitly destroyed before\n // the response returned entirely.\n if (this.destroyed) {\n // Streams left in a pending state (due to `break` without cancel) may\n // continue consuming or holding onto data behind the scenes.\n // Calling `reader.cancel()` allows the browser or the underlying\n // system to release any network or memory resources associated with the stream.\n await reader.cancel();\n canceled = true;\n break;\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n receivedLength += value.length;\n if (request.reportProgress) {\n partialText =\n request.responseType === 'text'\n ? (partialText ?? '') +\n (decoder ??= new TextDecoder()).decode(value, { stream: true })\n : undefined;\n const reportProgress = () => observer.next({\n type: HttpEventType.DownloadProgress,\n total: contentLength ? +contentLength : undefined,\n loaded: receivedLength,\n partialText,\n });\n reqZone ? reqZone.run(reportProgress) : reportProgress();\n }\n }\n });\n // We need to manage the canceled state — because the Streams API does not\n // expose a direct `.state` property on the reader.\n // We need to `return` because `parseBody` may not be able to parse chunks\n // that were only partially read (due to cancellation caused by app destruction).\n if (canceled) {\n observer.complete();\n return;\n }\n // Combine all chunks.\n const chunksAll = this.concatChunks(chunks, receivedLength);\n try {\n const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? '';\n body = this.parseBody(request, chunksAll, contentType, status);\n }\n catch (error) {\n // Body loading or parsing failed\n observer.error(new HttpErrorResponse({\n error,\n headers: new HttpHeaders(response.headers),\n status: response.status,\n statusText: response.statusText,\n url: getResponseUrl$1(response) ?? request.urlWithParams,\n }));\n return;\n }\n }\n // Same behavior as the XhrBackend\n if (status === 0) {\n status = body ? HTTP_STATUS_CODE_OK : 0;\n }\n // ok determines whether the response will be transmitted on the event or\n // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n // but a successful status code can still result in an error if the user\n // asked for JSON data and the body cannot be parsed as such.\n const ok = status >= 200 && status < 300;\n if (ok) {\n observer.next(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url,\n }));\n // The full body has been received and delivered, no further events\n // are possible. This request is complete.\n observer.complete();\n }\n else {\n observer.error(new HttpErrorResponse({\n error: body,\n headers,\n status,\n statusText,\n url,\n }));\n }\n }\n parseBody(request, binContent, contentType, status) {\n switch (request.responseType) {\n case 'json':\n // stripping the XSSI when present\n const text = new TextDecoder().decode(binContent).replace(XSSI_PREFIX$1, '');\n if (text === '') {\n return null;\n }\n try {\n return JSON.parse(text);\n }\n catch (e) {\n // Allow handling non-JSON errors (!) as plain text, same as the XHR\n // backend. Without this special sauce, any non-JSON error would be\n // completely inaccessible downstream as the `HttpErrorResponse.error`\n // would be set to the `SyntaxError` from then failing `JSON.parse`.\n if (status < 200 || status >= 300) {\n return text;\n }\n throw e;\n }\n case 'text':\n return new TextDecoder().decode(binContent);\n case 'blob':\n return new Blob([binContent], { type: contentType });\n case 'arraybuffer':\n return binContent.buffer;\n }\n }\n createRequestInit(req) {\n // We could share some of this logic with the XhrBackend\n const headers = {};\n let credentials;\n // If the request has a credentials property, use it.\n // Otherwise, if the request has withCredentials set to true, use 'include'.\n credentials = req.credentials;\n // If withCredentials is true should be set to 'include', for compatibility\n if (req.withCredentials) {\n // A warning is logged in development mode if the request has both\n (typeof ngDevMode === 'undefined' || ngDevMode) && warningOptionsMessage(req);\n credentials = 'include';\n }\n // Setting all the requested headers.\n req.headers.forEach((name, values) => (headers[name] = values.join(',')));\n // Add an Accept header if one isn't present already.\n if (!req.headers.has(ACCEPT_HEADER)) {\n headers[ACCEPT_HEADER] = ACCEPT_HEADER_VALUE;\n }\n // Auto-detect the Content-Type header if one isn't present already.\n if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n const detectedType = req.detectContentTypeHeader();\n // Sometimes Content-Type detection fails.\n if (detectedType !== null) {\n headers[CONTENT_TYPE_HEADER] = detectedType;\n }\n }\n return {\n body: req.serializeBody(),\n method: req.method,\n headers,\n credentials,\n keepalive: req.keepalive,\n cache: req.cache,\n priority: req.priority,\n mode: req.mode,\n redirect: req.redirect,\n };\n }\n concatChunks(chunks, totalLength) {\n const chunksAll = new Uint8Array(totalLength);\n let position = 0;\n for (const chunk of chunks) {\n chunksAll.set(chunk, position);\n position += chunk.length;\n }\n return chunksAll;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: FetchBackend, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: FetchBackend });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: FetchBackend, decorators: [{\n type: Injectable\n }], ctorParameters: () => [] });\n/**\n * Abstract class to provide a mocked implementation of `fetch()`\n */\nclass FetchFactory {\n}\nfunction noop() { }\nfunction warningOptionsMessage(req) {\n if (req.credentials && req.withCredentials) {\n console.warn(_formatRuntimeError(2819 /* RuntimeErrorCode.WITH_CREDENTIALS_OVERRIDES_EXPLICIT_CREDENTIALS */, `Angular detected that a \\`HttpClient\\` request has both \\`withCredentials: true\\` and \\`credentials: '${req.credentials}'\\` options. The \\`withCredentials\\` option is overriding the explicit \\`credentials\\` setting to 'include'. Consider removing \\`withCredentials\\` and using \\`credentials: '${req.credentials}'\\` directly for clarity.`));\n }\n}\n/**\n * Zone.js treats a rejected promise that has not yet been awaited\n * as an unhandled error. This function adds a noop `.then` to make\n * sure that Zone.js doesn't throw an error if the Promise is rejected\n * synchronously.\n */\nfunction silenceSuperfluousUnhandledPromiseRejection(promise) {\n promise.then(noop, noop);\n}\n\nfunction interceptorChainEndFn(req, finalHandlerFn) {\n return finalHandlerFn(req);\n}\n/**\n * Constructs a `ChainedInterceptorFn` which adapts a legacy `HttpInterceptor` to the\n * `ChainedInterceptorFn` interface.\n */\nfunction adaptLegacyInterceptorToChain(chainTailFn, interceptor) {\n return (initialRequest, finalHandlerFn) => interceptor.intercept(initialRequest, {\n handle: (downstreamRequest) => chainTailFn(downstreamRequest, finalHandlerFn),\n });\n}\n/**\n * Constructs a `ChainedInterceptorFn` which wraps and invokes a functional interceptor in the given\n * injector.\n */\nfunction chainedInterceptorFn(chainTailFn, interceptorFn, injector) {\n return (initialRequest, finalHandlerFn) => runInInjectionContext(injector, () => interceptorFn(initialRequest, (downstreamRequest) => chainTailFn(downstreamRequest, finalHandlerFn)));\n}\n/**\n * A multi-provider token that represents the array of registered\n * `HttpInterceptor` objects.\n *\n * @publicApi\n */\nconst HTTP_INTERCEPTORS = new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTORS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s.\n */\nconst HTTP_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? 'HTTP_INTERCEPTOR_FNS' : '');\n/**\n * A multi-provided token of `HttpInterceptorFn`s that are only set in root.\n */\nconst HTTP_ROOT_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? 'HTTP_ROOT_INTERCEPTOR_FNS' : '');\n// TODO(atscott): We need a larger discussion about stability and what should contribute to stability.\n// Should the whole interceptor chain contribute to stability or just the backend request #55075?\n// Should HttpClient contribute to stability automatically at all?\nconst REQUESTS_CONTRIBUTE_TO_STABILITY = new InjectionToken(ngDevMode ? 'REQUESTS_CONTRIBUTE_TO_STABILITY' : '', { providedIn: 'root', factory: () => true });\n/**\n * Creates an `HttpInterceptorFn` which lazily initializes an interceptor chain from the legacy\n * class-based interceptors and runs the request through it.\n */\nfunction legacyInterceptorFnFactory() {\n let chain = null;\n return (req, handler) => {\n if (chain === null) {\n const interceptors = inject(HTTP_INTERCEPTORS, { optional: true }) ?? [];\n // Note: interceptors are wrapped right-to-left so that final execution order is\n // left-to-right. That is, if `interceptors` is the array `[a, b, c]`, we want to\n // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n // out.\n chain = interceptors.reduceRight(adaptLegacyInterceptorToChain, interceptorChainEndFn);\n }\n const pendingTasks = inject(PendingTasks);\n const contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n if (contributeToStability) {\n const removeTask = pendingTasks.add();\n return chain(req, handler).pipe(finalize(removeTask));\n }\n else {\n return chain(req, handler);\n }\n };\n}\nlet fetchBackendWarningDisplayed = false;\nclass HttpInterceptorHandler extends HttpHandler {\n backend;\n injector;\n chain = null;\n pendingTasks = inject(PendingTasks);\n contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);\n constructor(backend, injector) {\n super();\n this.backend = backend;\n this.injector = injector;\n // We strongly recommend using fetch backend for HTTP calls when SSR is used\n // for an application. The logic below checks if that's the case and produces\n // a warning otherwise.\n if ((typeof ngDevMode === 'undefined' || ngDevMode) && !fetchBackendWarningDisplayed) {\n // This flag is necessary because provideHttpClientTesting() overrides the backend\n // even if `withFetch()` is used within the test. When the testing HTTP backend is provided,\n // no HTTP calls are actually performed during the test, so producing a warning would be\n // misleading.\n const isTestingBackend = this.backend.isTestingBackend;\n if (typeof ngServerMode !== 'undefined' &&\n ngServerMode &&\n !(this.backend instanceof FetchBackend) &&\n !isTestingBackend) {\n fetchBackendWarningDisplayed = true;\n injector\n .get(_Console)\n .warn(_formatRuntimeError(2801 /* RuntimeErrorCode.NOT_USING_FETCH_BACKEND_IN_SSR */, 'Angular detected that `HttpClient` is not configured ' +\n \"to use `fetch` APIs. It's strongly recommended to \" +\n 'enable `fetch` for applications that use Server-Side Rendering ' +\n 'for better performance and compatibility. ' +\n 'To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` ' +\n 'call at the root of the application.'));\n }\n }\n }\n handle(initialRequest) {\n if (this.chain === null) {\n const dedupedInterceptorFns = Array.from(new Set([\n ...this.injector.get(HTTP_INTERCEPTOR_FNS),\n ...this.injector.get(HTTP_ROOT_INTERCEPTOR_FNS, []),\n ]));\n // Note: interceptors are wrapped right-to-left so that final execution order is\n // left-to-right. That is, if `dedupedInterceptorFns` is the array `[a, b, c]`, we want to\n // produce a chain that is conceptually `c(b(a(end)))`, which we build from the inside\n // out.\n this.chain = dedupedInterceptorFns.reduceRight((nextSequencedFn, interceptorFn) => chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector), interceptorChainEndFn);\n }\n if (this.contributeToStability) {\n const removeTask = this.pendingTasks.add();\n return this.chain(initialRequest, (downstreamRequest) => this.backend.handle(downstreamRequest)).pipe(finalize(removeTask));\n }\n else {\n return this.chain(initialRequest, (downstreamRequest) => this.backend.handle(downstreamRequest));\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpInterceptorHandler, deps: [{ token: HttpBackend }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpInterceptorHandler });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpInterceptorHandler, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: HttpBackend }, { type: i0.EnvironmentInjector }] });\n\n// Every request made through JSONP needs a callback name that's unique across the\n// whole page. Each request is assigned an id and the callback name is constructed\n// from that. The next id to be assigned is tracked in a global variable here that\n// is shared among all applications on the page.\nlet nextRequestId = 0;\n/**\n * When a pending <script> is unsubscribed we'll move it to this document, so it won't be\n * executed.\n */\nlet foreignDocument;\n// Error text given when a JSONP script is injected, but doesn't invoke the callback\n// passed in its URL.\nconst JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n// Error text given when a request is passed to the JsonpClientBackend that doesn't\n// have a request method JSONP.\nconst JSONP_ERR_WRONG_METHOD = 'JSONP requests must use JSONP request method.';\nconst JSONP_ERR_WRONG_RESPONSE_TYPE = 'JSONP requests must use Json response type.';\n// Error text given when a request is passed to the JsonpClientBackend that has\n// headers set\nconst JSONP_ERR_HEADERS_NOT_SUPPORTED = 'JSONP requests do not support headers.';\n/**\n * DI token/abstract type representing a map of JSONP callbacks.\n *\n * In the browser, this should always be the `window` object.\n *\n *\n */\nclass JsonpCallbackContext {\n}\n/**\n * Factory function that determines where to store JSONP callbacks.\n *\n * Ordinarily JSONP callbacks are stored on the `window` object, but this may not exist\n * in test environments. In that case, callbacks are stored on an anonymous object instead.\n *\n *\n */\nfunction jsonpCallbackContext() {\n if (typeof window === 'object') {\n return window;\n }\n return {};\n}\n/**\n * Processes an `HttpRequest` with the JSONP method,\n * by performing JSONP style requests.\n * @see {@link HttpHandler}\n * @see {@link HttpXhrBackend}\n *\n * @publicApi\n */\nclass JsonpClientBackend {\n callbackMap;\n document;\n /**\n * A resolved promise that can be used to schedule microtasks in the event handlers.\n */\n resolvedPromise = Promise.resolve();\n constructor(callbackMap, document) {\n this.callbackMap = callbackMap;\n this.document = document;\n }\n /**\n * Get the name of the next callback method, by incrementing the global `nextRequestId`.\n */\n nextCallback() {\n return `ng_jsonp_callback_${nextRequestId++}`;\n }\n /**\n * Processes a JSONP request and returns an event stream of the results.\n * @param req The request object.\n * @returns An observable of the response events.\n *\n */\n handle(req) {\n // Firstly, check both the method and response type. If either doesn't match\n // then the request was improperly routed here and cannot be handled.\n if (req.method !== 'JSONP') {\n throw new _RuntimeError(2810 /* RuntimeErrorCode.JSONP_WRONG_METHOD */, ngDevMode && JSONP_ERR_WRONG_METHOD);\n }\n else if (req.responseType !== 'json') {\n throw new _RuntimeError(2811 /* RuntimeErrorCode.JSONP_WRONG_RESPONSE_TYPE */, ngDevMode && JSONP_ERR_WRONG_RESPONSE_TYPE);\n }\n // Check the request headers. JSONP doesn't support headers and\n // cannot set any that were supplied.\n if (req.headers.keys().length > 0) {\n throw new _RuntimeError(2812 /* RuntimeErrorCode.JSONP_HEADERS_NOT_SUPPORTED */, ngDevMode && JSONP_ERR_HEADERS_NOT_SUPPORTED);\n }\n // Everything else happens inside the Observable boundary.\n return new Observable((observer) => {\n // The first step to make a request is to generate the callback name, and replace the\n // callback placeholder in the URL with the name. Care has to be taken here to ensure\n // a trailing &, if matched, gets inserted back into the URL in the correct place.\n const callback = this.nextCallback();\n const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);\n // Construct the <script> tag and point it at the URL.\n const node = this.document.createElement('script');\n node.src = url;\n // A JSONP request requires waiting for multiple callbacks. These variables\n // are closed over and track state across those callbacks.\n // The response object, if one has been received, or null otherwise.\n let body = null;\n // Whether the response callback has been called.\n let finished = false;\n // Set the response callback in this.callbackMap (which will be the window\n // object in the browser. The script being loaded via the <script> tag will\n // eventually call this callback.\n this.callbackMap[callback] = (data) => {\n // Data has been received from the JSONP script. Firstly, delete this callback.\n delete this.callbackMap[callback];\n // Set state to indicate data was received.\n body = data;\n finished = true;\n };\n // cleanup() is a utility closure that removes the <script> from the page and\n // the response callback from the window. This logic is used in both the\n // success, error, and cancellation paths, so it's extracted out for convenience.\n const cleanup = () => {\n node.removeEventListener('load', onLoad);\n node.removeEventListener('error', onError);\n // Remove the <script> tag if it's still on the page.\n node.remove();\n // Remove the response callback from the callbackMap (window object in the\n // browser).\n delete this.callbackMap[callback];\n };\n // onLoad() is the success callback which runs after the response callback\n // if the JSONP script loads successfully. The event itself is unimportant.\n // If something went wrong, onLoad() may run without the response callback\n // having been invoked.\n const onLoad = () => {\n // We wrap it in an extra Promise, to ensure the microtask\n // is scheduled after the loaded endpoint has executed any potential microtask itself,\n // which is not guaranteed in Internet Explorer and EdgeHTML. See issue #39496\n this.resolvedPromise.then(() => {\n // Cleanup the page.\n cleanup();\n // Check whether the response callback has run.\n if (!finished) {\n // It hasn't, something went wrong with the request. Return an error via\n // the Observable error path. All JSONP errors have status 0.\n observer.error(new HttpErrorResponse({\n url,\n status: 0,\n statusText: 'JSONP Error',\n error: new Error(JSONP_ERR_NO_CALLBACK),\n }));\n return;\n }\n // Success. body either contains the response body or null if none was\n // returned.\n observer.next(new HttpResponse({\n body,\n status: HTTP_STATUS_CODE_OK,\n statusText: 'OK',\n url,\n }));\n // Complete the stream, the response is over.\n observer.complete();\n });\n };\n // onError() is the error callback, which runs if the script returned generates\n // a Javascript error. It emits the error via the Observable error channel as\n // a HttpErrorResponse.\n const onError = (error) => {\n cleanup();\n // Wrap the error in a HttpErrorResponse.\n observer.error(new HttpErrorResponse({\n error,\n status: 0,\n statusText: 'JSONP Error',\n url,\n }));\n };\n // Subscribe to both the success (load) and error events on the <script> tag,\n // and add it to the page.\n node.addEventListener('load', onLoad);\n node.addEventListener('error', onError);\n this.document.body.appendChild(node);\n // The request has now been successfully sent.\n observer.next({ type: HttpEventType.Sent });\n // Cancellation handler.\n return () => {\n if (!finished) {\n this.removeListeners(node);\n }\n // And finally, clean up the page.\n cleanup();\n };\n });\n }\n removeListeners(script) {\n // Issue #34818\n // Changing <script>'s ownerDocument will prevent it from execution.\n // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block\n foreignDocument ??= this.document.implementation.createHTMLDocument();\n foreignDocument.adoptNode(script);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: JsonpClientBackend, deps: [{ token: JsonpCallbackContext }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: JsonpClientBackend });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: JsonpClientBackend, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: JsonpCallbackContext }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }] });\n/**\n * Identifies requests with the method JSONP and shifts them to the `JsonpClientBackend`.\n */\nfunction jsonpInterceptorFn(req, next) {\n if (req.method === 'JSONP') {\n return inject(JsonpClientBackend).handle(req);\n }\n // Fall through for normal HTTP requests.\n return next(req);\n}\n/**\n * Identifies requests with the method JSONP and\n * shifts them to the `JsonpClientBackend`.\n *\n * @see {@link HttpInterceptor}\n *\n * @publicApi\n */\nclass JsonpInterceptor {\n injector;\n constructor(injector) {\n this.injector = injector;\n }\n /**\n * Identifies and handles a given JSONP request.\n * @param initialRequest The outgoing request object to handle.\n * @param next The next interceptor in the chain, or the backend\n * if no interceptors remain in the chain.\n * @returns An observable of the event stream.\n */\n intercept(initialRequest, next) {\n return runInInjectionContext(this.injector, () => jsonpInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: JsonpInterceptor, deps: [{ token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: JsonpInterceptor });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: JsonpInterceptor, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: i0.EnvironmentInjector }] });\n\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\nconst X_REQUEST_URL_REGEXP = RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm');\n/**\n * Determine an appropriate URL for the response, by checking either\n * XMLHttpRequest.responseURL or the X-Request-URL header.\n */\nfunction getResponseUrl(xhr) {\n if ('responseURL' in xhr && xhr.responseURL) {\n return xhr.responseURL;\n }\n if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader(X_REQUEST_URL_HEADER);\n }\n return null;\n}\n/**\n * Validates whether the request is compatible with the XHR backend.\n * Show a warning if the request contains options that are not supported by XHR.\n */\nfunction validateXhrCompatibility(req) {\n const unsupportedOptions = [\n {\n property: 'keepalive',\n errorCode: 2813 /* RuntimeErrorCode.KEEPALIVE_NOT_SUPPORTED_WITH_XHR */,\n },\n {\n property: 'cache',\n errorCode: 2814 /* RuntimeErrorCode.CACHE_NOT_SUPPORTED_WITH_XHR */,\n },\n {\n property: 'priority',\n errorCode: 2815 /* RuntimeErrorCode.PRIORITY_NOT_SUPPORTED_WITH_XHR */,\n },\n {\n property: 'mode',\n errorCode: 2816 /* RuntimeErrorCode.MODE_NOT_SUPPORTED_WITH_XHR */,\n },\n {\n property: 'redirect',\n errorCode: 2817 /* RuntimeErrorCode.REDIRECT_NOT_SUPPORTED_WITH_XHR */,\n },\n {\n property: 'credentials',\n errorCode: 2818 /* RuntimeErrorCode.CREDENTIALS_NOT_SUPPORTED_WITH_XHR */,\n },\n ];\n // Check each unsupported option and warn if present\n for (const { property, errorCode } of unsupportedOptions) {\n if (req[property]) {\n console.warn(_formatRuntimeError(errorCode, `Angular detected that a \\`HttpClient\\` request with the \\`${property}\\` option was sent using XHR, which does not support it. To use the \\`${property}\\` option, enable Fetch API support by passing \\`withFetch()\\` as an argument to \\`provideHttpClient()\\`.`));\n }\n }\n}\n/**\n * Uses `XMLHttpRequest` to send requests to a backend server.\n * @see {@link HttpHandler}\n * @see {@link JsonpClientBackend}\n *\n * @publicApi\n */\nclass HttpXhrBackend {\n xhrFactory;\n constructor(xhrFactory) {\n this.xhrFactory = xhrFactory;\n }\n /**\n * Processes a request and returns a stream of response events.\n * @param req The request object.\n * @returns An observable of the response events.\n */\n handle(req) {\n // Quick check to give a better error message when a user attempts to use\n // HttpClient.jsonp() without installing the HttpClientJsonpModule\n if (req.method === 'JSONP') {\n throw new _RuntimeError(-2800 /* RuntimeErrorCode.MISSING_JSONP_MODULE */, (typeof ngDevMode === 'undefined' || ngDevMode) &&\n `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \\`withJsonpSupport()\\` call (if \\`provideHttpClient()\\` is used) or import the \\`HttpClientJsonpModule\\` in the root NgModule.`);\n }\n // Validate that the request is compatible with the XHR backend.\n ngDevMode && validateXhrCompatibility(req);\n // Check whether this factory has a special function to load an XHR implementation\n // for various non-browser environments. We currently limit it to only `ServerXhr`\n // class, which needs to load an XHR implementation.\n const xhrFactory = this.xhrFactory;\n const source = \n // Note that `ɵloadImpl` is never defined in client bundles and can be\n // safely dropped whenever we're running in the browser.\n // This branching is redundant.\n // The `ngServerMode` guard also enables tree-shaking of the `from()`\n // function from the common bundle, as it's only used in server code.\n typeof ngServerMode !== 'undefined' && ngServerMode && xhrFactory.ɵloadImpl\n ? from(xhrFactory.ɵloadImpl())\n : of(null);\n return source.pipe(switchMap(() => {\n // Everything happens on Observable subscription.\n return new Observable((observer) => {\n // Start by setting up the XHR object with request method, URL, and withCredentials\n // flag.\n const xhr = xhrFactory.build();\n xhr.open(req.method, req.urlWithParams);\n if (req.withCredentials) {\n xhr.withCredentials = true;\n }\n // Add all the requested headers.\n req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(',')));\n // Add an Accept header if one isn't present already.\n if (!req.headers.has(ACCEPT_HEADER)) {\n xhr.setRequestHeader(ACCEPT_HEADER, ACCEPT_HEADER_VALUE);\n }\n // Auto-detect the Content-Type header if one isn't present already.\n if (!req.headers.has(CONTENT_TYPE_HEADER)) {\n const detectedType = req.detectContentTypeHeader();\n // Sometimes Content-Type detection fails.\n if (detectedType !== null) {\n xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType);\n }\n }\n if (req.timeout) {\n xhr.timeout = req.timeout;\n }\n // Set the responseType if one was requested.\n if (req.responseType) {\n const responseType = req.responseType.toLowerCase();\n // JSON responses need to be processed as text. This is because if the server\n // returns an XSSI-prefixed JSON response, the browser will fail to parse it,\n // xhr.response will be null, and xhr.responseText cannot be accessed to\n // retrieve the prefixed JSON data in order to strip the prefix. Thus, all JSON\n // is parsed by first requesting text and then applying JSON.parse.\n xhr.responseType = (responseType !== 'json' ? responseType : 'text');\n }\n // Serialize the request body if one is present. If not, this will be set to null.\n const reqBody = req.serializeBody();\n // If progress events are enabled, response headers will be delivered\n // in two events - the HttpHeaderResponse event and the full HttpResponse\n // event. However, since response headers don't change in between these\n // two events, it doesn't make sense to parse them twice. So headerResponse\n // caches the data extracted from the response whenever it's first parsed,\n // to ensure parsing isn't duplicated.\n let headerResponse = null;\n // partialFromXhr extracts the HttpHeaderResponse from the current XMLHttpRequest\n // state, and memoizes it into headerResponse.\n const partialFromXhr = () => {\n if (headerResponse !== null) {\n return headerResponse;\n }\n const statusText = xhr.statusText || 'OK';\n // Parse headers from XMLHttpRequest - this step is lazy.\n const headers = new HttpHeaders(xhr.getAllResponseHeaders());\n // Read the response URL from the XMLHttpResponse instance and fall back on the\n // request URL.\n const url = getResponseUrl(xhr) || req.url;\n // Construct the HttpHeaderResponse and memoize it.\n headerResponse = new HttpHeaderResponse({ headers, status: xhr.status, statusText, url });\n return headerResponse;\n };\n // Next, a few closures are defined for the various events which XMLHttpRequest can\n // emit. This allows them to be unregistered as event listeners later.\n // First up is the load event, which represents a response being fully available.\n const onLoad = () => {\n // Read response state from the memoized partial data.\n let { headers, status, statusText, url } = partialFromXhr();\n // The body will be read out if present.\n let body = null;\n if (status !== HTTP_STATUS_CODE_NO_CONTENT) {\n // Use XMLHttpRequest.response if set, responseText otherwise.\n body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;\n }\n // Normalize another potential bug (this one comes from CORS).\n if (status === 0) {\n status = !!body ? HTTP_STATUS_CODE_OK : 0;\n }\n // ok determines whether the response will be transmitted on the event or\n // error channel. Unsuccessful status codes (not 2xx) will always be errors,\n // but a successful status code can still result in an error if the user\n // asked for JSON data and the body cannot be parsed as such.\n let ok = status >= 200 && status < 300;\n // Check whether the body needs to be parsed as JSON (in many cases the browser\n // will have done that already).\n if (req.responseType === 'json' && typeof body === 'string') {\n // Save the original body, before attempting XSSI prefix stripping.\n const originalBody = body;\n body = body.replace(XSSI_PREFIX, '');\n try {\n // Attempt the parse. If it fails, a parse error should be delivered to the\n // user.\n body = body !== '' ? JSON.parse(body) : null;\n }\n catch (error) {\n // Since the JSON.parse failed, it's reasonable to assume this might not have\n // been a JSON response. Restore the original body (including any XSSI prefix)\n // to deliver a better error response.\n body = originalBody;\n // If this was an error request to begin with, leave it as a string, it\n // probably just isn't JSON. Otherwise, deliver the parsing error to the user.\n if (ok) {\n // Even though the response status was 2xx, this is still an error.\n ok = false;\n // The parse error contains the text of the body that failed to parse.\n body = { error, text: body };\n }\n }\n }\n if (ok) {\n // A successful response is delivered on the event stream.\n observer.next(new HttpResponse({\n body,\n headers,\n status,\n statusText,\n url: url || undefined,\n }));\n // The full body has been received and delivered, no further events\n // are possible. This request is complete.\n observer.complete();\n }\n else {\n // An unsuccessful request is delivered on the error channel.\n observer.error(new HttpErrorResponse({\n // The error in this case is the response body (error from the server).\n error: body,\n headers,\n status,\n statusText,\n url: url || undefined,\n }));\n }\n };\n // The onError callback is called when something goes wrong at the network level.\n // Connection timeout, DNS error, offline, etc. These are actual errors, and are\n // transmitted on the error channel.\n const onError = (error) => {\n const { url } = partialFromXhr();\n const res = new HttpErrorResponse({\n error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n url: url || undefined,\n });\n observer.error(res);\n };\n let onTimeout = onError;\n if (req.timeout) {\n onTimeout = (_) => {\n const { url } = partialFromXhr();\n const res = new HttpErrorResponse({\n error: new DOMException('Request timed out', 'TimeoutError'),\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Request timeout',\n url: url || undefined,\n });\n observer.error(res);\n };\n }\n // The sentHeaders flag tracks whether the HttpResponseHeaders event\n // has been sent on the stream. This is necessary to track if progress\n // is enabled since the event will be sent on only the first download\n // progress event.\n let sentHeaders = false;\n // The download progress event handler, which is only registered if\n // progress events are enabled.\n const onDownProgress = (event) => {\n // Send the HttpResponseHeaders event if it hasn't been sent already.\n if (!sentHeaders) {\n observer.next(partialFromXhr());\n sentHeaders = true;\n }\n // Start building the download progress event to deliver on the response\n // event stream.\n let progressEvent = {\n type: HttpEventType.DownloadProgress,\n loaded: event.loaded,\n };\n // Set the total number of bytes in the event if it's available.\n if (event.lengthComputable) {\n progressEvent.total = event.total;\n }\n // If the request was for text content and a partial response is\n // available on XMLHttpRequest, include it in the progress event\n // to allow for streaming reads.\n if (req.responseType === 'text' && !!xhr.responseText) {\n progressEvent.partialText = xhr.responseText;\n }\n // Finally, fire the event.\n observer.next(progressEvent);\n };\n // The upload progress event handler, which is only registered if\n // progress events are enabled.\n const onUpProgress = (event) => {\n // Upload progress events are simpler. Begin building the progress\n // event.\n let progress = {\n type: HttpEventType.UploadProgress,\n loaded: event.loaded,\n };\n // If the total number of bytes being uploaded is available, include\n // it.\n if (event.lengthComputable) {\n progress.total = event.total;\n }\n // Send the event.\n observer.next(progress);\n };\n // By default, register for load and error events.\n xhr.addEventListener('load', onLoad);\n xhr.addEventListener('error', onError);\n xhr.addEventListener('timeout', onTimeout);\n xhr.addEventListener('abort', onError);\n // Progress events are only enabled if requested.\n if (req.reportProgress) {\n // Download progress is always enabled if requested.\n xhr.addEventListener('progress', onDownProgress);\n // Upload progress depends on whether there is a body to upload.\n if (reqBody !== null && xhr.upload) {\n xhr.upload.addEventListener('progress', onUpProgress);\n }\n }\n // Fire the request, and notify the event stream that it was fired.\n xhr.send(reqBody);\n observer.next({ type: HttpEventType.Sent });\n // This is the return from the Observable function, which is the\n // request cancellation handler.\n return () => {\n // On a cancellation, remove all registered event listeners.\n xhr.removeEventListener('error', onError);\n xhr.removeEventListener('abort', onError);\n xhr.removeEventListener('load', onLoad);\n xhr.removeEventListener('timeout', onTimeout);\n if (req.reportProgress) {\n xhr.removeEventListener('progress', onDownProgress);\n if (reqBody !== null && xhr.upload) {\n xhr.upload.removeEventListener('progress', onUpProgress);\n }\n }\n // Finally, abort the in-flight request.\n if (xhr.readyState !== xhr.DONE) {\n xhr.abort();\n }\n };\n });\n }));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXhrBackend, deps: [{ token: XhrFactory }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXhrBackend });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXhrBackend, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: XhrFactory }] });\n\nconst XSRF_ENABLED = new InjectionToken(ngDevMode ? 'XSRF_ENABLED' : '');\nconst XSRF_DEFAULT_COOKIE_NAME = 'XSRF-TOKEN';\nconst XSRF_COOKIE_NAME = new InjectionToken(ngDevMode ? 'XSRF_COOKIE_NAME' : '', {\n providedIn: 'root',\n factory: () => XSRF_DEFAULT_COOKIE_NAME,\n});\nconst XSRF_DEFAULT_HEADER_NAME = 'X-XSRF-TOKEN';\nconst XSRF_HEADER_NAME = new InjectionToken(ngDevMode ? 'XSRF_HEADER_NAME' : '', {\n providedIn: 'root',\n factory: () => XSRF_DEFAULT_HEADER_NAME,\n});\n/**\n * Retrieves the current XSRF token to use with the next outgoing request.\n *\n * @publicApi\n */\nclass HttpXsrfTokenExtractor {\n}\n/**\n * `HttpXsrfTokenExtractor` which retrieves the token from a cookie.\n */\nclass HttpXsrfCookieExtractor {\n doc;\n cookieName;\n lastCookieString = '';\n lastToken = null;\n /**\n * @internal for testing\n */\n parseCount = 0;\n constructor(doc, cookieName) {\n this.doc = doc;\n this.cookieName = cookieName;\n }\n getToken() {\n if (typeof ngServerMode !== 'undefined' && ngServerMode) {\n return null;\n }\n const cookieString = this.doc.cookie || '';\n if (cookieString !== this.lastCookieString) {\n this.parseCount++;\n this.lastToken = parseCookieValue(cookieString, this.cookieName);\n this.lastCookieString = cookieString;\n }\n return this.lastToken;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXsrfCookieExtractor, deps: [{ token: DOCUMENT }, { token: XSRF_COOKIE_NAME }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXsrfCookieExtractor });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXsrfCookieExtractor, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [XSRF_COOKIE_NAME]\n }] }] });\nfunction xsrfInterceptorFn(req, next) {\n const lcUrl = req.url.toLowerCase();\n // Skip both non-mutating requests and absolute URLs.\n // Non-mutating requests don't require a token, and absolute URLs require special handling\n // anyway as the cookie set\n // on our origin is not the same as the token expected by another origin.\n if (!inject(XSRF_ENABLED) ||\n req.method === 'GET' ||\n req.method === 'HEAD' ||\n lcUrl.startsWith('http://') ||\n lcUrl.startsWith('https://')) {\n return next(req);\n }\n const token = inject(HttpXsrfTokenExtractor).getToken();\n const headerName = inject(XSRF_HEADER_NAME);\n // Be careful not to overwrite an existing header of the same name.\n if (token != null && !req.headers.has(headerName)) {\n req = req.clone({ headers: req.headers.set(headerName, token) });\n }\n return next(req);\n}\n/**\n * `HttpInterceptor` which adds an XSRF token to eligible outgoing requests.\n */\nclass HttpXsrfInterceptor {\n injector;\n constructor(injector) {\n this.injector = injector;\n }\n intercept(initialRequest, next) {\n return runInInjectionContext(this.injector, () => xsrfInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)));\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXsrfInterceptor, deps: [{ token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXsrfInterceptor });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpXsrfInterceptor, decorators: [{\n type: Injectable\n }], ctorParameters: () => [{ type: i0.EnvironmentInjector }] });\n\n/**\n * Identifies a particular kind of `HttpFeature`.\n *\n * @publicApi\n */\nvar HttpFeatureKind;\n(function (HttpFeatureKind) {\n HttpFeatureKind[HttpFeatureKind[\"Interceptors\"] = 0] = \"Interceptors\";\n HttpFeatureKind[HttpFeatureKind[\"LegacyInterceptors\"] = 1] = \"LegacyInterceptors\";\n HttpFeatureKind[HttpFeatureKind[\"CustomXsrfConfiguration\"] = 2] = \"CustomXsrfConfiguration\";\n HttpFeatureKind[HttpFeatureKind[\"NoXsrfProtection\"] = 3] = \"NoXsrfProtection\";\n HttpFeatureKind[HttpFeatureKind[\"JsonpSupport\"] = 4] = \"JsonpSupport\";\n HttpFeatureKind[HttpFeatureKind[\"RequestsMadeViaParent\"] = 5] = \"RequestsMadeViaParent\";\n HttpFeatureKind[HttpFeatureKind[\"Fetch\"] = 6] = \"Fetch\";\n})(HttpFeatureKind || (HttpFeatureKind = {}));\nfunction makeHttpFeature(kind, providers) {\n return {\n ɵkind: kind,\n ɵproviders: providers,\n };\n}\n/**\n * Configures Angular's `HttpClient` service to be available for injection.\n *\n * By default, `HttpClient` will be configured for injection with its default options for XSRF\n * protection of outgoing requests. Additional configuration options can be provided by passing\n * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the\n * `withInterceptors(...)` feature.\n *\n * <div class=\"docs-alert docs-alert-helpful\">\n *\n * It's strongly recommended to enable\n * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use\n * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add\n * `withFetch()` feature to the `provideHttpClient()` call at the root of the application:\n *\n * ```ts\n * provideHttpClient(withFetch());\n * ```\n *\n * </div>\n *\n * @see {@link withInterceptors}\n * @see {@link withInterceptorsFromDi}\n * @see {@link withXsrfConfiguration}\n * @see {@link withNoXsrfProtection}\n * @see {@link withJsonpSupport}\n * @see {@link withRequestsMadeViaParent}\n * @see {@link withFetch}\n */\nfunction provideHttpClient(...features) {\n if (ngDevMode) {\n const featureKinds = new Set(features.map((f) => f.ɵkind));\n if (featureKinds.has(HttpFeatureKind.NoXsrfProtection) &&\n featureKinds.has(HttpFeatureKind.CustomXsrfConfiguration)) {\n throw new Error(ngDevMode\n ? `Configuration error: found both withXsrfConfiguration() and withNoXsrfProtection() in the same call to provideHttpClient(), which is a contradiction.`\n : '');\n }\n }\n const providers = [\n HttpClient,\n HttpXhrBackend,\n HttpInterceptorHandler,\n { provide: HttpHandler, useExisting: HttpInterceptorHandler },\n {\n provide: HttpBackend,\n useFactory: () => {\n return inject(FETCH_BACKEND, { optional: true }) ?? inject(HttpXhrBackend);\n },\n },\n {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: xsrfInterceptorFn,\n multi: true,\n },\n { provide: XSRF_ENABLED, useValue: true },\n { provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor },\n ];\n for (const feature of features) {\n providers.push(...feature.ɵproviders);\n }\n return makeEnvironmentProviders(providers);\n}\n/**\n * Adds one or more functional-style HTTP interceptors to the configuration of the `HttpClient`\n * instance.\n *\n * @see {@link HttpInterceptorFn}\n * @see {@link provideHttpClient}\n * @publicApi\n */\nfunction withInterceptors(interceptorFns) {\n return makeHttpFeature(HttpFeatureKind.Interceptors, interceptorFns.map((interceptorFn) => {\n return {\n provide: HTTP_INTERCEPTOR_FNS,\n useValue: interceptorFn,\n multi: true,\n };\n }));\n}\nconst LEGACY_INTERCEPTOR_FN = new InjectionToken(ngDevMode ? 'LEGACY_INTERCEPTOR_FN' : '');\n/**\n * Includes class-based interceptors configured using a multi-provider in the current injector into\n * the configured `HttpClient` instance.\n *\n * Prefer `withInterceptors` and functional interceptors instead, as support for DI-provided\n * interceptors may be phased out in a later release.\n *\n * @see {@link HttpInterceptor}\n * @see {@link HTTP_INTERCEPTORS}\n * @see {@link provideHttpClient}\n */\nfunction withInterceptorsFromDi() {\n // Note: the legacy interceptor function is provided here via an intermediate token\n // (`LEGACY_INTERCEPTOR_FN`), using a pattern which guarantees that if these providers are\n // included multiple times, all of the multi-provider entries will have the same instance of the\n // interceptor function. That way, the `HttpINterceptorHandler` will dedup them and legacy\n // interceptors will not run multiple times.\n return makeHttpFeature(HttpFeatureKind.LegacyInterceptors, [\n {\n provide: LEGACY_INTERCEPTOR_FN,\n useFactory: legacyInterceptorFnFactory,\n },\n {\n provide: HTTP_INTERCEPTOR_FNS,\n useExisting: LEGACY_INTERCEPTOR_FN,\n multi: true,\n },\n ]);\n}\n/**\n * Customizes the XSRF protection for the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withNoXsrfProtection` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withXsrfConfiguration({ cookieName, headerName, }) {\n const providers = [];\n if (cookieName !== undefined) {\n providers.push({ provide: XSRF_COOKIE_NAME, useValue: cookieName });\n }\n if (headerName !== undefined) {\n providers.push({ provide: XSRF_HEADER_NAME, useValue: headerName });\n }\n return makeHttpFeature(HttpFeatureKind.CustomXsrfConfiguration, providers);\n}\n/**\n * Disables XSRF protection in the configuration of the current `HttpClient` instance.\n *\n * This feature is incompatible with the `withXsrfConfiguration` feature.\n *\n * @see {@link provideHttpClient}\n */\nfunction withNoXsrfProtection() {\n return makeHttpFeature(HttpFeatureKind.NoXsrfProtection, [\n {\n provide: XSRF_ENABLED,\n useValue: false,\n },\n ]);\n}\n/**\n * Add JSONP support to the configuration of the current `HttpClient` instance.\n *\n * @see {@link provideHttpClient}\n */\nfunction withJsonpSupport() {\n return makeHttpFeature(HttpFeatureKind.JsonpSupport, [\n JsonpClientBackend,\n { provide: JsonpCallbackContext, useFactory: jsonpCallbackContext },\n { provide: HTTP_INTERCEPTOR_FNS, useValue: jsonpInterceptorFn, multi: true },\n ]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests via the parent injector's\n * `HttpClient` instead of directly.\n *\n * By default, `provideHttpClient` configures `HttpClient` in its injector to be an independent\n * instance. For example, even if `HttpClient` is configured in the parent injector with\n * one or more interceptors, they will not intercept requests made via this instance.\n *\n * With this option enabled, once the request has passed through the current injector's\n * interceptors, it will be delegated to the parent injector's `HttpClient` chain instead of\n * dispatched directly, and interceptors in the parent configuration will be applied to the request.\n *\n * If there are several `HttpClient` instances in the injector hierarchy, it's possible for\n * `withRequestsMadeViaParent` to be used at multiple levels, which will cause the request to\n * \"bubble up\" until either reaching the root level or an `HttpClient` which was not configured with\n * this option.\n *\n * @see {@link provideHttpClient}\n * @publicApi 19.0\n */\nfunction withRequestsMadeViaParent() {\n return makeHttpFeature(HttpFeatureKind.RequestsMadeViaParent, [\n {\n provide: HttpBackend,\n useFactory: () => {\n const handlerFromParent = inject(HttpHandler, { skipSelf: true, optional: true });\n if (ngDevMode && handlerFromParent === null) {\n throw new Error('withRequestsMadeViaParent() can only be used when the parent injector also configures HttpClient');\n }\n return handlerFromParent;\n },\n },\n ]);\n}\n/**\n * Configures the current `HttpClient` instance to make requests using the fetch API.\n *\n * Note: The Fetch API doesn't support progress report on uploads.\n *\n * @publicApi\n */\nfunction withFetch() {\n return makeHttpFeature(HttpFeatureKind.Fetch, [\n FetchBackend,\n { provide: FETCH_BACKEND, useExisting: FetchBackend },\n { provide: HttpBackend, useExisting: FetchBackend },\n ]);\n}\n\n/**\n * Configures XSRF protection support for outgoing requests.\n *\n * For a server that supports a cookie-based XSRF protection system,\n * use directly to configure XSRF protection with the correct\n * cookie and header names.\n *\n * If no names are supplied, the default cookie name is `XSRF-TOKEN`\n * and the default header name is `X-XSRF-TOKEN`.\n *\n * @publicApi\n * @deprecated Use withXsrfConfiguration({cookieName: 'XSRF-TOKEN', headerName: 'X-XSRF-TOKEN'}) as\n * providers instead or `withNoXsrfProtection` if you want to disabled XSRF protection.\n */\nclass HttpClientXsrfModule {\n /**\n * Disable the default XSRF protection.\n */\n static disable() {\n return {\n ngModule: HttpClientXsrfModule,\n providers: [withNoXsrfProtection().ɵproviders],\n };\n }\n /**\n * Configure XSRF protection.\n * @param options An object that can specify either or both\n * cookie name or header name.\n * - Cookie name default is `XSRF-TOKEN`.\n * - Header name default is `X-XSRF-TOKEN`.\n *\n */\n static withOptions(options = {}) {\n return {\n ngModule: HttpClientXsrfModule,\n providers: withXsrfConfiguration(options).ɵproviders,\n };\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientXsrfModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientXsrfModule });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientXsrfModule, providers: [\n HttpXsrfInterceptor,\n { provide: HTTP_INTERCEPTORS, useExisting: HttpXsrfInterceptor, multi: true },\n { provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor },\n withXsrfConfiguration({\n cookieName: XSRF_DEFAULT_COOKIE_NAME,\n headerName: XSRF_DEFAULT_HEADER_NAME,\n }).ɵproviders,\n { provide: XSRF_ENABLED, useValue: true },\n ] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientXsrfModule, decorators: [{\n type: NgModule,\n args: [{\n providers: [\n HttpXsrfInterceptor,\n { provide: HTTP_INTERCEPTORS, useExisting: HttpXsrfInterceptor, multi: true },\n { provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor },\n withXsrfConfiguration({\n cookieName: XSRF_DEFAULT_COOKIE_NAME,\n headerName: XSRF_DEFAULT_HEADER_NAME,\n }).ɵproviders,\n { provide: XSRF_ENABLED, useValue: true },\n ],\n }]\n }] });\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for XSRF. Automatically imported by `HttpClientModule`.\n *\n * You can add interceptors to the chain behind `HttpClient` by binding them to the\n * multiprovider for built-in DI token `HTTP_INTERCEPTORS`.\n *\n * @publicApi\n * @deprecated use `provideHttpClient(withInterceptorsFromDi())` as providers instead\n */\nclass HttpClientModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientModule });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientModule, providers: [provideHttpClient(withInterceptorsFromDi())] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientModule, decorators: [{\n type: NgModule,\n args: [{\n /**\n * Configures the dependency injector where it is imported\n * with supporting services for HTTP communications.\n */\n providers: [provideHttpClient(withInterceptorsFromDi())],\n }]\n }] });\n/**\n * Configures the dependency injector for `HttpClient`\n * with supporting services for JSONP.\n * Without this module, Jsonp requests reach the backend\n * with method JSONP, where they are rejected.\n *\n * @publicApi\n * @deprecated `withJsonpSupport()` as providers instead\n */\nclass HttpClientJsonpModule {\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientJsonpModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });\n static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientJsonpModule });\n static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientJsonpModule, providers: [withJsonpSupport().ɵproviders] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: HttpClientJsonpModule, decorators: [{\n type: NgModule,\n args: [{\n providers: [withJsonpSupport().ɵproviders],\n }]\n }] });\n\nexport { FetchBackend, HTTP_INTERCEPTORS, HTTP_ROOT_INTERCEPTOR_FNS, HttpBackend, HttpClient, HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpErrorResponse, HttpEventType, HttpFeatureKind, HttpHandler, HttpHeaderResponse, HttpHeaders, HttpInterceptorHandler, HttpParams, HttpRequest, HttpResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, REQUESTS_CONTRIBUTE_TO_STABILITY, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration };\n//# sourceMappingURL=module.mjs.map\n"],"mappings":"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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMuC,UAAU,CAAC;EACbC,OAAO;EACP7J,WAAWA,CAAC6J,OAAO,EAAE;IACjB,IAAI,CAACA,OAAO,GAAGA,OAAO;EAC1B;EACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACIC,OAAOA,CAACC,KAAK,EAAEpD,GAAG,EAAE/B,OAAO,GAAG,CAAC,CAAC,EAAE;IAC9B,IAAIoF,GAAG;IACP;IACA,IAAID,KAAK,YAAYrD,WAAW,EAAE;MAC9B;MACA;MACAsD,GAAG,GAAGD,KAAK;IACf,CAAC,MACI;MACD;MACA;MACA;MACA;MACA,IAAIpK,OAAO,GAAG6C,SAAS;MACvB,IAAIoC,OAAO,CAACjF,OAAO,YAAYD,WAAW,EAAE;QACxCC,OAAO,GAAGiF,OAAO,CAACjF,OAAO;MAC7B,CAAC,MACI;QACDA,OAAO,GAAG,IAAID,WAAW,CAACkF,OAAO,CAACjF,OAAO,CAAC;MAC9C;MACA;MACA,IAAIgE,MAAM,GAAGnB,SAAS;MACtB,IAAI,CAAC,CAACoC,OAAO,CAACjB,MAAM,EAAE;QAClB,IAAIiB,OAAO,CAACjB,MAAM,YAAYa,UAAU,EAAE;UACtCb,MAAM,GAAGiB,OAAO,CAACjB,MAAM;QAC3B,CAAC,MACI;UACDA,MAAM,GAAG,IAAIa,UAAU,CAAC;YAAEM,UAAU,EAAEF,OAAO,CAACjB;UAAO,CAAC,CAAC;QAC3D;MACJ;MACA;MACAqG,GAAG,GAAG,IAAItD,WAAW,CAACqD,KAAK,EAAEpD,GAAG,EAAE/B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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]} |