{"id":9068,"date":"2026-01-27T23:46:11","date_gmt":"2026-01-27T20:46:11","guid":{"rendered":"https:\/\/1.cbm.ua\/?page_id=9068"},"modified":"2026-01-29T20:03:48","modified_gmt":"2026-01-29T17:03:48","slug":"%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%b4%d0%bb%d1%8f-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%86%d1%8b-%d1%81-%d0%be%d0%b7%d0%b2%d1%83%d1%87%d0%ba%d0%be","status":"publish","type":"page","link":"https:\/\/1.cbm.ua\/?page_id=9068","title":{"rendered":"v1 \u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0437\u0432\u0443\u0447\u043a\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0441\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0433\u043b\u0430\u0433\u043e\u043b\u0430\u043c\u0438). \u0426\u0435\u043b\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c \u0438 \u043f\u043e\u0442\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">v1<\/p>\n\n\n\n<style>\n\/* \u0421\u0442\u0438\u043b\u0438 \u0434\u043b\u044f script-\u0430  *\/\n* {\n    box-sizing: border-box;\n    font-family: monospace;\n}\nbody {\n    max-width: 900px;\n    margin: 20px auto;\n    padding: 0 15px;\n}\nlabel {\n    display: block;\n    margin: 10px 0 5px;\n}\ntextarea {\n    width: 100%;\n    min-height: 150px;\n    padding: 8px;\n    font-family: monospace;\n}\nselect, button {\n    padding: 8px 16px;\n    margin: 5px 5px 5px 0;\n}\nbutton {\n    cursor: pointer;\n}\n.\u043f\u043e\u043b\u0435-\u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f {\n    margin-top: 10px;\n    padding: 10px;\n    border: 1px solid #ccc;\n    min-height: 40px;\n    background: #f9f9f9;\n}\ntable {\n    width: 100%;\n    border-collapse: collapse;\n    margin-top: 15px;\n}\nth, td {\n    border: 1px solid #333;\n    padding: 8px;\n    text-align: left;\n    white-space: pre-wrap;\n}\nth {\n    background: #eee;\n}\n.\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 15px;\n    align-items: center;\n    margin: 10px 0;\n}\n.\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 label {\n    display: inline;\n    margin: 0;\n}\n.phrase-text {\n    color: #006;\n}\n.play-btn {\n    display: inline;\n    padding: 0 3px;\n    margin-right: 3px;\n    cursor: pointer;\n    vertical-align: middle;\n    background: #e8f5e9;\n    border: 1px solid #4caf50;\n    border-radius: 2px;\n    line-height: 1;\n}\n.play-btn:hover {\n    background: #c8e6c9;\n}\n.play-btn svg {\n    display: inline-block;\n    vertical-align: middle;\n    width: 10px;\n    height: 10px;\n}\n.\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438-\u0433\u043e\u043b\u043e\u0441\u043e\u0432 {\n    margin: 10px 0;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    padding: 4px 8px;\n}\n.\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438-\u0433\u043e\u043b\u043e\u0441\u043e\u0432 summary {\n    cursor: pointer;\n    font-weight: bold;\n    padding: 4px 0;\n}\n.\u0433\u043e\u043b\u043e\u0441\u0430-\u0441\u0435\u0442\u043a\u0430 {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 8px;\n    margin-top: 8px;\n    padding-bottom: 8px;\n}\n.\u0433\u043e\u043b\u043e\u0441\u0430-\u0441\u0435\u0442\u043a\u0430 select {\n    width: 100%;\n}\n.\u043f\u0430\u043d\u0435\u043b\u044c-\u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 10px;\n    align-items: center;\n    margin: 10px 0;\n    padding: 8px;\n    background: #f5f5f5;\n    border: 1px solid #ddd;\n    border-radius: 4px;\n}\n.\u043f\u0430\u043d\u0435\u043b\u044c-\u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 label {\n    display: inline;\n    margin: 0;\n}\n.\u043e\u0448\u0438\u0431\u043a\u0438 {\n    margin-top: 15px;\n    padding: 15px;\n    background: #ffe0e0;\n    border: 1px solid #d00;\n    border-radius: 4px;\n}\n.\u043e\u0448\u0438\u0431\u043a\u0438 h3 {\n    margin: 0 0 10px 0;\n    color: #a00;\n}\n.\u043e\u0448\u0438\u0431\u043a\u0438 ul {\n    margin: 0;\n    padding-left: 20px;\n}\n.\u043e\u0448\u0438\u0431\u043a\u0438 li {\n    margin-bottom: 10px;\n}\n.\u043e\u0448\u0438\u0431\u043a\u0438 code {\n    display: block;\n    margin-top: 5px;\n    padding: 8px;\n    background: #fff;\n    border: 1px solid #ccc;\n    white-space: pre-wrap;\n    word-break: break-all;\n}\n<\/style>\n\n\n\n<!-- \u044d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430 WordPress -->\n    <!-- \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c HTML-\u0442\u0435\u0433\u0438, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e CSS \u0438 JS -->\n    <h2>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 JSON\/CSV<\/h2>\n\n    <label for=\"\u043f\u043e\u043b\u0435\u0412\u0432\u043e\u0434\u0430\u0414\u0430\u043d\u043d\u044b\u0445\">\u0414\u0430\u043d\u043d\u044b\u0435 (JSON \u0438\u043b\u0438 CSV):<\/label>\n    <textarea id=\"\u043f\u043e\u043b\u0435\u0412\u0432\u043e\u0434\u0430\u0414\u0430\u043d\u043d\u044b\u0445\" placeholder=\"\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON \u0438\u043b\u0438 CSV...\"><\/textarea>\n\n    <div class=\"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\">\n        <div>\n            <label for=\"\u0432\u044b\u0431\u043e\u0440\u042f\u0437\u044b\u043a\u043e\u0432\">\u042f\u0437\u044b\u043a\u0438:<\/label>\n            <select id=\"\u0432\u044b\u0431\u043e\u0440\u042f\u0437\u044b\u043a\u043e\u0432\">\n                <option value=\"de+ru\">de + ru<\/option>\n                <option value=\"en+ru\">en + ru<\/option>\n            <\/select>\n        <\/div>\n\n        <div>\n            <label>\n                <input type=\"checkbox\" id=\"csv\u041f\u0435\u0440\u0432\u0430\u044f\u0421\u0442\u0440\u043e\u043a\u0430\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\" checked>\n                CSV: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u2014 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n            <\/label>\n        <\/div>\n\n        <div>\n            <label for=\"csv\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\">\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c CSV:<\/label>\n            <input type=\"text\" id=\"csv\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\" value=\"|||\" style=\"width: 60px; padding: 4px; font-family: monospace;\">\n        <\/div>\n\n        <div>\n            <label for=\"csv\u042d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f\">\u042d\u043a\u0440\u0430\u043d \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f:<\/label>\n            <input type=\"text\" id=\"csv\u042d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f\" value=\"wwwwwwww\" style=\"width: 100px; padding: 4px; font-family: monospace;\">\n        <\/div>\n\n        <div>\n            <label for=\"\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442\">\u0421\u0438\u043c\u0432\u043e\u043b \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0432\u0443\u043a\u0430:<\/label>\n            <input type=\"text\" id=\"\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442\" value=\"\ud83d\udd0a\" style=\"width: 60px; padding: 4px; font-family: monospace;\">\n        <\/div>\n\n        <div>\n            <label for=\"\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u043e\u043f\">\u0421\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430 \u0437\u0432\u0443\u043a\u0430:<\/label>\n            <input type=\"text\" id=\"\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u043e\u043f\" value=\"\ud83d\udd07\" style=\"width: 60px; padding: 4px; font-family: monospace;\">\n        <\/div>\n    <\/div>\n\n    <button id=\"\u043a\u043d\u043e\u043f\u043a\u0430\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\">\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c<\/button>\n    <button id=\"\u043a\u043d\u043e\u043f\u043a\u0430\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0418\u0437\u0411\u0443\u0444\u0435\u0440\u0430\">\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430<\/button>\n    <button id=\"\u043a\u043d\u043e\u043f\u043a\u0430\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c<\/button>\n    <button id=\"\u043a\u043d\u043e\u043f\u043a\u0430\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\">\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/button>\n\n    <div class=\"\u043f\u043e\u043b\u0435-\u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\" id=\"\u043f\u043e\u043b\u0435\u0418\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\">\u0413\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435<\/div>\n\n    <details class=\"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438-\u0433\u043e\u043b\u043e\u0441\u043e\u0432\">\n        <summary>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u043e\u043b\u043e\u0441\u043e\u0432<\/summary>\n        <div class=\"\u0433\u043e\u043b\u043e\u0441\u0430-\u0441\u0435\u0442\u043a\u0430\">\n            <div>\n                <label for=\"\u0433\u043e\u043b\u043e\u0441_de\">\u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439 (de):<\/label>\n                <select id=\"\u0433\u043e\u043b\u043e\u0441_de\"><option value=\"\">\u0410\u0432\u0442\u043e<\/option><\/select>\n            <\/div>\n            <div>\n                <label for=\"\u0433\u043e\u043b\u043e\u0441_en\">\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 (en):<\/label>\n                <select id=\"\u0433\u043e\u043b\u043e\u0441_en\"><option value=\"\">\u0410\u0432\u0442\u043e<\/option><\/select>\n            <\/div>\n            <div>\n                <label for=\"\u0433\u043e\u043b\u043e\u0441_ru\">\u0420\u0443\u0441\u0441\u043a\u0438\u0439 (ru):<\/label>\n                <select id=\"\u0433\u043e\u043b\u043e\u0441_ru\"><option value=\"\">\u0410\u0432\u0442\u043e<\/option><\/select>\n            <\/div>\n            <div>\n                <label for=\"\u0433\u043e\u043b\u043e\u0441_fr\">\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439 (fr):<\/label>\n                <select id=\"\u0433\u043e\u043b\u043e\u0441_fr\"><option value=\"\">\u0410\u0432\u0442\u043e<\/option><\/select>\n            <\/div>\n            <div>\n                <label for=\"\u0433\u043e\u043b\u043e\u0441_es\">\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439 (es):<\/label>\n                <select id=\"\u0433\u043e\u043b\u043e\u0441_es\"><option value=\"\">\u0410\u0432\u0442\u043e<\/option><\/select>\n            <\/div>\n            <div>\n                <label for=\"\u0433\u043e\u043b\u043e\u0441_it\">\u0418\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439 (it):<\/label>\n                <select id=\"\u0433\u043e\u043b\u043e\u0441_it\"><option value=\"\">\u0410\u0432\u0442\u043e<\/option><\/select>\n            <\/div>\n        <\/div>\n    <\/details>\n\n    <div class=\"\u043f\u0430\u043d\u0435\u043b\u044c-\u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438\">\n        <button id=\"\u043a\u043d\u043e\u043f\u043a\u0430\u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c\">\u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c<\/button>\n\n        <label><input type=\"checkbox\" id=\"\u0432\u044b\u0433\u0440HTML\" checked> HTML<\/label>\n        <label><input type=\"checkbox\" id=\"\u0432\u044b\u0433CSS\" checked> CSS<\/label>\n        <label><input type=\"checkbox\" id=\"\u0432\u044b\u0433JS\" checked> JS<\/label>\n\n        <label><input type=\"checkbox\" id=\"\u0432\u044b\u0433\u0421\u0436\u0430\u0442\u0430\u044f\"> \u0421\u0436\u0430\u0442\u0430\u044f<\/label>\n\n        <label for=\"\u0432\u044b\u0431\u043e\u0440\u042d\u0442\u0430\u043f\u0430\">\u042d\u0442\u0430\u043f:<\/label>\n        <select id=\"\u0432\u044b\u0431\u043e\u0440\u042d\u0442\u0430\u043f\u0430\">\n            <option value=\"1\">\u042d\u0442\u0430\u043f 1 \u2014 \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438<\/option>\n            <option value=\"2\" selected>\u042d\u0442\u0430\u043f 2 \u2014 \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0437\u0432\u0443\u0447\u043a\u043e\u0439<\/option>\n        <\/select>\n    <\/div>\n\n    <div id=\"\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0422\u0430\u0431\u043b\u0438\u0446\u044b\"><\/div>\n\n\n\n<script>\n\/**\n * \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (JSON \u0438\u043b\u0438 CSV)\n * @param {string} \u0442\u0435\u043a\u0441\u0442 - \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430\n * @returns {string} - 'json' \u0438\u043b\u0438 'csv'\n *\/\nfunction \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0424\u043e\u0440\u043c\u0430\u0442\u0414\u0430\u043d\u043d\u044b\u0445(\u0442\u0435\u043a\u0441\u0442) {\n    const \u043e\u0447\u0438\u0449\u0435\u043d\u043d\u044b\u0439 = \u0442\u0435\u043a\u0441\u0442.trim();\n\n    \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c JSON: \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 [ \u0438\u043b\u0438 {\n    if (\u043e\u0447\u0438\u0449\u0435\u043d\u043d\u044b\u0439.startsWith('[') || \u043e\u0447\u0438\u0449\u0435\u043d\u043d\u044b\u0439.startsWith('{')) {\n        try {\n            JSON.parse(\u043e\u0447\u0438\u0449\u0435\u043d\u043d\u044b\u0439);\n            return 'json';\n        } catch (e) {\n            \/\/ \u041d\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON \u2014 \u0441\u0447\u0438\u0442\u0430\u0435\u043c CSV\n        }\n    }\n\n    \/\/ \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 CSV (\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c \u0438\u043b\u0438 \u0431\u0435\u0437 \u2014 \u043e\u0434\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0430)\n    return 'csv';\n}\n\n\/**\n * \u041f\u0430\u0440\u0441\u0438\u0442 JSON-\u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n * @param {string} json\u0421\u0442\u0440\u043e\u043a\u0430 - \u0412\u0430\u043b\u0438\u0434\u043d\u0430\u044f JSON-\u0441\u0442\u0440\u043e\u043a\u0430\n * @returns {Array<Object>|null} - \u041c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 null \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435\n *\/\nfunction \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cJSON(json\u0421\u0442\u0440\u043e\u043a\u0430) {\n    try {\n        const \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = JSON.parse(json\u0421\u0442\u0440\u043e\u043a\u0430);\n\n        \/\/ \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c\n        if (Array.isArray(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442)) {\n            return \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442;\n        }\n\n        \/\/ \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u2014 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\n        if (typeof \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 === 'object' && \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 !== null) {\n            return [\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442];\n        }\n\n        return null;\n    } catch (\u043e\u0448\u0438\u0431\u043a\u0430) {\n        console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON:', \u043e\u0448\u0438\u0431\u043a\u0430.message);\n        return null;\n    }\n}\n\n\/**\n * \u041f\u0430\u0440\u0441\u0438\u0442 CSV-\u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n * @param {string} csv\u0421\u0442\u0440\u043e\u043a\u0430 - CSV-\u0434\u0430\u043d\u043d\u044b\u0435\n * @param {boolean} \u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 - \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u0430\u043a \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n * @returns {Array<Object>|null} - \u041c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 null \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435\n *\/\n\/**\n * \u0427\u0438\u0441\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 CSV (\u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 DOM)\n * @param {string} csv\u0421\u0442\u0440\u043e\u043a\u0430 - CSV-\u0434\u0430\u043d\u043d\u044b\u0435\n * @param {boolean} \u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 - \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u0430\u043a \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n * @param {string} \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c - \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043b\u043e\u043d\u043e\u043a\n * @param {string} \u044d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f - \u0421\u0442\u0440\u043e\u043a\u0430 \u0434\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f\n * @returns {Array<Object>|null} - \u041c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 null \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435\n *\/\nfunction \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cCSV\u0414\u0430\u043d\u043d\u044b\u0435(csv\u0421\u0442\u0440\u043e\u043a\u0430, \u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, \u044d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f) {\n    try {\n        const \u0441\u0442\u0440\u043e\u043a\u0438 = csv\u0421\u0442\u0440\u043e\u043a\u0430.trim().split('\\n');\n\n        if (\u0441\u0442\u0440\u043e\u043a\u0438.length === 0) {\n            return null;\n        }\n\n        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435\n        const \u0435\u0441\u0442\u044c\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c = \u0441\u0442\u0440\u043e\u043a\u0438.some(\u0441 => \u0441.includes(\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c));\n\n        \/\/ \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u043d\u0435\u0442 \u2014 \u044d\u0442\u043e CSV \u0441 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439\n        if (!\u0435\u0441\u0442\u044c\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c) {\n            return \u0441\u0442\u0440\u043e\u043a\u0438.filter(\u0441 => \u0441.trim() !== '').map(\u0441\u0442\u0440\u043e\u043a\u0430 => ({ \u0442\u0435\u043a\u0441\u0442: \u0441\u0442\u0440\u043e\u043a\u0430 }));\n        }\n\n        \/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f: \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044e \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n        const \u0440\u0430\u0437\u0431\u0438\u0442\u044c\u0421\u0442\u0440\u043e\u043a\u0443 = (\u0441\u0442\u0440\u043e\u043a\u0430, \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c = false) => {\n            const \u0441\u042d\u043a\u0440\u0430\u043d\u043e\u043c = \u0441\u0442\u0440\u043e\u043a\u0430.split(\u044d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f).join('\\x00');\n            const \u044f\u0447\u0435\u0439\u043a\u0438 = \u0441\u042d\u043a\u0440\u0430\u043d\u043e\u043c.split(\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c);\n            return \u044f\u0447\u0435\u0439\u043a\u0438.map(\u044f\u0447\u0435\u0439\u043a\u0430 => {\n                const \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 = \u044f\u0447\u0435\u0439\u043a\u0430.split('\\x00').join(\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c);\n                return \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c ? \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.trim() : \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435;\n            });\n        };\n\n        \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n        let \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438;\n        let \u0434\u0430\u043d\u043d\u044b\u0435\u0421\u0442\u0440\u043e\u043a\u0438 = \u0441\u0442\u0440\u043e\u043a\u0438;\n\n        if (\u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 && \u0441\u0442\u0440\u043e\u043a\u0438.length > 0) {\n            \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 = \u0440\u0430\u0437\u0431\u0438\u0442\u044c\u0421\u0442\u0440\u043e\u043a\u0443(\u0441\u0442\u0440\u043e\u043a\u0438[0], true);\n            \u0434\u0430\u043d\u043d\u044b\u0435\u0421\u0442\u0440\u043e\u043a\u0438 = \u0441\u0442\u0440\u043e\u043a\u0438.slice(1);\n        } else {\n            \/\/ \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c\n            const \u043f\u0435\u0440\u0432\u0430\u044f\u0421\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c = \u0441\u0442\u0440\u043e\u043a\u0438.find(\u0441 => \u0441.includes(\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c));\n            const \u043a\u043e\u043b\u043e\u043d\u043e\u043a = \u043f\u0435\u0440\u0432\u0430\u044f\u0421\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c ? \u0440\u0430\u0437\u0431\u0438\u0442\u044c\u0421\u0442\u0440\u043e\u043a\u0443(\u043f\u0435\u0440\u0432\u0430\u044f\u0421\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c, true).length : 1;\n            \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 = Array.from({ length: \u043a\u043e\u043b\u043e\u043d\u043e\u043a }, (_, i) => `\u043a\u043e\u043b\u043e\u043d\u043a\u0430${i + 1}`);\n        }\n\n        \/\/ \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435: \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\n        \/\/ \u0438 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c\n        const \u0442\u0430\u0431\u043b\u0438\u0446\u0430 = [];\n        let \u0431\u0443\u0444\u0435\u0440 = [];\n\n        for (const \u0441\u0442\u0440\u043e\u043a\u0430 of \u0434\u0430\u043d\u043d\u044b\u0435\u0421\u0442\u0440\u043e\u043a\u0438) {\n            if (\u0441\u0442\u0440\u043e\u043a\u0430.includes(\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c)) {\n                \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c \u2014 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0438\n                const \u044f\u0447\u0435\u0439\u043a\u0438 = \u0440\u0430\u0437\u0431\u0438\u0442\u044c\u0421\u0442\u0440\u043e\u043a\u0443(\u0441\u0442\u0440\u043e\u043a\u0430);\n                \/\/ \u0415\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u2014 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435\n                const \u0435\u0441\u0442\u044c\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 = \u0431\u0443\u0444\u0435\u0440.some(\u0441 => \u0441.trim() !== '');\n                if (\u0435\u0441\u0442\u044c\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435) {\n                    \u044f\u0447\u0435\u0439\u043a\u0438[0] = \u0431\u0443\u0444\u0435\u0440.join('\\n') + '\\n' + \u044f\u0447\u0435\u0439\u043a\u0438[0];\n                }\n                \u0431\u0443\u0444\u0435\u0440 = [];\n                \u0442\u0430\u0431\u043b\u0438\u0446\u0430.push(\u044f\u0447\u0435\u0439\u043a\u0438);\n            } else {\n                \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u2014 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 (\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u044b)\n                \u0431\u0443\u0444\u0435\u0440.push(\u0441\u0442\u0440\u043e\u043a\u0430);\n            }\n        }\n\n        \/\/ \u0415\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439\n        if (\u0431\u0443\u0444\u0435\u0440.some(\u0441 => \u0441.trim() !== '')) {\n            \u0442\u0430\u0431\u043b\u0438\u0446\u0430.push([\u0431\u0443\u0444\u0435\u0440.join('\\n')]);\n        }\n\n        \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n        const \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = [];\n        for (let i = 0; i < \u0442\u0430\u0431\u043b\u0438\u0446\u0430.length; i++) {\n            const \u043e\u0431\u044a\u0435\u043a\u0442 = {};\n            for (let j = 0; j < \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.length; j++) {\n                \u043e\u0431\u044a\u0435\u043a\u0442[\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438[j]] = \u0442\u0430\u0431\u043b\u0438\u0446\u0430[i][j] || '';\n            }\n            \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.push(\u043e\u0431\u044a\u0435\u043a\u0442);\n        }\n\n        return \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442;\n    } catch (\u043e\u0448\u0438\u0431\u043a\u0430) {\n        console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 CSV:', \u043e\u0448\u0438\u0431\u043a\u0430.message);\n        return null;\n    }\n}\n\n\/**\n * \u041e\u0431\u0451\u0440\u0442\u043a\u0430: \u043f\u0430\u0440\u0441\u0438\u0442 CSV, \u0447\u0438\u0442\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 DOM\n *\/\nfunction \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cCSV(csv\u0421\u0442\u0440\u043e\u043a\u0430, \u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438) {\n    const \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c = document.getElementById('csv\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c').value || '|||';\n    const \u044d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f = document.getElementById('csv\u042d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f').value || 'wwwwwwww';\n    return \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cCSV\u0414\u0430\u043d\u043d\u044b\u0435(csv\u0421\u0442\u0440\u043e\u043a\u0430, \u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, \u044d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f);\n}\n\n\/**\n * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438\n * @returns {Object} - \u041e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 {\u0438\u0437\u0443\u0447\u0430\u0435\u043c\u044b\u0439, \u0440\u043e\u0434\u043d\u043e\u0439}\n *\/\nfunction \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435\u042f\u0437\u044b\u043a\u0438() {\n    \/\/ TODO: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432 \u0438\u0437 \u0441\u0435\u043b\u0435\u043a\u0442\u0430\n    return { \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u044b\u0439: 'de', \u0440\u043e\u0434\u043d\u043e\u0439: 'ru' };\n}\n\n\n\/**\n * \u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n * @param {string} \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 - \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n * @param {string} \u0442\u0438\u043f - \u0422\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f: '\u0438\u043d\u0444\u043e', '\u0443\u0441\u043f\u0435\u0445', '\u043e\u0448\u0438\u0431\u043a\u0430'\n *\/\nfunction \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435(\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0442\u0438\u043f = '\u0438\u043d\u0444\u043e') {\n    \/\/ TODO: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0442\u0438\u043f\u0443\n    const \u043f\u043e\u043b\u0435 = document.getElementById('\u043f\u043e\u043b\u0435\u0418\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f');\n    \u043f\u043e\u043b\u0435.textContent = \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435;\n}\n\n\/**\n * \u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u043f\u043e\u043b\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n * @param {string} \u0442\u0435\u043a\u0441\u0442\u041e\u0448\u0438\u0431\u043a\u0438 - \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438\n *\/\nfunction \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u041e\u0448\u0438\u0431\u043a\u0443(\u0442\u0435\u043a\u0441\u0442\u041e\u0448\u0438\u0431\u043a\u0438) {\n    \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435('\u041e\u0448\u0438\u0431\u043a\u0430: ' + \u0442\u0435\u043a\u0441\u0442\u041e\u0448\u0438\u0431\u043a\u0438, '\u043e\u0448\u0438\u0431\u043a\u0430');\n}\n\n\n\/**\n * \u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n *\/\nfunction \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\u0412\u0441\u0451() {\n    document.getElementById('\u043f\u043e\u043b\u0435\u0412\u0432\u043e\u0434\u0430\u0414\u0430\u043d\u043d\u044b\u0445').value = '';\n    document.getElementById('\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0422\u0430\u0431\u043b\u0438\u0446\u044b').innerHTML = '';\n    \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435('\u0413\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435', '\u0438\u043d\u0444\u043e');\n}\n\n\/**\n * \u0413\u0440\u0443\u043f\u043f\u0430 1: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u043e-\u0442\u0435\u0433\u043e\u0432\n * \u041e\u0431\u0440\u0430\u043c\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0441\u0442\u0430\u0440\u0442\/\u0441\u0442\u043e\u043f, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0441\u0442\u043e\u043f \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e\n * \u0412\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \ud83d\udd0a \u0438 \ud83d\udd07 \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u0432\u0445\u043e\u0434\u0435\/\u0432\u044b\u0445\u043e\u0434\u0435 \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b\n * @param {string} \u0441\u0442\u0440\u043e\u043a\u0430 - \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n * @param {string} \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422 - \u0421\u0438\u043c\u0432\u043e\u043b \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0432\u0443\u043a\u0430\n * @param {string} \u0417\u0412\u0423\u041a_\u0421\u0422\u041e\u041f - \u0421\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430 \u0437\u0432\u0443\u043a\u0430\n * @returns {Object} - {\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0442\u0438\u043f\u0422\u0435\u0433\u0430: \u0442\u0438\u043f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0433\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043e\u043a}\n *\/\nfunction \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0410\u0443\u0434\u0438\u043e\u0422\u0435\u0433\u0438(\u0441\u0442\u0440\u043e\u043a\u0430, \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422, \u0417\u0412\u0423\u041a_\u0421\u0422\u041e\u041f) {\n    \/\/ \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0430 \ud83d\udd0a\/\ud83d\udd07 \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430\n    let \u0440\u0430\u0431\u043e\u0447\u0430\u044f = \u0441\u0442\u0440\u043e\u043a\u0430.replaceAll(\u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422, '\ud83d\udd0a').replaceAll(\u0417\u0412\u0423\u041a_\u0421\u0422\u041e\u041f, '\ud83d\udd07');\n\n    let \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f;\n    let \u0442\u0438\u043f\u0422\u0435\u0433\u0430 = '';\n    let \u0441\u0447\u0451\u0442\u0447\u0438\u043a = 0;\n\n    \/\/ \u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \ud83d\udd0a\/\ud83d\udd07 \u2192 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b\n    const \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b = (\u0441) => \u0441.replaceAll('\ud83d\udd0a', \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422).replaceAll('\ud83d\udd07', \u0417\u0412\u0423\u041a_\u0421\u0422\u041e\u041f);\n\n    \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\n    const \u0435\u0441\u0442\u044c\u0421\u0442\u0430\u0440\u0442 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.includes('\ud83d\udd0a');\n    const \u0435\u0441\u0442\u044c\u0421\u0442\u043e\u043f = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.includes('\ud83d\udd07');\n    const \u0435\u0441\u0442\u044c\u0414\u0432\u043e\u0439\u043d\u043e\u0439 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.includes('\ud83d\udd0a\ud83d\udd0a');\n    const \u0435\u0441\u0442\u044c\u0422\u0440\u043e\u0439\u043d\u043e\u0439 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.includes('\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a');\n    const \u0435\u0441\u0442\u044c\u0427\u0435\u0442\u0432\u0435\u0440\u043d\u043e\u0439 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.includes('\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a');\n\n    if (!\u0435\u0441\u0442\u044c\u0421\u0442\u0430\u0440\u0442) {\n        \/\/ \u041d\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \ud83d\udd0a \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c\n        return { \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442), \u0442\u0438\u043f\u0422\u0435\u0433\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a };\n    }\n\n    \/\/ 0) \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \ud83d\udd0a\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a \u2014 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430\n    if (\u0435\u0441\u0442\u044c\u0427\u0435\u0442\u0432\u0435\u0440\u043d\u043e\u0439) {\n        console.error('\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0430\u0439\u0434\u0435\u043d\u043e \ud83d\udd0a\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a \u0432 \u0441\u0442\u0440\u043e\u043a\u0435:', \u0441\u0442\u0440\u043e\u043a\u0430);\n        return {\n            \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442),\n            \u0442\u0438\u043f\u0422\u0435\u0433\u0430: '\u043e\u0448\u0438\u0431\u043a\u0430',\n            \u043e\u0448\u0438\u0431\u043a\u0430: '\u041d\u0430\u0439\u0434\u0435\u043d\u043e \ud83d\udd0a\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a (\u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u043e\u0434\u0440\u044f\u0434). \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u0442\u043e\u043b\u044c\u043a\u043e \ud83d\udd0a, \ud83d\udd0a\ud83d\udd0a \u0438\u043b\u0438 \ud83d\udd0a\ud83d\udd0a\ud83d\udd0a.',\n            \u0441\u0447\u0451\u0442\u0447\u0438\u043a\n        };\n    }\n\n    \/\/ 1) \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \ud83d\udd0a\ud83d\udd0a\ud83d\udd0a \u2014 \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 (\u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0432\u0430 \ud83d\udd0a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \ud83d\udd07 \u0432 \u043a\u043e\u043d\u0435\u0446)\n    if (\u0435\u0441\u0442\u044c\u0422\u0440\u043e\u0439\u043d\u043e\u0439) {\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.replace('\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a', '\ud83d\udd0a') + '\ud83d\udd07';\n        \u0442\u0438\u043f\u0422\u0435\u0433\u0430 = \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422 + \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422 + \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422;\n        \u0441\u0447\u0451\u0442\u0447\u0438\u043a = 1;\n        return { \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442), \u0442\u0438\u043f\u0422\u0435\u0433\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a };\n    }\n\n    \/\/ 2) \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \ud83d\udd0a \u0438 \u0435\u0441\u0442\u044c \ud83d\udd07 \u0438 \u043d\u0435\u0442 \ud83d\udd0a\ud83d\udd0a \u2014 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c\n    if (\u0435\u0441\u0442\u044c\u0421\u0442\u0430\u0440\u0442 && \u0435\u0441\u0442\u044c\u0421\u0442\u043e\u043f && !\u0435\u0441\u0442\u044c\u0414\u0432\u043e\u0439\u043d\u043e\u0439) {\n        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \ud83d\udd0a \u0438 \ud83d\udd07 \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \ud83d\udd0a\n        const \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0421\u0442\u0430\u0440\u0442 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.indexOf('\ud83d\udd0a');\n        const \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0421\u0442\u043e\u043f = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.indexOf('\ud83d\udd07');\n        const \u043c\u0435\u0436\u0434\u0443\u0422\u0435\u0433\u0430\u043c\u0438 = \u0440\u0430\u0431\u043e\u0447\u0430\u044f.substring(\u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0421\u0442\u0430\u0440\u0442 + '\ud83d\udd0a'.length, \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0421\u0442\u043e\u043f);\n\n        if (\u043c\u0435\u0436\u0434\u0443\u0422\u0435\u0433\u0430\u043c\u0438.includes('\ud83d\udd0a')) {\n            console.error('\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0430\u0439\u0434\u0435\u043d \ud83d\udd0a \u043c\u0435\u0436\u0434\u0443 \ud83d\udd0a \u0438 \ud83d\udd07 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435:', \u0441\u0442\u0440\u043e\u043a\u0430);\n            return {\n                \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442),\n                \u0442\u0438\u043f\u0422\u0435\u0433\u0430: '\u043e\u0448\u0438\u0431\u043a\u0430',\n                \u043e\u0448\u0438\u0431\u043a\u0430: '\u041d\u0430\u0439\u0434\u0435\u043d \ud83d\udd0a \u0432\u043d\u0443\u0442\u0440\u0438 \ud83d\udd0a...\ud83d\udd07. \u041c\u0435\u0436\u0434\u0443 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0433\u043e\u043c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0433\u043e \ud83d\udd0a.',\n                \u0441\u0447\u0451\u0442\u0447\u0438\u043a: 0\n            };\n        }\n\n        \u0442\u0438\u043f\u0422\u0435\u0433\u0430 = \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422 + \u0417\u0412\u0423\u041a_\u0421\u0422\u041e\u041f;\n        \u0441\u0447\u0451\u0442\u0447\u0438\u043a = 1;\n        return { \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442), \u0442\u0438\u043f\u0422\u0435\u0433\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a };\n    }\n\n    \/\/ 3) \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \ud83d\udd0a\ud83d\udd0a \u0438 \u043d\u0435\u0442 \ud83d\udd07 \u2014 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0434\u0438\u043d \ud83d\udd0a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \ud83d\udd07 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438\n    if (\u0435\u0441\u0442\u044c\u0414\u0432\u043e\u0439\u043d\u043e\u0439 && !\u0435\u0441\u0442\u044c\u0421\u0442\u043e\u043f) {\n        \/\/ \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f: \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \ud83d\udd0a\ud83d\udd0a \u043d\u0430 \ud83d\udd0a \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \ud83d\udd07 \u0432 \u043a\u043e\u043d\u0435\u0446\n        const \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0414\u0432\u043e\u0439\u043d\u043e\u0439\u0422\u0435\u0433 = (\u0441) => {\n            \/\/ \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \ud83d\udd0a\ud83d\udd0a \u043d\u0430 \ud83d\udd0a\n            const \u0431\u0435\u0437\u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e = \u0441.replace('\ud83d\udd0a\ud83d\udd0a', '\ud83d\udd0a');\n            return \u0431\u0435\u0437\u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e + '\ud83d\udd07';\n        };\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0414\u0432\u043e\u0439\u043d\u043e\u0439\u0422\u0435\u0433(\u0440\u0430\u0431\u043e\u0447\u0430\u044f);\n        \u0442\u0438\u043f\u0422\u0435\u0433\u0430 = \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422 + \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422;\n        \u0441\u0447\u0451\u0442\u0447\u0438\u043a = 1;\n        return { \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442), \u0442\u0438\u043f\u0422\u0435\u0433\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a };\n    }\n\n    \/\/ 4) \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \ud83d\udd0a \u0438 \u043d\u0435\u0442 \ud83d\udd07 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \ud83d\udd07 \u043f\u043e\u0441\u043b\u0435 .!? \u0438\u043b\u0438 \u0432 \u043a\u043e\u043d\u0435\u0446\n    if (\u0435\u0441\u0442\u044c\u0421\u0442\u0430\u0440\u0442 && !\u0435\u0441\u0442\u044c\u0421\u0442\u043e\u043f) {\n        \/\/ \u0421\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \ud83d\udd0a\n        \u0441\u0447\u0451\u0442\u0447\u0438\u043a = (\u0440\u0430\u0431\u043e\u0447\u0430\u044f.match(\/\ud83d\udd0a\/g) || []).length;\n\n        \/\/ \u0415\u0441\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \ud83d\udd0a \u2014 \u044d\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430\n        if (\u0441\u0447\u0451\u0442\u0447\u0438\u043a > 1) {\n            console.error('\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \ud83d\udd0a \u0431\u0435\u0437 \ud83d\udd07 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435:', \u0441\u0442\u0440\u043e\u043a\u0430);\n            return {\n                \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442),\n                \u0442\u0438\u043f\u0422\u0435\u0433\u0430: '\u043e\u0448\u0438\u0431\u043a\u0430',\n                \u043e\u0448\u0438\u0431\u043a\u0430: `\u041d\u0430\u0439\u0434\u0435\u043d\u043e ${\u0441\u0447\u0451\u0442\u0447\u0438\u043a} \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \ud83d\udd0a \u0431\u0435\u0437 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \ud83d\udd07. \u041a\u0430\u0436\u0434\u044b\u0439 \ud83d\udd0a \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \ud83d\udd07.`,\n                \u0441\u0447\u0451\u0442\u0447\u0438\u043a\n            };\n        }\n\n        \/\/ \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f: \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \ud83d\udd0a\n        const \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u041e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439\u0422\u0435\u0433 = (\u0441) => {\n            let \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f = '';\n            let \u0432\u043d\u0443\u0442\u0440\u0438\u0422\u0435\u0433\u0430 = false;\n\n            for (const \u0441\u0438\u043c\u0432\u043e\u043b of \u0441) {\n\n                if (\u0441\u0438\u043c\u0432\u043e\u043b === '\ud83d\udd0a' && !\u0432\u043d\u0443\u0442\u0440\u0438\u0422\u0435\u0433\u0430) {\n                    \/\/ \u041d\u0430\u0447\u0430\u043b\u043e \u0430\u0443\u0434\u0438\u043e-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\n                    \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f += \u0441\u0438\u043c\u0432\u043e\u043b;\n                    \u0432\u043d\u0443\u0442\u0440\u0438\u0422\u0435\u0433\u0430 = true;\n                    continue;\n                }\n\n                if (\u0432\u043d\u0443\u0442\u0440\u0438\u0422\u0435\u0433\u0430) {\n                    \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n                    if ('.!?'.includes(\u0441\u0438\u043c\u0432\u043e\u043b)) {\n                        \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f += \u0441\u0438\u043c\u0432\u043e\u043b;\n                        \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f += '\ud83d\udd07';\n                        \u0432\u043d\u0443\u0442\u0440\u0438\u0422\u0435\u0433\u0430 = false;\n                        continue;\n                    }\n                }\n\n                \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f += \u0441\u0438\u043c\u0432\u043e\u043b;\n            }\n\n            \/\/ \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0433\u0430 \u2014 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0446\u0435\n            if (\u0432\u043d\u0443\u0442\u0440\u0438\u0422\u0435\u0433\u0430) {\n                \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f += '\ud83d\udd07';\n            }\n\n            return \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f;\n        };\n\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u041e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439\u0422\u0435\u0433(\u0440\u0430\u0431\u043e\u0447\u0430\u044f);\n        \u0442\u0438\u043f\u0422\u0435\u0433\u0430 = \u0417\u0412\u0423\u041a_\u0421\u0422\u0410\u0420\u0422;\n        \u0441\u0447\u0451\u0442\u0447\u0438\u043a = 1;\n        return { \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442), \u0442\u0438\u043f\u0422\u0435\u0433\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a };\n    }\n\n    return { \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0421\u0438\u043c\u0432\u043e\u043b\u044b(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442), \u0442\u0438\u043f\u0422\u0435\u0433\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a };\n}\n\n\/**\n * \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443\n * @param {string} \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438\n * @param {string} \u043a\u043e\u043b\u043e\u043d\u043a\u0430 - \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438\n * @param {number} \u043d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438 - \u041d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 (\u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 0)\n * @param {Array} \u043e\u0448\u0438\u0431\u043a\u0438 - \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043e\u0448\u0438\u0431\u043e\u043a\n * @param {Set} \u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430 - \u041d\u0430\u0431\u043e\u0440 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0441 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0437\u0432\u0443\u0447\u043a\u043e\u0439 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0442\u0435\u043a\u0441\u0442\u0430\n * @returns {string} - \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c HTML)\n *\/\nfunction \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u042f\u0447\u0435\u0439\u043a\u0443(\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u043b\u043e\u043d\u043a\u0430, \u043d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438, \u043e\u0448\u0438\u0431\u043a\u0438, \u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430) {\n    let \u0442\u0435\u043a\u0441\u0442 = String(\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435);\n\n    \/\/ \u0413\u0440\u0443\u043f\u043f\u0430 1: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u043e-\u0442\u0435\u0433\u043e\u0432\n    const \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442 = document.getElementById('\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442').value || '\ud83d\udd0a';\n    const \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f = document.getElementById('\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u043e\u043f').value || '\ud83d\udd07';\n\n    \/\/ \u0415\u0441\u043b\u0438 \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u00ab\u043e\u0437\u0432\u0443\u0447\u043a\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430\u00bb \u2014 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \ud83d\udd0a...\ud83d\udd07\n    if (\u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430 && \u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430.has(\u043a\u043e\u043b\u043e\u043d\u043a\u0430)) {\n        \u0442\u0435\u043a\u0441\u0442 = \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442 + \u0442\u0435\u043a\u0441\u0442 + \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f;\n        const \u044d\u0442\u0430\u043f\u0414\u043e\u041a\u043e\u043d\u0446\u0430 = document.getElementById('\u0432\u044b\u0431\u043e\u0440\u042d\u0442\u0430\u043f\u0430')?.value;\n        if (\u044d\u0442\u0430\u043f\u0414\u043e\u041a\u043e\u043d\u0446\u0430 === '2') {\n            return \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c\u0410\u0443\u0434\u0438\u043e\u0422\u0435\u0433\u0438\u041d\u0430HTML(\u0442\u0435\u043a\u0441\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f);\n        }\n        return \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u0442\u0435\u043a\u0441\u0442);\n    }\n\n    const \u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0410\u0443\u0434\u0438\u043e\u0422\u0435\u0433\u0438(\u0442\u0435\u043a\u0441\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f);\n    \u0442\u0435\u043a\u0441\u0442 = \u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442;\n\n    \/\/ \u0415\u0441\u043b\u0438 \u0442\u0440\u043e\u0439\u043d\u043e\u0439 \u0442\u0435\u0433 \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u0437\u0432\u0443\u0447\u043a\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435)\n    if (\u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0442\u0438\u043f\u0422\u0435\u0433\u0430 === \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442 + \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442 + \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442 && \u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430 !== null) {\n        \u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430.add(\u043a\u043e\u043b\u043e\u043d\u043a\u0430);\n    }\n\n    \/\/ \u041b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435\n    if (\u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0442\u0438\u043f\u0422\u0435\u0433\u0430) {\n        console.log(`\u042f\u0447\u0435\u0439\u043a\u0430 [${\u043d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438}, ${\u043a\u043e\u043b\u043e\u043d\u043a\u0430}]: \u0442\u0438\u043f=${\u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0442\u0438\u043f\u0422\u0435\u0433\u0430}, \u0441\u0447\u0451\u0442\u0447\u0438\u043a=${\u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0441\u0447\u0451\u0442\u0447\u0438\u043a}`);\n    }\n\n    \/\/ \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0448\u0438\u0431\u043e\u043a\n    if (\u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u0442\u0438\u043f\u0422\u0435\u0433\u0430 === '\u043e\u0448\u0438\u0431\u043a\u0430') {\n        \u043e\u0448\u0438\u0431\u043a\u0438.push({\n            \u0441\u0442\u0440\u043e\u043a\u0430: \u043d\u043e\u043c\u0435\u0440\u0421\u0442\u0440\u043e\u043a\u0438 + 1,\n            \u043a\u043e\u043b\u043e\u043d\u043a\u0430: \u043a\u043e\u043b\u043e\u043d\u043a\u0430,\n            \u0442\u0435\u043a\u0441\u0442: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435,\n            \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435: \u0430\u0443\u0434\u0438\u043e\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.\u043e\u0448\u0438\u0431\u043a\u0430 || '\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0430\u0443\u0434\u0438\u043e-\u0442\u0435\u0433\u0430\u0445'\n        });\n    }\n\n    \/\/ \u042d\u0442\u0430\u043f 2: \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \ud83d\udd0a...\ud83d\udd07 \u043d\u0430 HTML \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 play\n    if (typeof document !== 'undefined') {\n        const \u044d\u0442\u0430\u043f = document.getElementById('\u0432\u044b\u0431\u043e\u0440\u042d\u0442\u0430\u043f\u0430')?.value;\n        if (\u044d\u0442\u0430\u043f === '2') {\n            return \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c\u0410\u0443\u0434\u0438\u043e\u0422\u0435\u0433\u0438\u041d\u0430HTML(\u0442\u0435\u043a\u0441\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f);\n        }\n    }\n\n    return \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u0442\u0435\u043a\u0441\u0442);\n}\n\n\/**\n * \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \ud83d\udd0a...\ud83d\udd07 \u043d\u0430 HTML \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 play\n * @param {string} \u0442\u0435\u043a\u0441\u0442 - \u0422\u0435\u043a\u0441\u0442 \u0441 \u0430\u0443\u0434\u0438\u043e-\u0442\u0435\u0433\u0430\u043c\u0438\n * @param {string} \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442 - \u0421\u0438\u043c\u0432\u043e\u043b \u043d\u0430\u0447\u0430\u043b\u0430\n * @param {string} \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f - \u0421\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430\n * @returns {string} - HTML\n *\/\nfunction \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c\u0410\u0443\u0434\u0438\u043e\u0422\u0435\u0433\u0438\u041d\u0430HTML(\u0442\u0435\u043a\u0441\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442, \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f) {\n    let \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = '';\n    let \u043f\u043e\u0437\u0438\u0446\u0438\u044f = 0;\n\n    while (\u043f\u043e\u0437\u0438\u0446\u0438\u044f < \u0442\u0435\u043a\u0441\u0442.length) {\n        const \u043d\u0430\u0447\u0430\u043b\u043e = \u0442\u0435\u043a\u0441\u0442.indexOf(\u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442, \u043f\u043e\u0437\u0438\u0446\u0438\u044f);\n        if (\u043d\u0430\u0447\u0430\u043b\u043e === -1) {\n            \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u0442\u0435\u043a\u0441\u0442.slice(\u043f\u043e\u0437\u0438\u0446\u0438\u044f));\n            break;\n        }\n        \/\/ \u0422\u0435\u043a\u0441\u0442 \u0434\u043e \u0442\u0435\u0433\u0430\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u0442\u0435\u043a\u0441\u0442.slice(\u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u043d\u0430\u0447\u0430\u043b\u043e));\n\n        const \u043a\u043e\u043d\u0435\u0446 = \u0442\u0435\u043a\u0441\u0442.indexOf(\u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f, \u043d\u0430\u0447\u0430\u043b\u043e + \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442.length);\n        if (\u043a\u043e\u043d\u0435\u0446 === -1) {\n            \/\/ \u041d\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u2014 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043a\u0430\u043a \u0435\u0441\u0442\u044c\n            \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u0442\u0435\u043a\u0441\u0442.slice(\u043d\u0430\u0447\u0430\u043b\u043e));\n            break;\n        }\n\n        const \u0444\u0440\u0430\u0437\u0430 = \u0442\u0435\u043a\u0441\u0442.slice(\u043d\u0430\u0447\u0430\u043b\u043e + \u0437\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442.length, \u043a\u043e\u043d\u0435\u0446);\n        const \u044f\u0437\u044b\u043a = \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u042f\u0437\u044b\u043a\u0422\u0435\u043a\u0441\u0442\u0430(\u0444\u0440\u0430\u0437\u0430);\n        const \u044d\u043a\u0440\u0430\u043d\u0424\u0440\u0430\u0437\u0430 = \u0444\u0440\u0430\u0437\u0430.replace(\/\\\\\/g, '\\\\\\\\').replace(\/'\/g, \"\\\\'\").replace(\/\\n\/g, '\\\\n').replace(\/\\r\/g, '\\\\r');\n\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += `<button class=\"play-btn\" onclick=\"speak('${\u044d\u043a\u0440\u0430\u043d\u0424\u0440\u0430\u0437\u0430}', '${\u044f\u0437\u044b\u043a}')\">${SVG_\u0412\u041e\u0421\u041f\u0420\u041e\u0418\u0417\u0412\u0415\u0414\u0415\u041d\u0418\u0415}<\/button>`;\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += `<span class=\"phrase-text\">${\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u0444\u0440\u0430\u0437\u0430)}<\/span>`;\n\n        \u043f\u043e\u0437\u0438\u0446\u0438\u044f = \u043a\u043e\u043d\u0435\u0446 + \u0437\u0432\u0443\u043a\u0421\u0442\u043e\u043f.length;\n    }\n\n    return \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442;\n}\n\n\/**\n * \u0421\u043e\u0437\u0434\u0430\u0435\u0442 HTML-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n * @param {Array<Object>} \u0434\u0430\u043d\u043d\u044b\u0435 - \u041c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\n * @returns {string} - HTML-\u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0448\u0438\u0431\u043e\u043a\n *\/\nfunction \u0441\u043e\u0437\u0434\u0430\u0442\u044c\u0422\u0430\u0431\u043b\u0438\u0446\u0443(\u0434\u0430\u043d\u043d\u044b\u0435) {\n    if (!\u0434\u0430\u043d\u043d\u044b\u0435 || \u0434\u0430\u043d\u043d\u044b\u0435.length === 0) {\n        return '<p>\u041d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>';\n    }\n\n    \/\/ \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043e\u0448\u0438\u0431\u043e\u043a\n    const \u043e\u0448\u0438\u0431\u043a\u0438 = [];\n\n    \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n    const \u043a\u043e\u043b\u043e\u043d\u043a\u0438 = [...new Set(\u0434\u0430\u043d\u043d\u044b\u0435.flatMap(obj => Object.keys(obj)))];\n\n    \/\/ \u041d\u0430\u0431\u043e\u0440 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0441 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0437\u0432\u0443\u0447\u043a\u043e\u0439 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 (\ud83d\udd0a\ud83d\udd0a\ud83d\udd0a)\n    \/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 (\u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f) \u2014 \u0438\u043d\u0430\u0447\u0435 null\n    const \u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430 = \u043a\u043e\u043b\u043e\u043d\u043a\u0438.length === 1 ? new Set() : null;\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    let html = '<table>';\n    html += '<thead><tr>';\n    html += '<th>\u2116<\/th>'; \/\/ \u041a\u043e\u043b\u043e\u043d\u043a\u0430 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u0438\n    for (const \u043a\u043e\u043b\u043e\u043d\u043a\u0430 of \u043a\u043e\u043b\u043e\u043d\u043a\u0438) {\n        html += `<th>${\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u043a\u043e\u043b\u043e\u043d\u043a\u0430)}<\/th>`;\n    }\n    html += '<\/tr><\/thead>';\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0435\u043b\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    html += '<tbody>';\n    for (let i = 0; i < \u0434\u0430\u043d\u043d\u044b\u0435.length; i++) {\n        const \u0441\u0442\u0440\u043e\u043a\u0430 = \u0434\u0430\u043d\u043d\u044b\u0435[i];\n        html += '<tr>';\n        html += `<td>${i + 1}<\/td>`; \/\/ \u041d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438\n        for (const \u043a\u043e\u043b\u043e\u043d\u043a\u0430 of \u043a\u043e\u043b\u043e\u043d\u043a\u0438) {\n            const \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 = \u0441\u0442\u0440\u043e\u043a\u0430[\u043a\u043e\u043b\u043e\u043d\u043a\u0430] ?? '';\n            \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044f\u0447\u0435\u0439\u043a\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0448\u0438\u0431\u043e\u043a\n            const \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 = \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u042f\u0447\u0435\u0439\u043a\u0443(\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u043b\u043e\u043d\u043a\u0430, i, \u043e\u0448\u0438\u0431\u043a\u0438, \u043e\u0437\u0432\u0443\u0447\u043a\u0430\u0414\u043e\u041a\u043e\u043d\u0446\u0430);\n            html += `<td>${\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435}<\/td>`;\n        }\n        html += '<\/tr>';\n    }\n    html += '<\/tbody>';\n    html += '<\/table>';\n\n    \/\/ \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    if (\u043e\u0448\u0438\u0431\u043a\u0438.length > 0) {\n        let \u043e\u0448\u0438\u0431\u043a\u0438Html = '<div class=\"\u043e\u0448\u0438\u0431\u043a\u0438\">';\n        \u043e\u0448\u0438\u0431\u043a\u0438Html += `<h3>\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u043e\u0448\u0438\u0431\u043e\u043a: ${\u043e\u0448\u0438\u0431\u043a\u0438.length}<\/h3>`;\n        \u043e\u0448\u0438\u0431\u043a\u0438Html += '<ul>';\n        for (const \u043e\u0448\u0438\u0431\u043a\u0430 of \u043e\u0448\u0438\u0431\u043a\u0438) {\n            \u043e\u0448\u0438\u0431\u043a\u0438Html += `<li><strong>\u0421\u0442\u0440\u043e\u043a\u0430 ${\u043e\u0448\u0438\u0431\u043a\u0430.\u0441\u0442\u0440\u043e\u043a\u0430}, \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \"${\u043e\u0448\u0438\u0431\u043a\u0430.\u043a\u043e\u043b\u043e\u043d\u043a\u0430}\":<\/strong><br>`;\n            \u043e\u0448\u0438\u0431\u043a\u0438Html += `${\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u043e\u0448\u0438\u0431\u043a\u0430.\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435)}<br>`;\n            \u043e\u0448\u0438\u0431\u043a\u0438Html += `<code>${\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u043e\u0448\u0438\u0431\u043a\u0430.\u0442\u0435\u043a\u0441\u0442)}<\/code><\/li>`;\n        }\n        \u043e\u0448\u0438\u0431\u043a\u0438Html += '<\/ul>';\n        \u043e\u0448\u0438\u0431\u043a\u0438Html += '<\/div>';\n        return \u043e\u0448\u0438\u0431\u043a\u0438Html;\n    }\n\n    return html;\n}\n\n\/**\n * \u042d\u043a\u0440\u0430\u043d\u0438\u0440\u0443\u0435\u0442 HTML-\u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430\n * @param {string} \u0442\u0435\u043a\u0441\u0442 - \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\n * @returns {string} - \u042d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\n *\/\nfunction \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044cHTML(\u0442\u0435\u043a\u0441\u0442) {\n    const \u0437\u0430\u043c\u0435\u043d\u044b = {\n        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        '\"': '&quot;',\n        \"'\": '&#039;'\n    };\n    return \u0442\u0435\u043a\u0441\u0442.replace(\/[&<>\"']\/g, \u0441\u0438\u043c\u0432\u043e\u043b => \u0437\u0430\u043c\u0435\u043d\u044b[\u0441\u0438\u043c\u0432\u043e\u043b]);\n}\n\n\n\/**\n * \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n * \u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442,\n * \u043f\u0430\u0440\u0441\u0438\u0442 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n *\/\nfunction \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0414\u0430\u043d\u043d\u044b\u0435() {\n    const \u0442\u0435\u043a\u0441\u0442 = document.getElementById('\u043f\u043e\u043b\u0435\u0412\u0432\u043e\u0434\u0430\u0414\u0430\u043d\u043d\u044b\u0445').value.trim();\n\n    if (!\u0442\u0435\u043a\u0441\u0442) {\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u041e\u0448\u0438\u0431\u043a\u0443('\u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0435');\n        return;\n    }\n    \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u043d\u043d\u044b\u0445\n    const \u0444\u043e\u0440\u043c\u0430\u0442 = \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0424\u043e\u0440\u043c\u0430\u0442\u0414\u0430\u043d\u043d\u044b\u0445(\u0442\u0435\u043a\u0441\u0442);\n    console.log('\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0444\u043e\u0440\u043c\u0430\u0442:', \u0444\u043e\u0440\u043c\u0430\u0442);\n\n    \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 CSV \u2014 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n    const \u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 = document.getElementById('csv\u041f\u0435\u0440\u0432\u0430\u044f\u0421\u0442\u0440\u043e\u043a\u0430\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438').checked;\n\n    let \u0434\u0430\u043d\u043d\u044b\u0435;\n    if (\u0444\u043e\u0440\u043c\u0430\u0442 === 'json') {\n        \u0434\u0430\u043d\u043d\u044b\u0435 = \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cJSON(\u0442\u0435\u043a\u0441\u0442);\n        console.log('\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cJSON:', \u0434\u0430\u043d\u043d\u044b\u0435);\n    } else {\n        \/\/ CSV (\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c \u0438\u043b\u0438 \u0431\u0435\u0437 \u2014 \u043e\u0434\u043d\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0430)\n        \u0434\u0430\u043d\u043d\u044b\u0435 = \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cCSV(\u0442\u0435\u043a\u0441\u0442, \u0435\u0441\u0442\u044c\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438);\n        console.log('\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044cCSV:', \u0434\u0430\u043d\u043d\u044b\u0435);\n    }\n\n    if (!\u0434\u0430\u043d\u043d\u044b\u0435) {\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u041e\u0448\u0438\u0431\u043a\u0443('\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435');\n        return;\n    }\n\n    console.log('\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b:', \u0434\u0430\u043d\u043d\u044b\u0435);\n\n    const \u0442\u0430\u0431\u043b\u0438\u0446\u0430 = \u0441\u043e\u0437\u0434\u0430\u0442\u044c\u0422\u0430\u0431\u043b\u0438\u0446\u0443(\u0434\u0430\u043d\u043d\u044b\u0435);\n    document.getElementById('\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0422\u0430\u0431\u043b\u0438\u0446\u044b').innerHTML = \u0442\u0430\u0431\u043b\u0438\u0446\u0430;\n    \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435('\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439: ' + \u0434\u0430\u043d\u043d\u044b\u0435.length, '\u0443\u0441\u043f\u0435\u0445');\n}\n\n\/**\n * \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\n * \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Clipboard API \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430\n * @returns {Promise<void>}\n *\/\nasync function \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0418\u0437\u0411\u0443\u0444\u0435\u0440\u0430() {\n    \/\/ TODO: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0443\u0444\u0435\u0440\u0443\n    try {\n        const \u0442\u0435\u043a\u0441\u0442 = await navigator.clipboard.readText();\n        document.getElementById('\u043f\u043e\u043b\u0435\u0412\u0432\u043e\u0434\u0430\u0414\u0430\u043d\u043d\u044b\u0445').value = \u0442\u0435\u043a\u0441\u0442;\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435('\u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430', '\u0443\u0441\u043f\u0435\u0445');\n    } catch (\u043e\u0448\u0438\u0431\u043a\u0430) {\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u041e\u0448\u0438\u0431\u043a\u0443('\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430');\n    }\n}\n\n\n\/\/ ==================== \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0418 ====================\n\n\/\/ \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043b\u043e\u043d\u043e\u043a CSV (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)\nconst CSV_\u0420\u0410\u0417\u0414\u0415\u041b\u0418\u0422\u0415\u041b\u042c = '|||';\n\n\/\/ \u041f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440 \u0434\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u044f\u0447\u0435\u0435\u043a\nconst \u042d\u041a\u0420\u0410\u041d_\u0420\u0410\u0417\u0414\u0415\u041b\u0418\u0422\u0415\u041b\u042f = 'wwwwwwww';\n\n\/\/ \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u044b\nconst \u0412\u0410\u0420\u0418\u0410\u041d\u0422\u042b_\u042f\u0417\u042b\u041a\u041e\u0412 = {\n    \u0441\u043f\u0438\u0441\u043e\u043a: ['de+ru', 'en+ru'],\n    \u043f\u043e\u0423\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: 0\n};\n\n\/\/ SVG-\u0438\u043a\u043e\u043d\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f\nconst SVG_\u0412\u041e\u0421\u041f\u0420\u041e\u0418\u0417\u0412\u0415\u0414\u0415\u041d\u0418\u0415 = '<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"16\" height=\"16\"><polygon points=\"5,3 19,12 5,21\"\/><\/svg>';\n\n\/**\n * \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u044f\u0437\u044b\u043a \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u044e \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u044b\n * @param {string} \u0442\u0435\u043a\u0441\u0442 - \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430\n * @returns {string} - 'ru' \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430, \u0438\u043d\u0430\u0447\u0435 \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0438\u0437 \u0441\u0435\u043b\u0435\u043a\u0442\u0430\n *\/\nfunction \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u042f\u0437\u044b\u043a\u0422\u0435\u043a\u0441\u0442\u0430(\u0442\u0435\u043a\u0441\u0442) {\n    if (\/[\u0430-\u044f\u0451\u0410-\u042f\u0401]\/.test(\u0442\u0435\u043a\u0441\u0442)) {\n        return 'ru';\n    }\n    \/\/ \u0411\u0435\u0440\u0451\u043c \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u0438\u0437 \u0441\u0435\u043b\u0435\u043a\u0442\u0430 (\u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043e +)\n    if (typeof document !== 'undefined') {\n        const \u0432\u044b\u0431\u043e\u0440 = document.getElementById('\u0432\u044b\u0431\u043e\u0440\u042f\u0437\u044b\u043a\u043e\u0432')?.value || 'de+ru';\n        return \u0432\u044b\u0431\u043e\u0440.split('+')[0];\n    }\n    return 'de';\n}\n\n\/\/ \u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u043f\u043e \u044f\u0437\u044b\u043a\u0430\u043c (Google\/\u043e\u043d\u043b\u0430\u0439\u043d \u2014 \u043f\u0435\u0440\u0432\u044b\u0435)\nconst \u041f\u0420\u0415\u0414\u041f\u041e\u0427\u0422\u0418\u0422\u0415\u041b\u042c\u041d\u042b\u0415_\u0413\u041e\u041b\u041e\u0421\u0410 = {\n    'en': ['Google US English 1 (Natural)', 'Google US English', 'Google UK English Female', 'Microsoft David'],\n    'de': ['Google Deutsch', 'GoogleTranslate German', 'Microsoft Stefan', 'Microsoft Katja'],\n    'ru': ['Google \u0440\u0443\u0441\u0441\u043a\u0438\u0439', 'GoogleTranslate Russian', 'Microsoft Pavel', 'Microsoft Irina'],\n    'fr': ['Google fran\u00e7ais', 'GoogleTranslate French'],\n    'es': ['Google espa\u00f1ol', 'GoogleTranslate Spanish', 'Microsoft Helena', 'Microsoft Pablo'],\n    'it': ['Google italiano', 'GoogleTranslate Italian']\n};\n\nlet \u043a\u044d\u0448\u0413\u043e\u043b\u043e\u0441\u043e\u0432 = {};\n\n\/**\n * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0433\u043e\u043b\u043e\u0441 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437 UI-\u0441\u0435\u043b\u0435\u043a\u0442\u0430, \u043f\u043e\u0442\u043e\u043c \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043f\u043e\u0442\u043e\u043c fallback\n *\/\nfunction \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0413\u043e\u043b\u043e\u0441(lang) {\n    \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0432\u044b\u0431\u0440\u0430\u043d \u043b\u0438 \u0433\u043e\u043b\u043e\u0441 \u0432 UI\n    if (typeof document !== 'undefined') {\n        const \u0441\u0435\u043b\u0435\u043a\u0442 = document.getElementById(`\u0433\u043e\u043b\u043e\u0441_${lang}`);\n        if (\u0441\u0435\u043b\u0435\u043a\u0442 && \u0441\u0435\u043b\u0435\u043a\u0442.value) {\n            const voices = window.speechSynthesis.getVoices();\n            const \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 = voices.find(v => v.name === \u0441\u0435\u043b\u0435\u043a\u0442.value);\n            if (\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439) return \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439;\n        }\n    }\n\n    if (\u043a\u044d\u0448\u0413\u043e\u043b\u043e\u0441\u043e\u0432[lang]) return \u043a\u044d\u0448\u0413\u043e\u043b\u043e\u0441\u043e\u0432[lang];\n\n    const voices = window.speechSynthesis.getVoices();\n    const preferred = \u041f\u0420\u0415\u0414\u041f\u041e\u0427\u0422\u0418\u0422\u0415\u041b\u042c\u041d\u042b\u0415_\u0413\u041e\u041b\u041e\u0421\u0410[lang] || [];\n\n    \/\/ \u0418\u0449\u0435\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0433\u043e\u043b\u043e\u0441\n    for (const \u0438\u043c\u044f of preferred) {\n        const \u043d\u0430\u0439\u0434\u0435\u043d = voices.find(v => v.name === \u0438\u043c\u044f);\n        if (\u043d\u0430\u0439\u0434\u0435\u043d) {\n            \u043a\u044d\u0448\u0413\u043e\u043b\u043e\u0441\u043e\u0432[lang] = \u043d\u0430\u0439\u0434\u0435\u043d;\n            return \u043d\u0430\u0439\u0434\u0435\u043d;\n        }\n    }\n\n    \/\/ Fallback: \u043f\u0435\u0440\u0432\u044b\u0439 \u0433\u043e\u043b\u043e\u0441 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c\n    const fallback = voices.find(v => v.lang.startsWith(lang));\n    if (fallback) {\n        \u043a\u044d\u0448\u0413\u043e\u043b\u043e\u0441\u043e\u0432[lang] = fallback;\n        return fallback;\n    }\n\n    return null;\n}\n\n\/**\n * \u041e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 SpeechSynthesis API\n *\/\nfunction speak(text, lang) {\n    console.log('speak \u0432\u044b\u0437\u0432\u0430\u043d:', text, lang);\n    window.speechSynthesis.cancel();\n    setTimeout(() => {\n        const utterance = new SpeechSynthesisUtterance(text);\n        const voice = \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0413\u043e\u043b\u043e\u0441(lang);\n        if (voice) utterance.voice = voice;\n        utterance.lang = lang;\n        utterance.rate = 0.9;\n        utterance.onerror = (e) => { if (e.error !== 'interrupted') console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0437\u0432\u0443\u0447\u043a\u0438:', e.error); };\n        window.speechSynthesis.speak(utterance);\n    }, 50);\n}\n\n\/**\n * \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0435\u043b\u0435\u043a\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430 \u0433\u043e\u043b\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430\n *\/\nfunction \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0421\u0435\u043b\u0435\u043a\u0442\u044b\u0413\u043e\u043b\u043e\u0441\u043e\u0432() {\n    const voices = window.speechSynthesis.getVoices();\n    if (voices.length === 0) return;\n\n    const \u044f\u0437\u044b\u043a\u0438 = ['de', 'en', 'ru', 'fr', 'es', 'it'];\n\n    for (const lang of \u044f\u0437\u044b\u043a\u0438) {\n        const \u0441\u0435\u043b\u0435\u043a\u0442 = document.getElementById(`\u0433\u043e\u043b\u043e\u0441_${lang}`);\n        if (!\u0441\u0435\u043b\u0435\u043a\u0442) continue;\n\n        const \u0442\u0435\u043a\u0443\u0449\u0435\u0435 = \u0441\u0435\u043b\u0435\u043a\u0442.value;\n        \u0441\u0435\u043b\u0435\u043a\u0442.innerHTML = '<option value=\"\">\u0410\u0432\u0442\u043e (\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439)<\/option>';\n\n        \/\/ \u0413\u043e\u043b\u043e\u0441\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430\n        const \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 = voices.filter(v => v.lang.startsWith(lang));\n        const preferred = \u041f\u0420\u0415\u0414\u041f\u041e\u0427\u0422\u0418\u0422\u0415\u041b\u042c\u041d\u042b\u0415_\u0413\u041e\u041b\u041e\u0421\u0410[lang] || [];\n\n        \/\/ \u0421\u043d\u0430\u0447\u0430\u043b\u0430 Google\/\u043e\u043d\u043b\u0430\u0439\u043d \u0433\u043e\u043b\u043e\u0441\u0430\n        const \u0433\u0443\u0433\u043b = \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435.filter(v => preferred.includes(v.name));\n        const \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 = \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435.filter(v => !preferred.includes(v.name));\n\n        if (\u0433\u0443\u0433\u043b.length > 0) {\n            const \u0433\u0440\u0443\u043f\u043f\u0430\u0413\u0443\u0433\u043b = document.createElement('optgroup');\n            \u0433\u0440\u0443\u043f\u043f\u0430\u0413\u0443\u0433\u043b.label = '\u2605 \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 (\u043e\u043d\u043b\u0430\u0439\u043d)';\n            for (const v of \u0433\u0443\u0433\u043b) {\n                const opt = document.createElement('option');\n                opt.value = v.name;\n                opt.textContent = v.name;\n                \u0433\u0440\u0443\u043f\u043f\u0430\u0413\u0443\u0433\u043b.appendChild(opt);\n            }\n            \u0441\u0435\u043b\u0435\u043a\u0442.appendChild(\u0433\u0440\u0443\u043f\u043f\u0430\u0413\u0443\u0433\u043b);\n        }\n\n        if (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435.length > 0) {\n            const \u0433\u0440\u0443\u043f\u043f\u0430\u041f\u0440\u043e\u0447\u0438\u0435 = document.createElement('optgroup');\n            \u0433\u0440\u0443\u043f\u043f\u0430\u041f\u0440\u043e\u0447\u0438\u0435.label = '\u0414\u0440\u0443\u0433\u0438\u0435';\n            for (const v of \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435) {\n                const opt = document.createElement('option');\n                opt.value = v.name;\n                opt.textContent = `${v.name} (${v.lang})`;\n                \u0433\u0440\u0443\u043f\u043f\u0430\u041f\u0440\u043e\u0447\u0438\u0435.appendChild(opt);\n            }\n            \u0441\u0435\u043b\u0435\u043a\u0442.appendChild(\u0433\u0440\u0443\u043f\u043f\u0430\u041f\u0440\u043e\u0447\u0438\u0435);\n        }\n\n        if (\u0442\u0435\u043a\u0443\u0449\u0435\u0435) \u0441\u0435\u043b\u0435\u043a\u0442.value = \u0442\u0435\u043a\u0443\u0449\u0435\u0435;\n    }\n}\n\n\/\/ \u0414\u0435\u043b\u0430\u0435\u043c speak \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u044f onclick\nif (typeof window !== 'undefined') {\n    window.speak = speak;\n\n    const \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0413\u043e\u043b\u043e\u0441\u0430 = () => {\n        \u043a\u044d\u0448\u0413\u043e\u043b\u043e\u0441\u043e\u0432 = {};\n        \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0421\u0435\u043b\u0435\u043a\u0442\u044b\u0413\u043e\u043b\u043e\u0441\u043e\u0432();\n        \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438();\n    };\n\n    \/\/ addEventListener \u0432\u043c\u0435\u0441\u0442\u043e onvoiceschanged \u2014 \u043d\u0430 WordPress \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c onvoiceschanged\n    window.speechSynthesis.addEventListener('voiceschanged', \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0413\u043e\u043b\u043e\u0441\u0430);\n\n    \/\/ \u0415\u0441\u043b\u0438 \u0433\u043e\u043b\u043e\u0441\u0430 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u2014 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0440\u0430\u0437\u0443\n    \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0421\u0435\u043b\u0435\u043a\u0442\u044b\u0413\u043e\u043b\u043e\u0441\u043e\u0432();\n\n    \/\/ \u0417\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: polling, \u0435\u0441\u043b\u0438 voiceschanged \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b (\u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 WordPress)\n    if (window.speechSynthesis.getVoices().length === 0) {\n        let \u043f\u043e\u043f\u044b\u0442\u043e\u043a = 0;\n        const \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u0413\u043e\u043b\u043e\u0441\u043e\u0432 = setInterval(() => {\n            \u043f\u043e\u043f\u044b\u0442\u043e\u043a++;\n            if (window.speechSynthesis.getVoices().length > 0 || \u043f\u043e\u043f\u044b\u0442\u043e\u043a > 50) {\n                clearInterval(\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u0413\u043e\u043b\u043e\u0441\u043e\u0432);\n                if (window.speechSynthesis.getVoices().length > 0) {\n                    \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0413\u043e\u043b\u043e\u0441\u0430();\n                }\n            }\n        }, 100);\n    }\n}\n\n\/\/ ==================== IndexedDB: \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\/\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a ====================\n\nconst \u0418\u041c\u042f_\u0411\u0414 = '\u043e\u0437\u0432\u0443\u0447\u043a\u0430\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438';\nconst \u0412\u0415\u0420\u0421\u0418\u042f_\u0411\u0414 = 1;\nconst \u0425\u0420\u0410\u041d\u0418\u041b\u0418\u0429\u0415 = '\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438';\n\nfunction \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0411\u0414() {\n    return new Promise((resolve, reject) => {\n        const req = indexedDB.open(\u0418\u041c\u042f_\u0411\u0414, \u0412\u0415\u0420\u0421\u0418\u042f_\u0411\u0414);\n        req.onupgradeneeded = () => {\n            const db = req.result;\n            if (!db.objectStoreNames.contains(\u0425\u0420\u0410\u041d\u0418\u041b\u0418\u0429\u0415)) {\n                db.createObjectStore(\u0425\u0420\u0410\u041d\u0418\u041b\u0418\u0429\u0415);\n            }\n        };\n        req.onsuccess = () => resolve(req.result);\n        req.onerror = () => reject(req.error);\n    });\n}\n\n\/\/ \u0421\u043f\u0438\u0441\u043e\u043a ID \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\nconst \u041f\u041e\u041b\u042f_\u041d\u0410\u0421\u0422\u0420\u041e\u0415\u041a = [\n    '\u0432\u044b\u0431\u043e\u0440\u042f\u0437\u044b\u043a\u043e\u0432', 'csv\u041f\u0435\u0440\u0432\u0430\u044f\u0421\u0442\u0440\u043e\u043a\u0430\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438', 'csv\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c',\n    'csv\u042d\u043a\u0440\u0430\u043d\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f', '\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u0430\u0440\u0442', '\u0441\u0438\u043c\u0432\u043e\u043b\u0417\u0432\u0443\u043a\u0421\u0442\u043e\u043f',\n    '\u0432\u044b\u0431\u043e\u0440\u042d\u0442\u0430\u043f\u0430',\n    '\u0432\u044b\u0433\u0440HTML', '\u0432\u044b\u0433CSS', '\u0432\u044b\u0433JS', '\u0432\u044b\u0433\u0421\u0436\u0430\u0442\u0430\u044f',\n    '\u0433\u043e\u043b\u043e\u0441_de', '\u0433\u043e\u043b\u043e\u0441_en', '\u0433\u043e\u043b\u043e\u0441_ru', '\u0433\u043e\u043b\u043e\u0441_fr', '\u0433\u043e\u043b\u043e\u0441_es', '\u0433\u043e\u043b\u043e\u0441_it'\n];\n\nasync function \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438() {\n    try {\n        const db = await \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0411\u0414();\n        const tx = db.transaction(\u0425\u0420\u0410\u041d\u0418\u041b\u0418\u0429\u0415, 'readwrite');\n        const store = tx.objectStore(\u0425\u0420\u0410\u041d\u0418\u041b\u0418\u0429\u0415);\n        const \u0434\u0430\u043d\u043d\u044b\u0435 = {};\n        for (const id of \u041f\u041e\u041b\u042f_\u041d\u0410\u0421\u0422\u0420\u041e\u0415\u041a) {\n            const \u044d\u043b = document.getElementById(id);\n            if (!\u044d\u043b) continue;\n            if (\u044d\u043b.type === 'checkbox') {\n                \u0434\u0430\u043d\u043d\u044b\u0435[id] = \u044d\u043b.checked;\n            } else {\n                \u0434\u0430\u043d\u043d\u044b\u0435[id] = \u044d\u043b.value;\n            }\n        }\n        store.put(\u0434\u0430\u043d\u043d\u044b\u0435, '\u0432\u0441\u0435');\n        await new Promise((res, rej) => { tx.oncomplete = res; tx.onerror = rej; });\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435('\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b', '\u0443\u0441\u043f\u0435\u0445');\n    } catch (e) {\n        console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:', e);\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u041e\u0448\u0438\u0431\u043a\u0443('\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438');\n    }\n}\n\nasync function \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438() {\n    try {\n        const db = await \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0411\u0414();\n        const tx = db.transaction(\u0425\u0420\u0410\u041d\u0418\u041b\u0418\u0429\u0415, 'readonly');\n        const store = tx.objectStore(\u0425\u0420\u0410\u041d\u0418\u041b\u0418\u0429\u0415);\n        const req = store.get('\u0432\u0441\u0435');\n        const \u0434\u0430\u043d\u043d\u044b\u0435 = await new Promise((res, rej) => { req.onsuccess = () => res(req.result); req.onerror = rej; });\n        if (!\u0434\u0430\u043d\u043d\u044b\u0435) return;\n        for (const id of \u041f\u041e\u041b\u042f_\u041d\u0410\u0421\u0422\u0420\u041e\u0415\u041a) {\n            const \u044d\u043b = document.getElementById(id);\n            if (!\u044d\u043b || !(id in \u0434\u0430\u043d\u043d\u044b\u0435)) continue;\n            if (\u044d\u043b.type === 'checkbox') {\n                \u044d\u043b.checked = \u0434\u0430\u043d\u043d\u044b\u0435[id];\n            } else {\n                \u044d\u043b.value = \u0434\u0430\u043d\u043d\u044b\u0435[id];\n            }\n        }\n    } catch (e) {\n        console.error('\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:', e);\n    }\n}\n\n\/\/ ==================== \u0412\u042b\u0413\u0420\u0423\u0417\u041a\u0410 ====================\n\nfunction \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044cCSS_\u0422\u0430\u0431\u043b\u0438\u0446\u044b() {\n    return `table {\n    width: 100%;\n    border-collapse: collapse;\n}\nth, td {\n    border: 1px solid #333;\n    padding: 8px;\n    text-align: left;\n    white-space: pre-wrap;\n}\nth {\n    background: #eee;\n}\n.phrase-text {\n    color: #006;\n}\n.play-btn {\n    display: inline;\n    padding: 0 3px;\n    margin-right: 3px;\n    cursor: pointer;\n    vertical-align: middle;\n    background: #e8f5e9;\n    border: 1px solid #4caf50;\n    border-radius: 2px;\n    line-height: 1;\n}\n.play-btn:hover {\n    background: #c8e6c9;\n}\n.play-btn svg {\n    display: inline-block;\n    vertical-align: middle;\n    width: 10px;\n    height: 10px;\n}`;\n}\n\nfunction \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044cJS_\u041e\u0437\u0432\u0443\u0447\u043a\u0438() {\n    \/\/ \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u043e\u0432 \u0438\u0437 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0432\n    const \u0433\u043e\u043b\u043e\u0441\u0430JSON = {};\n    const \u044f\u0437\u044b\u043a\u0438 = ['de', 'en', 'ru', 'fr', 'es', 'it'];\n    for (const lang of \u044f\u0437\u044b\u043a\u0438) {\n        const \u0441\u0435\u043b\u0435\u043a\u0442 = document.getElementById(`\u0433\u043e\u043b\u043e\u0441_${lang}`);\n        if (\u0441\u0435\u043b\u0435\u043a\u0442 && \u0441\u0435\u043b\u0435\u043a\u0442.value) {\n            \u0433\u043e\u043b\u043e\u0441\u0430JSON[lang] = \u0441\u0435\u043b\u0435\u043a\u0442.value;\n        }\n    }\n\n    return `var preferredVoices = ${JSON.stringify(\u041f\u0420\u0415\u0414\u041f\u041e\u0427\u0422\u0418\u0422\u0415\u041b\u042c\u041d\u042b\u0415_\u0413\u041e\u041b\u041e\u0421\u0410, null, 4)};\n\nvar savedVoices = ${JSON.stringify(\u0433\u043e\u043b\u043e\u0441\u0430JSON, null, 4)};\n\nvar voiceCache = {};\n\nfunction getVoice(lang) {\n    if (savedVoices[lang]) {\n        var voices = speechSynthesis.getVoices();\n        for (var i = 0; i < voices.length; i++) {\n            if (voices[i].name === savedVoices[lang]) return voices[i];\n        }\n    }\n    if (voiceCache[lang]) return voiceCache[lang];\n    var voices = speechSynthesis.getVoices();\n    var preferred = preferredVoices[lang] || [];\n    for (var i = 0; i < preferred.length; i++) {\n        for (var j = 0; j < voices.length; j++) {\n            if (voices[j].name === preferred[i]) {\n                voiceCache[lang] = voices[j];\n                return voices[j];\n            }\n        }\n    }\n    for (var k = 0; k < voices.length; k++) {\n        if (voices[k].lang.startsWith(lang)) {\n            voiceCache[lang] = voices[k];\n            return voices[k];\n        }\n    }\n    return null;\n}\n\nfunction speak(text, lang) {\n    speechSynthesis.cancel();\n    setTimeout(function() {\n        var utterance = new SpeechSynthesisUtterance(text);\n        var voice = getVoice(lang);\n        if (voice) utterance.voice = voice;\n        utterance.lang = lang;\n        utterance.rate = 0.9;\n        speechSynthesis.speak(utterance);\n    }, 50);\n}\n\nspeechSynthesis.onvoiceschanged = function() { voiceCache = {}; };`;\n}\n\nasync function \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0422\u0430\u0431\u043b\u0438\u0446\u0443() {\n    const \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 = document.getElementById('\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0422\u0430\u0431\u043b\u0438\u0446\u044b');\n    if (!\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.innerHTML.trim()) {\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u041e\u0448\u0438\u0431\u043a\u0443('\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435');\n        return;\n    }\n\n    const \u043d\u0443\u0436\u0435\u043dHTML = document.getElementById('\u0432\u044b\u0433\u0440HTML').checked;\n    const \u043d\u0443\u0436\u0435\u043dCSS = document.getElementById('\u0432\u044b\u0433CSS').checked;\n    const \u043d\u0443\u0436\u0435\u043dJS = document.getElementById('\u0432\u044b\u0433JS').checked;\n    const \u0441\u0436\u0430\u0442\u0430\u044f = document.getElementById('\u0432\u044b\u0433\u0421\u0436\u0430\u0442\u0430\u044f').checked;\n\n    const html\u0422\u0430\u0431\u043b\u0438\u0446\u044b = \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.innerHTML;\n    const css\u0422\u0430\u0431\u043b\u0438\u0446\u044b = \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044cCSS_\u0422\u0430\u0431\u043b\u0438\u0446\u044b();\n    const js\u041e\u0437\u0432\u0443\u0447\u043a\u0438 = \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044cJS_\u041e\u0437\u0432\u0443\u0447\u043a\u0438();\n\n    let \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 = '';\n\n    if (\u0441\u0436\u0430\u0442\u0430\u044f) {\n        \/\/ \u0424\u043e\u0440\u043c\u0430\u0442 2: \u0432\u0441\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435\n        if (\u043d\u0443\u0436\u0435\u043dCSS) \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += `<style>\\n${css\u0422\u0430\u0431\u043b\u0438\u0446\u044b}\\n<\/style>\\n\\n`;\n        if (\u043d\u0443\u0436\u0435\u043dHTML) \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += html\u0422\u0430\u0431\u043b\u0438\u0446\u044b + '\\n\\n';\n        if (\u043d\u0443\u0436\u0435\u043dJS) \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += `<script>\\n${js\u041e\u0437\u0432\u0443\u0447\u043a\u0438}\\n<\\\/script>`;\n    } else {\n        \/\/ \u0424\u043e\u0440\u043c\u0430\u0442 1: \u043f\u043e\u043b\u043d\u0430\u044f HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += '<!DOCTYPE html>\\n<html lang=\"ru\">\\n<head>\\n<meta charset=\"UTF-8\">\\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n<title>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0437\u0432\u0443\u0447\u043a\u043e\u0439<\/title>\\n';\n        if (\u043d\u0443\u0436\u0435\u043dCSS) \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += `<style>\\n${css\u0422\u0430\u0431\u043b\u0438\u0446\u044b}\\n<\/style>\\n`;\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += '<\/head>\\n<body>\\n';\n        if (\u043d\u0443\u0436\u0435\u043dHTML) \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += html\u0422\u0430\u0431\u043b\u0438\u0446\u044b + '\\n';\n        if (\u043d\u0443\u0436\u0435\u043dJS) \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += `<script>\\n${js\u041e\u0437\u0432\u0443\u0447\u043a\u0438}\\n<\\\/script>\\n`;\n        \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 += '<\/body>\\n<\/html>';\n    }\n\n    try {\n        await navigator.clipboard.writeText(\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442);\n        const \u0447\u0430\u0441\u0442\u0438 = [\u043d\u0443\u0436\u0435\u043dHTML && 'HTML', \u043d\u0443\u0436\u0435\u043dCSS && 'CSS', \u043d\u0443\u0436\u0435\u043dJS && 'JS'].filter(Boolean).join('+');\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435(`\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u0443\u0444\u0435\u0440 (${\u0447\u0430\u0441\u0442\u0438}, ${\u0441\u0436\u0430\u0442\u0430\u044f ? '\u0441\u0436\u0430\u0442\u0430\u044f' : '\u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430'})`, '\u0443\u0441\u043f\u0435\u0445');\n    } catch (e) {\n        \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u041e\u0448\u0438\u0431\u043a\u0443('\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440');\n    }\n}\n\n\/\/ ==================== \u0418\u041d\u0418\u0426\u0418\u0410\u041b\u0418\u0417\u0410\u0426\u0418\u042f ====================\n\nif (typeof document !== 'undefined') {\n    document.getElementById('\u043a\u043d\u043e\u043f\u043a\u0430\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0418\u0437\u0411\u0443\u0444\u0435\u0440\u0430').addEventListener('click', \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0418\u0437\u0411\u0443\u0444\u0435\u0440\u0430);\n    document.getElementById('\u043a\u043d\u043e\u043f\u043a\u0430\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c').addEventListener('click', \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\u0412\u0441\u0451);\n    document.getElementById('\u043a\u043d\u043e\u043f\u043a\u0430\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c').addEventListener('click', \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u0414\u0430\u043d\u043d\u044b\u0435);\n    document.getElementById('\u043a\u043d\u043e\u043f\u043a\u0430\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438').addEventListener('click', \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438);\n    document.getElementById('\u043a\u043d\u043e\u043f\u043a\u0430\u0412\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c').addEventListener('click', \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0422\u0430\u0431\u043b\u0438\u0446\u0443);\n    \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438();\n}\n\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>v1 \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 JSON\/CSV \u0414\u0430\u043d\u043d\u044b\u0435 (JSON \u0438\u043b\u0438 CSV): \u042f\u0437\u044b\u043a\u0438: de + ruen + ru CSV: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u2014 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c CSV: \u042d\u043a\u0440\u0430\u043d \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f: \u0421\u0438\u043c\u0432\u043e\u043b \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0432\u0443\u043a\u0430: \u0421\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430 \u0437\u0432\u0443\u043a\u0430: \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0413\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u043e\u043b\u043e\u0441\u043e\u0432 \u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439 (de): \u0410\u0432\u0442\u043e \u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 (en): \u0410\u0432\u0442\u043e \u0420\u0443\u0441\u0441\u043a\u0438\u0439 (ru): \u0410\u0432\u0442\u043e \u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439 (fr): \u0410\u0432\u0442\u043e \u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439 (es):&hellip;&nbsp;<a href=\"https:\/\/1.cbm.ua\/?page_id=9068\" rel=\"bookmark\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &raquo;<span class=\"screen-reader-text\">v1 \u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0437\u0432\u0443\u0447\u043a\u043e\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0441\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0433\u043b\u0430\u0433\u043e\u043b\u0430\u043c\u0438). \u0426\u0435\u043b\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c \u0438 \u043f\u043e\u0442\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430.<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"class_list":["post-9068","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/pages\/9068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9068"}],"version-history":[{"count":9,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/pages\/9068\/revisions"}],"predecessor-version":[{"id":9137,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/pages\/9068\/revisions\/9137"}],"wp:attachment":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}