@openfort/react 0.0.14 → 0.0.16

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.
@@ -0,0 +1,2 @@
1
+ declare const ConnectWithMobile: React.FC<{}>;
2
+ export default ConnectWithMobile;
@@ -22,7 +22,7 @@ export type ContextValue = {
22
22
  open: boolean;
23
23
  setOpen: React.Dispatch<React.SetStateAction<boolean>>;
24
24
  route: ValueOf<typeof routes>;
25
- setRoute: React.Dispatch<React.SetStateAction<ValueOf<typeof routes>>>;
25
+ setRoute: (r: ValueOf<typeof routes>) => void;
26
26
  connector: Connector;
27
27
  setConnector: React.Dispatch<React.SetStateAction<Connector>>;
28
28
  errorMessage: ErrorMessage;
@@ -15,6 +15,7 @@ export declare const routes: {
15
15
  readonly ABOUT: "about";
16
16
  readonly CONNECTORS: "connectors";
17
17
  readonly MOBILECONNECTORS: "mobileConnectors";
18
+ readonly CONNECT_WITH_MOBILE: "connectWithMobile";
18
19
  readonly CONNECT: "connect";
19
20
  readonly DOWNLOAD: "download";
20
21
  readonly PROFILE: "profile";
@@ -1,4 +1,4 @@
1
- export declare function useConnectWithSiwe(): ({ onError, onConnect, }: {
1
+ export declare function useConnectWithSiwe(): ({ onError, onConnect, }?: {
2
2
  onError?: (error: string, status?: number) => void;
3
3
  onConnect?: () => void;
4
4
  }) => Promise<void>;
package/build/index.es.js CHANGED
@@ -4,13 +4,13 @@ import { http, useConfig, useConnectors as useConnectors$1, useConnect as useCon
4
4
  import { mainnet, polygon, optimism, arbitrum, sepolia } from 'wagmi/chains';
5
5
  import { safe, injected, coinbaseWallet, walletConnect } from '@wagmi/connectors';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
- import React, { useEffect, createContext, useState, useMemo, useRef, useCallback, createElement, useLayoutEffect, useContext } from 'react';
8
- import { detect } from 'detect-browser';
9
7
  import { Buffer } from 'buffer';
8
+ import React, { useEffect, createContext, useState, useMemo, useRef, useCallback, createElement, useLayoutEffect, useContext } from 'react';
10
9
  import { useQuery, useQueryClient } from '@tanstack/react-query';
11
10
  import { motion, AnimatePresence, MotionConfig } from 'framer-motion';
12
11
  import styled$1, { css, keyframes } from 'styled-components';
13
12
  import { createPortal } from 'react-dom';
13
+ import { detect } from 'detect-browser';
14
14
  import { useTransition } from 'react-transition-state';
15
15
  import ResizeObserver from 'resize-observer-polyfill';
16
16
  import useMeasure from 'react-use-measure';
@@ -22,7 +22,7 @@ import { createSiweMessage } from 'viem/siwe';
22
22
  import { signMessage } from '@wagmi/core';
23
23
  import calculateEntropy from 'fast-password-entropy';
24
24
 
25
- const OPENFORT_VERSION = '0.0.14';
25
+ const OPENFORT_VERSION = '0.0.16';
26
26
 
27
27
  var OpenfortErrorType;
28
28
  (function (OpenfortErrorType) {
@@ -298,76 +298,6 @@ var Logos = {
298
298
  Openfort,
299
299
  };
300
300
 
301
- const truncateRegex = /^(0x[a-zA-Z0-9]{4})[a-zA-Z0-9]+([a-zA-Z0-9]{4})$/;
302
- const truncateEthAddress = (address, separator = '••••') => {
303
- if (!address)
304
- return '';
305
- const match = address.match(truncateRegex);
306
- if (!match)
307
- return address;
308
- return `${match[1]}${separator}${match[2]}`;
309
- };
310
- const nFormatter = (num, digits = 2) => {
311
- if (num < 10000)
312
- return num.toFixed(2);
313
- const lookup = [
314
- { value: 1, symbol: '' },
315
- { value: 1e3, symbol: 'k' },
316
- { value: 1e6, symbol: 'm' },
317
- { value: 1e9, symbol: 'b' },
318
- { value: 1e12, symbol: 't' },
319
- { value: 1e15, symbol: 'p' },
320
- { value: 1e18, symbol: 'e' },
321
- ];
322
- const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
323
- var item = lookup
324
- .slice()
325
- .reverse()
326
- .find(function (item) {
327
- return num >= item.value;
328
- });
329
- return item
330
- ? (num / item.value).toFixed(digits).replace(rx, '$1') + item.symbol
331
- : '0';
332
- };
333
- const detectBrowser = () => {
334
- var _a;
335
- const browser = detect();
336
- return (_a = browser === null || browser === void 0 ? void 0 : browser.name) !== null && _a !== void 0 ? _a : '';
337
- };
338
- const detectOS = () => {
339
- var _a;
340
- const browser = detect();
341
- return (_a = browser === null || browser === void 0 ? void 0 : browser.os) !== null && _a !== void 0 ? _a : '';
342
- };
343
- const isIOS = () => {
344
- const os = detectOS();
345
- return os.toLowerCase().includes('ios');
346
- };
347
- const isAndroid = () => {
348
- const os = detectOS();
349
- return os.toLowerCase().includes('android');
350
- };
351
- const isMobile = () => {
352
- return isAndroid() || isIOS();
353
- };
354
- function flattenChildren(children) {
355
- const childrenArray = React.Children.toArray(children);
356
- return childrenArray.reduce((flatChildren, child) => {
357
- if (child.type === React.Fragment) {
358
- return flatChildren.concat(flattenChildren(child.props.children));
359
- }
360
- flatChildren.push(child);
361
- return flatChildren;
362
- }, []);
363
- }
364
- const isWalletConnectConnector = (connectorId) => connectorId === 'walletConnect';
365
- const isFamilyAccountsConnector = (connectorId) => connectorId === 'familyAccountsProvider';
366
- const isCoinbaseWalletConnector = (connectorId) => connectorId === 'coinbaseWalletSDK';
367
- const isPortoConnector = (connectorId) => connectorId === 'xyz.ithaca.porto';
368
- const isSafeConnector = (connectorId) => connectorId === 'safe';
369
- const isInjectedConnector = (connectorId) => connectorId === 'injected';
370
-
371
301
  // Organised in alphabetical order by key
372
302
  const walletConfigs = {
373
303
  mock: {
@@ -382,9 +312,7 @@ const walletConfigs = {
382
312
  ios: 'https://apps.apple.com/app/argent/id1358741926',
383
313
  },
384
314
  getWalletConnectDeeplink: (uri) => {
385
- return isAndroid()
386
- ? uri
387
- : `https://argent.link/app/wc?uri=${encodeURIComponent(uri)}`;
315
+ return `https://argent.link/app/wc?uri=${encodeURIComponent(uri)}`;
388
316
  },
389
317
  },
390
318
  'coinbaseWallet, coinbaseWalletSDK': {
@@ -443,9 +371,7 @@ const walletConfigs = {
443
371
  ios: 'https://family.co/download',
444
372
  },
445
373
  getWalletConnectDeeplink: (uri) => {
446
- return isAndroid()
447
- ? uri
448
- : `familywallet://wc?uri=${encodeURIComponent(uri)}`;
374
+ return `familywallet://wc?uri=${encodeURIComponent(uri)}`;
449
375
  },
450
376
  },
451
377
  familyAccountsProvider: {
@@ -480,7 +406,7 @@ const walletConfigs = {
480
406
  chrome: 'https://chrome.google.com/webstore/detail/frontier-wallet/kppfdiipphfccemcignhifpjkapfbihd',
481
407
  },
482
408
  getWalletConnectDeeplink: (uri) => {
483
- return isAndroid() ? uri : `frontier://wc?uri=${encodeURIComponent(uri)}`;
409
+ return `frontier://wc?uri=${encodeURIComponent(uri)}`;
484
410
  },
485
411
  },
486
412
  injected: {
@@ -504,9 +430,7 @@ const walletConfigs = {
504
430
  edge: 'https://microsoftedge.microsoft.com/addons/detail/metamask/ejbalbakoplchlghecdalmeeeajnimhm',
505
431
  },
506
432
  getWalletConnectDeeplink: (uri) => {
507
- return isAndroid()
508
- ? uri
509
- : `https://metamask.app.link/wc?uri=${encodeURIComponent(uri)}`;
433
+ return `https://metamask.app.link/wc?uri=${encodeURIComponent(uri)}`;
510
434
  },
511
435
  },
512
436
  'app.phantom': {
@@ -528,9 +452,7 @@ const walletConfigs = {
528
452
  brave: 'https://rainbow.me/extension?utm_source=connectkit',
529
453
  },
530
454
  getWalletConnectDeeplink: (uri) => {
531
- return isAndroid()
532
- ? uri
533
- : `https://rnbwapp.com/wc?uri=${encodeURIComponent(uri)}&connector=connectkit`;
455
+ return `https://rnbwapp.com/wc?uri=${encodeURIComponent(uri)}&connector=connectkit`;
534
456
  },
535
457
  },
536
458
  'io.rabby': {
@@ -551,9 +473,7 @@ const walletConfigs = {
551
473
  android: 'https://play.google.com/store/apps/details?id=io.gnosis.safe',
552
474
  },
553
475
  getWalletConnectDeeplink: (uri) => {
554
- return isAndroid()
555
- ? uri
556
- : `https://gnosis-safe.io/wc?uri=${encodeURIComponent(uri)}`;
476
+ return `https://gnosis-safe.io/wc?uri=${encodeURIComponent(uri)}`;
557
477
  },
558
478
  },
559
479
  'xyz.talisman': {
@@ -578,9 +498,7 @@ const walletConfigs = {
578
498
  ios: 'https://apps.apple.com/app/trust-crypto-bitcoin-wallet/id1288339409',
579
499
  },
580
500
  getWalletConnectDeeplink(uri) {
581
- return isAndroid()
582
- ? uri
583
- : `https://link.trustwallet.com/wc?uri=${encodeURIComponent(uri)}`;
501
+ return `https://link.trustwallet.com/wc?uri=${encodeURIComponent(uri)}`;
584
502
  },
585
503
  },
586
504
  infinityWallet: {
@@ -617,9 +535,7 @@ const walletConfigs = {
617
535
  android: 'https://play.google.com/store/apps/details?id=io.horizontalsystems.bankwallet',
618
536
  },
619
537
  getWalletConnectDeeplink: (uri) => {
620
- return isAndroid()
621
- ? uri
622
- : `https://unstoppable.money/wc?uri=${encodeURIComponent(uri)}`;
538
+ return `https://unstoppable.money/wc?uri=${encodeURIComponent(uri)}`;
623
539
  },
624
540
  },
625
541
  onto: {
@@ -632,9 +548,7 @@ const walletConfigs = {
632
548
  website: 'https://onto.app/en/download/',
633
549
  },
634
550
  getWalletConnectDeeplink: (uri) => {
635
- return isAndroid()
636
- ? uri
637
- : `https://onto.app/wc?uri=${encodeURIComponent(uri)}`;
551
+ return `https://onto.app/wc?uri=${encodeURIComponent(uri)}`;
638
552
  },
639
553
  },
640
554
  steak: {
@@ -647,9 +561,7 @@ const walletConfigs = {
647
561
  website: 'https://steakwallet.fi/download',
648
562
  },
649
563
  getWalletConnectDeeplink: (uri) => {
650
- return isAndroid()
651
- ? uri
652
- : `https://links.steakwallet.fi/wc?uri=${encodeURIComponent(uri)}`;
564
+ return `https://links.steakwallet.fi/wc?uri=${encodeURIComponent(uri)}`;
653
565
  },
654
566
  },
655
567
  ledger: {
@@ -663,9 +575,7 @@ const walletConfigs = {
663
575
  ios: 'https://apps.apple.com/app/ledger-live-web3-wallet/id1361671700',
664
576
  },
665
577
  getWalletConnectDeeplink: (uri) => {
666
- return isAndroid()
667
- ? uri
668
- : `ledgerlive://wc?uri=${encodeURIComponent(uri)}`;
578
+ return `ledgerlive://wc?uri=${encodeURIComponent(uri)}`;
669
579
  },
670
580
  shouldDeeplinkDesktop: true,
671
581
  },
@@ -679,9 +589,7 @@ const walletConfigs = {
679
589
  website: 'https://zerion.io/',
680
590
  },
681
591
  getWalletConnectDeeplink: (uri) => {
682
- return isAndroid()
683
- ? uri
684
- : `https://app.zerion.io/wc?uri=${encodeURIComponent(uri)}`;
592
+ return `https://app.zerion.io/wc?uri=${encodeURIComponent(uri)}`;
685
593
  },
686
594
  },
687
595
  slope: {
@@ -695,9 +603,7 @@ const walletConfigs = {
695
603
  website: 'https://slope.finance/',
696
604
  },
697
605
  getWalletConnectDeeplink: (uri) => {
698
- return isAndroid()
699
- ? uri
700
- : `https://slope.finance/app/wc?uri=${encodeURIComponent(uri)}`;
606
+ return `https://slope.finance/app/wc?uri=${encodeURIComponent(uri)}`;
701
607
  },
702
608
  },
703
609
  tokenPocket: {
@@ -770,6 +676,7 @@ const routes = {
770
676
  ABOUT: 'about',
771
677
  CONNECTORS: 'connectors',
772
678
  MOBILECONNECTORS: 'mobileConnectors',
679
+ CONNECT_WITH_MOBILE: 'connectWithMobile',
773
680
  CONNECT: 'connect',
774
681
  DOWNLOAD: 'download',
775
682
  PROFILE: 'profile',
@@ -2488,6 +2395,76 @@ const Portal = (props) => {
2488
2395
  return mounted ? createPortal(children, ref.current) : null;
2489
2396
  };
2490
2397
 
2398
+ const truncateRegex = /^(0x[a-zA-Z0-9]{4})[a-zA-Z0-9]+([a-zA-Z0-9]{4})$/;
2399
+ const truncateEthAddress = (address, separator = '••••') => {
2400
+ if (!address)
2401
+ return '';
2402
+ const match = address.match(truncateRegex);
2403
+ if (!match)
2404
+ return address;
2405
+ return `${match[1]}${separator}${match[2]}`;
2406
+ };
2407
+ const nFormatter = (num, digits = 2) => {
2408
+ if (num < 10000)
2409
+ return num.toFixed(2);
2410
+ const lookup = [
2411
+ { value: 1, symbol: '' },
2412
+ { value: 1e3, symbol: 'k' },
2413
+ { value: 1e6, symbol: 'm' },
2414
+ { value: 1e9, symbol: 'b' },
2415
+ { value: 1e12, symbol: 't' },
2416
+ { value: 1e15, symbol: 'p' },
2417
+ { value: 1e18, symbol: 'e' },
2418
+ ];
2419
+ const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
2420
+ var item = lookup
2421
+ .slice()
2422
+ .reverse()
2423
+ .find(function (item) {
2424
+ return num >= item.value;
2425
+ });
2426
+ return item
2427
+ ? (num / item.value).toFixed(digits).replace(rx, '$1') + item.symbol
2428
+ : '0';
2429
+ };
2430
+ const detectBrowser = () => {
2431
+ var _a;
2432
+ const browser = detect();
2433
+ return (_a = browser === null || browser === void 0 ? void 0 : browser.name) !== null && _a !== void 0 ? _a : '';
2434
+ };
2435
+ const detectOS = () => {
2436
+ var _a;
2437
+ const browser = detect();
2438
+ return (_a = browser === null || browser === void 0 ? void 0 : browser.os) !== null && _a !== void 0 ? _a : '';
2439
+ };
2440
+ const isIOS = () => {
2441
+ const os = detectOS();
2442
+ return os.toLowerCase().includes('ios');
2443
+ };
2444
+ const isAndroid = () => {
2445
+ const os = detectOS();
2446
+ return os.toLowerCase().includes('android');
2447
+ };
2448
+ const isMobile = () => {
2449
+ return isAndroid() || isIOS();
2450
+ };
2451
+ function flattenChildren(children) {
2452
+ const childrenArray = React.Children.toArray(children);
2453
+ return childrenArray.reduce((flatChildren, child) => {
2454
+ if (child.type === React.Fragment) {
2455
+ return flatChildren.concat(flattenChildren(child.props.children));
2456
+ }
2457
+ flatChildren.push(child);
2458
+ return flatChildren;
2459
+ }, []);
2460
+ }
2461
+ const isWalletConnectConnector = (connectorId) => connectorId === 'walletConnect';
2462
+ const isFamilyAccountsConnector = (connectorId) => connectorId === 'familyAccountsProvider';
2463
+ const isCoinbaseWalletConnector = (connectorId) => connectorId === 'coinbaseWalletSDK';
2464
+ const isPortoConnector = (connectorId) => connectorId === 'xyz.ithaca.porto';
2465
+ const isSafeConnector = (connectorId) => connectorId === 'safe';
2466
+ const isInjectedConnector = (connectorId) => connectorId === 'injected';
2467
+
2491
2468
  var defaultTheme = {
2492
2469
  mobileWidth: 560,
2493
2470
  };
@@ -5031,6 +5008,8 @@ const Modal = ({ open, pages, pageId, positionInside, inline, demo, onClose, onB
5031
5008
  return "Email Verification"; // TODO: Localize
5032
5009
  case routes.SOCIAL_PROVIDERS:
5033
5010
  return "Other socials"; // TODO: Localize
5011
+ case routes.LINK_EMAIL:
5012
+ return "Link your email"; // TODO: Localize
5034
5013
  case routes.CONNECT:
5035
5014
  if (shouldUseQrcode()) {
5036
5015
  return isWalletConnectConnector((_a = wallet === null || wallet === void 0 ? void 0 : wallet.connector) === null || _a === void 0 ? void 0 : _a.id)
@@ -6221,7 +6200,7 @@ const ConnectorButton = styled(motion.button) `
6221
6200
  display: block;
6222
6201
  text-decoration: none;
6223
6202
  `;
6224
- const ConnectorAnchor = styled(motion.a) `
6203
+ styled(motion.a) `
6225
6204
  display: block;
6226
6205
  text-decoration: none;
6227
6206
  `;
@@ -6963,7 +6942,7 @@ const ConnectorList = () => {
6963
6942
  const { lastConnectorId } = useLastConnector();
6964
6943
  const familyConnector = useFamilyConnector();
6965
6944
  const familyAccountsConnector = useFamilyAccountsConnector();
6966
- let filteredWallets = wallets.filter((wallet) => wallet.id !== (familyAccountsConnector === null || familyAccountsConnector === void 0 ? void 0 : familyAccountsConnector.id));
6945
+ let filteredWallets = wallets.filter((wallet) => wallet.id !== (familyAccountsConnector === null || familyAccountsConnector === void 0 ? void 0 : familyAccountsConnector.id) && wallet.id !== embeddedWalletId);
6967
6946
  if (familyConnector && isFamily()) {
6968
6947
  filteredWallets = filteredWallets.filter((wallet) => wallet.id !== (familyConnector === null || familyConnector === void 0 ? void 0 : familyConnector.id));
6969
6948
  }
@@ -6975,12 +6954,12 @@ const ConnectorList = () => {
6975
6954
  ...wallets.filter((wallet) => lastConnectorId === wallet.connector.id && wallet.id !== embeddedWalletId),
6976
6955
  ...wallets.filter((wallet) => lastConnectorId !== wallet.connector.id && wallet.id !== embeddedWalletId),
6977
6956
  ];
6978
- return (jsxs(ScrollArea, { mobileDirection: 'horizontal', children: [walletsToDisplay.length === 0 && (jsx(Alert, { error: true, children: "No connectors found in Openfort config." })), walletsToDisplay.length > 0 && (jsx(ConnectorsContainer, { "$mobile": isMobile, "$totalResults": walletsToDisplay.length, children: walletsToDisplay.map((wallet) => jsx(ConnectorItem, { wallet: wallet, isRecent: wallet.id === lastConnectorId }, wallet.id)) }))] }));
6957
+ return (jsxs(ScrollArea, { mobileDirection: 'horizontal', children: [filteredWallets.length === 0 && (jsx(Alert, { error: true, children: "No connectors found in Openfort config." })), filteredWallets.length > 0 && (jsx(ConnectorsContainer, { "$mobile": isMobile, "$totalResults": walletsToDisplay.length, children: filteredWallets.map((wallet) => jsx(ConnectorItem, { wallet: wallet, isRecent: wallet.id === lastConnectorId }, wallet.id)) }))] }));
6979
6958
  };
6980
6959
  const ConnectorItem = ({ wallet, isRecent, }) => {
6981
6960
  var _a;
6982
6961
  const { connect: { getUri }, } = useWeb3();
6983
- const uri = getUri();
6962
+ const wcUri = getUri();
6984
6963
  const isMobile = useIsMobile();
6985
6964
  const context = useOpenfort();
6986
6965
  const { connect } = useConnect();
@@ -6995,7 +6974,7 @@ const ConnectorItem = ({ wallet, isRecent, }) => {
6995
6974
  */
6996
6975
  let deeplink = (!wallet.isInstalled && isMobile) ||
6997
6976
  (wallet.shouldDeeplinkDesktop && !isMobile)
6998
- ? (_a = wallet.getWalletConnectDeeplink) === null || _a === void 0 ? void 0 : _a.call(wallet, uri !== null && uri !== void 0 ? uri : '')
6977
+ ? (_a = wallet.getWalletConnectDeeplink) === null || _a === void 0 ? void 0 : _a.call(wallet, wcUri !== null && wcUri !== void 0 ? wcUri : '')
6999
6978
  : undefined;
7000
6979
  const redirectToMoreWallets = isMobile && isWalletConnectConnector(wallet.id);
7001
6980
  // Safari requires opening popup on user gesture, so we connect immediately here
@@ -7007,10 +6986,12 @@ const ConnectorItem = ({ wallet, isRecent, }) => {
7007
6986
  var _a, _b, _c;
7008
6987
  return (jsxs(Fragment, { children: [jsx(ConnectorIcon, { "data-small": wallet.iconShouldShrink, "data-shape": wallet.iconShape, "data-background": redirectToMoreWallets, children: (_a = wallet.iconConnector) !== null && _a !== void 0 ? _a : wallet.icon }), jsxs(ConnectorLabel, { children: [isMobile ? (_b = wallet.shortName) !== null && _b !== void 0 ? _b : wallet.name : wallet.name, !((_c = context.uiConfig) === null || _c === void 0 ? void 0 : _c.hideRecentBadge) && isRecent && (jsx(RecentlyUsedTag, { children: jsx("span", { children: "Recent" }) }))] })] }));
7009
6988
  };
7010
- if (deeplink) {
7011
- jsx(ConnectorAnchor, { href: deeplink, children: content() });
7012
- }
7013
6989
  return (jsx(ConnectorButton, { type: "button", disabled: context.route !== routes.CONNECTORS, onClick: () => {
6990
+ if (isMobile && deeplink) {
6991
+ context.setRoute(routes.CONNECT_WITH_MOBILE);
6992
+ context.setConnector({ id: wallet.id });
6993
+ return;
6994
+ }
7014
6995
  if (redirectToMoreWallets) {
7015
6996
  context.setRoute(routes.MOBILECONNECTORS);
7016
6997
  }
@@ -7696,12 +7677,9 @@ const MobileConnectors = () => {
7696
7677
  return false;
7697
7678
  return true;
7698
7679
  })) !== null && _a !== void 0 ? _a : [];
7699
- const connectWallet = (wallet) => {
7700
- var _a;
7701
- const uri = (_a = wallet.getWalletConnectDeeplink) === null || _a === void 0 ? void 0 : _a.call(wallet, wcUri);
7702
- if (uri)
7703
- window.location.href = uri;
7704
- //if (uri) window.open(uri, '_blank');
7680
+ const connectWallet = (walletId) => {
7681
+ context.setRoute(routes.CONNECT_WITH_MOBILE);
7682
+ context.setConnector({ id: walletId });
7705
7683
  };
7706
7684
  return (jsx(PageContent, { style: { width: 312 }, children: jsxs(Container$7, { children: [jsx(ModalContent, { style: { paddingBottom: 0 }, children: jsx(ScrollArea, { height: 340, children: jsxs(WalletList, { "$disabled": !wcUri, children: [walletsIdsToDisplay
7707
7685
  .sort(
@@ -7719,7 +7697,7 @@ const MobileConnectors = () => {
7719
7697
  .map((walletId, i) => {
7720
7698
  const wallet = walletConfigs[walletId];
7721
7699
  const { name, shortName, iconConnector, icon } = wallet;
7722
- return (jsxs(WalletItem, { onClick: () => connectWallet(wallet), style: {
7700
+ return (jsxs(WalletItem, { onClick: () => connectWallet(walletId), style: {
7723
7701
  animationDelay: `${i * 50}ms`,
7724
7702
  }, children: [jsx(WalletIcon$1, { "$outline": true, children: iconConnector !== null && iconConnector !== void 0 ? iconConnector : icon }), jsx(WalletLabel, { children: shortName !== null && shortName !== void 0 ? shortName : name })] }, i));
7725
7703
  }), jsxs(WalletItem, { onClick: openW3M, "$waiting": isOpenW3M, children: [jsx(WalletIcon$1, { style: { background: 'var(--ck-body-background-secondary)' }, children: isOpenW3M ? (jsx("div", { style: {
@@ -8915,7 +8893,7 @@ const ChainSelectList = ({ variant, }) => {
8915
8893
  gap: 12,
8916
8894
  color: ch.id === (chain === null || chain === void 0 ? void 0 : chain.id)
8917
8895
  ? 'var(--ck-dropdown-active-color, inherit)'
8918
- : 'inherit',
8896
+ : 'var(--ck-dropdown-color, inherit)'
8919
8897
  }, children: [jsxs(ChainLogoContainer, { children: [jsx(ChainLogoSpinner, { initial: { opacity: 0 }, animate: {
8920
8898
  opacity: isPending && pendingChainId === ch.id ? 1 : 0,
8921
8899
  }, transition: {
@@ -10004,13 +9982,17 @@ const createSIWEMessage = (address, nonce, chainId) => createSiweMessage({
10004
9982
  nonce,
10005
9983
  });
10006
9984
 
9985
+ // This hook assumes wagmi is already connected to a wallet
9986
+ // It will use the connected wallet to sign the SIWE message and authenticate with Openfort
9987
+ // If there is a user already, it will link the wallet to the user
10007
9988
  function useConnectWithSiwe() {
10008
9989
  const { client, user, updateUser } = useOpenfortCore();
10009
9990
  const { log } = useOpenfort();
10010
9991
  const { address, connector } = useAccount();
10011
9992
  const chainId = useChainId();
10012
9993
  const config = useConfig();
10013
- const connectWithSiwe = useCallback(async ({ onError, onConnect, }) => {
9994
+ useWallet$1((connector === null || connector === void 0 ? void 0 : connector.id) || "");
9995
+ const connectWithSiwe = useCallback(async ({ onError, onConnect, } = {}) => {
10014
9996
  const connectorType = connector === null || connector === void 0 ? void 0 : connector.type;
10015
9997
  const walletClientType = connector === null || connector === void 0 ? void 0 : connector.id;
10016
9998
  if (!address || !connectorType || !walletClientType) {
@@ -10047,18 +10029,28 @@ function useConnectWithSiwe() {
10047
10029
  }
10048
10030
  catch (err) {
10049
10031
  log("Failed to connect with SIWE", err);
10050
- if (err instanceof AxiosError) {
10051
- onError && onError("Failed to connect with SIWE", err.request.status);
10032
+ if (!onError)
10033
+ return;
10034
+ let message = err instanceof Error ? err.message : err instanceof AxiosError ? err.message : String(err);
10035
+ if (message.includes("User rejected the request.")) {
10036
+ message = "User rejected the request.";
10037
+ }
10038
+ else if (message.includes("Invalid signature")) {
10039
+ message = "Invalid signature. Please try again.";
10040
+ }
10041
+ else if (message.includes("An error occurred when attempting to switch chain")) {
10042
+ message = "Failed to switch chain. Please switch your wallet to the correct network and try again.";
10052
10043
  }
10053
10044
  else {
10054
- onError && onError("Failed to connect with SIWE");
10045
+ message = "Failed to connect with SIWE.";
10055
10046
  }
10047
+ onError(message, err instanceof AxiosError ? err.request.status : undefined);
10056
10048
  }
10057
10049
  }, [client, user, updateUser, log, address, chainId, config, connector]);
10058
10050
  return connectWithSiwe;
10059
10051
  }
10060
10052
 
10061
- const states$2 = {
10053
+ const states$3 = {
10062
10054
  CONNECTED: 'connected',
10063
10055
  CONNECTING: 'connecting',
10064
10056
  EXPIRING: 'expiring',
@@ -10107,10 +10099,10 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10107
10099
  mutation: {
10108
10100
  onMutate: (connector) => {
10109
10101
  if (connector.connector) {
10110
- setStatus(states$2.CONNECTING);
10102
+ setStatus(states$3.CONNECTING);
10111
10103
  }
10112
10104
  else {
10113
- setStatus(states$2.UNAVAILABLE);
10105
+ setStatus(states$3.UNAVAILABLE);
10114
10106
  }
10115
10107
  },
10116
10108
  onError(err) {
@@ -10126,13 +10118,13 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10126
10118
  // https://github.com/MetaMask/eth-rpc-errors/blob/main/src/error-constants.ts
10127
10119
  switch (error.code) {
10128
10120
  case -32002:
10129
- setStatus(states$2.NOTCONNECTED);
10121
+ setStatus(states$3.NOTCONNECTED);
10130
10122
  break;
10131
10123
  case 4001:
10132
- setStatus(states$2.REJECTED);
10124
+ setStatus(states$3.REJECTED);
10133
10125
  break;
10134
10126
  default:
10135
- setStatus(states$2.FAILED);
10127
+ setStatus(states$3.FAILED);
10136
10128
  break;
10137
10129
  }
10138
10130
  }
@@ -10141,10 +10133,10 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10141
10133
  if (error.message) {
10142
10134
  switch (error.message) {
10143
10135
  case 'User rejected request':
10144
- setStatus(states$2.REJECTED);
10136
+ setStatus(states$3.REJECTED);
10145
10137
  break;
10146
10138
  default:
10147
- setStatus(states$2.FAILED);
10139
+ setStatus(states$3.FAILED);
10148
10140
  break;
10149
10141
  }
10150
10142
  }
@@ -10152,7 +10144,7 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10152
10144
  }
10153
10145
  else if (data) {
10154
10146
  if (!wallet) {
10155
- setStatus(states$2.FAILED);
10147
+ setStatus(states$3.FAILED);
10156
10148
  throw console.error('No wallet found');
10157
10149
  }
10158
10150
  // If already has linked account, don't link again
@@ -10167,10 +10159,10 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10167
10159
  console.error(error);
10168
10160
  disconnect();
10169
10161
  if (status === 409) {
10170
- setStatus(states$2.DUPLICATED);
10162
+ setStatus(states$3.DUPLICATED);
10171
10163
  }
10172
10164
  else {
10173
- setStatus(states$2.FAILED);
10165
+ setStatus(states$3.FAILED);
10174
10166
  }
10175
10167
  },
10176
10168
  onConnect: () => {
@@ -10208,8 +10200,8 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10208
10200
  const [status, setStatus] = useState(forceState
10209
10201
  ? forceState
10210
10202
  : !(wallet === null || wallet === void 0 ? void 0 : wallet.isInstalled)
10211
- ? states$2.UNAVAILABLE
10212
- : states$2.CONNECTING);
10203
+ ? states$3.UNAVAILABLE
10204
+ : states$3.CONNECTING);
10213
10205
  const locales = useLocales({
10214
10206
  CONNECTORNAME: walletInfo.name,
10215
10207
  CONNECTORSHORTNAME: (_g = walletInfo.shortName) !== null && _g !== void 0 ? _g : walletInfo.name,
@@ -10223,12 +10215,12 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10223
10215
  connect({ connector: wallet === null || wallet === void 0 ? void 0 : wallet.connector });
10224
10216
  }
10225
10217
  else {
10226
- setStatus(states$2.UNAVAILABLE);
10218
+ setStatus(states$3.UNAVAILABLE);
10227
10219
  }
10228
10220
  };
10229
10221
  let connectTimeout;
10230
10222
  useEffect(() => {
10231
- if (status === states$2.UNAVAILABLE)
10223
+ if (status === states$3.UNAVAILABLE)
10232
10224
  return;
10233
10225
  // UX: Give user time to see the UI before opening the extension
10234
10226
  connectTimeout = setTimeout(runConnect, 600);
@@ -10264,25 +10256,25 @@ const ConnectWithInjector = ({ switchConnectMethod, forceState }) => {
10264
10256
  if (isWalletConnectConnector(wallet === null || wallet === void 0 ? void 0 : wallet.connector.id)) {
10265
10257
  return (jsx(PageContent, { children: jsxs(Container$3, { children: [jsx(ModalHeading, { children: "Invalid State" }), jsx(ModalContent, { children: jsx(Alert, { children: "WalletConnect does not have an injection flow. This state should never happen." }) })] }) }));
10266
10258
  }
10267
- const hasError = status === states$2.FAILED || status === states$2.REJECTED || status === states$2.DUPLICATED;
10259
+ const hasError = status === states$3.FAILED || status === states$3.REJECTED || status === states$3.DUPLICATED;
10268
10260
  return (jsx(PageContent, { children: jsxs(Container$3, { children: [jsx(ConnectingContainer$1, { children: jsxs(ConnectingAnimation$1, { "$shake": hasError, "$circle": walletInfo.iconShape === 'circle', children: [jsx(AnimatePresence, { children: (hasError) && (jsx(RetryButton, { "aria-label": "Retry", initial: { opacity: 0, scale: 0.8 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.8 }, whileTap: { scale: 0.9 }, transition: { duration: 0.1 }, onClick: runConnect, children: jsx(RetryIconContainer, { children: jsx(Tooltip, { open: showTryAgainTooltip &&
10269
- (hasError), message: locales.tryAgainQuestion, xOffset: -6, children: jsx(RetryIconCircle, {}) }) }) })) }), walletInfo.iconShape === 'circle' ? (jsx(CircleSpinner, { logo: status === states$2.UNAVAILABLE ? (jsx("div", { style: {
10261
+ (hasError), message: locales.tryAgainQuestion, xOffset: -6, children: jsx(RetryIconCircle, {}) }) }) })) }), walletInfo.iconShape === 'circle' ? (jsx(CircleSpinner, { logo: status === states$3.UNAVAILABLE ? (jsx("div", { style: {
10270
10262
  transform: 'scale(1.14)',
10271
10263
  position: 'relative',
10272
10264
  width: '100%',
10273
- }, children: walletInfo.icon })) : (jsx(Fragment, { children: walletInfo.icon })), smallLogo: walletInfo.iconShouldShrink, connecting: status === states$2.CONNECTING, unavailable: status === states$2.UNAVAILABLE })) : (jsx(SquircleSpinner, { logo: status === states$2.UNAVAILABLE ? (jsx("div", { style: {
10265
+ }, children: walletInfo.icon })) : (jsx(Fragment, { children: walletInfo.icon })), smallLogo: walletInfo.iconShouldShrink, connecting: status === states$3.CONNECTING, unavailable: status === states$3.UNAVAILABLE })) : (jsx(SquircleSpinner, { logo: status === states$3.UNAVAILABLE ? (jsx("div", { style: {
10274
10266
  transform: 'scale(1.14)',
10275
10267
  position: 'relative',
10276
10268
  width: '100%',
10277
- }, children: walletInfo.icon })) : (jsx(Fragment, { children: walletInfo.icon })), connecting: status === states$2.CONNECTING }))] }) }), jsx(ModalContentContainer, { children: jsxs(AnimatePresence, { initial: false, children: [status === states$2.FAILED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { children: [jsxs(ModalH1, { "$error": true, children: [jsx(AlertIcon, {}), locales.injectionScreen_failed_h1] }), jsx(ModalBody, { children: locales.injectionScreen_failed_p })] }) }, states$2.FAILED)), status === states$2.REJECTED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { style: {
10269
+ }, children: walletInfo.icon })) : (jsx(Fragment, { children: walletInfo.icon })), connecting: status === states$3.CONNECTING }))] }) }), jsx(ModalContentContainer, { children: jsxs(AnimatePresence, { initial: false, children: [status === states$3.FAILED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { children: [jsxs(ModalH1, { "$error": true, children: [jsx(AlertIcon, {}), locales.injectionScreen_failed_h1] }), jsx(ModalBody, { children: locales.injectionScreen_failed_p })] }) }, states$3.FAILED)), status === states$3.REJECTED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { style: {
10278
10270
  paddingBottom: 28,
10279
- }, children: [jsx(ModalH1, { children: locales.injectionScreen_rejected_h1 }), jsx(ModalBody, { children: locales.injectionScreen_rejected_p })] }) }, states$2.REJECTED)), status === states$2.DUPLICATED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { style: { paddingBottom: 28 }, children: [jsxs(ModalH1, { "$error": true, children: [jsx(AlertIcon, {}), locales.injectionScreen_failed_h1] }), jsx(ModalBody, { children: "This wallet is already linked to another player. Please try another wallet." })] }) }, states$2.DUPLICATED)), (status === states$2.CONNECTING || status === states$2.EXPIRING) && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { style: {
10271
+ }, children: [jsx(ModalH1, { children: locales.injectionScreen_rejected_h1 }), jsx(ModalBody, { children: locales.injectionScreen_rejected_p })] }) }, states$3.REJECTED)), status === states$3.DUPLICATED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { style: { paddingBottom: 28 }, children: [jsxs(ModalH1, { "$error": true, children: [jsx(AlertIcon, {}), locales.injectionScreen_failed_h1] }), jsx(ModalBody, { children: "This wallet is already linked to another player. Please try another wallet." })] }) }, states$3.DUPLICATED)), (status === states$3.CONNECTING || status === states$3.EXPIRING) && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { style: {
10280
10272
  paddingBottom: 28,
10281
10273
  }, children: [jsx(ModalH1, { children: wallet.connector.id === 'injected'
10282
10274
  ? locales.injectionScreen_connecting_injected_h1
10283
10275
  : locales.injectionScreen_connecting_h1 }), jsx(ModalBody, { children: wallet.connector.id === 'injected'
10284
10276
  ? locales.injectionScreen_connecting_injected_p
10285
- : locales.injectionScreen_connecting_p })] }) }, states$2.CONNECTING)), status === states$2.CONNECTED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { children: [jsxs(ModalH1, { "$valid": true, children: [jsx(TickIcon, {}), " ", locales.injectionScreen_connected_h1] }), jsx(ModalBody, { children: locales.injectionScreen_connected_p })] }) }, states$2.CONNECTED)), status === states$2.NOTCONNECTED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { children: [jsx(ModalH1, { children: locales.injectionScreen_notconnected_h1 }), jsx(ModalBody, { children: locales.injectionScreen_notconnected_p })] }) }, states$2.NOTCONNECTED)), status === states$2.UNAVAILABLE && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: !extensionUrl ? (jsxs(Fragment, { children: [jsxs(ModalContent, { style: { paddingBottom: 12 }, children: [jsx(ModalH1, { children: locales.injectionScreen_unavailable_h1 }), jsx(ModalBody, { children: locales.injectionScreen_unavailable_p })] }), !wallet.isInstalled && suggestedExtension && (jsxs(Button, { href: suggestedExtension === null || suggestedExtension === void 0 ? void 0 : suggestedExtension.url, icon: jsx(BrowserIcon, { browser: suggestedExtension === null || suggestedExtension === void 0 ? void 0 : suggestedExtension.name }), children: ["Install on ", suggestedExtension === null || suggestedExtension === void 0 ? void 0 : suggestedExtension.label] }))] })) : (jsxs(Fragment, { children: [jsxs(ModalContent, { style: { paddingBottom: 18 }, children: [jsx(ModalH1, { children: locales.injectionScreen_install_h1 }), jsx(ModalBody, { children: locales.injectionScreen_install_p })] }), !wallet.isInstalled && extensionUrl && (jsx(Button, { href: extensionUrl, icon: jsx(BrowserIcon, {}), children: locales.installTheExtension }))] })) }, states$2.UNAVAILABLE))] }) })] }) }));
10277
+ : locales.injectionScreen_connecting_p })] }) }, states$3.CONNECTING)), status === states$3.CONNECTED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { children: [jsxs(ModalH1, { "$valid": true, children: [jsx(TickIcon, {}), " ", locales.injectionScreen_connected_h1] }), jsx(ModalBody, { children: locales.injectionScreen_connected_p })] }) }, states$3.CONNECTED)), status === states$3.NOTCONNECTED && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: jsxs(ModalContent, { children: [jsx(ModalH1, { children: locales.injectionScreen_notconnected_h1 }), jsx(ModalBody, { children: locales.injectionScreen_notconnected_p })] }) }, states$3.NOTCONNECTED)), status === states$3.UNAVAILABLE && (jsx(Content, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$1, children: !extensionUrl ? (jsxs(Fragment, { children: [jsxs(ModalContent, { style: { paddingBottom: 12 }, children: [jsx(ModalH1, { children: locales.injectionScreen_unavailable_h1 }), jsx(ModalBody, { children: locales.injectionScreen_unavailable_p })] }), !wallet.isInstalled && suggestedExtension && (jsxs(Button, { href: suggestedExtension === null || suggestedExtension === void 0 ? void 0 : suggestedExtension.url, icon: jsx(BrowserIcon, { browser: suggestedExtension === null || suggestedExtension === void 0 ? void 0 : suggestedExtension.name }), children: ["Install on ", suggestedExtension === null || suggestedExtension === void 0 ? void 0 : suggestedExtension.label] }))] })) : (jsxs(Fragment, { children: [jsxs(ModalContent, { style: { paddingBottom: 18 }, children: [jsx(ModalH1, { children: locales.injectionScreen_install_h1 }), jsx(ModalBody, { children: locales.injectionScreen_install_p })] }), !wallet.isInstalled && extensionUrl && (jsx(Button, { href: extensionUrl, icon: jsx(BrowserIcon, {}), children: locales.installTheExtension }))] })) }, states$3.UNAVAILABLE))] }) })] }) }));
10286
10278
  };
10287
10279
 
10288
10280
  const IconContainer$1 = styled(motion.div) `
@@ -10481,7 +10473,7 @@ const Loader = ({ header, description, icon, isError = false, isSuccess = false,
10481
10473
  }, children: renderLogo() }), connecting: isLoading })] }) }), jsxs(TextWrapper, { children: [isLoading && (jsxs(Fragment, { children: [jsx(ModalH1, { children: "Loading, please wait" }), jsx(ModalBody, { children: description !== null && description !== void 0 ? description : header })] })), isSuccess && (jsxs(Fragment, { children: [jsxs(ModalH1, { "$valid": true, children: [jsx(TickIcon, {}), " ", header] }), jsx(ModalBody, { children: description })] })), isError && (jsxs(Fragment, { children: [jsx(ModalH1, { "$error": true, children: header }), jsx(ModalBody, { children: description })] }))] })] }));
10482
10474
  };
10483
10475
 
10484
- const states$1 = {
10476
+ const states$2 = {
10485
10477
  INIT: "init",
10486
10478
  REDIRECT: "redirect",
10487
10479
  CONNECTING: "connecting",
@@ -10490,7 +10482,7 @@ const states$1 = {
10490
10482
  const ConnectWithOAuth = ({}) => {
10491
10483
  const { connector, setRoute, log } = useOpenfort();
10492
10484
  const { client, user } = useOpenfortCore();
10493
- const [status, setStatus] = useState(states$1.INIT);
10485
+ const [status, setStatus] = useState(states$2.INIT);
10494
10486
  const [description, setDescription] = useState(undefined);
10495
10487
  useEffect(() => {
10496
10488
  (async () => {
@@ -10500,13 +10492,13 @@ const ConnectWithOAuth = ({}) => {
10500
10492
  const hasProvider = !!url.searchParams.get("openfortAuthProviderUI");
10501
10493
  const provider = connector.id;
10502
10494
  switch (status) {
10503
- case states$1.INIT:
10495
+ case states$2.INIT:
10504
10496
  if (hasProvider)
10505
- setStatus(states$1.CONNECTING);
10497
+ setStatus(states$2.CONNECTING);
10506
10498
  else
10507
- setTimeout(() => setStatus(states$1.REDIRECT), 150); // UX: wait a bit before redirecting
10499
+ setTimeout(() => setStatus(states$2.REDIRECT), 150); // UX: wait a bit before redirecting
10508
10500
  break;
10509
- case states$1.CONNECTING:
10501
+ case states$2.CONNECTING:
10510
10502
  const player = url.searchParams.get("player_id");
10511
10503
  const accessToken = url.searchParams.get("access_token");
10512
10504
  const refreshToken = url.searchParams.get("refresh_token");
@@ -10528,7 +10520,7 @@ const ConnectWithOAuth = ({}) => {
10528
10520
  refreshToken,
10529
10521
  });
10530
10522
  setRoute(routes.LOADING);
10531
- case states$1.REDIRECT:
10523
+ case states$2.REDIRECT:
10532
10524
  if (hasProvider)
10533
10525
  return;
10534
10526
  const cleanURL = window.location.origin + window.location.pathname;
@@ -10573,7 +10565,7 @@ const ConnectWithOAuth = ({}) => {
10573
10565
  catch (e) {
10574
10566
  console.error("Error during OAuth initialization:", e);
10575
10567
  setRoute(routes.CONNECT);
10576
- setStatus(states$1.ERROR);
10568
+ setStatus(states$2.ERROR);
10577
10569
  if (e instanceof Error) {
10578
10570
  if (e.message.includes("not enabled")) {
10579
10571
  setDescription(`The ${provider} provider is not enabled. Please contact support.`);
@@ -10587,13 +10579,13 @@ const ConnectWithOAuth = ({}) => {
10587
10579
  }
10588
10580
  })();
10589
10581
  }, [status]);
10590
- return (jsx(PageContent, { children: jsx(Loader, { header: `Connecting with ${connector.id}`, icon: providersLogos[connector.id], isError: status === states$1.ERROR, description: description, onRetry: () => {
10591
- setStatus(states$1.INIT);
10582
+ return (jsx(PageContent, { children: jsx(Loader, { header: `Connecting with ${connector.id}`, icon: providersLogos[connector.id], isError: status === states$2.ERROR, description: description, onRetry: () => {
10583
+ setStatus(states$2.INIT);
10592
10584
  setDescription(undefined);
10593
10585
  } }) }));
10594
10586
  };
10595
10587
 
10596
- const states = {
10588
+ const states$1 = {
10597
10589
  QRCODE: 'qrcode',
10598
10590
  INJECTOR: 'injector',
10599
10591
  };
@@ -10604,7 +10596,7 @@ const ConnectUsing = () => {
10604
10596
  const isQrCode = !(wallet === null || wallet === void 0 ? void 0 : wallet.isInstalled) && (wallet === null || wallet === void 0 ? void 0 : wallet.getWalletConnectDeeplink);
10605
10597
  // For OAuth connectors, we don't need to show the injector flow
10606
10598
  const isOauth = context.connector.type === "oauth";
10607
- const [status, setStatus] = useState(isQrCode ? states.QRCODE : states.INJECTOR);
10599
+ const [status, setStatus] = useState(isQrCode ? states$1.QRCODE : states$1.INJECTOR);
10608
10600
  useEffect(() => {
10609
10601
  const connector = context.connector;
10610
10602
  context.log("ConnectUsing", { status, isQrCode, isOauth, connector });
@@ -10614,26 +10606,26 @@ const ConnectUsing = () => {
10614
10606
  const checkProvider = async () => {
10615
10607
  const res = await (wallet === null || wallet === void 0 ? void 0 : wallet.connector.getProvider());
10616
10608
  if (!res) {
10617
- setStatus(states.QRCODE);
10609
+ setStatus(states$1.QRCODE);
10618
10610
  setTimeout(context.triggerResize, 10); // delay required here for modal to resize
10619
10611
  }
10620
10612
  };
10621
- if (status === states.INJECTOR)
10613
+ if (status === states$1.INJECTOR)
10622
10614
  checkProvider();
10623
10615
  }, []);
10624
10616
  if (isOauth)
10625
10617
  return jsx(ConnectWithOAuth, {});
10626
10618
  if (!wallet)
10627
10619
  return jsxs(Alert, { children: ["Connector not found ", context.connector.id] });
10628
- return (jsxs(AnimatePresence, { children: [status === states.QRCODE && (jsx(motion.div, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$2, children: jsx(ConnectWithQRCode, { switchConnectMethod: (id) => {
10620
+ return (jsxs(AnimatePresence, { children: [status === states$1.QRCODE && (jsx(motion.div, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$2, children: jsx(ConnectWithQRCode, { switchConnectMethod: (id) => {
10629
10621
  //if (id) setId(id);
10630
- setStatus(states.INJECTOR);
10622
+ setStatus(states$1.INJECTOR);
10631
10623
  setTimeout(context.triggerResize, 10); // delay required here for modal to resize
10632
- } }) }, states.QRCODE)), status === states.INJECTOR && (jsx(motion.div, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$2, children: jsx(ConnectWithInjector, { switchConnectMethod: (id) => {
10624
+ } }) }, states$1.QRCODE)), status === states$1.INJECTOR && (jsx(motion.div, { initial: 'initial', animate: 'animate', exit: 'exit', variants: contentVariants$2, children: jsx(ConnectWithInjector, { switchConnectMethod: (id) => {
10633
10625
  //if (id) setId(id);
10634
- setStatus(states.QRCODE);
10626
+ setStatus(states$1.QRCODE);
10635
10627
  setTimeout(context.triggerResize, 10); // delay required here for modal to resize
10636
- } }) }, states.INJECTOR))] }));
10628
+ } }) }, states$1.INJECTOR))] }));
10637
10629
  };
10638
10630
 
10639
10631
  const InputContainer = styled.div `
@@ -12344,9 +12336,8 @@ const textVariants$1 = {
12344
12336
  },
12345
12337
  };
12346
12338
  const LinkEmail = () => {
12347
- const [email, setEmail] = React.useState("");
12348
12339
  const [password, setPassword] = React.useState("");
12349
- const { setRoute, triggerResize, log } = useOpenfort();
12340
+ const { setRoute, triggerResize, log, emailInput: email, setEmailInput: setEmail } = useOpenfort();
12350
12341
  const { client, updateUser } = useOpenfortCore();
12351
12342
  const [loginLoading, setLoginLoading] = React.useState(false);
12352
12343
  const [loginError, setLoginError] = React.useState(false);
@@ -12373,6 +12364,7 @@ const LinkEmail = () => {
12373
12364
  }).then(() => {
12374
12365
  updateUser()
12375
12366
  .then(() => {
12367
+ setEmail("");
12376
12368
  setRoute(routes.PROFILE);
12377
12369
  });
12378
12370
  });
@@ -12568,10 +12560,17 @@ const DIGIT_REGEX = /[0-9]/;
12568
12560
  * Special characters allowed in passwords.
12569
12561
  */
12570
12562
  const SPECIAL_CHARACTERS = '!@#$%^&()\\-*+.';
12563
+ /**
12564
+ * Escape regex metacharacters for safe use inside a character class.
12565
+ */
12566
+ function escapeForCharClass(str) {
12567
+ return str.replace(/[-\\^]/g, '\\$&');
12568
+ // escapes -, \, and ^ (the only risky chars in [])
12569
+ }
12571
12570
  /**
12572
12571
  * Regular expression to match special characters.
12573
12572
  */
12574
- const SPECIAL_CHARACTER_REGEX = new RegExp(`[${SPECIAL_CHARACTERS}]`);
12573
+ const SPECIAL_CHARACTER_REGEX = new RegExp(`[${escapeForCharClass(SPECIAL_CHARACTERS)}]`);
12575
12574
  /**
12576
12575
  * Maximum entropy score for normalization.
12577
12576
  */
@@ -13134,6 +13133,121 @@ const SocialProviders = () => {
13134
13133
  return (jsxs(PageContent, { children: [jsx(ScrollArea, { mobileDirection: 'horizontal', children: (activeProviders).map((auth) => (jsx(ProviderButtonSwitch, { provider: auth }, auth))) }), jsx(PoweredByFooter, { showDisclaimer: true })] }));
13135
13134
  };
13136
13135
 
13136
+ function useOnUserReturn(callback) {
13137
+ useEffect(() => {
13138
+ const handleVisibilityChange = () => {
13139
+ if (document.visibilityState === "visible") {
13140
+ callback();
13141
+ }
13142
+ };
13143
+ const handleFocus = () => {
13144
+ callback();
13145
+ };
13146
+ document.addEventListener("visibilitychange", handleVisibilityChange);
13147
+ window.addEventListener("focus", handleFocus);
13148
+ return () => {
13149
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
13150
+ window.removeEventListener("focus", handleFocus);
13151
+ };
13152
+ }, [callback]);
13153
+ }
13154
+
13155
+ const states = {
13156
+ INIT: "init",
13157
+ REDIRECT: "redirect",
13158
+ CONNECTING: "connecting",
13159
+ ERROR: "error",
13160
+ };
13161
+ const DownloadFooter = styled.div `
13162
+ margin-top: 30px;
13163
+ color: var(--ck-body-color-muted);
13164
+ `;
13165
+ const ConnectWithMobile = ({}) => {
13166
+ var _a, _b;
13167
+ const { connector, setRoute } = useOpenfort();
13168
+ const wallet = useWallet$1(connector.id) || walletConfigs[connector.id];
13169
+ const [status, setStatus] = useState(states.INIT);
13170
+ const [description, setDescription] = useState(undefined);
13171
+ const { connect: { getUri }, } = useWeb3();
13172
+ const wcUri = getUri();
13173
+ const [hasReturned, setHasReturned] = useState(false);
13174
+ const { isConnected } = useAccount();
13175
+ const [shouldRedirectToWalletApp, setShouldRedirectToWalletApp] = useState(false);
13176
+ const siwe = useConnectWithSiwe();
13177
+ const openApp = (url) => {
13178
+ var _a;
13179
+ const uri = (_a = wallet === null || wallet === void 0 ? void 0 : wallet.getWalletConnectDeeplink) === null || _a === void 0 ? void 0 : _a.call(wallet, url !== null && url !== void 0 ? url : "");
13180
+ if (uri) {
13181
+ if (url) {
13182
+ window.location.href = uri;
13183
+ }
13184
+ else {
13185
+ window.location.href = uri.replace("?uri=", "");
13186
+ }
13187
+ }
13188
+ else {
13189
+ setStatus(states.ERROR);
13190
+ setDescription("Wallet does not support deeplink");
13191
+ }
13192
+ };
13193
+ useOnUserReturn(() => {
13194
+ setTimeout(() => {
13195
+ setHasReturned(true);
13196
+ }, 250);
13197
+ });
13198
+ useEffect(() => {
13199
+ if (hasReturned) {
13200
+ setHasReturned(false);
13201
+ if (isConnected) {
13202
+ setStatus(states.CONNECTING);
13203
+ }
13204
+ else {
13205
+ setStatus(states.ERROR);
13206
+ setDescription("Connection failed or cancelled");
13207
+ }
13208
+ }
13209
+ }, [hasReturned, isConnected]);
13210
+ useEffect(() => {
13211
+ switch (status) {
13212
+ case states.INIT:
13213
+ openApp(wcUri);
13214
+ break;
13215
+ case states.CONNECTING:
13216
+ setDescription("Requesting signature...");
13217
+ siwe({
13218
+ onConnect: () => {
13219
+ setRoute(routes.PROFILE);
13220
+ },
13221
+ onError: (error) => {
13222
+ setStatus(states.ERROR);
13223
+ setDescription(error || "Connection failed");
13224
+ }
13225
+ });
13226
+ setTimeout(() => {
13227
+ setShouldRedirectToWalletApp(true);
13228
+ }, 1500);
13229
+ break;
13230
+ }
13231
+ }, [status]);
13232
+ useEffect(() => {
13233
+ if (shouldRedirectToWalletApp && status === states.CONNECTING) {
13234
+ openApp();
13235
+ }
13236
+ }, [shouldRedirectToWalletApp, status]);
13237
+ return (jsxs(PageContent, { children: [jsx(Loader, { header: `Connecting with ${connector.id.split(",")[0]}`, icon: wallet === null || wallet === void 0 ? void 0 : wallet.icon, isError: status === states.ERROR, description: description, onRetry: () => {
13238
+ if (isConnected) {
13239
+ setStatus(states.CONNECTING);
13240
+ return;
13241
+ }
13242
+ setStatus(states.INIT);
13243
+ setDescription("");
13244
+ } }), isConnected ? (jsx(Button, { onClick: () => {
13245
+ openApp();
13246
+ }, children: "Sign in App" })) : (jsx(Button, { onClick: () => {
13247
+ openApp(wcUri);
13248
+ }, children: "Sign in App" })), jsx(DownloadFooter, { children: jsxs(FitText, { children: ["Dont have ", connector.id.split(",")[0], " installed?", ' ', jsx("a", { style: { marginLeft: 5 }, href: isAndroid() ? (_a = wallet === null || wallet === void 0 ? void 0 : wallet.downloadUrls) === null || _a === void 0 ? void 0 : _a.android : (_b = wallet === null || wallet === void 0 ? void 0 : wallet.downloadUrls) === null || _b === void 0 ? void 0 : _b.ios, target: "_blank", rel: "noreferrer", children: "GET" })] }) })] }));
13249
+ };
13250
+
13137
13251
  const customThemeDefault = {};
13138
13252
  const ConnectModal = ({ mode = 'auto', theme = 'auto', customTheme = customThemeDefault, lang = 'en-US' }) => {
13139
13253
  var _a;
@@ -13197,6 +13311,7 @@ const ConnectModal = ({ mode = 'auto', theme = 'auto', customTheme = customTheme
13197
13311
  profile: jsx(Profile, {}),
13198
13312
  switchNetworks: jsx(SwitchNetworks, {}),
13199
13313
  recover: jsx(RecoverPage, {}),
13314
+ connectWithMobile: jsx(ConnectWithMobile, {}),
13200
13315
  };
13201
13316
  function hide() {
13202
13317
  context.setOpen(false);
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ export declare function useOnUserReturn(callback: () => void): void;
@@ -1 +1 @@
1
- export declare const OPENFORT_VERSION = "0.0.14";
1
+ export declare const OPENFORT_VERSION = "0.0.16";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfort/react",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "author": "Openfort (https://www.openfort.io)",
5
5
  "license": "BSD-2-Clause license",
6
6
  "description": "The easiest way to integrate Openfort to your project.",