PageSourceSearch

https://softserverapp.com/_next/static/chunks/7772.50cea3e6c670921d.js

js softserverapp.com collected 2026-09-24 11:06:43 UTC 42,953 bytes, 1 lines download raw bytes

1!function(){try{var e="u">typeof window?window:"u">typeof global?global:"u">typeof globalThis?globalThis:"u">typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="f1dbe750-2f99-4820-9183-d84d9bb29733",e._sentryDebugIdIdentifier="sentry-dbid-f1dbe750-2f99-4820-9183-d84d9bb29733")}catch(e){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7772],{57772:(e,t,o)=>{o.r(t),o.d(t,{SocialLoginWeb:()=>f});var r=o(77805);class i extends r.WebPlugin{constructor(){super()}parseJwt(e){return JSON.parse(decodeURIComponent(atob(e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/")).split("").map(e=>"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)).join("")))}async loadScript(e){return new Promise((t,o)=>{let r=document.createElement("script");r.src=e,r.async=!0,r.onload=()=>{t()},r.onerror=o,document.body.appendChild(r)})}}i.OAUTH_STATE_KEY="social_login_oauth_pending";let n=["access_denied","access denied","user_cancelled_authorize","user_cancelled","user cancelled","user canceled","login cancelled","login canceled","popup closed","window was closed"];function s(e){let t=Error(e);return t.code="USER_CANCELLED",t}function a(e){let t=e.toLowerCase();return n.some(e=>t.includes(e))?s(e):Error(e)}class l extends i{constructor(){super(...arguments),this.clientId=null,this.redirectUrl=null,this.scriptLoaded=!1,this.scriptUrl="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js",this.useProperTokenExchange=!1}async initialize(e,t,o=!1){this.clientId=e,this.redirectUrl=t||null,this.useProperTokenExchange=o,e&&await this.loadAppleScript()}async login(e){if(!this.clientId)throw Error("Apple Client ID not set. Call initialize() first.");if(!this.scriptLoaded)throw Error("Apple Sign-In script not loaded.");return new Promise((t,o)=>{var r,i;AppleID.auth.init({clientId:null!=(r=this.clientId)?r:"",scope:(null==(i=e.scopes)?void 0:i.join(" "))||"name email",redirectURI:this.redirectUrl||window.location.href,state:e.state,nonce:e.nonce,usePopup:!0}),AppleID.auth.signIn().then(e=>{var o,r,i,n,s;let a=null;a=this.useProperTokenExchange?null:{token:e.authorization.code||""},t({provider:"apple",result:Object.assign({profile:{user:e.user||"",email:(null==(o=e.user)?void 0:o.email)||null,givenName:(null==(i=null==(r=e.user)?void 0:r.name)?void 0:i.firstName)||null,familyName:(null==(s=null==(n=e.user)?void 0:n.name)?void 0:s.lastName)||null},accessToken:a,idToken:e.authorization.id_token||null},this.useProperTokenExchange&&{authorizationCode:e.authorization.code})})}).catch(e=>{var t,r,i;o(a(null!=(i=null!=(r=null!=(t=null==e?void 0:e.message)?t:null==e?void 0:e.localizedDescription)?r:null==e?void 0:e.error)?i:"Apple login failed"))})})}async logout(){console.log("Apple logout: Session should be managed on the client side")}async isLoggedIn(){return console.log("Apple login status should be managed on the client side"),{isLoggedIn:!1}}async getAuthorizationCode(){throw console.log("Apple authorization code should be stored during login"),Error("Apple authorization code not available")}async refresh(){console.log("Apple refresh not available on web")}async loadAppleScript(){if(!this.scriptLoaded)return this.loadScript(this.scriptUrl).then(()=>{this.scriptLoaded=!0})}}class c extends i{constructor(){super(...arguments),this.appId=null,this.scriptLoaded=!1,this.locale="en_US"}async initialize(e,t){this.appId=e,t&&(this.locale=t),e&&(await this.loadFacebookScript(this.locale),FB.init({appId:this.appId,version:"v17.0",xfbml:!0,cookie:!0}))}async login(e){if(!this.appId)throw Error("Facebook App ID not set. Call initialize() first.");return new Promise((t,o)=>{var r;let i=!1,n=!1,a=e=>{if(i)return;if(!(null==e?void 0:e.accessToken)||!e.userID){i=!0,o(Error("Facebook login failed"));return}let r=e.accessToken,n=e.userID;FB.api("/me",{fields:"id,name,email,picture"},e=>{var o,s;i=!0,t({provider:"facebook",result:{accessToken:{token:r,userId:n},profile:{userID:e.id,name:e.name,email:e.email||null,imageURL:(null==(s=null==(o=e.picture)?void 0:o.data)?void 0:s.url)||null,friendIDs:[],birthday:null,ageRange:null,gender:null,location:null,hometown:null,profileURL:null},idToken:null}})})},l=()=>{i||n||(n=!0,this.waitForConnection().then(e=>a(e.authResponse)).catch(e=>{i||(i=!0,o(e))}))};FB.login(e=>{"connected"===e.status?a(e.authResponse):"not_authorized"===e.status||"unknown"===e.status?o(s("Facebook login was cancelled.")):l()},(null==(r=e.permissions)?void 0:r.length)?{scope:e.permissions.join(",")}:void 0)})}async logout(){return new Promise(e=>{FB.logout(()=>e())})}async isLoggedIn(){return new Promise(e=>{FB.getLoginStatus(t=>{e({isLoggedIn:"connected"===t.status})})})}async getAuthorizationCode(){return new Promise((e,t)=>
1{FB.getLoginStatus(o=>{var r;"connected"===o.status?e({accessToken:(null==(r=o.authResponse)?void 0:r.accessToken)||""}):t(Error("No Facebook authorization code available"))})})}async refresh(e){await this.login(e)}waitForConnection(e=12e4,t=500){let o=Date.now();return new Promise((r,i)=>{let n=!1,a=()=>{n||FB.getLoginStatus(l=>{var c;if(!n){if("connected"===l.status&&(null==(c=l.authResponse)?void 0:c.accessToken)){n=!0,r(l);return}if("not_authorized"===l.status||"unknown"===l.status){n=!0,i(s("Facebook login was cancelled."));return}if(Date.now()-o>=e){n=!0,i(Error("Facebook login failed or timed out"));return}setTimeout(a,t)}})};a()})}async loadFacebookScript(e){if(this.scriptLoaded)return;let t=document.querySelector('script[src*="connect.facebook.net"]');return t&&t.remove(),this.loadScript(`https://connect.facebook.net/${e}/sdk.js`).then(()=>{this.scriptLoaded=!0})}}let d="Google refresh() is not available when using offline mode. Offline mode only returns serverAuthCode for backend token exchange. Send serverAuthCode to your backend and refresh tokens there, or switch google.mode to 'online' for client-side refresh.";class u extends i{constructor(){super(...arguments),this.clientId=null,this.loginType="online",this.GOOGLE_TOKEN_REQUEST_URL="https://www.googleapis.com/oauth2/v3/tokeninfo",this.GOOGLE_STATE_KEY="capgo_social_login_google_state"}async initialize(e,t,o,r){this.clientId=e,t&&(this.loginType=t),this.hostedDomain=o,this.redirectUrl=r}async login(e){if(!this.clientId)throw Error("Google Client ID not set. Call initialize() first.");let t=e.scopes||[];t.length>0?(t.includes("https://www.googleapis.com/auth/userinfo.email")||t.push("https://www.googleapis.com/auth/userinfo.email"),t.includes("https://www.googleapis.com/auth/userinfo.profile")||t.push("https://www.googleapis.com/auth/userinfo.profile"),t.includes("openid")||t.push("openid")):t=["https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/userinfo.profile","openid"];let o=e.nonce||Math.random().toString(36).substring(2);return this.traditionalOAuth({scopes:t,nonce:o,hostedDomain:this.hostedDomain,prompt:e.prompt})}async logout(){if("offline"===this.loginType)return Promise.reject("Offline login doesn't store tokens. logout is not available");let e=this.getGoogleState();e&&await this.rawLogoutGoogle(e.accessToken)}async isLoggedIn(){if("offline"===this.loginType)return Promise.reject("Offline login doesn't store tokens. isLoggedIn is not available");let e=this.getGoogleState();if(!e)return{isLoggedIn:!1};try{let t=await this.accessTokenIsValid(e.accessToken),o=this.idTokenValid(e.idToken);if(t&&o)return{isLoggedIn:!0};try{await this.rawLogoutGoogle(e.accessToken,!1)}catch(e){console.error("Access token is not valid, but cannot logout",e)}return{isLoggedIn:!1}}catch(e){return Promise.reject(e)}}async getAuthorizationCode(){if("offline"===this.loginType)return Promise.reject("Offline login doesn't store tokens. getAuthorizationCode is not available");let e=this.getGoogleState();if(!e)throw Error("No Google authorization code available");try{let t=await this.accessTokenIsValid(e.accessToken),o=this.idTokenValid(e.idToken);if(t&&o)return{accessToken:e.accessToken,jwt:e.idToken};try{await this.rawLogoutGoogle(e.accessToken,!1)}catch(e){console.error("Access token is not valid, but cannot logout",e)}throw Error("No Google authorization code available")}catch(e){return Promise.reject(e)}}async refresh(){return"offline"===this.loginType?(console.warn(`[SocialLogin] ${d}`),Promise.reject(Error(d))):Promise.reject(Error("Google refresh is not implemented on web. Use login() again to obtain a new token."))}handleOAuthRedirect(e){let t=e.searchParams,o=t.get("error");if(o)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:t.get("error_description")||o};let r=t.get("code");if(r&&t.has("scope"))return{provider:"google",result:{serverAuthCode:r,responseType:"offline"}};let n=e.hash.substring(1);if(console.log("handleOAuthRedirect",e.hash),!n)return null;let s=new URLSearchParams(n),a=s.get("error");if(a)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:s.get("error_description")||a};console.log("handleOAuthRedirect ok");let l=s.get("access_token"),c=s.get("id_token");if(l&&c){localStorage.removeItem(i.OAUTH_STATE_KEY);let e=this.parseJwt(c);return{provider:"google",result:{accessToken:{token:l},idToken:c,profile:{email:e.email||null,familyName:e.family_name||null,givenName:e.given_name||null,id:e.sub||null,name:e.name||null,imageUrl:e.picture||null},responseType:"online"}}}return null}async accessTokenIsValid(e){let t=`${this.GOOGLE_TOKEN_REQUEST_URL}?access_token=${encodeURIComponent(e)}`;try{let e,o,r=await fetch(t);if(!r.ok)return console.log(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response not successful. Status code: ${r.status}
1. Assuming that the token is not valid`),!1;let i=await r.text();if(!i)throw console.error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is null`),Error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is null`);try{e=JSON.parse(i)}catch(e){throw console.error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is not valid JSON. Error: ${e}`),Error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is not valid JSON. Error: ${e}`)}let n=e.expires_in;if(null==n)throw console.error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response JSON does not include 'expires_in'.`),Error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response JSON does not include 'expires_in'.`);try{if(o=parseInt(n,10),isNaN(o))throw Error("'expires_in' is not a valid integer")}catch(e){throw console.error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. 'expires_in': ${n} is not a valid integer. Error: ${e}`),Error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. 'expires_in': ${n} is not a valid integer. Error: ${e}`)}return o>5}catch(e){throw console.error(e),e}}idTokenValid(e){try{let t=this.parseJwt(e),o=Math.ceil(Date.now()/1e3)+5;return t.exp&&o<t.exp}catch(e){return!1}}async rawLogoutGoogle(e,t=null){if(null===t&&(t=await this.accessTokenIsValid(e)),!0!==t)return void this.clearStateGoogle();try{await fetch(`https://accounts.google.com/o/oauth2/revoke?token=${encodeURIComponent(e)}`),this.clearStateGoogle()}catch(e){}}persistStateGoogle(e,t){try{window.localStorage.setItem(this.GOOGLE_STATE_KEY,JSON.stringify({accessToken:e,idToken:t}))}catch(e){console.error("Cannot persist state google",e)}}clearStateGoogle(){try{window.localStorage.removeItem(this.GOOGLE_STATE_KEY)}catch(e){console.error("Cannot clear state google",e)}}getGoogleState(){try{let e=window.localStorage.getItem(this.GOOGLE_STATE_KEY);if(!e)return null;let{accessToken:t,idToken:o}=JSON.parse(e);return{accessToken:t,idToken:o}}catch(e){return console.error("Cannot get state google",e),null}}async traditionalOAuth({scopes:e,hostedDomain:t,nonce:o,prompt:r}){var n;let l,c,d=[...new Set([...e||[],"openid"])],u=new URLSearchParams(Object.assign(Object.assign({client_id:null!=(n=this.clientId)?n:"",redirect_uri:this.redirectUrl||window.location.origin+window.location.pathname,response_type:"offline"===this.loginType?"code":"token id_token",scope:d.join(" ")},o&&{nonce:o}),{include_granted_scopes:"true",state:"popup"}));void 0!==t&&u.append("hd",t),void 0!==r&&u.append("prompt",r);let h=`https://accounts.google.com/o/oauth2/v2/auth?${u.toString()}`,p=window.screenX+(window.outerWidth-500)/2,g=window.screenY+(window.outerHeight-600)/2;localStorage.setItem(i.OAUTH_STATE_KEY,JSON.stringify({provider:"google",loginType:this.loginType,nonce:o}));let f=window.open(h,"Google Sign In",`width=500,height=600,left=${p},top=${g},popup=1`),w=`google_oauth_${o||Date.now()}`,v=null;try{v=new BroadcastChannel(w)}catch(e){}return new Promise((e,t)=>{if(!f)return void t(Error("Failed to open popup"));let o=(e=!1)=>{if(window.removeEventListener("message",i),clearInterval(l),clearTimeout(c),v&&v.close(),e)try{f.close()}catch(e){}},r=o=>{if("online"===this.loginType){let{accessToken:r,idToken:i}=o;if(r&&i){let t=this.parseJwt(i);this.persistStateGoogle(r.token,i),e({provider:"google",result:{accessToken:{token:r.token},idToken:i,profile:{email:t.email||null,familyName:t.family_name||null,givenName:t.given_name||null,id:t.sub||null,name:t.name||null,imageUrl:t.picture||null},responseType:"online"}})}else t(Error("Invalid OAuth response: missing accessToken or idToken"))}else{let{serverAuthCode:r}=o;if(!r)return void t(Error("Invalid OAuth response: missing serverAuthCode"));e({provider:"google",result:{responseType:"offline",serverAuthCode:r}})}},i=e=>{var i,n,s,l;e.origin!==window.location.origin||(null==(n=null==(i=e.data)?void 0:i.source)?void 0:n.startsWith("angular"))||((null==(s=e.data)?void 0:s.type)==="oauth-response"?(o(!0),r(e.data)):(null==(l=e.data)?void 0:l.type)==="oauth-error"&&(o(!0),t(a(e.data.error||"User cancelled the OAuth flow"))))};v&&(v.onmessage=e=>{var i;let n=e.data;null!=(i=null==n?void 0:n.source)&&i.toString().startsWith("angular")||((null==n?void 0:n.type)==="oauth-response"?(o(!0),r(n)):(null==n?void 0:n.type)==="oauth-error"&&(o(!0),t(a(n.error||"User cancelled the OAuth flow"))))}),window.addEventListener("message",i),c=setTimeout(()=>{o(!0),t(Error("OAuth timeout"))},3e5),l=setInterval(()=>{try{f.closed&&(o(),t(s("Popup closed")))}catch(e){clearInterval(l)}},1e3)})}}var h=o(56846);class p extends i{constructor(){super(),this.providers=new Map,this.TOKENS_KEY_PREFIX="capgo_social_login_oauth2_tokens_",this.STATE_PREFIX="capgo_social_login_oauth2_state_",this.CONFIG_KEY_PREFIX="capgo_social_login_oauth2_config_",this.restoreConfigurationsFromStorage()}normalizeScopeValue(e){return e?"string"==typeof e?e:Array.isArray(e)?e.filter(Boolean).join(" "):"":""}normalizeConfig(e,t){var o,r,i,n,s,a,l,c;let d=null!=(o=t.appId)?o:t.clientId,u=null!=(r=t.authorizationBaseUrl)?r:t.authorizationEndpoint,h=null!=(i=t.accessTokenEndpoint)?i:t.tokenEndpoint,p=null!=(n=t.logoutUrl)?n:t.endSessionEndpoint,g=null!=(s=t.scope)?s:t.scopes;if(!d)throw Error(`OAuth2 provider '${e}' requires appId (or clientId).`);if(!t.redirectUrl)throw Error(`OAuth2 provider '${e}' requires redirectUrl.`);if(!u&&!t.issuerUrl)throw Error(`OAuth2 provider '${e}' requires authorizationBaseUrl (or authorizationEndpoint) or issuerUrl.`);return{appId:d,clientSecret:t.clientSecret,issuerUrl:t.issuerUrl,authorizationBaseUrl:u,accessTokenEndpoint:h,redirectUrl:t.redirectUrl,resourceUrl:t.resourceUrl,responseType:null!=(a=t.responseType)?a:"code",pkceEnabled:null==(l=t.pkce
1Enabled)||l,scope:this.normalizeScopeValue(g),additionalParameters:t.additionalParameters,loginHint:t.loginHint,prompt:t.prompt,additionalTokenParameters:t.additionalTokenParameters,additionalResourceHeaders:t.additionalResourceHeaders,logoutUrl:p,postLogoutRedirectUrl:t.postLogoutRedirectUrl,additionalLogoutParameters:t.additionalLogoutParameters,logsEnabled:null!=(c=t.logsEnabled)&&c}}async ensureDiscovered(e){let t=this.providers.get(e);if(!(null==t?void 0:t.issuerUrl)||t.authorizationBaseUrl&&t.accessTokenEndpoint)return;let o=t.issuerUrl.replace(/\/+$/,""),r=`${o}/.well-known/openid-configuration`,i=await fetch(r);if(!i.ok){let e=await i.text().catch(()=>"");throw Error(`OAuth2 discovery failed (${i.status}): ${e||r}`)}let n=await i.json(),s=n.authorization_endpoint,a=n.token_endpoint,l=n.end_session_endpoint;t.authorizationBaseUrl||"string"!=typeof s||(t.authorizationBaseUrl=s),t.accessTokenEndpoint||"string"!=typeof a||(t.accessTokenEndpoint=a),t.logoutUrl||"string"!=typeof l||(t.logoutUrl=l),t.logsEnabled&&console.log(`[OAuth2:${e}] Discovery resolved`,{authorizationBaseUrl:t.authorizationBaseUrl,accessTokenEndpoint:t.accessTokenEndpoint,logoutUrl:t.logoutUrl}),this.persistConfiguration(e,t)}async initializeProviders(e){for(let[t,o]of Object.entries(e)){let e=this.normalizeConfig(t,o);this.providers.set(t,e),e.logsEnabled&&console.log(`[OAuth2:${t}] Initialized with config:`,{appId:e.appId,issuerUrl:e.issuerUrl,authorizationBaseUrl:e.authorizationBaseUrl,redirectUrl:e.redirectUrl,responseType:e.responseType,pkceEnabled:e.pkceEnabled}),await this.ensureDiscovered(t),this.persistConfiguration(t,e)}}getProvider(e){let t=this.providers.get(e);if(!t)throw Error(`OAuth2 provider '${e}' not configured. Call initialize() first.`);return t}getTokensKey(e){return`${this.TOKENS_KEY_PREFIX}${e}`}getConfigKey(e){return`${this.CONFIG_KEY_PREFIX}${e}`}persistConfiguration(e,t){try{localStorage.setItem(this.getConfigKey(e),JSON.stringify(t))}catch(t){console.warn(`Failed to persist OAuth2 configuration for provider '${e}'`,t)}}restoreConfigurationsFromStorage(){for(let e of Object.keys(localStorage))if(e.startsWith(this.CONFIG_KEY_PREFIX)){let t=e.substring(this.CONFIG_KEY_PREFIX.length);try{let o=localStorage.getItem(e);if(o){let e=JSON.parse(o);this.providers.set(t,e)}}catch(e){console.warn(`Failed to restore OAuth2 configuration for provider '${t}'`,e)}}}async login(e){var t,o,r,n,l,c,d,u,p;let{providerId:g}=e,f=this.getProvider(g);await this.ensureDiscovered(g);let w=null!=(t=e.redirectUrl)?t:f.redirectUrl,v=this.normalizeScopeValue(null!=(r=null!=(o=e.scope)?o:e.scopes)?r:f.scope),m=null!=(n=e.state)?n:this.generateState(),T=null!=(l=e.codeVerifier)?l:this.generateCodeVerifier(),_=new URLSearchParams({response_type:f.responseType,client_id:f.appId,redirect_uri:w,state:m});v&&_.set("scope",v);let k=Object.assign(Object.assign({},null!=(c=f.additionalParameters)?c:{}),null!=(d=e.additionalParameters)?d:{}),E=null!=(u=e.loginHint)?u:f.loginHint,y=null!=(p=e.prompt)?p:f.prompt;if(!E||"login_hint"in k||(k.login_hint=E),!y||"prompt"in k||(k.prompt=y),"code"===f.responseType&&f.pkceEnabled){let e=await this.generateCodeChallenge(T);_.set("code_challenge",e),_.set("code_challenge_method","S256")}for(let[e,t]of Object.entries(k))void 0!==t&&_.set(e,t);if(this.persistPendingLogin(m,{providerId:g,codeVerifier:T,redirectUri:w,scope:v}),localStorage.setItem(i.OAUTH_STATE_KEY,JSON.stringify({provider:"oauth2",providerId:g,state:m})),!f.authorizationBaseUrl)throw Error(`OAuth2 provider '${g}' is missing authorizationBaseUrl (discovery may have failed).`);let S=`${f.authorizationBaseUrl}?${_.toString()}`;if(f.logsEnabled&&console.log(`[OAuth2:${g}] Opening authorization URL:`,S),"redirect"===e.flow)return window.location.assign(S),new Promise(()=>{});let I=window.screenX+(window.outerWidth-500)/2,O=window.screenY+(window.outerHeight-650)/2,A=window.open(S,"OAuth2Login",`width=500,height=650,left=${I},top=${O},popup=1`);return new Promise((e,t)=>{if(!A)return void t(Error("Unable to open login window. Please allow popups."));let o=`oauth2_${m}`,r=null;try{r=new BroadcastChannel(o)}catch(e){f.logsEnabled&&console.log(`[OAuth2:${g}] BroadcastChannel not supported, using postMessage only`)}let i=(e,t,o)=>{window.removeEventListener("message",e),clearTimeout(t),clearInterval(o),r&&r.close()},n=o=>
1{if((null==o?void 0:o.type)==="oauth-response"){if((null==o?void 0:o.provider)&&"oauth2"!==o.provider||(null==o?void 0:o.providerId)&&o.providerId!==g)return!1;i(l,c,d);let{provider:t,type:r}=o;return e({provider:"oauth2",result:(0,h.Tt)(o,["provider","type"])}),!0}return(null==o?void 0:o.type)==="oauth-error"&&(null==o||!o.provider||"oauth2"===o.provider)&&(i(l,c,d),t(a(o.error||"OAuth2 login was cancelled.")),!0)};r&&(r.onmessage=e=>{n(e.data)});let l=e=>{e.origin===window.location.origin&&n(e.data)};window.addEventListener("message",l);let c=window.setTimeout(()=>{i(l,c,d);try{A.close()}catch(e){}t(Error("OAuth2 login timed out."))},3e5),d=window.setInterval(()=>{try{A.closed&&(i(l,c,d),t(s("OAuth2 login window was closed.")))}catch(e){clearInterval(d),f.logsEnabled&&console.log(`[OAuth2:${g}] Cannot check popup.closed due to cross-origin restrictions. Relying on message handlers and timeout.`)}},1e3)})}async logout(e){await this.ensureDiscovered(e);let t=this.providers.get(e),o=this.getStoredTokens(e);if(localStorage.removeItem(this.getTokensKey(e)),null==t?void 0:t.logoutUrl)try{let e=new URL(t.logoutUrl);(null==o?void 0:o.idToken)&&e.searchParams.set("id_token_hint",o.idToken);let r=t.postLogoutRedirectUrl;if(r&&e.searchParams.set("post_logout_redirect_uri",r),t.additionalLogoutParameters)for(let[o,r]of Object.entries(t.additionalLogoutParameters))e.searchParams.set(o,r);window.open(e.toString(),"_blank")}catch(e){window.open(t.logoutUrl,"_blank")}}async isLoggedIn(e){let t=this.getStoredTokens(e);if(!t)return{isLoggedIn:!1};let o=t.expiresAt>Date.now();return o||localStorage.removeItem(this.getTokensKey(e)),{isLoggedIn:o}}async getAuthorizationCode(e){let t=this.getStoredTokens(e);if(!t)throw Error(`OAuth2 access token is not available for provider '${e}'.`);return{accessToken:t.accessToken,jwt:t.idToken}}async refresh(e){await this.refreshToken(e)}async refreshToken(e,t,o){var r,i,n,s,a,l;await this.ensureDiscovered(e);let c=this.getProvider(e),d=this.getStoredTokens(e),u=null!=t?t:null==d?void 0:d.refreshToken;if(!u)throw Error(`No OAuth2 refresh token is available for provider '${e}'. Include offline_access scope to receive one.`);if(!c.accessTokenEndpoint)throw Error(`No accessTokenEndpoint configured for provider '${e}'.`);let h=await this.refreshWithRefreshToken(e,u,o),p=h.expires_in?Date.now()+1e3*h.expires_in:Date.now()+36e5,g=null!=(n=null!=(i=null==(r=h.scope)?void 0:r.split(" ").filter(Boolean))?i:null==d?void 0:d.scope)?n:[],f=null;c.resourceUrl&&(f=await this.fetchResource(e,h.access_token));let w=null!=(s=h.refresh_token)?s:u;return this.persistTokens(e,{accessToken:h.access_token,refreshToken:w,idToken:h.id_token,expiresAt:p,scope:g,tokenType:h.token_type}),{providerId:e,accessToken:{token:h.access_token,tokenType:h.token_type,expires:new Date(p).toISOString(),refreshToken:w},idToken:null!=(a=h.id_token)?a:null,refreshToken:null!=w?w:null,resourceData:f,scope:g,tokenType:h.token_type,expiresIn:null!=(l=h.expires_in)?l:null}}async handleOAuthRedirect(e,t){var o,r,n,s,a;let l=new URLSearchParams(e.search);new URLSearchParams(e.hash.slice(1)).forEach((e,t)=>{l.set(t,e)});let c=null!=t?t:l.get("state");if(!c)return null;let d=this.consumePendingLogin(c);if(!d)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:"OAuth2 login session expired or state mismatch."};let{providerId:u}=d;await this.ensureDiscovered(u);let h=this.providers.get(u);if(!h)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:`OAuth2 provider '${u}' configuration not found.`};let p=l.get("error");if(p)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:l.get("error_description")||p};try{let e;if(l.has("code")){let t=l.get("code");if(!t)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:"OAuth2 authorization code missing from redirect."};e=await this.exchangeAuthorizationCode(u,t,d)}else{if(!l.has("access_token"))return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:"No authorization code or access token in redirect."};e={access_token:l.get("access_token"),token_type:l.get("token_type")||"bearer",expires_in:l.has("expires_in")?parseInt(l.get("expires_in"),10):void 0,scope:l.get("scope")||void 0,id_token:l.get("id_token")||void 0}}let t=e.expires_in?Date.now()+1e3*e.expires_in:Date.now()+36e5,c=null!=(r=null==(o=e.scope)?void 0:o.split(" ").filter(
1Boolean))?r:[],p=null;return h.resourceUrl&&(p=await this.fetchResource(u,e.access_token)),this.persistTokens(u,{accessToken:e.access_token,refreshToken:e.refresh_token,idToken:e.id_token,expiresAt:t,scope:c,tokenType:e.token_type}),{provider:"oauth2",result:{providerId:u,accessToken:{token:e.access_token,tokenType:e.token_type,expires:new Date(t).toISOString(),refreshToken:e.refresh_token},idToken:null!=(n=e.id_token)?n:null,refreshToken:null!=(s=e.refresh_token)?s:null,resourceData:p,scope:c,tokenType:e.token_type,expiresIn:null!=(a=e.expires_in)?a:null}}}catch(e){if(e instanceof Error)return{error:e.message};return{error:"OAuth2 login failed unexpectedly."}}finally{localStorage.removeItem(i.OAUTH_STATE_KEY)}}async exchangeAuthorizationCode(e,t,o){let r=this.getProvider(e);if(!r.accessTokenEndpoint)throw Error(`No accessTokenEndpoint configured for provider '${e}'.`);let i=new URLSearchParams({grant_type:"authorization_code",client_id:r.appId,code:t,redirect_uri:o.redirectUri});if(r.pkceEnabled&&i.set("code_verifier",o.codeVerifier),r.clientSecret&&i.set("client_secret",r.clientSecret),r.additionalTokenParameters)for(let[e,t]of Object.entries(r.additionalTokenParameters))i.set(e,t);r.logsEnabled&&console.log(`[OAuth2:${e}] Exchanging code at:`,r.accessTokenEndpoint);let n=await fetch(r.accessTokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:i.toString()});if(!n.ok){let e=await n.text();throw Error(`OAuth2 token exchange failed (${n.status}): ${e}`)}return await n.json()}async refreshWithRefreshToken(e,t,o){let r=this.getProvider(e);if(!r.accessTokenEndpoint)throw Error(`No accessTokenEndpoint configured for provider '${e}'.`);let i=new URLSearchParams({grant_type:"refresh_token",refresh_token:t,client_id:r.appId});if(r.clientSecret&&i.set("client_secret",r.clientSecret),r.additionalTokenParameters)for(let[e,t]of Object.entries(r.additionalTokenParameters))i.set(e,t);if(o)for(let[e,t]of Object.entries(o))i.set(e,t);let n=await fetch(r.accessTokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:i.toString()});if(!n.ok){let e=await n.text();throw Error(`OAuth2 refresh failed (${n.status}): ${e}`)}return await n.json()}async fetchResource(e,t){let o=this.getProvider(e);if(!o.resourceUrl)throw Error(`No resourceUrl configured for provider '${e}'.`);let r={Authorization:`Bearer ${t}`};o.additionalResourceHeaders&&Object.assign(r,o.additionalResourceHeaders);let i=await fetch(o.resourceUrl,{headers:r});if(!i.ok){let e=await i.text();throw Error(`Unable to fetch OAuth2 resource (${i.status}): ${e}`)}return await i.json()}persistTokens(e,t){localStorage.setItem(this.getTokensKey(e),JSON.stringify(t))}getStoredTokens(e){let t=localStorage.getItem(this.getTokensKey(e));if(!t)return null;try{return JSON.parse(t)}catch(t){return console.warn(`Failed to parse stored OAuth2 tokens for provider '${e}'`,t),null}}persistPendingLogin(e,t){localStorage.setItem(`${this.STATE_PREFIX}${e}`,JSON.stringify(t))}consumePendingLogin(e){let t=`${this.STATE_PREFIX}${e}`,o=localStorage.getItem(t);if(localStorage.removeItem(t),!o)return null;try{return JSON.parse(o)}catch(e){return console.warn("Failed to parse pending OAuth2 login payload",e),null}}generateState(){return[...crypto.getRandomValues(new Uint8Array(16))].map(e=>e.toString(16).padStart(2,"0")).join("")}generateCodeVerifier(){let e=new Uint8Array(64);return crypto.getRandomValues(e),Array.from(e).map(e=>"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"[e%66]).join("")}async generateCodeChallenge(e){let t=new TextEncoder().encode(e),o=await crypto.subtle.digest("SHA-256",t);return this.base64UrlEncode(new Uint8Array(o))}base64UrlEncode(e){let t="";return e.forEach(e=>t+=String.fromCharCode(e)),btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}decodeIdToken(e){let t=e.split(".");if(t.length<2)throw Error("Invalid JWT: missing parts");let o=t[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(atob(o+"=".repeat((4-o.length%4)%4)))}getAccessTokenExpirationDate(e){let t=this.getStoredTokens(e);return(null==t?void 0:t.expiresAt)?{expirationDate:new Date(t.expiresAt).toISOString()}:{expirationDate:null}}isAccessTokenAvailable(e){let t=this.getStoredTokens(e);return{isAvailable:!!(null==t?void 0:t.accessToken)}}isAccessTokenExpired(e){let t=this.getStoredTokens(e);return(null==t?void 0:t.expiresAt)?{isExpired:t.expiresAt<=Date.now()}:{isExpired:!0}}isRefreshTokenAvailable(e){let t=this.getStoredTokens(e);return{isAvailable:!!(null==t?void 0:t.refreshToken)}}}class g extends i{constructor(){super(...arguments),this.clientId=null,this.redirectUrl=null,this.defaultScopes=["tweet.read","users.read"],this.forceLogin=!1,this.TOKENS_KEY="capgo_social_login_twitter_tokens_v1",this.STATE_PREFIX="capgo_social_login_twitter_state_"}async initialize(e,t,o,r,i){this.clientId=e,this.redirectUrl=null!=t?t:null,(null==o?void 0:o.length)&&(this.defaultScopes=o),this.forceLogin=null!=r&&r,this.audience=null!=i?i:void 0}async login(e){var t,o,r,n,l,c;if(!this.clientId)throw Error("Twitter Client ID not configured. Call initialize() first.");let d=null!=(o=null!=(t=e.redirectUrl)?t:this.redirectUrl)?o:window.location.origin+window.location.pathname,u=(null==(r=e.scopes)?void 0:r.length)?e.scopes:this.defaultScopes,p=null!=(n=e.state)?n:this.generateState(),g=null!=(l=e.codeVerifier)?l:this.generateCodeVerifier(),f=await this.generateCodeChallenge(g);this.persistPendingLogin(p,{clientId:this.clientId,codeVerifier:g,redirectUri:d,scopes:u}),localStorage.setItem(i.OAUTH_STATE_KEY,JSON.stringify({provider:"twitter",state:p}));let w=new URLSearchParams({response_type:"code",client_id:this.clientId,redirect_uri:d,scope:u.join(" "),state:p,code_challenge:f,code_challenge_method:"S256"});(null!=(c=e.forceLogin)?c:this.forceLogin)===!0&&w.set("force_login","true"),this.audience&&w.set("audience",this.audience);let v=`https://x.com/i/oauth2/authorize?${w.toString()}`,m=window.screenX+(window.outerWidth-500)/2,T=window.screenY+(window.outerHeight-650)/2,_=window.open(v,"XLogin",`width=500,height=650,left=${m},top=${T},popup=1`);return new Promise((e,t)=>
1{if(!_)return void t(Error("Unable to open login window. Please allow popups."));let o=`twitter_oauth_${p}`,r=null;try{r=new BroadcastChannel(o)}catch(e){}let i=(e,t,o)=>{window.removeEventListener("message",e),clearTimeout(t),clearInterval(o),r&&r.close()},n=o=>{if((null==o?void 0:o.type)==="oauth-response"){if((null==o?void 0:o.provider)&&"twitter"!==o.provider)return!1;i(l,c,d);let{provider:t,type:r}=o;return e({provider:"twitter",result:(0,h.Tt)(o,["provider","type"])}),!0}return(null==o?void 0:o.type)==="oauth-error"&&(null==o||!o.provider||"twitter"===o.provider)&&(i(l,c,d),t(a(o.error||"Twitter login was cancelled.")),!0)};r&&(r.onmessage=e=>{n(e.data)});let l=e=>{e.origin===window.location.origin&&n(e.data)};window.addEventListener("message",l);let c=window.setTimeout(()=>{i(l,c,d);try{_.close()}catch(e){}t(Error("Twitter login timed out."))},3e5),d=window.setInterval(()=>{try{_.closed&&(i(l,c,d),t(s("Twitter login window was closed.")))}catch(e){clearInterval(d)}},1e3)})}async logout(){localStorage.removeItem(this.TOKENS_KEY)}async isLoggedIn(){let e=this.getStoredTokens();if(!e)return{isLoggedIn:!1};let t=e.expiresAt>Date.now();return t||localStorage.removeItem(this.TOKENS_KEY),{isLoggedIn:t}}async getAuthorizationCode(){let e=this.getStoredTokens();if(!e)throw Error("Twitter access token is not available.");return{accessToken:e.accessToken}}async refresh(){let e=this.getStoredTokens();if(!(null==e?void 0:e.refreshToken))throw Error("No Twitter refresh token is available. Include offline.access scope to receive one.");await this.refreshWithRefreshToken(e.refreshToken)}async handleOAuthRedirect(e,t){let o=e.searchParams,r=null!=t?t:o.get("state");if(!r)return null;let n=this.consumePendingLogin(r);if(!n)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:"Twitter login session expired or state mismatch."};let s=o.get("error");if(s)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:o.get("error_description")||s};let a=o.get("code");if(!a)return localStorage.removeItem(i.OAUTH_STATE_KEY),{error:"Twitter authorization code missing from redirect."};try{let e=await this.exchangeAuthorizationCode(a,n),t=await this.fetchProfile(e.access_token),o=Date.now()+1e3*e.expires_in,r=e.scope.split(" ").filter(Boolean);return this.persistTokens({accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:o,scope:r,tokenType:e.token_type,userId:t.id,profile:t}),{provider:"twitter",result:{accessToken:{token:e.access_token,tokenType:e.token_type,expires:new Date(o).toISOString(),userId:t.id},refreshToken:e.refresh_token,scope:r,tokenType:e.token_type,expiresIn:e.expires_in,profile:t}}}catch(e){if(e instanceof Error)return{error:e.message};return{error:"Twitter login failed unexpectedly."}}finally{localStorage.removeItem(i.OAUTH_STATE_KEY)}}async exchangeAuthorizationCode(e,t){let o=new URLSearchParams({grant_type:"authorization_code",client_id:t.clientId,code:e,redirect_uri:t.redirectUri,code_verifier:t.codeVerifier}),r=await fetch("https://api.x.com/2/oauth2/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:o.toString()});if(!r.ok){let e=await r.text();throw Error(`Twitter token exchange failed (${r.status}): ${e}`)}return await r.json()}async refreshWithRefreshToken(e){var t,o;let r=new URLSearchParams({grant_type:"refresh_token",refresh_token:e,client_id:null!=(t=this.clientId)?t:""}),i=await fetch("https://api.x.com/2/oauth2/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()});if(!i.ok){let e=await i.text();throw Error(`Twitter refresh failed (${i.status}): ${e}`)}let n=await i.json(),s=await this.fetchProfile(n.access_token),a=Date.now()+1e3*n.expires_in,l=n.scope.split(" ").filter(Boolean);this.persistTokens({accessToken:n.access_token,refreshToken:null!=(o=n.refresh_token)?o:e,expiresAt:a,scope:l,tokenType:n.token_type,userId:s.id,profile:s})}async fetchProfile(e){var t,o,r,i;let n=await fetch("https://api.x.com/2/users/me?user.fields=profile_image_url,verified,name,username",{headers:{Authorization:`Bearer ${e}`}});if(!n.ok){let e=await n.text();throw Error(`Unable to fetch Twitter profile (${n.status}): ${e}`)}let s=await n.json();if(!s.data)throw Error("Twitter profile payload is missing data.");return{id:s.data.id,username:s.data.username,name:null!=(t=s.data.name)?t:null,profileImageUrl:null!=(o=s.data.profile_image_url)?o:null,verified:null!=(r=s.data.verified)&&r,email:null!=(i=s.data.email)?i:null}}persistTokens(e){localStorage.setItem(this.TOKENS_KEY,JSON.stringify(e))}getStoredTokens(){let e=localStorage.getItem(this.TOKENS_KEY);if(!e)return null;try{return JSON.parse(e)}catch(e){return console.warn("Failed to parse stored Twitter tokens",e),null}}persistPendingLogin(e,t){localStorage.setItem(`${this.STATE_PREFIX}${e}`,JSON.stringify(t))}consumePendingLogin(e){let t=`${this.STATE_PREFIX}${e}`,o=localStorage.getItem(t);if(localStorage.removeItem(t),!o)return null;try{return JSON.parse(o)}catch(e){return console.warn("Failed to parse pending Twitter login payload",e),null}}generateState(){return[...crypto.getRandomValues(new Uint8Array(16))].map(e=>e.toString(16).padStart(2,"0")).join("")}generateCodeVerifier(){let e=new Uint8Array(64);return crypto.getRandomValues(e),Array.from(e).map(e=>"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"[e%66]).join("")}async generateCodeChallenge(e){let t=new TextEncoder().encode(e),o=await crypto.subtle.digest("SHA-256",t);return this.base64UrlEncode(new Uint8Array(o))}base64UrlEncode(e){let t="";
1return e.forEach(e=>t+=String.fromCharCode(e)),btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}}class f extends r.WebPlugin{constructor(){super(),this.googleProvider=new u,this.appleProvider=new l,this.facebookProvider=new c,this.twitterProvider=new g,this.oauth2Provider=new p;const e=!!localStorage.getItem(f.OAUTH_STATE_KEY),t=!!window.opener||f.POPUP_WINDOW_NAMES.has(window.name);e&&t&&this.finishOAuthRedirectInPopup().catch(e=>{console.error("Failed to finish OAuth redirect",e);try{window.close()}catch(e){}})}async parseRedirectResult(){var e;let t,o,r=new URL(window.location.href),i=localStorage.getItem(f.OAUTH_STATE_KEY),n=null;if(i)try{let r=JSON.parse(i);n=null!=(e=r.provider)?e:null,t=r.state,o=r.nonce}catch(e){n="true"===i?"google":null}let s=null;switch(n){case"twitter":s=await this.twitterProvider.handleOAuthRedirect(r,t);break;case"oauth2":s=await this.oauth2Provider.handleOAuthRedirect(r,t);break;default:s=this.googleProvider.handleOAuthRedirect(r)}return{provider:n,state:t,nonce:o,result:s}}async finishOAuthRedirectInPopup(){var e;let t,o=await this.parseRedirectResult(),r=o.result;if(r){if("error"in r){let i=null!=(e=o.provider)?e:null,n=a(r.error);t=Object.assign({type:"oauth-error",provider:i,error:n.message},n.code?{code:n.code}:null)}else t=Object.assign({type:"oauth-response",provider:r.provider},r.result);try{window.opener&&window.opener.postMessage(t,window.location.origin)}catch(e){console.log("postMessage to opener failed, using BroadcastChannel")}try{let e=null;if("oauth2"===o.provider&&o.state?e=`oauth2_${o.state}`:"twitter"===o.provider&&o.state?e=`twitter_oauth_${o.state}`:"google"===o.provider&&o.nonce&&(e=`google_oauth_${o.nonce}`),e){let o=new BroadcastChannel(e);o.postMessage(t),o.close()}}catch(e){console.log("BroadcastChannel not available")}window.close()}}async initialize(e){var t,o,r,i;let n=[];(null==(t=e.google)?void 0:t.webClientId)&&n.push(this.googleProvider.initialize(e.google.webClientId,e.google.mode,e.google.hostedDomain,e.google.redirectUrl)),(null==(o=e.apple)?void 0:o.clientId)&&n.push(this.appleProvider.initialize(e.apple.clientId,e.apple.redirectUrl,e.apple.useProperTokenExchange)),(null==(r=e.facebook)?void 0:r.appId)&&n.push(this.facebookProvider.initialize(e.facebook.appId,e.facebook.locale)),(null==(i=e.twitter)?void 0:i.clientId)&&n.push(this.twitterProvider.initialize(e.twitter.clientId,e.twitter.redirectUrl,e.twitter.defaultScopes,e.twitter.forceLogin,e.twitter.audience)),e.oauth2&&Object.keys(e.oauth2).length>0&&n.push(this.oauth2Provider.initializeProviders(e.oauth2)),await Promise.all(n)}async login(e){switch(e.provider){case"google":return this.googleProvider.login(e.options);case"apple":return this.appleProvider.login(e.options);case"facebook":return this.facebookProvider.login(e.options);case"twitter":return this.twitterProvider.login(e.options);case"oauth2":return this.oauth2Provider.login(e.options);default:throw Error(`Login for ${e.provider} is not implemented on web`)}}async logout(e){switch(e.provider){case"google":return this.googleProvider.logout();case"apple":return this.appleProvider.logout();case"facebook":return this.facebookProvider.logout();case"twitter":return this.twitterProvider.logout();case"oauth2":if(!e.providerId)throw Error("providerId is required for oauth2 logout");return this.oauth2Provider.logout(e.providerId);default:throw Error(`Logout for ${e.provider} is not implemented`)}}async isLoggedIn(e){switch(e.provider){case"google":return this.googleProvider.isLoggedIn();case"apple":return this.appleProvider.isLoggedIn();case"facebook":return this.facebookProvider.isLoggedIn();case"twitter":return this.twitterProvider.isLoggedIn();case"oauth2":if(!e.providerId)throw Error("providerId is required for oauth2 isLoggedIn");return this.oauth2Provider.isLoggedIn(e.providerId);default:throw Error(`isLoggedIn for ${e.provider} is not implemented`)}}async getAuthorizationCode(e){switch(e.provider){case"google":return this.googleProvider.getAuthorizationCode();case"apple":return this.appleProvider.getAuthorizationCode();case"facebook":return this.facebookProvider.getAuthorizationCode();case"twitter":return this.twitterProvider.getAuthorizationCode();case"oauth2":if(!e.providerId)throw Error("providerId is required for oauth2 getAuthorizationCode");return this.oauth2Provider.getAuthorizationCode(e.providerId);default:throw Error(`getAuthorizationCode for ${e.provider} is not implemented`)}}async refresh(e){switch(e.provider){case"google":return this.googleProvider.refresh();case"apple":return this.appleProvider.refresh();case"facebook":return this.facebookProvider.refresh(e.options);case"twitter":return this.twitterProvider.refresh();case"oauth2":{let t=e.options;if(!(null==t?void 0:t.providerId))throw Error("providerId is required for oauth2 refresh");return this.oauth2Provider.refresh(t.providerId)}default:throw Error(`Refresh for ${e.provider} is not implemented`)}}async providerSpecificCall(e){throw Error(`Provider specific call for ${e.call} is not implemented`)}async refreshToken(e){if("oauth2"!==e.provider)throw Error("refreshToken is only implemented for oauth2 on web");return this.oauth2Provider.refreshToken(e.providerId,e.refreshToken,e.additionalParameters)}async handleRedirectCallback(){let e=(await this.parseRedirectResult()).result;if(!e)return null;if("error"in e)throw a(e.error);return e}async decodeIdToken(e){var t;let o=null!=(t=null==e?void 0:e.idToken)?t:null==e?void 0:e.token;if(!o)throw Error("idToken (or token) is required");return{claims:this.oauth2Provider.decodeIdToken(o)}}async getAccessTokenExpirationDate(e){if("number"!=typeof(null==e?void 0:e.accessTokenExpirationDate))throw Error("accessTokenExpirationDate is required");return{date:new Date(e.accessTokenExpirationDate).toISOString()}}async isAccessTokenAvailable(e){var t;let o=null!=(t=null==e?void 0:e.accessToken)?t:null;return{isAvailable:"string"==typeof o&&o.length>0}}async isAccessTokenExpired(e){if("number"!=typeof(null==e?void 0:e.accessTokenExpirationDate))throw Error("accessTokenExpirationDate is required");return{isExpired:e.accessTokenExpirationDate<=Date.now()}}async isRefreshTokenAvailable(e){var t;let o=null!=(t=null==e?void 0:e.refreshToken)?t:null;return{isAvailable:"string"==typeof o&&o.length>0}}async getPluginVersion(){return{version:"web"}}
1async openSecureWindow(e){let t=[["width",600],["height",550],["left",screen.width/2-300],["top",screen.height/2-275]].map(e=>e.join("=")).join(","),o=window.open(e.authEndpoint,"Authorization",t);return"function"==typeof o.focus&&o.focus(),new Promise((t,o)=>{let r=new BroadcastChannel(e.broadcastChannelName||"oauth-channel");r.addEventListener("message",i=>{i.data.startsWith(e.redirectUri)?(r.close(),t({redirectedUri:i.data})):(r.close(),o(Error("Redirect URI does not match, expected "+e.redirectUri+" but got "+i.data)))}),setTimeout(()=>{r.close(),o(Error("The sign-in flow timed out"))},3e5)})}}f.OAUTH_STATE_KEY="social_login_oauth_pending",f.POPUP_WINDOW_NAMES=new Set(["OAuth2Login","XLogin","Google Sign In","Authorization"])}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.