{"version":3,"file":"angular-oauth2-oidc.mjs","sources":["../../../projects/lib/src/token-validation/null-validation-handler.ts","../../../projects/lib/src/oauth-module.config.ts","../../../projects/lib/src/date-time-provider.ts","../../../projects/lib/src/types.ts","../../../projects/lib/src/events.ts","../../../projects/lib/src/base64-helper.ts","../../../projects/lib/src/auth.config.ts","../../../projects/lib/src/encoder.ts","../../../projects/lib/src/token-validation/validation-handler.ts","../../../projects/lib/src/url-helper.service.ts","../../../projects/lib/src/token-validation/fast-sha256js.ts","../../../projects/lib/src/token-validation/hash-handler.ts","../../../projects/lib/src/oauth-service.ts","../../../projects/lib/src/interceptors/resource-server-error-handler.ts","../../../projects/lib/src/interceptors/default-oauth.interceptor.ts","../../../projects/lib/src/factories.ts","../../../projects/lib/src/provider.ts","../../../projects/lib/src/angular-oauth-oidc.module.ts","../../../projects/lib/src/token-validation/jwks-validation-handler.ts","../../../projects/lib/src/tokens.ts","../../../projects/lib/src/angular-oauth2-oidc.ts"],"sourcesContent":["import { ValidationHandler, ValidationParams } from './validation-handler';\n\n/**\n * A validation handler that isn't validating nothing.\n * Can be used to skip validation (at your own risk).\n */\nexport class NullValidationHandler implements ValidationHandler {\n  validateSignature(validationParams: ValidationParams): Promise<any> {\n    return Promise.resolve(null);\n  }\n  validateAtHash(validationParams: ValidationParams): Promise<boolean> {\n    return Promise.resolve(true);\n  }\n}\n","export abstract class OAuthModuleConfig {\n  resourceServer: OAuthResourceServerConfig;\n}\n\nexport abstract class OAuthResourceServerConfig {\n  /**\n   * Urls for which calls should be intercepted.\n   * If there is an ResourceServerErrorHandler registered, it is used for them.\n   * If sendAccessToken is set to true, the access_token is send to them too.\n   */\n  allowedUrls?: Array<string>;\n  sendAccessToken: boolean;\n  customUrlValidation?: (url: string) => boolean;\n}\n","import { Injectable } from '@angular/core';\n\nexport abstract class DateTimeProvider {\n  abstract now(): number;\n  abstract new(): Date;\n}\n\n@Injectable()\nexport class SystemDateTimeProvider extends DateTimeProvider {\n  now(): number {\n    return Date.now();\n  }\n\n  new(): Date {\n    return new Date();\n  }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Additional options that can be passed to tryLogin.\n */\nexport class LoginOptions {\n  /**\n   * Is called, after a token has been received and\n   * successfully validated.\n   *\n   * Deprecated:  Use property ``events`` on OAuthService instead.\n   */\n  onTokenReceived?: (receivedTokens: ReceivedTokens) => void;\n\n  /**\n   * Hook, to validate the received tokens.\n   *\n   * Deprecated:  Use property ``tokenValidationHandler`` on OAuthService instead.\n   */\n  validationHandler?: (receivedTokens: ReceivedTokens) => Promise<any>;\n\n  /**\n   * Called when tryLogin detects that the auth server\n   * included an error message into the hash fragment.\n   *\n   * Deprecated:  Use property ``events`` on OAuthService instead.\n   */\n  onLoginError?: (params: object) => void;\n\n  /**\n   * A custom hash fragment to be used instead of the\n   * actual one. This is used for silent refreshes, to\n   * pass the iframes hash fragment to this method, and\n   * is also used by popup flows in the same manner.\n   * This can be used with code flow, where is must be set\n   * to a hash symbol followed by the querystring. The\n   * question mark is optional, but may be present following\n   * the hash symbol.\n   */\n  customHashFragment?: string;\n\n  /**\n   * Set this to true to disable the oauth2 state\n   * check which is a best practice to avoid\n   * security attacks.\n   * As OIDC defines a nonce check that includes\n   * this, this can be set to true when only doing\n   * OIDC.\n   */\n  disableOAuth2StateCheck?: boolean;\n\n  /**\n   * Set this to true to disable the nonce\n   * check which is used to avoid\n   * replay attacks.\n   * This flag should never be true in\n   * production environments.\n   */\n  disableNonceCheck? = false;\n\n  /**\n   * Normally, you want to clear your hash fragment after\n   * the lib read the token(s) so that they are not displayed\n   * anymore in the url. If not, set this to true. For code flow\n   * this controls removing query string values.\n   */\n  preventClearHashAfterLogin? = false;\n\n  /**\n   * Set this for code flow if you used a custom redirect Uri\n   * when retrieving the code. This is used internally for silent\n   * refresh and popup flows.\n   */\n  customRedirectUri?: string;\n}\n\n/**\n * Defines the logging interface the OAuthService uses\n * internally. Is compatible with the `console` object,\n * but you can provide your own implementation as well\n * through dependency injection.\n */\nexport abstract class OAuthLogger {\n  abstract debug(message?: any, ...optionalParams: any[]): void;\n  abstract info(message?: any, ...optionalParams: any[]): void;\n  abstract log(message?: any, ...optionalParams: any[]): void;\n  abstract warn(message?: any, ...optionalParams: any[]): void;\n  abstract error(message?: any, ...optionalParams: any[]): void;\n}\n\n/**\n * Defines a simple storage that can be used for\n * storing the tokens at client side.\n * Is compatible to localStorage and sessionStorage,\n * but you can also create your own implementations.\n */\nexport abstract class OAuthStorage {\n  abstract getItem(key: string): string | null;\n  abstract removeItem(key: string): void;\n  abstract setItem(key: string, data: string): void;\n}\n\n@Injectable()\nexport class MemoryStorage implements OAuthStorage {\n  private data = new Map<string, string>();\n\n  getItem(key: string): string {\n    return this.data.get(key);\n  }\n\n  removeItem(key: string): void {\n    this.data.delete(key);\n  }\n\n  setItem(key: string, data: string): void {\n    this.data.set(key, data);\n  }\n}\n\n/**\n * Represents the received tokens, the received state\n * and the parsed claims from the id-token.\n */\nexport class ReceivedTokens {\n  idToken: string;\n  accessToken: string;\n  idClaims?: object;\n  state?: string;\n}\n\n/**\n * Represents the parsed and validated id_token.\n */\nexport interface ParsedIdToken {\n  idToken: string;\n  idTokenClaims: object;\n  idTokenHeader: object;\n  idTokenClaimsJson: string;\n  idTokenHeaderJson: string;\n  idTokenExpiresAt: number;\n}\n\n/**\n * Represents the response from the token endpoint\n * http://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint\n */\nexport interface TokenResponse {\n  access_token: string;\n  id_token: string;\n  token_type: string;\n  expires_in: number;\n  refresh_token: string;\n  scope: string;\n  state?: string;\n}\n\n/**\n * Represents the response from the user info endpoint\n * http://openid.net/specs/openid-connect-core-1_0.html#UserInfo\n */\nexport interface UserInfo {\n  sub: string;\n  [key: string]: any;\n}\n\n/**\n * Represents an OpenID Connect discovery document\n */\nexport interface OidcDiscoveryDoc {\n  issuer: string;\n  authorization_endpoint: string;\n  token_endpoint: string;\n  token_endpoint_auth_methods_supported: string[];\n  token_endpoint_auth_signing_alg_values_supported: string[];\n  userinfo_endpoint: string;\n  check_session_iframe: string;\n  end_session_endpoint: string;\n  jwks_uri: string;\n  registration_endpoint: string;\n  scopes_supported: string[];\n  response_types_supported: string[];\n  acr_values_supported: string[];\n  response_modes_supported: string[];\n  grant_types_supported: string[];\n  subject_types_supported: string[];\n  userinfo_signing_alg_values_supported: string[];\n  userinfo_encryption_alg_values_supported: string[];\n  userinfo_encryption_enc_values_supported: string[];\n  id_token_signing_alg_values_supported: string[];\n  id_token_encryption_alg_values_supported: string[];\n  id_token_encryption_enc_values_supported: string[];\n  request_object_signing_alg_values_supported: string[];\n  display_values_supported: string[];\n  claim_types_supported: string[];\n  claims_supported: string[];\n  claims_parameter_supported: boolean;\n  service_documentation: string;\n  ui_locales_supported: string[];\n  revocation_endpoint: string;\n}\n","export type EventType =\n  | 'discovery_document_loaded'\n  | 'jwks_load_error'\n  | 'invalid_nonce_in_state'\n  | 'discovery_document_load_error'\n  | 'discovery_document_validation_error'\n  | 'user_profile_loaded'\n  | 'user_profile_load_error'\n  | 'token_received'\n  | 'token_error'\n  | 'code_error'\n  | 'token_refreshed'\n  | 'token_refresh_error'\n  | 'silent_refresh_error'\n  | 'silently_refreshed'\n  | 'silent_refresh_timeout'\n  | 'token_validation_error'\n  | 'token_expires'\n  | 'session_changed'\n  | 'session_error'\n  | 'session_terminated'\n  | 'session_unchanged'\n  | 'logout'\n  | 'popup_closed'\n  | 'popup_blocked'\n  | 'token_revoke_error';\n\nexport abstract class OAuthEvent {\n  constructor(readonly type: EventType) {}\n}\n\nexport class OAuthSuccessEvent extends OAuthEvent {\n  constructor(type: EventType, readonly info: any = null) {\n    super(type);\n  }\n}\n\nexport class OAuthInfoEvent extends OAuthEvent {\n  constructor(type: EventType, readonly info: any = null) {\n    super(type);\n  }\n}\n\nexport class OAuthErrorEvent extends OAuthEvent {\n  constructor(\n    type: EventType,\n    readonly reason: object,\n    readonly params: object = null\n  ) {\n    super(type);\n  }\n}\n","// see: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22\nexport function b64DecodeUnicode(str) {\n  const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n\n  return decodeURIComponent(\n    atob(base64)\n      .split('')\n      .map(function (c) {\n        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n      })\n      .join('')\n  );\n}\n\nexport function base64UrlEncode(str): string {\n  const base64 = btoa(str);\n  return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","export class AuthConfig {\n  /**\n   * The client's id as registered with the auth server\n   */\n  public clientId? = '';\n\n  /**\n   * The client's redirectUri as registered with the auth server\n   */\n  public redirectUri? = '';\n\n  /**\n   * An optional second redirectUri where the auth server\n   * redirects the user to after logging out.\n   */\n  public postLogoutRedirectUri? = '';\n\n  /**\n   * Defines whether to use 'redirectUri' as a replacement\n   * of 'postLogoutRedirectUri' if the latter is not set.\n   */\n  public redirectUriAsPostLogoutRedirectUriFallback? = true;\n\n  /**\n   * The auth server's endpoint that allows to log\n   * the user in when using implicit flow.\n   */\n  public loginUrl? = '';\n\n  /**\n   * The requested scopes\n   */\n  public scope? = 'openid profile';\n\n  public resource? = '';\n\n  public rngUrl? = '';\n\n  /**\n   * Defines whether to use OpenId Connect during\n   * implicit flow.\n   */\n  public oidc? = true;\n\n  /**\n   * Defines whether to request an access token during\n   * implicit flow.\n   */\n  public requestAccessToken? = true;\n\n  public options?: any = null;\n\n  /**\n   * The issuer's uri.\n   */\n  public issuer? = '';\n\n  /**\n   * The logout url.\n   */\n  public logoutUrl? = '';\n\n  /**\n   * Defines whether to clear the hash fragment after logging in.\n   */\n  public clearHashAfterLogin? = true;\n\n  /**\n   * Url of the token endpoint as defined by OpenId Connect and OAuth 2.\n   */\n  public tokenEndpoint?: string = null;\n\n  /**\n   * Url of the revocation endpoint as defined by OpenId Connect and OAuth 2.\n   */\n  public revocationEndpoint?: string = null;\n\n  /**\n   * Names of known parameters sent out in the TokenResponse. https://tools.ietf.org/html/rfc6749#section-5.1\n   */\n  public customTokenParameters?: string[] = [];\n\n  /**\n   * Url of the userinfo endpoint as defined by OpenId Connect.\n   */\n  public userinfoEndpoint?: string = null;\n\n  public responseType? = '';\n\n  /**\n   * Defines whether additional debug information should\n   * be shown at the console. Note that in certain browsers\n   * the verbosity of the console needs to be explicitly set\n   * to include Debug level messages.\n   */\n  public showDebugInformation? = false;\n\n  /**\n   * The redirect uri used when doing silent refresh.\n   */\n  public silentRefreshRedirectUri? = '';\n\n  public silentRefreshMessagePrefix? = '';\n\n  /**\n   * Set this to true to display the iframe used for\n   * silent refresh for debugging.\n   */\n  public silentRefreshShowIFrame? = false;\n\n  /**\n   * Timeout for silent refresh.\n   * @internal\n   * @deprecated use silentRefreshTimeout\n   */\n  public siletRefreshTimeout?: number = 1000 * 20;\n\n  /**\n   * Timeout for silent refresh.\n   */\n  public silentRefreshTimeout?: number = 1000 * 20;\n\n  /**\n   * Some auth servers don't allow using password flow\n   * w/o a client secret while the standards do not\n   * demand for it. In this case, you can set a password\n   * here. As this password is exposed to the public\n   * it does not bring additional security and is therefore\n   * as good as using no password.\n   */\n  public dummyClientSecret?: string = '';\n\n  /**\n   * Defines whether https is required.\n   * The default value is remoteOnly which only allows\n   * http for localhost, while every other domains need\n   * to be used with https.\n   */\n  public requireHttps?: boolean | 'remoteOnly' = 'remoteOnly';\n\n  /**\n   * Defines whether every url provided by the discovery\n   * document has to start with the issuer's url.\n   */\n  public strictDiscoveryDocumentValidation? = true;\n\n  /**\n   * JSON Web Key Set (https://tools.ietf.org/html/rfc7517)\n   * with keys used to validate received id_tokens.\n   * This is taken out of the disovery document. Can be set manually too.\n   */\n  public jwks?: object = null;\n\n  /**\n   * Map with additional query parameter that are appended to\n   * the request when initializing implicit flow.\n   */\n  public customQueryParams?: object = null;\n\n  public silentRefreshIFrameName? = 'angular-oauth-oidc-silent-refresh-iframe';\n\n  /**\n   * Defines when the token_timeout event should be raised.\n   * If you set this to the default value 0.75, the event\n   * is triggered after 75% of the token's life time.\n   */\n  public timeoutFactor? = 0.75;\n\n  /**\n   * If true, the lib will try to check whether the user\n   * is still logged in on a regular basis as described\n   * in http://openid.net/specs/openid-connect-session-1_0.html#ChangeNotification\n   */\n  public sessionChecksEnabled? = false;\n\n  /**\n   * Interval in msec for checking the session\n   * according to http://openid.net/specs/openid-connect-session-1_0.html#ChangeNotification\n   */\n  public sessionCheckIntervall? = 3 * 1000;\n\n  /**\n   * Url for the iframe used for session checks\n   */\n  public sessionCheckIFrameUrl?: string = null;\n\n  /**\n   * Name of the iframe to use for session checks\n   */\n  public sessionCheckIFrameName? = 'angular-oauth-oidc-check-session-iframe';\n\n  /**\n   * This property has been introduced to disable at_hash checks\n   * and is indented for Identity Provider that does not deliver\n   * an at_hash EVEN THOUGH its recommended by the OIDC specs.\n   * Of course, when disabling these checks then we are bypassing\n   * a security check which means we are more vulnerable.\n   */\n  public disableAtHashCheck? = false;\n\n  /**\n   * Defines wether to check the subject of a refreshed token after silent refresh.\n   * Normally, it should be the same as before.\n   */\n  public skipSubjectCheck? = false;\n\n  public useIdTokenHintForSilentRefresh? = false;\n\n  /**\n   * Defined whether to skip the validation of the issuer in the discovery document.\n   * Normally, the discovey document's url starts with the url of the issuer.\n   */\n  public skipIssuerCheck? = false;\n\n  /**\n   * According to rfc6749 it is recommended (but not required) that the auth\n   * server exposes the access_token's life time in seconds.\n   * This is a fallback value for the case this value is not exposed.\n   */\n  public fallbackAccessTokenExpirationTimeInSec?: number;\n\n  /**\n   * final state sent to issuer is built as follows:\n   * state = nonce + nonceStateSeparator + additional state\n   * Default separator is ';' (encoded %3B).\n   * In rare cases, this character might be forbidden or inconvenient to use by the issuer so it can be customized.\n   */\n  public nonceStateSeparator? = ';';\n\n  /**\n   * Set this to true to use HTTP BASIC auth for AJAX calls\n   */\n  public useHttpBasicAuth? = false;\n\n  /**\n   * The window of time (in seconds) to allow the current time to deviate when validating id_token's iat and exp values.\n   */\n  public clockSkewInSec?: number;\n\n  /**\n   * Decreases the Expiration time of tokens by this number of seconds\n   */\n  public decreaseExpirationBySec? = 0;\n\n  /**\n   * The interceptors waits this time span if there is no token\n   */\n  public waitForTokenInMsec? = 0;\n\n  /**\n   * Set this to true if you want to use silent refresh together with\n   * code flow. As silent refresh is the only option for refreshing\n   * with implicit flow, you don't need to explicitly turn it on in\n   * this case.\n   */\n  public useSilentRefresh?;\n\n  /**\n   * Code Flow is by defauld used together with PKCI which is also higly recommented.\n   * You can disbale it here by setting this flag to true.\n   * https://tools.ietf.org/html/rfc7636#section-1.1\n   */\n  public disablePKCE? = false;\n\n  /**\n   * Set this to true to preserve the requested route including query parameters after code flow login.\n   * This setting enables deep linking for the code flow.\n   */\n  public preserveRequestedRoute? = false;\n\n  /**\n   * Allows to disable the timer for the id_token used\n   * for token refresh\n   */\n  public disableIdTokenTimer? = false;\n\n  /**\n   * Blocks other origins requesting a silent refresh\n   */\n  public checkOrigin? = false;\n\n  constructor(json?: Partial<AuthConfig>) {\n    if (json) {\n      Object.assign(this, json);\n    }\n  }\n\n  /**\n   * This property allows you to override the method that is used to open the login url,\n   * allowing a way for implementations to specify their own method of routing to new\n   * urls.\n   */\n  public openUri?: (uri: string) => void = (uri) => {\n    location.href = uri;\n  };\n}\n","import { HttpParameterCodec } from '@angular/common/http';\n/**\n * This custom encoder allows charactes like +, % and / to be used in passwords\n */\nexport class WebHttpUrlEncodingCodec implements HttpParameterCodec {\n  encodeKey(k: string): string {\n    return encodeURIComponent(k);\n  }\n\n  encodeValue(v: string): string {\n    return encodeURIComponent(v);\n  }\n\n  decodeKey(k: string): string {\n    return decodeURIComponent(k);\n  }\n\n  decodeValue(v: string) {\n    return decodeURIComponent(v);\n  }\n}\n","import { base64UrlEncode } from '../base64-helper';\n\nexport interface ValidationParams {\n  idToken: string;\n  accessToken: string;\n  idTokenHeader: object;\n  idTokenClaims: object;\n  jwks: object;\n  loadKeys: () => Promise<object>;\n}\n\n/**\n * Interface for Handlers that are hooked in to\n * validate tokens.\n */\nexport abstract class ValidationHandler {\n  /**\n   * Validates the signature of an id_token.\n   */\n  public abstract validateSignature(\n    validationParams: ValidationParams\n  ): Promise<any>;\n\n  /**\n   * Validates the at_hash in an id_token against the received access_token.\n   */\n  public abstract validateAtHash(\n    validationParams: ValidationParams\n  ): Promise<boolean>;\n}\n\n/**\n * This abstract implementation of ValidationHandler already implements\n * the method validateAtHash. However, to make use of it,\n * you have to override the method calcHash.\n */\nexport abstract class AbstractValidationHandler implements ValidationHandler {\n  /**\n   * Validates the signature of an id_token.\n   */\n  abstract validateSignature(validationParams: ValidationParams): Promise<any>;\n\n  /**\n   * Validates the at_hash in an id_token against the received access_token.\n   */\n  async validateAtHash(params: ValidationParams): Promise<boolean> {\n    const hashAlg = this.inferHashAlgorithm(params.idTokenHeader);\n\n    const tokenHash = await this.calcHash(params.accessToken, hashAlg); // sha256(accessToken, { asString: true });\n\n    const leftMostHalf = tokenHash.substr(0, tokenHash.length / 2);\n\n    const atHash = base64UrlEncode(leftMostHalf);\n\n    const claimsAtHash = params.idTokenClaims['at_hash'].replace(/=/g, '');\n\n    if (atHash !== claimsAtHash) {\n      console.error('exptected at_hash: ' + atHash);\n      console.error('actual at_hash: ' + claimsAtHash);\n    }\n\n    return atHash === claimsAtHash;\n  }\n\n  /**\n   * Infers the name of the hash algorithm to use\n   * from the alg field of an id_token.\n   *\n   * @param jwtHeader the id_token's parsed header\n   */\n  protected inferHashAlgorithm(jwtHeader: object): string {\n    const alg: string = jwtHeader['alg'];\n\n    if (!alg.match(/^.S[0-9]{3}$/)) {\n      throw new Error('Algorithm not supported: ' + alg);\n    }\n\n    return 'sha-' + alg.substr(2);\n  }\n\n  /**\n   * Calculates the hash for the passed value by using\n   * the passed hash algorithm.\n   *\n   * @param valueToHash\n   * @param algorithm\n   */\n  protected abstract calcHash(\n    valueToHash: string,\n    algorithm: string\n  ): Promise<string>;\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class UrlHelperService {\n  public getHashFragmentParams(customHashFragment?: string): object {\n    let hash = customHashFragment || window.location.hash;\n\n    hash = decodeURIComponent(hash);\n\n    if (hash.indexOf('#') !== 0) {\n      return {};\n    }\n\n    const questionMarkPosition = hash.indexOf('?');\n\n    if (questionMarkPosition > -1) {\n      hash = hash.substr(questionMarkPosition + 1);\n    } else {\n      hash = hash.substr(1);\n    }\n\n    return this.parseQueryString(hash);\n  }\n\n  public parseQueryString(queryString: string): object {\n    const data = {};\n    let pair, separatorIndex, escapedKey, escapedValue, key, value;\n\n    if (queryString === null) {\n      return data;\n    }\n\n    const pairs = queryString.split('&');\n\n    for (let i = 0; i < pairs.length; i++) {\n      pair = pairs[i];\n      separatorIndex = pair.indexOf('=');\n\n      if (separatorIndex === -1) {\n        escapedKey = pair;\n        escapedValue = null;\n      } else {\n        escapedKey = pair.substr(0, separatorIndex);\n        escapedValue = pair.substr(separatorIndex + 1);\n      }\n\n      key = decodeURIComponent(escapedKey);\n      value = decodeURIComponent(escapedValue);\n\n      if (key.substr(0, 1) === '/') {\n        key = key.substr(1);\n      }\n\n      data[key] = value;\n    }\n\n    return data;\n  }\n}\n","// Credits: https://github.com/dchest/fast-sha256-js/tree/master/src\n// We add this lib directly b/c the published version of fast-sha256-js\n// is commonjs and hence leads to a warning about tree-shakability emitted\n// by the Angular CLI\n\n// SHA-256 (+ HMAC and PBKDF2) for JavaScript.\n//\n// Written in 2014-2016 by Dmitry Chestnykh.\n// Public domain, no warranty.\n//\n// Functions (accept and return Uint8Arrays):\n//\n//   sha256(message) -> hash\n//   sha256.hmac(key, message) -> mac\n//   sha256.pbkdf2(password, salt, rounds, dkLen) -> dk\n//\n//  Classes:\n//\n//   new sha256.Hash()\n//   new sha256.HMAC(key)\n//\nexport const digestLength = 32;\nexport const blockSize = 64;\n\n// SHA-256 constants\nconst K = new Uint32Array([\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n  0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n  0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n  0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n  0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n  0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nfunction hashBlocks(\n  w: Int32Array,\n  v: Int32Array,\n  p: Uint8Array,\n  pos: number,\n  len: number\n): number {\n  let a: number,\n    b: number,\n    c: number,\n    d: number,\n    e: number,\n    f: number,\n    g: number,\n    h: number,\n    u: number,\n    i: number,\n    j: number,\n    t1: number,\n    t2: number;\n  while (len >= 64) {\n    a = v[0];\n    b = v[1];\n    c = v[2];\n    d = v[3];\n    e = v[4];\n    f = v[5];\n    g = v[6];\n    h = v[7];\n\n    for (i = 0; i < 16; i++) {\n      j = pos + i * 4;\n      w[i] =\n        ((p[j] & 0xff) << 24) |\n        ((p[j + 1] & 0xff) << 16) |\n        ((p[j + 2] & 0xff) << 8) |\n        (p[j + 3] & 0xff);\n    }\n\n    for (i = 16; i < 64; i++) {\n      u = w[i - 2];\n      t1 =\n        ((u >>> 17) | (u << (32 - 17))) ^\n        ((u >>> 19) | (u << (32 - 19))) ^\n        (u >>> 10);\n\n      u = w[i - 15];\n      t2 =\n        ((u >>> 7) | (u << (32 - 7))) ^\n        ((u >>> 18) | (u << (32 - 18))) ^\n        (u >>> 3);\n\n      w[i] = ((t1 + w[i - 7]) | 0) + ((t2 + w[i - 16]) | 0);\n    }\n\n    for (i = 0; i < 64; i++) {\n      t1 =\n        ((((((e >>> 6) | (e << (32 - 6))) ^\n          ((e >>> 11) | (e << (32 - 11))) ^\n          ((e >>> 25) | (e << (32 - 25)))) +\n          ((e & f) ^ (~e & g))) |\n          0) +\n          ((h + ((K[i] + w[i]) | 0)) | 0)) |\n        0;\n\n      t2 =\n        ((((a >>> 2) | (a << (32 - 2))) ^\n          ((a >>> 13) | (a << (32 - 13))) ^\n          ((a >>> 22) | (a << (32 - 22)))) +\n          ((a & b) ^ (a & c) ^ (b & c))) |\n        0;\n\n      h = g;\n      g = f;\n      f = e;\n      e = (d + t1) | 0;\n      d = c;\n      c = b;\n      b = a;\n      a = (t1 + t2) | 0;\n    }\n\n    v[0] += a;\n    v[1] += b;\n    v[2] += c;\n    v[3] += d;\n    v[4] += e;\n    v[5] += f;\n    v[6] += g;\n    v[7] += h;\n\n    pos += 64;\n    len -= 64;\n  }\n  return pos;\n}\n\n// Hash implements SHA256 hash algorithm.\nexport class Hash {\n  digestLength: number = digestLength;\n  blockSize: number = blockSize;\n\n  // Note: Int32Array is used instead of Uint32Array for performance reasons.\n  private state: Int32Array = new Int32Array(8); // hash state\n  private temp: Int32Array = new Int32Array(64); // temporary state\n  private buffer: Uint8Array = new Uint8Array(128); // buffer for data to hash\n  private bufferLength = 0; // number of bytes in buffer\n  private bytesHashed = 0; // number of total bytes hashed\n\n  finished = false; // indicates whether the hash was finalized\n\n  constructor() {\n    this.reset();\n  }\n\n  // Resets hash state making it possible\n  // to re-use this instance to hash other data.\n  reset(): this {\n    this.state[0] = 0x6a09e667;\n    this.state[1] = 0xbb67ae85;\n    this.state[2] = 0x3c6ef372;\n    this.state[3] = 0xa54ff53a;\n    this.state[4] = 0x510e527f;\n    this.state[5] = 0x9b05688c;\n    this.state[6] = 0x1f83d9ab;\n    this.state[7] = 0x5be0cd19;\n    this.bufferLength = 0;\n    this.bytesHashed = 0;\n    this.finished = false;\n    return this;\n  }\n\n  // Cleans internal buffers and re-initializes hash state.\n  clean() {\n    for (let i = 0; i < this.buffer.length; i++) {\n      this.buffer[i] = 0;\n    }\n    for (let i = 0; i < this.temp.length; i++) {\n      this.temp[i] = 0;\n    }\n    this.reset();\n  }\n\n  // Updates hash state with the given data.\n  //\n  // Optionally, length of the data can be specified to hash\n  // fewer bytes than data.length.\n  //\n  // Throws error when trying to update already finalized hash:\n  // instance must be reset to use it again.\n  update(data: Uint8Array, dataLength: number = data.length): this {\n    if (this.finished) {\n      throw new Error(\"SHA256: can't update because hash was finished.\");\n    }\n    let dataPos = 0;\n    this.bytesHashed += dataLength;\n    if (this.bufferLength > 0) {\n      while (this.bufferLength < 64 && dataLength > 0) {\n        this.buffer[this.bufferLength++] = data[dataPos++];\n        dataLength--;\n      }\n      if (this.bufferLength === 64) {\n        hashBlocks(this.temp, this.state, this.buffer, 0, 64);\n        this.bufferLength = 0;\n      }\n    }\n    if (dataLength >= 64) {\n      dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);\n      dataLength %= 64;\n    }\n    while (dataLength > 0) {\n      this.buffer[this.bufferLength++] = data[dataPos++];\n      dataLength--;\n    }\n    return this;\n  }\n\n  // Finalizes hash state and puts hash into out.\n  //\n  // If hash was already finalized, puts the same value.\n  finish(out: Uint8Array): this {\n    if (!this.finished) {\n      const bytesHashed = this.bytesHashed;\n      const left = this.bufferLength;\n      const bitLenHi = (bytesHashed / 0x20000000) | 0;\n      const bitLenLo = bytesHashed << 3;\n      const padLength = bytesHashed % 64 < 56 ? 64 : 128;\n\n      this.buffer[left] = 0x80;\n      for (let i = left + 1; i < padLength - 8; i++) {\n        this.buffer[i] = 0;\n      }\n      this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff;\n      this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff;\n      this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff;\n      this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff;\n      this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff;\n      this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff;\n      this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff;\n      this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff;\n\n      hashBlocks(this.temp, this.state, this.buffer, 0, padLength);\n\n      this.finished = true;\n    }\n\n    for (let i = 0; i < 8; i++) {\n      out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff;\n      out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n      out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n      out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n    }\n\n    return this;\n  }\n\n  // Returns the final hash digest.\n  digest(): Uint8Array {\n    const out = new Uint8Array(this.digestLength);\n    this.finish(out);\n    return out;\n  }\n\n  // Internal function for use in HMAC for optimization.\n  _saveState(out: Uint32Array) {\n    for (let i = 0; i < this.state.length; i++) {\n      out[i] = this.state[i];\n    }\n  }\n\n  // Internal function for use in HMAC for optimization.\n  _restoreState(from: Uint32Array, bytesHashed: number) {\n    for (let i = 0; i < this.state.length; i++) {\n      this.state[i] = from[i];\n    }\n    this.bytesHashed = bytesHashed;\n    this.finished = false;\n    this.bufferLength = 0;\n  }\n}\n\n// HMAC implements HMAC-SHA256 message authentication algorithm.\nexport class HMAC {\n  private inner: Hash = new Hash();\n  private outer: Hash = new Hash();\n\n  blockSize: number = this.inner.blockSize;\n  digestLength: number = this.inner.digestLength;\n\n  // Copies of hash states after keying.\n  // Need for quick reset without hashing they key again.\n  private istate: Uint32Array;\n  private ostate: Uint32Array;\n\n  constructor(key: Uint8Array) {\n    const pad = new Uint8Array(this.blockSize);\n    if (key.length > this.blockSize) {\n      new Hash().update(key).finish(pad).clean();\n    } else {\n      for (let i = 0; i < key.length; i++) {\n        pad[i] = key[i];\n      }\n    }\n    for (let i = 0; i < pad.length; i++) {\n      pad[i] ^= 0x36;\n    }\n    this.inner.update(pad);\n\n    for (let i = 0; i < pad.length; i++) {\n      pad[i] ^= 0x36 ^ 0x5c;\n    }\n    this.outer.update(pad);\n\n    this.istate = new Uint32Array(8);\n    this.ostate = new Uint32Array(8);\n\n    this.inner._saveState(this.istate);\n    this.outer._saveState(this.ostate);\n\n    for (let i = 0; i < pad.length; i++) {\n      pad[i] = 0;\n    }\n  }\n\n  // Returns HMAC state to the state initialized with key\n  // to make it possible to run HMAC over the other data with the same\n  // key without creating a new instance.\n  reset(): this {\n    this.inner._restoreState(this.istate, this.inner.blockSize);\n    this.outer._restoreState(this.ostate, this.outer.blockSize);\n    return this;\n  }\n\n  // Cleans HMAC state.\n  clean() {\n    for (let i = 0; i < this.istate.length; i++) {\n      this.ostate[i] = this.istate[i] = 0;\n    }\n    this.inner.clean();\n    this.outer.clean();\n  }\n\n  // Updates state with provided data.\n  update(data: Uint8Array): this {\n    this.inner.update(data);\n    return this;\n  }\n\n  // Finalizes HMAC and puts the result in out.\n  finish(out: Uint8Array): this {\n    if (this.outer.finished) {\n      this.outer.finish(out);\n    } else {\n      this.inner.finish(out);\n      this.outer.update(out, this.digestLength).finish(out);\n    }\n    return this;\n  }\n\n  // Returns message authentication code.\n  digest(): Uint8Array {\n    const out = new Uint8Array(this.digestLength);\n    this.finish(out);\n    return out;\n  }\n}\n\n// Returns SHA256 hash of data.\nexport function hash(data: Uint8Array): Uint8Array {\n  const h = new Hash().update(data);\n  const digest = h.digest();\n  h.clean();\n  return digest;\n}\n\n// Function hash is both available as module.hash and as default export.\nexport default hash;\n\n// Returns HMAC-SHA256 of data under the key.\nexport function hmac(key: Uint8Array, data: Uint8Array) {\n  const h = new HMAC(key).update(data);\n  const digest = h.digest();\n  h.clean();\n  return digest;\n}\n\n// Fills hkdf buffer like this:\n// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)\nfunction fillBuffer(\n  buffer: Uint8Array,\n  hmac: HMAC,\n  info: Uint8Array | undefined,\n  counter: Uint8Array\n) {\n  // Counter is a byte value: check if it overflowed.\n  const num = counter[0];\n\n  if (num === 0) {\n    throw new Error('hkdf: cannot expand more');\n  }\n\n  // Prepare HMAC instance for new data with old key.\n  hmac.reset();\n\n  // Hash in previous output if it was generated\n  // (i.e. counter is greater than 1).\n  if (num > 1) {\n    hmac.update(buffer);\n  }\n\n  // Hash in info if it exists.\n  if (info) {\n    hmac.update(info);\n  }\n\n  // Hash in the counter.\n  hmac.update(counter);\n\n  // Output result to buffer and clean HMAC instance.\n  hmac.finish(buffer);\n\n  // Increment counter inside typed array, this works properly.\n  counter[0]++;\n}\n\nconst hkdfSalt = new Uint8Array(digestLength); // Filled with zeroes.\nexport function hkdf(\n  key: Uint8Array,\n  salt: Uint8Array = hkdfSalt,\n  info?: Uint8Array,\n  length = 32\n) {\n  const counter = new Uint8Array([1]);\n\n  // HKDF-Extract uses salt as HMAC key, and key as data.\n  const okm = hmac(salt, key);\n\n  // Initialize HMAC for expanding with extracted key.\n  // Ensure no collisions with `hmac` function.\n  const hmac_ = new HMAC(okm);\n\n  // Allocate buffer.\n  const buffer = new Uint8Array(hmac_.digestLength);\n  let bufpos = buffer.length;\n\n  const out = new Uint8Array(length);\n  for (let i = 0; i < length; i++) {\n    if (bufpos === buffer.length) {\n      fillBuffer(buffer, hmac_, info, counter);\n      bufpos = 0;\n    }\n    out[i] = buffer[bufpos++];\n  }\n\n  hmac_.clean();\n  buffer.fill(0);\n  counter.fill(0);\n  return out;\n}\n\n// Derives a key from password and salt using PBKDF2-HMAC-SHA256\n// with the given number of iterations.\n//\n// The number of bytes returned is equal to dkLen.\n//\n// (For better security, avoid dkLen greater than hash length - 32 bytes).\nexport function pbkdf2(\n  password: Uint8Array,\n  salt: Uint8Array,\n  iterations: number,\n  dkLen: number\n) {\n  const prf = new HMAC(password);\n  const len = prf.digestLength;\n  const ctr = new Uint8Array(4);\n  const t = new Uint8Array(len);\n  const u = new Uint8Array(len);\n  const dk = new Uint8Array(dkLen);\n\n  for (let i = 0; i * len < dkLen; i++) {\n    const c = i + 1;\n    ctr[0] = (c >>> 24) & 0xff;\n    ctr[1] = (c >>> 16) & 0xff;\n    ctr[2] = (c >>> 8) & 0xff;\n    ctr[3] = (c >>> 0) & 0xff;\n    prf.reset();\n    prf.update(salt);\n    prf.update(ctr);\n    prf.finish(u);\n    for (let j = 0; j < len; j++) {\n      t[j] = u[j];\n    }\n    for (let j = 2; j <= iterations; j++) {\n      prf.reset();\n      prf.update(u).finish(u);\n      for (let k = 0; k < len; k++) {\n        t[k] ^= u[k];\n      }\n    }\n    for (let j = 0; j < len && i * len + j < dkLen; j++) {\n      dk[i * len + j] = t[j];\n    }\n  }\n  for (let i = 0; i < len; i++) {\n    t[i] = u[i] = 0;\n  }\n  for (let i = 0; i < 4; i++) {\n    ctr[i] = 0;\n  }\n  prf.clean();\n  return dk;\n}\n","import { Injectable } from '@angular/core';\n\nimport { factory } from './js-sha256';\n// const sha256 = factory();\n\nimport fsha256 from './fast-sha256js';\n\n/**\n * Abstraction for crypto algorithms\n */\nexport abstract class HashHandler {\n  abstract calcHash(valueToHash: string, algorithm: string): Promise<string>;\n}\n\nfunction decodeUTF8(s) {\n  if (typeof s !== 'string') throw new TypeError('expected string');\n  const d = s,\n    b = new Uint8Array(d.length);\n  for (let i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);\n  return b;\n}\n\nfunction encodeUTF8(arr) {\n  const s = [];\n  for (let i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i]));\n  return s.join('');\n}\n\n@Injectable()\nexport class DefaultHashHandler implements HashHandler {\n  async calcHash(valueToHash: string, algorithm: string): Promise<string> {\n    // const encoder = new TextEncoder();\n    // const hashArray = await window.crypto.subtle.digest(algorithm, data);\n    // const data = encoder.encode(valueToHash);\n\n    // const fhash = fsha256(valueToHash);\n\n    const candHash = encodeUTF8(fsha256(decodeUTF8(valueToHash)));\n\n    // const hashArray = (sha256 as any).array(valueToHash);\n    // // const hashString = this.toHashString(hashArray);\n    // const hashString = this.toHashString2(hashArray);\n\n    // console.debug('hash orig - cand', candHash, hashString);\n    // alert(1);\n\n    return candHash;\n  }\n\n  toHashString2(byteArray: number[]) {\n    let result = '';\n    for (const e of byteArray) {\n      result += String.fromCharCode(e);\n    }\n    return result;\n  }\n\n  toHashString(buffer: ArrayBuffer) {\n    const byteArray = new Uint8Array(buffer);\n    let result = '';\n    for (const e of byteArray) {\n      result += String.fromCharCode(e);\n    }\n    return result;\n  }\n\n  // hexString(buffer) {\n  //     const byteArray = new Uint8Array(buffer);\n  //     const hexCodes = [...byteArray].map(value => {\n  //       const hexCode = value.toString(16);\n  //       const paddedHexCode = hexCode.padStart(2, '0');\n  //       return paddedHexCode;\n  //     });\n\n  //     return hexCodes.join('');\n  //   }\n\n  // toHashString(hexString: string) {\n  //   let result = '';\n  //   for (let i = 0; i < hexString.length; i += 2) {\n  //     let hexDigit = hexString.charAt(i) + hexString.charAt(i + 1);\n  //     let num = parseInt(hexDigit, 16);\n  //     result += String.fromCharCode(num);\n  //   }\n  //   return result;\n  // }\n}\n","import { Injectable, NgZone, Optional, OnDestroy, Inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport {\n  HttpClient,\n  HttpHeaders,\n  HttpParams,\n  HttpErrorResponse,\n} from '@angular/common/http';\nimport {\n  Observable,\n  Subject,\n  Subscription,\n  of,\n  race,\n  from,\n  combineLatest,\n  throwError,\n} from 'rxjs';\nimport {\n  filter,\n  delay,\n  first,\n  tap,\n  map,\n  switchMap,\n  debounceTime,\n  catchError,\n} from 'rxjs/operators';\n\nimport { DateTimeProvider } from './date-time-provider';\n\nimport {\n  ValidationHandler,\n  ValidationParams,\n} from './token-validation/validation-handler';\nimport { UrlHelperService } from './url-helper.service';\nimport {\n  OAuthEvent,\n  OAuthInfoEvent,\n  OAuthErrorEvent,\n  OAuthSuccessEvent,\n} from './events';\nimport {\n  OAuthLogger,\n  OAuthStorage,\n  LoginOptions,\n  ParsedIdToken,\n  OidcDiscoveryDoc,\n  TokenResponse,\n} from './types';\nimport { b64DecodeUnicode, base64UrlEncode } from './base64-helper';\nimport { AuthConfig } from './auth.config';\nimport { WebHttpUrlEncodingCodec } from './encoder';\nimport { HashHandler } from './token-validation/hash-handler';\n\n/**\n * Service for logging in and logging out with\n * OIDC and OAuth2. Supports implicit flow and\n * password flow.\n */\n@Injectable()\nexport class OAuthService extends AuthConfig implements OnDestroy {\n  // Extending AuthConfig ist just for LEGACY reasons\n  // to not break existing code.\n\n  /**\n   * The ValidationHandler used to validate received\n   * id_tokens.\n   */\n  public tokenValidationHandler: ValidationHandler;\n\n  /**\n   * @internal\n   * Deprecated:  use property events instead\n   */\n  public discoveryDocumentLoaded = false;\n\n  /**\n   * @internal\n   * Deprecated:  use property events instead\n   */\n  public discoveryDocumentLoaded$: Observable<OidcDiscoveryDoc>;\n\n  /**\n   * Informs about events, like token_received or token_expires.\n   * See the string enum EventType for a full list of event types.\n   */\n  public events: Observable<OAuthEvent>;\n\n  /**\n   * The received (passed around) state, when logging\n   * in with implicit flow.\n   */\n  public state? = '';\n\n  protected eventsSubject: Subject<OAuthEvent> = new Subject<OAuthEvent>();\n  protected discoveryDocumentLoadedSubject: Subject<OidcDiscoveryDoc> =\n    new Subject<OidcDiscoveryDoc>();\n  protected silentRefreshPostMessageEventListener: EventListener;\n  protected grantTypesSupported: Array<string> = [];\n  protected _storage: OAuthStorage;\n  protected accessTokenTimeoutSubscription: Subscription;\n  protected idTokenTimeoutSubscription: Subscription;\n  protected tokenReceivedSubscription: Subscription;\n  protected automaticRefreshSubscription: Subscription;\n  protected sessionCheckEventListener: EventListener;\n  protected jwksUri: string;\n  protected sessionCheckTimer: any;\n  protected silentRefreshSubject: string;\n  protected inImplicitFlow = false;\n\n  protected saveNoncesInLocalStorage = false;\n  private document: Document;\n\n  constructor(\n    protected ngZone: NgZone,\n    protected http: HttpClient,\n    @Optional() storage: OAuthStorage,\n    @Optional() tokenValidationHandler: ValidationHandler,\n    @Optional() protected config: AuthConfig,\n    protected urlHelper: UrlHelperService,\n    protected logger: OAuthLogger,\n    @Optional() protected crypto: HashHandler,\n    @Inject(DOCUMENT) document: Document,\n    protected dateTimeService: DateTimeProvider\n  ) {\n    super();\n\n    this.debug('angular-oauth2-oidc v10');\n\n    // See https://github.com/manfredsteyer/angular-oauth2-oidc/issues/773 for why this is needed\n    this.document = document;\n\n    if (!config) {\n      config = {};\n    }\n\n    this.discoveryDocumentLoaded$ =\n      this.discoveryDocumentLoadedSubject.asObservable();\n    this.events = this.eventsSubject.asObservable();\n\n    if (tokenValidationHandler) {\n      this.tokenValidationHandler = tokenValidationHandler;\n    }\n\n    if (config) {\n      this.configure(config);\n    }\n\n    try {\n      if (storage) {\n        this.setStorage(storage);\n      } else if (typeof sessionStorage !== 'undefined') {\n        this.setStorage(sessionStorage);\n      }\n    } catch (e) {\n      console.error(\n        'No OAuthStorage provided and cannot access default (sessionStorage).' +\n          'Consider providing a custom OAuthStorage implementation in your module.',\n        e\n      );\n    }\n\n    // in IE, sessionStorage does not always survive a redirect\n    if (this.checkLocalStorageAccessable()) {\n      const ua = window?.navigator?.userAgent;\n      const msie = ua?.includes('MSIE ') || ua?.includes('Trident');\n\n      if (msie) {\n        this.saveNoncesInLocalStorage = true;\n      }\n    }\n\n    this.setupRefreshTimer();\n  }\n\n  private checkLocalStorageAccessable() {\n    if (typeof window === 'undefined') return false;\n\n    const test = 'test';\n    try {\n      if (typeof window['localStorage'] === 'undefined') return false;\n\n      localStorage.setItem(test, test);\n      localStorage.removeItem(test);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  /**\n   * Use this method to configure the service\n   * @param config the configuration\n   */\n  public configure(config: AuthConfig): void {\n    // For the sake of downward compatibility with\n    // original configuration API\n    Object.assign(this, new AuthConfig(), config);\n\n    this.config = Object.assign({} as AuthConfig, new AuthConfig(), config);\n\n    if (this.sessionChecksEnabled) {\n      this.setupSessionCheck();\n    }\n\n    this.configChanged();\n  }\n\n  protected configChanged(): void {\n    this.setupRefreshTimer();\n  }\n\n  public restartSessionChecksIfStillLoggedIn(): void {\n    if (this.hasValidIdToken()) {\n      this.initSessionCheck();\n    }\n  }\n\n  protected restartRefreshTimerIfStillLoggedIn(): void {\n    this.setupExpirationTimers();\n  }\n\n  protected setupSessionCheck(): void {\n    this.events\n      .pipe(filter((e) => e.type === 'token_received'))\n      .subscribe(() => {\n        this.initSessionCheck();\n      });\n  }\n\n  /**\n   * Will set up up silent refreshing for when the token is\n   * about to expire. When the user is logged out via this.logOut method, the\n   * silent refreshing will pause and not refresh the tokens until the user is\n   * logged back in via receiving a new token.\n   * @param params Additional parameter to pass\n   * @param listenTo Set up automatic refresh of a specific token type\n   */\n  public setupAutomaticSilentRefresh(\n    params: object = {},\n    listenTo?: 'access_token' | 'id_token' | 'any',\n    noPrompt = true\n  ): void {\n    let shouldRunSilentRefresh = true;\n    this.clearAutomaticRefreshTimer();\n    this.automaticRefreshSubscription = this.events\n      .pipe(\n        tap((e) => {\n          if (e.type === 'token_received') {\n            shouldRunSilentRefresh = true;\n          } else if (e.type === 'logout') {\n            shouldRunSilentRefresh = false;\n          }\n        }),\n        filter(\n          (e: OAuthInfoEvent) =>\n            e.type === 'token_expires' &&\n            (listenTo == null || listenTo === 'any' || e.info === listenTo)\n        ),\n        debounceTime(1000)\n      )\n      .subscribe(() => {\n        if (shouldRunSilentRefresh) {\n          // this.silentRefresh(params, noPrompt).catch(_ => {\n          this.refreshInternal(params, noPrompt).catch(() => {\n            this.debug('Automatic silent refresh did not work');\n          });\n        }\n      });\n\n    this.restartRefreshTimerIfStillLoggedIn();\n  }\n\n  protected refreshInternal(\n    params,\n    noPrompt\n  ): Promise<TokenResponse | OAuthEvent> {\n    if (!this.useSilentRefresh && this.responseType === 'code') {\n      return this.refreshToken();\n    } else {\n      return this.silentRefresh(params, noPrompt);\n    }\n  }\n\n  /**\n   * Convenience method that first calls `loadDiscoveryDocument(...)` and\n   * directly chains using the `then(...)` part of the promise to call\n   * the `tryLogin(...)` method.\n   *\n   * @param options LoginOptions to pass through to `tryLogin(...)`\n   */\n  public loadDiscoveryDocumentAndTryLogin(\n    options: LoginOptions = null\n  ): Promise<boolean> {\n    return this.loadDiscoveryDocument().then(() => {\n      return this.tryLogin(options);\n    });\n  }\n\n  /**\n   * Convenience method that first calls `loadDiscoveryDocumentAndTryLogin(...)`\n   * and if then chains to `initLoginFlow()`, but only if there is no valid\n   * IdToken or no valid AccessToken.\n   *\n   * @param options LoginOptions to pass through to `tryLogin(...)`\n   */\n  public loadDiscoveryDocumentAndLogin(\n    options: LoginOptions & { state?: string } = null\n  ): Promise<boolean> {\n    options = options || {};\n    return this.loadDiscoveryDocumentAndTryLogin(options).then(() => {\n      if (!this.hasValidIdToken() || !this.hasValidAccessToken()) {\n        const state = typeof options.state === 'string' ? options.state : '';\n        this.initLoginFlow(state);\n        return false;\n      } else {\n        return true;\n      }\n    });\n  }\n\n  protected debug(...args): void {\n    if (this.showDebugInformation) {\n      this.logger.debug(...args);\n    }\n  }\n\n  protected validateUrlFromDiscoveryDocument(url: string): string[] {\n    const errors: string[] = [];\n    const httpsCheck = this.validateUrlForHttps(url);\n    const issuerCheck = this.validateUrlAgainstIssuer(url);\n\n    if (!httpsCheck) {\n      errors.push(\n        'https for all urls required. Also for urls received by discovery.'\n      );\n    }\n\n    if (!issuerCheck) {\n      errors.push(\n        'Every url in discovery document has to start with the issuer url.' +\n          'Also see property strictDiscoveryDocumentValidation.'\n      );\n    }\n\n    return errors;\n  }\n\n  protected validateUrlForHttps(url: string): boolean {\n    if (!url) {\n      return true;\n    }\n\n    const lcUrl = url.toLowerCase();\n\n    if (this.requireHttps === false) {\n      return true;\n    }\n\n    if (\n      (lcUrl.match(/^http:\\/\\/localhost($|[:/])/) ||\n        lcUrl.match(/^http:\\/\\/localhost($|[:/])/)) &&\n      this.requireHttps === 'remoteOnly'\n    ) {\n      return true;\n    }\n\n    return lcUrl.startsWith('https://');\n  }\n\n  protected assertUrlNotNullAndCorrectProtocol(\n    url: string | undefined,\n    description: string\n  ) {\n    if (!url) {\n      throw new Error(`'${description}' should not be null`);\n    }\n    if (!this.validateUrlForHttps(url)) {\n      throw new Error(\n        `'${description}' must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).`\n      );\n    }\n  }\n\n  protected validateUrlAgainstIssuer(url: string) {\n    if (!this.strictDiscoveryDocumentValidation) {\n      return true;\n    }\n    if (!url) {\n      return true;\n    }\n    return url.toLowerCase().startsWith(this.issuer.toLowerCase());\n  }\n\n  protected setupRefreshTimer(): void {\n    if (typeof window === 'undefined') {\n      this.debug('timer not supported on this plattform');\n      return;\n    }\n\n    if (this.hasValidIdToken() || this.hasValidAccessToken()) {\n      this.clearAccessTokenTimer();\n      this.clearIdTokenTimer();\n      this.setupExpirationTimers();\n    }\n\n    if (this.tokenReceivedSubscription)\n      this.tokenReceivedSubscription.unsubscribe();\n\n    this.tokenReceivedSubscription = this.events\n      .pipe(filter((e) => e.type === 'token_received'))\n      .subscribe(() => {\n        this.clearAccessTokenTimer();\n        this.clearIdTokenTimer();\n        this.setupExpirationTimers();\n      });\n  }\n\n  protected setupExpirationTimers(): void {\n    if (this.hasValidAccessToken()) {\n      this.setupAccessTokenTimer();\n    }\n\n    if (!this.disableIdTokenTimer && this.hasValidIdToken()) {\n      this.setupIdTokenTimer();\n    }\n  }\n\n  protected setupAccessTokenTimer(): void {\n    const expiration = this.getAccessTokenExpiration();\n    const storedAt = this.getAccessTokenStoredAt();\n    const timeout = this.calcTimeout(storedAt, expiration);\n\n    this.ngZone.runOutsideAngular(() => {\n      this.accessTokenTimeoutSubscription = of(\n        new OAuthInfoEvent('token_expires', 'access_token')\n      )\n        .pipe(delay(timeout))\n        .subscribe((e) => {\n          this.ngZone.run(() => {\n            this.eventsSubject.next(e);\n          });\n        });\n    });\n  }\n\n  protected setupIdTokenTimer(): void {\n    const expiration = this.getIdTokenExpiration();\n    const storedAt = this.getIdTokenStoredAt();\n    const timeout = this.calcTimeout(storedAt, expiration);\n\n    this.ngZone.runOutsideAngular(() => {\n      this.idTokenTimeoutSubscription = of(\n        new OAuthInfoEvent('token_expires', 'id_token')\n      )\n        .pipe(delay(timeout))\n        .subscribe((e) => {\n          this.ngZone.run(() => {\n            this.eventsSubject.next(e);\n          });\n        });\n    });\n  }\n\n  /**\n   * Stops timers for automatic refresh.\n   * To restart it, call setupAutomaticSilentRefresh again.\n   */\n  public stopAutomaticRefresh() {\n    this.clearAccessTokenTimer();\n    this.clearIdTokenTimer();\n    this.clearAutomaticRefreshTimer();\n  }\n\n  protected clearAccessTokenTimer(): void {\n    if (this.accessTokenTimeoutSubscription) {\n      this.accessTokenTimeoutSubscription.unsubscribe();\n    }\n  }\n\n  protected clearIdTokenTimer(): void {\n    if (this.idTokenTimeoutSubscription) {\n      this.idTokenTimeoutSubscription.unsubscribe();\n    }\n  }\n\n  protected clearAutomaticRefreshTimer(): void {\n    if (this.automaticRefreshSubscription) {\n      this.automaticRefreshSubscription.unsubscribe();\n    }\n  }\n\n  protected calcTimeout(storedAt: number, expiration: number): number {\n    const now = this.dateTimeService.now();\n    const delta =\n      (expiration - storedAt) * this.timeoutFactor - (now - storedAt);\n    const duration = Math.max(0, delta);\n    const maxTimeoutValue = 2_147_483_647;\n    return duration > maxTimeoutValue ? maxTimeoutValue : duration;\n  }\n\n  /**\n   * DEPRECATED. Use a provider for OAuthStorage instead:\n   *\n   * { provide: OAuthStorage, useFactory: oAuthStorageFactory }\n   * export function oAuthStorageFactory(): OAuthStorage { return localStorage; }\n   * Sets a custom storage used to store the received\n   * tokens on client side. By default, the browser's\n   * sessionStorage is used.\n   * @ignore\n   *\n   * @param storage\n   */\n  public setStorage(storage: OAuthStorage): void {\n    this._storage = storage;\n    this.configChanged();\n  }\n\n  /**\n   * Loads the discovery document to configure most\n   * properties of this service. The url of the discovery\n   * document is infered from the issuer's url according\n   * to the OpenId Connect spec. To use another url you\n   * can pass it to optional parameter fullUrl.\n   *\n   * @param fullUrl\n   */\n  public loadDiscoveryDocument(\n    fullUrl: string = null\n  ): Promise<OAuthSuccessEvent> {\n    return new Promise((resolve, reject) => {\n      if (!fullUrl) {\n        fullUrl = this.issuer || '';\n        if (!fullUrl.endsWith('/')) {\n          fullUrl += '/';\n        }\n        fullUrl += '.well-known/openid-configuration';\n      }\n\n      if (!this.validateUrlForHttps(fullUrl)) {\n        reject(\n          \"issuer  must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n        );\n        return;\n      }\n\n      this.http.get<OidcDiscoveryDoc>(fullUrl).subscribe(\n        (doc) => {\n          if (!this.validateDiscoveryDocument(doc)) {\n            this.eventsSubject.next(\n              new OAuthErrorEvent('discovery_document_validation_error', null)\n            );\n            reject('discovery_document_validation_error');\n            return;\n          }\n\n          this.loginUrl = doc.authorization_endpoint;\n          this.logoutUrl = doc.end_session_endpoint || this.logoutUrl;\n          this.grantTypesSupported = doc.grant_types_supported;\n          this.issuer = doc.issuer;\n          this.tokenEndpoint = doc.token_endpoint;\n          this.userinfoEndpoint =\n            doc.userinfo_endpoint || this.userinfoEndpoint;\n          this.jwksUri = doc.jwks_uri;\n          this.sessionCheckIFrameUrl =\n            doc.check_session_iframe || this.sessionCheckIFrameUrl;\n\n          this.discoveryDocumentLoaded = true;\n          this.discoveryDocumentLoadedSubject.next(doc);\n          this.revocationEndpoint =\n            doc.revocation_endpoint || this.revocationEndpoint;\n\n          if (this.sessionChecksEnabled) {\n            this.restartSessionChecksIfStillLoggedIn();\n          }\n\n          this.loadJwks()\n            .then((jwks) => {\n              const result: object = {\n                discoveryDocument: doc,\n                jwks: jwks,\n              };\n\n              const event = new OAuthSuccessEvent(\n                'discovery_document_loaded',\n                result\n              );\n              this.eventsSubject.next(event);\n              resolve(event);\n              return;\n            })\n            .catch((err) => {\n              this.eventsSubject.next(\n                new OAuthErrorEvent('discovery_document_load_error', err)\n              );\n              reject(err);\n              return;\n            });\n        },\n        (err) => {\n          this.logger.error('error loading discovery document', err);\n          this.eventsSubject.next(\n            new OAuthErrorEvent('discovery_document_load_error', err)\n          );\n          reject(err);\n        }\n      );\n    });\n  }\n\n  protected loadJwks(): Promise<object> {\n    return new Promise<object>((resolve, reject) => {\n      if (this.jwksUri) {\n        this.http.get(this.jwksUri).subscribe(\n          (jwks) => {\n            this.jwks = jwks;\n            // this.eventsSubject.next(\n            //   new OAuthSuccessEvent('discovery_document_loaded')\n            // );\n            resolve(jwks);\n          },\n          (err) => {\n            this.logger.error('error loading jwks', err);\n            this.eventsSubject.next(\n              new OAuthErrorEvent('jwks_load_error', err)\n            );\n            reject(err);\n          }\n        );\n      } else {\n        resolve(null);\n      }\n    });\n  }\n\n  protected validateDiscoveryDocument(doc: OidcDiscoveryDoc): boolean {\n    let errors: string[];\n\n    if (!this.skipIssuerCheck && doc.issuer !== this.issuer) {\n      this.logger.error(\n        'invalid issuer in discovery document',\n        'expected: ' + this.issuer,\n        'current: ' + doc.issuer\n      );\n      return false;\n    }\n\n    errors = this.validateUrlFromDiscoveryDocument(doc.authorization_endpoint);\n    if (errors.length > 0) {\n      this.logger.error(\n        'error validating authorization_endpoint in discovery document',\n        errors\n      );\n      return false;\n    }\n\n    errors = this.validateUrlFromDiscoveryDocument(doc.end_session_endpoint);\n    if (errors.length > 0) {\n      this.logger.error(\n        'error validating end_session_endpoint in discovery document',\n        errors\n      );\n      return false;\n    }\n\n    errors = this.validateUrlFromDiscoveryDocument(doc.token_endpoint);\n    if (errors.length > 0) {\n      this.logger.error(\n        'error validating token_endpoint in discovery document',\n        errors\n      );\n    }\n\n    errors = this.validateUrlFromDiscoveryDocument(doc.revocation_endpoint);\n    if (errors.length > 0) {\n      this.logger.error(\n        'error validating revocation_endpoint in discovery document',\n        errors\n      );\n    }\n\n    errors = this.validateUrlFromDiscoveryDocument(doc.userinfo_endpoint);\n    if (errors.length > 0) {\n      this.logger.error(\n        'error validating userinfo_endpoint in discovery document',\n        errors\n      );\n      return false;\n    }\n\n    errors = this.validateUrlFromDiscoveryDocument(doc.jwks_uri);\n    if (errors.length > 0) {\n      this.logger.error(\n        'error validating jwks_uri in discovery document',\n        errors\n      );\n      return false;\n    }\n\n    if (this.sessionChecksEnabled && !doc.check_session_iframe) {\n      this.logger.warn(\n        'sessionChecksEnabled is activated but discovery document' +\n          ' does not contain a check_session_iframe field'\n      );\n    }\n\n    return true;\n  }\n\n  /**\n   * Uses password flow to exchange userName and password for an\n   * access_token. After receiving the access_token, this method\n   * uses it to query the userinfo endpoint in order to get information\n   * about the user in question.\n   *\n   * When using this, make sure that the property oidc is set to false.\n   * Otherwise, stricter validations take place that make this operation\n   * fail.\n   *\n   * @param userName\n   * @param password\n   * @param headers Optional additional http-headers.\n   */\n  public fetchTokenUsingPasswordFlowAndLoadUserProfile(\n    userName: string,\n    password: string,\n    headers: HttpHeaders = new HttpHeaders()\n  ): Promise<object> {\n    return this.fetchTokenUsingPasswordFlow(userName, password, headers).then(\n      () => this.loadUserProfile()\n    );\n  }\n\n  /**\n   * Loads the user profile by accessing the user info endpoint defined by OpenId Connect.\n   *\n   * When using this with OAuth2 password flow, make sure that the property oidc is set to false.\n   * Otherwise, stricter validations take place that make this operation fail.\n   */\n  public loadUserProfile(): Promise<object> {\n    if (!this.hasValidAccessToken()) {\n      throw new Error('Can not load User Profile without access_token');\n    }\n    if (!this.validateUrlForHttps(this.userinfoEndpoint)) {\n      throw new Error(\n        \"userinfoEndpoint must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n      );\n    }\n\n    return new Promise((resolve, reject) => {\n      const headers = new HttpHeaders().set(\n        'Authorization',\n        'Bearer ' + this.getAccessToken()\n      );\n\n      this.http\n        .get(this.userinfoEndpoint, {\n          headers,\n          observe: 'response',\n          responseType: 'text',\n        })\n        .subscribe(\n          (response) => {\n            this.debug('userinfo received', JSON.stringify(response));\n            if (\n              response.headers\n                .get('content-type')\n                .startsWith('application/json')\n            ) {\n              let info = JSON.parse(response.body);\n              const existingClaims = this.getIdentityClaims() || {};\n\n              if (!this.skipSubjectCheck) {\n                if (\n                  this.oidc &&\n                  (!existingClaims['sub'] || info.sub !== existingClaims['sub'])\n                ) {\n                  const err =\n                    'if property oidc is true, the received user-id (sub) has to be the user-id ' +\n                    'of the user that has logged in with oidc.\\n' +\n                    'if you are not using oidc but just oauth2 password flow set oidc to false';\n\n                  reject(err);\n                  return;\n                }\n              }\n\n              info = Object.assign({}, existingClaims, info);\n\n              this._storage.setItem(\n                'id_token_claims_obj',\n                JSON.stringify(info)\n              );\n              this.eventsSubject.next(\n                new OAuthSuccessEvent('user_profile_loaded')\n              );\n              resolve({ info });\n            } else {\n              this.debug('userinfo is not JSON, treating it as JWE/JWS');\n              this.eventsSubject.next(\n                new OAuthSuccessEvent('user_profile_loaded')\n              );\n              resolve(JSON.parse(response.body));\n            }\n          },\n          (err) => {\n            this.logger.error('error loading user info', err);\n            this.eventsSubject.next(\n              new OAuthErrorEvent('user_profile_load_error', err)\n            );\n            reject(err);\n          }\n        );\n    });\n  }\n\n  /**\n   * Uses password flow to exchange userName and password for an access_token.\n   * @param userName\n   * @param password\n   * @param headers Optional additional http-headers.\n   */\n  public fetchTokenUsingPasswordFlow(\n    userName: string,\n    password: string,\n    headers: HttpHeaders = new HttpHeaders()\n  ): Promise<TokenResponse> {\n    const parameters = {\n      username: userName,\n      password: password,\n    };\n    return this.fetchTokenUsingGrant('password', parameters, headers);\n  }\n\n  /**\n   * Uses a custom grant type to retrieve tokens.\n   * @param grantType Grant type.\n   * @param parameters Parameters to pass.\n   * @param headers Optional additional HTTP headers.\n   */\n  public fetchTokenUsingGrant(\n    grantType: string,\n    parameters: object,\n    headers: HttpHeaders = new HttpHeaders()\n  ): Promise<TokenResponse> {\n    this.assertUrlNotNullAndCorrectProtocol(\n      this.tokenEndpoint,\n      'tokenEndpoint'\n    );\n\n    /**\n     * A `HttpParameterCodec` that uses `encodeURIComponent` and `decodeURIComponent` to\n     * serialize and parse URL parameter keys and values.\n     *\n     * @stable\n     */\n    let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })\n      .set('grant_type', grantType)\n      .set('scope', this.scope);\n\n    if (this.useHttpBasicAuth) {\n      const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n      headers = headers.set('Authorization', 'Basic ' + header);\n    }\n\n    if (!this.useHttpBasicAuth) {\n      params = params.set('client_id', this.clientId);\n    }\n\n    if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n      params = params.set('client_secret', this.dummyClientSecret);\n    }\n\n    if (this.customQueryParams) {\n      for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n        params = params.set(key, this.customQueryParams[key]);\n      }\n    }\n\n    // set explicit parameters last, to allow overwriting\n    for (const key of Object.keys(parameters)) {\n      params = params.set(key, parameters[key]);\n    }\n\n    headers = headers.set('Content-Type', 'application/x-www-form-urlencoded');\n\n    return new Promise((resolve, reject) => {\n      this.http\n        .post<TokenResponse>(this.tokenEndpoint, params, { headers })\n        .subscribe(\n          (tokenResponse) => {\n            this.debug('tokenResponse', tokenResponse);\n            this.storeAccessTokenResponse(\n              tokenResponse.access_token,\n              tokenResponse.refresh_token,\n              tokenResponse.expires_in ||\n                this.fallbackAccessTokenExpirationTimeInSec,\n              tokenResponse.scope,\n              this.extractRecognizedCustomParameters(tokenResponse)\n            );\n            if (this.oidc && tokenResponse.id_token) {\n              this.processIdToken(\n                tokenResponse.id_token,\n                tokenResponse.access_token\n              ).then((result) => {\n                this.storeIdToken(result);\n                resolve(tokenResponse);\n              });\n            }\n            this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n            resolve(tokenResponse);\n          },\n          (err) => {\n            this.logger.error('Error performing ${grantType} flow', err);\n            this.eventsSubject.next(new OAuthErrorEvent('token_error', err));\n            reject(err);\n          }\n        );\n    });\n  }\n\n  /**\n   * Refreshes the token using a refresh_token.\n   * This does not work for implicit flow, b/c\n   * there is no refresh_token in this flow.\n   * A solution for this is provided by the\n   * method silentRefresh.\n   */\n  public refreshToken(): Promise<TokenResponse> {\n    this.assertUrlNotNullAndCorrectProtocol(\n      this.tokenEndpoint,\n      'tokenEndpoint'\n    );\n    return new Promise((resolve, reject) => {\n      let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })\n        .set('grant_type', 'refresh_token')\n        .set('scope', this.scope)\n        .set('refresh_token', this._storage.getItem('refresh_token'));\n\n      let headers = new HttpHeaders().set(\n        'Content-Type',\n        'application/x-www-form-urlencoded'\n      );\n\n      if (this.useHttpBasicAuth) {\n        const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n        headers = headers.set('Authorization', 'Basic ' + header);\n      }\n\n      if (!this.useHttpBasicAuth) {\n        params = params.set('client_id', this.clientId);\n      }\n\n      if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n        params = params.set('client_secret', this.dummyClientSecret);\n      }\n\n      if (this.customQueryParams) {\n        for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n          params = params.set(key, this.customQueryParams[key]);\n        }\n      }\n\n      this.http\n        .post<TokenResponse>(this.tokenEndpoint, params, { headers })\n        .pipe(\n          switchMap((tokenResponse) => {\n            if (this.oidc && tokenResponse.id_token) {\n              return from(\n                this.processIdToken(\n                  tokenResponse.id_token,\n                  tokenResponse.access_token,\n                  true\n                )\n              ).pipe(\n                tap((result) => this.storeIdToken(result)),\n                map(() => tokenResponse)\n              );\n            } else {\n              return of(tokenResponse);\n            }\n          })\n        )\n        .subscribe(\n          (tokenResponse) => {\n            this.debug('refresh tokenResponse', tokenResponse);\n            this.storeAccessTokenResponse(\n              tokenResponse.access_token,\n              tokenResponse.refresh_token,\n              tokenResponse.expires_in ||\n                this.fallbackAccessTokenExpirationTimeInSec,\n              tokenResponse.scope,\n              this.extractRecognizedCustomParameters(tokenResponse)\n            );\n\n            this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n            this.eventsSubject.next(new OAuthSuccessEvent('token_refreshed'));\n            resolve(tokenResponse);\n          },\n          (err) => {\n            this.logger.error('Error refreshing token', err);\n            this.eventsSubject.next(\n              new OAuthErrorEvent('token_refresh_error', err)\n            );\n            reject(err);\n          }\n        );\n    });\n  }\n\n  protected removeSilentRefreshEventListener(): void {\n    if (this.silentRefreshPostMessageEventListener) {\n      window.removeEventListener(\n        'message',\n        this.silentRefreshPostMessageEventListener\n      );\n      this.silentRefreshPostMessageEventListener = null;\n    }\n  }\n\n  protected setupSilentRefreshEventListener(): void {\n    this.removeSilentRefreshEventListener();\n\n    this.silentRefreshPostMessageEventListener = (e: MessageEvent) => {\n      const message = this.processMessageEventMessage(e);\n\n      if (this.checkOrigin && e.origin !== location.origin) {\n        console.error('wrong origin requested silent refresh!');\n      }\n\n      this.tryLogin({\n        customHashFragment: message,\n        preventClearHashAfterLogin: true,\n        customRedirectUri: this.silentRefreshRedirectUri || this.redirectUri,\n      }).catch((err) =>\n        this.debug('tryLogin during silent refresh failed', err)\n      );\n    };\n\n    window.addEventListener(\n      'message',\n      this.silentRefreshPostMessageEventListener\n    );\n  }\n\n  /**\n   * Performs a silent refresh for implicit flow.\n   * Use this method to get new tokens when/before\n   * the existing tokens expire.\n   */\n  public silentRefresh(\n    params: object = {},\n    noPrompt = true\n  ): Promise<OAuthEvent> {\n    const claims: object = this.getIdentityClaims() || {};\n\n    if (this.useIdTokenHintForSilentRefresh && this.hasValidIdToken()) {\n      params['id_token_hint'] = this.getIdToken();\n    }\n\n    if (!this.validateUrlForHttps(this.loginUrl)) {\n      throw new Error(\n        \"loginUrl  must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n      );\n    }\n\n    if (typeof this.document === 'undefined') {\n      throw new Error('silent refresh is not supported on this platform');\n    }\n\n    const existingIframe = this.document.getElementById(\n      this.silentRefreshIFrameName\n    );\n\n    if (existingIframe) {\n      this.document.body.removeChild(existingIframe);\n    }\n\n    this.silentRefreshSubject = claims['sub'];\n\n    const iframe = this.document.createElement('iframe');\n    iframe.id = this.silentRefreshIFrameName;\n\n    this.setupSilentRefreshEventListener();\n\n    const redirectUri = this.silentRefreshRedirectUri || this.redirectUri;\n    this.createLoginUrl(null, null, redirectUri, noPrompt, params).then(\n      (url) => {\n        iframe.setAttribute('src', url);\n\n        if (!this.silentRefreshShowIFrame) {\n          iframe.style['display'] = 'none';\n        }\n        this.document.body.appendChild(iframe);\n      }\n    );\n\n    const errors = this.events.pipe(\n      filter((e) => e instanceof OAuthErrorEvent),\n      first()\n    );\n    const success = this.events.pipe(\n      filter((e) => e.type === 'token_received'),\n      first()\n    );\n    const timeout = of(\n      new OAuthErrorEvent('silent_refresh_timeout', null)\n    ).pipe(delay(this.silentRefreshTimeout));\n\n    return race([errors, success, timeout])\n      .pipe(\n        map((e) => {\n          if (e instanceof OAuthErrorEvent) {\n            if (e.type === 'silent_refresh_timeout') {\n              this.eventsSubject.next(e);\n            } else {\n              e = new OAuthErrorEvent('silent_refresh_error', e);\n              this.eventsSubject.next(e);\n            }\n            throw e;\n          } else if (e.type === 'token_received') {\n            e = new OAuthSuccessEvent('silently_refreshed');\n            this.eventsSubject.next(e);\n          }\n          return e;\n        })\n      )\n      .toPromise();\n  }\n\n  /**\n   * This method exists for backwards compatibility.\n   * {@link OAuthService#initLoginFlowInPopup} handles both code\n   * and implicit flows.\n   */\n  public initImplicitFlowInPopup(options?: {\n    height?: number;\n    width?: number;\n    windowRef?: Window;\n  }) {\n    return this.initLoginFlowInPopup(options);\n  }\n\n  public initLoginFlowInPopup(options?: {\n    height?: number;\n    width?: number;\n    windowRef?: Window;\n  }) {\n    options = options || {};\n    return this.createLoginUrl(\n      null,\n      null,\n      this.silentRefreshRedirectUri,\n      false,\n      {\n        display: 'popup',\n      }\n    ).then((url) => {\n      return new Promise((resolve, reject) => {\n        /**\n         * Error handling section\n         */\n        const checkForPopupClosedInterval = 500;\n\n        let windowRef = null;\n        // If we got no window reference we open a window\n        // else we are using the window already opened\n        if (!options.windowRef) {\n          windowRef = window.open(\n            url,\n            'ngx-oauth2-oidc-login',\n            this.calculatePopupFeatures(options)\n          );\n        } else if (options.windowRef && !options.windowRef.closed) {\n          windowRef = options.windowRef;\n          windowRef.location.href = url;\n        }\n\n        let checkForPopupClosedTimer: any;\n\n        const tryLogin = (hash: string) => {\n          this.tryLogin({\n            customHashFragment: hash,\n            preventClearHashAfterLogin: true,\n            customRedirectUri: this.silentRefreshRedirectUri,\n          }).then(\n            () => {\n              cleanup();\n              resolve(true);\n            },\n            (err) => {\n              cleanup();\n              reject(err);\n            }\n          );\n        };\n\n        const checkForPopupClosed = () => {\n          if (!windowRef || windowRef.closed) {\n            cleanup();\n            reject(new OAuthErrorEvent('popup_closed', {}));\n          }\n        };\n        if (!windowRef) {\n          reject(new OAuthErrorEvent('popup_blocked', {}));\n        } else {\n          checkForPopupClosedTimer = window.setInterval(\n            checkForPopupClosed,\n            checkForPopupClosedInterval\n          );\n        }\n\n        const cleanup = () => {\n          window.clearInterval(checkForPopupClosedTimer);\n          window.removeEventListener('storage', storageListener);\n          window.removeEventListener('message', listener);\n          if (windowRef !== null) {\n            windowRef.close();\n          }\n          windowRef = null;\n        };\n\n        const listener = (e: MessageEvent) => {\n          const message = this.processMessageEventMessage(e);\n\n          if (message && message !== null) {\n            window.removeEventListener('storage', storageListener);\n            tryLogin(message);\n          } else {\n            console.log('false event firing');\n          }\n        };\n\n        const storageListener = (event: StorageEvent) => {\n          if (event.key === 'auth_hash') {\n            window.removeEventListener('message', listener);\n            tryLogin(event.newValue);\n          }\n        };\n\n        window.addEventListener('message', listener);\n        window.addEventListener('storage', storageListener);\n      });\n    });\n  }\n\n  protected calculatePopupFeatures(options: {\n    height?: number;\n    width?: number;\n  }): string {\n    // Specify a static height and width and calculate centered position\n\n    const height = options.height || 470;\n    const width = options.width || 500;\n    const left = window.screenLeft + (window.outerWidth - width) / 2;\n    const top = window.screenTop + (window.outerHeight - height) / 2;\n    return `location=no,toolbar=no,width=${width},height=${height},top=${top},left=${left}`;\n  }\n\n  protected processMessageEventMessage(e: MessageEvent): string {\n    let expectedPrefix = '#';\n\n    if (this.silentRefreshMessagePrefix) {\n      expectedPrefix += this.silentRefreshMessagePrefix;\n    }\n\n    if (!e || !e.data || typeof e.data !== 'string') {\n      return;\n    }\n\n    const prefixedMessage: string = e.data;\n\n    if (!prefixedMessage.startsWith(expectedPrefix)) {\n      return;\n    }\n\n    return '#' + prefixedMessage.substr(expectedPrefix.length);\n  }\n\n  protected canPerformSessionCheck(): boolean {\n    if (!this.sessionChecksEnabled) {\n      return false;\n    }\n    if (!this.sessionCheckIFrameUrl) {\n      console.warn(\n        'sessionChecksEnabled is activated but there is no sessionCheckIFrameUrl'\n      );\n      return false;\n    }\n    const sessionState = this.getSessionState();\n    if (!sessionState) {\n      console.warn(\n        'sessionChecksEnabled is activated but there is no session_state'\n      );\n      return false;\n    }\n    if (typeof this.document === 'undefined') {\n      return false;\n    }\n\n    return true;\n  }\n\n  protected setupSessionCheckEventListener(): void {\n    this.removeSessionCheckEventListener();\n\n    this.sessionCheckEventListener = (e: MessageEvent) => {\n      const origin = e.origin.toLowerCase();\n      const issuer = this.issuer.toLowerCase();\n\n      this.debug('sessionCheckEventListener');\n\n      if (!issuer.startsWith(origin)) {\n        this.debug(\n          'sessionCheckEventListener',\n          'wrong origin',\n          origin,\n          'expected',\n          issuer,\n          'event',\n          e\n        );\n\n        return;\n      }\n\n      // only run in Angular zone if it is 'changed' or 'error'\n      switch (e.data) {\n        case 'unchanged':\n          this.ngZone.run(() => {\n            this.handleSessionUnchanged();\n          });\n          break;\n        case 'changed':\n          this.ngZone.run(() => {\n            this.handleSessionChange();\n          });\n          break;\n        case 'error':\n          this.ngZone.run(() => {\n            this.handleSessionError();\n          });\n          break;\n      }\n\n      this.debug('got info from session check inframe', e);\n    };\n\n    // prevent Angular from refreshing the view on every message (runs in intervals)\n    this.ngZone.runOutsideAngular(() => {\n      window.addEventListener('message', this.sessionCheckEventListener);\n    });\n  }\n\n  protected handleSessionUnchanged(): void {\n    this.debug('session check', 'session unchanged');\n    this.eventsSubject.next(new OAuthInfoEvent('session_unchanged'));\n  }\n\n  protected handleSessionChange(): void {\n    this.eventsSubject.next(new OAuthInfoEvent('session_changed'));\n    this.stopSessionCheckTimer();\n\n    if (!this.useSilentRefresh && this.responseType === 'code') {\n      this.refreshToken()\n        .then(() => {\n          this.debug('token refresh after session change worked');\n        })\n        .catch(() => {\n          this.debug('token refresh did not work after session changed');\n          this.eventsSubject.next(new OAuthInfoEvent('session_terminated'));\n          this.logOut(true);\n        });\n    } else if (this.silentRefreshRedirectUri) {\n      this.silentRefresh().catch(() =>\n        this.debug('silent refresh failed after session changed')\n      );\n      this.waitForSilentRefreshAfterSessionChange();\n    } else {\n      this.eventsSubject.next(new OAuthInfoEvent('session_terminated'));\n      this.logOut(true);\n    }\n  }\n\n  protected waitForSilentRefreshAfterSessionChange(): void {\n    this.events\n      .pipe(\n        filter(\n          (e: OAuthEvent) =>\n            e.type === 'silently_refreshed' ||\n            e.type === 'silent_refresh_timeout' ||\n            e.type === 'silent_refresh_error'\n        ),\n        first()\n      )\n      .subscribe((e) => {\n        if (e.type !== 'silently_refreshed') {\n          this.debug('silent refresh did not work after session changed');\n          this.eventsSubject.next(new OAuthInfoEvent('session_terminated'));\n          this.logOut(true);\n        }\n      });\n  }\n\n  protected handleSessionError(): void {\n    this.stopSessionCheckTimer();\n    this.eventsSubject.next(new OAuthInfoEvent('session_error'));\n  }\n\n  protected removeSessionCheckEventListener(): void {\n    if (this.sessionCheckEventListener) {\n      window.removeEventListener('message', this.sessionCheckEventListener);\n      this.sessionCheckEventListener = null;\n    }\n  }\n\n  protected initSessionCheck(): void {\n    if (!this.canPerformSessionCheck()) {\n      return;\n    }\n\n    const existingIframe = this.document.getElementById(\n      this.sessionCheckIFrameName\n    );\n    if (existingIframe) {\n      this.document.body.removeChild(existingIframe);\n    }\n\n    const iframe = this.document.createElement('iframe');\n    iframe.id = this.sessionCheckIFrameName;\n\n    this.setupSessionCheckEventListener();\n\n    const url = this.sessionCheckIFrameUrl;\n    iframe.setAttribute('src', url);\n    iframe.style.display = 'none';\n    this.document.body.appendChild(iframe);\n\n    this.startSessionCheckTimer();\n  }\n\n  protected startSessionCheckTimer(): void {\n    this.stopSessionCheckTimer();\n    this.ngZone.runOutsideAngular(() => {\n      this.sessionCheckTimer = setInterval(\n        this.checkSession.bind(this),\n        this.sessionCheckIntervall\n      );\n    });\n  }\n\n  protected stopSessionCheckTimer(): void {\n    if (this.sessionCheckTimer) {\n      clearInterval(this.sessionCheckTimer);\n      this.sessionCheckTimer = null;\n    }\n  }\n\n  public checkSession(): void {\n    const iframe: any = this.document.getElementById(\n      this.sessionCheckIFrameName\n    );\n\n    if (!iframe) {\n      this.logger.warn(\n        'checkSession did not find iframe',\n        this.sessionCheckIFrameName\n      );\n    }\n\n    const sessionState = this.getSessionState();\n\n    if (!sessionState) {\n      this.stopSessionCheckTimer();\n    }\n\n    const message = this.clientId + ' ' + sessionState;\n    iframe.contentWindow.postMessage(message, this.issuer);\n  }\n\n  protected async createLoginUrl(\n    state = '',\n    loginHint = '',\n    customRedirectUri = '',\n    noPrompt = false,\n    params: object = {}\n  ): Promise<string> {\n    const that = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n    let redirectUri: string;\n\n    if (customRedirectUri) {\n      redirectUri = customRedirectUri;\n    } else {\n      redirectUri = this.redirectUri;\n    }\n\n    const nonce = await this.createAndSaveNonce();\n\n    if (state) {\n      state =\n        nonce + this.config.nonceStateSeparator + encodeURIComponent(state);\n    } else {\n      state = nonce;\n    }\n\n    if (!this.requestAccessToken && !this.oidc) {\n      throw new Error('Either requestAccessToken or oidc or both must be true');\n    }\n\n    if (this.config.responseType) {\n      this.responseType = this.config.responseType;\n    } else {\n      if (this.oidc && this.requestAccessToken) {\n        this.responseType = 'id_token token';\n      } else if (this.oidc && !this.requestAccessToken) {\n        this.responseType = 'id_token';\n      } else {\n        this.responseType = 'token';\n      }\n    }\n\n    const seperationChar = that.loginUrl.indexOf('?') > -1 ? '&' : '?';\n\n    let scope = that.scope;\n\n    if (this.oidc && !scope.match(/(^|\\s)openid($|\\s)/)) {\n      scope = 'openid ' + scope;\n    }\n\n    let url =\n      that.loginUrl +\n      seperationChar +\n      'response_type=' +\n      encodeURIComponent(that.responseType) +\n      '&client_id=' +\n      encodeURIComponent(that.clientId) +\n      '&state=' +\n      encodeURIComponent(state) +\n      '&redirect_uri=' +\n      encodeURIComponent(redirectUri) +\n      '&scope=' +\n      encodeURIComponent(scope);\n\n    if (this.responseType.includes('code') && !this.disablePKCE) {\n      const [challenge, verifier] =\n        await this.createChallangeVerifierPairForPKCE();\n\n      if (\n        this.saveNoncesInLocalStorage &&\n        typeof window['localStorage'] !== 'undefined'\n      ) {\n        localStorage.setItem('PKCE_verifier', verifier);\n      } else {\n        this._storage.setItem('PKCE_verifier', verifier);\n      }\n\n      url += '&code_challenge=' + challenge;\n      url += '&code_challenge_method=S256';\n    }\n\n    if (loginHint) {\n      url += '&login_hint=' + encodeURIComponent(loginHint);\n    }\n\n    if (that.resource) {\n      url += '&resource=' + encodeURIComponent(that.resource);\n    }\n\n    if (that.oidc) {\n      url += '&nonce=' + encodeURIComponent(nonce);\n    }\n\n    if (noPrompt) {\n      url += '&prompt=none';\n    }\n\n    for (const key of Object.keys(params)) {\n      url +=\n        '&' + encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);\n    }\n\n    if (this.customQueryParams) {\n      for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n        url +=\n          '&' + key + '=' + encodeURIComponent(this.customQueryParams[key]);\n      }\n    }\n\n    return url;\n  }\n\n  initImplicitFlowInternal(\n    additionalState = '',\n    params: string | object = ''\n  ): void {\n    if (this.inImplicitFlow) {\n      return;\n    }\n\n    this.inImplicitFlow = true;\n\n    if (!this.validateUrlForHttps(this.loginUrl)) {\n      throw new Error(\n        \"loginUrl  must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n      );\n    }\n\n    let addParams: object = {};\n    let loginHint: string = null;\n\n    if (typeof params === 'string') {\n      loginHint = params;\n    } else if (typeof params === 'object') {\n      addParams = params;\n    }\n\n    this.createLoginUrl(additionalState, loginHint, null, false, addParams)\n      .then(this.config.openUri)\n      .catch((error) => {\n        console.error('Error in initImplicitFlow', error);\n        this.inImplicitFlow = false;\n      });\n  }\n\n  /**\n   * Starts the implicit flow and redirects to user to\n   * the auth servers' login url.\n   *\n   * @param additionalState Optional state that is passed around.\n   *  You'll find this state in the property `state` after `tryLogin` logged in the user.\n   * @param params Hash with additional parameter. If it is a string, it is used for the\n   *               parameter loginHint (for the sake of compatibility with former versions)\n   */\n  public initImplicitFlow(\n    additionalState = '',\n    params: string | object = ''\n  ): void {\n    if (this.loginUrl !== '') {\n      this.initImplicitFlowInternal(additionalState, params);\n    } else {\n      this.events\n        .pipe(filter((e) => e.type === 'discovery_document_loaded'))\n        .subscribe(() =>\n          this.initImplicitFlowInternal(additionalState, params)\n        );\n    }\n  }\n\n  /**\n   * Reset current implicit flow\n   *\n   * @description This method allows resetting the current implict flow in order to be initialized again.\n   */\n  public resetImplicitFlow(): void {\n    this.inImplicitFlow = false;\n  }\n\n  protected callOnTokenReceivedIfExists(options: LoginOptions): void {\n    const that = this; // eslint-disable-line @typescript-eslint/no-this-alias\n    if (options.onTokenReceived) {\n      const tokenParams = {\n        idClaims: that.getIdentityClaims(),\n        idToken: that.getIdToken(),\n        accessToken: that.getAccessToken(),\n        state: that.state,\n      };\n      options.onTokenReceived(tokenParams);\n    }\n  }\n\n  protected storeAccessTokenResponse(\n    accessToken: string,\n    refreshToken: string,\n    expiresIn: number,\n    grantedScopes: string,\n    customParameters?: Map<string, string>\n  ): void {\n    this._storage.setItem('access_token', accessToken);\n    if (grantedScopes && !Array.isArray(grantedScopes)) {\n      this._storage.setItem(\n        'granted_scopes',\n        JSON.stringify(grantedScopes.split(' '))\n      );\n    } else if (grantedScopes && Array.isArray(grantedScopes)) {\n      this._storage.setItem('granted_scopes', JSON.stringify(grantedScopes));\n    }\n\n    this._storage.setItem(\n      'access_token_stored_at',\n      '' + this.dateTimeService.now()\n    );\n    if (expiresIn) {\n      const expiresInMilliSeconds = expiresIn * 1000;\n      const now = this.dateTimeService.new();\n      const expiresAt = now.getTime() + expiresInMilliSeconds;\n      this._storage.setItem('expires_at', '' + expiresAt);\n    }\n\n    if (refreshToken) {\n      this._storage.setItem('refresh_token', refreshToken);\n    }\n    if (customParameters) {\n      customParameters.forEach((value: string, key: string) => {\n        this._storage.setItem(key, value);\n      });\n    }\n  }\n\n  /**\n   * Delegates to tryLoginImplicitFlow for the sake of compatability\n   * @param options Optional options.\n   */\n  public tryLogin(options: LoginOptions = null): Promise<boolean> {\n    if (this.config.responseType === 'code') {\n      return this.tryLoginCodeFlow(options).then(() => true);\n    } else {\n      return this.tryLoginImplicitFlow(options);\n    }\n  }\n\n  private parseQueryString(queryString: string): object {\n    if (!queryString || queryString.length === 0) {\n      return {};\n    }\n\n    if (queryString.charAt(0) === '?') {\n      queryString = queryString.substr(1);\n    }\n\n    return this.urlHelper.parseQueryString(queryString);\n  }\n\n  public async tryLoginCodeFlow(options: LoginOptions = null): Promise<void> {\n    options = options || {};\n\n    const querySource = options.customHashFragment\n      ? options.customHashFragment.substring(1)\n      : window.location.search;\n\n    const parts = this.getCodePartsFromUrl(querySource);\n\n    const code = parts['code'];\n    const state = parts['state'];\n\n    const sessionState = parts['session_state'];\n\n    if (!options.preventClearHashAfterLogin) {\n      const href =\n        location.origin +\n        location.pathname +\n        location.search\n          .replace(/code=[^&$]*/, '')\n          .replace(/scope=[^&$]*/, '')\n          .replace(/state=[^&$]*/, '')\n          .replace(/session_state=[^&$]*/, '')\n          .replace(/^\\?&/, '?')\n          .replace(/&$/, '')\n          .replace(/^\\?$/, '')\n          .replace(/&+/g, '&')\n          .replace(/\\?&/, '?')\n          .replace(/\\?$/, '') +\n        location.hash;\n\n      history.replaceState(null, window.name, href);\n    }\n\n    const [nonceInState, userState] = this.parseState(state);\n    this.state = userState;\n\n    if (parts['error']) {\n      this.debug('error trying to login');\n      this.handleLoginError(options, parts);\n      const err = new OAuthErrorEvent('code_error', {}, parts);\n      this.eventsSubject.next(err);\n      return Promise.reject(err);\n    }\n\n    if (!options.disableNonceCheck) {\n      if (!nonceInState) {\n        this.saveRequestedRoute();\n        return Promise.resolve();\n      }\n\n      if (!options.disableOAuth2StateCheck) {\n        const success = this.validateNonce(nonceInState);\n        if (!success) {\n          const event = new OAuthErrorEvent('invalid_nonce_in_state', null);\n          this.eventsSubject.next(event);\n          return Promise.reject(event);\n        }\n      }\n    }\n\n    this.storeSessionState(sessionState);\n\n    if (code) {\n      await this.getTokenFromCode(code, options);\n      this.restoreRequestedRoute();\n      return Promise.resolve();\n    } else {\n      return Promise.resolve();\n    }\n  }\n\n  private saveRequestedRoute() {\n    if (this.config.preserveRequestedRoute) {\n      this._storage.setItem(\n        'requested_route',\n        window.location.pathname + window.location.search\n      );\n    }\n  }\n\n  private restoreRequestedRoute() {\n    const requestedRoute = this._storage.getItem('requested_route');\n    if (requestedRoute) {\n      history.replaceState(null, '', window.location.origin + requestedRoute);\n    }\n  }\n\n  /**\n   * Retrieve the returned auth code from the redirect uri that has been called.\n   * If required also check hash, as we could use hash location strategy.\n   */\n  private getCodePartsFromUrl(queryString: string): object {\n    if (!queryString || queryString.length === 0) {\n      return this.urlHelper.getHashFragmentParams();\n    }\n\n    // normalize query string\n    if (queryString.charAt(0) === '?') {\n      queryString = queryString.substr(1);\n    }\n\n    return this.urlHelper.parseQueryString(queryString);\n  }\n\n  /**\n   * Get token using an intermediate code. Works for the Authorization Code flow.\n   */\n  private getTokenFromCode(\n    code: string,\n    options: LoginOptions\n  ): Promise<object> {\n    let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })\n      .set('grant_type', 'authorization_code')\n      .set('code', code)\n      .set('redirect_uri', options.customRedirectUri || this.redirectUri);\n\n    if (!this.disablePKCE) {\n      let PKCEVerifier;\n\n      if (\n        this.saveNoncesInLocalStorage &&\n        typeof window['localStorage'] !== 'undefined'\n      ) {\n        PKCEVerifier = localStorage.getItem('PKCE_verifier');\n      } else {\n        PKCEVerifier = this._storage.getItem('PKCE_verifier');\n      }\n\n      if (!PKCEVerifier) {\n        console.warn('No PKCE verifier found in oauth storage!');\n      } else {\n        params = params.set('code_verifier', PKCEVerifier);\n      }\n    }\n\n    return this.fetchAndProcessToken(params, options);\n  }\n\n  private fetchAndProcessToken(\n    params: HttpParams,\n    options: LoginOptions\n  ): Promise<TokenResponse> {\n    options = options || {};\n\n    this.assertUrlNotNullAndCorrectProtocol(\n      this.tokenEndpoint,\n      'tokenEndpoint'\n    );\n    let headers = new HttpHeaders().set(\n      'Content-Type',\n      'application/x-www-form-urlencoded'\n    );\n\n    if (this.useHttpBasicAuth) {\n      const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n      headers = headers.set('Authorization', 'Basic ' + header);\n    }\n\n    if (!this.useHttpBasicAuth) {\n      params = params.set('client_id', this.clientId);\n    }\n\n    if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n      params = params.set('client_secret', this.dummyClientSecret);\n    }\n\n    return new Promise((resolve, reject) => {\n      if (this.customQueryParams) {\n        for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n          params = params.set(key, this.customQueryParams[key]);\n        }\n      }\n\n      this.http\n        .post<TokenResponse>(this.tokenEndpoint, params, { headers })\n        .subscribe(\n          (tokenResponse) => {\n            this.debug('refresh tokenResponse', tokenResponse);\n            this.storeAccessTokenResponse(\n              tokenResponse.access_token,\n              tokenResponse.refresh_token,\n              tokenResponse.expires_in ||\n                this.fallbackAccessTokenExpirationTimeInSec,\n              tokenResponse.scope,\n              this.extractRecognizedCustomParameters(tokenResponse)\n            );\n\n            if (this.oidc && tokenResponse.id_token) {\n              this.processIdToken(\n                tokenResponse.id_token,\n                tokenResponse.access_token,\n                options.disableNonceCheck\n              )\n                .then((result) => {\n                  this.storeIdToken(result);\n\n                  this.eventsSubject.next(\n                    new OAuthSuccessEvent('token_received')\n                  );\n                  this.eventsSubject.next(\n                    new OAuthSuccessEvent('token_refreshed')\n                  );\n\n                  resolve(tokenResponse);\n                })\n                .catch((reason) => {\n                  this.eventsSubject.next(\n                    new OAuthErrorEvent('token_validation_error', reason)\n                  );\n                  console.error('Error validating tokens');\n                  console.error(reason);\n\n                  reject(reason);\n                });\n            } else {\n              this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n              this.eventsSubject.next(new OAuthSuccessEvent('token_refreshed'));\n\n              resolve(tokenResponse);\n            }\n          },\n          (err) => {\n            console.error('Error getting token', err);\n            this.eventsSubject.next(new OAuthErrorEvent('token_error', err));\n            reject(err);\n          }\n        );\n    });\n  }\n\n  /**\n   * Checks whether there are tokens in the hash fragment\n   * as a result of the implicit flow. These tokens are\n   * parsed, validated and used to sign the user in to the\n   * current client.\n   *\n   * @param options Optional options.\n   */\n  public tryLoginImplicitFlow(options: LoginOptions = null): Promise<boolean> {\n    options = options || {};\n\n    let parts: object;\n\n    if (options.customHashFragment) {\n      parts = this.urlHelper.getHashFragmentParams(options.customHashFragment);\n    } else {\n      parts = this.urlHelper.getHashFragmentParams();\n    }\n\n    this.debug('parsed url', parts);\n\n    const state = parts['state'];\n\n    const [nonceInState, userState] = this.parseState(state);\n    this.state = userState;\n\n    if (parts['error']) {\n      this.debug('error trying to login');\n      this.handleLoginError(options, parts);\n      const err = new OAuthErrorEvent('token_error', {}, parts);\n      this.eventsSubject.next(err);\n      return Promise.reject(err);\n    }\n\n    const accessToken = parts['access_token'];\n    const idToken = parts['id_token'];\n    const sessionState = parts['session_state'];\n    const grantedScopes = parts['scope'];\n\n    if (!this.requestAccessToken && !this.oidc) {\n      return Promise.reject(\n        'Either requestAccessToken or oidc (or both) must be true.'\n      );\n    }\n\n    if (this.requestAccessToken && !accessToken) {\n      return Promise.resolve(false);\n    }\n    if (this.requestAccessToken && !options.disableOAuth2StateCheck && !state) {\n      return Promise.resolve(false);\n    }\n    if (this.oidc && !idToken) {\n      return Promise.resolve(false);\n    }\n\n    if (this.sessionChecksEnabled && !sessionState) {\n      this.logger.warn(\n        'session checks (Session Status Change Notification) ' +\n          'were activated in the configuration but the id_token ' +\n          'does not contain a session_state claim'\n      );\n    }\n\n    if (this.requestAccessToken && !options.disableNonceCheck) {\n      const success = this.validateNonce(nonceInState);\n\n      if (!success) {\n        const event = new OAuthErrorEvent('invalid_nonce_in_state', null);\n        this.eventsSubject.next(event);\n        return Promise.reject(event);\n      }\n    }\n\n    if (this.requestAccessToken) {\n      this.storeAccessTokenResponse(\n        accessToken,\n        null,\n        parts['expires_in'] || this.fallbackAccessTokenExpirationTimeInSec,\n        grantedScopes\n      );\n    }\n\n    if (!this.oidc) {\n      this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n      if (this.clearHashAfterLogin && !options.preventClearHashAfterLogin) {\n        this.clearLocationHash();\n      }\n\n      this.callOnTokenReceivedIfExists(options);\n      return Promise.resolve(true);\n    }\n\n    return this.processIdToken(idToken, accessToken, options.disableNonceCheck)\n      .then((result) => {\n        if (options.validationHandler) {\n          return options\n            .validationHandler({\n              accessToken: accessToken,\n              idClaims: result.idTokenClaims,\n              idToken: result.idToken,\n              state: state,\n            })\n            .then(() => result);\n        }\n        return result;\n      })\n      .then((result) => {\n        this.storeIdToken(result);\n        this.storeSessionState(sessionState);\n        if (this.clearHashAfterLogin && !options.preventClearHashAfterLogin) {\n          this.clearLocationHash();\n        }\n        this.eventsSubject.next(new OAuthSuccessEvent('token_received'));\n        this.callOnTokenReceivedIfExists(options);\n        this.inImplicitFlow = false;\n        return true;\n      })\n      .catch((reason) => {\n        this.eventsSubject.next(\n          new OAuthErrorEvent('token_validation_error', reason)\n        );\n        this.logger.error('Error validating tokens');\n        this.logger.error(reason);\n        return Promise.reject(reason);\n      });\n  }\n\n  private parseState(state: string): [string, string] {\n    let nonce = state;\n    let userState = '';\n\n    if (state) {\n      const idx = state.indexOf(this.config.nonceStateSeparator);\n      if (idx > -1) {\n        nonce = state.substr(0, idx);\n        userState = state.substr(idx + this.config.nonceStateSeparator.length);\n      }\n    }\n    return [nonce, userState];\n  }\n\n  protected validateNonce(nonceInState: string): boolean {\n    let savedNonce;\n\n    if (\n      this.saveNoncesInLocalStorage &&\n      typeof window['localStorage'] !== 'undefined'\n    ) {\n      savedNonce = localStorage.getItem('nonce');\n    } else {\n      savedNonce = this._storage.getItem('nonce');\n    }\n\n    if (savedNonce !== nonceInState) {\n      const err = 'Validating access_token failed, wrong state/nonce.';\n      console.error(err, savedNonce, nonceInState);\n      return false;\n    }\n    return true;\n  }\n\n  protected storeIdToken(idToken: ParsedIdToken): void {\n    this._storage.setItem('id_token', idToken.idToken);\n    this._storage.setItem('id_token_claims_obj', idToken.idTokenClaimsJson);\n    this._storage.setItem('id_token_expires_at', '' + idToken.idTokenExpiresAt);\n    this._storage.setItem(\n      'id_token_stored_at',\n      '' + this.dateTimeService.now()\n    );\n  }\n\n  protected storeSessionState(sessionState: string): void {\n    this._storage.setItem('session_state', sessionState);\n  }\n\n  protected getSessionState(): string {\n    return this._storage.getItem('session_state');\n  }\n\n  protected handleLoginError(options: LoginOptions, parts: object): void {\n    if (options.onLoginError) {\n      options.onLoginError(parts);\n    }\n    if (this.clearHashAfterLogin && !options.preventClearHashAfterLogin) {\n      this.clearLocationHash();\n    }\n  }\n\n  private getClockSkewInMsec(defaultSkewMsc = 600_000) {\n    if (!this.clockSkewInSec && this.clockSkewInSec !== 0) {\n      return defaultSkewMsc;\n    }\n    return this.clockSkewInSec * 1000;\n  }\n\n  /**\n   * @ignore\n   */\n  public processIdToken(\n    idToken: string,\n    accessToken: string,\n    skipNonceCheck = false\n  ): Promise<ParsedIdToken> {\n    const tokenParts = idToken.split('.');\n    const headerBase64 = this.padBase64(tokenParts[0]);\n    const headerJson = b64DecodeUnicode(headerBase64);\n    const header = JSON.parse(headerJson);\n    const claimsBase64 = this.padBase64(tokenParts[1]);\n    const claimsJson = b64DecodeUnicode(claimsBase64);\n    const claims = JSON.parse(claimsJson);\n\n    let savedNonce;\n    if (\n      this.saveNoncesInLocalStorage &&\n      typeof window['localStorage'] !== 'undefined'\n    ) {\n      savedNonce = localStorage.getItem('nonce');\n    } else {\n      savedNonce = this._storage.getItem('nonce');\n    }\n\n    if (Array.isArray(claims.aud)) {\n      if (claims.aud.every((v) => v !== this.clientId)) {\n        const err = 'Wrong audience: ' + claims.aud.join(',');\n        this.logger.warn(err);\n        return Promise.reject(err);\n      }\n    } else {\n      if (claims.aud !== this.clientId) {\n        const err = 'Wrong audience: ' + claims.aud;\n        this.logger.warn(err);\n        return Promise.reject(err);\n      }\n    }\n\n    if (!claims.sub) {\n      const err = 'No sub claim in id_token';\n      this.logger.warn(err);\n      return Promise.reject(err);\n    }\n\n    /* For now, we only check whether the sub against\n     * silentRefreshSubject when sessionChecksEnabled is on\n     * We will reconsider in a later version to do this\n     * in every other case too.\n     */\n    if (\n      this.sessionChecksEnabled &&\n      this.silentRefreshSubject &&\n      this.silentRefreshSubject !== claims['sub']\n    ) {\n      const err =\n        'After refreshing, we got an id_token for another user (sub). ' +\n        `Expected sub: ${this.silentRefreshSubject}, received sub: ${claims['sub']}`;\n\n      this.logger.warn(err);\n      return Promise.reject(err);\n    }\n\n    if (!claims.iat) {\n      const err = 'No iat claim in id_token';\n      this.logger.warn(err);\n      return Promise.reject(err);\n    }\n\n    if (!this.skipIssuerCheck && claims.iss !== this.issuer) {\n      const err = 'Wrong issuer: ' + claims.iss;\n      this.logger.warn(err);\n      return Promise.reject(err);\n    }\n\n    if (!skipNonceCheck && claims.nonce !== savedNonce) {\n      const err = 'Wrong nonce: ' + claims.nonce;\n      this.logger.warn(err);\n      return Promise.reject(err);\n    }\n    // at_hash is not applicable to authorization code flow\n    // addressing https://github.com/manfredsteyer/angular-oauth2-oidc/issues/661\n    // i.e. Based on spec the at_hash check is only true for implicit code flow on Ping Federate\n    // https://www.pingidentity.com/developer/en/resources/openid-connect-developers-guide.html\n    if (\n      Object.prototype.hasOwnProperty.call(this, 'responseType') &&\n      (this.responseType === 'code' || this.responseType === 'id_token')\n    ) {\n      this.disableAtHashCheck = true;\n    }\n    if (\n      !this.disableAtHashCheck &&\n      this.requestAccessToken &&\n      !claims['at_hash']\n    ) {\n      const err = 'An at_hash is needed!';\n      this.logger.warn(err);\n      return Promise.reject(err);\n    }\n\n    const now = this.dateTimeService.now();\n    const issuedAtMSec = claims.iat * 1000;\n    const expiresAtMSec = claims.exp * 1000;\n    const clockSkewInMSec = this.getClockSkewInMsec(); // (this.getClockSkewInMsec() || 600) * 1000;\n\n    if (\n      issuedAtMSec - clockSkewInMSec >= now ||\n      expiresAtMSec + clockSkewInMSec - this.decreaseExpirationBySec <= now\n    ) {\n      const err = 'Token has expired';\n      console.error(err);\n      console.error({\n        now: now,\n        issuedAtMSec: issuedAtMSec,\n        expiresAtMSec: expiresAtMSec,\n      });\n      return Promise.reject(err);\n    }\n\n    const validationParams: ValidationParams = {\n      accessToken: accessToken,\n      idToken: idToken,\n      jwks: this.jwks,\n      idTokenClaims: claims,\n      idTokenHeader: header,\n      loadKeys: () => this.loadJwks(),\n    };\n\n    if (this.disableAtHashCheck) {\n      return this.checkSignature(validationParams).then(() => {\n        const result: ParsedIdToken = {\n          idToken: idToken,\n          idTokenClaims: claims,\n          idTokenClaimsJson: claimsJson,\n          idTokenHeader: header,\n          idTokenHeaderJson: headerJson,\n          idTokenExpiresAt: expiresAtMSec,\n        };\n        return result;\n      });\n    }\n\n    return this.checkAtHash(validationParams).then((atHashValid) => {\n      if (!this.disableAtHashCheck && this.requestAccessToken && !atHashValid) {\n        const err = 'Wrong at_hash';\n        this.logger.warn(err);\n        return Promise.reject(err);\n      }\n\n      return this.checkSignature(validationParams).then(() => {\n        const atHashCheckEnabled = !this.disableAtHashCheck;\n        const result: ParsedIdToken = {\n          idToken: idToken,\n          idTokenClaims: claims,\n          idTokenClaimsJson: claimsJson,\n          idTokenHeader: header,\n          idTokenHeaderJson: headerJson,\n          idTokenExpiresAt: expiresAtMSec,\n        };\n        if (atHashCheckEnabled) {\n          return this.checkAtHash(validationParams).then((atHashValid) => {\n            if (this.requestAccessToken && !atHashValid) {\n              const err = 'Wrong at_hash';\n              this.logger.warn(err);\n              return Promise.reject(err);\n            } else {\n              return result;\n            }\n          });\n        } else {\n          return result;\n        }\n      });\n    });\n  }\n\n  /**\n   * Returns the received claims about the user.\n   */\n  public getIdentityClaims(): Record<string, any> {\n    const claims = this._storage.getItem('id_token_claims_obj');\n    if (!claims) {\n      return null;\n    }\n    return JSON.parse(claims);\n  }\n\n  /**\n   * Returns the granted scopes from the server.\n   */\n  public getGrantedScopes(): object {\n    const scopes = this._storage.getItem('granted_scopes');\n    if (!scopes) {\n      return null;\n    }\n    return JSON.parse(scopes);\n  }\n\n  /**\n   * Returns the current id_token.\n   */\n  public getIdToken(): string {\n    return this._storage ? this._storage.getItem('id_token') : null;\n  }\n\n  protected padBase64(base64data): string {\n    while (base64data.length % 4 !== 0) {\n      base64data += '=';\n    }\n    return base64data;\n  }\n\n  /**\n   * Returns the current access_token.\n   */\n  public getAccessToken(): string {\n    return this._storage ? this._storage.getItem('access_token') : null;\n  }\n\n  public getRefreshToken(): string {\n    return this._storage ? this._storage.getItem('refresh_token') : null;\n  }\n\n  /**\n   * Returns the expiration date of the access_token\n   * as milliseconds since 1970.\n   */\n  public getAccessTokenExpiration(): number {\n    if (!this._storage.getItem('expires_at')) {\n      return null;\n    }\n    return parseInt(this._storage.getItem('expires_at'), 10);\n  }\n\n  protected getAccessTokenStoredAt(): number {\n    return parseInt(this._storage.getItem('access_token_stored_at'), 10);\n  }\n\n  protected getIdTokenStoredAt(): number {\n    return parseInt(this._storage.getItem('id_token_stored_at'), 10);\n  }\n\n  /**\n   * Returns the expiration date of the id_token\n   * as milliseconds since 1970.\n   */\n  public getIdTokenExpiration(): number {\n    if (!this._storage.getItem('id_token_expires_at')) {\n      return null;\n    }\n\n    return parseInt(this._storage.getItem('id_token_expires_at'), 10);\n  }\n\n  /**\n   * Checkes, whether there is a valid access_token.\n   */\n  public hasValidAccessToken(): boolean {\n    if (this.getAccessToken()) {\n      const expiresAt = this._storage.getItem('expires_at');\n      const now = this.dateTimeService.new();\n      if (\n        expiresAt &&\n        parseInt(expiresAt, 10) - this.decreaseExpirationBySec <\n          now.getTime() - this.getClockSkewInMsec()\n      ) {\n        return false;\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Checks whether there is a valid id_token.\n   */\n  public hasValidIdToken(): boolean {\n    if (this.getIdToken()) {\n      const expiresAt = this._storage.getItem('id_token_expires_at');\n      const now = this.dateTimeService.new();\n      if (\n        expiresAt &&\n        parseInt(expiresAt, 10) - this.decreaseExpirationBySec <\n          now.getTime() - this.getClockSkewInMsec()\n      ) {\n        return false;\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Retrieve a saved custom property of the TokenReponse object. Only if predefined in authconfig.\n   */\n  public getCustomTokenResponseProperty(requestedProperty: string): any {\n    return this._storage &&\n      this.config.customTokenParameters &&\n      this.config.customTokenParameters.indexOf(requestedProperty) >= 0 &&\n      this._storage.getItem(requestedProperty) !== null\n      ? JSON.parse(this._storage.getItem(requestedProperty))\n      : null;\n  }\n\n  /**\n   * Returns the auth-header that can be used\n   * to transmit the access_token to a service\n   */\n  public authorizationHeader(): string {\n    return 'Bearer ' + this.getAccessToken();\n  }\n\n  /**\n   * Removes all tokens and logs the user out.\n   * If a logout url is configured, the user is\n   * redirected to it with optional state parameter.\n   * @param noRedirectToLogoutUrl\n   * @param state\n   */\n  public logOut(): void;\n  public logOut(customParameters: boolean | object): void;\n  public logOut(noRedirectToLogoutUrl: boolean): void;\n  public logOut(noRedirectToLogoutUrl: boolean, state: string): void;\n  public logOut(customParameters: boolean | object = {}, state = ''): void {\n    let noRedirectToLogoutUrl = false;\n    if (typeof customParameters === 'boolean') {\n      noRedirectToLogoutUrl = customParameters;\n      customParameters = {};\n    }\n\n    const id_token = this.getIdToken();\n    this._storage.removeItem('access_token');\n    this._storage.removeItem('id_token');\n    this._storage.removeItem('refresh_token');\n\n    if (this.saveNoncesInLocalStorage) {\n      localStorage.removeItem('nonce');\n      localStorage.removeItem('PKCE_verifier');\n    } else {\n      this._storage.removeItem('nonce');\n      this._storage.removeItem('PKCE_verifier');\n    }\n\n    this._storage.removeItem('expires_at');\n    this._storage.removeItem('id_token_claims_obj');\n    this._storage.removeItem('id_token_expires_at');\n    this._storage.removeItem('id_token_stored_at');\n    this._storage.removeItem('access_token_stored_at');\n    this._storage.removeItem('granted_scopes');\n    this._storage.removeItem('session_state');\n    if (this.config.customTokenParameters) {\n      this.config.customTokenParameters.forEach((customParam) =>\n        this._storage.removeItem(customParam)\n      );\n    }\n    this.silentRefreshSubject = null;\n\n    this.eventsSubject.next(new OAuthInfoEvent('logout'));\n\n    if (!this.logoutUrl) {\n      return;\n    }\n    if (noRedirectToLogoutUrl) {\n      return;\n    }\n\n    // if (!id_token && !this.postLogoutRedirectUri) {\n    //   return;\n    // }\n\n    let logoutUrl: string;\n\n    if (!this.validateUrlForHttps(this.logoutUrl)) {\n      throw new Error(\n        \"logoutUrl  must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n      );\n    }\n\n    // For backward compatibility\n    if (this.logoutUrl.indexOf('{{') > -1) {\n      logoutUrl = this.logoutUrl\n        .replace(/\\{\\{id_token\\}\\}/, encodeURIComponent(id_token))\n        .replace(/\\{\\{client_id\\}\\}/, encodeURIComponent(this.clientId));\n    } else {\n      let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() });\n\n      if (id_token) {\n        params = params.set('id_token_hint', id_token);\n      }\n\n      const postLogoutUrl =\n        this.postLogoutRedirectUri ||\n        (this.redirectUriAsPostLogoutRedirectUriFallback && this.redirectUri) ||\n        '';\n      if (postLogoutUrl) {\n        params = params.set('post_logout_redirect_uri', postLogoutUrl);\n\n        if (state) {\n          params = params.set('state', state);\n        }\n      }\n\n      for (const key in customParameters) {\n        params = params.set(key, customParameters[key]);\n      }\n\n      logoutUrl =\n        this.logoutUrl +\n        (this.logoutUrl.indexOf('?') > -1 ? '&' : '?') +\n        params.toString();\n    }\n    this.config.openUri(logoutUrl);\n  }\n\n  /**\n   * @ignore\n   */\n  public createAndSaveNonce(): Promise<string> {\n    const that = this; // eslint-disable-line @typescript-eslint/no-this-alias\n    return this.createNonce().then(function (nonce: any) {\n      // Use localStorage for nonce if possible\n      // localStorage is the only storage who survives a\n      // redirect in ALL browsers (also IE)\n      // Otherwiese we'd force teams who have to support\n      // IE into using localStorage for everything\n      if (\n        that.saveNoncesInLocalStorage &&\n        typeof window['localStorage'] !== 'undefined'\n      ) {\n        localStorage.setItem('nonce', nonce);\n      } else {\n        that._storage.setItem('nonce', nonce);\n      }\n      return nonce;\n    });\n  }\n\n  /**\n   * @ignore\n   */\n  public ngOnDestroy(): void {\n    this.clearAccessTokenTimer();\n    this.clearIdTokenTimer();\n\n    this.removeSilentRefreshEventListener();\n    const silentRefreshFrame = this.document.getElementById(\n      this.silentRefreshIFrameName\n    );\n    if (silentRefreshFrame) {\n      silentRefreshFrame.remove();\n    }\n\n    this.stopSessionCheckTimer();\n    this.removeSessionCheckEventListener();\n    const sessionCheckFrame = this.document.getElementById(\n      this.sessionCheckIFrameName\n    );\n    if (sessionCheckFrame) {\n      sessionCheckFrame.remove();\n    }\n  }\n\n  protected createNonce(): Promise<string> {\n    return new Promise((resolve) => {\n      if (this.rngUrl) {\n        throw new Error(\n          'createNonce with rng-web-api has not been implemented so far'\n        );\n      }\n\n      /*\n       * This alphabet is from:\n       * https://tools.ietf.org/html/rfc7636#section-4.1\n       *\n       * [A-Z] / [a-z] / [0-9] / \"-\" / \".\" / \"_\" / \"~\"\n       */\n      const unreserved =\n        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n      let size = 45;\n      let id = '';\n\n      const crypto =\n        typeof self === 'undefined' ? null : self.crypto || self['msCrypto'];\n      if (crypto) {\n        let bytes = new Uint8Array(size);\n        crypto.getRandomValues(bytes);\n\n        // Needed for IE\n        if (!bytes.map) {\n          (bytes as any).map = Array.prototype.map;\n        }\n\n        bytes = bytes.map((x) => unreserved.charCodeAt(x % unreserved.length));\n        id = String.fromCharCode.apply(null, bytes);\n      } else {\n        while (0 < size--) {\n          id += unreserved[(Math.random() * unreserved.length) | 0];\n        }\n      }\n\n      resolve(base64UrlEncode(id));\n    });\n  }\n\n  protected async checkAtHash(params: ValidationParams): Promise<boolean> {\n    if (!this.tokenValidationHandler) {\n      this.logger.warn(\n        'No tokenValidationHandler configured. Cannot check at_hash.'\n      );\n      return true;\n    }\n    return this.tokenValidationHandler.validateAtHash(params);\n  }\n\n  protected checkSignature(params: ValidationParams): Promise<any> {\n    if (!this.tokenValidationHandler) {\n      this.logger.warn(\n        'No tokenValidationHandler configured. Cannot check signature.'\n      );\n      return Promise.resolve(null);\n    }\n    return this.tokenValidationHandler.validateSignature(params);\n  }\n\n  /**\n   * Start the implicit flow or the code flow,\n   * depending on your configuration.\n   */\n  public initLoginFlow(additionalState = '', params = {}): void {\n    if (this.responseType === 'code') {\n      return this.initCodeFlow(additionalState, params);\n    } else {\n      return this.initImplicitFlow(additionalState, params);\n    }\n  }\n\n  /**\n   * Starts the authorization code flow and redirects to user to\n   * the auth servers login url.\n   */\n  public initCodeFlow(additionalState = '', params = {}): void {\n    if (this.loginUrl !== '') {\n      this.initCodeFlowInternal(additionalState, params);\n    } else {\n      this.events\n        .pipe(filter((e) => e.type === 'discovery_document_loaded'))\n        .subscribe(() => this.initCodeFlowInternal(additionalState, params));\n    }\n  }\n\n  private initCodeFlowInternal(additionalState = '', params = {}): void {\n    if (!this.validateUrlForHttps(this.loginUrl)) {\n      throw new Error(\n        \"loginUrl  must use HTTPS (with TLS), or config value for property 'requireHttps' must be set to 'false' and allow HTTP (without TLS).\"\n      );\n    }\n\n    let addParams = {};\n    let loginHint = null;\n    if (typeof params === 'string') {\n      loginHint = params;\n    } else if (typeof params === 'object') {\n      addParams = params;\n    }\n\n    this.createLoginUrl(additionalState, loginHint, null, false, addParams)\n      .then(this.config.openUri)\n      .catch((error) => {\n        console.error('Error in initAuthorizationCodeFlow');\n        console.error(error);\n      });\n  }\n\n  protected async createChallangeVerifierPairForPKCE(): Promise<\n    [string, string]\n  > {\n    if (!this.crypto) {\n      throw new Error(\n        'PKCE support for code flow needs a CryptoHander. Did you import the OAuthModule using forRoot() ?'\n      );\n    }\n\n    const verifier = await this.createNonce();\n    const challengeRaw = await this.crypto.calcHash(verifier, 'sha-256');\n    const challenge = base64UrlEncode(challengeRaw);\n\n    return [challenge, verifier];\n  }\n\n  private extractRecognizedCustomParameters(\n    tokenResponse: TokenResponse\n  ): Map<string, string> {\n    const foundParameters: Map<string, string> = new Map<string, string>();\n    if (!this.config.customTokenParameters) {\n      return foundParameters;\n    }\n    this.config.customTokenParameters.forEach((recognizedParameter: string) => {\n      if (tokenResponse[recognizedParameter]) {\n        foundParameters.set(\n          recognizedParameter,\n          JSON.stringify(tokenResponse[recognizedParameter])\n        );\n      }\n    });\n    return foundParameters;\n  }\n\n  /**\n   * Revokes the auth token to secure the vulnarability\n   * of the token issued allowing the authorization server to clean\n   * up any security credentials associated with the authorization\n   */\n  public revokeTokenAndLogout(\n    customParameters: boolean | object = {},\n    ignoreCorsIssues = false\n  ): Promise<any> {\n    const revokeEndpoint = this.revocationEndpoint;\n    const accessToken = this.getAccessToken();\n    const refreshToken = this.getRefreshToken();\n\n    if (!accessToken) {\n      return Promise.resolve();\n    }\n\n    let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() });\n\n    let headers = new HttpHeaders().set(\n      'Content-Type',\n      'application/x-www-form-urlencoded'\n    );\n\n    if (this.useHttpBasicAuth) {\n      const header = btoa(`${this.clientId}:${this.dummyClientSecret}`);\n      headers = headers.set('Authorization', 'Basic ' + header);\n    }\n\n    if (!this.useHttpBasicAuth) {\n      params = params.set('client_id', this.clientId);\n    }\n\n    if (!this.useHttpBasicAuth && this.dummyClientSecret) {\n      params = params.set('client_secret', this.dummyClientSecret);\n    }\n\n    if (this.customQueryParams) {\n      for (const key of Object.getOwnPropertyNames(this.customQueryParams)) {\n        params = params.set(key, this.customQueryParams[key]);\n      }\n    }\n\n    return new Promise((resolve, reject) => {\n      let revokeAccessToken: Observable<void>;\n      let revokeRefreshToken: Observable<void>;\n\n      if (accessToken) {\n        const revokationParams = params\n          .set('token', accessToken)\n          .set('token_type_hint', 'access_token');\n        revokeAccessToken = this.http.post<void>(\n          revokeEndpoint,\n          revokationParams,\n          { headers }\n        );\n      } else {\n        revokeAccessToken = of(null);\n      }\n\n      if (refreshToken) {\n        const revokationParams = params\n          .set('token', refreshToken)\n          .set('token_type_hint', 'refresh_token');\n        revokeRefreshToken = this.http.post<void>(\n          revokeEndpoint,\n          revokationParams,\n          { headers }\n        );\n      } else {\n        revokeRefreshToken = of(null);\n      }\n\n      if (ignoreCorsIssues) {\n        revokeAccessToken = revokeAccessToken.pipe(\n          catchError((err: HttpErrorResponse) => {\n            if (err.status === 0) {\n              return of<void>(null);\n            }\n            return throwError(err);\n          })\n        );\n\n        revokeRefreshToken = revokeRefreshToken.pipe(\n          catchError((err: HttpErrorResponse) => {\n            if (err.status === 0) {\n              return of<void>(null);\n            }\n            return throwError(err);\n          })\n        );\n      }\n\n      combineLatest([revokeAccessToken, revokeRefreshToken]).subscribe(\n        (res) => {\n          this.logOut(customParameters);\n          resolve(res);\n          this.logger.info('Token successfully revoked');\n        },\n        (err) => {\n          this.logger.error('Error revoking token', err);\n          this.eventsSubject.next(\n            new OAuthErrorEvent('token_revoke_error', err)\n          );\n          reject(err);\n        }\n      );\n    });\n  }\n\n  /**\n   * Clear location.hash if it's present\n   */\n  private clearLocationHash() {\n    // Checking for empty hash is necessary for Firefox\n    // as setting an empty hash to an empty string adds # to the URL\n    if (location.hash != '') {\n      location.hash = '';\n    }\n  }\n}\n","import { HttpResponse } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\n\nexport abstract class OAuthResourceServerErrorHandler {\n  abstract handleError(err: HttpResponse<any>): Observable<any>;\n}\n\nexport class OAuthNoopResourceServerErrorHandler\n  implements OAuthResourceServerErrorHandler\n{\n  handleError(err: HttpResponse<any>): Observable<any> {\n    return throwError(err);\n  }\n}\n","import { Injectable, Optional } from '@angular/core';\n\nimport {\n  HttpEvent,\n  HttpHandler,\n  HttpInterceptor,\n  HttpRequest,\n} from '@angular/common/http';\nimport { Observable, of, merge } from 'rxjs';\nimport {\n  catchError,\n  filter,\n  map,\n  take,\n  mergeMap,\n  timeout,\n} from 'rxjs/operators';\nimport { OAuthResourceServerErrorHandler } from './resource-server-error-handler';\nimport { OAuthModuleConfig } from '../oauth-module.config';\nimport { OAuthService } from '../oauth-service';\n\n@Injectable()\nexport class DefaultOAuthInterceptor implements HttpInterceptor {\n  constructor(\n    private oAuthService: OAuthService,\n    private errorHandler: OAuthResourceServerErrorHandler,\n    @Optional() private moduleConfig: OAuthModuleConfig\n  ) {}\n\n  private checkUrl(url: string): boolean {\n    if (this.moduleConfig.resourceServer.customUrlValidation) {\n      return this.moduleConfig.resourceServer.customUrlValidation(url);\n    }\n\n    if (this.moduleConfig.resourceServer.allowedUrls) {\n      return !!this.moduleConfig.resourceServer.allowedUrls.find((u) =>\n        url.toLowerCase().startsWith(u.toLowerCase())\n      );\n    }\n\n    return true;\n  }\n\n  public intercept(\n    req: HttpRequest<any>,\n    next: HttpHandler\n  ): Observable<HttpEvent<any>> {\n    const url = req.url.toLowerCase();\n\n    if (\n      !this.moduleConfig ||\n      !this.moduleConfig.resourceServer ||\n      !this.checkUrl(url)\n    ) {\n      return next.handle(req);\n    }\n\n    const sendAccessToken = this.moduleConfig.resourceServer.sendAccessToken;\n\n    if (!sendAccessToken) {\n      return next\n        .handle(req)\n        .pipe(catchError((err) => this.errorHandler.handleError(err)));\n    }\n\n    return merge(\n      of(this.oAuthService.getAccessToken()).pipe(filter((token) => !!token)),\n      this.oAuthService.events.pipe(\n        filter((e) => e.type === 'token_received'),\n        timeout(this.oAuthService.waitForTokenInMsec || 0),\n        catchError(() => of(null)), // timeout is not an error\n        map(() => this.oAuthService.getAccessToken())\n      )\n    ).pipe(\n      take(1),\n      mergeMap((token) => {\n        if (token) {\n          const header = 'Bearer ' + token;\n          const headers = req.headers.set('Authorization', header);\n          req = req.clone({ headers });\n        }\n\n        return next\n          .handle(req)\n          .pipe(catchError((err) => this.errorHandler.handleError(err)));\n      })\n    );\n  }\n}\n","import { MemoryStorage } from './types';\n\nexport function createDefaultLogger() {\n  return console;\n}\n\nexport function createDefaultStorage() {\n  return typeof sessionStorage !== 'undefined'\n    ? sessionStorage\n    : new MemoryStorage();\n}\n","import { makeEnvironmentProviders, EnvironmentProviders } from '@angular/core';\nimport { OAuthModuleConfig } from './oauth-module.config';\nimport { NullValidationHandler } from './token-validation/null-validation-handler';\nimport { DateTimeProvider, SystemDateTimeProvider } from './date-time-provider';\nimport { OAuthStorage, OAuthLogger } from './types';\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\n\nimport { OAuthService } from './oauth-service';\nimport { UrlHelperService } from './url-helper.service';\n\nimport {\n  OAuthResourceServerErrorHandler,\n  OAuthNoopResourceServerErrorHandler,\n} from './interceptors/resource-server-error-handler';\nimport { DefaultOAuthInterceptor } from './interceptors/default-oauth.interceptor';\nimport { ValidationHandler } from './token-validation/validation-handler';\nimport { createDefaultLogger, createDefaultStorage } from './factories';\nimport {\n  HashHandler,\n  DefaultHashHandler,\n} from './token-validation/hash-handler';\n\nexport function provideOAuthClient(\n  config: OAuthModuleConfig = null,\n  validationHandlerClass = NullValidationHandler\n): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    OAuthService,\n    UrlHelperService,\n    { provide: OAuthLogger, useFactory: createDefaultLogger },\n    { provide: OAuthStorage, useFactory: createDefaultStorage },\n    { provide: ValidationHandler, useClass: validationHandlerClass },\n    { provide: HashHandler, useClass: DefaultHashHandler },\n    {\n      provide: OAuthResourceServerErrorHandler,\n      useClass: OAuthNoopResourceServerErrorHandler,\n    },\n    { provide: OAuthModuleConfig, useValue: config },\n    {\n      provide: HTTP_INTERCEPTORS,\n      useClass: DefaultOAuthInterceptor,\n      multi: true,\n    },\n    { provide: DateTimeProvider, useClass: SystemDateTimeProvider },\n  ]);\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { OAuthModuleConfig } from './oauth-module.config';\nimport { NullValidationHandler } from './token-validation/null-validation-handler';\nimport { provideOAuthClient } from './provider';\n\n@NgModule({\n  imports: [CommonModule],\n  declarations: [],\n  exports: [],\n})\nexport class OAuthModule {\n  static forRoot(\n    config: OAuthModuleConfig = null,\n    validationHandlerClass = NullValidationHandler\n  ): ModuleWithProviders<OAuthModule> {\n    return {\n      ngModule: OAuthModule,\n      providers: [provideOAuthClient(config, validationHandlerClass)],\n    };\n  }\n}\n","import { NullValidationHandler } from './null-validation-handler';\n\nconst err = `PLEASE READ THIS CAREFULLY:\n\nBeginning with angular-oauth2-oidc version 9, the JwksValidationHandler\nhas been moved to an library of its own. If you need it for implementing\nOAuth2/OIDC **implicit flow**, please install it using npm:\n\n  npm i angular-oauth2-oidc-jwks --save\n\nAfter that, you can import it into your application:\n\n  import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';\n\nPlease note, that this dependency is not needed for the **code flow**,\nwhich is nowadays the **recommented** one for single page applications.\nThis also results in smaller bundle sizes.\n`;\n\n/**\n * This is just a dummy of the JwksValidationHandler\n * telling the users that the real one has been moved\n * to an library of its own, namely angular-oauth2-oidc-utils\n */\nexport class JwksValidationHandler extends NullValidationHandler {\n  constructor() {\n    super();\n    console.error(err);\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { AuthConfig } from './auth.config';\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('AUTH_CONFIG');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["fsha256","i7.DateTimeProvider","i1.OAuthService","i2.OAuthResourceServerErrorHandler","i3.OAuthModuleConfig"],"mappings":"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"}