@criipto/verify-react 2.4.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AuthButtonGroup.d.ts +1 -1
- package/dist/components/AuthMethodButton/Logo.d.ts +1 -1
- package/dist/components/AuthMethodButton.d.ts +1 -1
- package/dist/components/AuthMethodSelector.d.ts +2 -3
- package/dist/components/Button.d.ts +2 -2
- package/dist/components/SEBankIDQRCode.d.ts +2 -2
- package/dist/components/SEBankIDSameDeviceButton/Foreground.d.ts +1 -1
- package/dist/components/SEBankIDSameDeviceButton/Poll.d.ts +1 -1
- package/dist/components/SEBankIDSameDeviceButton/Reload.d.ts +1 -1
- package/dist/components/SEBankIDSameDeviceButton.d.ts +2 -2
- package/dist/criipto-verify-react.cjs.js +1 -1
- package/dist/criipto-verify-react.cjs.js.map +1 -1
- package/dist/criipto-verify-react.esm.js +1 -1
- package/dist/criipto-verify-react.esm.js.map +1 -1
- package/dist/provider.d.ts +1 -1
- package/dist/stories/StoryResponseRenderer.d.ts +3 -3
- package/doctor-storybook.log +13 -0
- package/package.json +25 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criipto-verify-react.cjs.js","mappings":"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","sources":["webpack://@criipto/verify-react/webpack/bootstrap","webpack://@criipto/verify-react/webpack/runtime/compat get default export","webpack://@criipto/verify-react/webpack/runtime/define property getters","webpack://@criipto/verify-react/webpack/runtime/hasOwnProperty shorthand","webpack://@criipto/verify-react/webpack/runtime/make namespace object","webpack://@criipto/verify-react/external commonjs \"react/jsx-runtime\"","webpack://@criipto/verify-react/external commonjs \"react\"","webpack://@criipto/verify-react/external commonjs \"@criipto/auth-js\"","webpack://@criipto/verify-react/./src/context.ts","webpack://@criipto/verify-react/./src/utils.ts","webpack://@criipto/verify-react/external commonjs \"jwt-decode\"","webpack://@criipto/verify-react/./src/memory-storage.ts","webpack://@criipto/verify-react/./src/provider.tsx","webpack://@criipto/verify-react/external commonjs \"ua-parser-js\"","webpack://@criipto/verify-react/./src/device.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Poll.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Foreground.tsx","webpack://@criipto/verify-react/./src/hooks/usePageVisibility.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/shared.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Reload.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton/Logo.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/beeid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nldigid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dkmitid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dknemid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/ftnmobile@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/itsme@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sebankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sofort@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nobankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/novipps@2x.png","webpack://@criipto/verify-react/./src/components/Button.tsx","webpack://@criipto/verify-react/external commonjs \"qrcode\"","webpack://@criipto/verify-react/./src/components/SEBankIDQRCode.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDQRCode/logo@2x.png","webpack://@criipto/verify-react/./src/components/AuthButtonGroup.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodSelector.tsx","webpack://@criipto/verify-react/./src/components/QRCode.tsx","webpack://@criipto/verify-react/./src/use-criipto-verify.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react/jsx-runtime\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@criipto/auth-js\");","import CriiptoAuth, {OpenIDConfiguration, AuthorizeUrlParamsOptional, PKCE, AuthorizeResponse, OAuth2Error, PKCEPublicPart} from '@criipto/auth-js';\nimport { PopupAuthorizeParams, RedirectAuthorizeParams } from '@criipto/auth-js/dist/types';\nimport { createContext } from 'react';\n\nexport type ResultSource = 'QRCode' | 'SEBankIDQrCode' | 'SEBankIDSameDeviceButton' | 'redirect';\nexport type Result = {id_token: string, state?: string, source?: ResultSource} | {code: string, state?: string, source?: ResultSource} | OAuth2Error | Error;\nexport const actions = ['confirm', 'accept', 'approve', 'sign', 'login'] as const;\nexport type Action = typeof actions[number];\nexport type Claims = {\n iss: string\n aud: string\n identityscheme: string\n authenticationtype: string\n sub: string\n iat: number\n exp: number\n [key: string]: string | number\n}\n\nexport interface CriiptoVerifyContextInterface {\n loginWithRedirect: (params?: RedirectAuthorizeParams) => Promise<void>,\n loginWithPopup: (params?: PopupAuthorizeParams) => Promise<void>,\n checkSession: () => Promise<void>,\n logout: (params?: {redirectUri?: string, state?: string}) => Promise<void>,\n fetchOpenIDConfiguration: () => Promise<OpenIDConfiguration>,\n buildAuthorizeUrl: (options?: AuthorizeUrlParamsOptional) => Promise<string>,\n generatePKCE: () => Promise<PKCE | undefined>,\n buildOptions: (options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) => AuthorizeUrlParamsOptional\n handleResponse: (response: AuthorizeResponse, params: {pkce?: PKCE, redirectUri?: string, source?: ResultSource}) => Promise<void>,\n responseType: 'token' | 'code'\n completionStrategy: 'client' | 'openidprovider',\n result: Result | null\n claims: Claims | null\n domain: string\n redirectUri?: string,\n action: Action,\n message?: string,\n pkce?: PKCE | PKCEPublicPart,\n store: Storage,\n isLoading: boolean,\n isInitializing: boolean,\n acrValues?: string[],\n uiLocales?: string,\n client: CriiptoAuth\n loginHint?: string\n}\n\n/**\n * @ignore\n */\nconst stub = (): never => {\n throw new Error('You forgot to wrap your component in <CriiptoVerifyProvider>.');\n};\n\n/**\n * @ignore\n */\nconst initialContext = {\n loginWithRedirect: stub,\n loginWithPopup: stub,\n checkSession: stub,\n logout: stub,\n fetchOpenIDConfiguration: stub,\n buildAuthorizeUrl: stub,\n generatePKCE: stub,\n buildOptions: stub,\n handleResponse: stub,\n responseType: 'token' as 'token' | 'code',\n completionStrategy: 'client' as 'client' | 'openidprovider',\n result: null,\n claims: null,\n domain: '',\n action: 'login' as Action,\n pkce: undefined,\n store: null as any as Storage,\n isLoading: false,\n isInitializing: true,\n client: null as any as CriiptoAuth,\n loginHint: undefined\n};\n\nconst CriiptoVerifyContext = createContext<CriiptoVerifyContextInterface>(initialContext);\n\nexport default CriiptoVerifyContext;","import { Action } from \"./context\";\n\ndeclare var __VERSION__: string;\nexport const VERSION = typeof __VERSION__ === \"undefined\" ? \"N/A\": __VERSION__;\n\nexport const DKMITID_PREFIX = 'urn:grn:authn:dk:mitid';\nexport const DKMITID_BUSINESS = 'urn:grn:authn:dk:mitid:business';\nexport const FTN_PREFIX = 'urn:grn:authn:fi';\n\nexport function lowestMitIDValue(input: string[]) : string | null {\n let dkmitidMethod : string | null = null;\n\n input.forEach(s => {\n if (s.startsWith(DKMITID_PREFIX) && s !== DKMITID_BUSINESS) {\n if (!dkmitidMethod) {\n dkmitidMethod = s;\n } else {\n let newLevel = s.replace(DKMITID_PREFIX, '');\n let oldLevel = dkmitidMethod.replace(DKMITID_PREFIX, '');\n if (newLevel === ':low' && [':substantial', ':high'].includes(oldLevel)) {\n dkmitidMethod = s;\n }\n else if (newLevel === ':substantial' && oldLevel === ':high') {\n dkmitidMethod = s;\n }\n }\n }\n });\n\n return dkmitidMethod;\n}\n\nfunction autoTitleCase(input: string) {\n var segments = input.split(/:|-/).map(segment => {\n segment = segment.replace(/id(\\s|$)/, 'ID');\n if (segment.length === 2) return segment.toUpperCase();\n return segment.substr(0, 1).toUpperCase() + segment.substr(1);\n });\n return segments.join(' ');\n}\n\nfunction assertUnreachable(x: never): never {\n throw new Error(\"Didn't expect to get here\");\n}\n\nexport function assertUnreachableLanguage(x: never): never {\n throw new Error(`Unsupported language ${x}`);\n}\nexport type Language = 'en' | 'da' | 'sv' | 'nb';\n\nexport function stringifyAction(language: Language, action: Action) : string {\n if (action === 'login') {\n if (language === 'da') return 'Login med';\n else if (language === 'sv') return 'Logga in med'\n else if (language === 'nb') return 'Logg inn med';\n return 'Login with';\n }\n if (action === 'approve') {\n if (language === 'da') return 'Godkend med';\n else if (language === 'sv') return 'Godkänn med'\n else if (language === 'nb') return 'Godkjenne med';\n return 'Approve with';\n }\n if (action === 'sign') {\n if (language === 'da') return 'Underskriv med';\n else if (language === 'sv') return 'Signera med'\n else if (language === 'nb') return 'Signer med';\n return 'Sign with';\n }\n if (action === 'confirm') {\n if (language === 'da') return 'Bekræft med';\n else if (language === 'sv') return 'Bekräfta med'\n else if (language === 'nb') return 'Bekreft med';\n return 'Confirm with';\n }\n if (action === 'accept') {\n if (language === 'da') return 'Accepter med';\n else if (language === 'sv') return 'Acceptera med'\n else if (language === 'nb') return 'Aksepterer med';\n return 'Accept with';\n }\n\n assertUnreachable(action);\n}\n\nexport function acrValueToProviderPrefix(value: string) {\n value = value.replace('urn:grn:authn:', '');\n\n if (value.startsWith('fi')) {\n return 'fi';\n }\n else if (value.startsWith('itsme')) {\n return 'itsme';\n } else {\n return value.split(':').slice(0, 2).join(':');\n }\n}\n\nexport function acrValueToTitle(language: Language, value: string) : {title: string, subtitle?: string} {\n\tvalue = value.replace('urn:grn:authn:', '');\n const provider = acrValueToProviderPrefix(value);\n\n if (provider === 'be:eid') {\n return {title: autoTitleCase(value).replace('BEEID', 'Belgian eID')};\n }\n if (provider === 'nl:digid') {\n return {title: autoTitleCase(value).replace('NL ', '')};\n }\n if (provider === 'dk:mitid') {\n let suffix = value.replace('dk:mitid:', '');\n if (suffix === 'business') {\n if (language === 'en') return {title: 'MitID Business'}\n if (language === 'da') return {title: 'MitID Erhverv'}\n if (language === 'sv') return {title: 'MitID Erhverv'}\n if (language === 'nb') return {title: 'MitID Erhverv'}\n return {title: 'MitID Erhverv'};\n }\n\n return {title: 'MitID'};\n }\n if (provider === 'dk:nemid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('dk:nemid:', '');\n\t\t\n\t\tif (suffix === 'poces') {\n\t\t\tif (language === 'en') subtitle = 'Personal';\n\t\t\tif (language === 'da') subtitle = 'Personlig';\n\t\t\tif (language === 'sv') subtitle = 'Personlig';\n\t\t\tif (language === 'nb') subtitle = 'Personlig';\n\t\t}\n\t\tif (suffix === 'moces') {\n\t\t\tif (language === 'en') subtitle = 'Employee key card';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglekort';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelkort';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelkort';\n\t\t}\n\t\tif (suffix === 'moces:codefile') {\n\t\t\tif (language === 'en') subtitle = 'Employee key file';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglefil';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelfil';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelfil';\n\t\t}\n\n return {\n\t\t\ttitle: 'NemID',\n\t\t\tsubtitle\n\t\t}\n }\n if (value === 'fi:mobile-id') {\n if (language === 'en') return {title: 'Finnish Mobile ID'};\n if (language === 'da') return {title: 'Finsk Mobil ID'};\n if (language === 'sv') return {title: 'Finskt Mobil ID'};\n if (language === 'nb') return {title: 'Finsk Mobil ID'};\n }\n if (value === 'fi:bank-id') {\n if (language === 'en') return {title: 'Finnish Bank ID'};\n if (language === 'da') return {title: 'Finsk Bank ID'};\n if (language === 'sv') return {title: 'Finskt Bank ID'};\n if (language === 'nb') return {title: 'Finsk Bank ID'};\n }\n if (provider === 'fi') {\n return {title: autoTitleCase(value).replace('FI', 'FTN')};\n }\n if (provider === 'itsme') {\n return {title: autoTitleCase(value).replace('me', 'ME')};\n }\n if (provider === 'se:bankid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('se:bankid:', '');\n\n\t\tif (suffix === 'same-device') {\n\t\t\tif (language === 'en') subtitle = 'On this device';\n\t\t\tif (language === 'da') subtitle = 'På denne enhed';\n\t\t\tif (language === 'sv') subtitle = 'På denna enhet';\n\t\t\tif (language === 'nb') subtitle = 'På denne enhet';\n\t\t}\n\t\tif (suffix === 'another-device') {\n\t\t\tif (language === 'en') subtitle = 'With your SSN';\n\t\t\tif (language === 'da') subtitle = 'Med dit personnummer';\n\t\t\tif (language === 'sv') subtitle = 'Med ditt personnummer';\n\t\t\tif (language === 'nb') subtitle = 'Med personnummeret ditt';\n\t\t}\n\t\tif (suffix === 'another-device:qr') {\n\t\t\tif (language === 'en') subtitle = 'On another device';\n\t\t\tif (language === 'da') subtitle = 'På anden enhed';\n\t\t\tif (language === 'sv') subtitle = 'På annan enhet';\n\t\t\tif (language === 'nb') subtitle = 'På annan enhet';\n\t\t}\n\n return {title: 'BankID', subtitle};\n }\n if (provider === 'de:sofort') {\n return {title: autoTitleCase(value).replace('DE ', '')};\n }\n if (provider === 'no:bankid') {\n let subtitle : string | undefined = undefined;\n if (value.endsWith(':substantial')) {\n if (language === 'en') subtitle = 'Biometrics';\n\t\t\tif (language === 'da') subtitle = 'Biometri ';\n\t\t\tif (language === 'sv') subtitle = 'Biometri';\n\t\t\tif (language === 'nb') subtitle = 'Biometri';\n }\n return {title: subtitle ? 'BankID' : autoTitleCase(value).replace('NO ', ''), subtitle};\n }\n if (provider === 'no:vipps') {\n return {title: autoTitleCase(value).replace('NO ', '')};\n }\n\n return {title: autoTitleCase(value)};\n}\n\nexport function filterAcrValues(input: string[]) {\n let original = input.slice();\n let dkmitidMethod : string | null = lowestMitIDValue(input);\n let reduced = input.slice();\n\n if (dkmitidMethod) {\n reduced =\n input.filter(s => !s.startsWith(DKMITID_PREFIX) || s === DKMITID_BUSINESS)\n .concat([dkmitidMethod])\n .sort((a, b) => original.indexOf(a) - original.indexOf(b));\n }\n\n if (input.includes(`${FTN_PREFIX}:all`)) {\n if (!reduced.includes(`${FTN_PREFIX}:bank-id`)) reduced.push(`${FTN_PREFIX}:bank-id`);\n if (!reduced.includes(`${FTN_PREFIX}:mobile-id`)) reduced.push(`${FTN_PREFIX}:mobile-id`);\n reduced = reduced.filter(s => s !== `${FTN_PREFIX}:all`);\n }\n return reduced;\n}\n\nexport function isSingle(acrValue: string, acrValues: string[]) {\n const provider = acrValueToProviderPrefix(acrValue);\n const count = acrValues.reduce((memo, acrValue) => memo + (acrValueToProviderPrefix(acrValue) === provider ? 1 : 0), 0);\n return count === 1;\n}\n\nexport function trySessionStorage() {\n try {\n if (typeof sessionStorage === 'undefined') {\n return null;\n }\n return sessionStorage;\n } catch (err) {\n /**\n * Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n * (if storage is disabled in the browser)\n */\n return null;\n }\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"jwt-decode\");","\nexport function createMemoryStorage() : Storage {\n let store : {[key: string]: string} = {};\n\n return {\n getItem(key: string) {\n return store[key] || null;\n },\n setItem(key: string, value: any) {\n store[key] = value.toString();\n },\n removeItem(key: string) {\n delete store[key];\n },\n clear() {\n store = {};\n },\n key(index) {\n return Object.keys(store)[index];\n },\n get length() {\n return Object.keys(store).length;\n }\n };\n}","import React, {useMemo, useState, useCallback, useEffect} from 'react';\nimport CriiptoAuth, {AuthorizeUrlParamsOptional, clearPKCEState, generatePKCE, OAuth2Error, OpenIDConfiguration, PKCE, PKCEPublicPart, Prompt, parseAuthorizeResponseFromLocation} from '@criipto/auth-js';\n\nimport CriiptoVerifyContext, {CriiptoVerifyContextInterface, Action, Result, Claims, actions, ResultSource} from './context';\nimport { AuthorizeResponse, RedirectAuthorizeParams, ResponseType } from '@criipto/auth-js/dist/types';\n\nimport { filterAcrValues, trySessionStorage, VERSION } from './utils';\nimport jwtDecode from 'jwt-decode';\nimport { createMemoryStorage } from './memory-storage';\n\nconst SESSION_KEY = `@criipto-verify-react/session`;\n \nexport interface CriiptoVerifyProviderOptions {\n domain: string\n clientID: string\n /**\n * @deprecated Development use only\n */\n protocol?: \"https\" | \"http\"\n\n redirectUri?: string\n children: React.ReactNode\n pkce?: PKCEPublicPart\n state?: string\n nonce?: string\n prompt?: Prompt\n scope?: string\n uiLocales?: string\n loginHint?: string\n /**\n * Enables storage and automatic fetch of tokens\n * by utilizing browser storage and SSO silent logins.\n * Make sure \"SSO for OAuth2\" is enabled on your Criipto Domain.\n * Only works for `response: 'token'` (default)\n */\n sessionStore?: Storage,\n /**\n * Will ammend the login_hint parameter with `action:{action}` which will adjust texsts in certain flows.\n * Default: 'login'\n */\n action?: Action\n /**\n * Will ammend the login_hint parameter with `message:{base64(message)}` which will set a login/aprove message where available (Danish MitID).\n */\n message?: string\n /**\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do PKCE on your behalf and return a jwt token.\n * However if you wish you can disable this and get the raw `code` response by setting `response` to 'code'.\n */\n response?: 'token' | 'code'\n /*\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do as much as work on your behalf\n * by interpreting URL parameters and responses with `useCriiptoVerify()` via the default value 'client'.\n * If you wish to only render a UI and redirect to the Criipto IDP for server side code exchange, you can choose 'openidprovider'.\n */\n completionStrategy?: 'client' | 'openidprovider',\n\n /**\n * @deprecated Criipto internal use\n */\n criiptoSdk?: null | string\n /**\n * @deprecated Criipto internal use\n */\n responseType?: ResponseType | 'code id_token'\n /**\n * @deprecated Criipto internal use\n */\n responseMode?: \"query\" | \"form_post\" | \"fragment\" | \"json\" | \"post_message\"\n}\n\nexport const ACTION_SUPPORTING_ACR_VALUES = [\n 'urn:grn:authn:dk:mitid:low',\n 'urn:grn:authn:dk:mitid:substantial',\n 'urn:grn:authn:dk:mitid:high',\n 'urn:grn:authn:se:bankid:same-device',\n 'urn:grn:authn:se:bankid:another-device:qr',\n];\n\nexport const MESSAGE_SUPPORTING_ACR_VALUES = [\n 'urn:grn:authn:dk:mitid:low',\n 'urn:grn:authn:dk:mitid:substantial',\n 'urn:grn:authn:dk:mitid:high',\n 'urn:grn:authn:se:bankid:same-device',\n 'urn:grn:authn:se:bankid:another-device:qr'\n];\n\nexport function buildLoginHint(loginHint: string | undefined | null, params: {options?: AuthorizeUrlParamsOptional, action?: Action, message?: string}) {\n const {options, action, message} = params;\n const acrValues = options?.acrValues ? Array.isArray(options?.acrValues) ? options?.acrValues : [options?.acrValues] : [];\n let hints = (loginHint ? loginHint.split(' ') : []).concat(options?.loginHint ? options?.loginHint.split(' ') : []).filter(hint => !hint.startsWith('message:') && !hint.startsWith('action:'));\n if (action) {\n hints = hints.filter(h => !h.startsWith('action:'));\n if (acrValues.length === 1) {\n if (ACTION_SUPPORTING_ACR_VALUES.includes(acrValues[0])) {\n hints.push(`action:${action}`);\n }\n } else if (acrValues.length >= 2) {\n if (acrValues.some(v => ACTION_SUPPORTING_ACR_VALUES.includes(v))) {\n hints.push(`action:${action}`);\n }\n } else {\n hints.push(`action:${action}`);\n }\n }\n\n if (message) {\n if (acrValues.length === 1) {\n if (MESSAGE_SUPPORTING_ACR_VALUES.includes(acrValues[0])) {\n hints.push(`message:${btoa(message)}`);\n }\n } else if (acrValues.length >= 2) {\n if (acrValues.some(v => MESSAGE_SUPPORTING_ACR_VALUES.includes(v))) {\n hints.push(`message:${btoa(message)}`);\n }\n } else {\n hints.push(`message:${btoa(message)}`);\n }\n }\n\n return hints.length ? hints.join(' ') : undefined;\n}\n\nfunction parseAction(input?: string) : Action | undefined {\n if (!input) return;\n\n const segments = input.split(\" \");\n const actionCandidate = segments.find(s => s.startsWith('action:'));\n if (!actionCandidate) return;\n const action = actionCandidate.replace('action:','');\n if (actions.includes(action as any)) return action as Action;\n return;\n}\n\nfunction tryBase64Decode(input: string) {\n try {\n return atob(input);\n }\n catch {\n return null;\n }\n}\nfunction parseMessage(input?: string) : string | undefined {\n if (!input) return;\n const segments = input.split(\" \");\n const messageCandidate = segments.find(s => s.startsWith('message:'));\n if (!messageCandidate) return;\n\n const message = messageCandidate.replace('message:','');\n return tryBase64Decode(message) ?? message;\n}\n\nfunction defaultRedirectUri(input?: string) : string {\n if (input) return input;\n if (typeof window !== \"undefined\" && typeof window.location !== \"undefined\") {\n return window.location.origin + window.location.pathname;\n }\n\n throw new Error('Unable to determine default redirect uri, please provide a redirectUri');\n}\n\nconst pkceStore = (() => {\n const sessionStorage = trySessionStorage();\n if (sessionStorage === null) {\n console.warn('Creating memory store for PKCE values as no sessionStorage is available. Authentication may be broken.');\n return createMemoryStorage();\n }\n return sessionStorage;\n})();\n\nconst CriiptoVerifyProvider = (props: CriiptoVerifyProviderOptions) : JSX.Element => {\n const client = useMemo(() => \n new CriiptoAuth({\n domain: props.domain,\n clientID: props.clientID,\n store: pkceStore,\n redirectUri: defaultRedirectUri(props.redirectUri),\n protocol: props.protocol\n }), [props.domain, props.clientID, props.redirectUri, props.protocol]\n );\n\n const [configuration, setConfiguration] = useState<OpenIDConfiguration | null>(null);\n useEffect(() => {\n let isSubscribed = true;\n (async () => {\n const configuration = await client.fetchOpenIDConfiguration();\n if (isSubscribed) setConfiguration(configuration);\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [client]);\n\n const [result, setResult] = useState<Result | null>(null);\n const claims = useMemo(() => {\n if (!result) return null;\n if (!(\"id_token\" in result)) return null;\n return jwtDecode<Claims>(result.id_token);\n }, [result]);\n const [isLoading, setIsLoading] = useState(false);\n const [isInitializing, setIsInitializing] = useState(true);\n const [pkce, setPKCE] = useState<PKCE | PKCEPublicPart | undefined>(props.pkce);\n const responseType = props.response || 'token';\n const completionStrategy = props.completionStrategy || 'client';\n const uiLocales = props.uiLocales;\n const loginHint = props.loginHint;\n const action = props.action ?? parseAction(loginHint) ?? 'login';\n const message = props.message ?? parseMessage(loginHint);\n const sessionStore = props.sessionStore;\n\n const refreshPKCE = async () => {\n if (props.pkce) return props.pkce;\n if (responseType !== 'token' || completionStrategy !== 'client') {\n clearPKCEState(pkceStore);\n setPKCE(undefined);\n return undefined;\n }\n\n clearPKCEState(pkceStore);\n\n const pkce = await generatePKCE();\n setPKCE(pkce);\n return pkce;\n }\n\n const buildOptions = useCallback((options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) : AuthorizeUrlParamsOptional => {\n return {\n redirectUri: defaultRedirectUri(props.redirectUri),\n responseType: (props.responseType ?? 'code') as ResponseType,\n responseMode: props.responseMode,\n ...options || {},\n state: props.state ?? options?.state,\n nonce: props.nonce ?? options?.nonce,\n prompt: props.prompt ?? options?.prompt,\n scope: props.scope ?? options?.scope,\n uiLocales: uiLocales ?? options?.uiLocales,\n pkce: options?.pkce ?? pkce,\n loginHint: buildLoginHint(props.loginHint, {options, action, message}),\n extraUrlParams: props.criiptoSdk !== undefined ? {\n criipto_sdk: props.criiptoSdk\n } : {\n criipto_sdk: `@criipto/verify-react@${VERSION}`\n }\n }\n }, [\n pkce,\n props.state,\n props.nonce,\n props.prompt,\n props.scope,\n uiLocales,\n action,\n message,\n props.redirectUri,\n props.criiptoSdk,\n props.loginHint,\n props.responseMode,\n props.responseType\n ]);\n\n const buildAuthorizeUrl = useCallback(async (options?: AuthorizeUrlParamsOptional) => {\n return await client.buildAuthorizeUrl(client.buildAuthorizeParams(buildOptions(options)));\n }, [client, buildOptions]);\n\n const handleResponse = useCallback(async (response : AuthorizeResponse | (Error | OAuth2Error), params: {pkce?: PKCE, redirectUri?: string, source?: ResultSource}) => {\n if (response instanceof OAuth2Error) {\n setResult(response);\n } else if (response instanceof Error) {\n setResult(response);\n } else if (params.pkce && responseType === 'token') {\n let _redirectUri = params.redirectUri || defaultRedirectUri(props.redirectUri);\n if (!_redirectUri) throw new Error('redirectUri must be configured globally or per authentication component');\n\n await client.processResponse(response, {code_verifier: params.pkce.code_verifier, redirect_uri: _redirectUri}).then(response => {\n if (response?.code) setResult({code: response.code, state: response.state, source: params.source});\n else if (response?.id_token) {\n setResult({id_token: response.id_token, state: response.state, source: params.source});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n } else {\n if (response?.code) setResult({code: response.code, state: response.state, source: params.source});\n else if (response?.id_token) {\n setResult({id_token: response.id_token, state: response.state, source: params.source});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else if (response?.error) setResult(new OAuth2Error(response.error, response.error_description, response.state));\n else setResult(null);\n }\n\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }, [refreshPKCE, responseType, setResult, client, sessionStore, props.redirectUri]);\n\n const checkSession = useCallback(async () => {\n return client.checkSession({redirectUri: defaultRedirectUri(props.redirectUri)}).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) {\n setResult({id_token: response.id_token});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else setResult(null);\n });\n }, [sessionStore, client, props.redirectUri]);\n\n const logout = useCallback(async (params?: {redirectUri?: string, state?: string}) => {\n sessionStore?.removeItem(SESSION_KEY);\n await client.logout({\n redirectUri: params?.redirectUri ?? defaultRedirectUri(props.redirectUri),\n state: params?.state\n });\n }, [sessionStore, client, props.redirectUri]);\n\n const context = useMemo<CriiptoVerifyContextInterface>(() => {\n return {\n loginWithRedirect: async (params) => {\n const pkce = await refreshPKCE();\n await client.redirect.authorize(buildOptions({...params, pkce}));\n },\n loginWithPopup: async (params) => {\n return client.popup.authorize(buildOptions(params)).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n },\n checkSession,\n logout,\n fetchOpenIDConfiguration: () => client.fetchOpenIDConfiguration(),\n buildAuthorizeUrl,\n generatePKCE: async () => {\n if (responseType !== 'token' || completionStrategy !== 'client') return;\n return await generatePKCE();\n },\n buildOptions,\n handleResponse,\n responseType,\n completionStrategy,\n result,\n claims,\n domain: client.domain,\n redirectUri: defaultRedirectUri(props.redirectUri),\n action,\n message,\n pkce,\n store: pkceStore,\n isLoading,\n isInitializing,\n acrValues: configuration ? filterAcrValues(configuration.acr_values_supported) : undefined,\n client,\n uiLocales,\n loginHint\n }\n }, [\n client,\n props.redirectUri,\n responseType,\n completionStrategy,\n result,\n claims,\n action,\n message,\n pkce,\n props.state,\n props.prompt,\n isLoading,\n isInitializing,\n handleResponse,\n logout,\n configuration,\n uiLocales,\n checkSession,\n loginHint\n ]);\n\n useEffect(() => {\n setIsInitializing(false);\n if (!client.redirect.hasMatch()) {\n refreshPKCE(); // Fresh request, setup PKCE\n return;\n }\n\n let isSubscribed = true;\n setIsLoading(true);\n\n const params = parseAuthorizeResponseFromLocation(window.location);\n if (params.code && responseType === 'code') {\n setIsLoading(false);\n setResult({code: params.code, source: 'redirect', state: params.state});\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n return;\n }\n \n (async () => {\n await Promise.resolve(); // wait for the initial cleanup in Strict mode - avoids double mutation\n if (!isSubscribed) return;\n\n try {\n const response = await client.redirect.match();\n if (!isSubscribed) return;\n\n if (response?.code) {\n setResult({code: response.code, source: 'redirect', state: response.state});\n }\n else if (response?.id_token) {\n setResult({id_token: response.id_token, source: 'redirect', state: response.state});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n resetRedirectState(window);\n }\n else setResult(null);\n } catch (err: any) {\n if (!isSubscribed) return;\n if (err instanceof OAuth2Error) {\n setResult(err);\n } else if (err instanceof Error) {\n setResult(err);\n } else {\n setResult(new Error(err?.toString() ?? 'Unknown error ocurred'));\n }\n } finally {\n if (!isSubscribed) return;\n setIsLoading(false);\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [props.pkce, responseType]);\n\n /*\n * Fetch claims from session store if available\n */\n useEffect(() => {\n if (!sessionStore || claims) return;\n if (!claims) {\n // No result available, fetch from session store\n const token = sessionStore.getItem(SESSION_KEY);\n if (!token) return;\n\n setResult({id_token: token});\n return;\n }\n }, [sessionStore, claims]);\n \n /*\n * Unset result if claims are expired\n */\n useEffect(() => {\n if (!claims) return;\n if (!sessionStore) return;\n\n const interval = setInterval(() => {\n const now = Date.now();\n if (claims.exp < (now / 1000)) {\n setResult(null);\n sessionStore?.removeItem(SESSION_KEY);\n return;\n }\n }, 5000);\n\n return () => clearInterval(interval);\n }, [sessionStore, claims, result]);\n\n /**\n * Fresh page load SSO check\n */\n useEffect(() => {\n setIsInitializing(false);\n if (!sessionStore) return;\n if (client.redirect.hasMatch()) return; // Do not issue SSO check if we're just being redirected back to\n if (sessionStore.getItem(SESSION_KEY)) return;\n let isSubscribed = true;\n\n setIsLoading(true);\n checkSession().catch(err => {\n console.error(\"session silent check error\", err);\n }).finally(() => {\n if (isSubscribed) setIsLoading(false);\n });\n\n return () => {\n isSubscribed = false\n };\n }, [sessionStore, client]);\n\n return (\n <CriiptoVerifyContext.Provider value={context}>\n {props.children}\n </CriiptoVerifyContext.Provider>\n );\n}\n\nexport default CriiptoVerifyProvider\n\nexport function resetRedirectState(window: Window) {\n const url = new URL(window.location.href);\n url.searchParams.delete('code');\n url.searchParams.delete('state');\n\n window.history.replaceState(\n {},\n window.document.title,\n url.pathname + url.search\n );\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"ua-parser-js\");","import UAParser from 'ua-parser-js';\n\nfunction testUA(userAgent: string, pattern: RegExp) {\n return pattern.test(navigator.userAgent);\n};\nexport function isiOS(userAgent: string) {\n return testUA(userAgent, /iPad|iPhone|iPod/) && !(window as any).MSStream;\n};\n\nexport function isiOSSafari(userAgent: string) {\n return isiOS(userAgent) && !testUA(userAgent, / CriOS\\/[.0-9]*/);\n};\n\nexport function isAndroid(userAgent: string) {\n return testUA(userAgent, /Android/);\n};\n\nexport type MobileOS = 'ios' | 'android';\n\nexport function getMobileOS(userAgent: string) : MobileOS | null {\n if (isiOS(userAgent)) return 'ios';\n if (isAndroid(userAgent)) return 'android';\n\n return null;\n}\n\nexport function getUserAgent(userAgent?: string) {\n if (!userAgent) return null;\n return UAParser(userAgent);\n}","import React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../../context';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement\n links: Links\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Desktop: Polling scenario\n */\nexport default function SEBankIDSameDevicePoll(props: Props) {\n const {links, onError, onComplete, onInitiate} = props;\n const [initiated, setInitiated] = useState(false);\n const {domain} = useContext(CriiptoVerifyContext);\n\n useEffect(() => {\n if (!initiated) return;\n let isSubscribed = true;\n let timeout : string | undefined;\n const poll = async () => {\n if (!isSubscribed) return;\n const response = await fetch(links.pollUrl);\n\n if (response.status === 202) {\n setTimeout(poll, 1000);\n return;\n } else if (response.status >= 400) {\n if (!isSubscribed) return;\n const error = await response.text();\n onError(error);\n return;\n } else {\n if (!isSubscribed) return;\n const {targetUrl} = await response.json();\n await onComplete(targetUrl);\n return;\n }\n };\n\n setTimeout(poll, 1000);\n return () => {\n isSubscribed = false;\n if (timeout) clearTimeout(timeout);\n };\n }, [initiated]);\n\n const handleInitiate = () => {\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import React, { useState } from 'react';\nimport usePageVisibility from '../../hooks/usePageVisibility';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Android + iOS Chrome: Background/Foreground scenario\n */\nexport default function SEBankIDSameDeviceForeground(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog} = props;\n const [initiated, setInitiated] = useState(false);\n\n usePageVisibility(async () => {\n onLog('ForegroundStrategy', 'onForeground', initiated.toString());\n if (!initiated) return;\n \n onComplete(links.completeUrl);\n }, [links, initiated]);\n\n const handleInitiate = () => {\n onLog('ForegroundStrategy', 'handleInitiate');\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import React, { useRef, useState, useEffect } from 'react';\n\nexport default function usePageVisibility(onVisible? : () => void, deps : React.DependencyList = []) {\n const visibilityState = useRef(document.visibilityState);\n const [state, setState] = useState(visibilityState.current);\n\n useEffect(() => {\n document.addEventListener('visibilitychange', _handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', _handleVisibilityChange);\n };\n }, deps);\n\n const _handleVisibilityChange = () => {\n const nextState = document.visibilityState;\n if (\n visibilityState.current === 'hidden' &&\n nextState === 'visible'\n ) {\n if (onVisible) onVisible();\n }\n\n visibilityState.current = nextState;\n setState(visibilityState.current);\n };\n\n return state;\n}","import { PKCE } from \"@criipto/auth-js\"\nimport { createMemoryStorage } from \"../../memory-storage\"\nimport { trySessionStorage } from \"../../utils\"\n\nexport interface Links {\n cancelUrl: string\n completeUrl: string\n pollUrl: string\n launchLinks: {\n customFileHandlerUrl: string\n universalLink: string\n }\n};\n\nexport interface State {\n pkce: PKCE | undefined\n redirectUri: string\n links: Links\n}\n\nconst STATE_KEY = '@criipto/verify-react:sebankid:state';\n\nconst stateStore = (() => {\n const sessionStorage = trySessionStorage();\n if (sessionStorage === null) {\n console.warn('Creating memory store for PKCE values as no sessionStorage is available. Authentication may be broken.');\n return createMemoryStorage();\n }\n return sessionStorage;\n})();\n\nexport function hydrateState() : State | undefined {\n const rawState = stateStore.getItem(STATE_KEY);\n if (rawState) {\n return JSON.parse(rawState) as State;\n }\n\n return undefined;\n}\n\nexport const autoHydratedState = hydrateState();\n\nexport function clearState() {\n stateStore.removeItem(STATE_KEY);\n}\n\nexport function saveState(input: State) : void {\n stateStore.setItem(STATE_KEY, JSON.stringify(input));\n}","import { PKCE } from '@criipto/auth-js';\nimport React, { useEffect, useState } from 'react';\nimport {Links, saveState, hydrateState, clearState} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void,\n pkce: PKCE | undefined,\n redirectUri: string\n}\n\n/*\n * iOS Safari: Page reload on switch back scenario\n */\n\nexport default function SEBankIDSameDeviceReload(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog, pkce, redirectUri} = props;\n\n const handleInitiate = () => {\n onLog('ReloadStrategy', 'handleInitiate');\n\n saveState({\n links,\n redirectUri,\n pkce\n });\n\n onInitiate();\n };\n\n useEffect(() => {\n const hydratedState = hydrateState();\n if (!hydratedState) return;\n clearState();\n onComplete(hydratedState.links.completeUrl);\n }, []);\n \n return React.cloneElement(props.children, {\n ...props.children.props,\n onClick: handleInitiate\n });\n}","import { PKCE, AuthorizeResponse } from '@criipto/auth-js';\nimport React, {useCallback, useContext, useEffect, useMemo, useState} from 'react';\nimport CriiptoVerifyContext from '../context';\nimport { getUserAgent } from '../device';\n\nimport PollStrategy from './SEBankIDSameDeviceButton/Poll';\nimport ForegroundStrategy from './SEBankIDSameDeviceButton/Foreground';\nimport ReloadStrategy from './SEBankIDSameDeviceButton/Reload';\n\nimport {autoHydratedState, Links} from './SEBankIDSameDeviceButton/shared';\n\ninterface Props {\n className: string\n children: React.ReactNode\n logo: React.ReactNode\n fallback: JSX.Element\n redirectUri?: string\n userAgent?: string\n}\n\nfunction searchParamsToPOJO(input: URLSearchParams) {\n return Array.from(input.keys()).reduce((memo : {[key: string]: string}, key) => {\n memo[key] = input.get(key)!;\n return memo;\n }, {});\n}\n\ntype Resume = 'Foreground' | 'Reload' | 'Poll'\ntype LinkType = 'universal' | 'scheme';\nexport function determineStrategy(input: string | undefined, loginHint?: string) : {\n resume: Resume\n linkType: LinkType,\n redirect: boolean\n} {\n const userAgent = getUserAgent(input);\n const mobileOS = \n userAgent?.os.name === 'iOS' ? 'iOS' :\n userAgent?.os.name === 'Android' ? 'android' :\n userAgent?.browser.name === 'Samsung Internet' ? 'android' :\n null;\n const iOSSafari = mobileOS === 'iOS' && userAgent?.browser.name?.includes('Safari') ? true : false;\n const androidChrome = mobileOS === 'android' && userAgent?.browser.name === 'Chrome' ? true : false;\n const redirect = iOSSafari && !loginHint?.includes('appswitch:resumeUrl:disable');\n\n const resume : Resume =\n mobileOS ?\n (iOSSafari && redirect) ? 'Reload' : 'Foreground'\n : 'Poll';\n\n const linkType = \n (mobileOS === 'iOS' || androidChrome) ? 'universal' :\n 'scheme'\n\n return {resume, linkType, redirect};\n}\n\nexport class NotDoneError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotDoneError\";\n }\n}\n\nasync function fetchComplete(completeUrl: string) {\n const completeResponse = await fetch(completeUrl);\n if (completeResponse.status >= 400) {\n const errorMessage = await completeResponse.text();\n const notDone = errorMessage.includes(\"Native-app driven authentication is not done\");\n if (notDone) return new NotDoneError(errorMessage);\n return new Error(errorMessage);\n }\n \n const {location} : {location: string} = await completeResponse.json();\n return {location};\n}\nexport default function SEBankIDSameDeviceButton(props: Props) {\n const {loginHint} = useContext(CriiptoVerifyContext);\n const rawUserAgent = typeof navigator !== 'undefined' ? navigator.userAgent : props.userAgent;\n const strategy = useMemo(() => determineStrategy(\n rawUserAgent,\n loginHint\n ), [rawUserAgent, loginHint]);\n\n const [href, setHref] = useState<null | string>();\n const [links, setLinks] = useState<Links | null>(autoHydratedState?.links ?? null);\n const [pkce, setPKCE] = useState<PKCE | undefined>(autoHydratedState?.pkce ?? undefined);\n const [error, setError] = useState<string | null>(null);\n const [log, setLog] = useState<(string | string[])[]>([]);\n const [initiated, setInitiated] = useState(autoHydratedState ? true : false);\n const {buildAuthorizeUrl, completionStrategy, generatePKCE, handleResponse, redirectUri: defaultRedirectURi, domain} = useContext(CriiptoVerifyContext);\n const redirectUri = props.redirectUri || defaultRedirectURi;\n\n const reset = () => {\n setPKCE(undefined);\n setLinks(null);\n };\n\n const handleLog = (...statements: string[]) => {\n setLog(logs => logs.concat([statements]));\n }\n\n const handleComplete = useCallback(async (completeUrl: string) => {\n const required = {pkce};\n reset();\n\n const result = completeUrl.startsWith(`https://${domain}`) || completeUrl.startsWith(`http://${domain}`) ? await fetchComplete(completeUrl) : {\n location: completeUrl\n }\n if (result instanceof NotDoneError && strategy.resume === 'Reload') {\n await handleResponse({\n error: 'access_denied'\n }, {\n pkce: required.pkce,\n redirectUri,\n source: 'SEBankIDSameDeviceButton'\n });\n return;\n }\n if (result instanceof Error) {\n setError(result.message);\n return;\n }\n const {location} = result;\n if (completionStrategy === 'openidprovider') {\n window.location.href = location;\n return;\n }\n const url = new URL(location);\n const params = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n\n await handleResponse(params, {\n pkce: required.pkce,\n redirectUri,\n source: 'SEBankIDSameDeviceButton'\n });\n }, [completionStrategy, pkce, domain, strategy]);\n\n const refresh = useCallback(async () => {\n handleLog('SEBankID: Refresh authorize url');\n const pkce = await generatePKCE();\n\n buildAuthorizeUrl({\n acrValues: 'urn:grn:authn:se:bankid:same-device',\n loginHint: 'appswitch:browser',\n responseMode: 'json',\n pkce,\n redirectUri,\n prompt: 'login' // Triggering SSO at this point would be a mistake\n }).then(url => {\n return fetch(url).then(response => response.json() as Promise<Links>);\n })\n .then(links => {\n setPKCE(pkce || undefined);\n setLinks(links);\n\n const redirect = strategy.redirect ? window.location.href : 'null';\n const newUrl = new URL(strategy.linkType === 'universal' ? links.launchLinks.universalLink : links.launchLinks.customFileHandlerUrl);\n newUrl.searchParams.set('redirect', redirect);\n const newHref = newUrl.href;\n\n handleLog(window.location.href);\n handleLog(newHref);\n setHref(newHref);\n })\n .catch(err => {\n setInitiated(false);\n });\n }, [buildAuthorizeUrl, redirectUri, strategy]);\n\n // Generate URL on first button render\n useEffect(() => {\n if (initiated) return;\n refresh();\n }, [refresh, initiated]);\n\n // Continously fetch new autostart token if UI is open for a long time\n useEffect(() => {\n if (initiated) return;\n\n const interval = setInterval(() => {\n if (initiated) return;\n refresh();\n }, 25000);\n return () => clearInterval(interval);\n }, [refresh, initiated]);\n\n // Track when the button is clicked to stop refreshing URL\n const handleInitiate = () => {\n handleLog('Initiated');\n setInitiated(true);\n setError(null);\n }\n\n const handleError = async (error: string) => {\n setInitiated(false);\n setError(error);\n\n if (error === 'access_denied' || error === '\"access_denied\"') {\n await handleResponse({\n error: 'access_denied'\n }, {\n pkce,\n redirectUri,\n source: 'SEBankIDSameDeviceButton'\n });\n }\n }\n\n const element = href ? (\n <a className={`${props.className} ${initiated ? 'criipto-eid-btn--disabled' : ''}`} href={href} onClick={handleInitiate}>\n {initiated ? (\n <div className=\"criipto-eid-logo\">\n <div className=\"criipto-eid-loader\"></div>\n </div>\n ) : props.logo}\n {props.children}\n </a>\n ) : props.fallback;\n\n return (\n <React.Fragment>\n {links ? (\n <React.Fragment>\n {strategy.resume === \"Poll\" ? (\n <PollStrategy\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </PollStrategy>\n ) : strategy.resume === 'Foreground' ? (\n <ForegroundStrategy\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </ForegroundStrategy>\n ) : strategy.resume === 'Reload' ? (\n <ReloadStrategy\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n redirectUri={redirectUri!}\n pkce={pkce}\n >\n {element}\n </ReloadStrategy>\n ) : element}\n </React.Fragment>\n ) : element}\n {error && <p>{error}</p>}\n {/* {log && (\n <pre>\n {JSON.stringify(log, null, 2)}\n </pre>\n )} */}\n </React.Fragment>\n )\n}","import React from 'react';\nimport beeid from './logos/beeid@2x.png';\nimport digid from './logos/nldigid@2x.png';\nimport dkmitid from './logos/dkmitid@2x.png';\nimport dknemid from './logos/dknemid@2x.png';\nimport ftnmobile from './logos/ftnmobile@2x.png';\nimport itsme from './logos/itsme@2x.png';\nimport nobankid from './logos/nobankid@2x.png';\nimport novipps from './logos/novipps@2x.png';\nimport sebankid from './logos/sebankid@2x.png';\nimport sofort from './logos/sofort@2x.png';\n\nexport interface AuthMethodButtonLogoProps {\n acrValue: string\n /**\n * base64 image string, e.x. data:image/png;base64,\n * or a ReactElement\n */\n logo?: React.ReactElement | string\n}\nexport default function AuthMethodButtonLogo(props: AuthMethodButtonLogoProps) {\n const logo =\n typeof props.logo === \"string\" ? <img src={props.logo} alt=\"\" /> :\n props.logo ?? (acrValueToLogo(props.acrValue) ? <img src={acrValueToLogo(props.acrValue)} alt=\"\" /> : <span> </span>);\n\n if (logo) return <div className=\"criipto-eid-logo\">{logo}</div>\n return null;\n}\n\nfunction acrValueToLogo(value : string) {\n if (value.startsWith('urn:grn:authn:be:eid')) {\n return beeid;\n }\n if (value.startsWith('urn:grn:authn:nl:digid')) {\n return digid;\n }\n if (value.startsWith('urn:grn:authn:dk:mitid')) {\n return dkmitid;\n }\n if (value.startsWith('urn:grn:authn:dk:nemid')) {\n return dknemid;\n }\n if (value.startsWith('urn:grn:authn:fi:mobile')) {\n return ftnmobile;\n }\n if (value.startsWith('urn:grn:authn:itsme')) {\n return itsme;\n }\n if (value.startsWith('urn:grn:authn:se:bankid')) {\n return sebankid;\n }\n if (value.startsWith('urn:grn:authn:de:sofort')) {\n return sofort;\n }\n if (value.startsWith('urn:grn:authn:no:bankid')) {\n return nobankid;\n }\n if (value.startsWith('urn:grn:authn:no:vipps')) {\n return novipps;\n }\n}","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAAA8CAYAAADGxTD9AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUPSURBVHgB7Zztcds4EIZf3dz/Uwm8Cs6pIHQFl1QQuYI4FViuQE4FUiqIU4GZCuxUIHYQpQJk14AShiZAEaBECNhnBkNHJD4CLoDF7oKAIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAhCOswgHA2lVEmXC/PP+9lsViNCqJ1zupSUCkr8d03pidr7BCFPSChW6iU3iAgWXEobSt9VN4+U3sAT5ea7Kf+B0h2lazPgB3H2MzB3gOXWF5pB7jBOHe/p0vUid1TH247nF3RZd5eGt5TnHhNDbeSV4TP0rNvHktp8i4GwlGI4O0rcP5+ozgqp0zPCCwTCZTjq2FryPDryxCC8hbLPujYGrx4qnK3Sk4GVFGZg1yivaBRfIqz8R/zWY9vUVP6/HXlYsAsMbJPSy/XcUk+Fkehpn4vLIe3oeTdD2FC6jXUPEcQBo3gBTzhvT9m2GfjBkWftqM+W7wEjwYNE+TOoHWpctqpjRf0L6cObqfnQTKazfDddNn1x57h3Krw3ZcSFT1+OREHpoS3EOQgwd/gaw1nCb5mFWWZ5c1c3fubfLiNYBv+DP9yXBaajgBbiX4MoBwFmeNksD31YabXjHQJgS4PRj58T672R2FVDZ9CpZuA9BRorYy4CzKwPWf4CVYcX8Iyb5OZjWq73qsTfyIcCWjA/9Dy3ROAyaQZK52BpCrPruRbzrg2M58D4irD/XyzeuWuTzhs1nNJRVqmGsfUopwyor7fuA/orpM4prRBt2I49z0mF2LNWdlXCZ7N3VpgNZg0/+lavU8Lv8E3KAryz/F6gY+lR2tNUIA/YQrIbmOc2wuCei5QF+CPs+tqN0rEAzyitXy4tz26gTWDJYATxCocL8UfKs0R8vE5dhbhy3Fs1/rbpdjWmdzwcBRNQ9IrSJ8djNaUrejbWzdI8aSsEzzQ0u7Letuq4zZsZfjH/wK46PPvf1Wgu/Rftq6jsZiwFR4d1xV1UcA9G3/prurC7fAkdD8x1c398g44HrhA3RfJmNA6ppBf0P/QLasN6r21Dt6G8GxyZllltd8hzR2rDBmdILlYIm75nE94aiaoOqZGFI8OoASyQqwOzpBm6Z8FsYttOld0ZHCnaZeOJ61ElmpxEdZgS9fsMHPeHLQYZRvevKH1BnGf6nnJzZPSZjmokrjoofTyKvXi8YVyg35VdQq9cW8q7ViOcchmRH1kJsJlBXAKarOqg9DEiNhfewT+ibEHp0VhvYuA+O1eyOehZddxKVnUwsyYLb4lwWPhXKo4T1lWOsRBMW5Wokajq0BDeAuOynHgm5rOFdZYC3KFKpGx1WOJ4MR43E+rEHCqQVUD7HzRUiZRVhxKBJ0t68D2uFcr9/tsaOQW0dzG6ezaQH5bfL+DHKfRUdsmXJ3Q712iEdWY7AzMRHvexmfjmTROWsShcu5Zvc6/EaQg56TyUD813lrUAR4jL87WAtsWyd4HtuGybLRzPn3KDdUw1ZQ8P7qtZ67NcIsBxMabr9jVOx1x5fJhvADX0Jwk27RsiwBFh9MgK4+CrN8dU3/5DMK9scRm5b+JihDeWQXbbI8+GNkI+mNKGBZfNZHckuM5TIyLAkWEi5/jjf0v465a+ruIQCvhTQ6tPfOR/UCB9Cl+nLC23RrMwmPNzXULRGXJoor1sS+pT36zSKKfAnycl9jhPTJh8BU7Li77oWQl2Jk8NQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRDOn5/MSF1nx1OpJAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAA8CAYAAAApB1vDAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATiSURBVHgB7Z3vceM2EMVXmXyPU8ExFZxSQZgO3MExFcQdSKnglArkDu5SgZQKrKuAdAXnDl6AA5iT4YX4R6REge83s5ZISiA8fFouFiCwEEJaAODOvCy9vTeWebvzVlN5ezH2xdjB2H6xWLwIIZfGCtfYg7Gdsa84jydjG2OZEDI2Rmi5sU8DCDfGzlghhAyNF+8Ol6McQswLIbMHLt5dGXto+ZVKXKxr49zn4Jgt6524eHkp7aiM/W7i5koI6Yr3vk1hgz2+tV7TC75t2Xe+/I33uk2shJAuGNF8bBDVzth9F+E2nM8K+rHhnPdCSBPeQ+4axJvLSJiys4iYi+M6CiEaXsCHiHht2NA2Lh6iLlbMpSLgFVxKjkImr2kQ8A5XyuGa8y6P3q+O6kQhk9fA5X41NjIBAgHXfBZCLBGBWNYyASL1K8EePmKBS43dtIDBHr75gteNp1sV8NbvL4TMD+iprJ1MgI4CttjsCRt6c8Jc8GWTSK5Yt1ULAT8on1kLmQ/QOzQKuTJo2YiDSwlqXeKZkPSB6+INeZIrg45ZCOt5lc9PIiVIRgZ6LJzLFUHPNBreNkwZG6cOXEYi5KqNOZyRB4YeG1+se5xcAeh54aJjGbkXWW1P6BmL4syODOix8SQyLGQk8LZBV0pHMFBmAwP1xMGNSQ5hSJEi3muFbKUH0BtVJdp70NU53w/K0hqqhZD0iFzs3gPN+woZA4+FgB5S9PpxkokTEV3n2y5cOJGdKLNEPC22OvV59MySYIAwidwA5sJ+HuJC43vDLvPbrYTcQsD2eK9GGZS4WEh6KN6qr2ByRYDrFgJtc7xvnQql/ExIWuBtx0DfRl0eEWJMyB9bCvgcEWvxfi4kLZSLvJYeKILZHh3ThHxKwFlwrK+IM+U89z8IIR1ZLBZr8/LXiY9UcrnJUO4oYtKLE0Ku5MKz+VDEpDeKkCsZV8BaqrD6UUhqVOLmQat5JyNihQyX6fog43tgNd9NT5we4WTWP8vIeI/86wVCiEzZ90IRp8eXYPu9XIALzQS/VM57oIjT4xBs27RUKqO9wh/kt/+VIk6Pg7IvlzQIPTFFnChJitj3zIV3lH/tH4o4MXxsug92f5Dbp1D27e0fijhN/gm27xIYY/BbsH2osyEUcZo8KvtudikBuCc4smD33/UbLjyTKH6QTR7stp0R+xZfr2dqP25IVX3zwEpZLzY11uH7dkx0Fuz+hQvVJA70YYs394Qw9DHEfCxpLkCfxupmFnZBfEbPTMg8iHjjm5k9B/osRvTCcwP6EgeTDytMHf9U6l3SC88Qf0vWZpacbLYC+sQtlkLIPEF8uYPJCRnxOJhhxNyBPg3UpIR8QsAlwwjyDcRXEb26kBFfY/orBUz+B24qqDIi5E/XEgv0Rlwt4KUQcsyJW3Z92y7kQvi67Chg0hnvkZ8QZzemV/bnX504PwVM2oF4Y+9YzIP18MHFvRvosW/NAYyBSRfg0m9lg5jt8a0VNDr29nnhrhAPG47ZoEdvIkexEfGeby3tB8/bEWiVsWdxT1fXlol7+uIncaPW6u0mKmN/tB1hR0gUuJ6yNh5zKGxYwQVkyPDAhQCPGI8d3IpIXHODjAtcCqzAMN65hIt5cxkYxsSkFfj+dEYubv4Hu53J2ycu6vjYxs3P/nU/5lMY/wG766+yI/P2vAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAAA8CAYAAADGxTD9AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYgSURBVHgB7Z3/deI4EMeHe/f/poPTVbBcBeerYHMVhK1g2QogFRypAFLBkgrMVrCkArwVwFWg1aAREWMZDLIdEPN5T3EYy7Lz8mU8+t0DQTiCNkAzbCgVdHw1aYmp1+sVIAhNY7Tb192wMmlqUgaC0BQoKN09K5MGdZ7vNxCEw/She5RJ0zpC/h0E4TAhAWP8+gQ2fsXflUmZSQ/QLAqskD+a46OJkzcgCAiFBhOKO/HYr8iXs9c75r07UGZb/Ki6r3BjkGhDZIG8a19ENcrOdYcilhj4xtDW0w5q5kWx+IJ5gfcFn30Ewm1jhDkLeLdhIB8PCfIj5XbV5JaBcNsYEXwjMayrBIGiDohnVJE30/vhRpvkINw2RgT3JIbBgTyTCgENWL6B7p4M7y0x8O3imqQWB/J8hHp8ge65xx8i4NtlQEd1IE/o3JNpj50x23tU7rZtzj0QbgptWxYwjnWVtsKkf0KDaUzesfcRPfa8atANvdIzCIP3RG/eh/1WjVj+FAEnjC7Htygg9FxcRAXYUOK7bzNiXUA7z4RfIAXx/AtCmqCn1XGMoSVM2UrbTolYhhIDp0vsIJwltASFIeg9Y8c23ImA00VBHK0OnCERf4dIRMDpcrEe2GMOkYiA00XB+Ww6GroYe4+NCDhd/oDz6cL7IrECLkTA6RITQrxCNyiIQzxwiuiKweknUEA3KIhjKQJOEwVxdBVC/A3ngx0t4oET5eJbILAzA6q7nuuwDXNEwGkSI+CuWiDGEMe2CU4EnCYf4Hy68L5uTEYMC/whAk6TGA/8P7QIifcbxPHiRsWJgBNDlydinkprHtg8Gw58x+lACuKYuV9kYZP0uKgKHFXWMFwYQDNDKLH1YdcFLQJOj3dvAzainZjDJ7BvgqYXI3kEIV109UTMWkAD6PZmJ5diZ4mB06PuRMwQ0eGDtpW0pr0ugk17X7lRBJweUW3AEE8b4kUeQ/PxRMAJoeNbIJoYxBMbg4dA8U5CJ0TAaXEJg3gyaJZnI95x1UkRcFrEvr6baEKL6QXkoHgHhzKIgNPiEtqAmwohHo+JF5F24LR410E8DbVAFCZ9rrsmhXjgtIiZRlRAPLHixW0L/jplQRXxwGkR44F/Qjzn3h+7hjFkODmEEQEngo6fRtRE/JudkHcBdl2ISUzoIgJOhyZiz1g+HCgbRYpfEhTtoqmdOWVxv0RooBOjiUqc4jbZQlYQBEEQBEEQmkUqcQlwrALXRUWKPcPRCiGv8LlnDFUE/fNCgui3LbOqwBkSre5wqfe3mJ3WyO/P2liTLTvyd+T6yO71whVi/qlj9o/GTQynJq2YPYOWYIIcHsnLtz/IyV53v7ld+dKRkQa8F27bLavt63jl2XdhBon5Ht6mIOEr/8XfQktbr63o4wvleSDbrhdNl0OYgq7HfL7n/0lje/nzFnRUzD4Du04FPmPm2Uem7FlHKwgJbaP3N0xZe3b/lbwiQR3bUT7zrl+z6znjwH2QPqV1xf2HIY9qjnNejvcsM3ZugHYZjZYGvkdDj4ghxQTeVsDBqULbveD0/qJ62LW7YGVtl3zSZa+qoMwnOvIKJObNPfsC7CizoqIsNw5jbzQdG9wzD9xDuHZ0/R3iR5QfveWEBOrKmNXwqs5L+t7exa7+VH4+pX4WeOac5emT3ecHu4bHxwMQrh9dboFAMSlthb1i59B+R9c5Iecszz2d91/zflji558EbJxh4Jn3RE42/kXM2TU8hFBolxDi+uEVou1IL3r98j2MFSYUNthXPFaOsDJWeHk2Xl7HsuJ+7jo/hHiC/en5I+217epyaLIMlIG8etdgWOOvZrmQduFE0OWKT0b2rVA9+4rszjb1yvAZky3XZU97V3GvPZsuV9Jy7148NJmTnV+zomdYMTt6b+XKEw98/fAxuCNt40dMyrN/1db7ORu+sjH8+I9d7ypSIU/LvT021XHbhtZwWHi2rajpd+5pnQdWzI6fM2ZHz763Mbm0A18/KIjC+6zouKG0ADs9HY/o6XBxPFzmFIWH4n0Gu2DeFyrrmYTurkd8kRWufK8NeHd/r+XgM9hWECfYB20rdIo977Li7/BBe3D2xi8k2Tz+V4ymqQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from 'react';\n\ninterface ButtonProps {\n className?: string,\n children: React.ReactNode,\n onClick?: React.MouseEventHandler,\n}\nexport function AnchorButton(props: AnchorButtonProps) {\n return (\n <a className={`criipto-verify-button ${props.className}`} href={props.href} onClick={props.onClick}>{props.children}</a>\n );\n}\n\ninterface AnchorButtonProps extends ButtonProps {\n href: string\n}\nexport function Button(props: ButtonProps) {\n return (\n <button className={`criipto-verify-button ${props.className}`} type=\"button\" onClick={props.onClick}>{props.children}</button>\n );\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"qrcode\");","import { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { AuthorizeResponse, OAuth2Error, PKCE } from '@criipto/auth-js';\nimport QRCode from 'qrcode';\nimport { assertUnreachableLanguage, Language } from '../utils';\n\nimport CriiptoVerifyContext from \"../context\";\n\nimport logo from './SEBankIDQRCode/logo@2x.png';\nimport './SEBankIDQRCode/SEBankIDQRCode.css';\nimport AuthMethodButton from \"./AuthMethodButton\";\n\ninterface Props {\n redirectUri?: string,\n qrMargin?: number,\n /**\n * Impacts the help text\n */\n language?: Language,\n children?: (props: {\n qrElement: React.ReactElement\n /**\n * Can be rendered instead of `qrElement` if you only wish to render the qr code with no additional content.\n * Combine with `qrMargin`.\n */\n canvasElement: React.ReactElement,\n /**\n * Will be true once the user has completed login in the app and the rest of the login flow is being processed\n */\n isCompleting: boolean\n error: OAuth2Error | Error | null\n retry: () => void\n }) => React.ReactElement\n\n /** Render fallback element while loading */\n fallback?: React.ReactElement\n}\n\ninterface QrResponse {\n initialQrCode: string\n pollUrl: string\n}\ninterface PollResponse {\n qrCode?: string\n targetUrl?: string\n}\n\nfunction searchParamsToPOJO(input: URLSearchParams) {\n return Array.from(input.keys()).reduce((memo : {[key: string]: string}, key) => {\n memo[key] = input.get(key)!;\n return memo;\n }, {});\n}\n\nexport default function SEBankIDQrCode(props: Props) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const {buildAuthorizeUrl, completionStrategy, handleResponse, generatePKCE, redirectUri: defaultRedirectURi, uiLocales} = useContext(CriiptoVerifyContext);\n const language = (props.language ?? uiLocales ?? 'en') as Language;\n const redirectUri = props.redirectUri || defaultRedirectURi;\n const [qrCode, setQrCode] = useState<string | null>(null);\n const [pollUrl, setPollUrl] = useState<string | null>(null);\n const [error, setError] = useState<OAuth2Error | Error | null>(null);\n const [pkce, setPKCE] = useState<PKCE | undefined>(undefined);\n const [isCompleting, setCompleting] = useState(false);\n\n const refresh = useCallback(async () => {\n setError(null);\n setQrCode(null);\n setPollUrl(null);\n setPKCE(undefined);\n\n const pkce = await generatePKCE();\n\n buildAuthorizeUrl({\n acrValues: 'urn:grn:authn:se:bankid:another-device:qr',\n responseMode: 'json',\n pkce,\n redirectUri,\n prompt: 'login' // Triggering SSO at this point would be a mistake\n }).then(url => {\n return fetch(url).then(response => response.json() as Promise<QrResponse>);\n })\n .then(response => {\n setPKCE(pkce);\n setQrCode(response.initialQrCode);\n setPollUrl(response.pollUrl);\n })\n .catch(console.error);\n }, [buildAuthorizeUrl, redirectUri]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleRetry = () => {\n setCompleting(false);\n refresh();\n };\n\n const handleError = useCallback((error: string) => {\n /* Timeout error */\n if (error === 'Collect failed: startFailed' || error === '\"Collect failed: startFailed\"') {\n handleRetry();\n return;\n }\n setError(new Error(error));\n handleResponse(new Error(error), {\n pkce,\n redirectUri,\n source: 'SEBankIDQrCode'\n });\n }, [pkce, redirectUri]);\n\n const handleComplete = useCallback(async (completeUrl: string) => {\n setCompleting(true);\n const required = {pkce};\n const parsed = await parseCompleteUrl(completeUrl);\n\n if (parsed instanceof Error) {\n return handleError(parsed.message);\n }\n\n const {location, response} = parsed;\n\n if (completionStrategy === 'openidprovider') {\n window.location.href = location;\n return;\n }\n await handleResponse(response, {\n pkce: required.pkce,\n redirectUri,\n source: 'SEBankIDQrCode'\n });\n }, [completionStrategy, pkce]);\n\n /**\n * Render QR codes\n */\n useDraw(qrCode, {\n canvas: canvasRef.current,\n width: wrapperRef.current?.offsetWidth,\n qrMargin: props.qrMargin\n });\n\n /**\n * Poll for response\n */\n usePoll(pollUrl, {\n enabled: !isCompleting,\n onQrCode: setQrCode,\n onComplete: handleComplete,\n onError: handleError\n });\n\n const canvasElement = (\n <div ref={wrapperRef}>\n <canvas ref={canvasRef} />\n </div>\n );\n\n const completingHelpText = \n language === 'en' ? 'Completing your login.' : \n language == 'da' ? 'Fuldfører dit login.' :\n language == 'sv' ? 'Slutför din inloggning.' :\n language == 'nb' ? 'Fullfører påloggingen.' : assertUnreachableLanguage(language);\n const initialHelpText = \n language === 'en' ? 'Open the BankID app on your mobile device and scan the QR code.' : \n language == 'da' ? 'Åben BankID appen på din telefon og scan QR koden.' :\n language == 'sv' ? 'Öppna BankID-appen på din mobila enhet och skanna QR-koden.' :\n language == 'nb' ? 'Åpne BankID-appen på mobilenheten din og skann QR-koden.' : assertUnreachableLanguage(language);\n\n const qrElement = (\n <div className=\"criipto-se-bankid-qr\">\n <aside className=\"criipto-se-bankid-qr--help-text\">\n {isCompleting ? completingHelpText : initialHelpText}\n <img src={logo} />\n </aside>\n {canvasElement}\n </div>\n );\n\n if (!qrCode && props.fallback) {\n return props.fallback;\n }\n\n if (props.children) {\n return props.children({\n qrElement,\n canvasElement,\n error,\n isCompleting,\n retry: () => handleRetry(),\n });\n }\n\n return qrElement;\n}\n\nSEBankIDQrCode.acr_values = 'urn:grn:authn:se:bankid:another-device:qr';\n\ntype UseDrawOptions = {\n width?: number,\n canvas: HTMLCanvasElement | null,\n qrMargin?: number\n}\nexport function useDraw(qrCode: string | null, options: UseDrawOptions) {\n const {width, canvas, qrMargin} = options;\n\n useEffect(() => {\n if (!qrCode) return;\n if (!canvas) return;\n\n let isSubscribed = true;\n (async () => {\n canvas.width = width ?? 300;\n canvas.height = width ?? 300;\n\n const qrImage = await QRCode.toCanvas(qrCode, {\n errorCorrectionLevel: 'low',\n scale: 10,\n width,\n margin: qrMargin ?? 4\n });\n\n if (!isSubscribed) return;\n const context = canvas.getContext('2d')!;\n context.drawImage(qrImage, 0, 0);\n })();\n \n return () => {\n isSubscribed = false;\n }\n }, [qrCode, qrMargin, canvas, width]);\n}\n\ntype UsePollOptions = {\n enabled: boolean,\n onQrCode: (code: string) => void,\n onComplete: (url: string) => void,\n onError: (error: string) => void\n}\nexport function usePoll(pollUrl: string | null, options: UsePollOptions) {\n const {onQrCode, onComplete, onError, enabled} = options;\n useEffect(() => {\n if (!pollUrl) return;\n if (!enabled) return;\n\n const delay = 2500;\n let timeout : any;\n let isSubscribed = true;\n const poll = async () => {\n if (!isSubscribed) return;\n const response = await fetch(pollUrl);\n\n if (!isSubscribed) return;\n if (response.status < 400) {\n const payload = await response.json() as PollResponse;\n if (payload.qrCode) onQrCode(payload.qrCode);\n if (payload.targetUrl) {\n onComplete(payload.targetUrl)\n return;\n }\n }\n else {\n const text = await response.text();\n onError(text);\n }\n\n if (response.status === 202) {\n timeout = setTimeout(poll, delay);\n }\n };\n\n timeout = setTimeout(poll, delay);\n return () => {\n isSubscribed = false;\n clearTimeout(timeout);\n }\n }, [pollUrl, onQrCode, onComplete, onError, enabled]);\n}\n\nexport async function parseCompleteUrl(completeUrl: string) : Promise<{location: string, response: AuthorizeResponse} | Error> {\n /**\n * Handle verify response inconsistencies\n */\n if (completeUrl.includes('error=')) {\n const url = new URL(completeUrl);\n const completeParams = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n\n return {location: completeUrl, response: completeParams};\n }\n\n const completeResponse = await fetch(completeUrl);\n if (completeResponse.status >= 400) {\n return new Error(await completeResponse.text());\n }\n \n const {location} : {location: string} = await completeResponse.json();\n const url = new URL(location);\n const params = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n return {location: location, response: params};\n}","export default \"data:image/png;base64,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\"","import React, {createContext} from \"react\";\nimport AuthMethodButton, { AuthMethodButtonProps } from \"./AuthMethodButton\";\nimport SEBankIDQrCode from \"./SEBankIDQRCode\";\n\ninterface AuthButtonGroupContextInterface {\n multiple: boolean,\n acrValues: string[]\n}\nconst initialContext : AuthButtonGroupContextInterface = {\n multiple: false,\n acrValues: []\n};\nexport const AuthButtonGroupContext = createContext<AuthButtonGroupContextInterface>(initialContext);\n\nexport default function AuthButtonGroup(props: {\n children: React.ReactNode,\n}) {\n const acrValues = React.Children.toArray(props.children).flatMap(child => {\n if (!child || typeof child !== 'object') return [];\n if (\"type\" in child) {\n if (child.type === AuthMethodButton) {\n const props = child.props as AuthMethodButtonProps;\n return props.acrValue ? [props.acrValue] : [];\n }\n if (child.type === SEBankIDQrCode) {\n return ['urn:grn:authn:se:bankid:another-device:qr'];\n }\n }\n return [];\n });\n\n const context : AuthButtonGroupContextInterface = {\n multiple: acrValues.length > 1,\n acrValues\n };\n return (\n <AuthButtonGroupContext.Provider value={context}>\n {props.children}\n </AuthButtonGroupContext.Provider>\n )\n}","import React, {useContext, useEffect, useState} from 'react';\n\nimport './AuthMethodButton/AuthMethodButton.css';\nimport CriiptoVerifyContext, { Action } from '../context';\nimport SEBankIDSameDeviceButton from './SEBankIDSameDeviceButton';\nimport { savePKCEState } from '@criipto/auth-js';\nimport AuthMethodButtonLogo, {AuthMethodButtonLogoProps} from './AuthMethodButton/Logo';\nimport { AnchorButton, Button } from './Button';\nimport { acrValueToTitle, isSingle, Language, stringifyAction } from '../utils';\nimport { AuthButtonGroupContext } from './AuthButtonGroup';\n\nexport type PopupParams = {\n acrValue: string,\n onHide: () => void\n};\nexport type PopupOption = boolean | ((options: PopupParams) => boolean | React.ReactElement)\n\nexport interface AuthMethodButtonProps {\n acrValue: string,\n href?: string;\n onClick?: React.MouseEventHandler,\n children?: React.ReactNode,\n 'data-testid'?: string,\n className?: string,\n redirectUri?: string,\n popup?: PopupOption,\n /**\n * base64 image string, e.x. data:image/png;base64,\n * or a ReactElement\n */\n logo?: AuthMethodButtonLogoProps[\"logo\"],\n\n /**\n * Impacts the button text rendered if no text is provided via props.children\n */\n language?: Language,\n /**\n * Impacts the button text rendered if no text is provided via props.children\n */\n action?: Action\n /**\n * Will ammend the login_hint parameter with `message:{base64(message)}` which will set a login/aprove message where available (Danish MitID).\n */\n message?: string\n\n userAgent?: string\n}\n\nexport default function AuthMethodButton(props: AuthMethodButtonProps) {\n const {acrValue} = props;\n const group = useContext(AuthButtonGroupContext);\n const standalone = !group.multiple || isSingle(props.acrValue, group.acrValues);\n const context = useContext(CriiptoVerifyContext);\n const {buildAuthorizeUrl} = context;\n const language = (props.language ?? context.uiLocales ?? 'en') as Language;\n const action = (props.action ?? context.action ?? 'login') as Action;\n const message = props.message ?? context.message;\n const className = `criipto-eid-btn ${acrValueToClassName(acrValue)}${props.className ? ` ${props.className}` : ''}`;\n const [backdrop, setBackdrop] = useState<React.ReactElement | null>(null);\n\n const [href, setHref] = useState(props.href);\n const redirectUri = props.redirectUri || context.redirectUri;\n\n useEffect(() => {\n if (props.href) return;\n\n let isSubscribed = true;\n let loginHint : string | undefined = undefined;\n\n buildAuthorizeUrl({\n redirectUri,\n acrValues: acrValue,\n loginHint\n }).then(href => {\n if (isSubscribed) setHref(href);\n })\n .catch(console.error);\n\n return () => {\n isSubscribed = false;\n };\n }, [props.href, buildAuthorizeUrl, acrValue, context.pkce, redirectUri]);\n\n const handleClick : React.MouseEventHandler = (event) => {\n if (props.href) return;\n\n if (context.pkce && \"code_verifier\" in context.pkce) {\n // just-in-time saving of PKCE, in case of man-in-the-browser\n savePKCEState(context.store, {\n response_type: 'id_token',\n pkce_code_verifier: context.pkce.code_verifier,\n redirect_uri: redirectUri!\n });\n }\n\n if (props.popup) {\n let willPopup =\n typeof props.popup === \"function\" ?\n props.popup({\n acrValue,\n onHide: () => setBackdrop(null)\n }) :\n props.popup === true;\n\n if (willPopup !== false) {\n event.preventDefault();\n\n if (typeof willPopup === \"boolean\") {\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: true\n }); \n } else {\n setBackdrop(willPopup);\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: false\n }); \n }\n }\n }\n\n if (props.onClick) props.onClick(event);\n }\n\n const contents = props.children ?? (\n <React.Fragment>\n {stringifyAction(language, action) ? `${stringifyAction(language, action)} ` : ''}{acrValueToTitle(language, acrValue).title} \n {standalone ? null : lowercaseFirst(acrValueToTitle(language, acrValue).subtitle)}\n </React.Fragment>\n )\n\n const inner = (\n <React.Fragment>\n <AuthMethodButtonLogo acrValue={acrValue} logo={props.logo} />\n <span>{contents}</span>\n </React.Fragment>\n );\n\n const button = href ? (\n <React.Fragment>\n <AnchorButton {...props} href={href} className={className} onClick={handleClick}>\n {inner}\n </AnchorButton>\n {backdrop}\n </React.Fragment>\n ) : (\n <React.Fragment>\n <Button {...props} className={className} onClick={handleClick}>\n {inner}\n </Button>\n {backdrop}\n </React.Fragment>\n );\n \n if (!props.href && acrValue === 'urn:grn:authn:se:bankid:same-device') {\n return (\n <SEBankIDSameDeviceButton\n redirectUri={props.redirectUri}\n fallback={button}\n className={className}\n userAgent={props.userAgent}\n logo={<AuthMethodButtonLogo acrValue={acrValue} logo={props.logo} />}\n >\n <span>{contents}</span>\n </SEBankIDSameDeviceButton>\n );\n }\n\n return button;\n}\n\nfunction acrValueToClassName(value: string) {\n value = value.replace('urn:grn:authn:', '');\n const segments = value.split(':');\n const classNames = segments.reduce((memo: string[], segment: string) => {\n if (memo.length) {\n return memo.concat([`${memo[memo.length-1]}-${segment}`])\n } else {\n return memo.concat([segment]);\n }\n }, []);\n\n return classNames.map(className => `criipto-eid-btn--${className}`).join(' ');\n}\n\nfunction lowercaseFirst(input?: string) {\n if (!input) return input;\n return input.substring(0, 1).toLowerCase() + input.substr(1, input.length);\n}\n","import {OpenIDConfiguration} from '@criipto/auth-js';\nimport React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../context';\nimport { getUserAgent } from '../device';\nimport { filterAcrValues, Language, acrValueToProviderPrefix } from '../utils';\nimport AuthMethodButton, {AuthMethodButtonProps} from './AuthMethodButton';\n\nimport './AuthMethodSelector/AuthMethodSelector.css';\nimport SEBankIDQrCode from './SEBankIDQRCode';\nimport AuthButtonGroup from './AuthButtonGroup';\n\ninterface AuthMethodSelectorProps {\n acrValues?: string[],\n language?: Language,\n onSelect?: (acrValue: string) => void,\n redirectUri?: string,\n popup?: AuthMethodButtonProps[\"popup\"],\n userAgent?: string\n}\n\nexport default function AuthMethodSelector(props: AuthMethodSelectorProps) {\n const {action, uiLocales, acrValues: configurationAcrValues} = useContext(CriiptoVerifyContext);\n const language = props.language || uiLocales as Language || 'en';\n\n const acrValues = filterAcrValues(props.acrValues ?? configurationAcrValues ?? []);\n const onlySweden = !!acrValues.length && acrValues.every(s => s.startsWith('urn:grn:authn:se:bankid:'));\n \n if (onlySweden) {\n return <Sweden {...props} acrValues={acrValues} />\n }\n\n return (\n <div className=\"criipto-eid-selector\">\n <AuthButtonGroup>\n {acrValues.map(acrValue => (\n <AuthMethodButton\n acrValue={acrValue}\n key={acrValue}\n onClick={props.onSelect ? (() => props.onSelect!(acrValue)) : undefined}\n redirectUri={props.redirectUri}\n popup={props.popup}\n language={language}\n action={action}\n userAgent={props.userAgent}\n />\n ))}\n </AuthButtonGroup>\n </div>\n )\n}\n\ntype SwedenProps = Omit<AuthMethodSelectorProps, 'acrValues'> & {\n acrValues: string[]\n}\n\nexport function Sweden(props: SwedenProps) {\n const {acrValues} = props;\n const {action, uiLocales} = useContext(CriiptoVerifyContext);\n const language = props.language || uiLocales as Language || 'en';\n const hasQR = acrValues.includes(SEBankIDQrCode.acr_values);\n const filteredAcrValues = acrValues.filter(s => s !== SEBankIDQrCode.acr_values);\n\n const userAgent = getUserAgent(typeof navigator !== 'undefined' ? navigator.userAgent : props.userAgent);\n const mobileOS = userAgent?.os.name === 'iOS' ? 'iOS' : userAgent?.os.name === 'Android' ? 'android' : null;\n const showQR = hasQR && !mobileOS;\n\n return (\n <div className=\"criipto-eid-selector\">\n <AuthButtonGroup>\n {filteredAcrValues.map(acrValue => (\n <AuthMethodButton\n acrValue={acrValue}\n key={acrValue}\n onClick={props.onSelect ? (() => props.onSelect!(acrValue)) : undefined}\n redirectUri={props.redirectUri}\n popup={props.popup}\n language={language}\n action={action}\n userAgent={props.userAgent}\n />\n ))}\n {showQR ? (\n <SEBankIDQrCode\n language={language}\n redirectUri={props.redirectUri}\n fallback={(\n <AuthMethodButton \n acrValue={SEBankIDQrCode.acr_values} \n />\n )}\n />\n ) : (hasQR && mobileOS) ? (\n <AuthMethodButton \n acrValue={SEBankIDQrCode.acr_values}\n redirectUri={props.redirectUri}\n popup={props.popup}\n language={language}\n action={action}\n userAgent={props.userAgent}\n />\n ) : null}\n </AuthButtonGroup>\n </div>\n )\n}","import { OAuth2Error, QrNotEnabledError, savePKCEState, UserCancelledError } from '@criipto/auth-js';\nimport CriiptoConfiguration from '@criipto/auth-js/dist/CriiptoConfiguration';\nimport React, { useContext, useRef, useEffect, useLayoutEffect, useState, useCallback } from 'react';\nimport CriiptoVerifyContext from '../context';\n\n// Inlined types less readable (for library developers) but improves intellisense for consumers\nconst QRCode : React.FC<{\n margin?: number,\n className?: string,\n acrValues?: string[],\n children: (props: {\n qrElement: React.ReactElement\n /**\n * Will be true once the QR code has been scanned\n */\n isAcknowledged: boolean\n /**\n * Will be true if the user cancels the login on his mobile device\n */\n isCancelled: boolean\n /**\n * Whether or not QR codes are enabled for this Criipto Applicaiton\n */\n isEnabled: boolean | undefined\n error: OAuth2Error | Error | null\n retry: () => void,\n /**\n * A method for triggering a full screen redirect to authentication (useful if user is on mobile device already)\n */\n redirect: () => Promise<void>\n }) => React.ReactElement\n}> = (props) => {\n const {children, margin, className} = props;\n const elementRef = useRef<HTMLDivElement>(null);\n const {client, buildOptions, buildAuthorizeUrl, handleResponse, pkce, store, acrValues: configurationAcrValues} = useContext(CriiptoVerifyContext);\n const [requestId, setRequestId] = useState(() => Math.random().toString());\n const [isAcknowledged, setAcknowledged] = useState(false);\n const [isCancelled, setCancelled] = useState(false);\n const [error, setError] = useState<OAuth2Error | Error | null>(null);\n const [criiptoConfiguration, setCriiptoConfiguration] = useState<CriiptoConfiguration | null>(null);\n const isEnabled = criiptoConfiguration?.client.qr_enabled;\n\n const acrValues = props.acrValues ?? configurationAcrValues ?? [];\n\n useEffect(() => {\n let isSubsribed = true;\n \n client.fetchCriiptoConfiguration().then(c => {\n if (!isSubsribed) return;\n setCriiptoConfiguration(c);\n })\n\n return () => {\n isSubsribed = false;\n }\n }, [client]);\n\n const redirect = useCallback(async () => {\n if (!criiptoConfiguration) return;\n const intermediaryUrl = (criiptoConfiguration.client.qr_intermediary_url ?? criiptoConfiguration.qr_intermediary_url).replace('/{id}', '').replace('{id}', '');\n const authorizeUrl = new URL(await buildAuthorizeUrl({\n acrValues\n }));\n const authorizeParams = new URLSearchParams(authorizeUrl.search);\n authorizeParams.set('domain', authorizeUrl.host);\n authorizeUrl.host = new URL(intermediaryUrl).host;\n authorizeUrl.port = new URL(intermediaryUrl).port;\n authorizeUrl.pathname = new URL(intermediaryUrl).pathname + '/authorize';\n authorizeUrl.search = authorizeParams.toString();\n\n if (pkce && \"code_verifier\" in pkce) {\n // just-in-time saving of PKCE, in case of man-in-the-browser\n savePKCEState(store, {\n response_type: 'id_token',\n pkce_code_verifier: pkce.code_verifier,\n redirect_uri: authorizeParams.get('redirect_uri')!\n });\n }\n\n window.location.href = authorizeUrl.toString();\n }, [buildAuthorizeUrl, criiptoConfiguration, acrValues])\n\n const authorize = useCallback(() => {\n return client.qr.authorize(\n elementRef.current!,\n {\n ...buildOptions({acrValues}),\n margin\n });\n }, [client, buildOptions, margin, acrValues]);\n\n useLayoutEffect (() => {\n if (!elementRef.current) return;\n if (error) return;\n if (!isEnabled) return;\n\n const promise = authorize();\n\n promise.onAcknowledged = () => {\n setAcknowledged(true);\n };\n\n promise.then(response => {\n if (promise.cancelled) return;\n handleResponse(response, {\n pkce: pkce && \"code_verifier\" in pkce ? pkce : undefined,\n source: 'QRCode'\n });\n }).catch(err => {\n if (err instanceof UserCancelledError) {\n setCancelled(true);\n return;\n }\n\n if (promise.cancelled) return;\n\n setError(err);\n handleResponse(err, {source: 'QRCode'});\n });\n\n return () => {\n promise.cancel();\n };\n }, [authorize, pkce, handleResponse, requestId, error, isEnabled]);\n\n const handleRetry = () => {\n setAcknowledged(false);\n setCancelled(false);\n setError(null);\n setRequestId(Math.random().toString());\n };\n\n const qrElement = <div ref={elementRef} className={className} />;\n return children({\n qrElement,\n isAcknowledged,\n isCancelled,\n isEnabled: criiptoConfiguration?.client.qr_enabled,\n error,\n retry: handleRetry,\n redirect\n });\n}\nexport default QRCode;","import { useContext } from \"react\";\nimport CriiptoVerifyContext from \"./context\";\n\nexport default function useCriiptoVerify() {\n const {result, claims, loginWithRedirect, loginWithPopup, acrValues, isLoading, isInitializing, logout, checkSession} = useContext(CriiptoVerifyContext);\n\n return {\n result,\n /**\n * The claims of the decoded id_token (if available)\n */\n claims,\n error: result && \"error\" in result ? result : null,\n loginWithRedirect,\n loginWithPopup,\n acrValues,\n /**\n * Will be true when performing token exchange after redirect or during an initial SSO check\n */\n isLoading,\n /**\n * Will be true until the first set of useEffect hooks have been called\n */\n isInitializing,\n /**\n * Check if there is an existing SSO session.\n */\n checkSession,\n /**\n * Clear local session store and logout of any existing SSO session\n */\n logout\n };\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","require","actions","stub","Error","initialContext","loginWithRedirect","loginWithPopup","checkSession","logout","fetchOpenIDConfiguration","buildAuthorizeUrl","generatePKCE","buildOptions","handleResponse","responseType","completionStrategy","result","claims","domain","action","pkce","undefined","store","isLoading","isInitializing","client","loginHint","createContext","FTN_PREFIX","autoTitleCase","input","split","map","segment","replace","length","toUpperCase","substr","join","assertUnreachableLanguage","x","stringifyAction","language","assertUnreachable","acrValueToProviderPrefix","startsWith","slice","acrValueToTitle","provider","title","subtitle","suffix","endsWith","filterAcrValues","original","dkmitidMethod","forEach","s","newLevel","oldLevel","includes","lowestMitIDValue","reduced","filter","concat","sort","b","indexOf","push","trySessionStorage","sessionStorage","err","createMemoryStorage","getItem","setItem","toString","removeItem","clear","index","keys","SESSION_KEY","ACTION_SUPPORTING_ACR_VALUES","MESSAGE_SUPPORTING_ACR_VALUES","buildLoginHint","params","options","message","acrValues","Array","isArray","hints","hint","h","some","v","btoa","defaultRedirectUri","window","location","origin","pathname","pkceStore","console","warn","props","useMemo","clientID","redirectUri","protocol","configuration","setConfiguration","useState","useEffect","isSubscribed","setResult","id_token","setIsLoading","setIsInitializing","setPKCE","response","uiLocales","actionCandidate","find","parseAction","messageCandidate","atob","tryBase64Decode","parseMessage","sessionStore","refreshPKCE","clearPKCEState","useCallback","responseMode","state","nonce","prompt","scope","extraUrlParams","criiptoSdk","criipto_sdk","buildAuthorizeParams","OAuth2Error","_redirectUri","processResponse","code_verifier","redirect_uri","then","code","source","catch","error","error_description","context","redirect","authorize","popup","acr_values_supported","hasMatch","parseAuthorizeResponseFromLocation","Promise","resolve","match","url","URL","href","searchParams","delete","history","replaceState","document","search","resetRedirectState","token","interval","setInterval","now","Date","exp","clearInterval","finally","children","getUserAgent","userAgent","SEBankIDSameDevicePoll","links","onError","onComplete","onInitiate","initiated","setInitiated","useContext","poll","fetch","pollUrl","status","targetUrl","json","text","setTimeout","onClick","SEBankIDSameDeviceForeground","onLog","onVisible","deps","visibilityState","useRef","setState","current","addEventListener","_handleVisibilityChange","removeEventListener","nextState","usePageVisibility","completeUrl","STATE_KEY","stateStore","hydrateState","rawState","JSON","parse","autoHydratedState","SEBankIDSameDeviceReload","hydratedState","stringify","NotDoneError","constructor","super","this","name","SEBankIDSameDeviceButton","rawUserAgent","navigator","strategy","mobileOS","os","browser","iOSSafari","androidChrome","resume","linkType","determineStrategy","setHref","setLinks","setError","log","setLog","defaultRedirectURi","handleLog","statements","logs","handleComplete","required","completeResponse","errorMessage","fetchComplete","from","reduce","memo","refresh","newUrl","launchLinks","universalLink","customFileHandlerUrl","set","newHref","handleInitiate","handleError","element","className","logo","fallback","AuthMethodButtonLogo","src","alt","acrValueToLogo","acrValue","AnchorButton","Button","type","SEBankIDQrCode","canvasRef","wrapperRef","qrCode","setQrCode","setPollUrl","isCompleting","setCompleting","initialQrCode","handleRetry","parsed","completeParams","parseCompleteUrl","width","canvas","qrMargin","height","qrImage","errorCorrectionLevel","scale","margin","getContext","drawImage","useDraw","offsetWidth","onQrCode","enabled","timeout","payload","clearTimeout","usePoll","canvasElement","ref","completingHelpText","initialHelpText","qrElement","retry","acr_values","AuthButtonGroupContext","multiple","AuthButtonGroup","flatMap","child","AuthMethodButton","Provider","group","standalone","count","isSingle","backdrop","setBackdrop","handleClick","event","savePKCEState","response_type","pkce_code_verifier","willPopup","onHide","preventDefault","contents","substring","toLowerCase","inner","button","AuthMethodSelector","configurationAcrValues","every","Sweden","onSelect","hasQR","filteredAcrValues","showQR","elementRef","requestId","setRequestId","Math","random","isAcknowledged","setAcknowledged","isCancelled","setCancelled","criiptoConfiguration","setCriiptoConfiguration","isEnabled","qr_enabled","isSubsribed","fetchCriiptoConfiguration","c","intermediaryUrl","qr_intermediary_url","authorizeUrl","authorizeParams","URLSearchParams","host","port","qr","useLayoutEffect","promise","onAcknowledged","cancelled","UserCancelledError","cancel","useCriiptoVerify"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"criipto-verify-react.cjs.js","mappings":"AACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,GCLRF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3ER,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,M,wSCLvD,MAAM,EAA+BC,QAAQ,qBCAvC,EAA+BA,QAAQ,S,aCA7C,MAAM,EAA+BA,QAAQ,oB,aCMtC,MAAMC,EAAU,CAAC,UAAW,SAAU,UAAW,OAAQ,SA4C1DC,EAAO,KACX,MAAM,IAAIC,MAAM,kEAMZC,EAAiB,CACrBC,kBAAmBH,EACnBI,eAAgBJ,EAChBK,aAAcL,EACdM,OAAQN,EACRO,yBAA0BP,EAC1BQ,kBAAmBR,EACnBS,aAAcT,EACdU,aAAcV,EACdW,eAAgBX,EAChBY,aAAc,QACdC,mBAAoB,SACpBC,OAAQ,KACRC,OAAQ,KACRC,OAAQ,GACRC,OAAQ,QACRC,UAAMC,EACNC,MAAO,KACPC,WAAW,EACXC,gBAAgB,EAChBC,OAAQ,KACRC,eAAWL,GAKb,GAF6B,IAAAM,eAA6CvB,GC1E7DwB,EAAa,mBAyB1B,SAASC,EAAcC,GAMrB,OALeA,EAAMC,MAAM,OAAOC,KAAIC,GAEb,KADvBA,EAAUA,EAAQC,QAAQ,WAAY,OAC1BC,OAAqBF,EAAQG,cAClCH,EAAQI,OAAO,EAAG,GAAGD,cAAgBH,EAAQI,OAAO,KAE7CC,KAAK,KAOhB,SAASC,EAA0BC,GACxC,MAAM,IAAIrC,MAAM,wBAAwBqC,KAInC,SAASC,EAAgBC,EAAoBvB,GAClD,MAAe,UAAXA,EACe,OAAbuB,EAA0B,YACR,OAAbA,EAA0B,eACb,OAAbA,EAA0B,eAC5B,aAEM,YAAXvB,EACe,OAAbuB,EAA0B,cACR,OAAbA,EAA0B,cACb,OAAbA,EAA0B,gBAC5B,eAEM,SAAXvB,EACe,OAAbuB,EAA0B,iBACR,OAAbA,EAA0B,cACb,OAAbA,EAA0B,aAC5B,YAEM,YAAXvB,EACe,OAAbuB,EAA0B,cACR,OAAbA,EAA0B,eACb,OAAbA,EAA0B,cAC5B,eAEM,WAAXvB,EACe,OAAbuB,EAA0B,eACR,OAAbA,EAA0B,gBACb,OAAbA,EAA0B,iBAC5B,mBAtCX,SAA2BF,GACzB,MAAM,IAAIrC,MAAM,6BAwChBwC,GAGK,SAASC,EAAyB7C,GAGvC,OAFAA,EAAQA,EAAMmC,QAAQ,iBAAkB,KAE9BW,WAAW,MACZ,KAEA9C,EAAM8C,WAAW,SACjB,QAEA9C,EAAMgC,MAAM,KAAKe,MAAM,EAAG,GAAGR,KAAK,KAItC,SAASS,EAAgBL,EAAoB3C,GAElD,MAAMiD,EAAWJ,EADlB7C,EAAQA,EAAMmC,QAAQ,iBAAkB,KAGvC,GAAiB,WAAbc,EACF,MAAO,CAACC,MAAOpB,EAAc9B,GAAOmC,QAAQ,QAAS,gBAEvD,GAAiB,aAAbc,EACF,MAAO,CAACC,MAAOpB,EAAc9B,GAAOmC,QAAQ,MAAO,KAErD,GAAiB,aAAbc,EAEF,MAAe,aADFjD,EAAMmC,QAAQ,YAAa,IAErB,OAAbQ,EAA0B,CAACO,MAAO,kBACR,CAACA,MAAO,iBAMjC,CAACA,MAAO,SAEjB,GAAiB,aAAbD,EAAyB,CAC7B,IAAIE,EACAC,EAASpD,EAAMmC,QAAQ,YAAa,IAqBtC,MAnBa,UAAXiB,IACc,OAAbT,IAAmBQ,EAAW,YACjB,OAAbR,IAAmBQ,EAAW,aACjB,OAAbR,IAAmBQ,EAAW,aACjB,OAAbR,IAAmBQ,EAAW,cAEpB,UAAXC,IACc,OAAbT,IAAmBQ,EAAW,qBACjB,OAAbR,IAAmBQ,EAAW,yBACjB,OAAbR,IAAmBQ,EAAW,uBACjB,OAAbR,IAAmBQ,EAAW,sBAEpB,mBAAXC,IACc,OAAbT,IAAmBQ,EAAW,qBACjB,OAAbR,IAAmBQ,EAAW,wBACjB,OAAbR,IAAmBQ,EAAW,sBACjB,OAAbR,IAAmBQ,EAAW,qBAG1B,CACRD,MAAO,QACPC,YAGD,GAAc,iBAAVnD,EAA0B,CAC5B,GAAiB,OAAb2C,EAAmB,MAAO,CAACO,MAAO,qBACtC,GAAiB,OAAbP,EAAmB,MAAO,CAACO,MAAO,kBACtC,GAAiB,OAAbP,EAAmB,MAAO,CAACO,MAAO,mBACtC,GAAiB,OAAbP,EAAmB,MAAO,CAACO,MAAO,kBAExC,GAAc,eAAVlD,EAAwB,CAC1B,GAAiB,OAAb2C,EAAmB,MAAO,CAACO,MAAO,mBACtC,GAAiB,OAAbP,EAAmB,MAAO,CAACO,MAAO,iBACtC,GAAiB,OAAbP,EAAmB,MAAO,CAACO,MAAO,kBACtC,GAAiB,OAAbP,EAAmB,MAAO,CAACO,MAAO,iBAExC,GAAiB,OAAbD,EACF,MAAO,CAACC,MAAOpB,EAAc9B,GAAOmC,QAAQ,KAAM,QAEpD,GAAiB,UAAbc,EACF,MAAO,CAACC,MAAOpB,EAAc9B,GAAOmC,QAAQ,KAAM,OAEpD,GAAiB,cAAbc,EAA0B,CAC9B,IAAIE,EACAC,EAASpD,EAAMmC,QAAQ,aAAc,IAqBvC,MAnBa,gBAAXiB,IACc,OAAbT,IAAmBQ,EAAW,kBACjB,OAAbR,IAAmBQ,EAAW,kBACjB,OAAbR,IAAmBQ,EAAW,kBACjB,OAAbR,IAAmBQ,EAAW,mBAEpB,mBAAXC,IACc,OAAbT,IAAmBQ,EAAW,iBACjB,OAAbR,IAAmBQ,EAAW,wBACjB,OAAbR,IAAmBQ,EAAW,yBACjB,OAAbR,IAAmBQ,EAAW,4BAEpB,sBAAXC,IACc,OAAbT,IAAmBQ,EAAW,qBACjB,OAAbR,IAAmBQ,EAAW,kBACjB,OAAbR,IAAmBQ,EAAW,kBACjB,OAAbR,IAAmBQ,EAAW,mBAG1B,CAACD,MAAO,SAAUC,YAE3B,GAAiB,cAAbF,EACF,MAAO,CAACC,MAAOpB,EAAc9B,GAAOmC,QAAQ,MAAO,KAErD,GAAiB,cAAbc,EAA0B,CAC5B,IAAIE,EAOJ,OANInD,EAAMqD,SAAS,kBACA,OAAbV,IAAmBQ,EAAW,cACpB,OAAbR,IAAmBQ,EAAW,aACjB,OAAbR,IAAmBQ,EAAW,YACjB,OAAbR,IAAmBQ,EAAW,aAE1B,CAACD,MAAOC,EAAW,SAAWrB,EAAc9B,GAAOmC,QAAQ,MAAO,IAAKgB,YAEhF,MAAiB,aAAbF,EACK,CAACC,MAAOpB,EAAc9B,GAAOmC,QAAQ,MAAO,KAG9C,CAACe,MAAOpB,EAAc9B,IAGxB,SAASsD,EAAgBvB,GAC9B,IAAIwB,EAAWxB,EAAMgB,QACjBS,EA5MC,SAA0BzB,GAC/B,IAAIyB,EAAgC,KAmBpC,OAjBAzB,EAAM0B,SAAQC,IACZ,GAAIA,EAAEZ,WARoB,2BACE,oCAOQY,EAClC,GAAKF,EAEE,CACL,IAAIG,EAAWD,EAAEvB,QAZK,yBAYmB,IACrCyB,EAAWJ,EAAcrB,QAbP,yBAa+B,KACpC,SAAbwB,GAAuB,CAAC,eAAgB,SAASE,SAASD,IAGxC,iBAAbD,GAA4C,UAAbC,KAFtCJ,EAAgBE,QALlBF,EAAgBE,KAcfF,EAwL6BM,CAAiB/B,GACjDgC,EAAUhC,EAAMgB,QAcpB,OAZIS,IACFO,EACEhC,EAAMiC,QAAON,IAAMA,EAAEZ,WArNG,2BACE,oCAoNyBY,IAClDO,OAAO,CAACT,IACRU,MAAK,CAAClF,EAAGmF,IAAMZ,EAASa,QAAQpF,GAAKuE,EAASa,QAAQD,MAGvDpC,EAAM8B,SAAS,GAAGhC,WACfkC,EAAQF,SAAS,GAAGhC,cAAuBkC,EAAQM,KAAK,GAAGxC,aAC3DkC,EAAQF,SAAS,GAAGhC,gBAAyBkC,EAAQM,KAAK,GAAGxC,eAClEkC,EAAUA,EAAQC,QAAON,GAAKA,IAAM,GAAG7B,WAElCkC,EASF,SAASO,IACd,IACE,MAA8B,oBAAnBC,eACF,KAEFA,eACP,MAAOC,GAKP,OAAO,MCxPX,MAAM,EAA+BvE,QAAQ,c,aCCtC,SAASwE,IACd,IAAIlD,EAAkC,GAEtC,MAAO,CACLmD,QAAQvF,GACCoC,EAAMpC,IAAQ,KAEvBwF,QAAQxF,EAAaa,GACnBuB,EAAMpC,GAAOa,EAAM4E,YAErBC,WAAW1F,UACFoC,EAAMpC,IAEf2F,QACEvD,EAAQ,IAEVpC,IAAI4F,GACK1F,OAAO2F,KAAKzD,GAAOwD,GAExB3C,aACF,OAAO/C,OAAO2F,KAAKzD,GAAOa,S,0SCXhC,MAAM6C,EAAc,gCA+DPC,EAA+B,CAC1C,6BACA,qCACA,8BACA,sCACA,6CAGWC,EAAgC,CAC3C,6BACA,qCACA,8BACA,sCACA,6CAGK,SAASC,EAAezD,EAAsC0D,GACnE,MAAM,QAACC,EAAO,OAAElE,EAAM,QAAEmE,GAAWF,EAC7BG,GAAYF,aAAO,EAAPA,EAASE,WAAYC,MAAMC,QAAQJ,aAAO,EAAPA,EAASE,WAAaF,aAAO,EAAPA,EAASE,UAAY,CAACF,aAAO,EAAPA,EAASE,WAAa,GACvH,IAAIG,GAAShE,EAAYA,EAAUK,MAAM,KAAO,IAAIiC,QAAOqB,aAAO,EAAPA,EAAS3D,WAAY2D,aAAO,EAAPA,EAAS3D,UAAUK,MAAM,KAAO,IAAIgC,QAAO4B,IAASA,EAAK9C,WAAW,cAAgB8C,EAAK9C,WAAW,aA8BpL,OA7BI1B,IACFuE,EAAQA,EAAM3B,QAAO6B,IAAMA,EAAE/C,WAAW,aACf,IAArB0C,EAAUpD,OACR8C,EAA6BrB,SAAS2B,EAAU,KAClDG,EAAMtB,KAAK,UAAUjD,KAEdoE,EAAUpD,QAAU,EACzBoD,EAAUM,MAAKC,GAAKb,EAA6BrB,SAASkC,MAC5DJ,EAAMtB,KAAK,UAAUjD,KAGvBuE,EAAMtB,KAAK,UAAUjD,MAIrBmE,IACuB,IAArBC,EAAUpD,OACR+C,EAA8BtB,SAAS2B,EAAU,KACnDG,EAAMtB,KAAK,WAAW2B,KAAKT,MAEpBC,EAAUpD,QAAU,EACzBoD,EAAUM,MAAKC,GAAKZ,EAA8BtB,SAASkC,MAC7DJ,EAAMtB,KAAK,WAAW2B,KAAKT,MAG7BI,EAAMtB,KAAK,WAAW2B,KAAKT,OAIxBI,EAAMvD,OAASuD,EAAMpD,KAAK,UAAOjB,EAgC1C,SAAS2E,EAAmBlE,GAC1B,GAAIA,EAAO,OAAOA,EAClB,GAAsB,oBAAXmE,aAAqD,IAApBA,OAAOC,SACjD,OAAOD,OAAOC,SAASC,OAASF,OAAOC,SAASE,SAGlD,MAAM,IAAIjG,MAAM,0EAGlB,MAAMkG,EAAY,MAChB,MAAM/B,EAAiBD,IACvB,OAAuB,OAAnBC,GACFgC,QAAQC,KAAK,0GACN/B,KAEFF,GANS,GAkVlB,EAzU+BkC,I,UAC7B,MAAM/E,GAAS,IAAAgF,UAAQ,IACrB,IAAI,IAAJ,CAAgB,CACdvF,OAAQsF,EAAMtF,OACdwF,SAAUF,EAAME,SAChBpF,MAAO+E,EACPM,YAAaX,EAAmBQ,EAAMG,aACtCC,SAAUJ,EAAMI,YACd,CAACJ,EAAMtF,OAAQsF,EAAME,SAAUF,EAAMG,YAAaH,EAAMI,YAGvDC,EAAeC,IAAoB,IAAAC,UAAqC,OAC/E,IAAAC,YAAU,KACR,IAAIC,GAAe,EAMnB,OALa,OAAD,6BACV,MAAMJ,QAAsBpF,EAAOhB,2BAC/BwG,GAAcH,EAAiBD,MAG9B,KACLI,GAAe,KAEhB,CAACxF,IAEJ,MAAOT,EAAQkG,IAAa,IAAAH,UAAwB,MAC9C9F,GAAS,IAAAwF,UAAQ,IAChBzF,GACC,aAAcA,EACb,IAAkBA,EAAOmG,UAFZ,MAGnB,CAACnG,KACGO,EAAW6F,IAAgB,IAAAL,WAAS,IACpCvF,EAAgB6F,IAAqB,IAAAN,WAAS,IAC9C3F,EAAMkG,IAAW,IAAAP,UAA4CP,EAAMpF,MACpEN,EAAe0F,EAAMe,UAAY,QACjCxG,EAAqByF,EAAMzF,oBAAsB,SACjDyG,EAAYhB,EAAMgB,UAClB9F,EAAY8E,EAAM9E,UAClBP,EAA+C,QAAtC,EAAY,QAAZ,EAAAqF,EAAMrF,cAAM,QApF7B,SAAqBW,GACnB,IAAKA,EAAO,OAEZ,MACM2F,EADW3F,EAAMC,MAAM,KACI2F,MAAKjE,GAAKA,EAAEZ,WAAW,aACxD,IAAK4E,EAAiB,OACtB,MAAMtG,EAASsG,EAAgBvF,QAAQ,UAAU,IACjD,OAAIjC,EAAQ2D,SAASzC,GAAuBA,OAA5C,EA6E+BwG,CAAYjG,UAAU,QAAI,QACnD4D,EAAuB,QAAb,EAAAkB,EAAMlB,eAAO,QAlE/B,SAAsBxD,G,MACpB,IAAKA,EAAO,OACZ,MACM8F,EADW9F,EAAMC,MAAM,KACK2F,MAAKjE,GAAKA,EAAEZ,WAAW,cACzD,IAAK+E,EAAkB,OAEvB,MAAMtC,EAAUsC,EAAiB1F,QAAQ,WAAW,IACpD,OAA+B,QAAxB,EAfT,SAAyBJ,GACvB,IACE,OAAO+F,KAAK/F,GAEd,SACE,OAAO,MAUFgG,CAAgBxC,UAAQ,QAAIA,EA2DFyC,CAAarG,GACxCsG,EAAexB,EAAMwB,aAErBC,EAAc,IAAY,OAAD,6BAC7B,GAAIzB,EAAMpF,KAAM,OAAOoF,EAAMpF,KAC7B,GAAqB,UAAjBN,GAAmD,WAAvBC,EAG9B,OAFA,IAAAmH,gBAAe7B,QACfiB,OAAQjG,IAIV,IAAA6G,gBAAe7B,GAEf,MAAMjF,QAAa,IAAAT,gBAEnB,OADA2G,EAAQlG,GACDA,KAGHR,GAAe,IAAAuH,cAAa9C,I,gBAChC,OAAO,OAAP,sBACEsB,YAAaX,EAAmBQ,EAAMG,aACtC7F,aAAiC,QAAlB,EAAA0F,EAAM1F,oBAAY,QAAI,OACrCsH,aAAc5B,EAAM4B,cACjB/C,GAAW,IAAE,CAChBgD,MAAkB,QAAX,EAAA7B,EAAM6B,aAAK,QAAIhD,aAAO,EAAPA,EAASgD,MAC/BC,MAAkB,QAAX,EAAA9B,EAAM8B,aAAK,QAAIjD,aAAO,EAAPA,EAASiD,MAC/BC,OAAoB,QAAZ,EAAA/B,EAAM+B,cAAM,QAAIlD,aAAO,EAAPA,EAASkD,OACjCC,MAAkB,QAAX,EAAAhC,EAAMgC,aAAK,QAAInD,aAAO,EAAPA,EAASmD,MAC/BhB,UAAWA,QAAAA,EAAanC,aAAO,EAAPA,EAASmC,UACjCpG,KAAmB,QAAb,EAAAiE,aAAO,EAAPA,EAASjE,YAAI,QAAIA,EACvBM,UAAWyD,EAAeqB,EAAM9E,UAAW,CAAC2D,UAASlE,SAAQmE,YAC7DmD,oBAAqCpH,IAArBmF,EAAMkC,WAA2B,CAC/CC,YAAanC,EAAMkC,YACjB,CACFC,YAAa,mCAGhB,CACDvH,EACAoF,EAAM6B,MACN7B,EAAM8B,MACN9B,EAAM+B,OACN/B,EAAMgC,MACNhB,EACArG,EACAmE,EACAkB,EAAMG,YACNH,EAAMkC,WACNlC,EAAM9E,UACN8E,EAAM4B,aACN5B,EAAM1F,eAGFJ,GAAoB,IAAAyH,cAAmB9C,GAAyC,OAAD,6BACnF,aAAa5D,EAAOf,kBAAkBe,EAAOmH,qBAAqBhI,EAAayE,SAC9E,CAAC5D,EAAQb,IAENC,GAAiB,IAAAsH,cAAY,CAAOZ,EAAsDnC,IAAuE,OAAD,6BACpK,GAAImC,aAAoB,EAAAsB,YACtB3B,EAAUK,QACL,GAAIA,aAAoBpH,MAC7B+G,EAAUK,QACL,GAAInC,EAAOhE,MAAyB,UAAjBN,EAA0B,CAClD,IAAIgI,EAAe1D,EAAOuB,aAAeX,EAAmBQ,EAAMG,aAClE,IAAKmC,EAAc,MAAM,IAAI3I,MAAM,iFAE7BsB,EAAOsH,gBAAgBxB,EAAU,CAACyB,cAAe5D,EAAOhE,KAAK4H,cAAeC,aAAcH,IAAeI,MAAK3B,KAC9GA,aAAQ,EAARA,EAAU4B,MAAMjC,EAAU,CAACiC,KAAM5B,EAAS4B,KAAMd,MAAOd,EAASc,MAAOe,OAAQhE,EAAOgE,UACjF7B,aAAQ,EAARA,EAAUJ,WACjBD,EAAU,CAACC,SAAUI,EAASJ,SAAUkB,MAAOd,EAASc,MAAOe,OAAQhE,EAAOgE,SAC9EpB,SAAAA,EAActD,QAAQM,EAAauC,EAASJ,WAEzCD,EAAU,SACdmC,OAAO9E,IACR2C,EAAU3C,WAGRgD,aAAQ,EAARA,EAAU4B,MAAMjC,EAAU,CAACiC,KAAM5B,EAAS4B,KAAMd,MAAOd,EAASc,MAAOe,OAAQhE,EAAOgE,UACjF7B,aAAQ,EAARA,EAAUJ,WACjBD,EAAU,CAACC,SAAUI,EAASJ,SAAUkB,MAAOd,EAASc,MAAOe,OAAQhE,EAAOgE,SAC9EpB,SAAAA,EAActD,QAAQM,EAAauC,EAASJ,YAErCI,aAAQ,EAARA,EAAU+B,OAAOpC,EAAU,IAAI,EAAA2B,YAAYtB,EAAS+B,MAAO/B,EAASgC,kBAAmBhC,EAASc,QACpGnB,EAAU,MAGjBe,QACC,CAACA,EAAanH,EAAcoG,EAAWzF,EAAQuG,EAAcxB,EAAMG,cAEhEpG,GAAe,IAAA4H,cAAY,IAAY,OAAD,6BAC1C,OAAO1G,EAAOlB,aAAa,CAACoG,YAAaX,EAAmBQ,EAAMG,eAAeuC,MAAK3B,KAChFA,aAAQ,EAARA,EAAU4B,MAAMjC,EAAU,CAACiC,KAAM5B,EAAS4B,QACrC5B,aAAQ,EAARA,EAAUJ,WACjBD,EAAU,CAACC,SAAUI,EAASJ,WAC9Ba,SAAAA,EAActD,QAAQM,EAAauC,EAASJ,WAEzCD,EAAU,aAEhB,CAACc,EAAcvG,EAAQ+E,EAAMG,cAE1BnG,GAAS,IAAA2H,cAAmB/C,GAAoD,OAAD,6B,MACnF4C,SAAAA,EAAcpD,WAAWI,SACnBvD,EAAOjB,OAAO,CAClBmG,YAAgC,QAAnB,EAAAvB,aAAM,EAANA,EAAQuB,mBAAW,QAAIX,EAAmBQ,EAAMG,aAC7D0B,MAAOjD,aAAM,EAANA,EAAQiD,YAEhB,CAACL,EAAcvG,EAAQ+E,EAAMG,cAE1B6C,GAAU,IAAA/C,UAAuC,KAC9C,CACLpG,kBAA0B+E,GAAW,OAAD,6BAClC,MAAMhE,QAAa6G,UACbxG,EAAOgI,SAASC,UAAU9I,EAAa,OAAD,wBAAKwE,GAAM,CAAEhE,cAE3Dd,eAAuB8E,GAAW,OAAD,6BAC/B,OAAO3D,EAAOkI,MAAMD,UAAU9I,EAAawE,IAAS8D,MAAK3B,KACnDA,aAAQ,EAARA,EAAU4B,MAAMjC,EAAU,CAACiC,KAAM5B,EAAS4B,QACrC5B,aAAQ,EAARA,EAAUJ,UAAUD,EAAU,CAACC,SAAUI,EAASJ,WACtDD,EAAU,SACdmC,OAAO9E,IACR2C,EAAU3C,SAGdhE,eACAC,SACAC,yBAA0B,IAAMgB,EAAOhB,2BACvCC,oBACAC,aAAc,IAAY,OAAD,6BACvB,GAAqB,UAAjBG,GAAmD,WAAvBC,EAChC,aAAa,IAAAJ,mBAEfC,eACAC,iBACAC,eACAC,qBACAC,SACAC,SACAC,OAAQO,EAAOP,OACfyF,YAAaX,EAAmBQ,EAAMG,aACtCxF,SACAmE,UACAlE,OACAE,MAAO+E,EACP9E,YACAC,iBACA+D,UAAWsB,EAAgBxD,EAAgBwD,EAAc+C,2BAAwBvI,EACjFI,SACA+F,YACA9F,eAED,CACDD,EACA+E,EAAMG,YACN7F,EACAC,EACAC,EACAC,EACAE,EACAmE,EACAlE,EACAoF,EAAM6B,MACN7B,EAAM+B,OACNhH,EACAC,EACAX,EACAL,EACAqG,EACAW,EACAjH,EACAmB,IAmHF,OAhHA,IAAAsF,YAAU,KAER,GADAK,GAAkB,IACb5F,EAAOgI,SAASI,WAEnB,YADA5B,IAIF,IAAIhB,GAAe,EACnBG,GAAa,GAEb,MAAMhC,GAAS,IAAA0E,oCAAmC7D,OAAOC,UACzD,OAAId,EAAO+D,MAAyB,SAAjBrI,GACjBsG,GAAa,GACbF,EAAU,CAACiC,KAAM/D,EAAO+D,KAAMC,OAAQ,WAAYf,MAAOjD,EAAOiD,aAChEJ,MAIW,OAAD,6B,MAEV,SADM8B,QAAQC,UACT/C,EAEL,IACE,MAAMM,QAAiB9F,EAAOgI,SAASQ,QACvC,IAAKhD,EAAc,QAEfM,aAAQ,EAARA,EAAU4B,MACZjC,EAAU,CAACiC,KAAM5B,EAAS4B,KAAMC,OAAQ,WAAYf,MAAOd,EAASc,SAE7Dd,aAAQ,EAARA,EAAUJ,WACjBD,EAAU,CAACC,SAAUI,EAASJ,SAAUiC,OAAQ,WAAYf,MAAOd,EAASc,QAC5EL,SAAAA,EAActD,QAAQM,EAAauC,EAASJ,UA0F/C,SAA4BlB,GACjC,MAAMiE,EAAM,IAAIC,IAAIlE,EAAOC,SAASkE,MACpCF,EAAIG,aAAaC,OAAO,QACxBJ,EAAIG,aAAaC,OAAO,SAExBrE,EAAOsE,QAAQC,aACb,GACAvE,EAAOwE,SAASxH,MAChBiH,EAAI9D,SAAW8D,EAAIQ,QAjGbC,CAAmB1E,SAEhBiB,EAAU,MACf,MAAO3C,GACP,IAAK0C,EAAc,OACf1C,aAAe,EAAAsE,aAERtE,aAAepE,MADxB+G,EAAU3C,GAIV2C,EAAU,IAAI/G,MAAqB,QAAf,EAAAoE,aAAG,EAAHA,EAAKI,kBAAU,QAAI,0B,QAGzC,IAAKsC,EAAc,OACnBG,GAAa,GACba,QAIG,KACLhB,GAAe,MAEhB,CAACT,EAAMpF,KAAMN,KAKhB,IAAAkG,YAAU,KACR,GAAKgB,IAAgB/G,EACrB,GAAKA,OAAL,CAEE,MAAM2J,EAAQ5C,EAAavD,QAAQO,GACnC,IAAK4F,EAAO,OAEZ1D,EAAU,CAACC,SAAUyD,OAGtB,CAAC5C,EAAc/G,KAKlB,IAAA+F,YAAU,KACR,IAAK/F,EAAQ,OACb,IAAK+G,EAAc,OAEnB,MAAM6C,EAAWC,aAAY,KAC3B,MAAMC,EAAMC,KAAKD,MACjB,GAAI9J,EAAOgK,IAAOF,EAAM,IAGtB,OAFA7D,EAAU,WACVc,SAAAA,EAAcpD,WAAWI,MAG1B,KAEH,MAAO,IAAMkG,cAAcL,KAC1B,CAAC7C,EAAc/G,EAAQD,KAK1B,IAAAgG,YAAU,KAER,GADAK,GAAkB,IACbW,EAAc,OACnB,GAAIvG,EAAOgI,SAASI,WAAY,OAChC,GAAI7B,EAAavD,QAAQO,GAAc,OACvC,IAAIiC,GAAe,EASnB,OAPAG,GAAa,GACb7G,IAAe8I,OAAM9E,IACnB+B,QAAQgD,MAAM,6BAA8B/E,MAC3C4G,SAAQ,KACLlE,GAAcG,GAAa,MAG1B,KACLH,GAAe,KAEhB,CAACe,EAAcvG,KAGhB,SAAC,WAA6B,eAAC1B,MAAOyJ,GAAO,UAC1ChD,EAAM4E,aChfP,EAA+BpL,QAAQ,gB,aC0BtC,SAASqL,EAAaC,GAC3B,OAAKA,EACE,IAASA,GADO,KCXV,SAASC,EAAuB/E,GAC7C,MAAM,MAACgF,EAAK,QAAEC,EAAO,WAAEC,EAAU,WAAEC,GAAcnF,GAC1CoF,EAAWC,IAAgB,IAAA9E,WAAS,IACrC,OAAC7F,IAAU,IAAA4K,YAAW,GAsC5B,OApCA,IAAA9E,YAAU,KACR,IAAK4E,EAAW,OAChB,IAAI3E,GAAe,EAEnB,MAAM8E,EAAO,KAAY,O,EAAA,K,OAAA,E,EAAA,YACvB,IAAK9E,EAAc,OACnB,MAAMM,QAAiByE,MAAMR,EAAMS,SAEnC,GAAwB,MAApB1E,EAAS2E,OAAb,CAGO,KAAI3E,EAAS2E,QAAU,KAKvB,CACL,IAAKjF,EAAc,OACnB,MAAM,UAACkF,SAAmB5E,EAAS6E,OAEnC,kBADMV,EAAWS,IARZ,CACL,IAAKlF,EAAc,OACnB,MAAMqC,QAAc/B,EAAS8E,OAC7BZ,EAAQnC,SALRgD,WAAWP,EAAM,M,YALI,K,+QAqBzB,OADAO,WAAWP,EAAM,KACV,KACL9E,GAAe,KAGhB,CAAC2E,IAOG,iBAAmBpF,EAAM4E,SAAU,OAAF,wBACnC5E,EAAM4E,SAAS5E,OAAa,CAC/B+F,QAPqB,KACrBZ,IACAE,GAAa,OCtCF,SAASW,EAA6BhG,GACnD,MAAM,MAACgF,EAAK,QAAEC,EAAO,WAAEC,EAAU,WAAEC,EAAU,MAAEc,GAASjG,GACjDoF,EAAWC,IAAgB,IAAA9E,WAAS,GAe3C,OC/Ba,SAA2B2F,EAAyBC,EAA8B,IAC/F,MAAMC,GAAkB,IAAAC,QAAOpC,SAASmC,kBACjCvE,EAAOyE,IAAY,IAAA/F,UAAS6F,EAAgBG,UAEnD,IAAA/F,YAAU,KACRyD,SAASuC,iBAAiB,mBAAoBC,GAEvC,KACLxC,SAASyC,oBAAoB,mBAAoBD,MAElDN,GAEH,MAAMM,EAA0B,KAC9B,MAAME,EAAY1C,SAASmC,gBAEG,WAA5BA,EAAgBG,SACF,YAAdI,GAEIT,GAAWA,IAGjBE,EAAgBG,QAAUI,EAC1BL,EAASF,EAAgBG,UDJ3BK,EAAkB,KAAY,O,EAAA,K,OAAA,E,EAAA,YAC5BX,EAAM,qBAAsB,eAAgBb,EAAUjH,YACjDiH,GAELF,EAAWF,EAAM6B,c,YAJW,K,gRAK3B,CAAC7B,EAAOI,IAQJ,iBAAmBpF,EAAM4E,SAAU,OAAF,wBACnC5E,EAAM4E,SAAS5E,OAAY,CAC9B+F,QARqB,KACrBE,EAAM,qBAAsB,kBAC5Bd,IACAE,GAAa,OEVjB,MAAMyB,EAAY,uCAEZC,EAAa,MACjB,MAAMjJ,EAAiBD,IACvB,OAAuB,OAAnBC,GACFgC,QAAQC,KAAK,0GACN/B,KAEFF,GANU,GASZ,SAASkJ,IACd,MAAMC,EAAWF,EAAW9I,QAAQ6I,GACpC,GAAIG,EACF,OAAOC,KAAKC,MAAMF,GAMf,MAAMG,EAAoBJ,ICrBlB,SAASK,EAAyBrH,GAC/C,MAAM,MAACgF,EAAK,QAAEC,EAAO,WAAEC,EAAU,WAAEC,EAAU,MAAEc,EAAK,KAAErL,EAAI,YAAEuF,GAAeH,EAqB3E,OAPA,IAAAQ,YAAU,KACR,MAAM8G,EAAgBN,IACjBM,IDOPP,EAAW3I,WAAW0I,GCLpB5B,EAAWoC,EAActC,MAAM6B,gBAC9B,IAEI,iBAAmB7G,EAAM4E,SAAU,OAAF,wBACnC5E,EAAM4E,SAAS5E,OAAa,CAC/B+F,QArBqB,KDwBlB,IAAmBzK,ECvBtB2K,EAAM,iBAAkB,kBDuBF3K,ECrBZ,CACR0J,QACA7E,cACAvF,QDmBJmM,EAAW7I,QAAQ4I,EAAWI,KAAKK,UAAUjM,IChB3C6J,Q,0SCyBG,MAAMqC,UAAqB7N,MAChC8N,YAAY3I,GACV4I,MAAM5I,GACN6I,KAAKC,KAAO,gBAgBD,SAASC,EAAyB7H,G,QAC/C,MAAM,UAAC9E,IAAa,IAAAoK,YAAW,GACzBwC,EAAoC,oBAAdC,UAA4BA,UAAUjD,UAAY9E,EAAM8E,UAC9EkD,GAAW,IAAA/H,UAAQ,IAjDpB,SAA2B3E,EAA2BJ,G,MAK3D,MAAM4J,EAAYD,EAAavJ,GACzB2M,EACmB,SAAvBnD,aAAS,EAATA,EAAWoD,GAAGN,MAAiB,MACR,aAAvB9C,aAAS,EAATA,EAAWoD,GAAGN,OACc,sBAA5B9C,aAAS,EAATA,EAAWqD,QAAQP,MADgB,UAEnC,KACIQ,IAAyB,QAAbH,KAA6C,QAAvB,EAAAnD,aAAS,EAATA,EAAWqD,QAAQP,YAAI,eAAExK,SAAS,YACpEiL,EAA6B,YAAbJ,GAAsD,YAA5BnD,aAAS,EAATA,EAAWqD,QAAQP,MAC7D3E,EAAWmF,KAAclN,aAAS,EAATA,EAAWkC,SAAS,gCAWnD,MAAO,CAACkL,OARNL,EACGG,GAAanF,EAAY,SAAW,aACnC,OAMUsF,SAHA,QAAbN,GAAsBI,EAAiB,YACxC,SAEwBpF,YAyBKuF,CAC7BV,EACA5M,IACC,CAAC4M,EAAc5M,KAEX0I,EAAM6E,IAAW,IAAAlI,aACjByE,EAAO0D,IAAY,IAAAnI,UAA+C,QAAxB,EAAA6G,aAAiB,EAAjBA,EAAA,aAAwB,QAAI,OACtExM,EAAMkG,IAAW,IAAAP,UAAkD,QAAvB,EAAA6G,aAAiB,EAAjBA,EAAA,YAAuB,aAAIvM,IACvEiI,EAAO6F,IAAY,IAAApI,UAAwB,OAC3CqI,EAAKC,IAAU,IAAAtI,UAAgC,KAC/C6E,EAAWC,IAAgB,IAAA9E,YAAS6G,IACrC,kBAAClN,EAAiB,mBAAEK,EAAkB,aAAEJ,EAAY,eAAEE,EAAgB8F,YAAa2I,EAAkB,OAAEpO,IAAU,IAAA4K,YAAW,GAC5HnF,EAAcH,EAAMG,aAAe2I,EAOnCC,EAAY,IAAIC,KACpBH,GAAOI,GAAQA,EAAKzL,OAAO,CAACwL,OAGxBE,GAAiB,IAAAvH,cAAmBkF,GAAwB,kCAChE,MAAMsC,EAAW,CAACvO,QATlBkG,OAAQjG,GACR6N,EAAS,MAWT,MAAMlO,EAASqM,EAAYxK,WAAW,WAAW3B,MAAamM,EAAYxK,WAAW,UAAU3B,WA1CnG,SAA6BmM,G,yCAC3B,MAAMuC,QAAyB5D,MAAMqB,GACrC,GAAIuC,EAAiB1D,QAAU,IAAK,CAClC,MAAM2D,QAAqBD,EAAiBvD,OAE5C,OADgBwD,EAAajM,SAAS,gDAClB,IAAIoK,EAAa6B,GAC9B,IAAI1P,MAAM0P,GAGnB,MAAM,SAAC3J,SAAwC0J,EAAiBxD,OAChE,MAAO,CAAClG,eAgC2G4J,CAAczC,GAAe,CAC5InH,SAAUmH,GAEZ,GAAIrM,aAAkBgN,GAAoC,WAApBQ,EAASM,OAQ7C,kBAPMjO,EAAe,CACnByI,MAAO,iBACN,CACDlI,KAAMuO,EAASvO,KACfuF,cACAyC,OAAQ,8BAIZ,GAAIpI,aAAkBb,MAEpB,YADAgP,EAASnO,EAAOsE,SAGlB,MAAM,SAACY,GAAYlF,EACnB,GAA2B,mBAAvBD,EAEF,YADAkF,OAAOC,SAASkE,KAAOlE,GAGzB,MAAMgE,EAAM,IAAIC,IAAIjE,GACdd,GA5GkBtD,EA4GUoI,EAAIG,aA3GjC7E,MAAMuK,KAAKjO,EAAMiD,QAAQiL,QAAO,CAACC,EAAgC/Q,KACtE+Q,EAAK/Q,GAAO4C,EAAMvC,IAAIL,GACf+Q,IACN,KAJL,IAA4BnO,QA8GlBjB,EAAeuE,EAAQ,CAC3BhE,KAAMuO,EAASvO,KACfuF,cACAyC,OAAQ,iCAET,CAACrI,EAAoBK,EAAMF,EAAQsN,IAEhC0B,GAAU,IAAA/H,cAAY,IAAY,kCACtCoH,EAAU,mCACV,MAAMnO,QAAaT,IAEnBD,EAAkB,CAChB6E,UAAW,sCACX7D,UAAW,oBACX0G,aAAc,OACdhH,OACAuF,cACA4B,OAAQ,UACPW,MAAKgB,GACC8B,MAAM9B,GAAKhB,MAAK3B,GAAYA,EAAS6E,WAE7ClD,MAAKsC,IACJlE,EAAQlG,QAAQC,GAChB6N,EAAS1D,GAET,MAAM/B,EAAW+E,EAAS/E,SAAWxD,OAAOC,SAASkE,KAAO,OACtD+F,EAAS,IAAIhG,IAA0B,cAAtBqE,EAASO,SAA2BvD,EAAM4E,YAAYC,cAAgB7E,EAAM4E,YAAYE,sBAC/GH,EAAO9F,aAAakG,IAAI,WAAY9G,GACpC,MAAM+G,EAAUL,EAAO/F,KAEvBmF,EAAUtJ,OAAOC,SAASkE,MAC1BmF,EAAUiB,GACVvB,EAAQuB,MAETnH,OAAM9E,IACLsH,GAAa,UAEd,CAACnL,EAAmBiG,EAAa6H,KAGpC,IAAAxH,YAAU,KACJ4E,GACJsE,MACC,CAACA,EAAStE,KAGb,IAAA5E,YAAU,KACR,GAAI4E,EAAW,OAEf,MAAMf,EAAWC,aAAY,KACvBc,GACJsE,MACC,MACH,MAAO,IAAMhF,cAAcL,KAC1B,CAACqF,EAAStE,IAGb,MAAM6E,EAAiB,KACrBlB,EAAU,aACV1D,GAAa,GACbsD,EAAS,OAGLuB,EAAqBpH,GAAkB,kCAC3CuC,GAAa,GACbsD,EAAS7F,GAEK,kBAAVA,GAAuC,oBAAVA,UACzBzI,EAAe,CACnByI,MAAO,iBACN,CACDlI,OACAuF,cACAyC,OAAQ,iCAKRuH,EAAUvG,GACd,6BAAGwG,UAAW,GAAGpK,EAAMoK,aAAahF,EAAY,4BAA8B,KAAMxB,KAAMA,EAAMmC,QAASkE,GAAc,WACpH7E,GACC,8BAAKgF,UAAU,oBAAkB,WAC/B,gBAAKA,UAAU,0BAEfpK,EAAMqK,KACTrK,EAAM4E,aAEP5E,EAAMsK,SAEV,OACE,UAAC,aAAc,WACZtF,GACC,SAAC,aAAc,UACQ,SAApBgD,EAASM,QACR,SAAC,EAAY,eACXtD,MAAOA,EACPC,QAASiF,EACThF,WAAYgE,EACZ/D,WAAY8E,EACZhE,MAAO8C,GAAS,UAEfoB,KAEmB,eAApBnC,EAASM,QACX,SAAC,EAAkB,eACjBtD,MAAOA,EACPC,QAASiF,EACThF,WAAYgE,EACZ/D,WAAY8E,EACZhE,MAAO8C,GAAS,UAEfoB,KAEmB,WAApBnC,EAASM,QACX,SAAC,EAAc,eACbtD,MAAOA,EACPC,QAASiF,EACThF,WAAYgE,EACZ/D,WAAY8E,EACZhE,MAAO8C,EACP5I,YAAaA,EACbvF,KAAMA,GAAI,UAETuP,KAEDA,IAEJA,EACHrH,IAAS,uBAAIA,OC9OL,SAASyH,EAAqBvK,G,MAC3C,MAAMqK,EACkB,iBAAfrK,EAAMqK,MAAoB,gBAAKG,IAAKxK,EAAMqK,KAAMI,IAAI,KACjD,QAAV,EAAAzK,EAAMqK,YAAI,QAAKK,EAAe1K,EAAM2K,WAAY,gBAAKH,IAAKE,EAAe1K,EAAM2K,UAAWF,IAAI,MAAQ,gCAExG,OAAIJ,GAAa,8BAAKD,UAAU,oBAAkB,UAAEC,KAC7C,KAGT,SAASK,EAAenR,GACtB,OAAIA,EAAM8C,WAAW,wBC9BvB,igEDiCM9C,EAAM8C,WAAW,0BEjCvB,igEFoCM9C,EAAM8C,WAAW,0BGpCvB,y2DHuCM9C,EAAM8C,WAAW,0BIvCvB,qiEJ0CM9C,EAAM8C,WAAW,2BK1CvB,6yDL6CM9C,EAAM8C,WAAW,uBM7CvB,6qENgDM9C,EAAM8C,WAAW,2BOhDvB,qtEPmDM9C,EAAM8C,WAAW,2BQnDvB,yrGRsDM9C,EAAM8C,WAAW,2BStDvB,6oETyDM9C,EAAM8C,WAAW,0BUzDvB,8pEVyDE,EWlDK,SAASuO,EAAa5K,GAC3B,OACE,4BAAGoK,UAAW,yBAAyBpK,EAAMoK,YAAaxG,KAAM5D,EAAM4D,KAAMmC,QAAS/F,EAAM+F,SAAO,UAAG/F,EAAM4E,YAOxG,SAASiG,EAAO7K,GACrB,OACE,iCAAQoK,UAAW,yBAAyBpK,EAAMoK,YAAaU,KAAK,SAAU/E,QAAS/F,EAAM+F,SAAO,UAAG/F,EAAM4E,YClBjH,MAAM,EAA+BpL,QAAQ,U,mTC6C7C,SAAS,EAAmB8B,GAC1B,OAAO0D,MAAMuK,KAAKjO,EAAMiD,QAAQiL,QAAO,CAACC,EAAgC/Q,KACtE+Q,EAAK/Q,GAAO4C,EAAMvC,IAAIL,GACf+Q,IACN,IAGU,SAASsB,EAAe/K,G,UACrC,MAAMgL,GAAY,IAAA3E,QAA0B,MACtC4E,GAAa,IAAA5E,QAAuB,OACpC,kBAACnM,EAAiB,mBAAEK,EAAkB,eAAEF,EAAc,aAAEF,EAAcgG,YAAa2I,EAAkB,UAAE9H,IAAa,IAAAsE,YAAW,GAC/HpJ,EAAuC,QAA3B,EAAc,QAAd,EAAA8D,EAAM9D,gBAAQ,QAAI8E,SAAS,QAAI,KAC3Cb,EAAcH,EAAMG,aAAe2I,GAClCoC,EAAQC,IAAa,IAAA5K,UAAwB,OAC7CkF,EAAS2F,IAAc,IAAA7K,UAAwB,OAC/CuC,EAAO6F,IAAY,IAAApI,UAAqC,OACxD3F,EAAMkG,IAAW,IAAAP,eAA2B1F,IAC5CwQ,EAAcC,IAAiB,IAAA/K,WAAS,GAEzCmJ,GAAU,IAAA/H,cAAY,IAAY,kCACtCgH,EAAS,MACTwC,EAAU,MACVC,EAAW,MACXtK,OAAQjG,GAER,MAAMD,QAAaT,IAEnBD,EAAkB,CAChB6E,UAAW,4CACX6C,aAAc,OACdhH,OACAuF,cACA4B,OAAQ,UACPW,MAAKgB,GACC8B,MAAM9B,GAAKhB,MAAK3B,GAAYA,EAAS6E,WAE7ClD,MAAK3B,IACJD,EAAQlG,GACRuQ,EAAUpK,EAASwK,eACnBH,EAAWrK,EAAS0E,YAErB5C,MAAM/C,QAAQgD,WACd,CAAC5I,EAAmBiG,KAEvB,IAAAK,YAAU,KACRkJ,MACC,CAACA,IAEJ,MAAM8B,EAAc,KAClBF,GAAc,GACd5B,KAGIQ,GAAc,IAAAvI,cAAamB,IAEjB,gCAAVA,GAAqD,kCAAVA,GAI/C6F,EAAS,IAAIhP,MAAMmJ,IACnBzI,EAAe,IAAIV,MAAMmJ,GAAQ,CAC/BlI,OACAuF,cACAyC,OAAQ,oBAPR4I,MASD,CAAC5Q,EAAMuF,IAEJ+I,GAAiB,IAAAvH,cAAmBkF,GAAwB,kCAChEyE,GAAc,GACd,MAAMnC,EAAW,CAACvO,QACZ6Q,QAqKH,SAAgC5E,G,yCAIrC,GAAIA,EAAYzJ,SAAS,UAAW,CAClC,MACMsO,EAAiB,EADX,IAAI/H,IAAIkD,GAC0BhD,cAE9C,MAAO,CAACnE,SAAUmH,EAAa9F,SAAU2K,GAG3C,MAAMtC,QAAyB5D,MAAMqB,GACrC,GAAIuC,EAAiB1D,QAAU,IAC7B,OAAO,IAAI/L,YAAYyP,EAAiBvD,QAG1C,MAAM,SAACnG,SAAwC0J,EAAiBxD,OAGhE,MAAO,CAAClG,SAAUA,EAAUqB,SADb,EADH,IAAI4C,IAAIjE,GACkBmE,kBAvLf8H,CAAiB9E,GAEtC,GAAI4E,aAAkB9R,MACpB,OAAOuQ,EAAYuB,EAAO3M,SAG5B,MAAM,SAACY,EAAQ,SAAEqB,GAAY0K,EAEF,mBAAvBlR,QAIEF,EAAe0G,EAAU,CAC7BnG,KAAMuO,EAASvO,KACfuF,cACAyC,OAAQ,mBANRnD,OAAOC,SAASkE,KAAOlE,MAQxB,CAACnF,EAAoBK,KAwEnB,SAAiBsQ,EAAuBrM,GAC7C,MAAM,MAAC+M,EAAK,OAAEC,EAAM,SAAEC,GAAYjN,GAElC,IAAA2B,YAAU,KACR,IAAK0K,EAAQ,OACb,IAAKW,EAAQ,OAEb,IAAIpL,GAAe,EAiBnB,MAhBA,MAAa,kCACXoL,EAAOD,MAAQA,QAAAA,EAAS,IACxBC,EAAOE,OAASH,QAAAA,EAAS,IAEzB,MAAMI,QAAgB,aAAgBd,EAAQ,CAC5Ce,qBAAsB,MACtBC,MAAO,GACPN,QACAO,OAAQL,QAAAA,EAAY,IAGjBrL,GACWoL,EAAOO,WAAW,MAC1BC,UAAUL,EAAS,EAAG,OAbhC,GAgBO,KACLvL,GAAe,KAEhB,CAACyK,EAAQY,EAAUD,EAAQD,IA9F9BU,CAAQpB,EAAQ,CACdW,OAAQb,EAAUzE,QAClBqF,MAAyB,QAAlB,EAAAX,EAAW1E,eAAO,eAAEgG,YAC3BT,SAAU9L,EAAM8L,WAoGb,SAAiBrG,EAAwB5G,GAC9C,MAAM,SAAC2N,EAAQ,WAAEtH,EAAU,QAAED,EAAO,QAAEwH,GAAW5N,GACjD,IAAA2B,YAAU,KACR,IAAKiF,EAAS,OACd,IAAKgH,EAAS,OAGd,IAAIC,EACAjM,GAAe,EACnB,MAAM8E,EAAO,IAAY,kCACvB,IAAK9E,EAAc,OACnB,MAAMM,QAAiByE,MAAMC,GAE7B,GAAKhF,EAAL,CACA,GAAIM,EAAS2E,OAAS,IAAK,CACzB,MAAMiH,QAAgB5L,EAAS6E,OAE/B,GADI+G,EAAQzB,QAAQsB,EAASG,EAAQzB,QACjCyB,EAAQhH,UAEV,YADAT,EAAWyH,EAAQhH,eAIlB,CACH,MAAME,QAAa9E,EAAS8E,OAC5BZ,EAAQY,GAGc,MAApB9E,EAAS2E,SACXgH,EAAU5G,WAAWP,EAtBX,WA2Bd,OADAmH,EAAU5G,WAAWP,EA1BP,MA2BP,KACL9E,GAAe,EACfmM,aAAaF,MAEd,CAACjH,EAAS+G,EAAUtH,EAAYD,EAASwH,IAnI5CI,CAAQpH,EAAS,CACfgH,SAAUpB,EACVmB,SAAUrB,EACVjG,WAAYgE,EACZjE,QAASiF,IAGX,MAAM4C,GACJ,8BAAKC,IAAK9B,GAAU,WAClB,mBAAQ8B,IAAK/B,OAIXgC,EACS,OAAb9Q,EAAoB,yBACR,MAAZA,EAAmB,uBACP,MAAZA,EAAmB,0BACP,MAAZA,EAAmB,yBAA2BH,EAA0BG,GACpE+Q,EACS,OAAb/Q,EAAoB,kEACR,MAAZA,EAAmB,qDACP,MAAZA,EAAmB,8DACP,MAAZA,EAAmB,2DAA6DH,EAA0BG,GAEtGgR,GACJ,+BAAK9C,UAAU,wBAAsB,YACnC,iCAAOA,UAAU,mCAAiC,WAC/CiB,EAAe2B,EAAqBC,GACrC,gBAAKzC,IC9Kb,2oEDgLOsC,MAIL,OAAK5B,GAAUlL,EAAMsK,SACZtK,EAAMsK,SAGXtK,EAAM4E,SACD5E,EAAM4E,SAAS,CACpBsI,YACAJ,gBACAhK,QACAuI,eACA8B,MAAO,IAAM3B,MAIV0B,EAGTnC,EAAeqC,WAAa,4CE7L5B,MAIaC,GAAyB,IAAAlS,eAJmB,CACvDmS,UAAU,EACVvO,UAAW,KAIE,SAASwO,EAAgBvN,GAGtC,MAAMjB,EAAY,qBAAuBiB,EAAM4E,UAAU4I,SAAQC,IAC/D,IAAKA,GAA0B,iBAAVA,EAAoB,MAAO,GAChD,GAAI,SAAUA,EAAO,CACnB,GAAIA,EAAM3C,OAAS4C,GAAkB,CACnC,MAAM1N,EAAQyN,EAAMzN,MACpB,OAAOA,EAAM2K,SAAW,CAAC3K,EAAM2K,UAAY,GAE7C,GAAI8C,EAAM3C,OAASC,EACjB,MAAO,CAAC,6CAGZ,MAAO,MAGH/H,EAA4C,CAChDsK,SAAUvO,EAAUpD,OAAS,EAC7BoD,aAEF,OACE,SAACsO,EAAuBM,SAAQ,eAACpU,MAAOyJ,GAAO,UAC5ChD,EAAM4E,YCWE,SAAS8I,GAAiB1N,G,gBACvC,MAAM,SAAC2K,GAAY3K,EACb4N,GAAQ,IAAAtI,YAAW+H,GACnBQ,GAAcD,EAAMN,U5BoLrB,SAAkB3C,EAAkB5L,GACzC,MAAMvC,EAAWJ,EAAyBuO,GACpCmD,EAAQ/O,EAAUyK,QAAO,CAACC,EAAMkB,IAAalB,GAAQrN,EAAyBuO,KAAcnO,EAAW,EAAI,IAAI,GACrH,OAAiB,IAAVsR,E4BvL+BC,CAAS/N,EAAM2K,SAAUiD,EAAM7O,WAC/DiE,GAAU,IAAAsC,YAAW,IACrB,kBAACpL,GAAqB8I,EACtB9G,EAA+C,QAAnC,EAAc,QAAd,EAAA8D,EAAM9D,gBAAQ,QAAI8G,EAAQhC,iBAAS,QAAI,KACnDrG,EAAwC,QAA9B,EAAY,QAAZ,EAAAqF,EAAMrF,cAAM,QAAIqI,EAAQrI,cAAM,QAAI,QAE5CyP,GADuB,QAAb,EAAApK,EAAMlB,eAAO,OAAIkE,EAAQlE,QACvB,mBAqHSvF,EArH8BoR,GAsHzDpR,EAAQA,EAAMmC,QAAQ,iBAAkB,KACjBH,MAAM,KACDiO,QAAO,CAACC,EAAgBhO,IAC9CgO,EAAK9N,OACA8N,EAAKjM,OAAO,CAAC,GAAGiM,EAAKA,EAAK9N,OAAO,MAAMF,MAEvCgO,EAAKjM,OAAO,CAAC/B,KAErB,IAEeD,KAAI4O,GAAa,oBAAoBA,MAAatO,KAAK,OAhIJkE,EAAMoK,UAAY,IAAIpK,EAAMoK,YAAc,OACxG4D,EAAUC,IAAe,IAAA1N,UAAoC,OAE7DqD,EAAM6E,IAAW,IAAAlI,UAASP,EAAM4D,MACjCzD,EAAcH,EAAMG,aAAe6C,EAAQ7C,YAiHnD,IAA6B5G,GA/G3B,IAAAiH,YAAU,KACR,GAAIR,EAAM4D,KAAM,OAEhB,IAAInD,GAAe,EAYnB,OATAvG,EAAkB,CAChBiG,cACApB,UAAW4L,EACXzP,UALEA,YAMDwH,MAAKkB,IACFnD,GAAcgI,EAAQ7E,MAE3Bf,MAAM/C,QAAQgD,OAER,KACLrC,GAAe,KAEhB,CAACT,EAAM4D,KAAM1J,EAAmByQ,EAAU3H,EAAQpI,KAAMuF,IAE3D,MAAM+N,EAAyCC,IAC7C,IAAInO,EAAM4D,KAAV,CAWA,GATIZ,EAAQpI,MAAQ,kBAAmBoI,EAAQpI,OAE7C,IAAAwT,eAAcpL,EAAQlI,MAAO,CAC3BuT,cAAe,WACfC,mBAAoBtL,EAAQpI,KAAK4H,cACjCC,aAActC,IAIdH,EAAMmD,MAAO,CACf,IAAIoL,EACqB,mBAAhBvO,EAAMmD,MACXnD,EAAMmD,MAAM,CACVwH,WACA6D,OAAQ,IAAMP,EAAY,SAEZ,IAAhBjO,EAAMmD,OAEQ,IAAdoL,IACFJ,EAAMM,iBAEmB,kBAAdF,EACTvL,EAAQlJ,eAAe,CACrBiF,UAAW,CAAC4L,GACZxK,YAAaA,EACb6N,UAAU,KAGZC,EAAYM,GACZvL,EAAQlJ,eAAe,CACrBiF,UAAW,CAAC4L,GACZxK,YAAaA,EACb6N,UAAU,MAMdhO,EAAM+F,SAAS/F,EAAM+F,QAAQoI,KAG7BO,EAAyB,QAAd,EAAA1O,EAAM4E,gBAAQ,SAC7B,UAAC,aAAc,WACZ3I,EAAgBC,EAAUvB,GAAU,GAAGsB,EAAgBC,EAAUvB,MAAa,GAAI4B,EAAgBL,EAAUyO,GAAUlO,MAAK,IAC3HoR,EAAa,MA0DIvS,EA1DkBiB,EAAgBL,EAAUyO,GAAUjO,SA2DvEpB,EACEA,EAAMqT,UAAU,EAAG,GAAGC,cAAgBtT,EAAMO,OAAO,EAAGP,EAAMK,QADhDL,MAvDbuT,GACJ,UAAC,aAAc,YACb,SAACtE,EAAoB,CAACI,SAAUA,EAAUN,KAAMrK,EAAMqK,QACtD,0BAAOqE,OAILI,EAASlL,GACb,UAAC,aAAc,YACb,SAACgH,EAAY,iBAAK5K,EAAK,CAAE4D,KAAMA,EAAMwG,UAAWA,EAAWrE,QAASmI,GAAW,UAC5EW,KAEFb,MAGH,UAAC,aAAc,YACb,SAACnD,EAAM,iBAAK7K,EAAK,CAAEoK,UAAWA,EAAWrE,QAASmI,GAAW,UAC1DW,KAEFb,KAmCP,IAAwB1S,EA/BtB,OAAK0E,EAAM4D,MAAqB,wCAAb+G,EAcZmE,GAZH,SAACjH,EAAwB,eACvB1H,YAAaH,EAAMG,YACnBmK,SAAUwE,EACV1E,UAAWA,EACXtF,UAAW9E,EAAM8E,UACjBuF,MAAM,SAACE,EAAoB,CAACI,SAAUA,EAAUN,KAAMrK,EAAMqK,QAAQ,WAEpE,0BAAOqE,OClJA,SAASK,GAAmB/O,G,QACzC,MAAM,OAACrF,EAAM,UAAEqG,EAAWjC,UAAWiQ,IAA0B,IAAA1J,YAAW,GACpEpJ,EAAW8D,EAAM9D,UAAY8E,GAAyB,KAEtDjC,EAAYlC,EAAyD,QAAzC,EAAe,QAAf,EAAAmD,EAAMjB,iBAAS,QAAIiQ,SAAsB,QAAI,IAG/E,OAFqBjQ,EAAUpD,QAAUoD,EAAUkQ,OAAMhS,GAAKA,EAAEZ,WAAW,+BAGlE,SAAC6S,GAAM,iBAAKlP,EAAK,CAAEjB,UAAWA,MAIrC,8BAAKqL,UAAU,wBAAsB,WACnC,SAACmD,EAAe,UACbxO,EAAUvD,KAAImP,IACb,SAAC+C,GAAgB,CACf/C,SAAUA,EAEV5E,QAAS/F,EAAMmP,SAAW,IAAOnP,EAAMmP,SAAUxE,QAAa9P,EAC9DsF,YAAaH,EAAMG,YACnBgD,MAAOnD,EAAMmD,MACbjH,SAAUA,EACVvB,OAAQA,EACRmK,UAAW9E,EAAM8E,WANZ6F,UAkBV,SAASuE,GAAOlP,GACrB,MAAM,UAACjB,GAAaiB,GACd,OAACrF,EAAM,UAAEqG,IAAa,IAAAsE,YAAW,GACjCpJ,EAAW8D,EAAM9D,UAAY8E,GAAyB,KACtDoO,EAAQrQ,EAAU3B,SAAS2N,EAAeqC,YAC1CiC,EAAoBtQ,EAAUxB,QAAON,GAAKA,IAAM8N,EAAeqC,aAE/DtI,EAAYD,EAAkC,oBAAdkD,UAA4BA,UAAUjD,UAAY9E,EAAM8E,WACxFmD,EAAkC,SAAvBnD,aAAS,EAATA,EAAWoD,GAAGN,MAAiB,MAA+B,aAAvB9C,aAAS,EAATA,EAAWoD,GAAGN,MAAqB,UAAY,KACjG0H,EAASF,IAAUnH,EAEzB,OACE,8BAAKmC,UAAU,wBAAsB,WACnC,UAACmD,EAAe,WACb8B,EAAkB7T,KAAImP,IACrB,SAAC+C,GAAgB,CACf/C,SAAUA,EAEV5E,QAAS/F,EAAMmP,SAAW,IAAOnP,EAAMmP,SAAUxE,QAAa9P,EAC9DsF,YAAaH,EAAMG,YACnBgD,MAAOnD,EAAMmD,MACbjH,SAAUA,EACVvB,OAAQA,EACRmK,UAAW9E,EAAM8E,WANZ6F,KASR2E,GACC,SAACvE,EAAc,CACb7O,SAAUA,EACViE,YAAaH,EAAMG,YACnBmK,UACE,SAACoD,GAAgB,CACf/C,SAAUI,EAAeqC,eAI5BgC,GAASnH,GACZ,SAACyF,GAAgB,CACf/C,SAAUI,EAAeqC,WACzBjN,YAAaH,EAAMG,YACnBgD,MAAOnD,EAAMmD,MACbjH,SAAUA,EACVvB,OAAQA,EACRmK,UAAW9E,EAAM8E,YAEjB,WC9FZ,MAyIA,GAhHM9E,I,QACJ,MAAM,SAAC4E,EAAQ,OAAEuH,EAAM,UAAE/B,GAAapK,EAChCuP,GAAa,IAAAlJ,QAAuB,OACpC,OAACpL,EAAM,aAAEb,EAAY,kBAAEF,EAAiB,eAAEG,EAAc,KAAEO,EAAI,MAAEE,EAAOiE,UAAWiQ,IAA0B,IAAA1J,YAAW,IACtHkK,EAAWC,IAAgB,IAAAlP,WAAS,IAAMmP,KAAKC,SAASxR,cACxDyR,EAAgBC,IAAmB,IAAAtP,WAAS,IAC5CuP,EAAaC,IAAgB,IAAAxP,WAAS,IACtCuC,EAAO6F,IAAY,IAAApI,UAAqC,OACxDyP,EAAsBC,IAA2B,IAAA1P,UAAsC,MACxF2P,EAAYF,aAAoB,EAApBA,EAAsB/U,OAAOkV,WAEzCpR,EAAqD,QAAzC,EAAe,QAAf,EAAAiB,EAAMjB,iBAAS,QAAIiQ,SAAsB,QAAI,IAE/D,IAAAxO,YAAU,KACR,IAAI4P,GAAc,EAOlB,OALAnV,EAAOoV,4BAA4B3N,MAAK4N,IACjCF,GACLH,EAAwBK,MAGnB,KACLF,GAAc,KAEf,CAACnV,IAEJ,MAAMgI,GAAW,IAAAtB,cAAY,KAAY,O,OAAA,E,OAAA,E,EAAA,Y,MACvC,IAAKqO,EAAsB,OAC3B,MAAMO,GAAkE,QAA/C,EAAAP,EAAqB/U,OAAOuV,2BAAmB,QAAIR,EAAqBQ,qBAAqB9U,QAAQ,QAAS,IAAIA,QAAQ,OAAQ,IACrJ+U,EAAe,IAAI9M,UAAUzJ,EAAkB,CACnD6E,eAEI2R,EAAkB,IAAIC,gBAAgBF,EAAavM,QACzDwM,EAAgB3G,IAAI,SAAU0G,EAAaG,MAC3CH,EAAaG,KAAO,IAAIjN,IAAI4M,GAAiBK,KAC7CH,EAAaI,KAAO,IAAIlN,IAAI4M,GAAiBM,KAC7CJ,EAAa7Q,SAAW,IAAI+D,IAAI4M,GAAiB3Q,SAAW,aAC5D6Q,EAAavM,OAASwM,EAAgBvS,WAElCvD,GAAQ,kBAAmBA,IAE7B,IAAAwT,eAActT,EAAO,CACnBuT,cAAe,WACfC,mBAAoB1T,EAAK4H,cACzBC,aAAciO,EAAgB3X,IAAI,kBAItC0G,OAAOC,SAASkE,KAAO6M,EAAatS,Y,YAtBG,K,gRAuBtC,CAACjE,EAAmB8V,EAAsBjR,IAEvCmE,GAAY,IAAAvB,cAAY,IACrB1G,EAAO6V,GAAG5N,UACfqM,EAAWhJ,QAAQ,+BAEdnM,EAAa,CAAC2E,eAAW,CAC5BoN,aAEH,CAAClR,EAAQb,EAAc+R,EAAQpN,IA4ClC,OA1CA,IAAAgS,kBAAiB,KACf,IAAKxB,EAAWhJ,QAAS,OACzB,GAAIzD,EAAO,OACX,IAAKoN,EAAW,OAEhB,MAAMc,EAAU9N,IAwBhB,OAtBA8N,EAAQC,eAAiB,KACvBpB,GAAgB,IAGlBmB,EAAQtO,MAAK3B,IACPiQ,EAAQE,WACZ7W,EAAe0G,EAAU,CACvBnG,KAAMA,GAAQ,kBAAmBA,EAAOA,OAAOC,EAC/C+H,OAAQ,cAETC,OAAM9E,IACHA,aAAe,EAAAoT,mBACjBpB,GAAa,GAIXiB,EAAQE,YAEZvI,EAAS5K,GACT1D,EAAe0D,EAAK,CAAC6E,OAAQ,eAGxB,KACLoO,EAAQI,YAET,CAAClO,EAAWtI,EAAMP,EAAgBmV,EAAW1M,EAAOoN,IAUhDtL,EAAS,CACdsI,WAFgB,gBAAKH,IAAKwC,EAAYnF,UAAWA,IAGjDwF,iBACAE,cACAI,UAAWF,aAAoB,EAApBA,EAAsB/U,OAAOkV,WACxCrN,QACAqK,MAdkB,KAClB0C,GAAgB,GAChBE,GAAa,GACbpH,EAAS,MACT8G,EAAaC,KAAKC,SAASxR,aAW3B8E,cCzIW,SAASoO,KACtB,MAAM,OAAC7W,EAAM,OAAEC,EAAM,kBAAEZ,EAAiB,eAAEC,EAAc,UAAEiF,EAAS,UAAEhE,EAAS,eAAEC,EAAc,OAAEhB,EAAM,aAAED,IAAgB,IAAAuL,YAAW,GAEnI,MAAO,CACL9K,SAIAC,SACAqI,MAAOtI,GAAU,UAAWA,EAASA,EAAS,KAC9CX,oBACAC,iBACAiF,YAIAhE,YAIAC,iBAIAjB,eAIAC,U","sources":["webpack://@criipto/verify-react/webpack/bootstrap","webpack://@criipto/verify-react/webpack/runtime/compat get default export","webpack://@criipto/verify-react/webpack/runtime/define property getters","webpack://@criipto/verify-react/webpack/runtime/hasOwnProperty shorthand","webpack://@criipto/verify-react/webpack/runtime/make namespace object","webpack://@criipto/verify-react/external commonjs \"react/jsx-runtime\"","webpack://@criipto/verify-react/external commonjs \"react\"","webpack://@criipto/verify-react/external commonjs \"@criipto/auth-js\"","webpack://@criipto/verify-react/./src/context.ts","webpack://@criipto/verify-react/./src/utils.ts","webpack://@criipto/verify-react/external commonjs \"jwt-decode\"","webpack://@criipto/verify-react/./src/memory-storage.ts","webpack://@criipto/verify-react/./src/provider.tsx","webpack://@criipto/verify-react/external commonjs \"ua-parser-js\"","webpack://@criipto/verify-react/./src/device.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Poll.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Foreground.tsx","webpack://@criipto/verify-react/./src/hooks/usePageVisibility.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/shared.ts","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton/Reload.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDSameDeviceButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton/Logo.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/beeid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nldigid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dkmitid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/dknemid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/ftnmobile@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/itsme@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sebankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/sofort@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/nobankid@2x.png","webpack://@criipto/verify-react/./src/components/AuthMethodButton/logos/novipps@2x.png","webpack://@criipto/verify-react/./src/components/Button.tsx","webpack://@criipto/verify-react/external commonjs \"qrcode\"","webpack://@criipto/verify-react/./src/components/SEBankIDQRCode.tsx","webpack://@criipto/verify-react/./src/components/SEBankIDQRCode/logo@2x.png","webpack://@criipto/verify-react/./src/components/AuthButtonGroup.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodButton.tsx","webpack://@criipto/verify-react/./src/components/AuthMethodSelector.tsx","webpack://@criipto/verify-react/./src/components/QRCode.tsx","webpack://@criipto/verify-react/./src/use-criipto-verify.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react/jsx-runtime\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@criipto/auth-js\");","import CriiptoAuth, {OpenIDConfiguration, AuthorizeUrlParamsOptional, PKCE, AuthorizeResponse, OAuth2Error, PKCEPublicPart} from '@criipto/auth-js';\nimport { PopupAuthorizeParams, RedirectAuthorizeParams } from '@criipto/auth-js/dist/types';\nimport { createContext } from 'react';\n\nexport type ResultSource = 'QRCode' | 'SEBankIDQrCode' | 'SEBankIDSameDeviceButton' | 'redirect';\nexport type Result = {id_token: string, state?: string, source?: ResultSource} | {code: string, state?: string, source?: ResultSource} | OAuth2Error | Error;\nexport const actions = ['confirm', 'accept', 'approve', 'sign', 'login'] as const;\nexport type Action = typeof actions[number];\nexport type Claims = {\n iss: string\n aud: string\n identityscheme: string\n authenticationtype: string\n sub: string\n iat: number\n exp: number\n [key: string]: string | number\n}\n\nexport interface CriiptoVerifyContextInterface {\n loginWithRedirect: (params?: RedirectAuthorizeParams) => Promise<void>,\n loginWithPopup: (params?: PopupAuthorizeParams) => Promise<void>,\n checkSession: () => Promise<void>,\n logout: (params?: {redirectUri?: string, state?: string}) => Promise<void>,\n fetchOpenIDConfiguration: () => Promise<OpenIDConfiguration>,\n buildAuthorizeUrl: (options?: AuthorizeUrlParamsOptional) => Promise<string>,\n generatePKCE: () => Promise<PKCE | undefined>,\n buildOptions: (options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) => AuthorizeUrlParamsOptional\n handleResponse: (response: AuthorizeResponse, params: {pkce?: PKCE, redirectUri?: string, source?: ResultSource}) => Promise<void>,\n responseType: 'token' | 'code'\n completionStrategy: 'client' | 'openidprovider',\n result: Result | null\n claims: Claims | null\n domain: string\n redirectUri?: string,\n action: Action,\n message?: string,\n pkce?: PKCE | PKCEPublicPart,\n store: Storage,\n isLoading: boolean,\n isInitializing: boolean,\n acrValues?: string[],\n uiLocales?: string,\n client: CriiptoAuth\n loginHint?: string\n}\n\n/**\n * @ignore\n */\nconst stub = (): never => {\n throw new Error('You forgot to wrap your component in <CriiptoVerifyProvider>.');\n};\n\n/**\n * @ignore\n */\nconst initialContext = {\n loginWithRedirect: stub,\n loginWithPopup: stub,\n checkSession: stub,\n logout: stub,\n fetchOpenIDConfiguration: stub,\n buildAuthorizeUrl: stub,\n generatePKCE: stub,\n buildOptions: stub,\n handleResponse: stub,\n responseType: 'token' as 'token' | 'code',\n completionStrategy: 'client' as 'client' | 'openidprovider',\n result: null,\n claims: null,\n domain: '',\n action: 'login' as Action,\n pkce: undefined,\n store: null as any as Storage,\n isLoading: false,\n isInitializing: true,\n client: null as any as CriiptoAuth,\n loginHint: undefined\n};\n\nconst CriiptoVerifyContext = createContext<CriiptoVerifyContextInterface>(initialContext);\n\nexport default CriiptoVerifyContext;","import { Action } from \"./context\";\n\ndeclare var __VERSION__: string;\nexport const VERSION = typeof __VERSION__ === \"undefined\" ? \"N/A\": __VERSION__;\n\nexport const DKMITID_PREFIX = 'urn:grn:authn:dk:mitid';\nexport const DKMITID_BUSINESS = 'urn:grn:authn:dk:mitid:business';\nexport const FTN_PREFIX = 'urn:grn:authn:fi';\n\nexport function lowestMitIDValue(input: string[]) : string | null {\n let dkmitidMethod : string | null = null;\n\n input.forEach(s => {\n if (s.startsWith(DKMITID_PREFIX) && s !== DKMITID_BUSINESS) {\n if (!dkmitidMethod) {\n dkmitidMethod = s;\n } else {\n let newLevel = s.replace(DKMITID_PREFIX, '');\n let oldLevel = dkmitidMethod.replace(DKMITID_PREFIX, '');\n if (newLevel === ':low' && [':substantial', ':high'].includes(oldLevel)) {\n dkmitidMethod = s;\n }\n else if (newLevel === ':substantial' && oldLevel === ':high') {\n dkmitidMethod = s;\n }\n }\n }\n });\n\n return dkmitidMethod;\n}\n\nfunction autoTitleCase(input: string) {\n var segments = input.split(/:|-/).map(segment => {\n segment = segment.replace(/id(\\s|$)/, 'ID');\n if (segment.length === 2) return segment.toUpperCase();\n return segment.substr(0, 1).toUpperCase() + segment.substr(1);\n });\n return segments.join(' ');\n}\n\nfunction assertUnreachable(x: never): never {\n throw new Error(\"Didn't expect to get here\");\n}\n\nexport function assertUnreachableLanguage(x: never): never {\n throw new Error(`Unsupported language ${x}`);\n}\nexport type Language = 'en' | 'da' | 'sv' | 'nb';\n\nexport function stringifyAction(language: Language, action: Action) : string {\n if (action === 'login') {\n if (language === 'da') return 'Login med';\n else if (language === 'sv') return 'Logga in med'\n else if (language === 'nb') return 'Logg inn med';\n return 'Login with';\n }\n if (action === 'approve') {\n if (language === 'da') return 'Godkend med';\n else if (language === 'sv') return 'Godkänn med'\n else if (language === 'nb') return 'Godkjenne med';\n return 'Approve with';\n }\n if (action === 'sign') {\n if (language === 'da') return 'Underskriv med';\n else if (language === 'sv') return 'Signera med'\n else if (language === 'nb') return 'Signer med';\n return 'Sign with';\n }\n if (action === 'confirm') {\n if (language === 'da') return 'Bekræft med';\n else if (language === 'sv') return 'Bekräfta med'\n else if (language === 'nb') return 'Bekreft med';\n return 'Confirm with';\n }\n if (action === 'accept') {\n if (language === 'da') return 'Accepter med';\n else if (language === 'sv') return 'Acceptera med'\n else if (language === 'nb') return 'Aksepterer med';\n return 'Accept with';\n }\n\n assertUnreachable(action);\n}\n\nexport function acrValueToProviderPrefix(value: string) {\n value = value.replace('urn:grn:authn:', '');\n\n if (value.startsWith('fi')) {\n return 'fi';\n }\n else if (value.startsWith('itsme')) {\n return 'itsme';\n } else {\n return value.split(':').slice(0, 2).join(':');\n }\n}\n\nexport function acrValueToTitle(language: Language, value: string) : {title: string, subtitle?: string} {\n\tvalue = value.replace('urn:grn:authn:', '');\n const provider = acrValueToProviderPrefix(value);\n\n if (provider === 'be:eid') {\n return {title: autoTitleCase(value).replace('BEEID', 'Belgian eID')};\n }\n if (provider === 'nl:digid') {\n return {title: autoTitleCase(value).replace('NL ', '')};\n }\n if (provider === 'dk:mitid') {\n let suffix = value.replace('dk:mitid:', '');\n if (suffix === 'business') {\n if (language === 'en') return {title: 'MitID Business'}\n if (language === 'da') return {title: 'MitID Erhverv'}\n if (language === 'sv') return {title: 'MitID Erhverv'}\n if (language === 'nb') return {title: 'MitID Erhverv'}\n return {title: 'MitID Erhverv'};\n }\n\n return {title: 'MitID'};\n }\n if (provider === 'dk:nemid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('dk:nemid:', '');\n\t\t\n\t\tif (suffix === 'poces') {\n\t\t\tif (language === 'en') subtitle = 'Personal';\n\t\t\tif (language === 'da') subtitle = 'Personlig';\n\t\t\tif (language === 'sv') subtitle = 'Personlig';\n\t\t\tif (language === 'nb') subtitle = 'Personlig';\n\t\t}\n\t\tif (suffix === 'moces') {\n\t\t\tif (language === 'en') subtitle = 'Employee key card';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglekort';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelkort';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelkort';\n\t\t}\n\t\tif (suffix === 'moces:codefile') {\n\t\t\tif (language === 'en') subtitle = 'Employee key file';\n\t\t\tif (language === 'da') subtitle = 'Medarbejder nøglefil';\n\t\t\tif (language === 'sv') subtitle = 'Anställd nyckelfil';\n\t\t\tif (language === 'nb') subtitle = 'Ansatt nøkkelfil';\n\t\t}\n\n return {\n\t\t\ttitle: 'NemID',\n\t\t\tsubtitle\n\t\t}\n }\n if (value === 'fi:mobile-id') {\n if (language === 'en') return {title: 'Finnish Mobile ID'};\n if (language === 'da') return {title: 'Finsk Mobil ID'};\n if (language === 'sv') return {title: 'Finskt Mobil ID'};\n if (language === 'nb') return {title: 'Finsk Mobil ID'};\n }\n if (value === 'fi:bank-id') {\n if (language === 'en') return {title: 'Finnish Bank ID'};\n if (language === 'da') return {title: 'Finsk Bank ID'};\n if (language === 'sv') return {title: 'Finskt Bank ID'};\n if (language === 'nb') return {title: 'Finsk Bank ID'};\n }\n if (provider === 'fi') {\n return {title: autoTitleCase(value).replace('FI', 'FTN')};\n }\n if (provider === 'itsme') {\n return {title: autoTitleCase(value).replace('me', 'ME')};\n }\n if (provider === 'se:bankid') {\n\t\tlet subtitle : string | undefined = undefined;\n\t\tlet suffix = value.replace('se:bankid:', '');\n\n\t\tif (suffix === 'same-device') {\n\t\t\tif (language === 'en') subtitle = 'On this device';\n\t\t\tif (language === 'da') subtitle = 'På denne enhed';\n\t\t\tif (language === 'sv') subtitle = 'På denna enhet';\n\t\t\tif (language === 'nb') subtitle = 'På denne enhet';\n\t\t}\n\t\tif (suffix === 'another-device') {\n\t\t\tif (language === 'en') subtitle = 'With your SSN';\n\t\t\tif (language === 'da') subtitle = 'Med dit personnummer';\n\t\t\tif (language === 'sv') subtitle = 'Med ditt personnummer';\n\t\t\tif (language === 'nb') subtitle = 'Med personnummeret ditt';\n\t\t}\n\t\tif (suffix === 'another-device:qr') {\n\t\t\tif (language === 'en') subtitle = 'On another device';\n\t\t\tif (language === 'da') subtitle = 'På anden enhed';\n\t\t\tif (language === 'sv') subtitle = 'På annan enhet';\n\t\t\tif (language === 'nb') subtitle = 'På annan enhet';\n\t\t}\n\n return {title: 'BankID', subtitle};\n }\n if (provider === 'de:sofort') {\n return {title: autoTitleCase(value).replace('DE ', '')};\n }\n if (provider === 'no:bankid') {\n let subtitle : string | undefined = undefined;\n if (value.endsWith(':substantial')) {\n if (language === 'en') subtitle = 'Biometrics';\n\t\t\tif (language === 'da') subtitle = 'Biometri ';\n\t\t\tif (language === 'sv') subtitle = 'Biometri';\n\t\t\tif (language === 'nb') subtitle = 'Biometri';\n }\n return {title: subtitle ? 'BankID' : autoTitleCase(value).replace('NO ', ''), subtitle};\n }\n if (provider === 'no:vipps') {\n return {title: autoTitleCase(value).replace('NO ', '')};\n }\n\n return {title: autoTitleCase(value)};\n}\n\nexport function filterAcrValues(input: string[]) {\n let original = input.slice();\n let dkmitidMethod : string | null = lowestMitIDValue(input);\n let reduced = input.slice();\n\n if (dkmitidMethod) {\n reduced =\n input.filter(s => !s.startsWith(DKMITID_PREFIX) || s === DKMITID_BUSINESS)\n .concat([dkmitidMethod])\n .sort((a, b) => original.indexOf(a) - original.indexOf(b));\n }\n\n if (input.includes(`${FTN_PREFIX}:all`)) {\n if (!reduced.includes(`${FTN_PREFIX}:bank-id`)) reduced.push(`${FTN_PREFIX}:bank-id`);\n if (!reduced.includes(`${FTN_PREFIX}:mobile-id`)) reduced.push(`${FTN_PREFIX}:mobile-id`);\n reduced = reduced.filter(s => s !== `${FTN_PREFIX}:all`);\n }\n return reduced;\n}\n\nexport function isSingle(acrValue: string, acrValues: string[]) {\n const provider = acrValueToProviderPrefix(acrValue);\n const count = acrValues.reduce((memo, acrValue) => memo + (acrValueToProviderPrefix(acrValue) === provider ? 1 : 0), 0);\n return count === 1;\n}\n\nexport function trySessionStorage() {\n try {\n if (typeof sessionStorage === 'undefined') {\n return null;\n }\n return sessionStorage;\n } catch (err) {\n /**\n * Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n * (if storage is disabled in the browser)\n */\n return null;\n }\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"jwt-decode\");","\nexport function createMemoryStorage() : Storage {\n let store : {[key: string]: string} = {};\n\n return {\n getItem(key: string) {\n return store[key] || null;\n },\n setItem(key: string, value: any) {\n store[key] = value.toString();\n },\n removeItem(key: string) {\n delete store[key];\n },\n clear() {\n store = {};\n },\n key(index) {\n return Object.keys(store)[index];\n },\n get length() {\n return Object.keys(store).length;\n }\n };\n}","import React, {useMemo, useState, useCallback, useEffect} from 'react';\nimport CriiptoAuth, {AuthorizeUrlParamsOptional, clearPKCEState, generatePKCE, OAuth2Error, OpenIDConfiguration, PKCE, PKCEPublicPart, Prompt, parseAuthorizeResponseFromLocation} from '@criipto/auth-js';\n\nimport CriiptoVerifyContext, {CriiptoVerifyContextInterface, Action, Result, Claims, actions, ResultSource} from './context';\nimport { AuthorizeResponse, RedirectAuthorizeParams, ResponseType } from '@criipto/auth-js/dist/types';\n\nimport { filterAcrValues, trySessionStorage, VERSION } from './utils';\nimport jwtDecode from 'jwt-decode';\nimport { createMemoryStorage } from './memory-storage';\n\nconst SESSION_KEY = `@criipto-verify-react/session`;\n \nexport interface CriiptoVerifyProviderOptions {\n domain: string\n clientID: string\n /**\n * @deprecated Development use only\n */\n protocol?: \"https\" | \"http\"\n\n redirectUri?: string\n children: React.ReactNode\n pkce?: PKCEPublicPart\n state?: string\n nonce?: string\n prompt?: Prompt\n scope?: string\n uiLocales?: string\n loginHint?: string\n /**\n * Enables storage and automatic fetch of tokens\n * by utilizing browser storage and SSO silent logins.\n * Make sure \"SSO for OAuth2\" is enabled on your Criipto Domain.\n * Only works for `response: 'token'` (default)\n */\n sessionStore?: Storage,\n /**\n * Will ammend the login_hint parameter with `action:{action}` which will adjust texsts in certain flows.\n * Default: 'login'\n */\n action?: Action\n /**\n * Will ammend the login_hint parameter with `message:{base64(message)}` which will set a login/aprove message where available (Danish MitID).\n */\n message?: string\n /**\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do PKCE on your behalf and return a jwt token.\n * However if you wish you can disable this and get the raw `code` response by setting `response` to 'code'.\n */\n response?: 'token' | 'code'\n /*\n * Note: In most cases modifying this setting **is not needed**. Defaults will work with almost all React SPA cases.\n * By default @criipto/verify-react will do as much as work on your behalf\n * by interpreting URL parameters and responses with `useCriiptoVerify()` via the default value 'client'.\n * If you wish to only render a UI and redirect to the Criipto IDP for server side code exchange, you can choose 'openidprovider'.\n */\n completionStrategy?: 'client' | 'openidprovider',\n\n /**\n * @deprecated Criipto internal use\n */\n criiptoSdk?: null | string\n /**\n * @deprecated Criipto internal use\n */\n responseType?: ResponseType | 'code id_token'\n /**\n * @deprecated Criipto internal use\n */\n responseMode?: \"query\" | \"form_post\" | \"fragment\" | \"json\" | \"post_message\"\n}\n\nexport const ACTION_SUPPORTING_ACR_VALUES = [\n 'urn:grn:authn:dk:mitid:low',\n 'urn:grn:authn:dk:mitid:substantial',\n 'urn:grn:authn:dk:mitid:high',\n 'urn:grn:authn:se:bankid:same-device',\n 'urn:grn:authn:se:bankid:another-device:qr',\n];\n\nexport const MESSAGE_SUPPORTING_ACR_VALUES = [\n 'urn:grn:authn:dk:mitid:low',\n 'urn:grn:authn:dk:mitid:substantial',\n 'urn:grn:authn:dk:mitid:high',\n 'urn:grn:authn:se:bankid:same-device',\n 'urn:grn:authn:se:bankid:another-device:qr'\n];\n\nexport function buildLoginHint(loginHint: string | undefined | null, params: {options?: AuthorizeUrlParamsOptional, action?: Action, message?: string}) {\n const {options, action, message} = params;\n const acrValues = options?.acrValues ? Array.isArray(options?.acrValues) ? options?.acrValues : [options?.acrValues] : [];\n let hints = (loginHint ? loginHint.split(' ') : []).concat(options?.loginHint ? options?.loginHint.split(' ') : []).filter(hint => !hint.startsWith('message:') && !hint.startsWith('action:'));\n if (action) {\n hints = hints.filter(h => !h.startsWith('action:'));\n if (acrValues.length === 1) {\n if (ACTION_SUPPORTING_ACR_VALUES.includes(acrValues[0])) {\n hints.push(`action:${action}`);\n }\n } else if (acrValues.length >= 2) {\n if (acrValues.some(v => ACTION_SUPPORTING_ACR_VALUES.includes(v))) {\n hints.push(`action:${action}`);\n }\n } else {\n hints.push(`action:${action}`);\n }\n }\n\n if (message) {\n if (acrValues.length === 1) {\n if (MESSAGE_SUPPORTING_ACR_VALUES.includes(acrValues[0])) {\n hints.push(`message:${btoa(message)}`);\n }\n } else if (acrValues.length >= 2) {\n if (acrValues.some(v => MESSAGE_SUPPORTING_ACR_VALUES.includes(v))) {\n hints.push(`message:${btoa(message)}`);\n }\n } else {\n hints.push(`message:${btoa(message)}`);\n }\n }\n\n return hints.length ? hints.join(' ') : undefined;\n}\n\nfunction parseAction(input?: string) : Action | undefined {\n if (!input) return;\n\n const segments = input.split(\" \");\n const actionCandidate = segments.find(s => s.startsWith('action:'));\n if (!actionCandidate) return;\n const action = actionCandidate.replace('action:','');\n if (actions.includes(action as any)) return action as Action;\n return;\n}\n\nfunction tryBase64Decode(input: string) {\n try {\n return atob(input);\n }\n catch {\n return null;\n }\n}\nfunction parseMessage(input?: string) : string | undefined {\n if (!input) return;\n const segments = input.split(\" \");\n const messageCandidate = segments.find(s => s.startsWith('message:'));\n if (!messageCandidate) return;\n\n const message = messageCandidate.replace('message:','');\n return tryBase64Decode(message) ?? message;\n}\n\nfunction defaultRedirectUri(input?: string) : string {\n if (input) return input;\n if (typeof window !== \"undefined\" && typeof window.location !== \"undefined\") {\n return window.location.origin + window.location.pathname;\n }\n\n throw new Error('Unable to determine default redirect uri, please provide a redirectUri');\n}\n\nconst pkceStore = (() => {\n const sessionStorage = trySessionStorage();\n if (sessionStorage === null) {\n console.warn('Creating memory store for PKCE values as no sessionStorage is available. Authentication may be broken.');\n return createMemoryStorage();\n }\n return sessionStorage;\n})();\n\nconst CriiptoVerifyProvider = (props: CriiptoVerifyProviderOptions) : React.ReactElement => {\n const client = useMemo(() => \n new CriiptoAuth({\n domain: props.domain,\n clientID: props.clientID,\n store: pkceStore,\n redirectUri: defaultRedirectUri(props.redirectUri),\n protocol: props.protocol\n }), [props.domain, props.clientID, props.redirectUri, props.protocol]\n );\n\n const [configuration, setConfiguration] = useState<OpenIDConfiguration | null>(null);\n useEffect(() => {\n let isSubscribed = true;\n (async () => {\n const configuration = await client.fetchOpenIDConfiguration();\n if (isSubscribed) setConfiguration(configuration);\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [client]);\n\n const [result, setResult] = useState<Result | null>(null);\n const claims = useMemo(() => {\n if (!result) return null;\n if (!(\"id_token\" in result)) return null;\n return jwtDecode<Claims>(result.id_token);\n }, [result]);\n const [isLoading, setIsLoading] = useState(false);\n const [isInitializing, setIsInitializing] = useState(true);\n const [pkce, setPKCE] = useState<PKCE | PKCEPublicPart | undefined>(props.pkce);\n const responseType = props.response || 'token';\n const completionStrategy = props.completionStrategy || 'client';\n const uiLocales = props.uiLocales;\n const loginHint = props.loginHint;\n const action = props.action ?? parseAction(loginHint) ?? 'login';\n const message = props.message ?? parseMessage(loginHint);\n const sessionStore = props.sessionStore;\n\n const refreshPKCE = async () => {\n if (props.pkce) return props.pkce;\n if (responseType !== 'token' || completionStrategy !== 'client') {\n clearPKCEState(pkceStore);\n setPKCE(undefined);\n return undefined;\n }\n\n clearPKCEState(pkceStore);\n\n const pkce = await generatePKCE();\n setPKCE(pkce);\n return pkce;\n }\n\n const buildOptions = useCallback((options?: AuthorizeUrlParamsOptional | RedirectAuthorizeParams) : AuthorizeUrlParamsOptional => {\n return {\n redirectUri: defaultRedirectUri(props.redirectUri),\n responseType: (props.responseType ?? 'code') as ResponseType,\n responseMode: props.responseMode,\n ...options || {},\n state: props.state ?? options?.state,\n nonce: props.nonce ?? options?.nonce,\n prompt: props.prompt ?? options?.prompt,\n scope: props.scope ?? options?.scope,\n uiLocales: uiLocales ?? options?.uiLocales,\n pkce: options?.pkce ?? pkce,\n loginHint: buildLoginHint(props.loginHint, {options, action, message}),\n extraUrlParams: props.criiptoSdk !== undefined ? {\n criipto_sdk: props.criiptoSdk\n } : {\n criipto_sdk: `@criipto/verify-react@${VERSION}`\n }\n }\n }, [\n pkce,\n props.state,\n props.nonce,\n props.prompt,\n props.scope,\n uiLocales,\n action,\n message,\n props.redirectUri,\n props.criiptoSdk,\n props.loginHint,\n props.responseMode,\n props.responseType\n ]);\n\n const buildAuthorizeUrl = useCallback(async (options?: AuthorizeUrlParamsOptional) => {\n return await client.buildAuthorizeUrl(client.buildAuthorizeParams(buildOptions(options)));\n }, [client, buildOptions]);\n\n const handleResponse = useCallback(async (response : AuthorizeResponse | (Error | OAuth2Error), params: {pkce?: PKCE, redirectUri?: string, source?: ResultSource}) => {\n if (response instanceof OAuth2Error) {\n setResult(response);\n } else if (response instanceof Error) {\n setResult(response);\n } else if (params.pkce && responseType === 'token') {\n let _redirectUri = params.redirectUri || defaultRedirectUri(props.redirectUri);\n if (!_redirectUri) throw new Error('redirectUri must be configured globally or per authentication component');\n\n await client.processResponse(response, {code_verifier: params.pkce.code_verifier, redirect_uri: _redirectUri}).then(response => {\n if (response?.code) setResult({code: response.code, state: response.state, source: params.source});\n else if (response?.id_token) {\n setResult({id_token: response.id_token, state: response.state, source: params.source});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n } else {\n if (response?.code) setResult({code: response.code, state: response.state, source: params.source});\n else if (response?.id_token) {\n setResult({id_token: response.id_token, state: response.state, source: params.source});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else if (response?.error) setResult(new OAuth2Error(response.error, response.error_description, response.state));\n else setResult(null);\n }\n\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }, [refreshPKCE, responseType, setResult, client, sessionStore, props.redirectUri]);\n\n const checkSession = useCallback(async () => {\n return client.checkSession({redirectUri: defaultRedirectUri(props.redirectUri)}).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) {\n setResult({id_token: response.id_token});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n }\n else setResult(null);\n });\n }, [sessionStore, client, props.redirectUri]);\n\n const logout = useCallback(async (params?: {redirectUri?: string, state?: string}) => {\n sessionStore?.removeItem(SESSION_KEY);\n await client.logout({\n redirectUri: params?.redirectUri ?? defaultRedirectUri(props.redirectUri),\n state: params?.state\n });\n }, [sessionStore, client, props.redirectUri]);\n\n const context = useMemo<CriiptoVerifyContextInterface>(() => {\n return {\n loginWithRedirect: async (params) => {\n const pkce = await refreshPKCE();\n await client.redirect.authorize(buildOptions({...params, pkce}));\n },\n loginWithPopup: async (params) => {\n return client.popup.authorize(buildOptions(params)).then(response => {\n if (response?.code) setResult({code: response.code});\n else if (response?.id_token) setResult({id_token: response.id_token});\n else setResult(null);\n }).catch((err: OAuth2Error) => {\n setResult(err);\n });\n },\n checkSession,\n logout,\n fetchOpenIDConfiguration: () => client.fetchOpenIDConfiguration(),\n buildAuthorizeUrl,\n generatePKCE: async () => {\n if (responseType !== 'token' || completionStrategy !== 'client') return;\n return await generatePKCE();\n },\n buildOptions,\n handleResponse,\n responseType,\n completionStrategy,\n result,\n claims,\n domain: client.domain,\n redirectUri: defaultRedirectUri(props.redirectUri),\n action,\n message,\n pkce,\n store: pkceStore,\n isLoading,\n isInitializing,\n acrValues: configuration ? filterAcrValues(configuration.acr_values_supported) : undefined,\n client,\n uiLocales,\n loginHint\n }\n }, [\n client,\n props.redirectUri,\n responseType,\n completionStrategy,\n result,\n claims,\n action,\n message,\n pkce,\n props.state,\n props.prompt,\n isLoading,\n isInitializing,\n handleResponse,\n logout,\n configuration,\n uiLocales,\n checkSession,\n loginHint\n ]);\n\n useEffect(() => {\n setIsInitializing(false);\n if (!client.redirect.hasMatch()) {\n refreshPKCE(); // Fresh request, setup PKCE\n return;\n }\n\n let isSubscribed = true;\n setIsLoading(true);\n\n const params = parseAuthorizeResponseFromLocation(window.location);\n if (params.code && responseType === 'code') {\n setIsLoading(false);\n setResult({code: params.code, source: 'redirect', state: params.state});\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n return;\n }\n \n (async () => {\n await Promise.resolve(); // wait for the initial cleanup in Strict mode - avoids double mutation\n if (!isSubscribed) return;\n\n try {\n const response = await client.redirect.match();\n if (!isSubscribed) return;\n\n if (response?.code) {\n setResult({code: response.code, source: 'redirect', state: response.state});\n }\n else if (response?.id_token) {\n setResult({id_token: response.id_token, source: 'redirect', state: response.state});\n sessionStore?.setItem(SESSION_KEY, response.id_token);\n resetRedirectState(window);\n }\n else setResult(null);\n } catch (err: any) {\n if (!isSubscribed) return;\n if (err instanceof OAuth2Error) {\n setResult(err);\n } else if (err instanceof Error) {\n setResult(err);\n } else {\n setResult(new Error(err?.toString() ?? 'Unknown error ocurred'));\n }\n } finally {\n if (!isSubscribed) return;\n setIsLoading(false);\n refreshPKCE(); // Clear out session storage and recreate PKCE values if being used\n }\n })();\n\n return () => {\n isSubscribed = false;\n };\n }, [props.pkce, responseType]);\n\n /*\n * Fetch claims from session store if available\n */\n useEffect(() => {\n if (!sessionStore || claims) return;\n if (!claims) {\n // No result available, fetch from session store\n const token = sessionStore.getItem(SESSION_KEY);\n if (!token) return;\n\n setResult({id_token: token});\n return;\n }\n }, [sessionStore, claims]);\n \n /*\n * Unset result if claims are expired\n */\n useEffect(() => {\n if (!claims) return;\n if (!sessionStore) return;\n\n const interval = setInterval(() => {\n const now = Date.now();\n if (claims.exp < (now / 1000)) {\n setResult(null);\n sessionStore?.removeItem(SESSION_KEY);\n return;\n }\n }, 5000);\n\n return () => clearInterval(interval);\n }, [sessionStore, claims, result]);\n\n /**\n * Fresh page load SSO check\n */\n useEffect(() => {\n setIsInitializing(false);\n if (!sessionStore) return;\n if (client.redirect.hasMatch()) return; // Do not issue SSO check if we're just being redirected back to\n if (sessionStore.getItem(SESSION_KEY)) return;\n let isSubscribed = true;\n\n setIsLoading(true);\n checkSession().catch(err => {\n console.error(\"session silent check error\", err);\n }).finally(() => {\n if (isSubscribed) setIsLoading(false);\n });\n\n return () => {\n isSubscribed = false\n };\n }, [sessionStore, client]);\n\n return (\n <CriiptoVerifyContext.Provider value={context}>\n {props.children}\n </CriiptoVerifyContext.Provider>\n );\n}\n\nexport default CriiptoVerifyProvider\n\nexport function resetRedirectState(window: Window) {\n const url = new URL(window.location.href);\n url.searchParams.delete('code');\n url.searchParams.delete('state');\n\n window.history.replaceState(\n {},\n window.document.title,\n url.pathname + url.search\n );\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"ua-parser-js\");","import UAParser from 'ua-parser-js';\n\nfunction testUA(userAgent: string, pattern: RegExp) {\n return pattern.test(navigator.userAgent);\n};\nexport function isiOS(userAgent: string) {\n return testUA(userAgent, /iPad|iPhone|iPod/) && !(window as any).MSStream;\n};\n\nexport function isiOSSafari(userAgent: string) {\n return isiOS(userAgent) && !testUA(userAgent, / CriOS\\/[.0-9]*/);\n};\n\nexport function isAndroid(userAgent: string) {\n return testUA(userAgent, /Android/);\n};\n\nexport type MobileOS = 'ios' | 'android';\n\nexport function getMobileOS(userAgent: string) : MobileOS | null {\n if (isiOS(userAgent)) return 'ios';\n if (isAndroid(userAgent)) return 'android';\n\n return null;\n}\n\nexport function getUserAgent(userAgent?: string) {\n if (!userAgent) return null;\n return UAParser(userAgent);\n}","import React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../../context';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement\n links: Links\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Desktop: Polling scenario\n */\nexport default function SEBankIDSameDevicePoll(props: Props) {\n const {links, onError, onComplete, onInitiate} = props;\n const [initiated, setInitiated] = useState(false);\n const {domain} = useContext(CriiptoVerifyContext);\n\n useEffect(() => {\n if (!initiated) return;\n let isSubscribed = true;\n let timeout : string | undefined;\n const poll = async () => {\n if (!isSubscribed) return;\n const response = await fetch(links.pollUrl);\n\n if (response.status === 202) {\n setTimeout(poll, 1000);\n return;\n } else if (response.status >= 400) {\n if (!isSubscribed) return;\n const error = await response.text();\n onError(error);\n return;\n } else {\n if (!isSubscribed) return;\n const {targetUrl} = await response.json();\n await onComplete(targetUrl);\n return;\n }\n };\n\n setTimeout(poll, 1000);\n return () => {\n isSubscribed = false;\n if (timeout) clearTimeout(timeout);\n };\n }, [initiated]);\n\n const handleInitiate = () => {\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props as any,\n onClick: handleInitiate\n });\n}","import React, { useState } from 'react';\nimport usePageVisibility from '../../hooks/usePageVisibility';\nimport {Links} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void\n}\n\n/*\n * Android + iOS Chrome: Background/Foreground scenario\n */\nexport default function SEBankIDSameDeviceForeground(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog} = props;\n const [initiated, setInitiated] = useState(false);\n\n usePageVisibility(async () => {\n onLog('ForegroundStrategy', 'onForeground', initiated.toString());\n if (!initiated) return;\n \n onComplete(links.completeUrl);\n }, [links, initiated]);\n\n const handleInitiate = () => {\n onLog('ForegroundStrategy', 'handleInitiate');\n onInitiate();\n setInitiated(true);\n };\n \n return React.cloneElement(props.children, {\n ...props.children.props as any,\n onClick: handleInitiate\n });\n}","import React, { useRef, useState, useEffect } from 'react';\n\nexport default function usePageVisibility(onVisible? : () => void, deps : React.DependencyList = []) {\n const visibilityState = useRef(document.visibilityState);\n const [state, setState] = useState(visibilityState.current);\n\n useEffect(() => {\n document.addEventListener('visibilitychange', _handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', _handleVisibilityChange);\n };\n }, deps);\n\n const _handleVisibilityChange = () => {\n const nextState = document.visibilityState;\n if (\n visibilityState.current === 'hidden' &&\n nextState === 'visible'\n ) {\n if (onVisible) onVisible();\n }\n\n visibilityState.current = nextState;\n setState(visibilityState.current);\n };\n\n return state;\n}","import { PKCE } from \"@criipto/auth-js\"\nimport { createMemoryStorage } from \"../../memory-storage\"\nimport { trySessionStorage } from \"../../utils\"\n\nexport interface Links {\n cancelUrl: string\n completeUrl: string\n pollUrl: string\n launchLinks: {\n customFileHandlerUrl: string\n universalLink: string\n }\n};\n\nexport interface State {\n pkce: PKCE | undefined\n redirectUri: string\n links: Links\n}\n\nconst STATE_KEY = '@criipto/verify-react:sebankid:state';\n\nconst stateStore = (() => {\n const sessionStorage = trySessionStorage();\n if (sessionStorage === null) {\n console.warn('Creating memory store for PKCE values as no sessionStorage is available. Authentication may be broken.');\n return createMemoryStorage();\n }\n return sessionStorage;\n})();\n\nexport function hydrateState() : State | undefined {\n const rawState = stateStore.getItem(STATE_KEY);\n if (rawState) {\n return JSON.parse(rawState) as State;\n }\n\n return undefined;\n}\n\nexport const autoHydratedState = hydrateState();\n\nexport function clearState() {\n stateStore.removeItem(STATE_KEY);\n}\n\nexport function saveState(input: State) : void {\n stateStore.setItem(STATE_KEY, JSON.stringify(input));\n}","import { PKCE } from '@criipto/auth-js';\nimport React, { useEffect, useState } from 'react';\nimport {Links, saveState, hydrateState, clearState} from './shared';\n\ninterface Props {\n children: React.ReactElement,\n links: Links,\n onError: (error: string) => void\n onComplete: (completeUrl: string) => Promise<void>\n onInitiate: () => void\n onLog: (...statements: string[]) => void,\n pkce: PKCE | undefined,\n redirectUri: string\n}\n\n/*\n * iOS Safari: Page reload on switch back scenario\n */\n\nexport default function SEBankIDSameDeviceReload(props: Props) {\n const {links, onError, onComplete, onInitiate, onLog, pkce, redirectUri} = props;\n\n const handleInitiate = () => {\n onLog('ReloadStrategy', 'handleInitiate');\n\n saveState({\n links,\n redirectUri,\n pkce\n });\n\n onInitiate();\n };\n\n useEffect(() => {\n const hydratedState = hydrateState();\n if (!hydratedState) return;\n clearState();\n onComplete(hydratedState.links.completeUrl);\n }, []);\n \n return React.cloneElement(props.children, {\n ...props.children.props as any,\n onClick: handleInitiate\n });\n}","import { PKCE, AuthorizeResponse } from '@criipto/auth-js';\nimport React, {useCallback, useContext, useEffect, useMemo, useState} from 'react';\nimport CriiptoVerifyContext from '../context';\nimport { getUserAgent } from '../device';\n\nimport PollStrategy from './SEBankIDSameDeviceButton/Poll';\nimport ForegroundStrategy from './SEBankIDSameDeviceButton/Foreground';\nimport ReloadStrategy from './SEBankIDSameDeviceButton/Reload';\n\nimport {autoHydratedState, Links} from './SEBankIDSameDeviceButton/shared';\n\ninterface Props {\n className: string\n children: React.ReactNode\n logo: React.ReactNode\n fallback: React.ReactElement\n redirectUri?: string\n userAgent?: string\n}\n\nfunction searchParamsToPOJO(input: URLSearchParams) {\n return Array.from(input.keys()).reduce((memo : {[key: string]: string}, key) => {\n memo[key] = input.get(key)!;\n return memo;\n }, {});\n}\n\ntype Resume = 'Foreground' | 'Reload' | 'Poll'\ntype LinkType = 'universal' | 'scheme';\nexport function determineStrategy(input: string | undefined, loginHint?: string) : {\n resume: Resume\n linkType: LinkType,\n redirect: boolean\n} {\n const userAgent = getUserAgent(input);\n const mobileOS = \n userAgent?.os.name === 'iOS' ? 'iOS' :\n userAgent?.os.name === 'Android' ? 'android' :\n userAgent?.browser.name === 'Samsung Internet' ? 'android' :\n null;\n const iOSSafari = mobileOS === 'iOS' && userAgent?.browser.name?.includes('Safari') ? true : false;\n const androidChrome = mobileOS === 'android' && userAgent?.browser.name === 'Chrome' ? true : false;\n const redirect = iOSSafari && !loginHint?.includes('appswitch:resumeUrl:disable');\n\n const resume : Resume =\n mobileOS ?\n (iOSSafari && redirect) ? 'Reload' : 'Foreground'\n : 'Poll';\n\n const linkType = \n (mobileOS === 'iOS' || androidChrome) ? 'universal' :\n 'scheme'\n\n return {resume, linkType, redirect};\n}\n\nexport class NotDoneError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotDoneError\";\n }\n}\n\nasync function fetchComplete(completeUrl: string) {\n const completeResponse = await fetch(completeUrl);\n if (completeResponse.status >= 400) {\n const errorMessage = await completeResponse.text();\n const notDone = errorMessage.includes(\"Native-app driven authentication is not done\");\n if (notDone) return new NotDoneError(errorMessage);\n return new Error(errorMessage);\n }\n \n const {location} : {location: string} = await completeResponse.json();\n return {location};\n}\nexport default function SEBankIDSameDeviceButton(props: Props) {\n const {loginHint} = useContext(CriiptoVerifyContext);\n const rawUserAgent = typeof navigator !== 'undefined' ? navigator.userAgent : props.userAgent;\n const strategy = useMemo(() => determineStrategy(\n rawUserAgent,\n loginHint\n ), [rawUserAgent, loginHint]);\n\n const [href, setHref] = useState<null | string>();\n const [links, setLinks] = useState<Links | null>(autoHydratedState?.links ?? null);\n const [pkce, setPKCE] = useState<PKCE | undefined>(autoHydratedState?.pkce ?? undefined);\n const [error, setError] = useState<string | null>(null);\n const [log, setLog] = useState<(string | string[])[]>([]);\n const [initiated, setInitiated] = useState(autoHydratedState ? true : false);\n const {buildAuthorizeUrl, completionStrategy, generatePKCE, handleResponse, redirectUri: defaultRedirectURi, domain} = useContext(CriiptoVerifyContext);\n const redirectUri = props.redirectUri || defaultRedirectURi;\n\n const reset = () => {\n setPKCE(undefined);\n setLinks(null);\n };\n\n const handleLog = (...statements: string[]) => {\n setLog(logs => logs.concat([statements]));\n }\n\n const handleComplete = useCallback(async (completeUrl: string) => {\n const required = {pkce};\n reset();\n\n const result = completeUrl.startsWith(`https://${domain}`) || completeUrl.startsWith(`http://${domain}`) ? await fetchComplete(completeUrl) : {\n location: completeUrl\n }\n if (result instanceof NotDoneError && strategy.resume === 'Reload') {\n await handleResponse({\n error: 'access_denied'\n }, {\n pkce: required.pkce,\n redirectUri,\n source: 'SEBankIDSameDeviceButton'\n });\n return;\n }\n if (result instanceof Error) {\n setError(result.message);\n return;\n }\n const {location} = result;\n if (completionStrategy === 'openidprovider') {\n window.location.href = location;\n return;\n }\n const url = new URL(location);\n const params = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n\n await handleResponse(params, {\n pkce: required.pkce,\n redirectUri,\n source: 'SEBankIDSameDeviceButton'\n });\n }, [completionStrategy, pkce, domain, strategy]);\n\n const refresh = useCallback(async () => {\n handleLog('SEBankID: Refresh authorize url');\n const pkce = await generatePKCE();\n\n buildAuthorizeUrl({\n acrValues: 'urn:grn:authn:se:bankid:same-device',\n loginHint: 'appswitch:browser',\n responseMode: 'json',\n pkce,\n redirectUri,\n prompt: 'login' // Triggering SSO at this point would be a mistake\n }).then(url => {\n return fetch(url).then(response => response.json() as Promise<Links>);\n })\n .then(links => {\n setPKCE(pkce || undefined);\n setLinks(links);\n\n const redirect = strategy.redirect ? window.location.href : 'null';\n const newUrl = new URL(strategy.linkType === 'universal' ? links.launchLinks.universalLink : links.launchLinks.customFileHandlerUrl);\n newUrl.searchParams.set('redirect', redirect);\n const newHref = newUrl.href;\n\n handleLog(window.location.href);\n handleLog(newHref);\n setHref(newHref);\n })\n .catch(err => {\n setInitiated(false);\n });\n }, [buildAuthorizeUrl, redirectUri, strategy]);\n\n // Generate URL on first button render\n useEffect(() => {\n if (initiated) return;\n refresh();\n }, [refresh, initiated]);\n\n // Continously fetch new autostart token if UI is open for a long time\n useEffect(() => {\n if (initiated) return;\n\n const interval = setInterval(() => {\n if (initiated) return;\n refresh();\n }, 25000);\n return () => clearInterval(interval);\n }, [refresh, initiated]);\n\n // Track when the button is clicked to stop refreshing URL\n const handleInitiate = () => {\n handleLog('Initiated');\n setInitiated(true);\n setError(null);\n }\n\n const handleError = async (error: string) => {\n setInitiated(false);\n setError(error);\n\n if (error === 'access_denied' || error === '\"access_denied\"') {\n await handleResponse({\n error: 'access_denied'\n }, {\n pkce,\n redirectUri,\n source: 'SEBankIDSameDeviceButton'\n });\n }\n }\n\n const element = href ? (\n <a className={`${props.className} ${initiated ? 'criipto-eid-btn--disabled' : ''}`} href={href} onClick={handleInitiate}>\n {initiated ? (\n <div className=\"criipto-eid-logo\">\n <div className=\"criipto-eid-loader\"></div>\n </div>\n ) : props.logo}\n {props.children}\n </a>\n ) : props.fallback;\n\n return (\n <React.Fragment>\n {links ? (\n <React.Fragment>\n {strategy.resume === \"Poll\" ? (\n <PollStrategy\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </PollStrategy>\n ) : strategy.resume === 'Foreground' ? (\n <ForegroundStrategy\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n >\n {element}\n </ForegroundStrategy>\n ) : strategy.resume === 'Reload' ? (\n <ReloadStrategy\n links={links}\n onError={handleError}\n onComplete={handleComplete}\n onInitiate={handleInitiate}\n onLog={handleLog}\n redirectUri={redirectUri!}\n pkce={pkce}\n >\n {element}\n </ReloadStrategy>\n ) : element}\n </React.Fragment>\n ) : element}\n {error && <p>{error}</p>}\n {/* {log && (\n <pre>\n {JSON.stringify(log, null, 2)}\n </pre>\n )} */}\n </React.Fragment>\n )\n}","import React from 'react';\nimport beeid from './logos/beeid@2x.png';\nimport digid from './logos/nldigid@2x.png';\nimport dkmitid from './logos/dkmitid@2x.png';\nimport dknemid from './logos/dknemid@2x.png';\nimport ftnmobile from './logos/ftnmobile@2x.png';\nimport itsme from './logos/itsme@2x.png';\nimport nobankid from './logos/nobankid@2x.png';\nimport novipps from './logos/novipps@2x.png';\nimport sebankid from './logos/sebankid@2x.png';\nimport sofort from './logos/sofort@2x.png';\n\nexport interface AuthMethodButtonLogoProps {\n acrValue: string\n /**\n * base64 image string, e.x. data:image/png;base64,\n * or a ReactElement\n */\n logo?: React.ReactElement | string\n}\nexport default function AuthMethodButtonLogo(props: AuthMethodButtonLogoProps) {\n const logo =\n typeof props.logo === \"string\" ? <img src={props.logo} alt=\"\" /> :\n props.logo ?? (acrValueToLogo(props.acrValue) ? <img src={acrValueToLogo(props.acrValue)} alt=\"\" /> : <span> </span>);\n\n if (logo) return <div className=\"criipto-eid-logo\">{logo}</div>\n return null;\n}\n\nfunction acrValueToLogo(value : string) {\n if (value.startsWith('urn:grn:authn:be:eid')) {\n return beeid;\n }\n if (value.startsWith('urn:grn:authn:nl:digid')) {\n return digid;\n }\n if (value.startsWith('urn:grn:authn:dk:mitid')) {\n return dkmitid;\n }\n if (value.startsWith('urn:grn:authn:dk:nemid')) {\n return dknemid;\n }\n if (value.startsWith('urn:grn:authn:fi:mobile')) {\n return ftnmobile;\n }\n if (value.startsWith('urn:grn:authn:itsme')) {\n return itsme;\n }\n if (value.startsWith('urn:grn:authn:se:bankid')) {\n return sebankid;\n }\n if (value.startsWith('urn:grn:authn:de:sofort')) {\n return sofort;\n }\n if (value.startsWith('urn:grn:authn:no:bankid')) {\n return nobankid;\n }\n if (value.startsWith('urn:grn:authn:no:vipps')) {\n return novipps;\n }\n}","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAAA8CAYAAADGxTD9AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUPSURBVHgB7Zztcds4EIZf3dz/Uwm8Cs6pIHQFl1QQuYI4FViuQE4FUiqIU4GZCuxUIHYQpQJk14AShiZAEaBECNhnBkNHJD4CLoDF7oKAIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAhCOswgHA2lVEmXC/PP+9lsViNCqJ1zupSUCkr8d03pidr7BCFPSChW6iU3iAgWXEobSt9VN4+U3sAT5ea7Kf+B0h2lazPgB3H2MzB3gOXWF5pB7jBOHe/p0vUid1TH247nF3RZd5eGt5TnHhNDbeSV4TP0rNvHktp8i4GwlGI4O0rcP5+ozgqp0zPCCwTCZTjq2FryPDryxCC8hbLPujYGrx4qnK3Sk4GVFGZg1yivaBRfIqz8R/zWY9vUVP6/HXlYsAsMbJPSy/XcUk+Fkehpn4vLIe3oeTdD2FC6jXUPEcQBo3gBTzhvT9m2GfjBkWftqM+W7wEjwYNE+TOoHWpctqpjRf0L6cObqfnQTKazfDddNn1x57h3Krw3ZcSFT1+OREHpoS3EOQgwd/gaw1nCb5mFWWZ5c1c3fubfLiNYBv+DP9yXBaajgBbiX4MoBwFmeNksD31YabXjHQJgS4PRj58T672R2FVDZ9CpZuA9BRorYy4CzKwPWf4CVYcX8Iyb5OZjWq73qsTfyIcCWjA/9Dy3ROAyaQZK52BpCrPruRbzrg2M58D4irD/XyzeuWuTzhs1nNJRVqmGsfUopwyor7fuA/orpM4prRBt2I49z0mF2LNWdlXCZ7N3VpgNZg0/+lavU8Lv8E3KAryz/F6gY+lR2tNUIA/YQrIbmOc2wuCei5QF+CPs+tqN0rEAzyitXy4tz26gTWDJYATxCocL8UfKs0R8vE5dhbhy3Fs1/rbpdjWmdzwcBRNQ9IrSJ8djNaUrejbWzdI8aSsEzzQ0u7Letuq4zZsZfjH/wK46PPvf1Wgu/Rftq6jsZiwFR4d1xV1UcA9G3/prurC7fAkdD8x1c398g44HrhA3RfJmNA6ppBf0P/QLasN6r21Dt6G8GxyZllltd8hzR2rDBmdILlYIm75nE94aiaoOqZGFI8OoASyQqwOzpBm6Z8FsYttOld0ZHCnaZeOJ61ElmpxEdZgS9fsMHPeHLQYZRvevKH1BnGf6nnJzZPSZjmokrjoofTyKvXi8YVyg35VdQq9cW8q7ViOcchmRH1kJsJlBXAKarOqg9DEiNhfewT+ibEHp0VhvYuA+O1eyOehZddxKVnUwsyYLb4lwWPhXKo4T1lWOsRBMW5Wokajq0BDeAuOynHgm5rOFdZYC3KFKpGx1WOJ4MR43E+rEHCqQVUD7HzRUiZRVhxKBJ0t68D2uFcr9/tsaOQW0dzG6ezaQH5bfL+DHKfRUdsmXJ3Q712iEdWY7AzMRHvexmfjmTROWsShcu5Zvc6/EaQg56TyUD813lrUAR4jL87WAtsWyd4HtuGybLRzPn3KDdUw1ZQ8P7qtZ67NcIsBxMabr9jVOx1x5fJhvADX0Jwk27RsiwBFh9MgK4+CrN8dU3/5DMK9scRm5b+JihDeWQXbbI8+GNkI+mNKGBZfNZHckuM5TIyLAkWEi5/jjf0v465a+ruIQCvhTQ6tPfOR/UCB9Cl+nLC23RrMwmPNzXULRGXJoor1sS+pT36zSKKfAnycl9jhPTJh8BU7Li77oWQl2Jk8NQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRDOn5/MSF1nx1OpJAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAA8CAYAAAApB1vDAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATiSURBVHgB7Z3vceM2EMVXmXyPU8ExFZxSQZgO3MExFcQdSKnglArkDu5SgZQKrKuAdAXnDl6AA5iT4YX4R6REge83s5ZISiA8fFouFiCwEEJaAODOvCy9vTeWebvzVlN5ezH2xdjB2H6xWLwIIZfGCtfYg7Gdsa84jydjG2OZEDI2Rmi5sU8DCDfGzlghhAyNF+8Ol6McQswLIbMHLt5dGXto+ZVKXKxr49zn4Jgt6524eHkp7aiM/W7i5koI6Yr3vk1hgz2+tV7TC75t2Xe+/I33uk2shJAuGNF8bBDVzth9F+E2nM8K+rHhnPdCSBPeQ+4axJvLSJiys4iYi+M6CiEaXsCHiHht2NA2Lh6iLlbMpSLgFVxKjkImr2kQ8A5XyuGa8y6P3q+O6kQhk9fA5X41NjIBAgHXfBZCLBGBWNYyASL1K8EePmKBS43dtIDBHr75gteNp1sV8NbvL4TMD+iprJ1MgI4CttjsCRt6c8Jc8GWTSK5Yt1ULAT8on1kLmQ/QOzQKuTJo2YiDSwlqXeKZkPSB6+INeZIrg45ZCOt5lc9PIiVIRgZ6LJzLFUHPNBreNkwZG6cOXEYi5KqNOZyRB4YeG1+se5xcAeh54aJjGbkXWW1P6BmL4syODOix8SQyLGQk8LZBV0pHMFBmAwP1xMGNSQ5hSJEi3muFbKUH0BtVJdp70NU53w/K0hqqhZD0iFzs3gPN+woZA4+FgB5S9PpxkokTEV3n2y5cOJGdKLNEPC22OvV59MySYIAwidwA5sJ+HuJC43vDLvPbrYTcQsD2eK9GGZS4WEh6KN6qr2ByRYDrFgJtc7xvnQql/ExIWuBtx0DfRl0eEWJMyB9bCvgcEWvxfi4kLZSLvJYeKILZHh3ThHxKwFlwrK+IM+U89z8IIR1ZLBZr8/LXiY9UcrnJUO4oYtKLE0Ku5MKz+VDEpDeKkCsZV8BaqrD6UUhqVOLmQat5JyNihQyX6fog43tgNd9NT5we4WTWP8vIeI/86wVCiEzZ90IRp8eXYPu9XIALzQS/VM57oIjT4xBs27RUKqO9wh/kt/+VIk6Pg7IvlzQIPTFFnChJitj3zIV3lH/tH4o4MXxsug92f5Dbp1D27e0fijhN/gm27xIYY/BbsH2osyEUcZo8KvtudikBuCc4smD33/UbLjyTKH6QTR7stp0R+xZfr2dqP25IVX3zwEpZLzY11uH7dkx0Fuz+hQvVJA70YYs394Qw9DHEfCxpLkCfxupmFnZBfEbPTMg8iHjjm5k9B/osRvTCcwP6EgeTDytMHf9U6l3SC88Qf0vWZpacbLYC+sQtlkLIPEF8uYPJCRnxOJhhxNyBPg3UpIR8QsAlwwjyDcRXEb26kBFfY/orBUz+B24qqDIi5E/XEgv0Rlwt4KUQcsyJW3Z92y7kQvi67Chg0hnvkZ8QZzemV/bnX504PwVM2oF4Y+9YzIP18MHFvRvosW/NAYyBSRfg0m9lg5jt8a0VNDr29nnhrhAPG47ZoEdvIkexEfGeby3tB8/bEWiVsWdxT1fXlol7+uIncaPW6u0mKmN/tB1hR0gUuJ6yNh5zKGxYwQVkyPDAhQCPGI8d3IpIXHODjAtcCqzAMN65hIt5cxkYxsSkFfj+dEYubv4Hu53J2ycu6vjYxs3P/nU/5lMY/wG766+yI/P2vAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALEAAAA8CAYAAAApB1vDAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYESURBVHgB7Z2BdeI4EIYn964AroLTVnBcBetUsGwF4So4OsCpINkKyFYQrgJ7KwhXgd1BshXMapCIjSzZshGGyPO9p0dsDYb38jOMZkbmBhgmEIiYyIe5HH/VTv+UYydHfnNzUwLDXBNStEKOlRzPcrxiN5kcS2CYSyEFOCMRyrHxFK2LDX0AIBA3wDAOSLSgwoOFHJ/136Eo5bgNEWKwiJkjdFxLgk30OCclBBAyi3jiaG+7hEq4MxiXEgJ5ZGZi6Ph2fWJsG4oCT4iR2RNPEFQhwzOM73XbKGGgR/4NmEkhBXwnHzK4LgETQo5siEdmTzwhpEAoy/BsmXqT47t+JJELuBwlcIzM2EBVmCgcMem8ZjdrsRuLAgPmkZlIkKJ4cgnGYpta7Db6PI0XPD8F1j5czMRB5YVdvFrsTcFnxvwMx4EyJ51C5oXdNFi0zJEgHw4HqOLmuxZ7kPHqG4wDLT6zLiHzwm4CaE+aeJiSOG1ZC+pAuzWu+QhqEfYvNBeCdD6vHdP8HIZnROh90WJvB8z0CPTVn3W8Rqbtdqhy0C47ah4qcBheoQUTISQqD3EI4zkvPUW80uLs9LSo4vOhVUKrkDkmjp9Fx/ybJSfbN+YlYd2bsbIW7JGw9Wt9g2EcYmRRP8kijp/PcEZQhQ9f5Nga51fygdJ35D3XxtMEDIeEfFSw+R2YaNEe6yxxJH23g1rACTq2ZCzqHphyy7RNaavtv8BpzOX1UvmaKTBxg2oh1YWt2JFhR0xsuc7c8frPeB7Iw+8/KBxOxE0C42GGDOSdn+T4Kv/8Q45/QHnuUBx2nbCII+es8bDBQntdYU5QqKEF/Uke3kM49kUZFnGk6K93AeNCmZACVZ9FYjPQcezQ7IQJe+LISWA4P+E0lqBSYQdBC2M+hTBwTBw5p2QAcuP4u6cNxb6favYClKCP4uWAvRcCmHhB/6rYq+P5VOlLsbuM3LBBVere1rIIC2NeYBgKYOIEu0vNJgsYEfRL/fmwT/1xOBEnfUX5gB07KdCjL8IH/TprCMP/wMQJNosVPuzLwzYxo/LsO31d4XjNRD9/aRM8VrfACnmLgISuzf3EkaEF9AqnQX27h8XXe1HBMU8IaC6ycv1Y6ucLCLzDWi4Q9/plEUcGunc094EEajagJw67EipBdzW+53L8gOpDQLYCVCYlgX40GvWZSJAifsThbNCRjUCVUahf+xHtYQP1FpshQyND4bh+gf6sgIkTHBYPE0vP66ddApLzc6yEXKDn9ntUcbPvTmre5RErA0WcQmCw2vafWOZoEbh0zPns/OD8cMwMFLGwXIeEtsIWL4pVQWRhmSOvurGcX5uCRCMswe6QaANMvKD7JikubL3CG8MmsdisDZuVxWZuHLuKMKmn3YFl3Z53dsQHrfzvetgfFQy0YJeGDV0vN86ZoqUCxmP9hGWLPXncJ2hSGsc7aCcHJl6wf19CajzfVhL22dmBEJCW9/ti2nLZOTL0buIcPjDYns34YZ7gcCJOaPdEAleGDlUSD9O2nPLWPMEijhDpjXMpGPpnj9qdZiLfw8zSO+xq/qE4+FDBa6MRL3M4ES+hN2YOIakf0IcLmqHO4T5rf+s9eG1bl3JbQz2LOFL0P5t6C0q4HHdmfKv7HegD9k2PWy3uA9uW6/1nO8nhRMTQIk+KiERD2QUB47O/Ww+9h7oHpZ3PLc8RLXNdqTcmVrC9uWZj2D5YbN5vVKJt5o5rJTWb+s8mvKBH/4S0WaC75Hxqeynz0ekQ8hqrpnYXGVY9D4XDptDzC2yWv0mcG2xW8eh9rbC7XO4MM7ifeEKg8oaXCi1O5asMQ6xCZhFPjA8q5FJnLqxwdmJi6IrepbMWfWndwcEiniAfTMj3/MOMjBPsvyVobFJgmC7wOoVMmQzeQ8f4g9cl5Ax7/iQuZyeYPXjZrEUOqsVyO+S36ljEzDsjCrkE1QeRg6Oph2EGg+cJLQ7VOustrhgmOKj6Hk65CQuJNkNVTub7QzCXA5VXfvIULok2xZb7GZ8LjomZTrD6PbxEjj9BtViWoH4WIYcLx7W/AMp83Fcu9SMGAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAAA8CAYAAADGxTD9AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAkLSURBVHgB7Z3/deM2Esdn793/p6sguAriDsJUcO5gmQqiq8C6ClapQL4K7K2ASgX2VQBtBXIq+IawBksQwk+SsuWX+bzHxzUxGAyoIX4MQC6RIAiCIAiCIAiCIAjChwNA0x9dfxxxQvfHrj9UpY4HzqtZX0uCcEl6J7vDGO39WxXo+II4XX+sSBCWxjin42hb62h8/ck6YEZH6+hYGx18tM7DsCFBWBp2uKCT8pDAskro6FjmS0LHkQTB4W+0DNYxD37Cp0+f9v3phf9sQpl5eGHTfguIvHjlCMIrSznwgc83kfSvfG4i6fb6c+/wh0C61bsnQXBY2oFjLeSez/+OpH/m8++R9IbP/ydBWBpvErcKpK+cdJVIu4notxPBWxKESxBzUCddc3rrXbfRB12gOzZEEf6iLDWEMBz4nBsH/+Rdv/XSR5gIBP/zpR8fP5MgOFzCgXPj4MZe4OGGHRc/RvLZB0KcVzhjSQf+xudYC7zns3KGGbb1PXC4LUTDZ5nACWf8nZbjwOd/hBJ7B33pHde0osbBjeNuaXDgPcX5oUCmCG7xTZk/sR22tzBx5gOdhjH7SCjv3WH7jd2KD8P9tdr7oXAmY08JmS3L7LzoQxORj0YvJtj3K4ZNRjl2c8tbEpxvkkLu3gmVmAgB39BjQub7knB/3CIffZi9hMwPQYd69DU4MdIbnD6MA/Nv6R/XE1VCJhbMMm6L2vF5l9C5sbI03a4HTEfjHXfA9WU/F9jY0JXj+YbLjmay2CTOG4etIjJmrLnnPxs+/4/i2Cf0d5oATjHnOYsfdsz55vS23/WnH0l4OzAsVtwmZDZuC1eor6F59vg8uzpx6s582R3eaQiRaLEspldp2e6r3+B0yRZ4jkFbeG9N9McjG7ZO5G1KKoCCIUmBjSE04quFHR8NvSMYJrvFtl8zid9i8tBwjjFm8pWbzW8T+VdO/iZTjuGJJoDxg/K+N60SxCedDX1AkO5RFM2gKg7MhZlW07SIZt/uhuO7DV9XLKpiOlj+ZyOTWLwwNHz+RstykS6X743ZVXdD4xjzgepjzKFx9yFzv2J2GTtaOo99H2rtwmlOoejcrnunnB9Z5rf++iPl6Yw/vEksG8ObFzqQppyWdVKr6enrWNd6Yv5V4qnfYaGuGKfwYYdydrmyI/m6QP1UQoe6gF1dyC6c7oH2rreeLSXlN7jkEKlXfm8Li6TfOgY1XppCRewPBcOMAh1d5qbZyZCiCeC0ODIFjfREN0SHk9PeYewsKmJX6aKNi8mzrryfGuGyWidfiQN/hy4Fhha4ZLVN43TDYzfT7PHdsc7RbBrDosisyrh6CtBsuyrUfYf5rCO6Y/bpwHV1AbvuInZ1FTpaJ9/VOLA7AfuSkLEb0LVjl7n2gPiSqJXZYVh8mD3hwvht51J2SHfPuZb3iLjD+TQB/TWoirrOtatDOa2T730dGEPXdcxV0jH4GKqMI2NaRzPk2CLu1EdOK24ZE/Zo1GHK/lxQNxeN897E/zTAWZ5AGTWogjqa67e1dsELX6LMgU0+0wA13j0LsccwLP0OLQlXVHsG2r/ND6ki+exQomQmavP4Tu0zaULn6G9Rvy/i1tNxH5HTSH82IOVgfhklaDgfe0G89TVyaqJda0+2Q5zR4lCgjBA7J90MJV97aFoSDD+Yxri7Sn6wxMm3pRng1KK5TtPQTPiG3bJejTTmIXVbrqeInCoot0Hih3TkUnQId++XsMuPfHQROY38w5ut90VAJBqAcVe6DuSLfuxkoh33S+rzdPsPiU/LcquSHzpTVmj4oT2ZGA8JvSGKw5kIP8hHT6aLlNNkdL+rA1tUIK2NVQLjCd8O8/fzNqGbuiSI71xzu7poemEZOpC/1IFVQm+ImuFbF1JQKxPRfTEHLtmNtufzr36CWYGh4Us6O/cG884zu4us7Q+NYYD/GjqjOp75nAzgz+Rr5Po/+fwSSVdUztSVwClvivxQIasC117osii6NBiPj+4C6e4kz5zNBGzjPa3GaWNjtI7zmDHpTcYWi6L6OmTzID4R2jkyOpB+xLyx5qMnF7xPGd1zxsA3JWViYgvMeWNRpsvvpsN4C2To43umi3iMGNg6csbZbZQhdsM1wh9Hcbuh4kpjiNkavU1GNmbTxpGJ7RTLOVhqtt96slP0byL5npCeYK0q7OpCQlQA4uNnY5/K5DX3zt39+IDaXhjjXWgPCDuZeZJtOOTVuIiuBuMn8sgVeYrdcEwYAyO8KrXD+Xi9QTpEpBxZlZDTCEcIGsyPA+cc2J1zLGIXzlf5upAgFYB472PL2mJ41Wjl3W8dyddQDTg56DFWQRrfTIvy0tz9El2pERi696IZP/LvktlVqdyegV1A9zqTR2PYW5zT3wb0h8jW+w3s6kKCVAjKY/DKybNNyNVHpFDw5XVEunuMn6YNVYDKuDLiXWoNGvGH9B7z2UR0hyh9cJeo9yaiuwsJUyEoXxFVuTJry05VQsOZfOHU+gb3MsDZ6EOVoOB1pUAe0yJN2ZVl66Uy+uc4S2rXV4iaWPOl7OpCGagClG3zVIV1mdQCWye0G3O+K8NpfGkd5mxmjmGS1FIFGM+Sq2atfMNqW8ttaTk4DYl0he4O5dGWUT6qAOE9ujm7mozOLpSRJoD0sr5y5GKTzFf/+kSVcCXNzTQxwn/1h3liP9M4prfvj1/8uCVOEzDjGD/XvF3Q57vnMr72+YpbYE+HotMbyuZbbO6bCQZTFxNnNnHge45h1+pvaHgj4Sag28TE9yX1RjjA/63Pu6Fl7TqwXY+Fdq0p8KZ0n/cXmgj/LvYtFoOJXf/H/Q1YZsNlm99t3x//nfwWBwLjWARmkIF8dpNOTRjMHU83JAhzwRARKArgzyzLdv9X/zKm8IHAMH7RwGVWUzCO4yoShKXA+RKyogXBOI47ax+wIATBOK5nzi3NhMfRz+K8wpvATuxuQ+ww4T9jwflyrpZJm5CjOowWg1tfs1tN8aUDDeEjc36h8fY8+6FmExoxDu9+bNps0dxOCWcJwiww7b0z23JvIP+ht1DBYi2wD8YBahOcVp7IoT/+oFPr/CitrSAIgiAIgiAIgiAIgnC9/Ak8o14wg+hVkQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAAA8CAYAAADGxTD9AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAX0SURBVHgB7Zz/dds2EMfPff2/ygRFJogyQdkJ4k5gdoI6E0iZwOoEUiZwMgHVCexOQHUCZYMrEIAxQ9/hhyjHFvX9vIcnGwRwJHg4HHCQiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAZFwQmATPP7MelTcamX236z6Z7ly4uLnZ0RKws05P1S0/W1sr6QgcQ7n8e0puQ/WTP8GKxHdGwTJ1Zf6XUX9MzYOUulfsx4fo88szf7r0rn5C1kSr3rlfHktVrc2bTwqb9Mds9WexDXisd0GTWb5X6hp4BjiiwTX9xPk5BLhOyVAVmr2S5tDbNM57NsN7f2jNc0ZRhP6K10TxL1J0r9bKU/ylgXYFv+DCuIrI2Sp0Fl+PewTwiq1R5+1RdOz/RxAg+2Eflck1xtOsfaSTsB5abHdac6c4kqOkwnItkqIwlleOMxS3rRmNJ3oc+hDUnjNFJw95Xk2gS9VqhTksjCco7bPsu5yWwboG/u0f2vnsd0obj1q1RZG0yZDXsB2IdPlN1bgQ5hvXnqMN1l6pI+0uaMqwvNmZKeU3pRy/ewkuRuM6om1LgpVLPKcBtpF4l1Ekp43VEVqvUca7EbFD+Uijn6hvK77+9uzY5F6LHZyW/Lsz/QOOplPw3NI4P1mVaShfctpNNf5DfhpKILugE3tv2Vpos+/HWpp1w2SlvPciTfOMv2laZzd8IbbtZbT5lBd7YJO1JvlPK/ybkbY+0/6gp0T90ODtNeQe8V/LfUZmsVaxAWHv8qVyuBv9L78UtoGM7F24d8neQ4QbLKyvznqYM63u6wylNcx9qOgIs+8Atj/OBs10bznSnWHch6gJZ0g5QOyij9ffX5wrXsxZpU7bAjk9K/tCXq4UyuzB1jcZZJ5tek7ceG/JW8e2hUavA54Ky/yr5uSv5Eksn3Zfp/2Ofe0uyu+GobXKLzH0Y5E0YxBWdIyxbn2ZQppUsAb0AWLfAVUEbdU4brFvg7C0rTkQOe+ViVlij5cFsMHUL7JAsQsUPodiK5P3IYyzenpId/SBGzhRam1vSfWYNQ34PeNFlnIMCb0heNNSDzz7i4o196Lab2pJbYE+MKSirWdAsxeSywIcoS+rP4KI516o0UOSs/NddlMkrcCQy14VUpd2HR+XDS3QrcfeC3N83fCS/LEynbs92XaAsybMGPYySv6Nx9SWkrUF1oITtvtr++cqm38mvD9zaJeV3L+hcYN3fWkh+ltLGXPHJDI2AHx/IGfrnmk+ZfT6DMyOMrPvAq0w52jmUJlLHxPqQvf/eKvdl6FxgeTEndfY60kYrlM8KCSvtiYeHBmVikTiTIUNbwH0SymoK/CiapsjSTsetemWcMVmHfuv6f51oVws9V3QusH7McoiJtKFZ8jsutAash19zLXAnd3aADEctlN9EZOUomXYKsOqVE8PCnD4p2MbanTwcP2bZkZyWWVeolvMPzV8p9+LyTKa8DnHwsB9srXavyn1tErJuFVmXrPftMIgxU8o1rJ+FuFTqGDonWI/MddSZ7cRedMPeygyjXLPwIpoS+Zx3Gq2Tu+aH6ZlL5GQ8lyYrZRTqAjltaLN/2q1Ryt7RucHxzfOiY5Oc97K7Lbc2o+xSkZOrwLncj3ymElaKHCm0XkpN5wjrI7o48sbHUa597GVEZCy4nJbjPr6mwIc8Z3QbjP0CtuXDyNoVmSSsL+YMHQDHt3lSNCm5HP9OnJOdmsL7slILJVGBE/chseK8XQvD6S+JDlnSOcN++moGafSI5jJFdjLrzHajZwuCEjjF20dkVZmyVAUeyJLYl8gayHVrg1vWn8Hlu0HxKHiD34U4MqGTK/IRKdO7tCN/Kmxbco6VvcWRok6vh+HZoDyzkJyMXck5Bqec9BCh/IZt42JQrvsNh4NlRe6ha9eQj+DtYv31M4GjEjr7WQ5ahwMyP0KOU6wtPQGlh9TP4TAPmDBQYHDSQIHBSQMFBicNFBicNNiFePm4VflGyD/613zI7ywwAQAAAAAAAAAAAAAAAAAAAADOnP8BcYAWgf3cVgIAAAAASUVORK5CYII=\"","import React from 'react';\n\ninterface ButtonProps {\n className?: string,\n children: React.ReactNode,\n onClick?: React.MouseEventHandler,\n}\nexport function AnchorButton(props: AnchorButtonProps) {\n return (\n <a className={`criipto-verify-button ${props.className}`} href={props.href} onClick={props.onClick}>{props.children}</a>\n );\n}\n\ninterface AnchorButtonProps extends ButtonProps {\n href: string\n}\nexport function Button(props: ButtonProps) {\n return (\n <button className={`criipto-verify-button ${props.className}`} type=\"button\" onClick={props.onClick}>{props.children}</button>\n );\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"qrcode\");","import React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { AuthorizeResponse, OAuth2Error, PKCE } from '@criipto/auth-js';\nimport QRCode from 'qrcode';\nimport { assertUnreachableLanguage, Language } from '../utils';\n\nimport CriiptoVerifyContext from \"../context\";\n\nimport logo from './SEBankIDQRCode/logo@2x.png';\nimport './SEBankIDQRCode/SEBankIDQRCode.css';\n\ninterface Props {\n redirectUri?: string,\n qrMargin?: number,\n /**\n * Impacts the help text\n */\n language?: Language,\n children?: (props: {\n qrElement: React.ReactElement\n /**\n * Can be rendered instead of `qrElement` if you only wish to render the qr code with no additional content.\n * Combine with `qrMargin`.\n */\n canvasElement: React.ReactElement,\n /**\n * Will be true once the user has completed login in the app and the rest of the login flow is being processed\n */\n isCompleting: boolean\n error: OAuth2Error | Error | null\n retry: () => void\n }) => React.ReactElement\n\n /** Render fallback element while loading */\n fallback?: React.ReactElement\n}\n\ninterface QrResponse {\n initialQrCode: string\n pollUrl: string\n}\ninterface PollResponse {\n qrCode?: string\n targetUrl?: string\n}\n\nfunction searchParamsToPOJO(input: URLSearchParams) {\n return Array.from(input.keys()).reduce((memo : {[key: string]: string}, key) => {\n memo[key] = input.get(key)!;\n return memo;\n }, {});\n}\n\nexport default function SEBankIDQrCode(props: Props) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const {buildAuthorizeUrl, completionStrategy, handleResponse, generatePKCE, redirectUri: defaultRedirectURi, uiLocales} = useContext(CriiptoVerifyContext);\n const language = (props.language ?? uiLocales ?? 'en') as Language;\n const redirectUri = props.redirectUri || defaultRedirectURi;\n const [qrCode, setQrCode] = useState<string | null>(null);\n const [pollUrl, setPollUrl] = useState<string | null>(null);\n const [error, setError] = useState<OAuth2Error | Error | null>(null);\n const [pkce, setPKCE] = useState<PKCE | undefined>(undefined);\n const [isCompleting, setCompleting] = useState(false);\n\n const refresh = useCallback(async () => {\n setError(null);\n setQrCode(null);\n setPollUrl(null);\n setPKCE(undefined);\n\n const pkce = await generatePKCE();\n\n buildAuthorizeUrl({\n acrValues: 'urn:grn:authn:se:bankid:another-device:qr',\n responseMode: 'json',\n pkce,\n redirectUri,\n prompt: 'login' // Triggering SSO at this point would be a mistake\n }).then(url => {\n return fetch(url).then(response => response.json() as Promise<QrResponse>);\n })\n .then(response => {\n setPKCE(pkce);\n setQrCode(response.initialQrCode);\n setPollUrl(response.pollUrl);\n })\n .catch(console.error);\n }, [buildAuthorizeUrl, redirectUri]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleRetry = () => {\n setCompleting(false);\n refresh();\n };\n\n const handleError = useCallback((error: string) => {\n /* Timeout error */\n if (error === 'Collect failed: startFailed' || error === '\"Collect failed: startFailed\"') {\n handleRetry();\n return;\n }\n setError(new Error(error));\n handleResponse(new Error(error), {\n pkce,\n redirectUri,\n source: 'SEBankIDQrCode'\n });\n }, [pkce, redirectUri]);\n\n const handleComplete = useCallback(async (completeUrl: string) => {\n setCompleting(true);\n const required = {pkce};\n const parsed = await parseCompleteUrl(completeUrl);\n\n if (parsed instanceof Error) {\n return handleError(parsed.message);\n }\n\n const {location, response} = parsed;\n\n if (completionStrategy === 'openidprovider') {\n window.location.href = location;\n return;\n }\n await handleResponse(response, {\n pkce: required.pkce,\n redirectUri,\n source: 'SEBankIDQrCode'\n });\n }, [completionStrategy, pkce]);\n\n /**\n * Render QR codes\n */\n useDraw(qrCode, {\n canvas: canvasRef.current,\n width: wrapperRef.current?.offsetWidth,\n qrMargin: props.qrMargin\n });\n\n /**\n * Poll for response\n */\n usePoll(pollUrl, {\n enabled: !isCompleting,\n onQrCode: setQrCode,\n onComplete: handleComplete,\n onError: handleError\n });\n\n const canvasElement = (\n <div ref={wrapperRef}>\n <canvas ref={canvasRef} />\n </div>\n );\n\n const completingHelpText = \n language === 'en' ? 'Completing your login.' : \n language == 'da' ? 'Fuldfører dit login.' :\n language == 'sv' ? 'Slutför din inloggning.' :\n language == 'nb' ? 'Fullfører påloggingen.' : assertUnreachableLanguage(language);\n const initialHelpText = \n language === 'en' ? 'Open the BankID app on your mobile device and scan the QR code.' : \n language == 'da' ? 'Åben BankID appen på din telefon og scan QR koden.' :\n language == 'sv' ? 'Öppna BankID-appen på din mobila enhet och skanna QR-koden.' :\n language == 'nb' ? 'Åpne BankID-appen på mobilenheten din og skann QR-koden.' : assertUnreachableLanguage(language);\n\n const qrElement = (\n <div className=\"criipto-se-bankid-qr\">\n <aside className=\"criipto-se-bankid-qr--help-text\">\n {isCompleting ? completingHelpText : initialHelpText}\n <img src={logo} />\n </aside>\n {canvasElement}\n </div>\n );\n\n if (!qrCode && props.fallback) {\n return props.fallback;\n }\n\n if (props.children) {\n return props.children({\n qrElement,\n canvasElement,\n error,\n isCompleting,\n retry: () => handleRetry(),\n });\n }\n\n return qrElement;\n}\n\nSEBankIDQrCode.acr_values = 'urn:grn:authn:se:bankid:another-device:qr';\n\ntype UseDrawOptions = {\n width?: number,\n canvas: HTMLCanvasElement | null,\n qrMargin?: number\n}\nexport function useDraw(qrCode: string | null, options: UseDrawOptions) {\n const {width, canvas, qrMargin} = options;\n\n useEffect(() => {\n if (!qrCode) return;\n if (!canvas) return;\n\n let isSubscribed = true;\n (async () => {\n canvas.width = width ?? 300;\n canvas.height = width ?? 300;\n\n const qrImage = await QRCode.toCanvas(qrCode, {\n errorCorrectionLevel: 'low',\n scale: 10,\n width,\n margin: qrMargin ?? 4\n });\n\n if (!isSubscribed) return;\n const context = canvas.getContext('2d')!;\n context.drawImage(qrImage, 0, 0);\n })();\n \n return () => {\n isSubscribed = false;\n }\n }, [qrCode, qrMargin, canvas, width]);\n}\n\ntype UsePollOptions = {\n enabled: boolean,\n onQrCode: (code: string) => void,\n onComplete: (url: string) => void,\n onError: (error: string) => void\n}\nexport function usePoll(pollUrl: string | null, options: UsePollOptions) {\n const {onQrCode, onComplete, onError, enabled} = options;\n useEffect(() => {\n if (!pollUrl) return;\n if (!enabled) return;\n\n const delay = 2500;\n let timeout : any;\n let isSubscribed = true;\n const poll = async () => {\n if (!isSubscribed) return;\n const response = await fetch(pollUrl);\n\n if (!isSubscribed) return;\n if (response.status < 400) {\n const payload = await response.json() as PollResponse;\n if (payload.qrCode) onQrCode(payload.qrCode);\n if (payload.targetUrl) {\n onComplete(payload.targetUrl)\n return;\n }\n }\n else {\n const text = await response.text();\n onError(text);\n }\n\n if (response.status === 202) {\n timeout = setTimeout(poll, delay);\n }\n };\n\n timeout = setTimeout(poll, delay);\n return () => {\n isSubscribed = false;\n clearTimeout(timeout);\n }\n }, [pollUrl, onQrCode, onComplete, onError, enabled]);\n}\n\nexport async function parseCompleteUrl(completeUrl: string) : Promise<{location: string, response: AuthorizeResponse} | Error> {\n /**\n * Handle verify response inconsistencies\n */\n if (completeUrl.includes('error=')) {\n const url = new URL(completeUrl);\n const completeParams = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n\n return {location: completeUrl, response: completeParams};\n }\n\n const completeResponse = await fetch(completeUrl);\n if (completeResponse.status >= 400) {\n return new Error(await completeResponse.text());\n }\n \n const {location} : {location: string} = await completeResponse.json();\n const url = new URL(location);\n const params = searchParamsToPOJO(url.searchParams) as AuthorizeResponse;\n return {location: location, response: params};\n}","export default \"data:image/png;base64,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\"","import React, {createContext} from \"react\";\nimport AuthMethodButton, { AuthMethodButtonProps } from \"./AuthMethodButton\";\nimport SEBankIDQrCode from \"./SEBankIDQRCode\";\n\ninterface AuthButtonGroupContextInterface {\n multiple: boolean,\n acrValues: string[]\n}\nconst initialContext : AuthButtonGroupContextInterface = {\n multiple: false,\n acrValues: []\n};\nexport const AuthButtonGroupContext = createContext<AuthButtonGroupContextInterface>(initialContext);\n\nexport default function AuthButtonGroup(props: {\n children: React.ReactNode,\n}) {\n const acrValues = React.Children.toArray(props.children).flatMap(child => {\n if (!child || typeof child !== 'object') return [];\n if (\"type\" in child) {\n if (child.type === AuthMethodButton) {\n const props = child.props as AuthMethodButtonProps;\n return props.acrValue ? [props.acrValue] : [];\n }\n if (child.type === SEBankIDQrCode) {\n return ['urn:grn:authn:se:bankid:another-device:qr'];\n }\n }\n return [];\n });\n\n const context : AuthButtonGroupContextInterface = {\n multiple: acrValues.length > 1,\n acrValues\n };\n return (\n <AuthButtonGroupContext.Provider value={context}>\n {props.children}\n </AuthButtonGroupContext.Provider>\n )\n}","import React, {useContext, useEffect, useState} from 'react';\n\nimport './AuthMethodButton/AuthMethodButton.css';\nimport CriiptoVerifyContext, { Action } from '../context';\nimport SEBankIDSameDeviceButton from './SEBankIDSameDeviceButton';\nimport { savePKCEState } from '@criipto/auth-js';\nimport AuthMethodButtonLogo, {AuthMethodButtonLogoProps} from './AuthMethodButton/Logo';\nimport { AnchorButton, Button } from './Button';\nimport { acrValueToTitle, isSingle, Language, stringifyAction } from '../utils';\nimport { AuthButtonGroupContext } from './AuthButtonGroup';\n\nexport type PopupParams = {\n acrValue: string,\n onHide: () => void\n};\nexport type PopupOption = boolean | ((options: PopupParams) => boolean | React.ReactElement)\n\nexport interface AuthMethodButtonProps {\n acrValue: string,\n href?: string;\n onClick?: React.MouseEventHandler,\n children?: React.ReactNode,\n 'data-testid'?: string,\n className?: string,\n redirectUri?: string,\n popup?: PopupOption,\n /**\n * base64 image string, e.x. data:image/png;base64,\n * or a ReactElement\n */\n logo?: AuthMethodButtonLogoProps[\"logo\"],\n\n /**\n * Impacts the button text rendered if no text is provided via props.children\n */\n language?: Language,\n /**\n * Impacts the button text rendered if no text is provided via props.children\n */\n action?: Action\n /**\n * Will ammend the login_hint parameter with `message:{base64(message)}` which will set a login/aprove message where available (Danish MitID).\n */\n message?: string\n\n userAgent?: string\n}\n\nexport default function AuthMethodButton(props: AuthMethodButtonProps) {\n const {acrValue} = props;\n const group = useContext(AuthButtonGroupContext);\n const standalone = !group.multiple || isSingle(props.acrValue, group.acrValues);\n const context = useContext(CriiptoVerifyContext);\n const {buildAuthorizeUrl} = context;\n const language = (props.language ?? context.uiLocales ?? 'en') as Language;\n const action = (props.action ?? context.action ?? 'login') as Action;\n const message = props.message ?? context.message;\n const className = `criipto-eid-btn ${acrValueToClassName(acrValue)}${props.className ? ` ${props.className}` : ''}`;\n const [backdrop, setBackdrop] = useState<React.ReactElement | null>(null);\n\n const [href, setHref] = useState(props.href);\n const redirectUri = props.redirectUri || context.redirectUri;\n\n useEffect(() => {\n if (props.href) return;\n\n let isSubscribed = true;\n let loginHint : string | undefined = undefined;\n\n buildAuthorizeUrl({\n redirectUri,\n acrValues: acrValue,\n loginHint\n }).then(href => {\n if (isSubscribed) setHref(href);\n })\n .catch(console.error);\n\n return () => {\n isSubscribed = false;\n };\n }, [props.href, buildAuthorizeUrl, acrValue, context.pkce, redirectUri]);\n\n const handleClick : React.MouseEventHandler = (event) => {\n if (props.href) return;\n\n if (context.pkce && \"code_verifier\" in context.pkce) {\n // just-in-time saving of PKCE, in case of man-in-the-browser\n savePKCEState(context.store, {\n response_type: 'id_token',\n pkce_code_verifier: context.pkce.code_verifier,\n redirect_uri: redirectUri!\n });\n }\n\n if (props.popup) {\n let willPopup =\n typeof props.popup === \"function\" ?\n props.popup({\n acrValue,\n onHide: () => setBackdrop(null)\n }) :\n props.popup === true;\n\n if (willPopup !== false) {\n event.preventDefault();\n\n if (typeof willPopup === \"boolean\") {\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: true\n }); \n } else {\n setBackdrop(willPopup);\n context.loginWithPopup({\n acrValues: [acrValue],\n redirectUri: redirectUri,\n backdrop: false\n }); \n }\n }\n }\n\n if (props.onClick) props.onClick(event);\n }\n\n const contents = props.children ?? (\n <React.Fragment>\n {stringifyAction(language, action) ? `${stringifyAction(language, action)} ` : ''}{acrValueToTitle(language, acrValue).title} \n {standalone ? null : lowercaseFirst(acrValueToTitle(language, acrValue).subtitle)}\n </React.Fragment>\n )\n\n const inner = (\n <React.Fragment>\n <AuthMethodButtonLogo acrValue={acrValue} logo={props.logo} />\n <span>{contents}</span>\n </React.Fragment>\n );\n\n const button = href ? (\n <React.Fragment>\n <AnchorButton {...props} href={href} className={className} onClick={handleClick}>\n {inner}\n </AnchorButton>\n {backdrop}\n </React.Fragment>\n ) : (\n <React.Fragment>\n <Button {...props} className={className} onClick={handleClick}>\n {inner}\n </Button>\n {backdrop}\n </React.Fragment>\n );\n \n if (!props.href && acrValue === 'urn:grn:authn:se:bankid:same-device') {\n return (\n <SEBankIDSameDeviceButton\n redirectUri={props.redirectUri}\n fallback={button}\n className={className}\n userAgent={props.userAgent}\n logo={<AuthMethodButtonLogo acrValue={acrValue} logo={props.logo} />}\n >\n <span>{contents}</span>\n </SEBankIDSameDeviceButton>\n );\n }\n\n return button;\n}\n\nfunction acrValueToClassName(value: string) {\n value = value.replace('urn:grn:authn:', '');\n const segments = value.split(':');\n const classNames = segments.reduce((memo: string[], segment: string) => {\n if (memo.length) {\n return memo.concat([`${memo[memo.length-1]}-${segment}`])\n } else {\n return memo.concat([segment]);\n }\n }, []);\n\n return classNames.map(className => `criipto-eid-btn--${className}`).join(' ');\n}\n\nfunction lowercaseFirst(input?: string) {\n if (!input) return input;\n return input.substring(0, 1).toLowerCase() + input.substr(1, input.length);\n}\n","import {OpenIDConfiguration} from '@criipto/auth-js';\nimport React, { useContext, useEffect, useState } from 'react';\nimport CriiptoVerifyContext from '../context';\nimport { getUserAgent } from '../device';\nimport { filterAcrValues, Language, acrValueToProviderPrefix } from '../utils';\nimport AuthMethodButton, {AuthMethodButtonProps} from './AuthMethodButton';\n\nimport './AuthMethodSelector/AuthMethodSelector.css';\nimport SEBankIDQrCode from './SEBankIDQRCode';\nimport AuthButtonGroup from './AuthButtonGroup';\n\ninterface AuthMethodSelectorProps {\n acrValues?: string[],\n language?: Language,\n onSelect?: (acrValue: string) => void,\n redirectUri?: string,\n popup?: AuthMethodButtonProps[\"popup\"],\n userAgent?: string\n}\n\nexport default function AuthMethodSelector(props: AuthMethodSelectorProps) {\n const {action, uiLocales, acrValues: configurationAcrValues} = useContext(CriiptoVerifyContext);\n const language = props.language || uiLocales as Language || 'en';\n\n const acrValues = filterAcrValues(props.acrValues ?? configurationAcrValues ?? []);\n const onlySweden = !!acrValues.length && acrValues.every(s => s.startsWith('urn:grn:authn:se:bankid:'));\n \n if (onlySweden) {\n return <Sweden {...props} acrValues={acrValues} />\n }\n\n return (\n <div className=\"criipto-eid-selector\">\n <AuthButtonGroup>\n {acrValues.map(acrValue => (\n <AuthMethodButton\n acrValue={acrValue}\n key={acrValue}\n onClick={props.onSelect ? (() => props.onSelect!(acrValue)) : undefined}\n redirectUri={props.redirectUri}\n popup={props.popup}\n language={language}\n action={action}\n userAgent={props.userAgent}\n />\n ))}\n </AuthButtonGroup>\n </div>\n )\n}\n\ntype SwedenProps = Omit<AuthMethodSelectorProps, 'acrValues'> & {\n acrValues: string[]\n}\n\nexport function Sweden(props: SwedenProps) {\n const {acrValues} = props;\n const {action, uiLocales} = useContext(CriiptoVerifyContext);\n const language = props.language || uiLocales as Language || 'en';\n const hasQR = acrValues.includes(SEBankIDQrCode.acr_values);\n const filteredAcrValues = acrValues.filter(s => s !== SEBankIDQrCode.acr_values);\n\n const userAgent = getUserAgent(typeof navigator !== 'undefined' ? navigator.userAgent : props.userAgent);\n const mobileOS = userAgent?.os.name === 'iOS' ? 'iOS' : userAgent?.os.name === 'Android' ? 'android' : null;\n const showQR = hasQR && !mobileOS;\n\n return (\n <div className=\"criipto-eid-selector\">\n <AuthButtonGroup>\n {filteredAcrValues.map(acrValue => (\n <AuthMethodButton\n acrValue={acrValue}\n key={acrValue}\n onClick={props.onSelect ? (() => props.onSelect!(acrValue)) : undefined}\n redirectUri={props.redirectUri}\n popup={props.popup}\n language={language}\n action={action}\n userAgent={props.userAgent}\n />\n ))}\n {showQR ? (\n <SEBankIDQrCode\n language={language}\n redirectUri={props.redirectUri}\n fallback={(\n <AuthMethodButton \n acrValue={SEBankIDQrCode.acr_values} \n />\n )}\n />\n ) : (hasQR && mobileOS) ? (\n <AuthMethodButton \n acrValue={SEBankIDQrCode.acr_values}\n redirectUri={props.redirectUri}\n popup={props.popup}\n language={language}\n action={action}\n userAgent={props.userAgent}\n />\n ) : null}\n </AuthButtonGroup>\n </div>\n )\n}","import { OAuth2Error, QrNotEnabledError, savePKCEState, UserCancelledError } from '@criipto/auth-js';\nimport CriiptoConfiguration from '@criipto/auth-js/dist/CriiptoConfiguration';\nimport React, { useContext, useRef, useEffect, useLayoutEffect, useState, useCallback } from 'react';\nimport CriiptoVerifyContext from '../context';\n\n// Inlined types less readable (for library developers) but improves intellisense for consumers\nconst QRCode : React.FC<{\n margin?: number,\n className?: string,\n acrValues?: string[],\n children: (props: {\n qrElement: React.ReactElement\n /**\n * Will be true once the QR code has been scanned\n */\n isAcknowledged: boolean\n /**\n * Will be true if the user cancels the login on his mobile device\n */\n isCancelled: boolean\n /**\n * Whether or not QR codes are enabled for this Criipto Applicaiton\n */\n isEnabled: boolean | undefined\n error: OAuth2Error | Error | null\n retry: () => void,\n /**\n * A method for triggering a full screen redirect to authentication (useful if user is on mobile device already)\n */\n redirect: () => Promise<void>\n }) => React.ReactElement\n}> = (props) => {\n const {children, margin, className} = props;\n const elementRef = useRef<HTMLDivElement>(null);\n const {client, buildOptions, buildAuthorizeUrl, handleResponse, pkce, store, acrValues: configurationAcrValues} = useContext(CriiptoVerifyContext);\n const [requestId, setRequestId] = useState(() => Math.random().toString());\n const [isAcknowledged, setAcknowledged] = useState(false);\n const [isCancelled, setCancelled] = useState(false);\n const [error, setError] = useState<OAuth2Error | Error | null>(null);\n const [criiptoConfiguration, setCriiptoConfiguration] = useState<CriiptoConfiguration | null>(null);\n const isEnabled = criiptoConfiguration?.client.qr_enabled;\n\n const acrValues = props.acrValues ?? configurationAcrValues ?? [];\n\n useEffect(() => {\n let isSubsribed = true;\n \n client.fetchCriiptoConfiguration().then(c => {\n if (!isSubsribed) return;\n setCriiptoConfiguration(c);\n })\n\n return () => {\n isSubsribed = false;\n }\n }, [client]);\n\n const redirect = useCallback(async () => {\n if (!criiptoConfiguration) return;\n const intermediaryUrl = (criiptoConfiguration.client.qr_intermediary_url ?? criiptoConfiguration.qr_intermediary_url).replace('/{id}', '').replace('{id}', '');\n const authorizeUrl = new URL(await buildAuthorizeUrl({\n acrValues\n }));\n const authorizeParams = new URLSearchParams(authorizeUrl.search);\n authorizeParams.set('domain', authorizeUrl.host);\n authorizeUrl.host = new URL(intermediaryUrl).host;\n authorizeUrl.port = new URL(intermediaryUrl).port;\n authorizeUrl.pathname = new URL(intermediaryUrl).pathname + '/authorize';\n authorizeUrl.search = authorizeParams.toString();\n\n if (pkce && \"code_verifier\" in pkce) {\n // just-in-time saving of PKCE, in case of man-in-the-browser\n savePKCEState(store, {\n response_type: 'id_token',\n pkce_code_verifier: pkce.code_verifier,\n redirect_uri: authorizeParams.get('redirect_uri')!\n });\n }\n\n window.location.href = authorizeUrl.toString();\n }, [buildAuthorizeUrl, criiptoConfiguration, acrValues])\n\n const authorize = useCallback(() => {\n return client.qr.authorize(\n elementRef.current!,\n {\n ...buildOptions({acrValues}),\n margin\n });\n }, [client, buildOptions, margin, acrValues]);\n\n useLayoutEffect (() => {\n if (!elementRef.current) return;\n if (error) return;\n if (!isEnabled) return;\n\n const promise = authorize();\n\n promise.onAcknowledged = () => {\n setAcknowledged(true);\n };\n\n promise.then(response => {\n if (promise.cancelled) return;\n handleResponse(response, {\n pkce: pkce && \"code_verifier\" in pkce ? pkce : undefined,\n source: 'QRCode'\n });\n }).catch(err => {\n if (err instanceof UserCancelledError) {\n setCancelled(true);\n return;\n }\n\n if (promise.cancelled) return;\n\n setError(err);\n handleResponse(err, {source: 'QRCode'});\n });\n\n return () => {\n promise.cancel();\n };\n }, [authorize, pkce, handleResponse, requestId, error, isEnabled]);\n\n const handleRetry = () => {\n setAcknowledged(false);\n setCancelled(false);\n setError(null);\n setRequestId(Math.random().toString());\n };\n\n const qrElement = <div ref={elementRef} className={className} />;\n return children({\n qrElement,\n isAcknowledged,\n isCancelled,\n isEnabled: criiptoConfiguration?.client.qr_enabled,\n error,\n retry: handleRetry,\n redirect\n });\n}\nexport default QRCode;","import { useContext } from \"react\";\nimport CriiptoVerifyContext from \"./context\";\n\nexport default function useCriiptoVerify() {\n const {result, claims, loginWithRedirect, loginWithPopup, acrValues, isLoading, isInitializing, logout, checkSession} = useContext(CriiptoVerifyContext);\n\n return {\n result,\n /**\n * The claims of the decoded id_token (if available)\n */\n claims,\n error: result && \"error\" in result ? result : null,\n loginWithRedirect,\n loginWithPopup,\n acrValues,\n /**\n * Will be true when performing token exchange after redirect or during an initial SSO check\n */\n isLoading,\n /**\n * Will be true until the first set of useEffect hooks have been called\n */\n isInitializing,\n /**\n * Check if there is an existing SSO session.\n */\n checkSession,\n /**\n * Clear local session store and logout of any existing SSO session\n */\n logout\n };\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","require","actions","stub","Error","initialContext","loginWithRedirect","loginWithPopup","checkSession","logout","fetchOpenIDConfiguration","buildAuthorizeUrl","generatePKCE","buildOptions","handleResponse","responseType","completionStrategy","result","claims","domain","action","pkce","undefined","store","isLoading","isInitializing","client","loginHint","createContext","FTN_PREFIX","autoTitleCase","input","split","map","segment","replace","length","toUpperCase","substr","join","assertUnreachableLanguage","x","stringifyAction","language","assertUnreachable","acrValueToProviderPrefix","startsWith","slice","acrValueToTitle","provider","title","subtitle","suffix","endsWith","filterAcrValues","original","dkmitidMethod","forEach","s","newLevel","oldLevel","includes","lowestMitIDValue","reduced","filter","concat","sort","b","indexOf","push","trySessionStorage","sessionStorage","err","createMemoryStorage","getItem","setItem","toString","removeItem","clear","index","keys","SESSION_KEY","ACTION_SUPPORTING_ACR_VALUES","MESSAGE_SUPPORTING_ACR_VALUES","buildLoginHint","params","options","message","acrValues","Array","isArray","hints","hint","h","some","v","btoa","defaultRedirectUri","window","location","origin","pathname","pkceStore","console","warn","props","useMemo","clientID","redirectUri","protocol","configuration","setConfiguration","useState","useEffect","isSubscribed","setResult","id_token","setIsLoading","setIsInitializing","setPKCE","response","uiLocales","actionCandidate","find","parseAction","messageCandidate","atob","tryBase64Decode","parseMessage","sessionStore","refreshPKCE","clearPKCEState","useCallback","responseMode","state","nonce","prompt","scope","extraUrlParams","criiptoSdk","criipto_sdk","buildAuthorizeParams","OAuth2Error","_redirectUri","processResponse","code_verifier","redirect_uri","then","code","source","catch","error","error_description","context","redirect","authorize","popup","acr_values_supported","hasMatch","parseAuthorizeResponseFromLocation","Promise","resolve","match","url","URL","href","searchParams","delete","history","replaceState","document","search","resetRedirectState","token","interval","setInterval","now","Date","exp","clearInterval","finally","children","getUserAgent","userAgent","SEBankIDSameDevicePoll","links","onError","onComplete","onInitiate","initiated","setInitiated","useContext","poll","fetch","pollUrl","status","targetUrl","json","text","setTimeout","onClick","SEBankIDSameDeviceForeground","onLog","onVisible","deps","visibilityState","useRef","setState","current","addEventListener","_handleVisibilityChange","removeEventListener","nextState","usePageVisibility","completeUrl","STATE_KEY","stateStore","hydrateState","rawState","JSON","parse","autoHydratedState","SEBankIDSameDeviceReload","hydratedState","stringify","NotDoneError","constructor","super","this","name","SEBankIDSameDeviceButton","rawUserAgent","navigator","strategy","mobileOS","os","browser","iOSSafari","androidChrome","resume","linkType","determineStrategy","setHref","setLinks","setError","log","setLog","defaultRedirectURi","handleLog","statements","logs","handleComplete","required","completeResponse","errorMessage","fetchComplete","from","reduce","memo","refresh","newUrl","launchLinks","universalLink","customFileHandlerUrl","set","newHref","handleInitiate","handleError","element","className","logo","fallback","AuthMethodButtonLogo","src","alt","acrValueToLogo","acrValue","AnchorButton","Button","type","SEBankIDQrCode","canvasRef","wrapperRef","qrCode","setQrCode","setPollUrl","isCompleting","setCompleting","initialQrCode","handleRetry","parsed","completeParams","parseCompleteUrl","width","canvas","qrMargin","height","qrImage","errorCorrectionLevel","scale","margin","getContext","drawImage","useDraw","offsetWidth","onQrCode","enabled","timeout","payload","clearTimeout","usePoll","canvasElement","ref","completingHelpText","initialHelpText","qrElement","retry","acr_values","AuthButtonGroupContext","multiple","AuthButtonGroup","flatMap","child","AuthMethodButton","Provider","group","standalone","count","isSingle","backdrop","setBackdrop","handleClick","event","savePKCEState","response_type","pkce_code_verifier","willPopup","onHide","preventDefault","contents","substring","toLowerCase","inner","button","AuthMethodSelector","configurationAcrValues","every","Sweden","onSelect","hasQR","filteredAcrValues","showQR","elementRef","requestId","setRequestId","Math","random","isAcknowledged","setAcknowledged","isCancelled","setCancelled","criiptoConfiguration","setCriiptoConfiguration","isEnabled","qr_enabled","isSubsribed","fetchCriiptoConfiguration","c","intermediaryUrl","qr_intermediary_url","authorizeUrl","authorizeParams","URLSearchParams","host","port","qr","useLayoutEffect","promise","onAcknowledged","cancelled","UserCancelledError","cancel","useCriiptoVerify"],"sourceRoot":""}
|