@inrupt/solid-client-authn-browser 1.11.8-alpha.1 → 1.11.8-alpha.2
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/ClientAuthentication.d.ts +18 -17
- package/dist/Session.d.ts +35 -35
- package/dist/constant.d.ts +2 -2
- package/dist/defaultSession.d.ts +9 -9
- package/dist/dependencies.d.ts +6 -6
- package/dist/iframe.d.ts +3 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.es.js +1693 -0
- package/dist/index.js +1717 -27
- package/dist/login/AggregateLoginHandler.d.ts +4 -4
- package/dist/login/oidc/AggregateOidcHandler.d.ts +4 -4
- package/dist/login/oidc/ClientRegistrar.d.ts +6 -6
- package/dist/login/oidc/IssuerConfigFetcher.d.ts +8 -8
- package/dist/login/oidc/OidcLoginHandler.d.ts +10 -10
- package/dist/login/oidc/Redirector.d.ts +4 -4
- package/dist/login/oidc/oidcHandlers/AuthorizationCodeWithPkceOidcHandler.d.ts +8 -8
- package/dist/login/oidc/oidcHandlers/OidcHandlerCanHandleTest.d.ts +9 -9
- package/dist/login/oidc/redirectHandler/AggregateRedirectHandler.d.ts +4 -4
- package/dist/login/oidc/redirectHandler/AuthCodeRedirectHandler.d.ts +15 -15
- package/dist/login/oidc/redirectHandler/ErrorOidcHandler.d.ts +9 -9
- package/dist/login/oidc/redirectHandler/FallbackRedirectHandler.d.ts +7 -7
- package/dist/login/oidc/refresh/TokenRefresher.d.ts +10 -10
- package/dist/login/webid/WebIdLoginHandler.d.ts +5 -5
- package/dist/logout/GeneralLogoutHandler.d.ts +7 -7
- package/dist/sessionInfo/SessionInfoManager.d.ts +16 -16
- package/dist/solid-client-authn.bundle.js +1720 -2
- package/dist/storage/BrowserStorage.d.ts +7 -7
- package/dist/storage/StorageUtility.d.ts +4 -4
- package/dist/util/UuidGenerator.d.ts +6 -6
- package/dist/util/urlPath.d.ts +1 -1
- package/examples/demoClientApp/package-lock.json +67 -0
- package/examples/demoClientApp/package.json +2 -1
- package/examples/demoClientApp/src/DemoClientApp.js +9 -1
- package/jest.config.js +2 -1
- package/package.json +13 -10
- package/rollup.config.js +57 -0
- package/src/ClientAuthentication.spec.ts +69 -1
- package/src/ClientAuthentication.ts +32 -14
- package/src/login/oidc/oidcHandlers/AuthorizationCodeWithPkceOidcHandler.spec.ts +2 -9
- package/src/login/oidc/redirectHandler/__mocks__/RedirectHandler.ts +13 -0
- package/src/index.browser.spec.ts +0 -27
- package/src/index.browser.ts +0 -24
- package/webpack.browser.js +0 -19
- package/webpack.common.js +0 -22
- package/webpack.config.js +0 -8
- package/webpack.dev.js +0 -17
- package/webpack.prod.js +0 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ILoginHandler, ILoginOptions, AggregateHandler, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class AggregateLoginHandler extends AggregateHandler<[ILoginOptions], LoginResult> implements ILoginHandler {
|
|
3
|
-
constructor(loginHandlers: ILoginHandler[]);
|
|
4
|
-
}
|
|
1
|
+
import { ILoginHandler, ILoginOptions, AggregateHandler, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class AggregateLoginHandler extends AggregateHandler<[ILoginOptions], LoginResult> implements ILoginHandler {
|
|
3
|
+
constructor(loginHandlers: ILoginHandler[]);
|
|
4
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IOidcHandler, IOidcOptions, AggregateHandler, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class AggregateOidcHandler extends AggregateHandler<[IOidcOptions], LoginResult> implements IOidcHandler {
|
|
3
|
-
constructor(oidcLoginHandlers: IOidcHandler[]);
|
|
4
|
-
}
|
|
1
|
+
import { IOidcHandler, IOidcOptions, AggregateHandler, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class AggregateOidcHandler extends AggregateHandler<[IOidcOptions], LoginResult> implements IOidcHandler {
|
|
3
|
+
constructor(oidcLoginHandlers: IOidcHandler[]);
|
|
4
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { IStorageUtility, IClientRegistrar, IIssuerConfig, IClient, IClientRegistrarOptions } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class ClientRegistrar implements IClientRegistrar {
|
|
3
|
-
private storageUtility;
|
|
4
|
-
constructor(storageUtility: IStorageUtility);
|
|
5
|
-
getClient(options: IClientRegistrarOptions, issuerConfig: IIssuerConfig): Promise<IClient>;
|
|
6
|
-
}
|
|
1
|
+
import { IStorageUtility, IClientRegistrar, IIssuerConfig, IClient, IClientRegistrarOptions } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class ClientRegistrar implements IClientRegistrar {
|
|
3
|
+
private storageUtility;
|
|
4
|
+
constructor(storageUtility: IStorageUtility);
|
|
5
|
+
getClient(options: IClientRegistrarOptions, issuerConfig: IIssuerConfig): Promise<IClient>;
|
|
6
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { IIssuerConfig, IIssuerConfigFetcher, IStorageUtility } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export declare const WELL_KNOWN_OPENID_CONFIG = ".well-known/openid-configuration";
|
|
3
|
-
export default class IssuerConfigFetcher implements IIssuerConfigFetcher {
|
|
4
|
-
private storageUtility;
|
|
5
|
-
constructor(storageUtility: IStorageUtility);
|
|
6
|
-
static getLocalStorageKey(issuer: string): string;
|
|
7
|
-
fetchConfig(issuer: string): Promise<IIssuerConfig>;
|
|
8
|
-
}
|
|
1
|
+
import { IIssuerConfig, IIssuerConfigFetcher, IStorageUtility } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export declare const WELL_KNOWN_OPENID_CONFIG = ".well-known/openid-configuration";
|
|
3
|
+
export default class IssuerConfigFetcher implements IIssuerConfigFetcher {
|
|
4
|
+
private storageUtility;
|
|
5
|
+
constructor(storageUtility: IStorageUtility);
|
|
6
|
+
static getLocalStorageKey(issuer: string): string;
|
|
7
|
+
fetchConfig(issuer: string): Promise<IIssuerConfig>;
|
|
8
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { IClientRegistrar, IIssuerConfigFetcher, ILoginOptions, ILoginHandler, IOidcHandler, IStorageUtility, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class OidcLoginHandler implements ILoginHandler {
|
|
3
|
-
private storageUtility;
|
|
4
|
-
private oidcHandler;
|
|
5
|
-
private issuerConfigFetcher;
|
|
6
|
-
private clientRegistrar;
|
|
7
|
-
constructor(storageUtility: IStorageUtility, oidcHandler: IOidcHandler, issuerConfigFetcher: IIssuerConfigFetcher, clientRegistrar: IClientRegistrar);
|
|
8
|
-
canHandle(options: ILoginOptions): Promise<boolean>;
|
|
9
|
-
handle(options: ILoginOptions): Promise<LoginResult>;
|
|
10
|
-
}
|
|
1
|
+
import { IClientRegistrar, IIssuerConfigFetcher, ILoginOptions, ILoginHandler, IOidcHandler, IStorageUtility, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class OidcLoginHandler implements ILoginHandler {
|
|
3
|
+
private storageUtility;
|
|
4
|
+
private oidcHandler;
|
|
5
|
+
private issuerConfigFetcher;
|
|
6
|
+
private clientRegistrar;
|
|
7
|
+
constructor(storageUtility: IStorageUtility, oidcHandler: IOidcHandler, issuerConfigFetcher: IIssuerConfigFetcher, clientRegistrar: IClientRegistrar);
|
|
8
|
+
canHandle(options: ILoginOptions): Promise<boolean>;
|
|
9
|
+
handle(options: ILoginOptions): Promise<LoginResult>;
|
|
10
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IRedirector, IRedirectorOptions } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class Redirector implements IRedirector {
|
|
3
|
-
redirect(redirectUrl: string, options?: IRedirectorOptions): void;
|
|
4
|
-
}
|
|
1
|
+
import { IRedirector, IRedirectorOptions } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class Redirector implements IRedirector {
|
|
3
|
+
redirect(redirectUrl: string, options?: IRedirectorOptions): void;
|
|
4
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { IOidcHandler, IOidcOptions, IRedirector, IStorageUtility, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class AuthorizationCodeWithPkceOidcHandler implements IOidcHandler {
|
|
3
|
-
private storageUtility;
|
|
4
|
-
private redirector;
|
|
5
|
-
constructor(storageUtility: IStorageUtility, redirector: IRedirector);
|
|
6
|
-
canHandle(oidcLoginOptions: IOidcOptions): Promise<boolean>;
|
|
7
|
-
handle(oidcLoginOptions: IOidcOptions): Promise<LoginResult>;
|
|
8
|
-
}
|
|
1
|
+
import { IOidcHandler, IOidcOptions, IRedirector, IStorageUtility, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class AuthorizationCodeWithPkceOidcHandler implements IOidcHandler {
|
|
3
|
+
private storageUtility;
|
|
4
|
+
private redirector;
|
|
5
|
+
constructor(storageUtility: IStorageUtility, redirector: IRedirector);
|
|
6
|
+
canHandle(oidcLoginOptions: IOidcOptions): Promise<boolean>;
|
|
7
|
+
handle(oidcLoginOptions: IOidcOptions): Promise<LoginResult>;
|
|
8
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { IOidcOptions } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
declare const canHandleTests: {
|
|
3
|
-
[key: string]: {
|
|
4
|
-
oidcOptions: IOidcOptions;
|
|
5
|
-
message: string;
|
|
6
|
-
shouldPass: boolean;
|
|
7
|
-
}[];
|
|
8
|
-
};
|
|
9
|
-
export default canHandleTests;
|
|
1
|
+
import { IOidcOptions } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
declare const canHandleTests: {
|
|
3
|
+
[key: string]: {
|
|
4
|
+
oidcOptions: IOidcOptions;
|
|
5
|
+
message: string;
|
|
6
|
+
shouldPass: boolean;
|
|
7
|
+
}[];
|
|
8
|
+
};
|
|
9
|
+
export default canHandleTests;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IRedirectHandler, AggregateHandler, RedirectInput, RedirectResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class AggregateRedirectHandler extends AggregateHandler<RedirectInput, RedirectResult> implements IRedirectHandler {
|
|
3
|
-
constructor(redirectHandlers: IRedirectHandler[]);
|
|
4
|
-
}
|
|
1
|
+
import { IRedirectHandler, AggregateHandler, RedirectInput, RedirectResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class AggregateRedirectHandler extends AggregateHandler<RedirectInput, RedirectResult> implements IRedirectHandler {
|
|
3
|
+
constructor(redirectHandlers: IRedirectHandler[]);
|
|
4
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { IClientRegistrar, IIssuerConfigFetcher, IRedirectHandler, ISessionInfo, ISessionInfoManager, IStorageUtility, ITokenRefresher } from "@inrupt/solid-client-authn-core";
|
|
3
|
-
import { EventEmitter } from "events";
|
|
4
|
-
export declare class AuthCodeRedirectHandler implements IRedirectHandler {
|
|
5
|
-
private storageUtility;
|
|
6
|
-
private sessionInfoManager;
|
|
7
|
-
private issuerConfigFetcher;
|
|
8
|
-
private clientRegistrar;
|
|
9
|
-
private tokerRefresher;
|
|
10
|
-
constructor(storageUtility: IStorageUtility, sessionInfoManager: ISessionInfoManager, issuerConfigFetcher: IIssuerConfigFetcher, clientRegistrar: IClientRegistrar, tokerRefresher: ITokenRefresher);
|
|
11
|
-
canHandle(redirectUrl: string): Promise<boolean>;
|
|
12
|
-
handle(redirectUrl: string, eventEmitter?: EventEmitter): Promise<ISessionInfo & {
|
|
13
|
-
fetch: typeof fetch;
|
|
14
|
-
}>;
|
|
15
|
-
}
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { IClientRegistrar, IIssuerConfigFetcher, IRedirectHandler, ISessionInfo, ISessionInfoManager, IStorageUtility, ITokenRefresher } from "@inrupt/solid-client-authn-core";
|
|
3
|
+
import { EventEmitter } from "events";
|
|
4
|
+
export declare class AuthCodeRedirectHandler implements IRedirectHandler {
|
|
5
|
+
private storageUtility;
|
|
6
|
+
private sessionInfoManager;
|
|
7
|
+
private issuerConfigFetcher;
|
|
8
|
+
private clientRegistrar;
|
|
9
|
+
private tokerRefresher;
|
|
10
|
+
constructor(storageUtility: IStorageUtility, sessionInfoManager: ISessionInfoManager, issuerConfigFetcher: IIssuerConfigFetcher, clientRegistrar: IClientRegistrar, tokerRefresher: ITokenRefresher);
|
|
11
|
+
canHandle(redirectUrl: string): Promise<boolean>;
|
|
12
|
+
handle(redirectUrl: string, eventEmitter?: EventEmitter): Promise<ISessionInfo & {
|
|
13
|
+
fetch: typeof fetch;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { IRedirectHandler, ISessionInfo } from "@inrupt/solid-client-authn-core";
|
|
3
|
-
import type { EventEmitter } from "events";
|
|
4
|
-
export declare class ErrorOidcHandler implements IRedirectHandler {
|
|
5
|
-
canHandle(redirectUrl: string): Promise<boolean>;
|
|
6
|
-
handle(redirectUrl: string, eventEmitter?: EventEmitter): Promise<ISessionInfo & {
|
|
7
|
-
fetch: typeof fetch;
|
|
8
|
-
}>;
|
|
9
|
-
}
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { IRedirectHandler, ISessionInfo } from "@inrupt/solid-client-authn-core";
|
|
3
|
+
import type { EventEmitter } from "events";
|
|
4
|
+
export declare class ErrorOidcHandler implements IRedirectHandler {
|
|
5
|
+
canHandle(redirectUrl: string): Promise<boolean>;
|
|
6
|
+
handle(redirectUrl: string, eventEmitter?: EventEmitter): Promise<ISessionInfo & {
|
|
7
|
+
fetch: typeof fetch;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { IRedirectHandler, ISessionInfo } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export declare class FallbackRedirectHandler implements IRedirectHandler {
|
|
3
|
-
canHandle(redirectUrl: string): Promise<boolean>;
|
|
4
|
-
handle(_redirectUrl: string): Promise<ISessionInfo & {
|
|
5
|
-
fetch: typeof fetch;
|
|
6
|
-
}>;
|
|
7
|
-
}
|
|
1
|
+
import { IRedirectHandler, ISessionInfo } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export declare class FallbackRedirectHandler implements IRedirectHandler {
|
|
3
|
+
canHandle(redirectUrl: string): Promise<boolean>;
|
|
4
|
+
handle(_redirectUrl: string): Promise<ISessionInfo & {
|
|
5
|
+
fetch: typeof fetch;
|
|
6
|
+
}>;
|
|
7
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { IClientRegistrar, IIssuerConfigFetcher, IStorageUtility, KeyPair, ITokenRefresher, TokenEndpointResponse } from "@inrupt/solid-client-authn-core";
|
|
3
|
-
import { EventEmitter } from "events";
|
|
4
|
-
export default class TokenRefresher implements ITokenRefresher {
|
|
5
|
-
private storageUtility;
|
|
6
|
-
private issuerConfigFetcher;
|
|
7
|
-
private clientRegistrar;
|
|
8
|
-
constructor(storageUtility: IStorageUtility, issuerConfigFetcher: IIssuerConfigFetcher, clientRegistrar: IClientRegistrar);
|
|
9
|
-
refresh(sessionId: string, refreshToken?: string, dpopKey?: KeyPair, eventEmitter?: EventEmitter): Promise<TokenEndpointResponse>;
|
|
10
|
-
}
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { IClientRegistrar, IIssuerConfigFetcher, IStorageUtility, KeyPair, ITokenRefresher, TokenEndpointResponse } from "@inrupt/solid-client-authn-core";
|
|
3
|
+
import { EventEmitter } from "events";
|
|
4
|
+
export default class TokenRefresher implements ITokenRefresher {
|
|
5
|
+
private storageUtility;
|
|
6
|
+
private issuerConfigFetcher;
|
|
7
|
+
private clientRegistrar;
|
|
8
|
+
constructor(storageUtility: IStorageUtility, issuerConfigFetcher: IIssuerConfigFetcher, clientRegistrar: IClientRegistrar);
|
|
9
|
+
refresh(sessionId: string, refreshToken?: string, dpopKey?: KeyPair, eventEmitter?: EventEmitter): Promise<TokenEndpointResponse>;
|
|
10
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ILoginOptions, ILoginHandler, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class WebIdLoginHandler implements ILoginHandler {
|
|
3
|
-
canHandle(_loginOptions: ILoginOptions): Promise<boolean>;
|
|
4
|
-
handle(_loginOptions: ILoginOptions): Promise<LoginResult>;
|
|
5
|
-
}
|
|
1
|
+
import { ILoginOptions, ILoginHandler, LoginResult } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class WebIdLoginHandler implements ILoginHandler {
|
|
3
|
+
canHandle(_loginOptions: ILoginOptions): Promise<boolean>;
|
|
4
|
+
handle(_loginOptions: ILoginOptions): Promise<LoginResult>;
|
|
5
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ILogoutHandler, ISessionInfoManager } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export default class GeneralLogoutHandler implements ILogoutHandler {
|
|
3
|
-
private sessionInfoManager;
|
|
4
|
-
constructor(sessionInfoManager: ISessionInfoManager);
|
|
5
|
-
canHandle(): Promise<boolean>;
|
|
6
|
-
handle(userId: string): Promise<void>;
|
|
7
|
-
}
|
|
1
|
+
import { ILogoutHandler, ISessionInfoManager } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export default class GeneralLogoutHandler implements ILogoutHandler {
|
|
3
|
+
private sessionInfoManager;
|
|
4
|
+
constructor(sessionInfoManager: ISessionInfoManager);
|
|
5
|
+
canHandle(): Promise<boolean>;
|
|
6
|
+
handle(userId: string): Promise<void>;
|
|
7
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { ISessionInfo, ISessionInfoManager, ISessionInternalInfo, ISessionInfoManagerOptions, IStorageUtility } from "@inrupt/solid-client-authn-core";
|
|
2
|
-
export declare function getUnauthenticatedSession(): ISessionInfo & {
|
|
3
|
-
fetch: typeof fetch;
|
|
4
|
-
};
|
|
5
|
-
export declare function clear(sessionId: string, storage: IStorageUtility): Promise<void>;
|
|
6
|
-
export declare class SessionInfoManager implements ISessionInfoManager {
|
|
7
|
-
private storageUtility;
|
|
8
|
-
constructor(storageUtility: IStorageUtility);
|
|
9
|
-
update(_sessionId: string, _options: ISessionInfoManagerOptions): Promise<void>;
|
|
10
|
-
get(sessionId: string): Promise<(ISessionInfo & ISessionInternalInfo) | undefined>;
|
|
11
|
-
getAll(): Promise<(ISessionInfo & ISessionInternalInfo)[]>;
|
|
12
|
-
clear(sessionId: string): Promise<void>;
|
|
13
|
-
register(_sessionId: string): Promise<void>;
|
|
14
|
-
getRegisteredSessionIdAll(): Promise<string[]>;
|
|
15
|
-
clearAll(): Promise<void>;
|
|
16
|
-
}
|
|
1
|
+
import { ISessionInfo, ISessionInfoManager, ISessionInternalInfo, ISessionInfoManagerOptions, IStorageUtility } from "@inrupt/solid-client-authn-core";
|
|
2
|
+
export declare function getUnauthenticatedSession(): ISessionInfo & {
|
|
3
|
+
fetch: typeof fetch;
|
|
4
|
+
};
|
|
5
|
+
export declare function clear(sessionId: string, storage: IStorageUtility): Promise<void>;
|
|
6
|
+
export declare class SessionInfoManager implements ISessionInfoManager {
|
|
7
|
+
private storageUtility;
|
|
8
|
+
constructor(storageUtility: IStorageUtility);
|
|
9
|
+
update(_sessionId: string, _options: ISessionInfoManagerOptions): Promise<void>;
|
|
10
|
+
get(sessionId: string): Promise<(ISessionInfo & ISessionInternalInfo) | undefined>;
|
|
11
|
+
getAll(): Promise<(ISessionInfo & ISessionInternalInfo)[]>;
|
|
12
|
+
clear(sessionId: string): Promise<void>;
|
|
13
|
+
register(_sessionId: string): Promise<void>;
|
|
14
|
+
getRegisteredSessionIdAll(): Promise<string[]>;
|
|
15
|
+
clearAll(): Promise<void>;
|
|
16
|
+
}
|