{"id":342,"date":"2026-09-06T00:43:07","date_gmt":"2026-09-06T00:43:07","guid":{"rendered":"https:\/\/www.ggunity.com\/?page_id=342"},"modified":"2026-09-22T20:05:03","modified_gmt":"2026-09-22T20:05:03","slug":"wallet-connect-verif-nft","status":"publish","type":"page","link":"https:\/\/www.ggunity.com\/index.php\/wallet-connect-verif-nft\/","title":{"rendered":"WALLET CONNECT &#8211; VERIF NFT"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"342\" class=\"elementor elementor-342\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-19f5a5d e-con-boxed e-con\" data-id=\"19f5a5d\" data-element_type=\"container\" data-settings=\"{&quot;content_width&quot;:&quot;boxed&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6060656 elementor-widget elementor-widget-html\" data-id=\"6060656\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\r\n<html lang=\"fr\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n\r\n<title>GG WALLET BRIDGE \u2014 Galaxy Gamers<\/title>\r\n\r\n<style>\r\n    * {\r\n        box-sizing: border-box;\r\n    }\r\n\r\n    body {\r\n        margin: 0;\r\n        padding: 24px;\r\n        background: #151719;\r\n        color: #ffffff;\r\n        font-family: Arial, Helvetica, sans-serif;\r\n    }\r\n\r\n    .container {\r\n        max-width: 1100px;\r\n        margin: 0 auto;\r\n    }\r\n\r\n    .card {\r\n        background: #111722;\r\n        border: 1px solid #29384e;\r\n        border-radius: 20px;\r\n        padding: 28px;\r\n        margin-bottom: 24px;\r\n        box-shadow: 0 10px 35px rgba(0,0,0,0.18);\r\n    }\r\n\r\n    h1 {\r\n        margin: 0 0 10px;\r\n        font-size: 30px;\r\n    }\r\n\r\n    h2 {\r\n        margin: 0 0 20px;\r\n        font-size: 22px;\r\n    }\r\n\r\n    h3 {\r\n        margin: 0 0 10px;\r\n        font-size: 18px;\r\n    }\r\n\r\n    .subtitle {\r\n        color: #8fa3bd;\r\n        line-height: 1.7;\r\n        margin-bottom: 25px;\r\n    }\r\n\r\n    .status {\r\n        display: inline-flex;\r\n        align-items: center;\r\n        gap: 8px;\r\n        padding: 8px 14px;\r\n        border-radius: 999px;\r\n        background: #071b13;\r\n        border: 1px solid #174f39;\r\n        color: #35e58e;\r\n        font-weight: bold;\r\n        margin-bottom: 20px;\r\n    }\r\n\r\n    .wallet-grid {\r\n        display: grid;\r\n        grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\r\n        gap: 14px;\r\n    }\r\n\r\n    button {\r\n        width: 100%;\r\n        border: none;\r\n        border-radius: 12px;\r\n        padding: 16px 18px;\r\n        cursor: pointer;\r\n        font-size: 15px;\r\n        font-weight: bold;\r\n        transition: 0.2s ease;\r\n    }\r\n\r\n    button:hover {\r\n        transform: translateY(-1px);\r\n        filter: brightness(1.08);\r\n    }\r\n\r\n    button:disabled {\r\n        opacity: 0.5;\r\n        cursor: not-allowed;\r\n        transform: none;\r\n    }\r\n\r\n    .reward-box {\r\n        margin-top: 18px;\r\n        padding: 18px;\r\n        border-radius: 14px;\r\n        background: #0b1420;\r\n        border: 1px solid #294665;\r\n    }\r\n\r\n    .reward-title {\r\n        font-weight: bold;\r\n        margin-bottom: 14px;\r\n        letter-spacing: 0.5px;\r\n    }\r\n\r\n    .reward-grid {\r\n        display: grid;\r\n        grid-template-columns: repeat(3, 1fr);\r\n        gap: 10px;\r\n    }\r\n\r\n    .reward-grid > div {\r\n        padding: 12px;\r\n        border-radius: 10px;\r\n        background: #101c2b;\r\n        border: 1px solid #263b54;\r\n    }\r\n\r\n    .reward-grid strong,\r\n    .reward-grid span {\r\n        display: block;\r\n    }\r\n\r\n    .reward-grid span {\r\n        margin-top: 6px;\r\n        color: #35e58e;\r\n        font-size: 13px;\r\n    }\r\n\r\n    .add-wallet-button {\r\n        width: auto;\r\n        margin-top: 10px;\r\n        padding: 9px 13px;\r\n        background: #10231b;\r\n        color: #35e58e;\r\n        border: 1px solid #276947;\r\n        font-size: 12px;\r\n    }\r\n\r\n    .add-wallet-button:hover {\r\n        border-color: #35e58e;\r\n    }\r\n\r\n    .wallet-button {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 14px;\r\n        text-align: left;\r\n        background: #182232;\r\n        border: 1px solid #33445d;\r\n        color: white;\r\n    }\r\n\r\n    .wallet-button:hover {\r\n        border-color: #35e58e;\r\n    }\r\n\r\n    .wallet-button.connected {\r\n        border-color: #35e58e;\r\n        background: #10231b;\r\n        box-shadow: 0 0 14px rgba(53,229,142,0.10);\r\n    }\r\n\r\n    .wallet-button.connected .wallet-type {\r\n        color: #35e58e;\r\n    }\r\n\r\n    .wallet-icon {\r\n        width: 42px;\r\n        height: 42px;\r\n        border-radius: 10px;\r\n        object-fit: contain;\r\n        background: #0a0f16;\r\n        padding: 5px;\r\n        flex-shrink: 0;\r\n    }\r\n\r\n    .wallet-name {\r\n        font-size: 16px;\r\n        margin-bottom: 4px;\r\n    }\r\n\r\n    .wallet-type {\r\n        color: #7f95b0;\r\n        font-size: 12px;\r\n        text-transform: uppercase;\r\n    }\r\n\r\n    .solana-button {\r\n        background: #182232;\r\n        border: 1px solid #33445d;\r\n        color: white;\r\n    }\r\n\r\n    .solana-button:hover {\r\n        border-color: #35e58e;\r\n    }\r\n\r\n    .solana-button.connected {\r\n        border-color: #35e58e;\r\n        background: #10231b;\r\n    }\r\n\r\n    .empty {\r\n        padding: 18px;\r\n        border-radius: 12px;\r\n        background: #090e15;\r\n        border: 1px solid #25344a;\r\n        color: #7f95b0;\r\n    }\r\n\r\n    .wallet-list {\r\n        display: flex;\r\n        flex-direction: column;\r\n        gap: 14px;\r\n    }\r\n\r\n    .connected-wallet {\r\n        background: #080d14;\r\n        border: 1px solid #26364c;\r\n        border-radius: 14px;\r\n        padding: 18px;\r\n    }\r\n\r\n    .connected-top {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        gap: 15px;\r\n        margin-bottom: 14px;\r\n    }\r\n\r\n    .connected-name {\r\n        font-size: 18px;\r\n        font-weight: bold;\r\n    }\r\n\r\n    .badge {\r\n        padding: 5px 10px;\r\n        border-radius: 999px;\r\n        font-size: 11px;\r\n        font-weight: bold;\r\n        background: #15263b;\r\n        color: #8fb8e8;\r\n        border: 1px solid #294665;\r\n    }\r\n\r\n    .badge.solana {\r\n        background: #1c1830;\r\n        color: #b99cff;\r\n        border-color: #4c3a78;\r\n    }\r\n\r\n    .address {\r\n        color: #00e5ff;\r\n        word-break: break-all;\r\n        font-family: monospace;\r\n        font-size: 14px;\r\n        line-height: 1.6;\r\n    }\r\n\r\n    .network {\r\n        color: #35e58e;\r\n        margin-top: 8px;\r\n        font-size: 14px;\r\n    }\r\n\r\n    .wallet-rdns {\r\n        color: #657991;\r\n        margin-top: 8px;\r\n        font-size: 12px;\r\n        word-break: break-all;\r\n    }\r\n\r\n    .remove-button {\r\n        width: auto;\r\n        padding: 8px 12px;\r\n        background: #29161b;\r\n        color: #ff8d9b;\r\n        border: 1px solid #5a2831;\r\n        font-size: 12px;\r\n    }\r\n\r\n    .actions {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr;\r\n        gap: 14px;\r\n    }\r\n\r\n    .send-button {\r\n        background: #35e58e;\r\n        color: #07120d;\r\n        font-size: 16px;\r\n    }\r\n\r\n    .clear-button {\r\n        background: #182232;\r\n        color: white;\r\n        border: 1px solid #33445d;\r\n    }\r\n\r\n    .send-button:disabled {\r\n        background: #244b39;\r\n        color: #8cae9e;\r\n    }\r\n\r\n    .log {\r\n        background: #05080d;\r\n        border: 1px solid #29384e;\r\n        border-radius: 14px;\r\n        padding: 16px;\r\n        height: 300px;\r\n        overflow-y: auto;\r\n        font-family: monospace;\r\n        font-size: 13px;\r\n        line-height: 1.65;\r\n    }\r\n\r\n    .log-line {\r\n        margin-bottom: 4px;\r\n    }\r\n\r\n    .log-time {\r\n        color: #71859e;\r\n    }\r\n\r\n    .log-info {\r\n        color: #b9c9dc;\r\n    }\r\n\r\n    .log-success {\r\n        color: #35e58e;\r\n    }\r\n\r\n    .log-warning {\r\n        color: #ffd166;\r\n    }\r\n\r\n    .log-error {\r\n        color: #ff7585;\r\n    }\r\n\r\n    .diagnostic-row {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        gap: 20px;\r\n        padding: 15px 0;\r\n        border-bottom: 1px solid #25344a;\r\n    }\r\n\r\n    .diagnostic-row:last-child {\r\n        border-bottom: none;\r\n    }\r\n\r\n    .diagnostic-label {\r\n        color: #d8e2ef;\r\n    }\r\n\r\n    .diagnostic-value {\r\n        font-weight: bold;\r\n        text-align: right;\r\n    }\r\n\r\n    .ok {\r\n        color: #35e58e;\r\n    }\r\n\r\n    .ko {\r\n        color: #ff7585;\r\n    }\r\n\r\n    .warning {\r\n        color: #ffd166;\r\n    }\r\n\r\n    .info-box {\r\n        background: #0b121d;\r\n        border: 1px solid #25344a;\r\n        border-radius: 14px;\r\n        padding: 18px;\r\n        color: #9eb0c7;\r\n        line-height: 1.7;\r\n    }\r\n\r\n    .info-box strong {\r\n        color: white;\r\n    }\r\n\r\n    .nft-button {\r\n        background: #182232;\r\n        color: #ffffff;\r\n        border: 1px solid #00e5ff;\r\n        font-size: 16px;\r\n        grid-column: 1 \/ -1;\r\n    }\r\n\r\n    .nft-button:hover {\r\n        border-color: #35e58e;\r\n        box-shadow: 0 0 18px rgba(0,229,255,0.14);\r\n    }\r\n\r\n    .nft-button:disabled {\r\n        background: #16202c;\r\n        color: #71859e;\r\n        border-color: #33445d;\r\n    }\r\n\r\n    .nft-results {\r\n        display: flex;\r\n        flex-direction: column;\r\n        gap: 14px;\r\n    }\r\n\r\n    .nft-wallet-result {\r\n        background: #080d14;\r\n        border: 1px solid #26364c;\r\n        border-radius: 14px;\r\n        padding: 18px;\r\n    }\r\n\r\n    .nft-wallet-title {\r\n        font-size: 17px;\r\n        font-weight: bold;\r\n        margin-bottom: 6px;\r\n    }\r\n\r\n    .nft-wallet-address {\r\n        color: #657991;\r\n        font-family: monospace;\r\n        font-size: 12px;\r\n        word-break: break-all;\r\n        margin-bottom: 14px;\r\n    }\r\n\r\n    .nft-collection {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        gap: 12px;\r\n        padding: 12px 0;\r\n        border-top: 1px solid #25344a;\r\n    }\r\n\r\n    .nft-collection:first-of-type {\r\n        border-top: none;\r\n    }\r\n\r\n    .nft-collection-name {\r\n        font-weight: bold;\r\n    }\r\n\r\n    .nft-count {\r\n        font-weight: bold;\r\n    }\r\n\r\n    .nft-ok { color: #35e58e; }\r\n    .nft-none { color: #71859e; }\r\n    .nft-error { color: #ff7585; }\r\n\r\n    .nft-token-list {\r\n        margin-top: 8px;\r\n        color: #8fa3bd;\r\n        font-family: monospace;\r\n        font-size: 11px;\r\n        line-height: 1.6;\r\n        word-break: break-all;\r\n    }\r\n\r\n    @media (max-width: 650px) {\r\n        body {\r\n            padding: 10px;\r\n        }\r\n\r\n        .container {\r\n            width: 100%;\r\n            max-width: 100%;\r\n        }\r\n\r\n        .card {\r\n            padding: 16px;\r\n            border-radius: 16px;\r\n        }\r\n\r\n        h1 {\r\n            font-size: 24px;\r\n            line-height: 1.2;\r\n        }\r\n\r\n        h2 {\r\n            font-size: 19px;\r\n            line-height: 1.3;\r\n        }\r\n\r\n        .subtitle,\r\n        .info-box {\r\n            font-size: 14px;\r\n        }\r\n\r\n        .wallet-grid {\r\n            grid-template-columns: minmax(0, 1fr);\r\n        }\r\n\r\n        .wallet-button {\r\n            min-width: 0;\r\n            padding: 14px;\r\n        }\r\n\r\n        .actions {\r\n            grid-template-columns: minmax(0, 1fr);\r\n        }\r\n\r\n        .connected-top {\r\n            align-items: flex-start;\r\n            flex-direction: column;\r\n        }\r\n\r\n        .nft-collection,\r\n        .diagnostic-row {\r\n            flex-direction: column;\r\n            align-items: flex-start;\r\n        }\r\n\r\n        .diagnostic-row {\r\n            gap: 7px;\r\n        }\r\n\r\n        .diagnostic-value {\r\n            width: 100%;\r\n            text-align: left;\r\n            word-break: break-word;\r\n        }\r\n\r\n        .nft-count {\r\n            text-align: left;\r\n            word-break: break-word;\r\n        }\r\n\r\n        .reward-grid {\r\n            grid-template-columns: 1fr;\r\n        }\r\n\r\n        .log {\r\n            height: 260px;\r\n            font-size: 12px;\r\n        }\r\n    }\r\n<\/style>\r\n<\/head>\r\n\r\n<body>\r\n<div id=\"gg-desktop-only-notice\" style=\"\r\n  width:min(100% - 28px,1100px);\r\n  margin:18px auto 8px;\r\n  box-sizing:border-box;\r\n  border:1px solid rgba(0,255,136,.55);\r\n  background:rgba(0,0,0,.72);\r\n  color:#fff;\r\n  padding:14px 18px;\r\n  text-align:center;\r\n  font-family:Arial,sans-serif;\r\n  font-size:14px;\r\n  line-height:1.5;\r\n  letter-spacing:.5px;\r\n\">\r\n  \ud83d\udcbb <strong>UTILISATION SUR ORDINATEUR UNIQUEMENT<\/strong><br>\r\n  Pour connecter tes wallets et r\u00e9cup\u00e9rer tes GG COINS, utilise un PC ou un ordinateur portable.\r\n<\/div>\r\n\r\n<div class=\"container\">\r\n\r\n    <!-- HEADER -->\r\n    <div class=\"card\">\r\n        <h1>\ud83d\udd10 GG WALLET BRIDGE<\/h1>\r\n\r\n        <div class=\"subtitle\">\r\n            R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers.\r\n        <\/div>\r\n\r\n        <div class=\"info-box\">\r\n            <strong>COMMENT \u00c7A FONCTIONNE ?<\/strong>\r\n            <br><br>\r\n            <strong>1 \u2014 CONNECTER TOUS TES WALLETS<\/strong><br>\r\n            Connecte tous les wallets contenant tes NFT <strong>XPHERES<\/strong>,\r\n            <strong>LOTPAK<\/strong> ou <strong>XNOVA<\/strong>.\r\n            <br><br>\r\n            <strong>2 \u2014 V\u00c9RIFIER TES NFT<\/strong><br>\r\n            V\u00e9rifie automatiquement le nombre de NFT d\u00e9tenus sur chacun de tes wallets.\r\n            <br><br>\r\n            <strong>3 \u2014 ENVOYER TES INFORMATIONS \u00c0 GG CONNECT<\/strong><br>\r\n            Une fois la v\u00e9rification termin\u00e9e, envoie tes wallets et les r\u00e9sultats \u00e0\r\n            <strong>GG CONNECT<\/strong>.\r\n            <br><br>\r\n            <strong>\u26a0 R\u00c9SEAUX \u00c0 UTILISER<\/strong><br>\r\n            <strong>WALLETS EVM \u2192 POLYGON<\/strong><br>\r\n            <strong>WALLETS SOLANA \u2192 SOLANA<\/strong>\r\n        <\/div>\r\n\r\n        <div class=\"reward-box\">\r\n            <div class=\"reward-title\">\ud83c\udf81 R\u00c9COMPENSES NFT<\/div>\r\n            <div class=\"reward-grid\">\r\n                <div><strong>LOTPAK<\/strong><span>500 GG COINS \/ NFT<\/span><\/div>\r\n                <div><strong>XNOVA<\/strong><span>300 GG COINS \/ NFT<\/span><\/div>\r\n                <div><strong>XPHERES<\/strong><span>100 GG COINS \/ NFT<\/span><\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- EVM WALLETS -->\r\n    <div class=\"card\">\r\n\r\n        <h2>\ud83e\udd8a Wallets EVM<\/h2>\r\n\r\n        <div id=\"evmWallets\" class=\"wallet-grid\">\r\n            <div class=\"empty\">\r\n                Recherche des wallets EVM...\r\n            <\/div>\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n    <!-- SOLANA -->\r\n    <div class=\"card\">\r\n\r\n        <h2>\ud83d\udc7b Wallets SOLANA<\/h2>\r\n\r\n        <div id=\"solanaArea\">\r\n\r\n            <button\r\n                id=\"phantomSolanaButton\"\r\n                class=\"solana-button\"\r\n                onclick=\"connectPhantomSolana()\"\r\n            >\r\n                \ud83d\udc7b Connecter Phantom Solana\r\n            <\/button>\r\n            <button\r\n                id=\"addPhantomSolanaButton\"\r\n                class=\"add-wallet-button\"\r\n                onclick=\"connectPhantomSolana()\"\r\n                style=\"display:none;\"\r\n            >\r\n                \uff0b AJOUTER UN WALLET\r\n            <\/button>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n    <!-- CONNECTED WALLETS -->\r\n    <div class=\"card\">\r\n\r\n        <h2>\ud83d\udd17 Wallets connect\u00e9s<\/h2>\r\n\r\n        <div id=\"connectedWallets\" class=\"wallet-list\">\r\n\r\n            <div class=\"empty\">\r\n                Aucun wallet connect\u00e9 pour le moment.\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n    <!-- NFT VERIFICATION -->\r\n    <div class=\"card\" style=\"display:block !important; visibility:visible !important;\">\r\n\r\n        <h2>\ud83e\uddec V\u00e9rification des NFT Galaxy Gamers<\/h2>\r\n\r\n        <div class=\"info-box\" style=\"margin-bottom:18px;\">\r\n            V\u00e9rifie les NFT d\u00e9tenus par les wallets connect\u00e9s :\r\n            <strong>Xpheres<\/strong>, <strong>Lotpak<\/strong> et <strong>X NOVA<\/strong>.\r\n            <br><br>\r\n            Cette \u00e9tape ne cr\u00e9dite encore aucun GG Coin et n'enregistre rien dans Supabase.\r\n        <\/div>\r\n\r\n        <div class=\"actions\">\r\n            <button\r\n                id=\"verifyNftButton\"\r\n                class=\"nft-button\"\r\n                onclick=\"verifyGalaxyGamersNFTs()\"\r\n                style=\"display:inline-block !important; visibility:visible !important; opacity:1 !important;\"\r\n                disabled\r\n            >\r\n                \ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\r\n            <\/button>\r\n        <\/div>\r\n\r\n        <div id=\"nftResults\" class=\"nft-results\" style=\"margin-top:18px;\">\r\n            <div class=\"empty\">\r\n                Connecte au moins un wallet puis lance la v\u00e9rification.\r\n            <\/div>\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n    <!-- ACTIONS -->\r\n    <div class=\"card\">\r\n\r\n        <h2>\ud83d\udce4 Transmission<\/h2>\r\n\r\n        <div class=\"actions\">\r\n\r\n            <button\r\n                id=\"sendButton\"\r\n                class=\"send-button\"\r\n                onclick=\"sendToGGConnect()\"\r\n                disabled\r\n            >\r\n                \u2197 ENVOYER \u00c0 GG-CONNECT\r\n            <\/button>\r\n\r\n            <button\r\n                class=\"clear-button\"\r\n                onclick=\"clearWallets()\"\r\n            >\r\n                \ud83d\uddd1\ufe0f Effacer les wallets\r\n            <\/button>\r\n\r\n        <\/div>\r\n\r\n    <\/div><!-- INFO -->\r\n\r\n    <div class=\"actions\" style=\"margin:20px 0 30px;\">\r\n        <button\r\n            id=\"ggReturnConnectButton\"\r\n            class=\"send-button\"\r\n            type=\"button\"\r\n            style=\"display:none;\"\r\n        >\r\n            \u21a9 REVENIR \u00c0 GG CONNECT\r\n        <\/button>\r\n    <\/div>\r\n\r\n    <div class=\"card\">\r\n\r\n        <h2>\u2139\ufe0f GG WALLET BRIDGE<\/h2>\r\n\r\n        <div class=\"info-box\">\r\n\r\n            Cette page constitue la couche wallet et la v\u00e9rification NFT de Galaxy Gamers.\r\n\r\n            <br><br>\r\n\r\n            <strong>\u00c9tape actuelle :<\/strong>\r\n            connexion des wallets et v\u00e9rification des NFT Lotpak, Xpheres et Xnova.\r\n\r\n            <br><br>\r\n\r\n            <strong>\u00c9tape suivante :<\/strong>\r\n            transmettre les wallets et les r\u00e9sultats NFT \u00e0 GG-Connect puis les enregistrer\r\n            c\u00f4t\u00e9 serveur.\r\n\r\n            <br><br>\r\n\r\n            <strong>Derni\u00e8re \u00e9tape :<\/strong>\r\n            appliquer les r\u00e8gles de r\u00e9compenses et cr\u00e9diter les GG Coins c\u00f4t\u00e9 serveur.\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n<\/div>\r\n\r\n<script>\r\n\r\nconst connectedWallets = [];\r\nlet lastVerificationResults = null;\r\n\r\nconst discoveredEVMProviders = new Map();\r\n\r\nlet phantomSolanaProvider = null;\r\nfunction log() {}\r\nfunction escapeHtml(value) {\r\n\r\n    return String(value)\r\n        .replace(\/&\/g, \"&amp;\")\r\n        .replace(\/<\/g, \"&lt;\")\r\n        .replace(\/>\/g, \"&gt;\")\r\n        .replace(\/\"\/g, \"&quot;\")\r\n        .replace(\/'\/g, \"&#039;\");\r\n}\r\nconst NETWORKS = {\r\n\r\n    \"0x1\": \"Ethereum\",\r\n\r\n    \"0x89\": \"Polygon\",\r\n\r\n    \"0x38\": \"BNB Chain\",\r\n\r\n    \"0xa4b1\": \"Arbitrum One\",\r\n\r\n    \"0xa\": \"Optimism\",\r\n\r\n    \"0x2105\": \"Base\",\r\n\r\n    \"0x144\": \"zkSync Era\",\r\n\r\n    \"0x82750\": \"Scroll\",\r\n\r\n    \"0x13882\": \"Polygon Amoy\",\r\n\r\n    \"0x14a34\": \"Base Sepolia\",\r\n\r\n    \"0xaa36a7\": \"Ethereum Sepolia\",\r\n\r\n    \"0x66eee\": \"Arbitrum Sepolia\"\r\n\r\n};\r\n\r\nfunction getNetworkName(chainId) {\r\n\r\n    if (!chainId) {\r\n        return \"R\u00e9seau inconnu\";\r\n    }\r\n\r\n    return NETWORKS[String(chainId).toLowerCase()] ||\r\n           \"Chain \" + chainId;\r\n\r\n}\r\nfunction setupEIP6963() {\r\n\r\n    window.addEventListener(\r\n        \"eip6963:announceProvider\",\r\n        function(event) {\r\n\r\n            try {\r\n\r\n                const detail = event.detail;\r\n\r\n                if (!detail || !detail.provider || !detail.info) {\r\n                    return;\r\n                }\r\n\r\n                const info = detail.info;\r\n\r\n                const key =\r\n                    info.rdns ||\r\n                    info.uuid ||\r\n                    info.name;\r\n\r\n                if (!key) {\r\n                    return;\r\n                }\r\n\r\n                discoveredEVMProviders.set(\r\n                    key,\r\n                    {\r\n                        provider: detail.provider,\r\n                        info: info\r\n                    }\r\n                );\r\n\r\n                log(\r\n                    \"Wallet EVM d\u00e9tect\u00e9 : \" +\r\n                    (info.name || \"Wallet\"),\r\n                    \"success\"\r\n                );\r\n\r\n                renderEVMWallets();\r\n} catch (error) {\r\n\r\n                log(\r\n                    \"Erreur EIP-6963 : \" +\r\n                    error.message,\r\n                    \"error\"\r\n                );\r\n\r\n            }\r\n\r\n        }\r\n    );\r\nwindow.dispatchEvent(\r\n        new Event(\"eip6963:requestProvider\")\r\n    );\r\n\r\n}\r\nfunction renderEVMWallets() {\r\n\r\n    const container = document.getElementById(\"evmWallets\");\r\n    container.innerHTML = \"\";\r\n\r\n    if (discoveredEVMProviders.size === 0) {\r\n        container.innerHTML = `\r\n            <div class=\"empty\">\r\n                Aucun wallet EVM d\u00e9tect\u00e9.\r\n                <br><br>\r\n                V\u00e9rifie que MetaMask, Phantom ou un autre wallet EVM\r\n                est install\u00e9 dans ce navigateur.\r\n            <\/div>\r\n        `;\r\n        return;\r\n    }\r\n\r\n    discoveredEVMProviders.forEach(function(item) {\r\n\r\n        const info = item.info;\r\n        const provider = item.provider;\r\n\r\n        const connected = connectedWallets.some(function(wallet) {\r\n            return wallet.type === \"EVM\" &&\r\n                String(wallet.rdns || \"\").toLowerCase() ===\r\n                String(info.rdns || \"\").toLowerCase();\r\n        });\r\n\r\n        const box = document.createElement(\"div\");\r\n        box.style.display = \"flex\";\r\n        box.style.flexDirection = \"column\";\r\n\r\n        const button = document.createElement(\"button\");\r\n        button.className = \"wallet-button\" + (connected ? \" connected\" : \"\");\r\n\r\n        const icon = document.createElement(\"img\");\r\n        icon.className = \"wallet-icon\";\r\n        icon.alt = \"\";\r\n        icon.src = info.icon || \"\";\r\n        icon.onerror = function() { this.style.display = \"none\"; };\r\n\r\n        const text = document.createElement(\"div\");\r\n        text.innerHTML = `\r\n            <div class=\"wallet-name\">\r\n                ${connected ? \"\u2705 \" : \"\"}${escapeHtml(info.name || \"Wallet EVM\")}\r\n            <\/div>\r\n            <div class=\"wallet-type\">\r\n                EVM \u2022 POLYGON\r\n            <\/div>\r\n        `;\r\n\r\n        button.appendChild(icon);\r\n        button.appendChild(text);\r\n\r\n        button.onclick = function() {\r\n            connectEVMWallet(provider, info);\r\n        };\r\n\r\n        box.appendChild(button);\r\n\r\n        if (connected) {\r\n            const addButton = document.createElement(\"button\");\r\n            addButton.className = \"add-wallet-button\";\r\n            addButton.textContent = \"\uff0b AJOUTER UN WALLET\";\r\n            addButton.onclick = function() {\r\n                connectEVMWallet(provider, info);\r\n            };\r\n            box.appendChild(addButton);\r\n        }\r\n\r\n        container.appendChild(box);\r\n    });\r\n}\r\n\r\nasync function connectEVMWallet(provider, info) {\r\n\r\n    try {\r\n\r\n        if (!provider || typeof provider.request !== \"function\") {\r\n            throw new Error(\"Provider EVM invalide.\");\r\n        }\r\n\r\n        \/\/ Les collections Galaxy Gamers EVM sont sur Polygon.\r\n        let currentChainId = null;\r\n        try {\r\n            currentChainId = await provider.request({ method: \"eth_chainId\" });\r\n        } catch (e) {}\r\n\r\n        if (String(currentChainId || \"\").toLowerCase() !== \"0x89\") {\r\n            try {\r\n                await provider.request({\r\n                    method: \"wallet_switchEthereumChain\",\r\n                    params: [{ chainId: \"0x89\" }]\r\n                });\r\n            } catch (switchError) {\r\n                throw new Error(\"Passe ce wallet sur Polygon avant de continuer.\");\r\n            }\r\n        }\r\n\r\n        const accounts = await provider.request({\r\n            method: \"eth_requestAccounts\"\r\n        });\r\n\r\n        if (!accounts || accounts.length === 0) {\r\n            throw new Error(\"Aucune adresse retourn\u00e9e par le wallet.\");\r\n        }\r\n\r\n        let chainId = null;\r\n\r\n        try {\r\n            chainId = await provider.request({\r\n                method: \"eth_chainId\"\r\n            });\r\n        } catch (chainError) {}\r\n\r\n        const network = getNetworkName(chainId);\r\n\r\n        if (provider && typeof provider.on === \"function\" && !provider.__ggChainListenerAttached) {\r\n            provider.__ggChainListenerAttached = true;\r\n            provider.on(\"chainChanged\", function(newChainId) {\r\n                connectedWallets.forEach(function(wallet) {\r\n                    if (wallet.provider === provider) {\r\n                        wallet.chainId = newChainId;\r\n                        wallet.network = getNetworkName(newChainId);\r\n                    }\r\n                });\r\n                renderConnectedWallets();\r\n            });\r\n        }\r\n\r\n        accounts.forEach(function(address) {\r\n\r\n            if (!address) return;\r\n\r\n            addWallet({\r\n                id:\r\n                    \"evm-\" +\r\n                    String(info.rdns || info.name || \"wallet\")\r\n                        .replace(\/[^a-zA-Z0-9]\/g, \"-\") +\r\n                    \"-\" +\r\n                    address.toLowerCase(),\r\n\r\n                type: \"EVM\",\r\n\r\n                wallet:\r\n                    info.name ||\r\n                    \"Wallet EVM\",\r\n\r\n                rdns:\r\n                    info.rdns ||\r\n                    null,\r\n\r\n                address:\r\n                    address,\r\n\r\n                chainId:\r\n                    chainId,\r\n\r\n                network:\r\n                    network,\r\n\r\n                provider:\r\n                    provider\r\n            });\r\n\r\n        });\r\n\r\n        renderEVMWallets();\r\n\r\n    } catch (error) {\r\n\r\n        log(\r\n            \"Connexion EVM \u00e9chou\u00e9e : \" +\r\n            (error && error.message\r\n                ? error.message\r\n                : String(error)),\r\n            \"error\"\r\n        );\r\n\r\n    }\r\n}\r\n\r\nfunction detectPhantomSolana() {\r\n\r\n    phantomSolanaProvider = null;\r\nif (\r\n        window.phantom &&\r\n        window.phantom.solana\r\n    ) {\r\n\r\n        phantomSolanaProvider =\r\n            window.phantom.solana;\r\n\r\n    }\r\nelse if (\r\n        window.solana &&\r\n        window.solana.isPhantom\r\n    ) {\r\n\r\n        phantomSolanaProvider =\r\n            window.solana;\r\n\r\n    }\r\nif (phantomSolanaProvider) {\r\n\r\n        log(\r\n            \"Phantom Solana d\u00e9tect\u00e9.\",\r\n            \"success\"\r\n        );\r\n\r\n    } else {\r\n\r\n        log(\r\n            \"Phantom Solana non d\u00e9tect\u00e9.\",\r\n            \"warning\"\r\n        );\r\n\r\n    }\r\n\r\n}\r\nasync function connectPhantomSolana() {\r\n\r\n    try {\r\n\r\n        if (!phantomSolanaProvider) {\r\n\r\n            detectPhantomSolana();\r\n\r\n        }\r\n\r\n        if (!phantomSolanaProvider) {\r\n\r\n            throw new Error(\r\n                \"Phantom Solana n'est pas d\u00e9tect\u00e9.\"\r\n            );\r\n\r\n        }\r\n\r\n        log(\r\n            \"Connexion \u00e0 Phantom Solana...\",\r\n            \"info\"\r\n        );\r\n\r\n        const response =\r\n            await phantomSolanaProvider.connect();\r\n\r\n        let publicKey = null;\r\nif (\r\n            response &&\r\n            response.publicKey\r\n        ) {\r\n\r\n            publicKey =\r\n                response.publicKey.toString();\r\n\r\n        }\r\nif (\r\n            !publicKey &&\r\n            phantomSolanaProvider.publicKey\r\n        ) {\r\n\r\n            publicKey =\r\n                phantomSolanaProvider.publicKey.toString();\r\n\r\n        }\r\n\r\n        if (!publicKey) {\r\n\r\n            throw new Error(\r\n                \"Phantom n'a pas retourn\u00e9 d'adresse Solana.\"\r\n            );\r\n\r\n        }\r\n\r\n        log(\r\n            \"Phantom Solana connect\u00e9 !\",\r\n            \"success\"\r\n        );\r\n\r\n        log(\r\n            \"Adresse : \" +\r\n            publicKey,\r\n            \"success\"\r\n        );\r\n\r\n        const wallet = {\r\n\r\n            id:\r\n                \"solana-phantom-\" +\r\n                publicKey,\r\n\r\n            type:\r\n                \"SOLANA\",\r\n\r\n            wallet:\r\n                \"Phantom\",\r\n\r\n            rdns:\r\n                \"app.phantom\",\r\n\r\n            address:\r\n                publicKey,\r\n\r\n            chainId:\r\n                null,\r\n\r\n            network:\r\n                \"Solana\",\r\n\r\n            provider:\r\n                phantomSolanaProvider\r\n\r\n        };\r\n\r\n        addWallet(wallet);\r\n\r\n        const button =\r\n            document.getElementById(\r\n                \"phantomSolanaButton\"\r\n            );\r\n\r\n        if (button) {\r\n\r\n            button.classList.add(\r\n                \"connected\"\r\n            );\r\n\r\n            button.innerHTML =\r\n                \"\u2705 Phantom Solana connect\u00e9\";\r\n\r\n        }\r\n\r\n        const addButton =\r\n            document.getElementById(\"addPhantomSolanaButton\");\r\n\r\n        if (addButton) {\r\n            addButton.style.display = \"inline-block\";\r\n        }\r\n\r\n    } catch (error) {\r\n\r\n        log(\r\n            \"Connexion Phantom Solana \u00e9chou\u00e9e : \" +\r\n            (\r\n                error &&\r\n                error.message\r\n                    ? error.message\r\n                    : String(error)\r\n            ),\r\n            \"error\"\r\n        );\r\n\r\n    }\r\n\r\n}\r\nfunction addWallet(wallet) {\r\nconst alreadyExists =\r\n        connectedWallets.some(\r\n            function(existing) {\r\n\r\n                if (\r\n                    existing.type === \"EVM\" &&\r\n                    wallet.type === \"EVM\"\r\n                ) {\r\n\r\n                    return (\r\n                        existing.address.toLowerCase() ===\r\n                        wallet.address.toLowerCase()\r\n                    );\r\n\r\n                }\r\n\r\n                return (\r\n                    existing.type === wallet.type &&\r\n                    existing.address === wallet.address\r\n                );\r\n\r\n            }\r\n        );\r\n\r\n    if (alreadyExists) {\r\n\r\n        log(\r\n            \"Cette adresse est d\u00e9j\u00e0 connect\u00e9e.\",\r\n            \"warning\"\r\n        );\r\n\r\n        renderConnectedWallets();\r\n\r\n        return;\r\n\r\n    }\r\n\r\n    connectedWallets.push(wallet);\r\n    lastVerificationResults = null;\r\n\r\n    log(\r\n        \"Wallet ajout\u00e9 \u00e0 la liste.\",\r\n        \"success\"\r\n    );\r\n\r\n    renderConnectedWallets();\r\n}\r\nfunction renderConnectedWallets() {\r\n\r\n    const container =\r\n        document.getElementById(\r\n            \"connectedWallets\"\r\n        );\r\n\r\n    container.innerHTML = \"\";\r\n\r\n    if (connectedWallets.length === 0) {\r\n\r\n        container.innerHTML = `\r\n            <div class=\"empty\">\r\n                Aucun wallet connect\u00e9 pour le moment.\r\n            <\/div>\r\n        `;\r\n\r\n        document.getElementById(\r\n            \"sendButton\"\r\n        ).disabled = true;\r\n\r\n        const nftButtonEmpty = document.getElementById(\"verifyNftButton\");\r\n        if (nftButtonEmpty) {\r\n            nftButtonEmpty.disabled = true;\r\n        }\r\n\r\n        return;\r\n\r\n    }\r\n\r\n    connectedWallets.forEach(\r\n        function(wallet, index) {\r\n\r\n            const item =\r\n                document.createElement(\"div\");\r\n\r\n            item.className =\r\n                \"connected-wallet\";\r\n\r\n            const badgeClass =\r\n                wallet.type === \"SOLANA\"\r\n                    ? \"badge solana\"\r\n                    : \"badge\";\r\n\r\n            item.innerHTML = `\r\n\r\n                <div class=\"connected-top\">\r\n\r\n                    <div class=\"connected-name\">\r\n                        ${escapeHtml(wallet.wallet)}\r\n                    <\/div>\r\n\r\n                    <div class=\"${badgeClass}\">\r\n                        ${escapeHtml(wallet.type)}\r\n                    <\/div>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"address\">\r\n                    ${escapeHtml(wallet.address)}\r\n                <\/div>\r\n\r\n                <div class=\"network\">\r\n                    \ud83c\udf10 ${escapeHtml(wallet.network)}\r\n                <\/div>\r\n\r\n                ${\r\n                    wallet.rdns\r\n                    ? `\r\n                        <div class=\"wallet-rdns\">\r\n                            ${escapeHtml(wallet.rdns)}\r\n                        <\/div>\r\n                      `\r\n                    : \"\"\r\n                }\r\n\r\n                <div style=\"margin-top:15px;text-align:right;\">\r\n\r\n                    <button\r\n                        class=\"remove-button\"\r\n                        onclick=\"removeWallet(${index})\"\r\n                    >\r\n                        Supprimer\r\n                    <\/button>\r\n\r\n                <\/div>\r\n\r\n            `;\r\n\r\n            container.appendChild(item);\r\n\r\n        }\r\n    );\r\n\r\n    document.getElementById(\r\n        \"sendButton\"\r\n    ).disabled = false;\r\n\r\n    const nftButton = document.getElementById(\"verifyNftButton\");\r\n    if (nftButton) {\r\n        nftButton.disabled = false;\r\n    }\r\n\r\n}\r\nfunction removeWallet(index) {\r\n\r\n    if (\r\n        index < 0 ||\r\n        index >= connectedWallets.length\r\n    ) {\r\n\r\n        return;\r\n\r\n    }\r\n\r\n    const wallet =\r\n        connectedWallets[index];\r\n\r\n    log(\r\n        \"Wallet retir\u00e9 : \" +\r\n        wallet.address,\r\n        \"warning\"\r\n    );\r\n\r\n    connectedWallets.splice(\r\n        index,\r\n        1\r\n    );\r\n\r\n    lastVerificationResults = null;\r\n    renderConnectedWallets();\r\n}\r\nfunction clearWallets() {\r\n\r\n    connectedWallets.length = 0;\r\n    lastVerificationResults = null;\r\n\r\n    renderConnectedWallets();\r\nconst button =\r\n        document.getElementById(\r\n            \"phantomSolanaButton\"\r\n        );\r\n\r\n    if (button) {\r\n\r\n        button.classList.remove(\r\n            \"connected\"\r\n        );\r\n\r\n        button.innerHTML =\r\n            \"\ud83d\udc7b Connecter Phantom Solana\";\r\n\r\n    }\r\n\r\n    const addButton =\r\n        document.getElementById(\"addPhantomSolanaButton\");\r\n\r\n    if (addButton) {\r\n        addButton.style.display = \"none\";\r\n    }\r\n\r\n    log(\r\n        \"Liste des wallets effac\u00e9e.\",\r\n        \"warning\"\r\n    );\r\n\r\n}\r\nconst GALAXY_NFT_COLLECTIONS = {\r\n    XPHERES: {\r\n        label: \"XPHERES\",\r\n        type: \"EVM\",\r\n        chain: \"polygon\",\r\n        collectionId: \"0x60455cd9a3db50915cc6f37fbdd026060c4ba596\"\r\n    },\r\n    LOTPAK: {\r\n        label: \"LOTPAK\",\r\n        type: \"EVM\",\r\n        chain: \"polygon\",\r\n        collectionId: \"0xd121ffcec225a1ad94ec6c6013791224890b2440\"\r\n    },\r\n    XNOVA: {\r\n        label: \"X NOVA\",\r\n        type: \"SOLANA\",\r\n        chain: \"solana\",\r\n        collectionAddress: \"5WQuyWBuoVKnbVdKN5njM6sb1fe6oGm5Epwmdxf33ZNb\"\r\n    }\r\n};\r\n\r\nfunction getNftResultsContainer() {\r\n    return document.getElementById(\"nftResults\");\r\n}\r\n\r\nfunction setNftButtonState(loading) {\r\n    const button = document.getElementById(\"verifyNftButton\");\r\n    if (!button) {\r\n        return;\r\n    }\r\n\r\n    button.disabled = loading || connectedWallets.length === 0;\r\n    button.textContent = loading\r\n        ? \"\u23f3 V\u00c9RIFICATION DES NFT...\"\r\n        : \"\ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\";\r\n}\r\n\r\nfunction renderNftEmpty(message) {\r\n    const container = getNftResultsContainer();\r\n    if (!container) {\r\n        return;\r\n    }\r\n\r\n    container.innerHTML = `\r\n        <div class=\"empty\">\r\n            ${escapeHtml(message)}\r\n        <\/div>\r\n    `;\r\n}\r\n\r\nfunction renderNftResults(results) {\r\n    const container = getNftResultsContainer();\r\n    if (!container) {\r\n        return;\r\n    }\r\n\r\n    container.innerHTML = \"\";\r\n\r\n    results.forEach(function(result) {\r\n        const walletBox = document.createElement(\"div\");\r\n        walletBox.className = \"nft-wallet-result\";\r\n\r\n        const title = document.createElement(\"div\");\r\n        title.className = \"nft-wallet-title\";\r\n        title.textContent = result.wallet.wallet + \" \u2022 \" + result.wallet.type;\r\n\r\n        const address = document.createElement(\"div\");\r\n        address.className = \"nft-wallet-address\";\r\n        address.textContent = result.wallet.address;\r\n\r\n        walletBox.appendChild(title);\r\n        walletBox.appendChild(address);\r\n\r\n        result.collections.forEach(function(collection) {\r\n            const row = document.createElement(\"div\");\r\n            row.className = \"nft-collection\";\r\n\r\n            const name = document.createElement(\"div\");\r\n            name.className = \"nft-collection-name\";\r\n            name.textContent = collection.label;\r\n\r\n            const count = document.createElement(\"div\");\r\n            count.className = \"nft-count\";\r\n\r\n            if (collection.error) {\r\n                count.className += \" nft-error\";\r\n                count.textContent = \"\u26a0 \" + collection.error;\r\n            } else if (collection.count > 0) {\r\n                count.className += \" nft-ok\";\r\n                count.textContent = \"\u2705 \" + collection.count + \" NFT\" + (collection.count > 1 ? \"s\" : \"\");\r\n            } else {\r\n                count.className += \" nft-none\";\r\n                count.textContent = \"\u2014 Aucun NFT\";\r\n            }\r\n\r\n            row.appendChild(name);\r\n            row.appendChild(count);\r\n            walletBox.appendChild(row);\r\n\r\n            if (collection.tokenIds && collection.tokenIds.length > 0) {\r\n                const tokenList = document.createElement(\"div\");\r\n                tokenList.className = \"nft-token-list\";\r\n                tokenList.textContent = \"Token ID : \" + collection.tokenIds.join(\", \");\r\n                walletBox.appendChild(tokenList);\r\n            }\r\n        });\r\n\r\n        container.appendChild(walletBox);\r\n    });\r\n}\r\n\r\nasync function fetchEVMNFTBalance(provider, address, collectionId) {\r\n\r\n    if (!address || !collectionId) {\r\n        throw new Error(\"Adresse ou collection NFT invalide.\");\r\n    }\r\n\r\n    const scanUrl = SUPABASE_URL + \"\/functions\/v1\/scan-polygon-current\";\r\n\r\n    let response;\r\n    try {\r\n        response = await fetch(scanUrl, {\r\n            method: \"POST\",\r\n            headers: {\r\n                \"Content-Type\": \"application\/json\",\r\n                \"apikey\": SUPABASE_PUBLISHABLE_KEY,\r\n                \"Authorization\": \"Bearer \" + SUPABASE_PUBLISHABLE_KEY\r\n            },\r\n            body: JSON.stringify({\r\n                address: address\r\n            })\r\n        });\r\n    } catch (error) {\r\n        throw new Error(\"Impossible de joindre le serveur de v\u00e9rification Polygon.\");\r\n    }\r\n\r\n    const json = await response.json().catch(function() { return {}; });\r\n\r\n    if (!response.ok || json.success !== true) {\r\n        throw new Error(\r\n            json.error ||\r\n            json.message ||\r\n            \"La v\u00e9rification Polygon a retourn\u00e9 une erreur.\"\r\n        );\r\n    }\r\n\r\n    if (!json.totals || typeof json.totals !== \"object\") {\r\n        throw new Error(\"R\u00e9ponse Polygon invalide.\");\r\n    }\r\n\r\n    const key = String(collectionId).toLowerCase() === GALAXY_NFT_COLLECTIONS.XPHERES.collectionId.toLowerCase()\r\n        ? \"XPHERES\"\r\n        : \"LOTPAK\";\r\n\r\n    const items = Array.isArray(json[key]) ? json[key] : [];\r\n    const tokenIds = items.map(function(item) {\r\n        return item && item.tokenId != null ? String(item.tokenId) : \"\";\r\n    }).filter(Boolean);\r\n\r\n    return {\r\n        count: Number(json.totals[key] != null ? json.totals[key] : tokenIds.length),\r\n        tokenIds: tokenIds\r\n    };\r\n}\r\n\r\n\r\nconst SUPABASE_URL = \"https:\/\/fntlyepvflyrrmkczdkt.supabase.co\";\r\nconst SUPABASE_PUBLISHABLE_KEY = \"sb_publishable_S60QUziB55WNyTVhYr4tGg_Xums5SKx\";\r\nconst XNOVA_FUNCTION_URL = SUPABASE_URL + \"\/functions\/v1\/scan-xnova\";\r\nconst XNOVA_COLLECTION_ADDRESS =\r\n    \"5WQuyWBuoVKnbVdKN5njM6sb1fe6oGm5Epwmdxf33ZNb\";\r\n\r\nasync function fetchXnovaNFTs(address) {\r\n    if (!address) {\r\n        throw new Error(\"Adresse Solana absente.\");\r\n    }\r\n\r\n    log(\r\n        \"V\u00e9rification X NOVA c\u00f4t\u00e9 serveur pour \" + address + \"...\",\r\n        \"info\"\r\n    );\r\n\r\n    let response;\r\n\r\n    try {\r\n        response = await fetch(XNOVA_FUNCTION_URL, {\r\n            method: \"POST\",\r\n            headers: {\r\n                \"Content-Type\": \"application\/json\",\r\n                \"apikey\": SUPABASE_PUBLISHABLE_KEY,\r\n                \"Authorization\": \"Bearer \" + SUPABASE_PUBLISHABLE_KEY\r\n            },\r\n            body: JSON.stringify({\r\n                address: address\r\n            })\r\n        });\r\n    } catch (error) {\r\n        throw new Error(\r\n            \"Impossible de joindre Supabase. V\u00e9rifie que la fonction scan-xnova est bien d\u00e9ploy\u00e9e.\"\r\n        );\r\n    }\r\n\r\n    const json = await response.json().catch(function() {\r\n        return {};\r\n    });\r\n\r\n    if (!response.ok) {\r\n        throw new Error(\r\n            json.error ||\r\n            json.message ||\r\n            \"La fonction scan-xnova a retourn\u00e9 une erreur.\"\r\n        );\r\n    }\r\n\r\n    if (json.success !== true) {\r\n        throw new Error(\r\n            json.error ||\r\n            \"La fonction scan-xnova n'a pas confirm\u00e9 la v\u00e9rification.\"\r\n        );\r\n    }\r\nif (\r\n        json.collection &&\r\n        json.collection.address &&\r\n        String(json.collection.address) !== XNOVA_COLLECTION_ADDRESS\r\n    ) {\r\n        throw new Error(\r\n            \"La fonction serveur ne v\u00e9rifie pas la bonne collection X NOVA.\"\r\n        );\r\n    }\r\n\r\n    const items = Array.isArray(json.items)\r\n        ? json.items\r\n        : [];\r\n\r\n    return items.map(function(asset) {\r\n        return {\r\n            tokenId: asset && asset.id ? asset.id : \"\",\r\n            name: asset && asset.name ? asset.name : \"\",\r\n            asset: asset\r\n        };\r\n    });\r\n}\r\n\r\nasync function verifyGalaxyGamersNFTs() {\r\n    if (connectedWallets.length === 0) {\r\n        log(\"Aucun wallet connect\u00e9 \u00e0 v\u00e9rifier.\", \"warning\");\r\n        renderNftEmpty(\"Connecte au moins un wallet avant de lancer la v\u00e9rification.\");\r\n        return;\r\n    }\r\n\r\n    setNftButtonState(true);\r\n    renderNftEmpty(\"V\u00e9rification des NFT en cours...\");\r\n\r\n    log(\"D\u00e9but de la v\u00e9rification des NFT Galaxy Gamers.\", \"info\");\r\n\r\n    const results = [];\r\n\r\n    for (const wallet of connectedWallets) {\r\n        const walletResult = {\r\n            wallet: wallet,\r\n            collections: []\r\n        };\r\n\r\n        if (wallet.type === \"EVM\") {\r\n            for (const key of [\"XPHERES\", \"LOTPAK\"]) {\r\n                const collection = GALAXY_NFT_COLLECTIONS[key];\r\n\r\n                try {\r\n                    log(\r\n                        \"Recherche \" + collection.label + \" pour \" + wallet.address + \"...\",\r\n                        \"info\"\r\n                    );\r\n\r\n                    const balance = await fetchEVMNFTBalance(\r\n                        wallet.provider,\r\n                        wallet.address,\r\n                        collection.collectionId\r\n                    );\r\n\r\n                    walletResult.collections.push({\r\n                        label: collection.label,\r\n                        count: balance.count,\r\n                        tokenIds: balance.tokenIds\r\n                    });\r\n\r\n                    log(\r\n                        collection.label + \" : \" + balance.count + \" NFT trouv\u00e9(s).\",\r\n                        balance.count > 0 ? \"success\" : \"info\"\r\n                    );\r\n\r\n                } catch (error) {\r\n                    const message = error && error.message\r\n                        ? error.message\r\n                        : String(error);\r\n\r\n                    walletResult.collections.push({\r\n                        label: collection.label,\r\n                        count: 0,\r\n                        tokenIds: [],\r\n                        error: message\r\n                    });\r\n\r\n                    log(\r\n                        \"Erreur \" + collection.label + \" : \" + message,\r\n                        \"error\"\r\n                    );\r\n                }\r\n            }\r\n        }\r\n\r\n        if (wallet.type === \"SOLANA\") {\r\n            try {\r\n                log(\r\n                    \"Recherche X NOVA pour \" + wallet.address + \"...\",\r\n                    \"info\"\r\n                );\r\n\r\n                const tokens = await fetchXnovaNFTs(wallet.address);\r\n\r\n                walletResult.collections.push({\r\n                    label: \"X NOVA\",\r\n                    count: tokens.length,\r\n                    tokenIds: tokens.map(function(token) {\r\n                        return token.tokenId || token.id;\r\n                    }).filter(Boolean)\r\n                });\r\n\r\n                log(\r\n                    \"X NOVA : \" + tokens.length + \" NFT trouv\u00e9(s).\",\r\n                    tokens.length > 0 ? \"success\" : \"info\"\r\n                );\r\n\r\n            } catch (error) {\r\n                const message = error && error.message\r\n                    ? error.message\r\n                    : String(error);\r\n\r\n                walletResult.collections.push({\r\n                    label: \"X NOVA\",\r\n                    count: 0,\r\n                    tokenIds: [],\r\n                    error: message\r\n                });\r\n\r\n                log(\r\n                    \"Erreur X NOVA : \" + message,\r\n                    \"error\"\r\n                );\r\n            }\r\n        }\r\n\r\n        results.push(walletResult);\r\n    }\r\n\r\n    renderNftResults(results);\r\n\r\n    const hasErrors = results.some(function(walletResult) {\r\n        return walletResult.collections.some(function(collection) {\r\n            return !!collection.error;\r\n        });\r\n    });\r\n\r\n    lastVerificationResults = hasErrors ? null : results;\r\n\r\n    const sendButton = document.getElementById(\"sendButton\");\r\n    if (sendButton) {\r\n        sendButton.disabled = hasErrors;\r\n    }\r\n\r\n    const total = results.reduce(function(sum, walletResult) {\r\n        return sum + walletResult.collections.reduce(function(sub, collection) {\r\n            return sub + (collection.count || 0);\r\n        }, 0);\r\n    }, 0);\r\n\r\n    log(\r\n        \"V\u00e9rification termin\u00e9e : \" + total + \" NFT Galaxy Gamers d\u00e9tect\u00e9(s).\",\r\n        total > 0 ? \"success\" : \"warning\"\r\n    );\r\n\r\n    setNftButtonState(false);\r\n}\r\nfunction sendToGGConnect() {\r\n\r\n    if (connectedWallets.length === 0) {\r\n        alert(getBridgeMessage(\"NO_WALLET\"));\r\n        return;\r\n    }\r\n\r\n    if (!lastVerificationResults) {\r\n        alert(getBridgeMessage(\"VERIFY_FIRST\"));\r\n        return;\r\n    }\r\n\r\n    const targetOrigin = \"https:\/\/galaxygamers.io\";\r\n    const summary = { XPHERES: 0, LOTPAK: 0, \"X NOVA\": 0 };\r\n\r\n    lastVerificationResults.forEach(function(walletResult) {\r\n        walletResult.collections.forEach(function(collection) {\r\n            if (Object.prototype.hasOwnProperty.call(summary, collection.label)) {\r\n                summary[collection.label] += Number(collection.count || 0);\r\n            }\r\n        });\r\n    });\r\n\r\n    const rewards = {\r\n        XPHERES: summary.XPHERES * 100,\r\n        LOTPAK: summary.LOTPAK * 500,\r\n        \"X NOVA\": summary[\"X NOVA\"] * 300\r\n    };\r\n\r\n    const totalGGCoins = rewards.XPHERES + rewards.LOTPAK + rewards[\"X NOVA\"];\r\n\r\n    const payload = {\r\n        source: \"GG_WALLET_BRIDGE\",\r\n        type: \"NFT_VERIFICATION\",\r\n        version: \"5.0\",\r\n        timestamp: new Date().toISOString(),\r\n        wallets: connectedWallets.map(function(wallet) {\r\n            return {\r\n                type: wallet.type,\r\n                wallet: wallet.wallet,\r\n                rdns: wallet.rdns,\r\n                address: wallet.address,\r\n                chainId: wallet.chainId,\r\n                network: wallet.network\r\n            };\r\n        }),\r\n        verification: lastVerificationResults.map(function(walletResult) {\r\n            return {\r\n                wallet: {\r\n                    type: walletResult.wallet.type,\r\n                    wallet: walletResult.wallet.wallet,\r\n                    address: walletResult.wallet.address,\r\n                    chainId: walletResult.wallet.chainId,\r\n                    network: walletResult.wallet.network\r\n                },\r\n                collections: walletResult.collections.map(function(collection) {\r\n                    return {\r\n                        label: collection.label,\r\n                        count: Number(collection.count || 0),\r\n                        tokenIds: Array.isArray(collection.tokenIds) ? collection.tokenIds : []\r\n                    };\r\n                })\r\n            };\r\n        }),\r\n        summary: {\r\n            XPHERES: summary.XPHERES,\r\n            LOTPAK: summary.LOTPAK,\r\n            \"X NOVA\": summary[\"X NOVA\"],\r\n            rewards: rewards,\r\n            totalGGCoins: totalGGCoins\r\n        }\r\n    };\r\n\r\n    if (window.opener && !window.opener.closed) {\r\n        try {\r\n            window.opener.postMessage(payload, targetOrigin);\r\n            alert(getBridgeMessage(\"SENT\") + \" \" + totalGGCoins + \" GG COINS.\");\r\n            try { window.close(); } catch (error) {}\r\n            return;\r\n        } catch (error) {\r\n            alert(getBridgeMessage(\"SEND_ERROR\") + (error && error.message ? error.message : String(error)));\r\n        }\r\n    }\r\n\r\n    alert(getBridgeMessage(\"OPENER_ERROR\"));\r\n}\r\n\r\nasync function waitForWalletProviders(timeoutMs = 3000) {\r\n    const start = Date.now();\r\n\r\n    try {\r\n        window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\r\n    } catch (e) {}\r\n\r\n    while (Date.now() - start < timeoutMs) {\r\n        if (discoveredEVMProviders.size > 0 || phantomSolanaProvider) {\r\n            return;\r\n        }\r\n\r\n        try {\r\n            detectPhantomSolana();\r\n        } catch (e) {}\r\n\r\n        await new Promise(function(resolve) {\r\n            setTimeout(resolve, 150);\r\n        });\r\n    }\r\n}\r\n\r\nasync function restoreWalletsForChallenges(challenges) {\r\n    if (!Array.isArray(challenges) || !challenges.length) {\r\n        throw new Error(\"Aucun challenge wallet re\u00e7u.\");\r\n    }\r\n\r\n    await waitForWalletProviders();\r\n\r\n    const unique = new Map();\r\n\r\n    challenges.forEach(function(challenge) {\r\n        const chain = String(challenge.chain || \"\").toLowerCase();\r\n        const address = String(challenge.wallet_address || \"\").trim();\r\n\r\n        if (chain === \"polygon\" || chain === \"solana\") {\r\n            unique.set(chain + \"|\" + address.toLowerCase(), {\r\n                chain: chain,\r\n                address: address\r\n            });\r\n        }\r\n    });\r\n\r\n    for (const item of unique.values()) {\r\n        if (item.chain === \"polygon\") {\r\n            let found = false;\r\n\r\n            for (const providerItem of discoveredEVMProviders.values()) {\r\n                const provider = providerItem.provider;\r\n                const info = providerItem.info || {};\r\n\r\n                if (!provider || typeof provider.request !== \"function\") {\r\n                    continue;\r\n                }\r\n\r\n                let accounts = [];\r\n\r\n                try {\r\n                    accounts = await provider.request({\r\n                        method: \"eth_accounts\"\r\n                    });\r\n                } catch (e) {\r\n                    accounts = [];\r\n                }\r\n\r\n                const matching = Array.isArray(accounts)\r\n                    ? accounts.find(function(address) {\r\n                        return String(address || \"\").toLowerCase() ===\r\n                            item.address.toLowerCase();\r\n                    })\r\n                    : null;\r\n\r\n                if (!matching) continue;\r\n\r\n                let chainId = null;\r\n                try {\r\n                    chainId = await provider.request({\r\n                        method: \"eth_chainId\"\r\n                    });\r\n                } catch (e) {}\r\n\r\n                addWallet({\r\n                    id:\r\n                        \"evm-\" +\r\n                        String(info.rdns || info.name || \"wallet\")\r\n                            .replace(\/[^a-zA-Z0-9]\/g, \"-\") +\r\n                        \"-\" +\r\n                        matching.toLowerCase(),\r\n                    type: \"EVM\",\r\n                    wallet: info.name || \"Wallet EVM\",\r\n                    rdns: info.rdns || null,\r\n                    address: matching,\r\n                    chainId: chainId,\r\n                    network: getNetworkName(chainId),\r\n                    provider: provider\r\n                });\r\n\r\n                found = true;\r\n                break;\r\n            }\r\n\r\n            if (!found) {\r\n                throw new Error(\r\n                    \"Le wallet Polygon \" +\r\n                    item.address.slice(0, 8) +\r\n                    \"...\" +\r\n                    item.address.slice(-6) +\r\n                    \" n'est plus connect\u00e9 dans ce navigateur.\"\r\n                );\r\n            }\r\n        }\r\n\r\n        if (item.chain === \"solana\") {\r\n            detectPhantomSolana();\r\n\r\n            let publicKey = phantomSolanaProvider &&\r\n                phantomSolanaProvider.publicKey\r\n                ? String(phantomSolanaProvider.publicKey.toString())\r\n                : \"\";\r\n\r\n            if (!publicKey &&\r\n                phantomSolanaProvider &&\r\n                typeof phantomSolanaProvider.connect === \"function\") {\r\n                try {\r\n                    const result = await phantomSolanaProvider.connect({\r\n                        onlyIfTrusted: true\r\n                    });\r\n\r\n                    if (result && result.publicKey) {\r\n                        publicKey = String(result.publicKey.toString());\r\n                    } else if (phantomSolanaProvider.publicKey) {\r\n                        publicKey = String(\r\n                            phantomSolanaProvider.publicKey.toString()\r\n                        );\r\n                    }\r\n                } catch (e) {}\r\n            }\r\n\r\n            if (publicKey === item.address) {\r\n                addWallet({\r\n                    id: \"solana-\" + publicKey,\r\n                    type: \"SOLANA\",\r\n                    wallet: \"Phantom Solana\",\r\n                    rdns: \"app.phantom\",\r\n                    address: publicKey,\r\n                    chainId: \"solana\",\r\n                    network: \"Solana\",\r\n                    provider: phantomSolanaProvider\r\n                });\r\n            } else {\r\n                throw new Error(\r\n                    \"Le wallet Solana \" +\r\n                    item.address.slice(0, 8) +\r\n                    \"...\" +\r\n                    item.address.slice(-6) +\r\n                    \" n'est plus connect\u00e9 dans ce navigateur.\"\r\n                );\r\n            }\r\n        }\r\n    }\r\n\r\n    renderEVMWallets();\r\n    renderConnectedWallets();\r\n}\r\n\r\nasync function signWalletChallenges(challenges) {\r\n    if (!Array.isArray(challenges) || !challenges.length) throw new Error(\"Aucun challenge wallet re\u00e7u.\");\r\n\r\n    const signatures = [];\r\n\r\n    for (const challenge of challenges) {\r\n        const chain = String(challenge.chain || \"\").toLowerCase();\r\n        const address = String(challenge.wallet_address || \"\").trim();\r\n        const message = String(challenge.message || \"\");\r\n        const wallet = connectedWallets.find(function(item) {\r\n            if (!item || !item.address) return false;\r\n            return chain === \"polygon\"\r\n                ? item.type === \"EVM\" && item.address.toLowerCase() === address.toLowerCase()\r\n                : item.type === \"SOLANA\" && item.address === address;\r\n        });\r\n\r\n        if (!wallet) throw new Error(\"Wallet correspondant au challenge introuvable.\");\r\n\r\n        let signature = null;\r\n\r\n        if (chain === \"polygon\") {\r\n            if (!wallet.provider || typeof wallet.provider.request !== \"function\") {\r\n                throw new Error(\"Provider Polygon indisponible pour ce wallet.\");\r\n            }\r\n            signature = await wallet.provider.request({\r\n                method: \"personal_sign\",\r\n                params: [message, wallet.address]\r\n            });\r\n        } else if (chain === \"solana\") {\r\n            if (!wallet.provider || typeof wallet.provider.signMessage !== \"function\") {\r\n                throw new Error(\"Signature Phantom Solana indisponible.\");\r\n            }\r\n            const encoded = new TextEncoder().encode(message);\r\n            const result = await wallet.provider.signMessage(encoded, \"utf8\");\r\n            const bytes = result && (result.signature || result);\r\n            if (!bytes) throw new Error(\"Phantom n'a pas retourn\u00e9 de signature.\");\r\n            signature = base58Encode(bytes);\r\n        } else {\r\n            throw new Error(\"Blockchain non autoris\u00e9e.\");\r\n        }\r\n\r\n        signatures.push({\r\n            chain: chain,\r\n            wallet_address: address,\r\n            challenge_id: challenge.id,\r\n            signature: signature\r\n        });\r\n    }\r\n\r\n    return signatures;\r\n}\r\n\r\nfunction base58Encode(bytes) {\r\n    const alphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\r\n    let digits = [0];\r\n    for (const byte of bytes) {\r\n        let carry = byte;\r\n        for (let i = 0; i < digits.length; i++) {\r\n            const value = digits[i] * 256 + carry;\r\n            digits[i] = value % 58;\r\n            carry = Math.floor(value \/ 58);\r\n        }\r\n        while (carry) { digits.push(carry % 58); carry = Math.floor(carry \/ 58); }\r\n    }\r\n    let result = \"\";\r\n    for (let i = 0; i < bytes.length && bytes[i] === 0; i++) result += \"1\";\r\n    for (let i = digits.length - 1; i >= 0; i--) result += alphabet[digits[i]];\r\n    return result;\r\n}\r\n\r\nconst ggReturnConnectButton = document.getElementById(\"ggReturnConnectButton\");\r\n\r\nif (ggReturnConnectButton) {\r\n    ggReturnConnectButton.addEventListener(\"click\", function() {\r\n        try {\r\n            if (window.opener && !window.opener.closed) {\r\n                window.opener.focus();\r\n            }\r\n        } catch (e) {}\r\n\r\n        try {\r\n            window.close();\r\n        } catch (e) {}\r\n    });\r\n}\r\n\r\nwindow.addEventListener(\"message\", async function(event) {\r\n\r\n    if (event.origin !== \"https:\/\/galaxygamers.io\") return;\r\n    const data = event.data;\r\n    if (!data || typeof data !== \"object\" || data.source !== \"GALAXY_GAMERS_CONNECT\") return;\r\n\r\n    if (data.type === \"GG_CLAIM_COMPLETE\") {\r\n        if (ggReturnConnectButton) {\r\n            ggReturnConnectButton.style.display = \"inline-block\";\r\n        }\r\n        log(\r\n            \"\u2713 GG COINS cr\u00e9dit\u00e9s avec succ\u00e8s. Tu peux revenir \u00e0 GG-CONNECT.\",\r\n            \"success\"\r\n        );\r\n        try {\r\n            if (window.opener && !window.opener.closed) {\r\n                window.opener.focus();\r\n            }\r\n        } catch (e) {}\r\n        return;\r\n    }\r\n\r\n    if (data.type === \"WALLET_CHALLENGES\") {\r\n        try {\r\n            log(\"Pr\u00e9paration des wallets pour la signature...\", \"info\");\r\n            await restoreWalletsForChallenges(data.challenges);\r\n\r\n            log(\"Signature des challenges wallet demand\u00e9e...\", \"info\");\r\n            const signatures = await signWalletChallenges(data.challenges);\r\n            if (window.opener && !window.opener.closed) {\r\n                window.opener.postMessage({\r\n                    source: \"GG_WALLET_BRIDGE\",\r\n                    type: \"WALLET_SIGNATURES\",\r\n                    version: \"5.0\",\r\n                    signatures: signatures\r\n                }, \"https:\/\/galaxygamers.io\");\r\n                log(\"Signatures wallet transmises \u00e0 GG-CONNECT.\", \"success\");\r\n                log(\"En attente de la confirmation finale de GG-CONNECT...\", \"info\");\r\n            }\r\n        } catch (error) {\r\n            log(\"Signature refus\u00e9e ou impossible : \" + (error && error.message ? error.message : String(error)), \"error\");\r\n            if (window.opener && !window.opener.closed) {\r\n                window.opener.postMessage({\r\n                    source: \"GG_WALLET_BRIDGE\",\r\n                    type: \"WALLET_SIGNATURE_ERROR\",\r\n                    error: error && error.message ? error.message : String(error)\r\n                }, \"https:\/\/galaxygamers.io\");\r\n            }\r\n        }\r\n    }\r\n});\r\n\r\ntry {\r\n    if (window.opener && !window.opener.closed) {\r\n        window.opener.postMessage({\r\n            source: \"GG_WALLET_BRIDGE\",\r\n            type: \"GG_WALLET_BRIDGE_READY\",\r\n            version: \"5.1\"\r\n        }, \"https:\/\/galaxygamers.io\");\r\n    }\r\n} catch (error) {}\r\n\r\nfunction getBridgeMessage(key) {\r\n    let lang = \"fr\";\r\n\r\n    try {\r\n        lang = localStorage.getItem(\"gg_language\") || \"fr\";\r\n    } catch (e) {}\r\n\r\n    const messages = {\r\n        fr: {\r\n            NO_WALLET: \"\u26a0\ufe0f Aucun wallet connect\u00e9.\",\r\n            VERIFY_FIRST: \"\u26a0\ufe0f V\u00e9rifie tes NFT avant de les envoyer \u00e0 GG-CONNECT.\",\r\n            SENT: \"\u2705 Informations NFT transmises \u00e0 GG-CONNECT.\",\r\n            SEND_ERROR: \"\u26a0\ufe0f Erreur lors de la transmission : \",\r\n            OPENER_ERROR: \"\u26a0\ufe0f Cette page doit \u00eatre ouverte depuis GG-CONNECT pour transmettre les informations.\"\r\n        },\r\n        en: {\r\n            NO_WALLET: \"\u26a0\ufe0f No wallet connected.\",\r\n            VERIFY_FIRST: \"\u26a0\ufe0f Verify your NFTs before sending them to GG-CONNECT.\",\r\n            SENT: \"\u2705 NFT information sent to GG-CONNECT.\",\r\n            SEND_ERROR: \"\u26a0\ufe0f Transmission error: \",\r\n            OPENER_ERROR: \"\u26a0\ufe0f This page must be opened from GG-CONNECT to send the information.\"\r\n        },\r\n        es: {\r\n            NO_WALLET: \"\u26a0\ufe0f No hay ning\u00fan wallet conectado.\",\r\n            VERIFY_FIRST: \"\u26a0\ufe0f Verifica tus NFT antes de enviarlos a GG-CONNECT.\",\r\n            SENT: \"\u2705 Informaci\u00f3n NFT enviada a GG-CONNECT.\",\r\n            SEND_ERROR: \"\u26a0\ufe0f Error durante el env\u00edo: \",\r\n            OPENER_ERROR: \"\u26a0\ufe0f Esta p\u00e1gina debe abrirse desde GG-CONNECT para enviar la informaci\u00f3n.\"\r\n        },\r\n        zh: {\r\n            NO_WALLET: \"\u26a0\ufe0f \u6ca1\u6709\u8fde\u63a5\u94b1\u5305\u3002\",\r\n            VERIFY_FIRST: \"\u26a0\ufe0f \u8bf7\u5148\u9a8c\u8bc1 NFT\uff0c\u518d\u53d1\u9001\u5230 GG-CONNECT\u3002\",\r\n            SENT: \"\u2705 NFT \u4fe1\u606f\u5df2\u53d1\u9001\u5230 GG-CONNECT\u3002\",\r\n            SEND_ERROR: \"\u26a0\ufe0f \u53d1\u9001\u9519\u8bef\uff1a\",\r\n            OPENER_ERROR: \"\u26a0\ufe0f \u5fc5\u987b\u4ece GG-CONNECT \u6253\u5f00\u6b64\u9875\u9762\u624d\u80fd\u53d1\u9001\u4fe1\u606f\u3002\"\r\n        },\r\n        ja: {\r\n            NO_WALLET: \"\u26a0\ufe0f \u30a6\u30a9\u30ec\u30c3\u30c8\u304c\u63a5\u7d9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\",\r\n            VERIFY_FIRST: \"\u26a0\ufe0f GG-CONNECT \u306b\u9001\u4fe1\u3059\u308b\u524d\u306b NFT \u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\",\r\n            SENT: \"\u2705 NFT \u60c5\u5831\u3092 GG-CONNECT \u306b\u9001\u4fe1\u3057\u307e\u3057\u305f\u3002\",\r\n            SEND_ERROR: \"\u26a0\ufe0f \u9001\u4fe1\u30a8\u30e9\u30fc\uff1a\",\r\n            OPENER_ERROR: \"\u26a0\ufe0f \u60c5\u5831\u3092\u9001\u4fe1\u3059\u308b\u306b\u306f GG-CONNECT \u304b\u3089\u3053\u306e\u30da\u30fc\u30b8\u3092\u958b\u304f\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\"\r\n        }\r\n    };\r\n\r\n    return (messages[lang] || messages.fr)[key];\r\n}\r\n\r\nfunction initializeBridge() {\r\n    setupEIP6963();\r\n    detectPhantomSolana();\r\n\r\n    setTimeout(() => {\r\n        window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\r\n        detectPhantomSolana();\r\n        renderEVMWallets();\r\n    }, 1200);\r\n\r\n    setTimeout(() => {\r\n        window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\r\n        detectPhantomSolana();\r\n        renderEVMWallets();\r\n    }, 2500);\r\n}\r\nif (\r\n    document.readyState === \"loading\"\r\n) {\r\n\r\n    document.addEventListener(\r\n        \"DOMContentLoaded\",\r\n        initializeBridge\r\n    );\r\n\r\n} else {\r\n\r\n    initializeBridge();\r\n\r\n}\r\n\r\n<\/script>\r\n\r\n\r\n<script>\r\n(function () {\r\n    const translations = {\r\n        fr: {\r\n            \"R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers.\": \"R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers.\",\r\n            \"COMMENT \u00c7A FONCTIONNE ?\": \"COMMENT \u00c7A FONCTIONNE ?\",\r\n            \"1 \u2014 CONNECTER TOUS TES WALLETS\": \"1 \u2014 CONNECTER TOUS TES WALLETS\",\r\n            \"Connecte tous les wallets contenant tes NFT\": \"Connecte tous les wallets contenant tes NFT\",\r\n            \"ou\": \"ou\",\r\n            \"2 \u2014 V\u00c9RIFIER TES NFT\": \"2 \u2014 V\u00c9RIFIER TES NFT\",\r\n            \"V\u00e9rifie automatiquement le nombre de NFT d\u00e9tenus sur chacun de tes wallets.\": \"V\u00e9rifie automatiquement le nombre de NFT d\u00e9tenus sur chacun de tes wallets.\",\r\n            \"3 \u2014 ENVOYER TES INFORMATIONS \u00c0 GG CONNECT\": \"3 \u2014 ENVOYER TES INFORMATIONS \u00c0 GG CONNECT\",\r\n            \"Une fois la v\u00e9rification termin\u00e9e, envoie tes wallets et les r\u00e9sultats \u00e0\": \"Une fois la v\u00e9rification termin\u00e9e, envoie tes wallets et les r\u00e9sultats \u00e0\",\r\n            \"\u26a0 R\u00c9SEAUX \u00c0 UTILISER\": \"\u26a0 R\u00c9SEAUX \u00c0 UTILISER\",\r\n            \"WALLETS EVM \u2192 POLYGON\": \"WALLETS EVM \u2192 POLYGON\",\r\n            \"WALLETS SOLANA \u2192 SOLANA\": \"WALLETS SOLANA \u2192 SOLANA\",\r\n            \"\ud83c\udf81 R\u00c9COMPENSES NFT\": \"\ud83c\udf81 R\u00c9COMPENSES NFT\",\r\n            \"Wallets EVM\": \"Wallets EVM\",\r\n            \"Recherche des wallets EVM...\": \"Recherche des wallets EVM...\",\r\n            \"Wallets SOLANA\": \"Wallets SOLANA\",\r\n            \"\ud83d\udc7b Connecter Phantom Solana\": \"\ud83d\udc7b Connecter Phantom Solana\",\r\n            \"\uff0b AJOUTER UN WALLET\": \"\uff0b AJOUTER UN WALLET\",\r\n            \"Wallets connect\u00e9s\": \"Wallets connect\u00e9s\",\r\n            \"Aucun wallet connect\u00e9 pour le moment.\": \"Aucun wallet connect\u00e9 pour le moment.\",\r\n            \"\ud83e\uddec V\u00e9rification des NFT Galaxy Gamers\": \"\ud83e\uddec V\u00e9rification des NFT Galaxy Gamers\",\r\n            \"V\u00e9rifie les NFT d\u00e9tenus par les wallets connect\u00e9s :\": \"V\u00e9rifie les NFT d\u00e9tenus par les wallets connect\u00e9s :\",\r\n            \"Cette \u00e9tape ne cr\u00e9dite encore aucun GG Coin et n'enregistre rien dans Supabase.\": \"Cette \u00e9tape ne cr\u00e9dite encore aucun GG Coin et n'enregistre rien dans Supabase.\",\r\n            \"\ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\": \"\ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\",\r\n            \"Connecte au moins un wallet puis lance la v\u00e9rification.\": \"Connecte au moins un wallet puis lance la v\u00e9rification.\",\r\n            \"\ud83d\udce4 Transmission\": \"\ud83d\udce4 Transmission\",\r\n            \"\u2197 ENVOYER \u00c0 GG-CONNECT\": \"\u2197 ENVOYER \u00c0 GG-CONNECT\",\r\n            \"\ud83d\uddd1\ufe0f Effacer les wallets\": \"\ud83d\uddd1\ufe0f Effacer les wallets\",\r\n            \"Cette page constitue la couche wallet et la v\u00e9rification NFT de Galaxy Gamers.\": \"Cette page constitue la couche wallet et la v\u00e9rification NFT de Galaxy Gamers.\",\r\n            \"\u00c9tape actuelle :\": \"\u00c9tape actuelle :\",\r\n            \"connexion des wallets et v\u00e9rification des NFT Lotpak, Xpheres et Xnova.\": \"connexion des wallets et v\u00e9rification des NFT Lotpak, Xpheres et Xnova.\",\r\n            \"\u00c9tape suivante :\": \"\u00c9tape suivante :\",\r\n            \"transmettre les wallets et les r\u00e9sultats NFT \u00e0 GG-Connect puis les enregistrer c\u00f4t\u00e9 serveur.\": \"transmettre les wallets et les r\u00e9sultats NFT \u00e0 GG-Connect puis les enregistrer c\u00f4t\u00e9 serveur.\",\r\n            \"Derni\u00e8re \u00e9tape :\": \"Derni\u00e8re \u00e9tape :\",\r\n            \"appliquer les r\u00e8gles de r\u00e9compenses et cr\u00e9diter les GG Coins c\u00f4t\u00e9 serveur.\": \"appliquer les r\u00e8gles de r\u00e9compenses et cr\u00e9diter les GG Coins c\u00f4t\u00e9 serveur.\",\r\n            \"Supprimer\": \"Supprimer\",\r\n            \"Aucun wallet EVM d\u00e9tect\u00e9.\": \"Aucun wallet EVM d\u00e9tect\u00e9.\",\r\n            \"V\u00e9rifie que MetaMask, Phantom ou un autre wallet EVM est install\u00e9 dans ce navigateur.\": \"V\u00e9rifie que MetaMask, Phantom ou un autre wallet EVM est install\u00e9 dans ce navigateur.\",\r\n            \"Aucune adresse retourn\u00e9e par le wallet.\": \"Aucune adresse retourn\u00e9e par le wallet.\",\r\n            \"Phantom Solana d\u00e9tect\u00e9.\": \"Phantom Solana d\u00e9tect\u00e9.\",\r\n            \"Phantom Solana non d\u00e9tect\u00e9.\": \"Phantom Solana non d\u00e9tect\u00e9.\",\r\n            \"Liste des wallets effac\u00e9e.\": \"Liste des wallets effac\u00e9e.\",\r\n            \"\u23f3 V\u00c9RIFICATION DES NFT...\": \"\u23f3 V\u00c9RIFICATION DES NFT...\",\r\n            \"Connecte au moins un wallet avant de lancer la v\u00e9rification.\": \"Connecte au moins un wallet avant de lancer la v\u00e9rification.\",\r\n            \"V\u00e9rification des NFT en cours...\": \"V\u00e9rification des NFT en cours...\",\r\n            \"Adresse ou collection NFT invalide.\": \"Adresse ou collection NFT invalide.\",\r\n            \"Impossible de v\u00e9rifier cette collection sur Polygon.\": \"Impossible de v\u00e9rifier cette collection sur Polygon.\",\r\n            \"Adresse Solana absente.\": \"Adresse Solana absente.\",\r\n            \"Impossible de joindre Supabase. V\u00e9rifie que la fonction scan-xnova est bien d\u00e9ploy\u00e9e.\": \"Impossible de joindre Supabase. V\u00e9rifie que la fonction scan-xnova est bien d\u00e9ploy\u00e9e.\",\r\n            \"\u2014 Aucun NFT\": \"\u2014 Aucun NFT\",\r\n            \"Token ID :\": \"Token ID :\",\r\n            \"Aucun wallet \u00e0 transmettre.\": \"Aucun wallet \u00e0 transmettre.\",\r\n            \"Cette page doit \u00eatre ouverte depuis GG-Connect pour transmettre les wallets.\": \"Cette page doit \u00eatre ouverte depuis GG-Connect pour transmettre les wallets.\"\r\n        },\r\n        en: {\r\n            \"R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers.\": \"Earn GG COINS from your Galaxy Gamers NFTs.\",\r\n            \"COMMENT \u00c7A FONCTIONNE ?\": \"HOW DOES IT WORK?\",\r\n            \"1 \u2014 CONNECTER TOUS TES WALLETS\": \"1 \u2014 CONNECT ALL YOUR WALLETS\",\r\n            \"Connecte tous les wallets contenant tes NFT\": \"Connect all wallets containing your NFTs\",\r\n            \"ou\": \"or\",\r\n            \"2 \u2014 V\u00c9RIFIER TES NFT\": \"2 \u2014 VERIFY YOUR NFTs\",\r\n            \"V\u00e9rifie automatiquement le nombre de NFT d\u00e9tenus sur chacun de tes wallets.\": \"Automatically verify the number of NFTs held in each wallet.\",\r\n            \"3 \u2014 ENVOYER TES INFORMATIONS \u00c0 GG CONNECT\": \"3 \u2014 SEND YOUR INFORMATION TO GG CONNECT\",\r\n            \"Une fois la v\u00e9rification termin\u00e9e, envoie tes wallets et les r\u00e9sultats \u00e0\": \"Once verification is complete, send your wallets and the results to\",\r\n            \"\u26a0 R\u00c9SEAUX \u00c0 UTILISER\": \"\u26a0 NETWORKS TO USE\",\r\n            \"WALLETS EVM \u2192 POLYGON\": \"EVM WALLETS \u2192 POLYGON\",\r\n            \"WALLETS SOLANA \u2192 SOLANA\": \"SOLANA WALLETS \u2192 SOLANA\",\r\n            \"\ud83c\udf81 R\u00c9COMPENSES NFT\": \"\ud83c\udf81 NFT REWARDS\",\r\n            \"Wallets EVM\": \"EVM Wallets\",\r\n            \"Recherche des wallets EVM...\": \"Searching for EVM wallets...\",\r\n            \"Wallets SOLANA\": \"SOLANA Wallets\",\r\n            \"\ud83d\udc7b Connecter Phantom Solana\": \"\ud83d\udc7b Connect Phantom Solana\",\r\n            \"\uff0b AJOUTER UN WALLET\": \"\uff0b ADD A WALLET\",\r\n            \"Wallets connect\u00e9s\": \"Connected Wallets\",\r\n            \"Aucun wallet connect\u00e9 pour le moment.\": \"No wallet connected yet.\",\r\n            \"\ud83e\uddec V\u00e9rification des NFT Galaxy Gamers\": \"\ud83e\uddec Galaxy Gamers NFT Verification\",\r\n            \"V\u00e9rifie les NFT d\u00e9tenus par les wallets connect\u00e9s :\": \"Verify the NFTs held by the connected wallets:\",\r\n            \"Cette \u00e9tape ne cr\u00e9dite encore aucun GG Coin et n'enregistre rien dans Supabase.\": \"This step does not credit any GG Coins or save anything to Supabase yet.\",\r\n            \"\ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\": \"\ud83d\udd0e VERIFY MY GALAXY GAMERS NFTs\",\r\n            \"Connecte au moins un wallet puis lance la v\u00e9rification.\": \"Connect at least one wallet, then start the verification.\",\r\n            \"\ud83d\udce4 Transmission\": \"\ud83d\udce4 Transmission\",\r\n            \"\u2197 ENVOYER \u00c0 GG-CONNECT\": \"\u2197 SEND TO GG-CONNECT\",\r\n            \"\ud83d\uddd1\ufe0f Effacer les wallets\": \"\ud83d\uddd1\ufe0f Clear Wallets\",\r\n            \"Cette page constitue la couche wallet et la v\u00e9rification NFT de Galaxy Gamers.\": \"This page handles wallets and Galaxy Gamers NFT verification.\",\r\n            \"\u00c9tape actuelle :\": \"Current step:\",\r\n            \"connexion des wallets et v\u00e9rification des NFT Lotpak, Xpheres et Xnova.\": \"connect wallets and verify Lotpak, Xpheres and Xnova NFTs.\",\r\n            \"\u00c9tape suivante :\": \"Next step:\",\r\n            \"transmettre les wallets et les r\u00e9sultats NFT \u00e0 GG-Connect puis les enregistrer c\u00f4t\u00e9 serveur.\": \"send the wallets and NFT results to GG-Connect and save them server-side.\",\r\n            \"Derni\u00e8re \u00e9tape :\": \"Final step:\",\r\n            \"appliquer les r\u00e8gles de r\u00e9compenses et cr\u00e9diter les GG Coins c\u00f4t\u00e9 serveur.\": \"apply the reward rules and credit the GG Coins server-side.\",\r\n            \"Supprimer\": \"Remove\",\r\n            \"Aucun wallet EVM d\u00e9tect\u00e9.\": \"No EVM wallet detected.\",\r\n            \"V\u00e9rifie que MetaMask, Phantom ou un autre wallet EVM est install\u00e9 dans ce navigateur.\": \"Make sure MetaMask, Phantom or another EVM wallet is installed in this browser.\",\r\n            \"Aucune adresse retourn\u00e9e par le wallet.\": \"No address was returned by the wallet.\",\r\n            \"Phantom Solana d\u00e9tect\u00e9.\": \"Phantom Solana detected.\",\r\n            \"Phantom Solana non d\u00e9tect\u00e9.\": \"Phantom Solana not detected.\",\r\n            \"Liste des wallets effac\u00e9e.\": \"Wallet list cleared.\",\r\n            \"\u23f3 V\u00c9RIFICATION DES NFT...\": \"\u23f3 VERIFYING NFTs...\",\r\n            \"Connecte au moins un wallet avant de lancer la v\u00e9rification.\": \"Connect at least one wallet before starting verification.\",\r\n            \"V\u00e9rification des NFT en cours...\": \"NFT verification in progress...\",\r\n            \"Adresse ou collection NFT invalide.\": \"Invalid NFT address or collection.\",\r\n            \"Impossible de v\u00e9rifier cette collection sur Polygon.\": \"Unable to verify this collection on Polygon.\",\r\n            \"Adresse Solana absente.\": \"Solana address is missing.\",\r\n            \"Impossible de joindre Supabase. V\u00e9rifie que la fonction scan-xnova est bien d\u00e9ploy\u00e9e.\": \"Unable to reach Supabase. Make sure the scan-xnova function is deployed.\",\r\n            \"\u2014 Aucun NFT\": \"\u2014 No NFTs\",\r\n            \"Token ID :\": \"Token ID:\",\r\n            \"Aucun wallet \u00e0 transmettre.\": \"No wallet to send.\",\r\n            \"Cette page doit \u00eatre ouverte depuis GG-Connect pour transmettre les wallets.\": \"This page must be opened from GG-Connect to send the wallets.\"\r\n        },\r\n        es: {\r\n            \"R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers.\": \"Consigue GG COINS gracias a tus NFT de Galaxy Gamers.\",\r\n            \"COMMENT \u00c7A FONCTIONNE ?\": \"\u00bfC\u00d3MO FUNCIONA?\",\r\n            \"1 \u2014 CONNECTER TOUS TES WALLETS\": \"1 \u2014 CONECTA TODOS TUS WALLETS\",\r\n            \"Connecte tous les wallets contenant tes NFT\": \"Conecta todos los wallets que contengan tus NFT\",\r\n            \"ou\": \"o\",\r\n            \"2 \u2014 V\u00c9RIFIER TES NFT\": \"2 \u2014 VERIFICA TUS NFT\",\r\n            \"V\u00e9rifie automatiquement le nombre de NFT d\u00e9tenus sur chacun de tes wallets.\": \"Verifica autom\u00e1ticamente la cantidad de NFT que tienes en cada wallet.\",\r\n            \"3 \u2014 ENVOYER TES INFORMATIONS \u00c0 GG CONNECT\": \"3 \u2014 ENV\u00cdA TU INFORMACI\u00d3N A GG CONNECT\",\r\n            \"Une fois la v\u00e9rification termin\u00e9e, envoie tes wallets et les r\u00e9sultats \u00e0\": \"Una vez completada la verificaci\u00f3n, env\u00eda tus wallets y los resultados a\",\r\n            \"\u26a0 R\u00c9SEAUX \u00c0 UTILISER\": \"\u26a0 REDES QUE DEBES USAR\",\r\n            \"WALLETS EVM \u2192 POLYGON\": \"WALLETS EVM \u2192 POLYGON\",\r\n            \"WALLETS SOLANA \u2192 SOLANA\": \"WALLETS SOLANA \u2192 SOLANA\",\r\n            \"\ud83c\udf81 R\u00c9COMPENSES NFT\": \"\ud83c\udf81 RECOMPENSAS NFT\",\r\n            \"Wallets EVM\": \"Wallets EVM\",\r\n            \"Recherche des wallets EVM...\": \"Buscando wallets EVM...\",\r\n            \"Wallets SOLANA\": \"Wallets SOLANA\",\r\n            \"\ud83d\udc7b Connecter Phantom Solana\": \"\ud83d\udc7b Conectar Phantom Solana\",\r\n            \"\uff0b AJOUTER UN WALLET\": \"\uff0b A\u00d1ADIR UN WALLET\",\r\n            \"Wallets connect\u00e9s\": \"Wallets conectados\",\r\n            \"Aucun wallet connect\u00e9 pour le moment.\": \"Ning\u00fan wallet conectado por el momento.\",\r\n            \"\ud83e\uddec V\u00e9rification des NFT Galaxy Gamers\": \"\ud83e\uddec Verificaci\u00f3n de NFT de Galaxy Gamers\",\r\n            \"V\u00e9rifie les NFT d\u00e9tenus par les wallets connect\u00e9s :\": \"Verifica los NFT que poseen los wallets conectados:\",\r\n            \"Cette \u00e9tape ne cr\u00e9dite encore aucun GG Coin et n'enregistre rien dans Supabase.\": \"Este paso todav\u00eda no acredita GG Coins ni guarda nada en Supabase.\",\r\n            \"\ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\": \"\ud83d\udd0e VERIFICAR MIS NFT DE GALAXY GAMERS\",\r\n            \"Connecte au moins un wallet puis lance la v\u00e9rification.\": \"Conecta al menos un wallet y comienza la verificaci\u00f3n.\",\r\n            \"\ud83d\udce4 Transmission\": \"\ud83d\udce4 Env\u00edo\",\r\n            \"\u2197 ENVOYER \u00c0 GG-CONNECT\": \"\u2197 ENVIAR A GG-CONNECT\",\r\n            \"\ud83d\uddd1\ufe0f Effacer les wallets\": \"\ud83d\uddd1\ufe0f Borrar wallets\",\r\n            \"Cette page constitue la couche wallet et la v\u00e9rification NFT de Galaxy Gamers.\": \"Esta p\u00e1gina gestiona los wallets y la verificaci\u00f3n de NFT de Galaxy Gamers.\",\r\n            \"\u00c9tape actuelle :\": \"Paso actual:\",\r\n            \"connexion des wallets et v\u00e9rification des NFT Lotpak, Xpheres et Xnova.\": \"conectar los wallets y verificar los NFT de Lotpak, Xpheres y Xnova.\",\r\n            \"\u00c9tape suivante :\": \"Siguiente paso:\",\r\n            \"transmettre les wallets et les r\u00e9sultats NFT \u00e0 GG-Connect puis les enregistrer c\u00f4t\u00e9 serveur.\": \"enviar los wallets y los resultados NFT a GG-Connect y guardarlos en el servidor.\",\r\n            \"Derni\u00e8re \u00e9tape :\": \"\u00daltimo paso:\",\r\n            \"appliquer les r\u00e8gles de r\u00e9compenses et cr\u00e9diter les GG Coins c\u00f4t\u00e9 serveur.\": \"aplicar las reglas de recompensa y acreditar los GG Coins en el servidor.\",\r\n            \"Supprimer\": \"Eliminar\",\r\n            \"Aucun wallet EVM d\u00e9tect\u00e9.\": \"No se ha detectado ning\u00fan wallet EVM.\",\r\n            \"V\u00e9rifie que MetaMask, Phantom ou un autre wallet EVM est install\u00e9 dans ce navigateur.\": \"Comprueba que MetaMask, Phantom u otro wallet EVM est\u00e9 instalado en este navegador.\",\r\n            \"Aucune adresse retourn\u00e9e par le wallet.\": \"El wallet no devolvi\u00f3 ninguna direcci\u00f3n.\",\r\n            \"Phantom Solana d\u00e9tect\u00e9.\": \"Phantom Solana detectado.\",\r\n            \"Phantom Solana non d\u00e9tect\u00e9.\": \"Phantom Solana no detectado.\",\r\n            \"Liste des wallets effac\u00e9e.\": \"Lista de wallets borrada.\",\r\n            \"\u23f3 V\u00c9RIFICATION DES NFT...\": \"\u23f3 VERIFICANDO NFT...\",\r\n            \"Connecte au moins un wallet avant de lancer la v\u00e9rification.\": \"Conecta al menos un wallet antes de iniciar la verificaci\u00f3n.\",\r\n            \"V\u00e9rification des NFT en cours...\": \"Verificaci\u00f3n de NFT en curso...\",\r\n            \"Adresse ou collection NFT invalide.\": \"Direcci\u00f3n o colecci\u00f3n NFT no v\u00e1lida.\",\r\n            \"Impossible de v\u00e9rifier cette collection sur Polygon.\": \"No se puede verificar esta colecci\u00f3n en Polygon.\",\r\n            \"Adresse Solana absente.\": \"Falta la direcci\u00f3n de Solana.\",\r\n            \"Impossible de joindre Supabase. V\u00e9rifie que la fonction scan-xnova est bien d\u00e9ploy\u00e9e.\": \"No se puede conectar con Supabase. Comprueba que la funci\u00f3n scan-xnova est\u00e9 desplegada.\",\r\n            \"\u2014 Aucun NFT\": \"\u2014 Ning\u00fan NFT\",\r\n            \"Token ID :\": \"Token ID:\",\r\n            \"Aucun wallet \u00e0 transmettre.\": \"No hay ning\u00fan wallet que enviar.\",\r\n            \"Cette page doit \u00eatre ouverte depuis GG-Connect pour transmettre les wallets.\": \"Esta p\u00e1gina debe abrirse desde GG-Connect para enviar los wallets.\"\r\n        },\r\n        zh: {\r\n            \"R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers.\": \"\u901a\u8fc7\u4f60\u7684 Galaxy Gamers NFT \u83b7\u53d6 GG COINS\u3002\",\r\n            \"COMMENT \u00c7A FONCTIONNE ?\": \"\u5982\u4f55\u8fd0\u4f5c\uff1f\",\r\n            \"1 \u2014 CONNECTER TOUS TES WALLETS\": \"1 \u2014 \u8fde\u63a5\u4f60\u7684\u6240\u6709\u94b1\u5305\",\r\n            \"Connecte tous les wallets contenant tes NFT\": \"\u8fde\u63a5\u6240\u6709\u6301\u6709\u4f60\u7684 NFT \u7684\u94b1\u5305\",\r\n            \"ou\": \"\u6216\",\r\n            \"2 \u2014 V\u00c9RIFIER TES NFT\": \"2 \u2014 \u9a8c\u8bc1\u4f60\u7684 NFT\",\r\n            \"V\u00e9rifie automatiquement le nombre de NFT d\u00e9tenus sur chacun de tes wallets.\": \"\u81ea\u52a8\u9a8c\u8bc1\u6bcf\u4e2a\u94b1\u5305\u6301\u6709\u7684 NFT \u6570\u91cf\u3002\",\r\n            \"3 \u2014 ENVOYER TES INFORMATIONS \u00c0 GG CONNECT\": \"3 \u2014 \u5c06\u4f60\u7684\u4fe1\u606f\u53d1\u9001\u5230 GG CONNECT\",\r\n            \"Une fois la v\u00e9rification termin\u00e9e, envoie tes wallets et les r\u00e9sultats \u00e0\": \"\u9a8c\u8bc1\u5b8c\u6210\u540e\uff0c\u5c06\u4f60\u7684\u94b1\u5305\u548c\u9a8c\u8bc1\u7ed3\u679c\u53d1\u9001\u5230\",\r\n            \"\u26a0 R\u00c9SEAUX \u00c0 UTILISER\": \"\u26a0 \u4f7f\u7528\u7684\u7f51\u7edc\",\r\n            \"WALLETS EVM \u2192 POLYGON\": \"EVM \u94b1\u5305 \u2192 POLYGON\",\r\n            \"WALLETS SOLANA \u2192 SOLANA\": \"SOLANA \u94b1\u5305 \u2192 SOLANA\",\r\n            \"\ud83c\udf81 R\u00c9COMPENSES NFT\": \"\ud83c\udf81 NFT \u5956\u52b1\",\r\n            \"Wallets EVM\": \"EVM \u94b1\u5305\",\r\n            \"Recherche des wallets EVM...\": \"\u6b63\u5728\u641c\u7d22 EVM \u94b1\u5305...\",\r\n            \"Wallets SOLANA\": \"SOLANA \u94b1\u5305\",\r\n            \"\ud83d\udc7b Connecter Phantom Solana\": \"\ud83d\udc7b \u8fde\u63a5 Phantom Solana\",\r\n            \"\uff0b AJOUTER UN WALLET\": \"\uff0b \u6dfb\u52a0\u94b1\u5305\",\r\n            \"Wallets connect\u00e9s\": \"\u5df2\u8fde\u63a5\u7684\u94b1\u5305\",\r\n            \"Aucun wallet connect\u00e9 pour le moment.\": \"\u76ee\u524d\u6ca1\u6709\u8fde\u63a5\u7684\u94b1\u5305\u3002\",\r\n            \"\ud83e\uddec V\u00e9rification des NFT Galaxy Gamers\": \"\ud83e\uddec Galaxy Gamers NFT \u9a8c\u8bc1\",\r\n            \"V\u00e9rifie les NFT d\u00e9tenus par les wallets connect\u00e9s :\": \"\u9a8c\u8bc1\u5df2\u8fde\u63a5\u94b1\u5305\u6301\u6709\u7684 NFT\uff1a\",\r\n            \"Cette \u00e9tape ne cr\u00e9dite encore aucun GG Coin et n'enregistre rien dans Supabase.\": \"\u6b64\u6b65\u9aa4\u6682\u4e0d\u4f1a\u53d1\u653e GG Coins\uff0c\u4e5f\u4e0d\u4f1a\u5728 Supabase \u4e2d\u4fdd\u5b58\u4efb\u4f55\u5185\u5bb9\u3002\",\r\n            \"\ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\": \"\ud83d\udd0e \u9a8c\u8bc1\u6211\u7684 GALAXY GAMERS NFT\",\r\n            \"Connecte au moins un wallet puis lance la v\u00e9rification.\": \"\u81f3\u5c11\u8fde\u63a5\u4e00\u4e2a\u94b1\u5305\uff0c\u7136\u540e\u5f00\u59cb\u9a8c\u8bc1\u3002\",\r\n            \"\ud83d\udce4 Transmission\": \"\ud83d\udce4 \u53d1\u9001\",\r\n            \"\u2197 ENVOYER \u00c0 GG-CONNECT\": \"\u2197 \u53d1\u9001\u5230 GG-CONNECT\",\r\n            \"\ud83d\uddd1\ufe0f Effacer les wallets\": \"\ud83d\uddd1\ufe0f \u6e05\u9664\u94b1\u5305\",\r\n            \"Cette page constitue la couche wallet et la v\u00e9rification NFT de Galaxy Gamers.\": \"\u6b64\u9875\u9762\u8d1f\u8d23 Galaxy Gamers \u94b1\u5305\u8fde\u63a5\u548c NFT \u9a8c\u8bc1\u3002\",\r\n            \"\u00c9tape actuelle :\": \"\u5f53\u524d\u6b65\u9aa4\uff1a\",\r\n            \"connexion des wallets et v\u00e9rification des NFT Lotpak, Xpheres et Xnova.\": \"\u8fde\u63a5\u94b1\u5305\u5e76\u9a8c\u8bc1 Lotpak\u3001Xpheres \u548c Xnova NFT\u3002\",\r\n            \"\u00c9tape suivante :\": \"\u4e0b\u4e00\u6b65\uff1a\",\r\n            \"transmettre les wallets et les r\u00e9sultats NFT \u00e0 GG-Connect puis les enregistrer c\u00f4t\u00e9 serveur.\": \"\u5c06\u94b1\u5305\u548c NFT \u9a8c\u8bc1\u7ed3\u679c\u53d1\u9001\u5230 GG-Connect\uff0c\u5e76\u5728\u670d\u52a1\u5668\u7aef\u4fdd\u5b58\u3002\",\r\n            \"Derni\u00e8re \u00e9tape :\": \"\u6700\u540e\u4e00\u6b65\uff1a\",\r\n            \"appliquer les r\u00e8gles de r\u00e9compenses et cr\u00e9diter les GG Coins c\u00f4t\u00e9 serveur.\": \"\u5e94\u7528\u5956\u52b1\u89c4\u5219\u5e76\u5728\u670d\u52a1\u5668\u7aef\u53d1\u653e GG Coins\u3002\",\r\n            \"Supprimer\": \"\u5220\u9664\",\r\n            \"Aucun wallet EVM d\u00e9tect\u00e9.\": \"\u672a\u68c0\u6d4b\u5230 EVM \u94b1\u5305\u3002\",\r\n            \"V\u00e9rifie que MetaMask, Phantom ou un autre wallet EVM est install\u00e9 dans ce navigateur.\": \"\u8bf7\u786e\u8ba4\u6b64\u6d4f\u89c8\u5668\u5df2\u5b89\u88c5 MetaMask\u3001Phantom \u6216\u5176\u4ed6 EVM \u94b1\u5305\u3002\",\r\n            \"Aucune adresse retourn\u00e9e par le wallet.\": \"\u94b1\u5305\u672a\u8fd4\u56de\u5730\u5740\u3002\",\r\n            \"Phantom Solana d\u00e9tect\u00e9.\": \"\u5df2\u68c0\u6d4b\u5230 Phantom Solana\u3002\",\r\n            \"Phantom Solana non d\u00e9tect\u00e9.\": \"\u672a\u68c0\u6d4b\u5230 Phantom Solana\u3002\",\r\n            \"Liste des wallets effac\u00e9e.\": \"\u94b1\u5305\u5217\u8868\u5df2\u6e05\u9664\u3002\",\r\n            \"\u23f3 V\u00c9RIFICATION DES NFT...\": \"\u23f3 \u6b63\u5728\u9a8c\u8bc1 NFT...\",\r\n            \"Connecte au moins un wallet avant de lancer la v\u00e9rification.\": \"\u8bf7\u81f3\u5c11\u8fde\u63a5\u4e00\u4e2a\u94b1\u5305\u540e\u518d\u5f00\u59cb\u9a8c\u8bc1\u3002\",\r\n            \"V\u00e9rification des NFT en cours...\": \"\u6b63\u5728\u8fdb\u884c NFT \u9a8c\u8bc1...\",\r\n            \"Adresse ou collection NFT invalide.\": \"NFT \u5730\u5740\u6216\u6536\u85cf\u65e0\u6548\u3002\",\r\n            \"Impossible de v\u00e9rifier cette collection sur Polygon.\": \"\u65e0\u6cd5\u5728 Polygon \u4e0a\u9a8c\u8bc1\u6b64\u6536\u85cf\u3002\",\r\n            \"Adresse Solana absente.\": \"\u7f3a\u5c11 Solana \u5730\u5740\u3002\",\r\n            \"Impossible de joindre Supabase. V\u00e9rifie que la fonction scan-xnova est bien d\u00e9ploy\u00e9e.\": \"\u65e0\u6cd5\u8fde\u63a5 Supabase\u3002\u8bf7\u786e\u8ba4 scan-xnova \u51fd\u6570\u5df2\u90e8\u7f72\u3002\",\r\n            \"\u2014 Aucun NFT\": \"\u2014 \u6ca1\u6709 NFT\",\r\n            \"Token ID :\": \"Token ID\uff1a\",\r\n            \"Aucun wallet \u00e0 transmettre.\": \"\u6ca1\u6709\u53ef\u53d1\u9001\u7684\u94b1\u5305\u3002\",\r\n            \"Cette page doit \u00eatre ouverte depuis GG-Connect pour transmettre les wallets.\": \"\u5fc5\u987b\u4ece GG-Connect \u6253\u5f00\u6b64\u9875\u9762\u624d\u80fd\u53d1\u9001\u94b1\u5305\u3002\"\r\n        },\r\n        ja: {\r\n            \"R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers.\": \"Galaxy Gamers NFT \u304b\u3089 GG COINS \u3092\u7372\u5f97\u3067\u304d\u307e\u3059\u3002\",\r\n            \"COMMENT \u00c7A FONCTIONNE ?\": \"\u4f7f\u3044\u65b9\",\r\n            \"1 \u2014 CONNECTER TOUS TES WALLETS\": \"1 \u2014 \u3059\u3079\u3066\u306e\u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u63a5\u7d9a\",\r\n            \"Connecte tous les wallets contenant tes NFT\": \"NFT \u3092\u4fdd\u6709\u3057\u3066\u3044\u308b\u3059\u3079\u3066\u306e\u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u63a5\u7d9a\u3057\u3066\u304f\u3060\u3055\u3044\",\r\n            \"ou\": \"\u307e\u305f\u306f\",\r\n            \"2 \u2014 V\u00c9RIFIER TES NFT\": \"2 \u2014 NFT \u3092\u78ba\u8a8d\",\r\n            \"V\u00e9rifie automatiquement le nombre de NFT d\u00e9tenus sur chacun de tes wallets.\": \"\u5404\u30a6\u30a9\u30ec\u30c3\u30c8\u304c\u4fdd\u6709\u3059\u308b NFT \u6570\u3092\u81ea\u52d5\u7684\u306b\u78ba\u8a8d\u3057\u307e\u3059\u3002\",\r\n            \"3 \u2014 ENVOYER TES INFORMATIONS \u00c0 GG CONNECT\": \"3 \u2014 \u60c5\u5831\u3092 GG CONNECT \u306b\u9001\u4fe1\",\r\n            \"Une fois la v\u00e9rification termin\u00e9e, envoie tes wallets et les r\u00e9sultats \u00e0\": \"\u78ba\u8a8d\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u30a6\u30a9\u30ec\u30c3\u30c8\u3068\u7d50\u679c\u3092\u9001\u4fe1\u3057\u307e\u3059\uff1a\",\r\n            \"\u26a0 R\u00c9SEAUX \u00c0 UTILISER\": \"\u26a0 \u4f7f\u7528\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\",\r\n            \"WALLETS EVM \u2192 POLYGON\": \"EVM \u30a6\u30a9\u30ec\u30c3\u30c8 \u2192 POLYGON\",\r\n            \"WALLETS SOLANA \u2192 SOLANA\": \"SOLANA \u30a6\u30a9\u30ec\u30c3\u30c8 \u2192 SOLANA\",\r\n            \"\ud83c\udf81 R\u00c9COMPENSES NFT\": \"\ud83c\udf81 NFT \u5831\u916c\",\r\n            \"Wallets EVM\": \"EVM \u30a6\u30a9\u30ec\u30c3\u30c8\",\r\n            \"Recherche des wallets EVM...\": \"EVM \u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u691c\u7d22\u4e2d...\",\r\n            \"Wallets SOLANA\": \"SOLANA \u30a6\u30a9\u30ec\u30c3\u30c8\",\r\n            \"\ud83d\udc7b Connecter Phantom Solana\": \"\ud83d\udc7b Phantom Solana \u3092\u63a5\u7d9a\",\r\n            \"\uff0b AJOUTER UN WALLET\": \"\uff0b \u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u8ffd\u52a0\",\r\n            \"Wallets connect\u00e9s\": \"\u63a5\u7d9a\u6e08\u307f\u30a6\u30a9\u30ec\u30c3\u30c8\",\r\n            \"Aucun wallet connect\u00e9 pour le moment.\": \"\u73fe\u5728\u3001\u63a5\u7d9a\u3055\u308c\u3066\u3044\u308b\u30a6\u30a9\u30ec\u30c3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002\",\r\n            \"\ud83e\uddec V\u00e9rification des NFT Galaxy Gamers\": \"\ud83e\uddec Galaxy Gamers NFT \u78ba\u8a8d\",\r\n            \"V\u00e9rifie les NFT d\u00e9tenus par les wallets connect\u00e9s :\": \"\u63a5\u7d9a\u3055\u308c\u305f\u30a6\u30a9\u30ec\u30c3\u30c8\u304c\u4fdd\u6709\u3059\u308b NFT \u3092\u78ba\u8a8d\u3057\u307e\u3059\uff1a\",\r\n            \"Cette \u00e9tape ne cr\u00e9dite encore aucun GG Coin et n'enregistre rien dans Supabase.\": \"\u3053\u306e\u6bb5\u968e\u3067\u306f GG Coins \u306f\u4ed8\u4e0e\u3055\u308c\u305a\u3001Supabase \u306b\u3082\u4fdd\u5b58\u3055\u308c\u307e\u305b\u3093\u3002\",\r\n            \"\ud83d\udd0e V\u00c9RIFIER MES NFT GALAXY GAMERS\": \"\ud83d\udd0e GALAXY GAMERS NFT \u3092\u78ba\u8a8d\",\r\n            \"Connecte au moins un wallet puis lance la v\u00e9rification.\": \"\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u306e\u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u63a5\u7d9a\u3057\u3066\u304b\u3089\u78ba\u8a8d\u3092\u958b\u59cb\u3057\u3066\u304f\u3060\u3055\u3044\u3002\",\r\n            \"\ud83d\udce4 Transmission\": \"\ud83d\udce4 \u9001\u4fe1\",\r\n            \"\u2197 ENVOYER \u00c0 GG-CONNECT\": \"\u2197 GG-CONNECT \u306b\u9001\u4fe1\",\r\n            \"\ud83d\uddd1\ufe0f Effacer les wallets\": \"\ud83d\uddd1\ufe0f \u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u6d88\u53bb\",\r\n            \"Cette page constitue la couche wallet et la v\u00e9rification NFT de Galaxy Gamers.\": \"\u3053\u306e\u30da\u30fc\u30b8\u306f Galaxy Gamers \u306e\u30a6\u30a9\u30ec\u30c3\u30c8\u63a5\u7d9a\u3068 NFT \u78ba\u8a8d\u3092\u884c\u3044\u307e\u3059\u3002\",\r\n            \"\u00c9tape actuelle :\": \"\u73fe\u5728\u306e\u30b9\u30c6\u30c3\u30d7\uff1a\",\r\n            \"connexion des wallets et v\u00e9rification des NFT Lotpak, Xpheres et Xnova.\": \"\u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u63a5\u7d9a\u3057\u3001Lotpak\u3001Xpheres\u3001Xnova NFT \u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\",\r\n            \"\u00c9tape suivante :\": \"\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\uff1a\",\r\n            \"transmettre les wallets et les r\u00e9sultats NFT \u00e0 GG-Connect puis les enregistrer c\u00f4t\u00e9 serveur.\": \"\u30a6\u30a9\u30ec\u30c3\u30c8\u3068 NFT \u306e\u78ba\u8a8d\u7d50\u679c\u3092 GG-Connect \u306b\u9001\u4fe1\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u5074\u306b\u4fdd\u5b58\u3057\u307e\u3059\u3002\",\r\n            \"Derni\u00e8re \u00e9tape :\": \"\u6700\u7d42\u30b9\u30c6\u30c3\u30d7\uff1a\",\r\n            \"appliquer les r\u00e8gles de r\u00e9compenses et cr\u00e9diter les GG Coins c\u00f4t\u00e9 serveur.\": \"\u5831\u916c\u30eb\u30fc\u30eb\u3092\u9069\u7528\u3057\u3001\u30b5\u30fc\u30d0\u30fc\u5074\u3067 GG Coins \u3092\u4ed8\u4e0e\u3057\u307e\u3059\u3002\",\r\n            \"Supprimer\": \"\u524a\u9664\",\r\n            \"Aucun wallet EVM d\u00e9tect\u00e9.\": \"EVM \u30a6\u30a9\u30ec\u30c3\u30c8\u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\",\r\n            \"V\u00e9rifie que MetaMask, Phantom ou un autre wallet EVM est install\u00e9 dans ce navigateur.\": \"\u3053\u306e\u30d6\u30e9\u30a6\u30b6\u306b MetaMask\u3001Phantom\u3001\u307e\u305f\u306f\u5225\u306e EVM \u30a6\u30a9\u30ec\u30c3\u30c8\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\",\r\n            \"Aucune adresse retourn\u00e9e par le wallet.\": \"\u30a6\u30a9\u30ec\u30c3\u30c8\u304b\u3089\u30a2\u30c9\u30ec\u30b9\u304c\u8fd4\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\",\r\n            \"Phantom Solana d\u00e9tect\u00e9.\": \"Phantom Solana \u3092\u691c\u51fa\u3057\u307e\u3057\u305f\u3002\",\r\n            \"Phantom Solana non d\u00e9tect\u00e9.\": \"Phantom Solana \u304c\u691c\u51fa\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\",\r\n            \"Liste des wallets effac\u00e9e.\": \"\u30a6\u30a9\u30ec\u30c3\u30c8\u4e00\u89a7\u3092\u6d88\u53bb\u3057\u307e\u3057\u305f\u3002\",\r\n            \"\u23f3 V\u00c9RIFICATION DES NFT...\": \"\u23f3 NFT \u3092\u78ba\u8a8d\u4e2d...\",\r\n            \"Connecte au moins un wallet avant de lancer la v\u00e9rification.\": \"\u78ba\u8a8d\u3092\u958b\u59cb\u3059\u308b\u524d\u306b\u3001\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u306e\u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u63a5\u7d9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\",\r\n            \"V\u00e9rification des NFT en cours...\": \"NFT \u3092\u78ba\u8a8d\u3057\u3066\u3044\u307e\u3059...\",\r\n            \"Adresse ou collection NFT invalide.\": \"NFT \u30a2\u30c9\u30ec\u30b9\u307e\u305f\u306f\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u304c\u7121\u52b9\u3067\u3059\u3002\",\r\n            \"Impossible de v\u00e9rifier cette collection sur Polygon.\": \"Polygon \u4e0a\u3067\u3053\u306e\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u78ba\u8a8d\u3067\u304d\u307e\u305b\u3093\u3002\",\r\n            \"Adresse Solana absente.\": \"Solana \u30a2\u30c9\u30ec\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002\",\r\n            \"Impossible de joindre Supabase. V\u00e9rifie que la fonction scan-xnova est bien d\u00e9ploy\u00e9e.\": \"Supabase \u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3002scan-xnova \u95a2\u6570\u304c\u30c7\u30d7\u30ed\u30a4\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\",\r\n            \"\u2014 Aucun NFT\": \"\u2014 NFT \u306a\u3057\",\r\n            \"Token ID :\": \"Token ID\uff1a\",\r\n            \"Aucun wallet \u00e0 transmettre.\": \"\u9001\u4fe1\u3059\u308b\u30a6\u30a9\u30ec\u30c3\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002\",\r\n            \"Cette page doit \u00eatre ouverte depuis GG-Connect pour transmettre les wallets.\": \"\u30a6\u30a9\u30ec\u30c3\u30c8\u3092\u9001\u4fe1\u3059\u308b\u306b\u306f GG-Connect \u304b\u3089\u3053\u306e\u30da\u30fc\u30b8\u3092\u958b\u304f\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\"\r\n        }\r\n    };\r\n\r\n    const originals = new WeakMap();\r\n\r\n    function getLanguage() {\r\n        try {\r\n            return localStorage.getItem(\"gg_language\") || \"fr\";\r\n        } catch (e) {\r\n            return \"fr\";\r\n        }\r\n    }\r\n\r\n    function translateNode(node, lang) {\r\n        if (!node || node.nodeType !== Node.TEXT_NODE) return;\r\n        const raw = node.nodeValue || \"\";\r\n        if (!originals.has(node)) originals.set(node, raw);\r\n\r\n        const base = originals.get(node);\r\n        const trimmed = base.trim();\r\n        if (!trimmed) return;\r\n\r\n        const dict = translations[lang] || translations.fr;\r\n        const translated = dict[trimmed];\r\n        if (translated === undefined) return;\r\n\r\n        const leading = base.match(\/^\\s*\/)?.[0] || \"\";\r\n        const trailing = base.match(\/\\s*$\/)?.[0] || \"\";\r\n        node.nodeValue = leading + translated + trailing;\r\n    }\r\n\r\n    function applyLanguage(lang) {\r\n        lang = translations[lang] ? lang : \"fr\";\r\n        document.documentElement.lang = lang;\r\n\r\n        const titleMap = {\r\n            fr: \"GG WALLET BRIDGE \u2014 Galaxy Gamers\",\r\n            en: \"GG WALLET BRIDGE \u2014 Galaxy Gamers\",\r\n            es: \"GG WALLET BRIDGE \u2014 Galaxy Gamers\",\r\n            zh: \"GG WALLET BRIDGE \u2014 Galaxy Gamers\",\r\n            ja: \"GG WALLET BRIDGE \u2014 Galaxy Gamers\"\r\n        };\r\n        document.title = titleMap[lang];\r\n\r\n        const walker = document.createTreeWalker(\r\n            document.body,\r\n            NodeFilter.SHOW_TEXT\r\n        );\r\n\r\n        let node;\r\n        while ((node = walker.nextNode())) {\r\n            translateNode(node, lang);\r\n        }\r\n    }\r\n\r\n    function translateDynamic(root, lang) {\r\n        if (!root) return;\r\n\r\n        if (root.nodeType === Node.TEXT_NODE) {\r\n            translateNode(root, lang);\r\n            return;\r\n        }\r\n\r\n        const walker = document.createTreeWalker(\r\n            root,\r\n            NodeFilter.SHOW_TEXT\r\n        );\r\n\r\n        let node;\r\n        while ((node = walker.nextNode())) {\r\n            translateNode(node, lang);\r\n        }\r\n    }\r\n\r\n    const observer = new MutationObserver(function (mutations) {\r\n        const lang = getLanguage();\r\n        mutations.forEach(function (mutation) {\r\n            mutation.addedNodes.forEach(function (node) {\r\n                translateDynamic(node, lang);\r\n            });\r\n        });\r\n    });\r\n\r\n    observer.observe(document.body, {\r\n        subtree: true,\r\n        childList: true\r\n    });\r\n\r\n    applyLanguage(getLanguage());\r\n\r\n    window.addEventListener(\"storage\", function (event) {\r\n        if (event.key === \"gg_language\") {\r\n            applyLanguage(event.newValue || \"fr\");\r\n        }\r\n    });\r\n\r\n    window.addEventListener(\"pageshow\", function () {\r\n        applyLanguage(getLanguage());\r\n    });\r\n})();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>GG WALLET BRIDGE \u2014 Galaxy Gamers \ud83d\udcbb UTILISATION SUR ORDINATEUR UNIQUEMENT Pour connecter tes wallets et r\u00e9cup\u00e9rer tes GG COINS, utilise un PC ou un ordinateur portable. \ud83d\udd10 GG WALLET BRIDGE R\u00e9cup\u00e8re tes GG COINS gr\u00e2ce \u00e0 tes NFT Galaxy Gamers. COMMENT \u00c7A FONCTIONNE ? 1 \u2014 CONNECTER TOUS TES WALLETS Connecte tous les wallets [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-342","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/pages\/342"}],"collection":[{"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/comments?post=342"}],"version-history":[{"count":184,"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/pages\/342\/revisions"}],"predecessor-version":[{"id":528,"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/pages\/342\/revisions\/528"}],"wp:attachment":[{"href":"https:\/\/www.ggunity.com\/index.php\/wp-json\/wp\/v2\/media?parent=342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}