{"id":2390,"date":"2026-08-25T10:52:25","date_gmt":"2026-08-25T10:52:25","guid":{"rendered":"https:\/\/crypto-grandpa.com.ua\/?page_id=2390"},"modified":"2026-09-21T04:46:48","modified_gmt":"2026-09-21T04:46:48","slug":"software","status":"publish","type":"page","link":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/software\/","title":{"rendered":"\u0421\u043e\u0444\u0442"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2390\" class=\"elementor elementor-2390\">\n\t\t\t\t<div class=\"elementor-element elementor-element-66e88d8a e-con-full cg-main-hero e-flex e-con e-parent\" data-id=\"66e88d8a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-6f56e296 e-con-full e-flex e-con e-child\" data-id=\"6f56e296\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1119825d elementor-widget elementor-widget-heading\" data-id=\"1119825d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">SOFTWARE \u2022 EDUCATION \u2022 INNOVATION<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-27b7010c elementor-widget elementor-widget-heading\" data-id=\"27b7010c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">SOFTWARE<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a13e959 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"5a13e959\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Practical software solutions developed by Crypto-Grandpa\u2122 Ukraine Foundation for education, digital skills and real-world applications.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0eb80c5 elementor-widget elementor-widget-html\" data-id=\"0eb80c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"cg-site-dock\">\n\n    <a class=\"cg-dock-item cg-dock-special\"\n       href=\"\/support-us\/\"\n       data-title=\"SUPPORT OUR MISSION\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/00_SUPPORT_MISSION.png\"\n             alt=\"Support Our Mission\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Education for All\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/01_education_for_all.png\"\n             alt=\"Education for All\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Digital Literacy\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/02_digital_literacy.png\"\n             alt=\"Digital Literacy\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Support Seniors\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/03_support_seniors.png\"\n             alt=\"Support Seniors\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Working Together\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/04_working_together.png\"\n             alt=\"Working Together\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Helping Grandchildren\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/05_helping_grandchildren.png\"\n             alt=\"Helping Grandchildren\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Economic Development\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/06_economic_development.png\"\n             alt=\"Economic Development\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Volunteer Support\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/07_volunteer_support.png\"\n             alt=\"Volunteer Support\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Support Services\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/08_support_services.png\"\n             alt=\"Support Services\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Financial Literacy\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/09_financial_literacy.png\"\n             alt=\"Financial Literacy\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Technology & Innovation\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/10_technology_innovation.png\"\n             alt=\"Technology & Innovation\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Community Development\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/11_community_development.png\"\n             alt=\"Community Development\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Cyber Safety\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/12_cyber_safety.png\"\n             alt=\"Cyber Safety\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Intergenerational Support\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/13_intergenerational_support.png\"\n             alt=\"Intergenerational Support\">\n    <\/a>\n\n    <a class=\"cg-dock-item\" href=\"#\" data-title=\"Programming\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/14_programming.png\"\n             alt=\"Programming\">\n    <\/a>\n\n    <a class=\"cg-dock-item cg-dock-special\"\n       href=\"\/support-our-software\/\"\n       data-title=\"SUPPORT OUR SOFTWARE\">\n        <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/08\/15_SUPPORT_SOFT_.png\"\n             alt=\"Support Our Software\">\n    <\/a>\n\n<\/div>\n<script>\n(function () {\n\n    function initCGDock() {\n\n        const dock = document.querySelector('.cg-site-dock');\n        const hero = document.querySelector('.cg-main-hero');\n        const footer = document.querySelector('#colophon');\n\n        if (!dock) return;\n\n        const FIXED_BOTTOM = 65;\n        const HERO_GAP = 24;\n        const TRANSITION_DISTANCE = 180;\n\n        function updateCGDock() {\n\n            const scrollY =\n                window.scrollY ||\n                document.documentElement.scrollTop ||\n                0;\n\n            \/* ---------------------------------\n               1. POSITION AT HERO ON PAGE LOAD\n               --------------------------------- *\/\n\n            if (hero) {\n\n                const heroRect = hero.getBoundingClientRect();\n\n                \/* Absolute bottom of Hero *\/\n                const heroDocumentBottom =\n                    heroRect.bottom + scrollY;\n\n                \/*\n                 * Dock sits HERO_GAP pixels\n                 * above the bottom edge of Hero\n                 *\/\n                const heroBottomPosition = Math.max(\n                    24,\n                    window.innerHeight -\n                    heroDocumentBottom +\n                    HERO_GAP\n                );\n\n                \/*\n                 * Smoothly move from Hero position\n                 * to normal fixed position\n                 *\/\n                const progress = Math.min(\n                    scrollY \/ TRANSITION_DISTANCE,\n                    1\n                );\n\n                const currentBottom =\n                    heroBottomPosition +\n                    (FIXED_BOTTOM - heroBottomPosition) *\n                    progress;\n\n                dock.style.bottom =\n                    currentBottom + 'px';\n\n            } else {\n\n                dock.style.bottom =\n                    FIXED_BOTTOM + 'px';\n            }\n\n\n            \/* ---------------------------------\n               2. HIDE BEFORE FOOTER\n               --------------------------------- *\/\n\n            if (footer) {\n\n                const footerTop =\n                    footer.getBoundingClientRect().top;\n\n                \/*\n                 * Hide BEFORE Dock begins\n                 * covering footer content\n                 *\/\n                const hidePoint =\n                    window.innerHeight -\n                    (FIXED_BOTTOM + 85);\n\n                if (footerTop <= hidePoint) {\n\n                    dock.classList.add(\n                        'cg-dock-hidden'\n                    );\n\n                } else {\n\n                    dock.classList.remove(\n                        'cg-dock-hidden'\n                    );\n                }\n            }\n        }\n\n\n        updateCGDock();\n\n        window.addEventListener(\n            'scroll',\n            updateCGDock,\n            { passive: true }\n        );\n\n        window.addEventListener(\n            'resize',\n            updateCGDock\n        );\n    }\n\n\n    if (document.readyState === 'loading') {\n\n        document.addEventListener(\n            'DOMContentLoaded',\n            initCGDock\n        );\n\n    } else {\n\n        initCGDock();\n    }\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e41192a e-con-full e-flex e-con e-parent\" data-id=\"e41192a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6317d2a elementor-widget elementor-widget-shortcode\" data-id=\"6317d2a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">        <section\n            id=\"cg-software-journey-1\"\n            class=\"cg-sj\"\n            tabindex=\"0\"\n            aria-label=\"\u0406\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u0456\u0441\u0442\u043e\u0440\u0456\u044f \u0440\u043e\u0437\u0432\u0438\u0442\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0431\u0435\u0437\u043f\u0435\u0447\u0435\u043d\u043d\u044f Crypto-Grandpa\"\n            data-empty-hand=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/00_HAND.png\"\n        >\n            <div class=\"cg-sj__header\">\n                <div class=\"cg-sj__kicker\">\u0428\u041b\u042f\u0425 \u0420\u041e\u0417\u0412\u0418\u0422\u041a\u0423 \u041f\u0420\u041e\u0413\u0420\u0410\u041c\u041d\u041e\u0413\u041e \u0417\u0410\u0411\u0415\u0417\u041f\u0415\u0427\u0415\u041d\u041d\u042f<\/div>\n                <h2 class=\"cg-sj__title\">\u0412\u0406\u0414 \u041e\u0414\u041d\u0406\u0404\u0407 \u0406\u0414\u0415\u0407 \u0414\u041e \u041f\u0420\u041e\u0413\u0420\u0410\u041c\u041d\u041e\u0407 \u0415\u041a\u041e\u0421\u0418\u0421\u0422\u0415\u041c\u0418, \u0429\u041e \u0420\u041e\u0417\u0412\u0418\u0412\u0410\u0404\u0422\u042c\u0421\u042f<\/h2>\n                <p class=\"cg-sj__intro\">\u041f\u0435\u0440\u0435\u043c\u0456\u0449\u0443\u0439\u0442\u0435 \u0440\u0443\u043a\u0443 \u0432\u0437\u0434\u043e\u0432\u0436 \u0448\u043a\u0430\u043b\u0438, \u0449\u043e\u0431 \u043f\u043e\u0431\u0430\u0447\u0438\u0442\u0438, \u044f\u043a \u043a\u043e\u0436\u043d\u0435 \u043d\u043e\u0432\u0435 \u0437\u0430\u0432\u0434\u0430\u043d\u043d\u044f \u0432\u0456\u0434\u043a\u0440\u0438\u0432\u0430\u043b\u043e \u0448\u043b\u044f\u0445 \u0434\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u0435\u0442\u0430\u043f\u0443 \u0440\u043e\u0437\u0432\u0438\u0442\u043a\u0443.<\/p>\n                <p class=\"cg-sj__instruction\">\u0417\u0443\u043f\u0438\u043d\u0456\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043b\u044e\u0447\u043e\u0432\u043e\u043c\u0443 \u0435\u0442\u0430\u043f\u0456, \u0449\u043e\u0431 \u0432\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0439\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d. \u041d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c \u043d\u0430 \u0442\u043e\u043a\u0435\u043d, \u0449\u043e\u0431 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043e \u043f\u043e\u0432\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457.<\/p>\n            <\/div>\n\n            <div class=\"cg-sj__token-zone\" aria-live=\"polite\">\n                <a class=\"cg-sj__token-card\" href=\"#\" aria-hidden=\"true\" tabindex=\"-1\">\n                    <div class=\"cg-sj__token-title\"><\/div>\n                    <div class=\"cg-sj__token-flip\" aria-hidden=\"true\">\n                        <div class=\"cg-sj__token-rotor\">\n                            <img decoding=\"async\" class=\"cg-sj__token-img cg-sj__token-front\" src=\"\" alt=\"\">\n                            <img decoding=\"async\"\n                                class=\"cg-sj__token-img cg-sj__token-back\"\n                                src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_coin.png\"\n                                alt=\"\"\n                            >\n                        <\/div>\n                    <\/div>\n                    <div class=\"cg-sj__token-desc\"><\/div>\n                    <img decoding=\"async\" class=\"cg-sj__token-symbol\" src=\"\" alt=\"\" aria-hidden=\"true\">\n                    <div class=\"cg-sj__token-cta\"><\/div>\n                <\/a>\n            <\/div>\n\n            <div class=\"cg-sj__divider\" aria-hidden=\"true\"><\/div>\n\n            <div class=\"cg-sj__chart\" aria-hidden=\"true\">\n                <div class=\"cg-sj__axes\">\n                    <div class=\"cg-sj__axis-x\">\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:4.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:8.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:12.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:16.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:20.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:24.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:28.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:32.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:36.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:40.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:44.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:48.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:52.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:56.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:60.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:64.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:68.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:72.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:76.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:80.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:84.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:88.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:92.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-between\"\n                                style=\"left:96.000000%\"\n                            ><\/span>\n                                                                                <span\n                                class=\"cg-sj__axis-tick-x is-main\"\n                                style=\"left:100.000000%\"\n                            ><\/span>\n                                            <\/div>\n                    <div class=\"cg-sj__axis-y\">\n                        <span class=\"cg-sj__axis-tick-y\" style=\"bottom:25%\"><\/span>\n                        <span class=\"cg-sj__axis-tick-y\" style=\"bottom:50%\"><\/span>\n                        <span class=\"cg-sj__axis-tick-y\" style=\"bottom:75%\"><\/span>\n                        <span class=\"cg-sj__axis-tick-y\" style=\"bottom:100%\"><\/span>\n                    <\/div>\n                    <div class=\"cg-sj__axis-label-x\">\u041f\u0420\u041e\u0413\u0420\u0415\u0421 \u0420\u041e\u0417\u0420\u041e\u0411\u041a\u0418<\/div>\n                    <div class=\"cg-sj__axis-label-y\">\u0421\u041a\u041b\u0410\u0414\u041d\u0406\u0421\u0422\u042c<\/div>\n                <\/div>\n\n                <div class=\"cg-sj__bars\"><\/div>\n\n                <svg class=\"cg-sj__curve-svg\" preserveAspectRatio=\"none\">\n                    <defs>\n                        <filter id=\"cg-software-journey-1-curve-glow\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n                            <feGaussianBlur stdDeviation=\"2.4\" result=\"blur\"><\/feGaussianBlur>\n                            <feMerge>\n                                <feMergeNode in=\"blur\"><\/feMergeNode>\n                                <feMergeNode in=\"SourceGraphic\"><\/feMergeNode>\n                            <\/feMerge>\n                        <\/filter>\n\n                    <\/defs>\n\n                    <path\n                        class=\"cg-sj__curve-path\"\n                        d=\"\"\n                        fill=\"none\"\n                        stroke=\"#F0C76B\"\n                        stroke-width=\"6\"\n                        stroke-linecap=\"round\"\n                        stroke-linejoin=\"round\"\n                        filter=\"url(#cg-software-journey-1-curve-glow)\"\n                    ><\/path>\n\n                    <polygon\n                        class=\"cg-sj__curve-arrowhead\"\n                        points=\"-2,-9 20,0 -2,9\"\n                        fill=\"#F0C76B\"\n                        filter=\"url(#cg-software-journey-1-curve-glow)\"\n                        opacity=\"0\"\n                    ><\/polygon>\n                <\/svg>\n            <\/div>\n\n            <div class=\"cg-sj__timeline\">\n                <svg class=\"cg-sj__track-svg\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n                    <path class=\"cg-sj__track-base\"><\/path>\n                    <path class=\"cg-sj__track-active\"><\/path>\n                <\/svg>\n\n                <div class=\"cg-sj__minor-stops\" aria-hidden=\"true\"><\/div>\n                <div class=\"cg-sj__stage-icons\" aria-hidden=\"true\"><\/div>\n\n                <img decoding=\"async\"\n                    class=\"cg-sj__hand\"\n                    src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/00_HAND.png\"\n                    alt=\"\"\n                    draggable=\"false\"\n                    aria-hidden=\"true\"\n                >\n            <\/div>\n\n            <div class=\"cg-sj__drag-help\">\u041f\u0415\u0420\u0415\u0422\u042f\u0413\u0423\u0419\u0422\u0415 \u0420\u0423\u041a\u0423 \u0410\u0411\u041e \u0412\u0418\u041a\u041e\u0420\u0418\u0421\u0422\u041e\u0412\u0423\u0419\u0422\u0415 \u2190 \u2192<\/div>\n\n            <script type=\"application\/json\" class=\"cg-sj__data\">\n                {\"stages\":[{\"number\":1,\"position\":1,\"title\":\"\u041f\u0415\u0420\u0428\u0406 \u041a\u0420\u041e\u041a\u0418 \u0412 PYTHON \/ \u041f\u0415\u0420\u0428\u0410 \u0410\u0420\u041a\u0410\u0414\u0410\",\"desc\":\"\u041f\u0435\u0440\u0448\u0435 \u0437\u043d\u0430\u0439\u043e\u043c\u0441\u0442\u0432\u043e \u0437 Python \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0432\u043e\u0440\u0435\u043d\u043d\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0457 \u043d\u0430\u0432\u0447\u0430\u043b\u044c\u043d\u043e\u0457 \u0430\u0440\u043a\u0430\u0434\u043d\u043e\u0457 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/01_code_symbol.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/01_code_symbol_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/01_python_learning_token.png\",\"url\":\"\"},{\"number\":2,\"position\":4,\"title\":\"\u0420\u041e\u0417\u0412\u0418\u0422\u041e\u041a \u0410\u0420\u041a\u0410\u0414\u041d\u041e\u0407 \u0413\u0420\u0418\",\"desc\":\"\u0413\u0440\u0430 \u0440\u043e\u0437\u0432\u0438\u0432\u0430\u0454\u0442\u044c\u0441\u044f \u2014 \u0442\u043e\u043a\u0435\u043d\u0438, \u0433\u0435\u0440\u043e\u0457, \u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0456 \u043c\u0456\u0441\u0442\u0430, \u043f\u043e\u0433\u043e\u0434\u043d\u0456 \u0435\u0444\u0435\u043a\u0442\u0438, \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0456 \u043d\u043e\u0432\u0456 \u0441\u0446\u0435\u043d\u0430\u0440\u0456\u0457.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/02_game_joystick.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/02_game_joystick_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/02_arcade_evolution_token.png\",\"url\":\"\"},{\"number\":3,\"position\":7,\"title\":\"\u0412\u0406\u0414 \u041c\u0406\u0421\u0406\u0407 \u0414\u041e TRENCH DESIGN SIMULATOR\",\"desc\":\"\u0406\u0434\u0435\u044f \u043e\u043a\u0440\u0435\u043c\u043e\u0457 \u043c\u0456\u0441\u0456\u0457 \u0432 \u043b\u0430\u0431\u0456\u0440\u0438\u043d\u0442\u0456 \u043f\u0435\u0440\u0435\u0440\u043e\u0441\u0442\u0430\u0454 \u0432 \u0441\u0430\u043c\u043e\u0441\u0442\u0456\u0439\u043d\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u0438\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/03_maze.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/03_maze_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/03_trench_design_token.png\",\"url\":\"\"},{\"number\":4,\"position\":10,\"title\":\"\u0413\u0415\u041d\u0415\u0420\u0410\u0426\u0406\u042f \u041b\u0410\u0411\u0406\u0420\u0418\u041d\u0422\u0406\u0412 \u0406 \u0421\u0418\u041c\u0423\u041b\u042f\u0426\u0406\u042f\",\"desc\":\"\u0412\u043b\u0430\u0441\u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0456\u044f \u043b\u0430\u0431\u0456\u0440\u0438\u043d\u0442\u0456\u0432, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438, \u0444\u043e\u0440\u043c\u0438, \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0456\u044f \u0442\u0430 \u0440\u043e\u0437\u0432\u0438\u0442\u043e\u043a Trench Design Simulator.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/04_gear_with_maze.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/04_gear_with_maze_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/04_maze_generation_token.png\",\"url\":\"\"},{\"number\":5,\"position\":13,\"title\":\"\u0412\u0406\u0414 2D \u0414\u041e 3D \/ TINKERCAD\",\"desc\":\"\u0415\u043a\u0441\u043f\u043e\u0440\u0442 \u0432\u043b\u0430\u0441\u043d\u0438\u0445 \u043b\u0430\u0431\u0456\u0440\u0438\u043d\u0442\u0456\u0432, SVG, Tinkercad \u0456 \u043f\u0435\u0440\u0435\u0445\u0456\u0434 \u0432\u0456\u0434 \u043f\u043b\u043e\u0441\u043a\u043e\u0457 \u0441\u0445\u0435\u043c\u0438 \u0434\u043e 3D-\u043c\u043e\u0434\u0435\u043b\u044e\u0432\u0430\u043d\u043d\u044f.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/05_3D_cube.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/05_3D_cube_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/05_3d_tinkercad_token.png\",\"url\":\"\"},{\"number\":6,\"position\":16,\"title\":\"\u0420\u041e\u0411\u041e\u0422\u041e\u0422\u0415\u0425\u041d\u0406\u041a\u0410 \u0422\u0410 \u0410\u0414\u0410\u041f\u0422\u0418\u0412\u041d\u0410 \u041d\u0410\u0412\u0406\u0413\u0410\u0426\u0406\u042f\",\"desc\":\"\u0412\u0456\u0434 \u0440\u043e\u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043b\u0430\u0431\u0456\u0440\u0438\u043d\u0442\u0456\u0432 \u0434\u043e \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0457 \u043d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u0457 \u0442\u0430 Dynamic Spiral Search.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/06_robot.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/06_robot_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/06_robotics_navigation_token.png\",\"url\":\"\"},{\"number\":7,\"position\":19,\"title\":\"\u0424\u0406\u0417\u0418\u041a\u0410 \u0422\u0410 \u0406\u041d\u0416\u0415\u041d\u0415\u0420\u0406\u042f\",\"desc\":\"\u041f\u0435\u0440\u0435\u0445\u0456\u0434 \u0434\u043e \u043c\u0435\u0445\u0430\u043d\u0456\u043a\u0438, \u0433\u0440\u0430\u0432\u0456\u0442\u0430\u0446\u0456\u0457, \u0431\u0430\u043b\u0430\u043d\u0441\u0443, passive dynamics \u0442\u0430 \u0456\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0438\u0445 \u0435\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0456\u0432.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/07_pendulum.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/07_pendulum_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/07_physics_engineering_token.png\",\"url\":\"\"},{\"number\":8,\"position\":22,\"title\":\"\u0417\u0410\u0425\u0418\u0421\u0422 \u0426\u0418\u0424\u0420\u041e\u0412\u0418\u0425 \u041f\u0420\u041e\u0414\u0423\u041a\u0422\u0406\u0412 \u0422\u0410 \u041b\u0406\u0426\u0415\u041d\u0417\u0423\u0412\u0410\u041d\u041d\u042f\",\"desc\":\"CG_StegoTool, \u0437\u0430\u0445\u0438\u0441\u0442 \u0446\u0438\u0444\u0440\u043e\u0432\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0456\u0432, \u0432\u043b\u0430\u0441\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043b\u0456\u0446\u0435\u043d\u0437\u0443\u0432\u0430\u043d\u043d\u044f \u0442\u0430 CG_License_Generator.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/08_shield_with_key.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/08_shield_with_key_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/08_digital_protection_licensing_token.png\",\"url\":\"\"},{\"number\":9,\"position\":25,\"title\":\"\u041d\u0410\u0421\u0422\u0423\u041f\u041d\u0418\u0419 \u041a\u0420\u041e\u041a \/ \u0415\u041a\u041e\u0421\u0418\u0421\u0422\u0415\u041c\u0410, \u0429\u041e \u0420\u041e\u0417\u0412\u0418\u0412\u0410\u0404\u0422\u042c\u0421\u042f\",\"desc\":\"\u0420\u043e\u0437\u0432\u0438\u0442\u043e\u043a \u0442\u0440\u0438\u0432\u0430\u0454 \u2014 \u043d\u043e\u0432\u0456 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0438, 3D, \u0440\u043e\u0431\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0456\u043a\u0430, \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0438, \u0428\u0406 \u0442\u0430 \u043e\u0441\u0432\u0456\u0442\u043d\u0456 \u043d\u0430\u043f\u0440\u044f\u043c\u0438.\",\"icon\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/09_up_arrow.png\",\"hand\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/09_up_arrow_hand.png\",\"token\":\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/09_future_ecosystem_token.png\",\"url\":\"\"}],\"copy\":{\"open\":\"\u041d\u0410\u0422\u0418\u0421\u041d\u0406\u0422\u042c, \u0429\u041e\u0411 \u0412\u0406\u0414\u041a\u0420\u0418\u0422\u0418 \u041f\u041e\u0412\u041d\u0423 \u0406\u0421\u0422\u041e\u0420\u0406\u042e\",\"pending\":\"\u0421\u0422\u041e\u0420\u0406\u041d\u041a\u0410 \u041f\u041e\u0412\u041d\u041e\u0407 \u0406\u0421\u0422\u041e\u0420\u0406\u0407 \u0411\u0423\u0414\u0415 \u041f\u0406\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0410\",\"blind_phrases\":[[\"\u042f \u0417\u041c\u0406\u0413 \u0426\u0415 \u0417\u0420\u041e\u0411\u0418\u0422\u0418.\",\"\u0412\u0418 \u0422\u0415\u0416 \u0417\u041c\u041e\u0416\u0415\u0422\u0415.\"],[\"\u042f\u041a\u0429\u041e \u0425\u041e\u0427\u0415\u0422\u0415\",\"\u041d\u0410\u0412\u0427\u0418\u0422\u0418\u0421\u042f \u2014\",\"\u0417\u0410\u041f\u0418\u0422\u0410\u0419\u0422\u0415. \u041f\u041e\u0427\u041d\u0415\u041c\u041e \u0420\u0410\u0417\u041e\u041c.\"],[\"\u041c\u0418 \u041d\u0410\u0412\u0427\u0410\u0404\u041c\u041e\u0421\u042f \u0420\u0410\u0417\u041e\u041c \u2014\",\"\u0417 \u041f\u041e\u0412\u0410\u0413\u041e\u042e, \u0421\u041f\u041e\u041a\u0406\u0419\u041d\u041e,\",\"\u041a\u0420\u041e\u041a \u0417\u0410 \u041a\u0420\u041e\u041a\u041e\u041c.\"]]}}            <\/script>\n        <\/section>\n\n        <style>\n            #cg-software-journey-1 {\n                --cg-gold: #F0C76B;\n                --cg-navy: #133A6B;\n                --cg-dark: #0D0E0C;\n                --cg-panel: #0f1a27;\n                --cg-chart-left: 30%;\n                --cg-chart-right: 3%;\n                --cg-token-left: 36px;\n                --cg-token-width: 27%;\n                position: relative;\n                box-sizing: border-box;\n                width: 100vw;\n                max-width: none !important;\n                height: 760px;\n                min-width: 1080px;\n                margin-top: -8px;\n                margin-bottom: -8px;\n                margin-left: calc(50% - 50vw);\n                margin-right: calc(50% - 50vw);\n                overflow: hidden;\n                padding: 0;\n                color: #fff;\n                border: 2px solid rgba(240,199,107,.68);\n                border-radius: 20px;\n                background:\n                    linear-gradient(rgba(240,199,107,.045) 1px, transparent 1px),\n                    linear-gradient(90deg, rgba(240,199,107,.045) 1px, transparent 1px),\n                    radial-gradient(circle at 82% 12%, rgba(240,199,107,.085), transparent 27%),\n                    linear-gradient(118deg, #0D0E0C 0%, #101c2b 54%, #133A6B 145%);\n                background-size:\n                    34px 34px,\n                    34px 34px,\n                    auto,\n                    auto;\n                box-shadow:\n                    inset 0 0 42px rgba(0,0,0,.34),\n                    0 0 22px rgba(240,199,107,.08),\n                    0 16px 46px rgba(0,0,0,.26);\n                isolation: isolate;\n                outline: none;\n                font-family: inherit;\n            }\n\n            #cg-software-journey-1:focus-visible {\n                box-shadow:\n                    inset 0 0 42px rgba(0,0,0,.34),\n                    0 0 0 2px rgba(240,199,107,.28),\n                    0 0 26px rgba(240,199,107,.13),\n                    0 16px 46px rgba(0,0,0,.26);\n            }\n\n            #cg-software-journey-1 * {\n                box-sizing: border-box;\n            }\n\n            \/*\n             * Remove white page seams above\/below the full-width Journey block.\n             * We only recolor outer wrappers; hero\/section backgrounds that have\n             * their own images or colors remain intact.\n             *\/\n            body.cg-sj-seamless,\n            body.cg-sj-seamless #page,\n            body.cg-sj-seamless .site-content,\n            body.cg-sj-seamless .content-area,\n            body.cg-sj-seamless .site-main,\n            body.cg-sj-seamless .entry-content,\n            body.cg-sj-seamless .elementor {\n                background-color: #0D0E0C !important;\n            }\n\n            \/* Hide the global floating dock while Software Journey is visible.\n             * The body class is important: it also hides a dock that is injected\n             * into the DOM after this shortcode has already initialized.\n             *\/\n            body.cg-sj-hide-global-dock #cg-global-dock,\n            body.cg-sj-hide-global-dock .cg-site-dock,\n            #cg-global-dock.cg-dock-force-hidden,\n            .cg-site-dock.cg-dock-force-hidden {\n                display: none !important;\n                opacity: 0 !important;\n                visibility: hidden !important;\n                pointer-events: none !important;\n                transform: translateY(24px) !important;\n            }\n\n            \/*\n             * Remove Elementor's white seams\/gaps around the Journey container.\n             * Scoped with :has() so other site containers are not changed.\n             *\/\n            .elementor-widget-shortcode:has(#cg-software-journey-1),\n            .elementor-widget-shortcode:has(#cg-software-journey-1) > .elementor-widget-container {\n                width: 100% !important;\n                max-width: none !important;\n                margin: 0 !important;\n                padding: 0 !important;\n            }\n\n            .e-con:has(#cg-software-journey-1) {\n                --gap: 0px !important;\n                gap: 0 !important;\n                margin-top: 0 !important;\n                margin-bottom: 0 !important;\n                padding-top: 0 !important;\n                padding-bottom: 0 !important;\n            }\n\n            #cg-software-journey-1 .cg-sj__header {\n                position: absolute;\n                top: 24px;\n                left: 28.5%;\n                right: 24px;\n                z-index: 12;\n                text-align: center;\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__kicker {\n                margin: 0 0 6px;\n                color: var(--cg-gold);\n                font-size: 14px;\n                font-weight: 800;\n                line-height: 1.2;\n                letter-spacing: 2.2px;\n                text-transform: uppercase;\n                text-shadow: 0 2px 6px rgba(0,0,0,.48);\n            }\n\n            #cg-software-journey-1 .cg-sj__title {\n                margin: 0 0 8px !important;\n                color: #fff !important;\n                font-size: 32px !important;\n                font-weight: 800 !important;\n                line-height: 1.08 !important;\n                letter-spacing: .5px;\n                text-transform: uppercase;\n                text-shadow: 0 3px 12px rgba(0,0,0,.46);\n            }\n\n            #cg-software-journey-1 .cg-sj__intro,\n            #cg-software-journey-1 .cg-sj__instruction {\n                max-width: 980px;\n                margin-left: auto;\n                margin-right: auto;\n                color: rgba(255,255,255,.84);\n                font-size: 16px;\n                line-height: 1.45;\n            }\n\n            #cg-software-journey-1 .cg-sj__intro {\n                margin-top: 0;\n                margin-bottom: 2px;\n            }\n\n            #cg-software-journey-1 .cg-sj__instruction {\n                margin-top: 0;\n                margin-bottom: 0;\n                color: rgba(240,199,107,.92);\n                font-weight: 700;\n            }\n\n            #cg-software-journey-1 .cg-sj__divider {\n                position: absolute;\n                z-index: 3;\n                top: 142px;\n                bottom: 168px;\n                left: 28.5%;\n                width: 1px;\n                background: linear-gradient(\n                    to bottom,\n                    transparent,\n                    rgba(240,199,107,.25) 16%,\n                    rgba(240,199,107,.25) 84%,\n                    transparent\n                );\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-zone {\n                position: absolute;\n                z-index: 14;\n                left: var(--cg-token-left);\n                top: 132px;\n                width: calc(var(--cg-token-width) - 48px);\n                height: 430px;\n                display: flex;\n                align-items: center;\n                justify-content: center;\n                text-align: center;\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-card {\n                width: 230px;\n                max-width: 100%;\n                color: inherit;\n                text-decoration: none !important;\n                opacity: 0;\n                visibility: hidden;\n                transform: translateY(10px) scale(.98);\n                transition:\n                    opacity .28s ease,\n                    transform .28s ease,\n                    filter .20s ease;\n                pointer-events: none;\n                outline: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-card.is-visible {\n                opacity: 1;\n                visibility: visible;\n                transform: translateY(0) scale(1);\n                pointer-events: auto;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-card.is-visible:hover,\n            #cg-software-journey-1 .cg-sj__token-card.is-visible:focus-visible {\n                transform: translateY(-2px) scale(1.035);\n                filter: drop-shadow(0 0 14px rgba(240,199,107,.28));\n            }\n\n            #cg-software-journey-1 .cg-sj__token-title {\n                min-height: 46px;\n                margin: 0 0 8px;\n                display: flex;\n                align-items: center;\n                justify-content: center;\n                color: var(--cg-gold);\n                font-size: 18px;\n                font-weight: 800;\n                line-height: 1.28;\n                letter-spacing: 1.05px;\n                text-transform: uppercase;\n                text-shadow: 0 2px 5px rgba(0,0,0,.52);\n            }\n\n            #cg-software-journey-1 .cg-sj__token-flip {\n                position: relative;\n                width: 230px;\n                height: 230px;\n                margin: 0 auto;\n                perspective: 1100px;\n                -webkit-perspective: 1100px;\n                user-select: none;\n                pointer-events: auto;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-rotor {\n                position: relative;\n                width: 100%;\n                height: 100%;\n                transform-style: preserve-3d;\n                -webkit-transform-style: preserve-3d;\n                transform: rotateY(0deg);\n                transition: transform 1.15s cubic-bezier(.22,.68,.24,1);\n                will-change: transform;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-rotor.is-intro-flip {\n                animation: cgSjTokenFlip-cg-software-journey-1 2.35s cubic-bezier(.22,.68,.24,1) 1;\n            }\n\n            \/*\n             * Hover behaviour for the round stage token:\n             * turn to the CG reverse side and HOLD it there for as long as\n             * the pointer remains over the token. When the pointer leaves,\n             * the rotor returns to its normal state and the original intro\n             * flip mechanics remain unchanged.\n             *\/\n            #cg-software-journey-1 .cg-sj__token-flip:hover .cg-sj__token-rotor {\n                animation: none !important;\n                transform: rotateY(180deg) !important;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-img {\n                position: absolute;\n                inset: 0;\n                display: block;\n                width: 230px;\n                height: 230px;\n                max-width: none !important;\n                margin: 0;\n                object-fit: contain;\n                backface-visibility: hidden;\n                -webkit-backface-visibility: hidden;\n                filter: drop-shadow(0 10px 20px rgba(0,0,0,.36));\n                user-select: none;\n                -webkit-user-drag: none;\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-front {\n                transform: rotateY(0deg);\n            }\n\n            #cg-software-journey-1 .cg-sj__token-back {\n                transform: rotateY(180deg);\n            }\n\n            @keyframes cgSjTokenFlip-cg-software-journey-1 {\n                0%   { transform: rotateY(0deg); }\n                42%  { transform: rotateY(180deg); }\n                62%  { transform: rotateY(180deg); }\n                100% { transform: rotateY(360deg); }\n            }\n\n            #cg-software-journey-1 .cg-sj__token-desc {\n                min-height: 43px;\n                margin: 8px -24px 4px;\n                color: rgba(255,255,255,.86);\n                font-size: 16px;\n                line-height: 1.42;\n                text-shadow: 0 2px 5px rgba(0,0,0,.46);\n            }\n\n            #cg-software-journey-1 .cg-sj__token-symbol {\n                display: block;\n                width: 174px;\n                height: 174px;\n                max-width: none !important;\n                margin: 7px auto 4px;\n                object-fit: contain;\n                transform-origin: 50% 50%;\n                animation: cgSjTokenSymbolSpin-cg-software-journey-1 8s linear infinite;\n                filter:\n                    brightness(1.06)\n                    drop-shadow(0 0 7px rgba(240,199,107,.25));\n                user-select: none;\n                -webkit-user-drag: none;\n                pointer-events: none;\n            }\n\n            @keyframes cgSjTokenSymbolSpin-cg-software-journey-1 {\n                from { transform: rotate(0deg); }\n                to   { transform: rotate(360deg); }\n            }\n\n            #cg-software-journey-1 .cg-sj__token-cta {\n                margin-top: 5px;\n                color: var(--cg-gold);\n                font-size: 13px;\n                font-weight: 800;\n                line-height: 1.3;\n                letter-spacing: 1.15px;\n                text-transform: uppercase;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-card.is-pending {\n                cursor: default;\n            }\n\n            #cg-software-journey-1 .cg-sj__token-card:not(.is-pending) {\n                cursor: pointer;\n            }\n\n            #cg-software-journey-1 .cg-sj__chart {\n                position: absolute;\n                z-index: 5;\n                left: var(--cg-chart-left);\n                right: var(--cg-chart-right);\n                top: 140px;\n                height: 395px;\n                overflow: visible;\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__axes {\n                position: absolute;\n                inset: 0;\n                z-index: 0;\n                overflow: visible;\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-x {\n                position: absolute;\n                left: 0;\n                right: 0;\n                bottom: 0;\n                height: 1.5px;\n                background: rgba(240,199,107,.42);\n                box-shadow: 0 0 5px rgba(240,199,107,.08);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-y {\n                position: absolute;\n                left: 0;\n                top: 0;\n                bottom: 0;\n                width: 1.5px;\n                background: rgba(240,199,107,.42);\n                box-shadow: 0 0 5px rgba(240,199,107,.08);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-x::before,\n            #cg-software-journey-1 .cg-sj__axis-y::after {\n                content: \"\";\n                position: absolute;\n                width: 6px;\n                height: 6px;\n                border-radius: 50%;\n                background: rgba(240,199,107,.72);\n                box-shadow: 0 0 6px rgba(240,199,107,.22);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-x::before {\n                left: -2.25px;\n                top: -2.25px;\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-y::after {\n                left: -2.25px;\n                bottom: -2.25px;\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-tick-x {\n                position: absolute;\n                top: 50%;\n                width: 1px;\n                transform: translate(-50%, -50%);\n                background: rgba(240,199,107,.62);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-tick-x.is-main {\n                height: 11px;\n                background: rgba(240,199,107,.82);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-tick-x.is-between {\n                height: 7px;\n                background: rgba(240,199,107,.46);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-tick-y {\n                position: absolute;\n                left: 50%;\n                width: 10px;\n                height: 1px;\n                transform: translate(-50%, 50%);\n                background: rgba(240,199,107,.60);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-label-x {\n                position: absolute;\n                left: 50%;\n                bottom: -32px;\n                transform: translateX(-50%);\n                color: rgba(240,199,107,.88);\n                font-size: 12px;\n                font-weight: 800;\n                line-height: 1;\n                letter-spacing: 1.8px;\n                white-space: nowrap;\n                text-transform: uppercase;\n                text-shadow: 0 1px 4px rgba(0,0,0,.54);\n            }\n\n            #cg-software-journey-1 .cg-sj__axis-label-y {\n                position: absolute;\n                left: 18px;\n                top: 50%;\n                transform: translate(-50%, -50%) rotate(-90deg);\n                transform-origin: center;\n                color: rgba(240,199,107,.88);\n                font-size: 12px;\n                font-weight: 800;\n                line-height: 1;\n                letter-spacing: 1.8px;\n                white-space: nowrap;\n                text-transform: uppercase;\n                text-shadow: 0 1px 4px rgba(0,0,0,.54);\n            }\n\n            #cg-software-journey-1 .cg-sj__bars {\n                z-index: 2;\n            }\n\n            #cg-software-journey-1 .cg-sj__bars,\n            #cg-software-journey-1 .cg-sj__curve-svg {\n                position: absolute;\n                inset: 0;\n                width: 100%;\n                height: 100%;\n                overflow: visible;\n            }\n\n            #cg-software-journey-1 .cg-sj__bar {\n                position: absolute;\n                bottom: 0;\n                transform: translateX(-50%);\n                transform-origin: 50% 100%;\n                height: 0;\n                border-radius: 12px 12px 0 0;\n                opacity: 0;\n                perspective: 720px;\n                -webkit-perspective: 720px;\n                will-change: height, opacity, filter;\n                transition:\n                    opacity .10s linear,\n                    filter .18s ease;\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-main {\n                width: 34px;\n                box-shadow:\n                    0 0 10px rgba(72,218,112,.16);\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-between {\n                width: 24px;\n                box-shadow:\n                    0 0 7px rgba(232,78,78,.10);\n            }\n\n            \/*\n             * Extra in-between slats added between every existing pair.\n             * Their width is calculated in JS so that exactly 2px remains\n             * between the new slat and each neighbouring existing column.\n             *\/\n            #cg-software-journey-1 .cg-sj__bar.is-bridge {\n                min-width: 2px;\n                border-radius: 8px 8px 0 0;\n                box-shadow: 0 0 6px rgba(0,0,0,.10);\n            }\n\n            #cg-software-journey-1 .cg-sj__slat-rotor {\n                position: absolute;\n                inset: 0;\n                border-radius: inherit;\n                transform: rotateY(0deg);\n                transform-origin: 50% 50%;\n                transform-style: preserve-3d;\n                -webkit-transform-style: preserve-3d;\n                transition: transform .76s cubic-bezier(.22,.68,.24,1);\n                transition-delay: var(--cg-blind-delay, 0ms);\n                will-change: transform;\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-flipped .cg-sj__slat-rotor {\n                transform: rotateY(180deg);\n            }\n\n            #cg-software-journey-1 .cg-sj__slat-face {\n                position: absolute;\n                inset: 0;\n                overflow: hidden;\n                border-radius: inherit;\n                backface-visibility: hidden;\n                -webkit-backface-visibility: hidden;\n                box-shadow: inset 0 0 9px rgba(255,255,255,.10);\n            }\n\n            #cg-software-journey-1 .cg-sj__slat-front {\n                transform: rotateY(0deg);\n            }\n\n            #cg-software-journey-1 .cg-sj__slat-back {\n                transform: rotateY(180deg);\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-main .cg-sj__slat-face {\n                background: linear-gradient(\n                    to right,\n                    rgba(37,154,75,.88),\n                    rgba(72,218,112,1) 48%,\n                    rgba(38,171,82,.92)\n                );\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-between .cg-sj__slat-face {\n                background: linear-gradient(\n                    to right,\n                    rgba(177,44,44,.84),\n                    rgba(232,78,78,.98) 48%,\n                    rgba(190,47,47,.88)\n                );\n            }\n\n            \/*\n             * Every newly added bridge slat is split vertically into two\n             * colour halves: left neighbour colour \/ right neighbour colour.\n             *\/\n            #cg-software-journey-1 .cg-sj__bar.is-bridge .cg-sj__slat-face {\n                background: linear-gradient(\n                    to right,\n                    var(--cg-bridge-left) 0%,\n                    var(--cg-bridge-left) 50%,\n                    var(--cg-bridge-right) 50%,\n                    var(--cg-bridge-right) 100%\n                );\n                box-shadow:\n                    inset 0 0 7px rgba(255,255,255,.08),\n                    0 0 5px rgba(0,0,0,.08);\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-bridge .cg-sj__slat-face::after {\n                content: \"\";\n                position: absolute;\n                top: 0;\n                bottom: 0;\n                left: 50%;\n                width: 2px;\n                transform: translateX(-50%);\n                background: rgba(240,199,107,.94);\n                box-shadow: 0 0 5px rgba(240,199,107,.35);\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__slat-copy {\n                position: absolute;\n                bottom: 0;\n                opacity: 0;\n                pointer-events: none;\n                user-select: none;\n                transition: opacity .20s ease;\n            }\n\n            #cg-software-journey-1.is-phrase-building .cg-sj__slat-copy {\n                opacity: 1;\n            }\n\n            #cg-software-journey-1 .cg-sj__blind-phrase {\n                position: absolute;\n                right: 18px;\n                bottom: 18px;\n                margin: 0;\n                text-align: right;\n                color: rgba(255,255,255,.96);\n                font-family: \"Arial Black\", \"Trebuchet MS\", Arial, sans-serif;\n                font-size: clamp(38px, 3.25vw, 62px);\n                font-weight: 900;\n                line-height: .88;\n                letter-spacing: .025em;\n                text-transform: uppercase;\n                white-space: nowrap;\n                -webkit-text-stroke: 1px rgba(240,199,107,.82);\n                text-shadow:\n                    0 2px 3px rgba(0,0,0,.72),\n                    0 0 8px rgba(240,199,107,.28);\n            }\n\n            #cg-software-journey-1 .cg-sj__blind-line {\n                display: block;\n                white-space: nowrap;\n            }\n\n            #cg-software-journey-1 .cg-sj__blind-line + .cg-sj__blind-line {\n                margin-top: var(--cg-blind-line-gap, .10em);\n            }\n\n            #cg-software-journey-1.is-blind-resetting .cg-sj__slat-copy {\n                opacity: 0 !important;\n                transition-duration: .001ms !important;\n            }\n\n            #cg-software-journey-1.is-blind-resetting .cg-sj__slat-rotor {\n                transform: rotateY(0deg) !important;\n                transition-delay: 0ms !important;\n                transition-duration: .28s !important;\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-pulsing {\n                animation: cgSjBarPulse-cg-software-journey-1 1.6s ease-in-out infinite;\n                filter: drop-shadow(0 0 11px rgba(72,218,112,.54));\n            }\n\n            #cg-software-journey-1 .cg-sj__bar.is-future {\n                box-shadow:\n                    inset 0 0 10px rgba(255,255,255,.13),\n                    0 -11px 20px rgba(72,218,112,.24),\n                    0 0 15px rgba(72,218,112,.20);\n            }\n\n            @keyframes cgSjBarPulse-cg-software-journey-1 {\n                0%, 100% {\n                    height: var(--cg-bar-h);\n                    filter: drop-shadow(0 0 9px rgba(72,218,112,.38));\n                }\n                50% {\n                    height: calc(var(--cg-bar-h) + 8px);\n                    filter: drop-shadow(0 0 15px rgba(72,218,112,.64));\n                }\n            }\n\n            #cg-software-journey-1 .cg-sj__curve-svg {\n                z-index: 4;\n            }\n\n            #cg-software-journey-1 .cg-sj__curve-path {\n                opacity: .98;\n            }\n\n            #cg-software-journey-1 .cg-sj__curve-arrowhead {\n                transform-box: fill-box;\n                transform-origin: 0 0;\n                transition: opacity .08s linear;\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__timeline {\n                position: absolute;\n                z-index: 20;\n                left: var(--cg-chart-left);\n                right: var(--cg-chart-right);\n                top: 592px;\n                height: 86px;\n                cursor: pointer;\n                touch-action: none;\n                user-select: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__track-svg {\n                position: absolute;\n                left: 0;\n                right: 0;\n                top: 42px;\n                width: 100%;\n                height: 2px;\n                overflow: visible;\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__track-base,\n            #cg-software-journey-1 .cg-sj__track-active {\n                fill: none;\n                stroke-linecap: round;\n            }\n\n            #cg-software-journey-1 .cg-sj__track-base {\n                stroke: rgba(240,199,107,.38);\n                stroke-width: 2;\n            }\n\n            #cg-software-journey-1 .cg-sj__track-active {\n                stroke: rgba(240,199,107,.82);\n                stroke-width: 2.5;\n                filter: drop-shadow(0 0 4px rgba(240,199,107,.18));\n            }\n\n            #cg-software-journey-1 .cg-sj__minor-stop {\n                position: absolute;\n                top: 42px;\n                width: 5px;\n                height: 5px;\n                border-radius: 50%;\n                background: rgba(240,199,107,.32);\n                transform: translate(-50%, -50%);\n                pointer-events: none;\n            }\n\n            #cg-software-journey-1 .cg-sj__minor-stop.is-zero {\n                width: 7px;\n                height: 7px;\n                background: rgba(240,199,107,.48);\n                box-shadow: 0 0 5px rgba(240,199,107,.11);\n            }\n\n            #cg-software-journey-1 .cg-sj__stage-icon-wrap {\n                position: absolute;\n                top: 42px;\n                width: 56px;\n                height: 56px;\n                transform: translate(-50%, -50%);\n                display: flex;\n                align-items: center;\n                justify-content: center;\n                pointer-events: none;\n                transition:\n                    width .20s ease,\n                    height .20s ease,\n                    filter .20s ease;\n            }\n\n            #cg-software-journey-1 .cg-sj__stage-icon {\n                display: block;\n                width: 56px;\n                height: 56px;\n                object-fit: contain;\n                opacity: .23;\n                filter:\n                    grayscale(.76)\n                    brightness(1.18)\n                    drop-shadow(0 2px 5px rgba(0,0,0,.28));\n                transition:\n                    opacity .35s ease,\n                    filter .35s ease,\n                    width .20s ease,\n                    height .20s ease;\n                user-select: none;\n                -webkit-user-drag: none;\n            }\n\n            #cg-software-journey-1.is-started .cg-sj__stage-icon {\n                opacity: .94;\n                filter:\n                    grayscale(0)\n                    brightness(1)\n                    drop-shadow(0 4px 8px rgba(0,0,0,.32));\n            }\n\n            #cg-software-journey-1 .cg-sj__stage-icon-wrap.is-selected {\n                width: 62px;\n                height: 62px;\n                filter: drop-shadow(0 0 10px rgba(240,199,107,.34));\n            }\n\n            #cg-software-journey-1 .cg-sj__stage-icon-wrap.is-selected .cg-sj__stage-icon {\n                width: 62px;\n                height: 62px;\n                opacity: 1;\n                filter:\n                    brightness(1.08)\n                    drop-shadow(0 0 8px rgba(240,199,107,.34));\n            }\n\n            \/* The symbol is in the hand, so it disappears from the scale. *\/\n            #cg-software-journey-1 .cg-sj__stage-icon-wrap.is-in-hand {\n                opacity: 0 !important;\n                visibility: hidden !important;\n                transform: translate(-50%, -50%) scale(.78);\n                transition:\n                    opacity .16s ease,\n                    visibility .16s ease,\n                    transform .16s ease;\n            }\n\n            #cg-software-journey-1 .cg-sj__hand {\n                position: absolute;\n                z-index: 30;\n                top: 42px;\n                left: 0;\n                width: 86px;\n                height: 86px;\n                max-width: none !important;\n                object-fit: contain;\n                transform: translate(-50%, -50%);\n                filter: drop-shadow(0 7px 10px rgba(0,0,0,.42));\n                cursor: grab;\n                user-select: none;\n                -webkit-user-drag: none;\n                touch-action: none;\n                will-change: left, filter;\n                transition: filter .20s ease;\n            }\n\n            #cg-software-journey-1 .cg-sj__hand:active {\n                cursor: grabbing;\n            }\n\n            #cg-software-journey-1 .cg-sj__hand.is-stage {\n                filter:\n                    drop-shadow(0 7px 10px rgba(0,0,0,.42))\n                    drop-shadow(0 0 7px rgba(240,199,107,.22));\n            }\n\n            #cg-software-journey-1 .cg-sj__drag-help {\n                position: absolute;\n                z-index: 12;\n                left: var(--cg-chart-left);\n                right: var(--cg-chart-right);\n                top: 706px;\n                color: rgba(240,199,107,.75);\n                font-size: 13px;\n                font-weight: 800;\n                line-height: 1.25;\n                letter-spacing: 1.55px;\n                text-align: center;\n                text-transform: uppercase;\n                pointer-events: none;\n            }\n\n            @media (max-width: 1100px) {\n                #cg-software-journey-1 {\n                    min-width: 1080px;\n                }\n            }\n\n            @media (prefers-reduced-motion: reduce) {\n                #cg-software-journey-1 *,\n                #cg-software-journey-1 *::before,\n                #cg-software-journey-1 *::after {\n                    animation-duration: .001ms !important;\n                    animation-iteration-count: 1 !important;\n                    transition-duration: .001ms !important;\n                    scroll-behavior: auto !important;\n                }\n            }\n        <\/style>\n\n        <script>\n        (function() {\n            'use strict';\n\n            const root = document.getElementById(\"cg-software-journey-1\");\n            if (!root || root.dataset.cgSjReady === '1') {\n                return;\n            }\n            root.dataset.cgSjReady = '1';\n\n            const dataNode = root.querySelector('.cg-sj__data');\n            let payload = { stages: [], copy: {} };\n\n            try {\n                payload = JSON.parse(dataNode.textContent || '{}');\n            } catch (e) {\n                console.error('[CG Software Journey] Invalid data.', e);\n                return;\n            }\n\n            const stages = Array.isArray(payload.stages) ? payload.stages : [];\n            const copy = payload.copy || {};\n            const fallbackBlindPhrases = [\n                ['I DID IT.', 'YOU CAN DO IT TOO.'],\n                ['IF YOU WANT', 'TO LEARN \u2014', 'ASK. WE\u2019LL START TOGETHER.'],\n                ['WE LEARN TOGETHER \u2014', 'RESPECTFULLY, CALMLY,', 'STEP BY STEP.']\n            ];\n            const blindPhrases = (\n                Array.isArray(copy.blind_phrases) && copy.blind_phrases.length >= 3\n            )\n                ? copy.blind_phrases.map(lines => Array.isArray(lines) ? lines : [])\n                : fallbackBlindPhrases;\n\n            const chart = root.querySelector('.cg-sj__chart');\n            const barsWrap = root.querySelector('.cg-sj__bars');\n            const curveSvg = root.querySelector('.cg-sj__curve-svg');\n            const curvePath = root.querySelector('.cg-sj__curve-path');\n            const curveArrowhead = root.querySelector('.cg-sj__curve-arrowhead');\n            const timeline = root.querySelector('.cg-sj__timeline');\n            const trackSvg = root.querySelector('.cg-sj__track-svg');\n            const trackBase = root.querySelector('.cg-sj__track-base');\n            const trackActive = root.querySelector('.cg-sj__track-active');\n            const minorStops = root.querySelector('.cg-sj__minor-stops');\n            const stageIcons = root.querySelector('.cg-sj__stage-icons');\n            const hand = root.querySelector('.cg-sj__hand');\n\n            const tokenCard = root.querySelector('.cg-sj__token-card');\n            const tokenTitle = root.querySelector('.cg-sj__token-title');\n            const tokenImg = root.querySelector('.cg-sj__token-front');\n            const tokenRotor = root.querySelector('.cg-sj__token-rotor');\n            const tokenDesc = root.querySelector('.cg-sj__token-desc');\n            const tokenSymbol = root.querySelector('.cg-sj__token-symbol');\n            const tokenCta = root.querySelector('.cg-sj__token-cta');\n\n            const emptyHand = root.dataset.emptyHand;\n\n            const heights = [\n                64, 71, 79, 86, 95, 103, 112, 123, 135, 146,\n                159, 171, 184, 197, 211, 224, 237, 251, 264,\n                275, 287, 298, 305, 313, 320\n            ];\n\n            const maxPosition = 25;\n            const stagePositions = new Set(stages.map(stage => Number(stage.position)));\n            const stageByPosition = new Map(stages.map(stage => [Number(stage.position), stage]));\n\n            let currentPosition = 0;\n            let lastRenderedPosition = 0;\n            let lastDirection = 0; \/\/ 1 = right, -1 = left\n            let started = false;\n            let dragging = false;\n            let moving = false;\n            let keyboardArmed = false;\n            let animationFrame = 0;\n            let selectionTimer = 0;\n            let resizeFrame = 0;\n            let selectedPosition = null;\n            let blindCycleTimer = 0;\n            let blindResetTimer = 0;\n            let blindShowingBack = false;\n            let blindPhraseIndex = 0;\n\n            const blindWaveStep = 62;\n            const blindTurnDuration = 760;\n            const blindInitialDelay = 2700;\n            const blindHoldDelay = 3600;\n\n            const bars = [];\n            const bridgeBars = [];\n            const allSlats = [];\n            const iconWraps = new Map();\n\n            function clamp(value, min, max) {\n                return Math.max(min, Math.min(max, value));\n            }\n\n            function easeInOutCubic(t) {\n                return t < 0.5\n                    ? 4 * t * t * t\n                    : 1 - Math.pow(-2 * t + 2, 3) \/ 2;\n            }\n\n            function positionToX(position, width) {\n                return (position \/ maxPosition) * width;\n            }\n\n            function stageForPosition(position) {\n                return stageByPosition.get(Number(position)) || null;\n            }\n\n            function columnColourForPosition(position) {\n                return stagePositions.has(Number(position))\n                    ? 'rgba(72,218,112,1)'\n                    : 'rgba(232,78,78,.98)';\n            }\n\n            function syncBlindCopyPlane(slat, x, chartWidth, chartHeight) {\n                const halfBar = slat.offsetWidth \/ 2;\n\n                slat.querySelectorAll('.cg-sj__slat-copy').forEach(copyPlane => {\n                    copyPlane.style.width = chartWidth + 'px';\n                    copyPlane.style.height = chartHeight + 'px';\n                    copyPlane.style.left = (-x + halfBar) + 'px';\n                });\n            }\n\n            function getBlindPhraseMetrics(lines) {\n                const safeLines = Array.isArray(lines) ? lines.filter(Boolean) : [];\n                const chartWidth = chart.clientWidth || root.clientWidth || 1200;\n                const lineCount = Math.max(1, safeLines.length || 1);\n                const maxChars = safeLines.reduce((maxLen, line) => Math.max(maxLen, String(line || '').length), 0) || 10;\n                const widthRatio = lineCount >= 3 ? 0.58 : 0.64;\n                const estimated = (chartWidth * widthRatio) \/ Math.max(10, maxChars * 0.72);\n                const fontSize = clamp(estimated, lineCount >= 3 ? 28 : 34, lineCount >= 3 ? 50 : 62);\n\n                return {\n                    fontSize: Math.round(fontSize),\n                    lineHeight: lineCount >= 3 ? 0.86 : 0.88,\n                    lineGap: lineCount >= 3 ? '0.08em' : '0.10em',\n                    right: lineCount >= 3 ? '28px' : '22px',\n                    bottom: lineCount >= 3 ? '22px' : '18px'\n                };\n            }\n\n            function applyBlindPhraseMetrics(phrase, lines) {\n                if (!phrase) {\n                    return;\n                }\n\n                const metrics = getBlindPhraseMetrics(lines);\n                phrase.style.fontSize = metrics.fontSize + 'px';\n                phrase.style.lineHeight = String(metrics.lineHeight);\n                phrase.style.right = metrics.right;\n                phrase.style.bottom = metrics.bottom;\n                phrase.style.setProperty('--cg-blind-line-gap', metrics.lineGap);\n            }\n\n            function makeBlindCopy(lines) {\n                const copyPlane = document.createElement('div');\n                copyPlane.className = 'cg-sj__slat-copy';\n\n                const phrase = document.createElement('div');\n                phrase.className = 'cg-sj__blind-phrase';\n\n                (Array.isArray(lines) ? lines : []).forEach(line => {\n                    const span = document.createElement('span');\n                    span.className = 'cg-sj__blind-line';\n                    span.textContent = line || '';\n                    phrase.appendChild(span);\n                });\n\n                applyBlindPhraseMetrics(phrase, lines);\n                copyPlane.appendChild(phrase);\n                return copyPlane;\n            }\n\n            function makeSlatFace(faceClass, lines) {\n                const face = document.createElement('div');\n                face.className = 'cg-sj__slat-face ' + faceClass;\n                face.appendChild(makeBlindCopy(lines));\n                return face;\n            }\n\n            function setBlindFacePhrase(faceClass, lines) {\n                const safeLines = Array.isArray(lines) ? lines : [];\n\n                allSlats.forEach(slat => {\n                    const phrase = slat.querySelector('.' + faceClass + ' .cg-sj__blind-phrase');\n                    if (!phrase) {\n                        return;\n                    }\n\n                    phrase.replaceChildren();\n                    applyBlindPhraseMetrics(phrase, safeLines);\n\n                    safeLines.forEach(line => {\n                        const span = document.createElement('span');\n                        span.className = 'cg-sj__blind-line';\n                        span.textContent = line || '';\n                        phrase.appendChild(span);\n                    });\n                });\n            }\n\n            function primeBlindPhrases() {\n                blindPhraseIndex = 0;\n                setBlindFacePhrase('cg-sj__slat-front', blindPhrases[0] || fallbackBlindPhrases[0]);\n                setBlindFacePhrase('cg-sj__slat-back', blindPhrases[1] || blindPhrases[0] || fallbackBlindPhrases[0]);\n            }\n\n            function createElements() {\n                barsWrap.innerHTML = '';\n                minorStops.innerHTML = '';\n                stageIcons.innerHTML = '';\n                bars.length = 0;\n                bridgeBars.length = 0;\n                allSlats.length = 0;\n                iconWraps.clear();\n\n                heights.forEach((height, index) => {\n                    const position = index + 1;\n                    const bar = document.createElement('div');\n                    const isMain = stagePositions.has(position);\n\n                    bar.className = 'cg-sj__bar ' + (isMain ? 'is-main' : 'is-between');\n\n                    if (position === maxPosition) {\n                        bar.classList.add('is-future');\n                    }\n\n                    bar.dataset.position = String(position);\n                    bar.style.setProperty('--cg-bar-h', height + 'px');\n                    bar.style.setProperty('--cg-blind-delay', ((position - 1) * blindWaveStep) + 'ms');\n\n                    const rotor = document.createElement('div');\n                    rotor.className = 'cg-sj__slat-rotor';\n\n                    rotor.appendChild(\n                        makeSlatFace(\n                            'cg-sj__slat-front',\n                            blindPhrases[0] || fallbackBlindPhrases[0]\n                        )\n                    );\n\n                    rotor.appendChild(\n                        makeSlatFace(\n                            'cg-sj__slat-back',\n                            blindPhrases[1] || blindPhrases[0] || fallbackBlindPhrases[0]\n                        )\n                    );\n\n                    bar.appendChild(rotor);\n                    barsWrap.appendChild(bar);\n                    bars.push(bar);\n                    allSlats.push(bar);\n                });\n\n                \/*\n                 * Add one extra visual slat between every existing pair.\n                 * These do not change slider positions or stage positions:\n                 * they only densify the histogram \/ blind surface.\n                 *\/\n                for (let leftPosition = 1; leftPosition < maxPosition; leftPosition++) {\n                    const rightPosition = leftPosition + 1;\n                    const bridge = document.createElement('div');\n                    const bridgeHeight = (heights[leftPosition - 1] + heights[rightPosition - 1]) \/ 2;\n                    const bridgeProgress = leftPosition + 0.5;\n\n                    bridge.className = 'cg-sj__bar is-bridge';\n                    bridge.dataset.leftPosition = String(leftPosition);\n                    bridge.dataset.rightPosition = String(rightPosition);\n                    bridge.dataset.progress = String(bridgeProgress);\n                    bridge.dataset.fullHeight = String(bridgeHeight);\n                    bridge.style.setProperty('--cg-bar-h', bridgeHeight + 'px');\n                    bridge.style.setProperty('--cg-blind-delay', ((bridgeProgress - 1) * blindWaveStep) + 'ms');\n                    bridge.style.setProperty('--cg-bridge-left', columnColourForPosition(leftPosition));\n                    bridge.style.setProperty('--cg-bridge-right', columnColourForPosition(rightPosition));\n\n                    const rotor = document.createElement('div');\n                    rotor.className = 'cg-sj__slat-rotor';\n\n                    rotor.appendChild(\n                        makeSlatFace(\n                            'cg-sj__slat-front',\n                            blindPhrases[0] || fallbackBlindPhrases[0]\n                        )\n                    );\n\n                    rotor.appendChild(\n                        makeSlatFace(\n                            'cg-sj__slat-back',\n                            blindPhrases[1] || blindPhrases[0] || fallbackBlindPhrases[0]\n                        )\n                    );\n\n                    bridge.appendChild(rotor);\n                    barsWrap.appendChild(bridge);\n                    bridgeBars.push(bridge);\n                    allSlats.push(bridge);\n                }\n\n                for (let position = 0; position <= maxPosition; position++) {\n                    if (position === 0 || !stagePositions.has(position)) {\n                        const dot = document.createElement('span');\n                        dot.className = 'cg-sj__minor-stop' + (position === 0 ? ' is-zero' : '');\n                        dot.dataset.position = String(position);\n                        minorStops.appendChild(dot);\n                    }\n                }\n\n                stages.forEach(stage => {\n                    const wrap = document.createElement('div');\n                    wrap.className = 'cg-sj__stage-icon-wrap';\n                    wrap.dataset.position = String(stage.position);\n\n                    const img = document.createElement('img');\n                    img.className = 'cg-sj__stage-icon';\n                    img.src = stage.icon;\n                    img.alt = '';\n                    img.draggable = false;\n\n                    wrap.appendChild(img);\n                    stageIcons.appendChild(wrap);\n                    iconWraps.set(Number(stage.position), wrap);\n                });\n            }\n\n            function layoutStaticElements() {\n                const width = timeline.clientWidth;\n\n                if (!width) {\n                    return;\n                }\n\n                minorStops.querySelectorAll('.cg-sj__minor-stop').forEach(dot => {\n                    const position = Number(dot.dataset.position);\n                    dot.style.left = positionToX(position, width) + 'px';\n                });\n\n                iconWraps.forEach((wrap, position) => {\n                    wrap.style.left = positionToX(position, width) + 'px';\n                });\n\n                const chartWidth = chart.clientWidth;\n                const chartHeight = chart.clientHeight;\n\n                bars.forEach((bar, index) => {\n                    const position = index + 1;\n                    const x = positionToX(position, width);\n                    bar.style.left = x + 'px';\n                    syncBlindCopyPlane(bar, x, chartWidth, chartHeight);\n                });\n\n                root.querySelectorAll('.cg-sj__blind-phrase').forEach(phrase => {\n                    const lines = Array.from(phrase.querySelectorAll('.cg-sj__blind-line')).map(node => node.textContent || '');\n                    applyBlindPhraseMetrics(phrase, lines);\n                });\n\n                bridgeBars.forEach(bridge => {\n                    const leftPosition = Number(bridge.dataset.leftPosition);\n                    const rightPosition = Number(bridge.dataset.rightPosition);\n                    const leftBar = bars[leftPosition - 1];\n                    const rightBar = bars[rightPosition - 1];\n\n                    if (!leftBar || !rightBar) {\n                        return;\n                    }\n\n                    const leftX = positionToX(leftPosition, width);\n                    const rightX = positionToX(rightPosition, width);\n                    const leftEdge = leftX + (leftBar.offsetWidth \/ 2);\n                    const rightEdge = rightX - (rightBar.offsetWidth \/ 2);\n                    const physicalGap = Math.max(0, rightEdge - leftEdge);\n\n                    \/* Exactly 2px on each side of the new bridge slat. *\/\n                    const bridgeWidth = Math.max(2, physicalGap - 4);\n                    const bridgeX = leftEdge + 2 + (bridgeWidth \/ 2);\n\n                    bridge.style.width = bridgeWidth.toFixed(2) + 'px';\n                    bridge.style.left = bridgeX.toFixed(2) + 'px';\n                    syncBlindCopyPlane(bridge, bridgeX, chartWidth, chartHeight);\n                });\n\n                buildTrackPaths();\n                updateHand();\n                updateCurve();\n            }\n\n            function getTrackSegments() {\n                const width = timeline.clientWidth;\n                if (!width) {\n                    return [];\n                }\n\n                const gapHalf = 40;\n                const segments = [];\n                let cursor = 0;\n\n                stages.forEach(stage => {\n                    const x = positionToX(Number(stage.position), width);\n                    const left = clamp(x - gapHalf, 0, width);\n                    const right = clamp(x + gapHalf, 0, width);\n\n                    if (left > cursor) {\n                        segments.push([cursor, left]);\n                    }\n\n                    cursor = Math.max(cursor, right);\n                });\n\n                if (cursor < width) {\n                    segments.push([cursor, width]);\n                }\n\n                return segments;\n            }\n\n            function segmentsToPath(segments, maxX) {\n                const y = 1;\n                let d = '';\n\n                segments.forEach(segment => {\n                    const start = segment[0];\n                    const end = segment[1];\n                    const clippedEnd = Math.min(end, maxX);\n\n                    if (clippedEnd > start) {\n                        d += 'M ' + start.toFixed(2) + ' ' + y + ' L ' + clippedEnd.toFixed(2) + ' ' + y + ' ';\n                    }\n                });\n\n                return d.trim();\n            }\n\n            function buildTrackPaths() {\n                const width = timeline.clientWidth;\n                if (!width) {\n                    return;\n                }\n\n                trackSvg.setAttribute('viewBox', '0 0 ' + width + ' 2');\n\n                const segments = getTrackSegments();\n                trackBase.setAttribute('d', segmentsToPath(segments, width));\n\n                const currentX = positionToX(currentPosition, width);\n                trackActive.setAttribute('d', segmentsToPath(segments, currentX));\n            }\n\n            function renderBars() {\n                bars.forEach((bar, index) => {\n                    const position = index + 1;\n                    const fullHeight = heights[index];\n                    const fraction = clamp(currentPosition - (position - 1), 0, 1);\n                    const visibleHeight = fullHeight * fraction;\n\n                    if (!bar.classList.contains('is-pulsing')) {\n                        bar.style.height = visibleHeight.toFixed(2) + 'px';\n                    }\n\n                    bar.style.opacity = fraction > 0.005 ? '1' : '0';\n                });\n\n                bridgeBars.forEach(bridge => {\n                    const leftPosition = Number(bridge.dataset.leftPosition);\n                    const fullHeight = Number(bridge.dataset.fullHeight) || 0;\n\n                    \/*\n                     * The new slat grows in the first half of the interval\n                     * between its two existing neighbours. Existing mechanics\n                     * and the 0..25 slider scale remain unchanged.\n                     *\/\n                    const fraction = clamp((currentPosition - leftPosition) * 2, 0, 1);\n                    const visibleHeight = fullHeight * fraction;\n\n                    bridge.style.height = visibleHeight.toFixed(2) + 'px';\n                    bridge.style.opacity = fraction > 0.005 ? '1' : '0';\n                });\n            }\n\n            function getCurvePoints() {\n                const width = chart.clientWidth;\n                const height = chart.clientHeight;\n\n                if (!width || !height || currentPosition <= 0.001) {\n                    return [];\n                }\n\n                const gap = 28;\n                const points = [];\n\n                \/\/ The curve starts just above the baseline at position 0.\n                points.push({\n                    x: 0,\n                    y: height - gap\n                });\n\n                const fullBars = Math.floor(currentPosition);\n\n                for (let position = 1; position <= fullBars; position++) {\n                    const barHeight = heights[position - 1];\n\n                    points.push({\n                        x: positionToX(position, width),\n                        y: clamp(height - barHeight - gap, 6, height - gap)\n                    });\n                }\n\n                const fraction = currentPosition - fullBars;\n\n                if (fraction > 0.001 && fullBars < maxPosition) {\n                    const nextPosition = fullBars + 1;\n                    const partialHeight = heights[nextPosition - 1] * fraction;\n\n                    points.push({\n                        x: positionToX(currentPosition, width),\n                        y: clamp(height - partialHeight - gap, 6, height - gap)\n                    });\n                }\n\n                return points;\n            }\n\n            function smoothPath(points) {\n                if (!points.length) {\n                    return '';\n                }\n\n                if (points.length === 1) {\n                    return 'M ' + points[0].x + ' ' + points[0].y;\n                }\n\n                let d = 'M ' + points[0].x.toFixed(2) + ' ' + points[0].y.toFixed(2);\n\n                for (let i = 0; i < points.length - 1; i++) {\n                    const p1 = points[i];\n                    const p2 = points[i + 1];\n                    const midX = (p1.x + p2.x) \/ 2;\n\n                    d +=\n                        ' C ' +\n                        midX.toFixed(2) + ' ' + p1.y.toFixed(2) + ', ' +\n                        midX.toFixed(2) + ' ' + p2.y.toFixed(2) + ', ' +\n                        p2.x.toFixed(2) + ' ' + p2.y.toFixed(2);\n                }\n\n                return d;\n            }\n\n            function updateCurve() {\n                const width = chart.clientWidth;\n                const height = chart.clientHeight;\n\n                if (!width || !height) {\n                    return;\n                }\n\n                curveSvg.setAttribute('viewBox', '0 0 ' + width + ' ' + height);\n\n                const points = getCurvePoints();\n                const d = smoothPath(points);\n\n                curvePath.setAttribute('d', d);\n\n                \/*\n                 * Draw our own arrowhead instead of SVG marker-end.\n                 * This guarantees that the pointer is visible already at\n                 * the very first stage (position 1).\n                 *\/\n                const showArrow =\n                    currentPosition > 0.02 &&\n                    lastDirection > 0 &&\n                    points.length >= 2;\n\n                if (showArrow) {\n                    const end = points[points.length - 1];\n                    const prev = points[points.length - 2];\n\n                    const angle =\n                        Math.atan2(end.y - prev.y, end.x - prev.x) *\n                        180 \/\n                        Math.PI;\n\n                    curveArrowhead.setAttribute(\n                        'transform',\n                        'translate(' +\n                            end.x.toFixed(2) +\n                            ' ' +\n                            end.y.toFixed(2) +\n                        ') rotate(' +\n                            angle.toFixed(2) +\n                        ')'\n                    );\n\n                    curveArrowhead.setAttribute('opacity', '1');\n                } else {\n                    curveArrowhead.setAttribute('opacity', '0');\n                }\n            }\n\n            function updateHand() {\n                const width = timeline.clientWidth;\n                if (!width) {\n                    return;\n                }\n\n                hand.style.left = positionToX(currentPosition, width) + 'px';\n            }\n\n            function cancelBlindCycle() {\n                if (blindCycleTimer) {\n                    window.clearTimeout(blindCycleTimer);\n                    blindCycleTimer = 0;\n                }\n            }\n\n            function clearBlindResetTimer() {\n                if (blindResetTimer) {\n                    window.clearTimeout(blindResetTimer);\n                    blindResetTimer = 0;\n                }\n            }\n\n            function isFinalIdle() {\n                return (\n                    Math.abs(currentPosition - maxPosition) < 0.001 &&\n                    !dragging &&\n                    !moving\n                );\n            }\n\n            function setBlindSide(showBack) {\n                blindShowingBack = !!showBack;\n                allSlats.forEach(bar => {\n                    bar.classList.toggle('is-flipped', blindShowingBack);\n                });\n            }\n\n            function flipToNextBlindPhrase() {\n                const nextPhraseIndex = (blindPhraseIndex + 1) % blindPhrases.length;\n                const targetFaceClass = blindShowingBack\n                    ? 'cg-sj__slat-front'\n                    : 'cg-sj__slat-back';\n\n                setBlindFacePhrase(\n                    targetFaceClass,\n                    blindPhrases[nextPhraseIndex] || fallbackBlindPhrases[nextPhraseIndex] || fallbackBlindPhrases[0]\n                );\n\n                blindPhraseIndex = nextPhraseIndex;\n                setBlindSide(!blindShowingBack);\n            }\n\n            function armPhraseBuild() {\n                clearBlindResetTimer();\n                root.classList.remove('is-blind-resetting');\n                root.classList.add('is-phrase-building');\n            }\n\n            function resetBlindFinal() {\n                cancelBlindCycle();\n                clearBlindResetTimer();\n                blindShowingBack = false;\n                primeBlindPhrases();\n\n                root.classList.remove('is-phrase-building');\n                root.classList.remove('is-blind-active');\n                root.classList.add('is-blind-resetting');\n\n                allSlats.forEach(bar => {\n                    bar.classList.remove('is-flipped');\n                });\n\n                blindResetTimer = window.setTimeout(() => {\n                    blindResetTimer = 0;\n                    root.classList.remove('is-blind-resetting');\n                }, 340);\n            }\n\n            function queueBlindFlip(delay) {\n                cancelBlindCycle();\n\n                blindCycleTimer = window.setTimeout(() => {\n                    blindCycleTimer = 0;\n\n                    if (!isFinalIdle()) {\n                        return;\n                    }\n\n                    root.classList.add('is-blind-active');\n                    armPhraseBuild();\n                    flipToNextBlindPhrase();\n\n                    const waveTime = blindTurnDuration + ((maxPosition - 1) * blindWaveStep);\n                    queueBlindFlip(waveTime + blindHoldDelay);\n                }, delay);\n            }\n\n            function startBlindFinal() {\n                if (!isFinalIdle()) {\n                    return;\n                }\n\n                cancelBlindCycle();\n                clearBlindResetTimer();\n                root.classList.remove('is-blind-resetting');\n                root.classList.add('is-phrase-building');\n                root.classList.add('is-blind-active');\n\n                primeBlindPhrases();\n                setBlindSide(false);\n                queueBlindFlip(blindInitialDelay);\n            }\n\n            function render() {\n                renderBars();\n                updateHand();\n                buildTrackPaths();\n                updateCurve();\n            }\n\n            function setPosition(value, directionHint) {\n                const next = clamp(value, 0, maxPosition);\n                let resolvedDirection = 0;\n\n                if (typeof directionHint === 'number' && directionHint !== 0) {\n                    resolvedDirection = directionHint > 0 ? 1 : -1;\n                    lastDirection = resolvedDirection;\n                } else if (Math.abs(next - lastRenderedPosition) > 0.0001) {\n                    resolvedDirection = next > lastRenderedPosition ? 1 : -1;\n                    lastDirection = resolvedDirection;\n                }\n\n                if (resolvedDirection < 0 && next < lastRenderedPosition - 0.0001) {\n                    resetBlindFinal();\n                } else if (resolvedDirection > 0 && next > 0.001) {\n                    armPhraseBuild();\n                    if (next < maxPosition - 0.001) {\n                        cancelBlindCycle();\n                        root.classList.remove('is-blind-active');\n                        setBlindSide(false);\n                    }\n                }\n\n                currentPosition = next;\n\n                if (currentPosition > 0.001 && !started) {\n                    started = true;\n                    root.classList.add('is-started');\n                }\n\n                render();\n                lastRenderedPosition = currentPosition;\n            }\n\n            function clearSelection(immediate) {\n                window.clearTimeout(selectionTimer);\n                selectionTimer = 0;\n                selectedPosition = null;\n\n                hand.src = emptyHand;\n                hand.classList.remove('is-stage');\n\n                iconWraps.forEach(wrap => {\n                    wrap.classList.remove('is-selected');\n                    wrap.classList.remove('is-in-hand');\n                });\n\n                tokenSymbol.src = '';\n\n                if (tokenRotor) {\n                    tokenRotor.classList.remove('is-intro-flip');\n                }\n\n                allSlats.forEach(bar => {\n                    bar.classList.remove('is-pulsing');\n                });\n\n                tokenCard.classList.remove('is-visible');\n                tokenCard.setAttribute('aria-hidden', 'true');\n                tokenCard.setAttribute('tabindex', '-1');\n\n                if (immediate) {\n                    tokenCard.style.transitionDuration = '.001ms';\n                    requestAnimationFrame(() => {\n                        tokenCard.style.transitionDuration = '';\n                    });\n                }\n            }\n\n            function showStage(stage) {\n                if (!stage || dragging || moving) {\n                    return;\n                }\n\n                const stagePosition = Number(stage.position);\n\n                selectedPosition = stagePosition;\n\n                hand.src = stage.hand || emptyHand;\n                hand.classList.add('is-stage');\n\n                const iconWrap = iconWraps.get(stagePosition);\n                if (iconWrap) {\n                    iconWrap.classList.add('is-selected');\n                    iconWrap.classList.add('is-in-hand');\n                }\n\n                const bar = bars[stagePosition - 1];\n                if (bar) {\n                    bar.style.setProperty('--cg-bar-h', heights[stagePosition - 1] + 'px');\n                    bar.style.height = heights[stagePosition - 1] + 'px';\n                    bar.classList.add('is-pulsing');\n                }\n\n                tokenTitle.textContent = stage.title || '';\n                tokenImg.src = stage.token || '';\n                tokenImg.alt = '';\n                tokenDesc.textContent = stage.desc || '';\n                tokenSymbol.src = stage.icon || '';\n                tokenSymbol.alt = '';\n\n                if (tokenRotor) {\n                    tokenRotor.classList.remove('is-intro-flip');\n                    void tokenRotor.offsetWidth;\n                    tokenRotor.classList.add('is-intro-flip');\n\n                    window.setTimeout(function() {\n                        tokenRotor.classList.remove('is-intro-flip');\n                    }, 2450);\n                }\n\n                const hasUrl = typeof stage.url === 'string' && stage.url.trim() !== '';\n\n                if (hasUrl) {\n                    tokenCard.href = stage.url;\n                    tokenCard.classList.remove('is-pending');\n                    tokenCta.textContent = copy.open || '';\n                } else {\n                    tokenCard.href = '#';\n                    tokenCard.classList.add('is-pending');\n                    tokenCta.textContent = copy.pending || '';\n                }\n\n                tokenCard.classList.add('is-visible');\n                tokenCard.setAttribute('aria-hidden', 'false');\n                tokenCard.setAttribute('tabindex', '0');\n            }\n\n            function scheduleStageSelection() {\n                window.clearTimeout(selectionTimer);\n\n                const rounded = Math.round(currentPosition);\n                const isExact = Math.abs(currentPosition - rounded) < 0.001;\n                const stage = isExact ? stageForPosition(rounded) : null;\n\n                if (!stage) {\n                    return;\n                }\n\n                selectionTimer = window.setTimeout(() => {\n                    if (\n                        !dragging &&\n                        !moving &&\n                        Math.abs(currentPosition - rounded) < 0.001\n                    ) {\n                        showStage(stage);\n                    }\n                }, 250);\n            }\n\n            function resetToZeroVisuals() {\n                if (Math.abs(currentPosition) < 0.001) {\n                    started = false;\n                    root.classList.remove('is-started');\n                    clearSelection(false);\n                    resetBlindFinal();\n                }\n            }\n\n            function settleAt(position) {\n                const target = clamp(Math.round(position), 0, maxPosition);\n\n                setPosition(target, lastDirection);\n                moving = false;\n\n                if (target === 0) {\n                    resetToZeroVisuals();\n                    return;\n                }\n\n                scheduleStageSelection();\n\n                if (target === maxPosition) {\n                    startBlindFinal();\n                }\n            }\n\n            function cancelAnimation() {\n                if (animationFrame) {\n                    cancelAnimationFrame(animationFrame);\n                    animationFrame = 0;\n                }\n                moving = false;\n            }\n\n            function animateTo(target, millisecondsPerStep) {\n                cancelAnimation();\n                clearSelection(false);\n\n                const start = currentPosition;\n                const distance = target - start;\n\n                if (Math.abs(distance) < 0.001) {\n                    settleAt(target);\n                    return;\n                }\n\n                lastDirection = distance > 0 ? 1 : -1;\n\n                if (distance < 0) {\n                    resetBlindFinal();\n                } else if (distance > 0) {\n                    armPhraseBuild();\n                }\n\n                moving = true;\n\n                const duration = Math.max(\n                    220,\n                    Math.abs(distance) * (millisecondsPerStep || 330)\n                );\n\n                const startTime = performance.now();\n\n                function frame(now) {\n                    const elapsed = now - startTime;\n                    const t = clamp(elapsed \/ duration, 0, 1);\n                    const eased = easeInOutCubic(t);\n\n                    setPosition(start + distance * eased, lastDirection);\n\n                    if (t < 1) {\n                        animationFrame = requestAnimationFrame(frame);\n                    } else {\n                        animationFrame = 0;\n                        settleAt(target);\n                    }\n                }\n\n                animationFrame = requestAnimationFrame(frame);\n            }\n\n            function positionFromClientX(clientX) {\n                const rect = timeline.getBoundingClientRect();\n                if (!rect.width) {\n                    return 0;\n                }\n\n                const localX = clamp(clientX - rect.left, 0, rect.width);\n                return (localX \/ rect.width) * maxPosition;\n            }\n\n            function armKeyboard() {\n                keyboardArmed = true;\n                root.focus({ preventScroll: true });\n            }\n\n            hand.addEventListener('pointerdown', function(event) {\n                if (event.button !== 0 && event.pointerType === 'mouse') {\n                    return;\n                }\n\n                event.preventDefault();\n                cancelAnimation();\n                clearSelection(false);\n                armKeyboard();\n\n                dragging = true;\n                hand.setPointerCapture(event.pointerId);\n\n                const startPointerX = event.clientX;\n                const startPosition = currentPosition;\n                const rect = timeline.getBoundingClientRect();\n\n                function move(moveEvent) {\n                    if (!dragging || !rect.width) {\n                        return;\n                    }\n\n                    const deltaPixels = moveEvent.clientX - startPointerX;\n                    const deltaPosition = (deltaPixels \/ rect.width) * maxPosition;\n                    const next = clamp(startPosition + deltaPosition, 0, maxPosition);\n\n                    setPosition(next, next >= currentPosition ? 1 : -1);\n                }\n\n                function end(endEvent) {\n                    if (!dragging) {\n                        return;\n                    }\n\n                    dragging = false;\n\n                    try {\n                        hand.releasePointerCapture(endEvent.pointerId);\n                    } catch (e) {}\n\n                    hand.removeEventListener('pointermove', move);\n                    hand.removeEventListener('pointerup', end);\n                    hand.removeEventListener('pointercancel', end);\n\n                    const target = Math.round(currentPosition);\n                    animateTo(target, 250);\n                }\n\n                hand.addEventListener('pointermove', move);\n                hand.addEventListener('pointerup', end);\n                hand.addEventListener('pointercancel', end);\n            });\n\n            timeline.addEventListener('pointerdown', function(event) {\n                if (event.target === hand) {\n                    return;\n                }\n\n                if (event.button !== 0 && event.pointerType === 'mouse') {\n                    return;\n                }\n\n                event.preventDefault();\n                armKeyboard();\n\n                const rawPosition = positionFromClientX(event.clientX);\n                const target = clamp(Math.round(rawPosition), 0, maxPosition);\n\n                animateTo(target, 330);\n            });\n\n            root.addEventListener('keydown', function(event) {\n                if (!keyboardArmed) {\n                    return;\n                }\n\n                if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') {\n                    return;\n                }\n\n                event.preventDefault();\n\n                const base = Math.round(currentPosition);\n                const delta = event.key === 'ArrowRight' ? 1 : -1;\n                const target = clamp(base + delta, 0, maxPosition);\n\n                if (target !== base) {\n                    animateTo(target, 340);\n                }\n            });\n\n            root.addEventListener('blur', function() {\n                keyboardArmed = false;\n            });\n\n            tokenCard.addEventListener('click', function(event) {\n                const isPending = tokenCard.classList.contains('is-pending');\n\n                if (isPending || !tokenCard.getAttribute('href') || tokenCard.getAttribute('href') === '#') {\n                    event.preventDefault();\n                }\n            });\n\n            function removeElementorSeams() {\n                document.body.classList.add('cg-sj-seamless');\n\n                const widget = root.closest('.elementor-widget-shortcode');\n                const widgetContainer = widget\n                    ? widget.querySelector(':scope > .elementor-widget-container')\n                    : null;\n                const parentContainer = root.closest('.e-con');\n\n                if (widget) {\n                    widget.style.setProperty('margin', '0', 'important');\n                    widget.style.setProperty('padding', '0', 'important');\n                    widget.style.setProperty('width', '100%', 'important');\n                    widget.style.setProperty('max-width', 'none', 'important');\n                }\n\n                if (widgetContainer) {\n                    widgetContainer.style.setProperty('margin', '0', 'important');\n                    widgetContainer.style.setProperty('padding', '0', 'important');\n                    widgetContainer.style.setProperty('width', '100%', 'important');\n                    widgetContainer.style.setProperty('max-width', 'none', 'important');\n                }\n\n                if (parentContainer) {\n                    parentContainer.style.setProperty('--gap', '0px', 'important');\n                    parentContainer.style.setProperty('gap', '0', 'important');\n                    parentContainer.style.setProperty('margin-top', '0', 'important');\n                    parentContainer.style.setProperty('margin-bottom', '0', 'important');\n                    parentContainer.style.setProperty('padding-top', '0', 'important');\n                    parentContainer.style.setProperty('padding-bottom', '0', 'important');\n                    parentContainer.style.setProperty('background-color', '#0D0E0C', 'important');\n                }\n\n                document.documentElement.style.overflowX = 'hidden';\n                document.body.style.overflowX = 'hidden';\n            }\n\n            function syncGlobalDockWithJourney() {\n                function getGlobalDocks() {\n                    return Array.from(\n                        document.querySelectorAll(\n                            '#cg-global-dock, .cg-site-dock'\n                        )\n                    );\n                }\n\n                function applyDockState(hidden) {\n                    document.body.classList.toggle(\n                        'cg-sj-hide-global-dock',\n                        hidden\n                    );\n\n                    getGlobalDocks().forEach(function(dock) {\n                        dock.classList.toggle(\n                            'cg-dock-force-hidden',\n                            hidden\n                        );\n                    });\n                }\n\n                function updateDockVisibility() {\n                    const rect = root.getBoundingClientRect();\n                    const viewportHeight =\n                        window.innerHeight ||\n                        document.documentElement.clientHeight ||\n                        0;\n\n                    const visibleHeight =\n                        Math.min(rect.bottom, viewportHeight) -\n                        Math.max(rect.top, 0);\n\n                    \/*\n                     * Do not hide the Dock while only a small strip of the\n                     * Software Journey is visible under the hero.\n                     * Hide it only after the visitor has actually entered\n                     * the Journey block.\n                     *\/\n                    const isJourneyVisible =\n                        visibleHeight > 260 &&\n                        rect.top < viewportHeight - 220 &&\n                        rect.bottom > 160;\n\n                    applyDockState(isJourneyVisible);\n                }\n\n                \/*\n                 * Run immediately. The body class hides the dock even when the\n                 * dock itself is inserted into the page a little later.\n                 *\/\n                updateDockVisibility();\n\n                window.addEventListener(\n                    'scroll',\n                    updateDockVisibility,\n                    { passive: true }\n                );\n\n                window.addEventListener(\n                    'resize',\n                    updateDockVisibility\n                );\n\n                \/*\n                 * The global Dock snippet can append its markup after the\n                 * Software Journey shortcode has initialized. Watch the page\n                 * and re-apply the state when such markup appears.\n                 *\/\n                const dockObserver = new MutationObserver(function() {\n                    updateDockVisibility();\n                });\n\n                dockObserver.observe(\n                    document.body,\n                    {\n                        childList: true,\n                        subtree: true\n                    }\n                );\n            }\n\n            window.addEventListener('resize', function() {\n                cancelAnimation();\n\n                if (resizeFrame) {\n                    cancelAnimationFrame(resizeFrame);\n                }\n\n                resizeFrame = requestAnimationFrame(function() {\n                    resizeFrame = 0;\n                    layoutStaticElements();\n                });\n            });\n\n            removeElementorSeams();\n            syncGlobalDockWithJourney();\n\n            createElements();\n            layoutStaticElements();\n            setPosition(0, 0);\n            clearSelection(true);\n            root.classList.remove('is-phrase-building', 'is-blind-active', 'is-blind-resetting');\n            primeBlindPhrases();\n            setBlindSide(false);\n        })();\n        <\/script>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a1e4dfc e-flex e-con-boxed e-con e-parent\" data-id=\"a1e4dfc\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-895d7ce elementor-widget elementor-widget-heading\" data-id=\"895d7ce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">A PERSONAL STORY<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-daddb19 elementor-widget elementor-widget-heading\" data-id=\"daddb19\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">WHERE IT ALL <span style=\"color:#F0C76B\">BEGAN<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0f88bb7 e-con-full e-flex e-con e-child\" data-id=\"0f88bb7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-5c9891e e-con-full e-flex e-con e-child\" data-id=\"5c9891e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-70c94f5 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"70c94f5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_Soft_spich_cover-1024x768.png\" class=\"attachment-large size-large wp-image-3547\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_Soft_spich_cover-1024x768.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_Soft_spich_cover-300x225.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_Soft_spich_cover-768x576.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_Soft_spich_cover-16x12.png 16w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_Soft_spich_cover.png 1448w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5be3f7f e-con-full e-flex e-con e-child\" data-id=\"5be3f7f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf42f0d elementor-widget elementor-widget-text-editor\" data-id=\"cf42f0d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>I did not come to programming from zero.<\/p><p>By education, I am a programmer and mathematician. I worked with algorithms, software systems and information technologies many years ago, and that background never completely disappeared.<\/p><p>When I returned to programming after 60, those old skills turned out to be extremely valuable.<\/p><p>I still knew how to think algorithmically. I knew how to formulate a problem, break it into smaller tasks, look for logical dependencies and understand what a program was supposed to do.<\/p><p>But I also understood something else very clearly.<\/p><p>Technology had moved forward enormously.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0ef7818 e-con-full e-flex e-con e-child\" data-id=\"0ef7818\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-42c90f6 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"42c90f6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Let us build an accessible digital future together \u2014 regardless of age. The future is open to all generations. <\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4d2b041 e-con-full e-flex e-con e-child\" data-id=\"4d2b041\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-e133516 e-con-full e-flex e-con e-child\" data-id=\"e133516\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4574120 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"4574120\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1264\" height=\"843\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_2-e1789789521305.png\" class=\"attachment-1536x1536 size-1536x1536 wp-image-3802\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_2-e1789789521305.png 1264w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_2-e1789789521305-300x200.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_2-e1789789521305-1024x683.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_2-e1789789521305-768x512.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_2-e1789789521305-18x12.png 18w\" sizes=\"(max-width: 1264px) 100vw, 1264px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-881d53f e-con-full e-flex e-con e-child\" data-id=\"881d53f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8438920 elementor-widget elementor-widget-image\" data-id=\"8438920\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1264\" height=\"843\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_4-e1789789505705.png\" class=\"attachment-1536x1536 size-1536x1536 wp-image-3804\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_4-e1789789505705.png 1264w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_4-e1789789505705-300x200.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_4-e1789789505705-1024x683.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_4-e1789789505705-768x512.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_4-e1789789505705-18x12.png 18w\" sizes=\"(max-width: 1264px) 100vw, 1264px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2add57d e-con-full e-flex e-con e-child\" data-id=\"2add57d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-98e9fc9 e-con-full e-flex e-con e-child\" data-id=\"98e9fc9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ae76be8 elementor-widget elementor-widget-image\" data-id=\"ae76be8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_0-e1789789486286.png\" class=\"attachment-large size-large wp-image-3809\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_0-e1789789486286.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_0-e1789789486286-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_0-e1789789486286-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_0-e1789789486286-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_0-e1789789486286-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c7173bb elementor-widget elementor-widget-image\" data-id=\"c7173bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1-e1789789382591.png\" class=\"attachment-large size-large wp-image-3811\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1-e1789789382591.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1-e1789789382591-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1-e1789789382591-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1-e1789789382591-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1-e1789789382591-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ef42fca elementor-widget elementor-widget-image\" data-id=\"ef42fca\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_3-e1789789439575.png\" class=\"attachment-large size-large wp-image-3812\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_3-e1789789439575.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_3-e1789789439575-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_3-e1789789439575-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_3-e1789789439575-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_3-e1789789439575-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-70e0b8f elementor-widget elementor-widget-image\" data-id=\"70e0b8f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_4_0-e1789789357493.png\" class=\"attachment-large size-large wp-image-3816\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_4_0-e1789789357493.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_4_0-e1789789357493-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_4_0-e1789789357493-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_4_0-e1789789357493-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_4_0-e1789789357493-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ac8f6f4 e-con-full e-flex e-con e-child\" data-id=\"ac8f6f4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-88480b6 e-con-full e-flex e-con e-child\" data-id=\"88480b6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-27610b7 e-flex e-con-boxed e-con e-child\" data-id=\"27610b7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-9fcef07 e-con-full e-flex e-con e-child\" data-id=\"9fcef07\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-72ca8ac elementor-widget elementor-widget-text-editor\" data-id=\"72ca8ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Programming languages had changed. Development tools had changed. <br \/>Entire fields had appeared that simply did not exist when I was studying and working with software years ago.<\/p><p>Of course, I could have started learning everything again on my own.<\/p><p>But I also understood that the projects I wanted to build would require years of study and development.<\/p><p>And I do not have years to waste.<\/p><p>That realization led me to artificial intelligence.<\/p><p>At first, AI was another technology I needed to understand. Very quickly, however, it became something much more important \u2014 my assistant and, in a very real sense, the first member of my development team.<\/p><p>I bring the idea, the experience, the problem, the logic and the understanding of what the result should be.<\/p><p>AI helps me explore technologies faster, write and analyze code, test different approaches, find mistakes and turn an idea into a working implementation much faster than I could alone.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8d138a5 e-con-full e-flex e-con e-child\" data-id=\"8d138a5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e4d11ee elementor-widget elementor-widget-image\" data-id=\"e4d11ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_5_0.png\" class=\"attachment-large size-large wp-image-3864\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_5_0.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_5_0-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_5_0-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_5_0-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_5_0-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-981b355 e-con-full e-flex e-con e-child\" data-id=\"981b355\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-762b849 e-con-full e-flex e-con e-child\" data-id=\"762b849\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-614d2a2 elementor-widget elementor-widget-image\" data-id=\"614d2a2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1_1-e1789789469939.png\" class=\"attachment-large size-large wp-image-3810\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1_1-e1789789469939.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1_1-e1789789469939-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1_1-e1789789469939-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1_1-e1789789469939-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_1_1_1-e1789789469939-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5cac266 elementor-widget elementor-widget-image\" data-id=\"5cac266\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_1-e1789789323816.png\" class=\"attachment-large size-large wp-image-3814\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_1-e1789789323816.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_1-e1789789323816-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_1-e1789789323816-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_1-e1789789323816-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_1-e1789789323816-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3096ec8 elementor-widget elementor-widget-image\" data-id=\"3096ec8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_3-e1789789403635.png\" class=\"attachment-large size-large wp-image-3815\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_3-e1789789403635.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_3-e1789789403635-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_3-e1789789403635-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_3-e1789789403635-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_3-e1789789403635-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e95ffd elementor-widget elementor-widget-image\" data-id=\"7e95ffd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_0-e1789789423679.png\" class=\"attachment-large size-large wp-image-3813\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_0-e1789789423679.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_0-e1789789423679-300x300.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_0-e1789789423679-150x150.png 150w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_0-e1789789423679-768x768.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_AI_2_0-e1789789423679-12x12.png 12w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f73badb e-con-full e-flex e-con e-child\" data-id=\"f73badb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a048b58 elementor-widget elementor-widget-text-editor\" data-id=\"a048b58\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u00a0<\/p><p>\u00a0AI is not a substitute for knowledge.<\/p><p>It is a knowledge multiplier.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b9f686a e-con-full e-flex e-con e-child\" data-id=\"b9f686a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c600bae elementor-widget elementor-widget-text-editor\" data-id=\"c600bae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>And that changed everything.<\/p><p>What we have been able to build together in roughly one year would have taken me many years to create alone \u2014 or would have required a professional development team and a substantial budget.<\/p><p>Instead, one idea began to lead to another.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3109346 e-con-full e-flex e-con e-child\" data-id=\"3109346\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1bafecb elementor-widget elementor-widget-image\" data-id=\"1bafecb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1584\" height=\"672\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CGfnner_software.png\" class=\"attachment-2048x2048 size-2048x2048 wp-image-3868\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CGfnner_software.png 1584w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CGfnner_software-300x127.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CGfnner_software-1024x434.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CGfnner_software-768x326.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CGfnner_software-1536x652.png 1536w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CGfnner_software-18x8.png 18w\" sizes=\"(max-width: 1584px) 100vw, 1584px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c9f620a elementor-widget elementor-widget-text-editor\" data-id=\"c9f620a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A learning program became an arcade project.<\/p><p>The arcade led to mazes.<\/p><p>Mazes led to simulation and 3D modelling.<\/p><p>3D led to robotics.<\/p><p>Robotics led to navigation algorithms and engineering experiments.<\/p><p>And new software created a need for protection and licensing tools.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e8d99f elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"3e8d99f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>That is how Crypto-Grandpa\u2122 began to grow \u2014 not from a business plan, but from curiosity, experience, real problems and the determination to keep learning.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b1a382c e-con-full e-flex e-con e-child\" data-id=\"b1a382c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b39232c elementor-widget elementor-widget-image\" data-id=\"b39232c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1376\" height=\"768\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_1.png\" class=\"attachment-2048x2048 size-2048x2048 wp-image-3870\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_1.png 1376w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_1-300x167.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_1-1024x572.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_1-768x429.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_1-18x10.png 18w\" sizes=\"(max-width: 1376px) 100vw, 1376px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b10e370 e-con-full e-flex e-con e-child\" data-id=\"b10e370\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bc9fa2a elementor-widget elementor-widget-heading\" data-id=\"bc9fa2a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">IF I COULD START AGAIN AFTER 60, SO CAN YOU\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-08b1696 elementor-widget elementor-widget-heading\" data-id=\"08b1696\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">You do not have to know everything.\n\nYou do not have to do everything alone.\n\nExperience still matters. Curiosity still matters. The ability to ask the right question still matters.\n\nAnd today, with the right tools, one person can do things that only a few years ago would have required an entire team.\n\nThe important thing is to begin.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cdc65c2 e-con-full e-flex e-con e-child\" data-id=\"cdc65c2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3400306 elementor-widget elementor-widget-image\" data-id=\"3400306\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1376\" height=\"768\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_2.png\" class=\"attachment-2048x2048 size-2048x2048 wp-image-3871\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_2.png 1376w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_2-300x167.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_2-1024x572.png 1024w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_2-768x429.png 768w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/CG_banner_software_2-18x10.png 18w\" sizes=\"(max-width: 1376px) 100vw, 1376px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-32cc0c0 elementor-widget elementor-widget-text-editor\" data-id=\"32cc0c0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>I sincerely believe that, through the Foundation we have created, I will meet people who are just as determined, curious and passionate \u2014 people who want to learn, create and share what they know.<\/p><p>Nationality, gender, age or sexual orientation do not matter to me.<\/p><p>What matters is the person \u2014 their integrity, their willingness to learn, to help others and to work together for something meaningful.<\/p><p>I hope that Crypto-Grandpa\u2122 Ukraine Foundation will bring together people who are ready to share knowledge, support one another and bring more kindness into the lives of others.<\/p><p>Because knowledge becomes more valuable when we share it.<\/p><p>And kindness becomes stronger when we create it together.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-38747fd e-con-full e-flex e-con e-child\" data-id=\"38747fd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-01d45ca e-con-full e-flex e-con e-child\" data-id=\"01d45ca\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fbcd496 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"fbcd496\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Sincerely yours,<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b9d099f e-con-full e-flex e-con e-child\" data-id=\"b9d099f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e275878 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"e275878\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"519\" height=\"512\" src=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/SD_white.png\" class=\"attachment-large size-large wp-image-3546\" alt=\"\" srcset=\"https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/SD_white.png 519w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/SD_white-300x296.png 300w, https:\/\/stegotool.crypto-grandpa.com.ua\/wp-content\/uploads\/2026\/09\/SD_white-12x12.png 12w\" sizes=\"(max-width: 519px) 100vw, 519px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8912e4b e-con-full e-flex e-con e-child\" data-id=\"8912e4b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-db7115d elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"db7115d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Sergii Karpenko<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\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<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>SOFTWARE \u2022 EDUCATION \u2022 INNOVATION SOFTWARE Practical software solutions developed by Crypto-Grandpa\u2122 Ukraine Foundation for education, digital skills and real-world applications. A PERSONAL STORY WHERE IT ALL BEGAN I did not come to programming from zero. By education, I am a programmer and mathematician. I worked with algorithms, software systems and information technologies many years [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_surecart_dashboard_logo_width":"180px","_surecart_dashboard_show_logo":true,"_surecart_dashboard_navigation_orders":true,"_surecart_dashboard_navigation_invoices":true,"_surecart_dashboard_navigation_subscriptions":true,"_surecart_dashboard_navigation_downloads":true,"_surecart_dashboard_navigation_billing":true,"_surecart_dashboard_navigation_account":true,"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"disabled","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"enabled","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2390","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/pages\/2390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/comments?post=2390"}],"version-history":[{"count":436,"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/pages\/2390\/revisions"}],"predecessor-version":[{"id":4011,"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/pages\/2390\/revisions\/4011"}],"wp:attachment":[{"href":"https:\/\/stegotool.crypto-grandpa.com.ua\/ua\/wp-json\/wp\/v2\/media?parent=2390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}