{"id":19,"date":"2026-08-16T22:55:18","date_gmt":"2026-08-16T22:55:18","guid":{"rendered":"https:\/\/tulpar-agro-logistics.kz\/?page_id=19"},"modified":"2026-08-16T23:11:30","modified_gmt":"2026-08-16T23:11:30","slug":"elementor-%d1%81%d1%82%d1%80%d0%b0%d0%bd%d0%b8%d1%86%d0%b0-19","status":"publish","type":"page","link":"https:\/\/tulpar-agro-logistics.kz\/","title":{"rendered":"Elementor \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 #19"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"19\" class=\"elementor elementor-19\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4af7cad e-con e-atomic-element e-flexbox-base e-ecddf1a \" data-id=\"4af7cad\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"4af7cad\">\n    \t\t<div class=\"elementor-element elementor-element-9896c4d elementor-widget elementor-widget-html\" data-id=\"9896c4d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"kk\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\r\n\r\n<title>QAZAQ CARGO \u2014 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443<\/title>\r\n\r\n<style>\r\n*{\r\n    box-sizing:border-box;\r\n    margin:0;\r\n    padding:0;\r\n}\r\n\r\nbody{\r\n    font-family:Arial,Helvetica,sans-serif;\r\n    background:#f4f6f8;\r\n    color:#1f2937;\r\n}\r\n\r\nbutton,input,select,textarea{\r\n    font-family:inherit;\r\n}\r\n\r\nbutton{\r\n    cursor:pointer;\r\n}\r\n\r\n.hidden{\r\n    display:none!important;\r\n}\r\n\r\nheader{\r\n    height:70px;\r\n    background:#111827;\r\n    color:white;\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:space-between;\r\n    padding:0 28px;\r\n    position:sticky;\r\n    top:0;\r\n    z-index:1000;\r\n    box-shadow:0 3px 15px rgba(0,0,0,.2);\r\n}\r\n\r\n.logo{\r\n    font-size:23px;\r\n    font-weight:900;\r\n    color:#f59e0b;\r\n}\r\n\r\n.logo span{\r\n    color:white;\r\n}\r\n\r\nnav{\r\n    display:flex;\r\n    gap:5px;\r\n}\r\n\r\nnav button{\r\n    background:transparent;\r\n    color:#d1d5db;\r\n    border:0;\r\n    padding:10px 13px;\r\n    border-radius:7px;\r\n}\r\n\r\nnav button:hover{\r\n    background:#1f2937;\r\n    color:white;\r\n}\r\n\r\n.container{\r\n    max-width:1400px;\r\n    margin:auto;\r\n    padding:25px;\r\n}\r\n\r\n.page{\r\n    display:none;\r\n}\r\n\r\n.page.active{\r\n    display:block;\r\n}\r\n\r\n.hero{\r\n    background:linear-gradient(135deg,#111827,#26364d);\r\n    color:white;\r\n    padding:45px;\r\n    border-radius:18px;\r\n    margin-bottom:25px;\r\n}\r\n\r\n.hero h1{\r\n    font-size:38px;\r\n    margin-bottom:12px;\r\n}\r\n\r\n.hero p{\r\n    color:#d1d5db;\r\n}\r\n\r\n.card{\r\n    background:white;\r\n    padding:23px;\r\n    border-radius:14px;\r\n    box-shadow:0 3px 15px rgba(0,0,0,.06);\r\n    margin-bottom:20px;\r\n}\r\n\r\n.card h2{\r\n    margin-bottom:18px;\r\n}\r\n\r\n.form-grid{\r\n    display:grid;\r\n    grid-template-columns:repeat(3,1fr);\r\n    gap:15px;\r\n}\r\n\r\n.form-group{\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap:7px;\r\n}\r\n\r\n.form-group.full{\r\n    grid-column:1\/-1;\r\n}\r\n\r\nlabel{\r\n    font-size:13px;\r\n    font-weight:700;\r\n    color:#4b5563;\r\n}\r\n\r\ninput,select,textarea{\r\n    border:1px solid #d1d5db;\r\n    border-radius:9px;\r\n    padding:12px;\r\n    outline:none;\r\n    width:100%;\r\n}\r\n\r\ninput:focus,\r\nselect:focus,\r\ntextarea:focus{\r\n    border-color:#f59e0b;\r\n    box-shadow:0 0 0 3px rgba(245,158,11,.1);\r\n}\r\n\r\ntextarea{\r\n    min-height:100px;\r\n}\r\n\r\n.btn{\r\n    border:0;\r\n    padding:12px 18px;\r\n    border-radius:9px;\r\n    font-weight:700;\r\n}\r\n\r\n.btn-primary{\r\n    background:#f59e0b;\r\n    color:#111827;\r\n}\r\n\r\n.btn-dark{\r\n    background:#111827;\r\n    color:white;\r\n}\r\n\r\n.btn-green{\r\n    background:#16a34a;\r\n    color:white;\r\n}\r\n\r\n.btn-red{\r\n    background:#dc2626;\r\n    color:white;\r\n}\r\n\r\n.btn-gray{\r\n    background:#e5e7eb;\r\n    color:#111827;\r\n}\r\n\r\n.actions{\r\n    display:flex;\r\n    gap:10px;\r\n    flex-wrap:wrap;\r\n    margin-top:20px;\r\n}\r\n\r\n.auth-box{\r\n    max-width:650px;\r\n    margin:45px auto;\r\n}\r\n\r\n.eds-login{\r\n    border:2px solid #f59e0b;\r\n    background:#fffbeb;\r\n    border-radius:14px;\r\n    padding:25px;\r\n    margin-bottom:20px;\r\n}\r\n\r\n.eds-icon{\r\n    font-size:50px;\r\n    margin-bottom:12px;\r\n}\r\n\r\n.eds-title{\r\n    font-size:24px;\r\n    font-weight:900;\r\n    margin-bottom:8px;\r\n}\r\n\r\n.eds-description{\r\n    color:#6b7280;\r\n    line-height:1.5;\r\n    margin-bottom:20px;\r\n}\r\n\r\n.status-box{\r\n    background:#f9fafb;\r\n    border-radius:10px;\r\n    padding:15px;\r\n    margin-top:15px;\r\n    display:none;\r\n}\r\n\r\n.status-box.show{\r\n    display:block;\r\n}\r\n\r\n.cert-data{\r\n    display:grid;\r\n    grid-template-columns:1fr 1fr;\r\n    gap:10px;\r\n    margin-top:15px;\r\n}\r\n\r\n.cert-item{\r\n    background:#f9fafb;\r\n    padding:12px;\r\n    border-radius:8px;\r\n}\r\n\r\n.cert-item small{\r\n    color:#6b7280;\r\n    display:block;\r\n    margin-bottom:4px;\r\n}\r\n\r\n.transport-list{\r\n    display:grid;\r\n    grid-template-columns:repeat(2,1fr);\r\n    gap:18px;\r\n}\r\n\r\n.transport-card{\r\n    background:white;\r\n    padding:20px;\r\n    border-radius:14px;\r\n    border-left:5px solid #f59e0b;\r\n    box-shadow:0 3px 15px rgba(0,0,0,.06);\r\n}\r\n\r\n.route{\r\n    font-size:20px;\r\n    font-weight:900;\r\n    margin-bottom:12px;\r\n}\r\n\r\n.arrow{\r\n    color:#f59e0b;\r\n    margin:0 8px;\r\n}\r\n\r\n.info-grid{\r\n    display:grid;\r\n    grid-template-columns:1fr 1fr;\r\n    gap:9px;\r\n    margin-top:15px;\r\n}\r\n\r\n.info-item{\r\n    background:#f9fafb;\r\n    padding:10px;\r\n    border-radius:8px;\r\n}\r\n\r\n.info-item small{\r\n    display:block;\r\n    color:#6b7280;\r\n    font-size:11px;\r\n    margin-bottom:3px;\r\n}\r\n\r\n.price{\r\n    font-size:22px;\r\n    font-weight:900;\r\n}\r\n\r\n.status{\r\n    display:inline-block;\r\n    padding:5px 9px;\r\n    border-radius:20px;\r\n    font-size:11px;\r\n    font-weight:800;\r\n}\r\n\r\n.pending{\r\n    background:#fef3c7;\r\n    color:#92400e;\r\n}\r\n\r\n.approved{\r\n    background:#dcfce7;\r\n    color:#166534;\r\n}\r\n\r\n.rejected{\r\n    background:#fee2e2;\r\n    color:#991b1b;\r\n}\r\n\r\n.blocked{\r\n    background:#e5e7eb;\r\n    color:#374151;\r\n}\r\n\r\n.stats{\r\n    display:grid;\r\n    grid-template-columns:repeat(4,1fr);\r\n    gap:15px;\r\n    margin-bottom:20px;\r\n}\r\n\r\n.stat{\r\n    background:white;\r\n    padding:20px;\r\n    border-radius:14px;\r\n    box-shadow:0 3px 15px rgba(0,0,0,.05);\r\n}\r\n\r\n.stat-title{\r\n    color:#6b7280;\r\n    font-size:13px;\r\n}\r\n\r\n.stat-number{\r\n    font-size:30px;\r\n    font-weight:900;\r\n    margin-top:7px;\r\n}\r\n\r\n.table-wrapper{\r\n    overflow:auto;\r\n}\r\n\r\ntable{\r\n    width:100%;\r\n    border-collapse:collapse;\r\n    min-width:850px;\r\n}\r\n\r\nth,td{\r\n    padding:12px;\r\n    border-bottom:1px solid #e5e7eb;\r\n    text-align:left;\r\n    font-size:13px;\r\n}\r\n\r\nth{\r\n    background:#f9fafb;\r\n}\r\n\r\n.empty{\r\n    text-align:center;\r\n    padding:45px;\r\n    color:#6b7280;\r\n}\r\n\r\n.modal{\r\n    display:none;\r\n    position:fixed;\r\n    inset:0;\r\n    background:rgba(0,0,0,.55);\r\n    z-index:3000;\r\n    align-items:center;\r\n    justify-content:center;\r\n    padding:20px;\r\n}\r\n\r\n.modal.show{\r\n    display:flex;\r\n}\r\n\r\n.modal-box{\r\n    background:white;\r\n    max-width:650px;\r\n    width:100%;\r\n    max-height:90vh;\r\n    overflow:auto;\r\n    border-radius:15px;\r\n    padding:25px;\r\n}\r\n\r\n.modal-header{\r\n    display:flex;\r\n    justify-content:space-between;\r\n    margin-bottom:20px;\r\n}\r\n\r\n.close{\r\n    border:0;\r\n    width:35px;\r\n    height:35px;\r\n    border-radius:50%;\r\n    background:#eee;\r\n    font-size:20px;\r\n}\r\n\r\n.toast{\r\n    position:fixed;\r\n    right:20px;\r\n    bottom:20px;\r\n    background:#111827;\r\n    color:white;\r\n    padding:15px 20px;\r\n    border-radius:10px;\r\n    display:none;\r\n    z-index:5000;\r\n}\r\n\r\n.toast.show{\r\n    display:block;\r\n}\r\n\r\nfooter{\r\n    margin-top:50px;\r\n    background:#111827;\r\n    color:#9ca3af;\r\n    text-align:center;\r\n    padding:35px;\r\n}\r\n\r\n@media(max-width:1000px){\r\n\r\n    .form-grid{\r\n        grid-template-columns:1fr 1fr;\r\n    }\r\n\r\n    .transport-list{\r\n        grid-template-columns:1fr;\r\n    }\r\n\r\n    .stats{\r\n        grid-template-columns:1fr 1fr;\r\n    }\r\n\r\n}\r\n\r\n@media(max-width:650px){\r\n\r\n    header{\r\n        height:auto;\r\n        padding:12px;\r\n        flex-wrap:wrap;\r\n        gap:10px;\r\n    }\r\n\r\n    nav{\r\n        width:100%;\r\n        overflow:auto;\r\n        order:3;\r\n    }\r\n\r\n    .container{\r\n        padding:15px;\r\n    }\r\n\r\n    .hero{\r\n        padding:25px;\r\n    }\r\n\r\n    .hero h1{\r\n        font-size:28px;\r\n    }\r\n\r\n    .form-grid{\r\n        grid-template-columns:1fr;\r\n    }\r\n\r\n    .stats{\r\n        grid-template-columns:1fr 1fr;\r\n    }\r\n\r\n    .cert-data{\r\n        grid-template-columns:1fr;\r\n    }\r\n\r\n}\r\n<\/style>\r\n<\/head>\r\n\r\n<body>\r\n\r\n<header>\r\n\r\n    <div class=\"logo\">\r\n        QAZAQ <span>CARGO<\/span>\r\n    <\/div>\r\n\r\n    <nav>\r\n\r\n        <button onclick=\"showPage('home')\">\r\n            \ud83c\udfe0 \u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442\r\n        <\/button>\r\n\r\n        <button onclick=\"showPage('transport')\">\r\n            \ud83d\ude9b \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\r\n        <\/button>\r\n\r\n        <button onclick=\"showPage('add')\">\r\n            \u2795 \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u049b\u043e\u0441\u0443\r\n        <\/button>\r\n\r\n        <button onclick=\"showPage('cabinet')\">\r\n            \ud83d\udc64 \u041a\u0430\u0431\u0438\u043d\u0435\u0442\r\n        <\/button>\r\n\r\n        <button\r\n            id=\"adminButton\"\r\n            class=\"hidden\"\r\n            onclick=\"showPage('admin')\">\r\n            \ud83d\udee0 Admin\r\n        <\/button>\r\n\r\n    <\/nav>\r\n\r\n    <div>\r\n\r\n        <span id=\"headerUser\">\r\n            \u049a\u043e\u043d\u0430\u049b\r\n        <\/span>\r\n\r\n        <button\r\n            id=\"headerLogin\"\r\n            class=\"btn btn-primary\"\r\n            onclick=\"showPage('login')\">\r\n            \u041a\u0456\u0440\u0443\r\n        <\/button>\r\n\r\n        <button\r\n            id=\"headerLogout\"\r\n            class=\"btn btn-gray hidden\"\r\n            onclick=\"logout()\">\r\n            \u0428\u044b\u0493\u0443\r\n        <\/button>\r\n\r\n    <\/div>\r\n\r\n<\/header>\r\n\r\n\r\n<main class=\"container\">\r\n\r\n\r\n<!-- HOME -->\r\n\r\n<section id=\"home\" class=\"page active\">\r\n\r\n    <div class=\"hero\">\r\n\r\n        <h1>\ud83d\ude9b QAZAQ CARGO<\/h1>\r\n\r\n        <p>\r\n            \u049a\u0430\u0437\u0430\u049b\u0441\u0442\u0430\u043d \u0436\u04d9\u043d\u0435 \u0445\u0430\u043b\u044b\u049b\u0430\u0440\u0430\u043b\u044b\u049b \u0431\u0430\u0493\u044b\u0442\u0442\u0430\u0440 \u0431\u043e\u0439\u044b\u043d\u0448\u0430\r\n            \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043f\u0435\u043d \u0436\u04af\u043a \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0430\u0442\u044b\u043d\r\n            \u043e\u043d\u043b\u0430\u0439\u043d \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430.\r\n        <\/p>\r\n\r\n        <div class=\"actions\">\r\n\r\n            <button\r\n                class=\"btn btn-primary\"\r\n                onclick=\"showPage('transport')\">\r\n                \ud83d\ude9b \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0456\u0437\u0434\u0435\u0443\r\n            <\/button>\r\n\r\n            <button\r\n                class=\"btn btn-gray\"\r\n                onclick=\"showPage('add')\">\r\n                \u2795 \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0436\u0430\u0440\u0438\u044f\u043b\u0430\u0443\r\n            <\/button>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"card\">\r\n\r\n        <h2>\ud83d\udd10 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u0430\u0443\u0456\u043f\u0441\u0456\u0437 \u043a\u0456\u0440\u0443<\/h2>\r\n\r\n        <p style=\"color:#6b7280;line-height:1.6\">\r\n\r\n            \u049a\u0430\u0437\u0430\u049b\u0441\u0442\u0430\u043d\u043d\u044b\u04a3 \u04b0\u043b\u0442\u0442\u044b\u049b \u043a\u0443\u04d9\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u0448\u044b \u043e\u0440\u0442\u0430\u043b\u044b\u0493\u044b\u043d\u044b\u04a3\r\n            \u042d\u0426\u049a-\u0441\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u0436\u04af\u0439\u0435\u0433\u0435 \u043a\u0456\u0440\u0456\u04a3\u0456\u0437.\r\n\r\n            AUTH_RSA \u043a\u0456\u043b\u0442\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0436\u0430\u0441\u0430\u0443\u0493\u0430 \u0431\u043e\u043b\u0430\u0434\u044b.\r\n\r\n        <\/p>\r\n\r\n        <div class=\"actions\">\r\n\r\n            <button\r\n                class=\"btn btn-primary\"\r\n                onclick=\"showPage('login')\">\r\n                \ud83d\udd10 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\r\n            <\/button>\r\n\r\n            <a\r\n                href=\"https:\/\/ncl.pki.gov.kz\/\"\r\n                target=\"_blank\"\r\n                class=\"btn btn-gray\">\r\n                NCALayer \u043e\u0440\u043d\u0430\u0442\u0443\r\n            <\/a>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"stats\">\r\n\r\n        <div class=\"stat\">\r\n\r\n            <div class=\"stat-title\">\r\n                \u0411\u0430\u0440\u043b\u044b\u049b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\r\n            <\/div>\r\n\r\n            <div\r\n                id=\"totalTransport\"\r\n                class=\"stat-number\">\r\n                0\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n        <div class=\"stat\">\r\n\r\n            <div class=\"stat-title\">\r\n                \u041e\u0434\u043e\u0431\u0440\u0435\u043d\u043e\r\n            <\/div>\r\n\r\n            <div\r\n                id=\"approvedTransport\"\r\n                class=\"stat-number\">\r\n                0\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n        <div class=\"stat\">\r\n\r\n            <div class=\"stat-title\">\r\n                \u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\r\n            <\/div>\r\n\r\n            <div\r\n                id=\"totalUsers\"\r\n                class=\"stat-number\">\r\n                0\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n        <div class=\"stat\">\r\n\r\n            <div class=\"stat-title\">\r\n                \u041a\u04af\u0442\u0443\u0434\u0435\r\n            <\/div>\r\n\r\n            <div\r\n                id=\"pendingTransport\"\r\n                class=\"stat-number\">\r\n                0\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- LOGIN -->\r\n\r\n<section id=\"login\" class=\"page\">\r\n\r\n    <div class=\"auth-box\">\r\n\r\n        <div class=\"card\">\r\n\r\n            <div class=\"eds-login\">\r\n\r\n                <div class=\"eds-icon\">\r\n                    \ud83d\udd10\r\n                <\/div>\r\n\r\n                <div class=\"eds-title\">\r\n                    \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\r\n                <\/div>\r\n\r\n                <div class=\"eds-description\">\r\n\r\n                    NCALayer \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u0431\u043e\u043b\u0443\u044b \u043a\u0435\u0440\u0435\u043a.\r\n\r\n                    \u00ab\u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\u00bb \u0431\u0430\u0442\u044b\u0440\u043c\u0430\u0441\u044b\u043d \u0431\u0430\u0441\u049b\u0430\u043d\u043d\u0430\u043d\r\n                    \u043a\u0435\u0439\u0456\u043d \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0435\u0433\u0456 \u042d\u0426\u049a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b\u043d\r\n                    \u0442\u0430\u04a3\u0434\u0430\u043f, PIN-\u043a\u043e\u0434 \u0435\u043d\u0433\u0456\u0437\u0435\u0441\u0456\u0437.\r\n\r\n                <\/div>\r\n\r\n                <button\r\n                    id=\"edsLoginButton\"\r\n                    class=\"btn btn-primary\"\r\n                    style=\"width:100%\"\r\n                    onclick=\"loginWithEDS()\">\r\n\r\n                    \ud83d\udd10 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\r\n\r\n                <\/button>\r\n\r\n\r\n                <div\r\n                    id=\"ncaStatus\"\r\n                    class=\"status-box\">\r\n\r\n                    <strong id=\"ncaStatusTitle\">\r\n                        NCALayer \u0442\u0435\u043a\u0441\u0435\u0440\u0456\u043b\u0443\u0434\u0435...\r\n                    <\/strong>\r\n\r\n                    <p\r\n                        id=\"ncaStatusText\"\r\n                        style=\"\r\n                        margin-top:7px;\r\n                        color:#6b7280\">\r\n                    <\/p>\r\n\r\n                <\/div>\r\n\r\n\r\n                <div\r\n                    id=\"certificateBox\"\r\n                    class=\"status-box\">\r\n\r\n                    <strong>\r\n                        \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\r\n                    <\/strong>\r\n\r\n                    <div class=\"cert-data\">\r\n\r\n                        <div class=\"cert-item\">\r\n\r\n                            <small>\r\n                                \u0418\u0418\u041d \/ \u0411\u0418\u041d\r\n                            <\/small>\r\n\r\n                            <strong\r\n                                id=\"certIin\">\r\n                                -\r\n                            <\/strong>\r\n\r\n                        <\/div>\r\n\r\n                        <div class=\"cert-item\">\r\n\r\n                            <small>\r\n                                \u0410\u0442\u044b-\u0436\u04e9\u043d\u0456\r\n                            <\/small>\r\n\r\n                            <strong\r\n                                id=\"certName\">\r\n                                -\r\n                            <\/strong>\r\n\r\n                        <\/div>\r\n\r\n                        <div class=\"cert-item\">\r\n\r\n                            <small>\r\n                                Email\r\n                            <\/small>\r\n\r\n                            <strong\r\n                                id=\"certEmail\">\r\n                                -\r\n                            <\/strong>\r\n\r\n                        <\/div>\r\n\r\n                        <div class=\"cert-item\">\r\n\r\n                            <small>\r\n                                \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\r\n                            <\/small>\r\n\r\n                            <strong\r\n                                id=\"certSubject\">\r\n                                -\r\n                            <\/strong>\r\n\r\n                        <\/div>\r\n\r\n                    <\/div>\r\n\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n\r\n            <div style=\"\r\n                text-align:center;\r\n                color:#9ca3af;\r\n                margin:15px 0\">\r\n                \u043d\u0435\u043c\u0435\u0441\u0435\r\n            <\/div>\r\n\r\n\r\n            <form id=\"emailLoginForm\">\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        Email\r\n                    <\/label>\r\n\r\n                    <input\r\n                        id=\"emailLogin\"\r\n                        type=\"email\"\r\n                        required>\r\n\r\n                <\/div>\r\n\r\n                <br>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\r\n                    <\/label>\r\n\r\n                    <input\r\n                        id=\"passwordLogin\"\r\n                        type=\"password\"\r\n                        required>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"actions\">\r\n\r\n                    <button\r\n                        class=\"btn btn-dark\"\r\n                        type=\"submit\">\r\n\r\n                        Email \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\r\n\r\n                    <\/button>\r\n\r\n                <\/div>\r\n\r\n            <\/form>\r\n\r\n\r\n            <hr\r\n                style=\"\r\n                margin:25px 0;\r\n                border:0;\r\n                border-top:1px solid #eee\">\r\n\r\n\r\n            <p style=\"\r\n                text-align:center;\r\n                color:#6b7280\">\r\n\r\n                \u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b\u04a3\u044b\u0437 \u0436\u043e\u049b \u043f\u0430?\r\n\r\n                <button\r\n                    class=\"btn btn-primary\"\r\n                    onclick=\"showPage('register')\">\r\n\r\n                    \u0422\u0456\u0440\u043a\u0435\u043b\u0443\r\n\r\n                <\/button>\r\n\r\n            <\/p>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- REGISTER -->\r\n\r\n<section id=\"register\" class=\"page\">\r\n\r\n    <div class=\"auth-box\">\r\n\r\n        <div class=\"card\">\r\n\r\n            <h2>\r\n                \ud83d\udcdd \u0422\u0456\u0440\u043a\u0435\u043b\u0443\r\n            <\/h2>\r\n\r\n            <form id=\"registerForm\">\r\n\r\n                <div class=\"form-grid\">\r\n\r\n                    <div class=\"form-group\">\r\n\r\n                        <label>\r\n                            \u0410\u0442\u044b-\u0436\u04e9\u043d\u0456\r\n                        <\/label>\r\n\r\n                        <input\r\n                            id=\"regName\"\r\n                            required>\r\n\r\n                    <\/div>\r\n\r\n                    <div class=\"form-group\">\r\n\r\n                        <label>\r\n                            \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\r\n                        <\/label>\r\n\r\n                        <input\r\n                            id=\"regCompany\">\r\n\r\n                    <\/div>\r\n\r\n                    <div class=\"form-group\">\r\n\r\n                        <label>\r\n                            \u0422\u0435\u043b\u0435\u0444\u043e\u043d\r\n                        <\/label>\r\n\r\n                        <input\r\n                            id=\"regPhone\">\r\n\r\n                    <\/div>\r\n\r\n                    <div class=\"form-group\">\r\n\r\n                        <label>\r\n                            Email\r\n                        <\/label>\r\n\r\n                        <input\r\n                            id=\"regEmail\"\r\n                            type=\"email\"\r\n                            required>\r\n\r\n                    <\/div>\r\n\r\n                    <div class=\"form-group\">\r\n\r\n                        <label>\r\n                            \u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\r\n                        <\/label>\r\n\r\n                        <input\r\n                            id=\"regPassword\"\r\n                            type=\"password\"\r\n                            minlength=\"6\"\r\n                            required>\r\n\r\n                    <\/div>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"actions\">\r\n\r\n                    <button\r\n                        class=\"btn btn-primary\"\r\n                        type=\"submit\">\r\n\r\n                        \u0422\u0456\u0440\u043a\u0435\u043b\u0443\r\n\r\n                    <\/button>\r\n\r\n                <\/div>\r\n\r\n            <\/form>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- TRANSPORT -->\r\n\r\n<section id=\"transport\" class=\"page\">\r\n\r\n    <div class=\"card\">\r\n\r\n        <h2>\r\n            \ud83d\udd0e \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0456\u0437\u0434\u0435\u0443\r\n        <\/h2>\r\n\r\n        <div class=\"form-grid\">\r\n\r\n            <div class=\"form-group\">\r\n\r\n                <label>\r\n                    \u041e\u0442\u043a\u0443\u0434\u0430\r\n                <\/label>\r\n\r\n                <input\r\n                    id=\"searchFrom\"\r\n                    placeholder=\"\u0410\u043b\u043c\u0430\u0442\u044b\">\r\n\r\n            <\/div>\r\n\r\n            <div class=\"form-group\">\r\n\r\n                <label>\r\n                    \u041a\u0443\u0434\u0430\r\n                <\/label>\r\n\r\n                <input\r\n                    id=\"searchTo\"\r\n                    placeholder=\"\u0422\u0430\u0448\u043a\u0435\u043d\u0442\">\r\n\r\n            <\/div>\r\n\r\n            <div class=\"form-group\">\r\n\r\n                <label>\r\n                    \u041a\u0443\u0437\u043e\u0432\r\n                <\/label>\r\n\r\n                <select id=\"searchBody\">\r\n\r\n                    <option value=\"\">\r\n                        \u0411\u0430\u0440\u043b\u044b\u0493\u044b\r\n                    <\/option>\r\n\r\n                    <option>\u0422\u0435\u043d\u0442<\/option>\r\n                    <option>\u0420\u0435\u0444\u0440\u0438\u0436\u0435\u0440\u0430\u0442\u043e\u0440<\/option>\r\n                    <option>\u0418\u0437\u043e\u0442\u0435\u0440\u043c<\/option>\r\n                    <option>\u0411\u043e\u0440\u0442<\/option>\r\n                    <option>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\u043e\u0437<\/option>\r\n                    <option>\u0421\u0430\u043c\u043e\u0441\u0432\u0430\u043b<\/option>\r\n                    <option>\u0426\u0438\u0441\u0442\u0435\u0440\u043d\u0430<\/option>\r\n\r\n                <\/select>\r\n\r\n            <\/div>\r\n\r\n            <div class=\"form-group\">\r\n\r\n                <label>\r\n                    \u041c\u0438\u043d. \u0442\u043e\u043d\u043d\u0430\r\n                <\/label>\r\n\r\n                <input\r\n                    id=\"searchWeight\"\r\n                    type=\"number\">\r\n\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n        <div class=\"actions\">\r\n\r\n            <button\r\n                class=\"btn btn-primary\"\r\n                onclick=\"searchTransport()\">\r\n\r\n                \ud83d\udd0e \u0406\u0437\u0434\u0435\u0443\r\n\r\n            <\/button>\r\n\r\n            <button\r\n                class=\"btn btn-gray\"\r\n                onclick=\"loadTransports()\">\r\n\r\n                \u0411\u0430\u0440\u043b\u044b\u0493\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443\r\n\r\n            <\/button>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n        id=\"transportList\"\r\n        class=\"transport-list\">\r\n\r\n    <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ADD -->\r\n\r\n<section id=\"add\" class=\"page\">\r\n\r\n    <div class=\"card\">\r\n\r\n        <h2>\r\n            \u2795 \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0436\u0430\u0440\u0438\u044f\u043b\u0430\u0443\r\n        <\/h2>\r\n\r\n        <div\r\n            id=\"addLoginMessage\"\r\n            class=\"empty hidden\">\r\n\r\n            <h3>\r\n                \u0410\u043b\u0434\u044b\u043c\u0435\u043d \u0436\u04af\u0439\u0435\u0433\u0435 \u043a\u0456\u0440\u0456\u04a3\u0456\u0437\r\n            <\/h3>\r\n\r\n            <br>\r\n\r\n            <button\r\n                class=\"btn btn-primary\"\r\n                onclick=\"showPage('login')\">\r\n\r\n                \ud83d\udd10 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\r\n\r\n            <\/button>\r\n\r\n        <\/div>\r\n\r\n\r\n        <form id=\"transportForm\">\r\n\r\n            <div class=\"form-grid\">\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u041e\u0442\u043a\u0443\u0434\u0430 *<\/label>\r\n                    <input id=\"tFrom\" required>\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u041a\u0443\u0434\u0430 *<\/label>\r\n                    <input id=\"tTo\" required>\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u0414\u0430\u0442\u0430 *<\/label>\r\n                    <input id=\"tDate\" type=\"date\" required>\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u041a\u0443\u0437\u043e\u0432 *\r\n                    <\/label>\r\n\r\n                    <select id=\"tBody\" required>\r\n\r\n                        <option value=\"\">\r\n                            \u0422\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437\r\n                        <\/option>\r\n\r\n                        <option>\u0422\u0435\u043d\u0442<\/option>\r\n                        <option>\u0420\u0435\u0444\u0440\u0438\u0436\u0435\u0440\u0430\u0442\u043e\u0440<\/option>\r\n                        <option>\u0418\u0437\u043e\u0442\u0435\u0440\u043c<\/option>\r\n                        <option>\u0411\u043e\u0440\u0442<\/option>\r\n                        <option>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\u043e\u0437<\/option>\r\n                        <option>\u0421\u0430\u043c\u043e\u0441\u0432\u0430\u043b<\/option>\r\n                        <option>\u0426\u0438\u0441\u0442\u0435\u0440\u043d\u0430<\/option>\r\n\r\n                    <\/select>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u0413\u0440\u0443\u0437\u043e\u043f\u043e\u0434\u044a\u0451\u043c\u043d\u043e\u0441\u0442\u044c, \u0442 *<\/label>\r\n                    <input id=\"tWeight\" type=\"number\" step=\"0.1\" required>\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u041e\u0431\u044a\u0451\u043c, \u043c\u00b3<\/label>\r\n                    <input id=\"tVolume\" type=\"number\">\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u0413\u043e\u0441\u043d\u043e\u043c\u0435\u0440<\/label>\r\n                    <input id=\"tNumber\">\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u0421\u0442\u0430\u0432\u043a\u0430<\/label>\r\n                    <input id=\"tPrice\" type=\"number\">\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u0412\u0430\u043b\u044e\u0442\u0430\r\n                    <\/label>\r\n\r\n                    <select id=\"tCurrency\">\r\n\r\n                        <option>\u0442\u0435\u043d\u0433\u0435<\/option>\r\n                        <option>USD<\/option>\r\n                        <option>RUB<\/option>\r\n                        <option>UZS<\/option>\r\n                        <option>CNY<\/option>\r\n\r\n                    <\/select>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u0416\u04af\u0440\u0433\u0456\u0437\u0443\u0448\u0456<\/label>\r\n                    <input id=\"tDriver\">\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u0422\u0435\u043b\u0435\u0444\u043e\u043d<\/label>\r\n                    <input id=\"tPhone\">\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        GPS\r\n                    <\/label>\r\n\r\n                    <select id=\"tGps\">\r\n\r\n                        <option>\u0418\u04d9<\/option>\r\n                        <option>\u0416\u043e\u049b<\/option>\r\n\r\n                    <\/select>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        ADR\r\n                    <\/label>\r\n\r\n                    <select id=\"tAdr\">\r\n\r\n                        <option>\u0416\u043e\u049b<\/option>\r\n                        <option>\u0418\u04d9<\/option>\r\n\r\n                    <\/select>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group full\">\r\n\r\n                    <label>\r\n                        \u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u0430\u049b\u043f\u0430\u0440\u0430\u0442\r\n                    <\/label>\r\n\r\n                    <textarea\r\n                        id=\"tDescription\">\r\n                    <\/textarea>\r\n\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n\r\n            <div class=\"actions\">\r\n\r\n                <button\r\n                    class=\"btn btn-primary\"\r\n                    type=\"submit\">\r\n\r\n                    \ud83d\ude9b \u0416\u0430\u0440\u0438\u044f\u043b\u0430\u0443\r\n\r\n                <\/button>\r\n\r\n            <\/div>\r\n\r\n        <\/form>\r\n\r\n    <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- CABINET -->\r\n\r\n<section id=\"cabinet\" class=\"page\">\r\n\r\n    <div\r\n        id=\"cabinetGuest\"\r\n        class=\"card\">\r\n\r\n        <div class=\"empty\">\r\n\r\n            <h2>\r\n                \ud83d\udc64 \u0416\u0435\u043a\u0435 \u043a\u0430\u0431\u0438\u043d\u0435\u0442\r\n            <\/h2>\r\n\r\n            <br>\r\n\r\n            <button\r\n                class=\"btn btn-primary\"\r\n                onclick=\"showPage('login')\">\r\n\r\n                \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\r\n\r\n            <\/button>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n        id=\"cabinetUser\"\r\n        class=\"hidden\">\r\n\r\n        <div class=\"card\">\r\n\r\n            <h2>\r\n                \ud83d\udc64 \u041f\u0440\u043e\u0444\u0438\u043b\u044c\r\n            <\/h2>\r\n\r\n            <div class=\"form-grid\">\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u0418\u0418\u041d \/ \u0411\u0418\u041d\r\n                    <\/label>\r\n\r\n                    <input\r\n                        id=\"profileIin\"\r\n                        disabled>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u0410\u0442\u044b-\u0436\u04e9\u043d\u0456\r\n                    <\/label>\r\n\r\n                    <input id=\"profileName\">\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\r\n                    <\/label>\r\n\r\n                    <input id=\"profileCompany\">\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u0422\u0435\u043b\u0435\u0444\u043e\u043d\r\n                    <\/label>\r\n\r\n                    <input id=\"profilePhone\">\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        Email\r\n                    <\/label>\r\n\r\n                    <input\r\n                        id=\"profileEmail\"\r\n                        disabled>\r\n\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n\r\n                    <label>\r\n                        \u0420\u04e9\u043b\r\n                    <\/label>\r\n\r\n                    <input\r\n                        id=\"profileRole\"\r\n                        disabled>\r\n\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n            <div class=\"actions\">\r\n\r\n                <button\r\n                    class=\"btn btn-primary\"\r\n                    onclick=\"saveProfile()\">\r\n\r\n                    \u0421\u0430\u049b\u0442\u0430\u0443\r\n\r\n                <\/button>\r\n\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n\r\n        <div class=\"card\">\r\n\r\n            <h2>\r\n                \ud83d\ude9b \u041c\u0435\u043d\u0456\u04a3 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0442\u0430\u0440\u044b\u043c\r\n            <\/h2>\r\n\r\n            <div id=\"myTransportList\"><\/div>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ADMIN -->\r\n\r\n<section id=\"admin\" class=\"page\">\r\n\r\n    <div\r\n        id=\"adminDenied\"\r\n        class=\"card\">\r\n\r\n        <div class=\"empty\">\r\n\r\n            <h2>\r\n                \u26d4 \u0414\u043e\u0441\u0442\u0443\u043f \u0436\u043e\u049b\r\n            <\/h2>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div\r\n        id=\"adminPanel\"\r\n        class=\"hidden\">\r\n\r\n        <h1 style=\"margin-bottom:20px\">\r\n            \ud83d\udee0 Admin Panel\r\n        <\/h1>\r\n\r\n\r\n        <div class=\"stats\">\r\n\r\n            <div class=\"stat\">\r\n\r\n                <div class=\"stat-title\">\r\n                    Users\r\n                <\/div>\r\n\r\n                <div\r\n                    id=\"adminUsers\"\r\n                    class=\"stat-number\">\r\n                    0\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n            <div class=\"stat\">\r\n\r\n                <div class=\"stat-title\">\r\n                    Transport\r\n                <\/div>\r\n\r\n                <div\r\n                    id=\"adminTransports\"\r\n                    class=\"stat-number\">\r\n                    0\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n            <div class=\"stat\">\r\n\r\n                <div class=\"stat-title\">\r\n                    Pending\r\n                <\/div>\r\n\r\n                <div\r\n                    id=\"adminPending\"\r\n                    class=\"stat-number\">\r\n                    0\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n            <div class=\"stat\">\r\n\r\n                <div class=\"stat-title\">\r\n                    Approved\r\n                <\/div>\r\n\r\n                <div\r\n                    id=\"adminApproved\"\r\n                    class=\"stat-number\">\r\n                    0\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n\r\n        <div class=\"card\">\r\n\r\n            <h2>\r\n                \ud83d\ude9b \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f\u0441\u044b\r\n            <\/h2>\r\n\r\n            <div class=\"table-wrapper\">\r\n\r\n                <table>\r\n\r\n                    <thead>\r\n\r\n                    <tr>\r\n                        <th>\u041c\u0430\u0440\u0448\u0440\u0443\u0442<\/th>\r\n                        <th>\u0414\u0430\u0442\u0430<\/th>\r\n                        <th>\u041a\u0443\u0437\u043e\u0432<\/th>\r\n                        <th>\u0412\u0435\u0441<\/th>\r\n                        <th>\u0411\u0430\u0493\u0430<\/th>\r\n                        <th>\u0421\u0442\u0430\u0442\u0443\u0441<\/th>\r\n                        <th>\u0410\u0432\u0442\u043e\u0440<\/th>\r\n                        <th>\u04d8\u0440\u0435\u043a\u0435\u0442<\/th>\r\n                    <\/tr>\r\n\r\n                    <\/thead>\r\n\r\n                    <tbody\r\n                        id=\"adminTransportTable\">\r\n                    <\/tbody>\r\n\r\n                <\/table>\r\n\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n\r\n        <div\r\n            id=\"adminUsersCard\"\r\n            class=\"card\">\r\n\r\n            <h2>\r\n                \ud83d\udc65 \u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\r\n            <\/h2>\r\n\r\n            <div class=\"table-wrapper\">\r\n\r\n                <table>\r\n\r\n                    <thead>\r\n\r\n                    <tr>\r\n                        <th>\u0410\u0442\u044b<\/th>\r\n                        <th>\u0418\u0418\u041d\/\u0411\u0418\u041d<\/th>\r\n                        <th>Email<\/th>\r\n                        <th>\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f<\/th>\r\n                        <th>\u0420\u04e9\u043b<\/th>\r\n                        <th>\u04d8\u0440\u0435\u043a\u0435\u0442<\/th>\r\n                    <\/tr>\r\n\r\n                    <\/thead>\r\n\r\n                    <tbody\r\n                        id=\"adminUsersTable\">\r\n                    <\/tbody>\r\n\r\n                <\/table>\r\n\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n    <\/div>\r\n\r\n<\/section>\r\n\r\n<\/main>\r\n\r\n\r\n<footer>\r\n\r\n    <strong>\r\n        QAZAQ CARGO\r\n    <\/strong>\r\n\r\n    <br><br>\r\n\r\n    \u0416\u04af\u043a \u0436\u04d9\u043d\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0431\u0438\u0440\u0436\u0430\u0441\u044b\r\n\r\n<\/footer>\r\n\r\n\r\n<div\r\n    id=\"toast\"\r\n    class=\"toast\">\r\n<\/div>\r\n\r\n\r\n<script type=\"module\">\r\n\r\n\/*\r\n===========================================================\r\n FIREBASE\r\n===========================================================\r\n*\/\r\n\r\nimport {\r\n    initializeApp\r\n} from\r\n\"https:\/\/www.gstatic.com\/firebasejs\/12.1.0\/firebase-app.js\";\r\n\r\nimport {\r\n    getAuth,\r\n    signInWithEmailAndPassword,\r\n    createUserWithEmailAndPassword,\r\n    signOut,\r\n    onAuthStateChanged\r\n} from\r\n\"https:\/\/www.gstatic.com\/firebasejs\/12.1.0\/firebase-auth.js\";\r\n\r\nimport {\r\n    getFirestore,\r\n    collection,\r\n    addDoc,\r\n    getDocs,\r\n    getDoc,\r\n    doc,\r\n    setDoc,\r\n    updateDoc,\r\n    deleteDoc,\r\n    serverTimestamp\r\n} from\r\n\"https:\/\/www.gstatic.com\/firebasejs\/12.1.0\/firebase-firestore.js\";\r\n\r\n\r\n\/*\r\n===========================================================\r\n \u041e\u0421\u042b \u0416\u0415\u0420\u0413\u0415 FIREBASE CONFIG \u049a\u041e\u042f\u0421\u042b\u0417\r\n===========================================================\r\n*\/\r\n\r\nconst firebaseConfig = {\r\n\r\n    apiKey:\r\n        \"YOUR_API_KEY\",\r\n\r\n    authDomain:\r\n        \"YOUR_PROJECT.firebaseapp.com\",\r\n\r\n    projectId:\r\n        \"YOUR_PROJECT_ID\",\r\n\r\n    storageBucket:\r\n        \"YOUR_PROJECT.firebasestorage.app\",\r\n\r\n    messagingSenderId:\r\n        \"YOUR_SENDER_ID\",\r\n\r\n    appId:\r\n        \"YOUR_APP_ID\"\r\n\r\n};\r\n\r\n\r\nconst app =\r\n    initializeApp(firebaseConfig);\r\n\r\nconst auth =\r\n    getAuth(app);\r\n\r\nconst db =\r\n    getFirestore(app);\r\n\r\n\r\n\/*\r\n===========================================================\r\n GLOBAL\r\n===========================================================\r\n*\/\r\n\r\nlet currentUser = null;\r\nlet currentProfile = null;\r\n\r\nlet transports = [];\r\nlet users = [];\r\n\r\nlet ncaSocket = null;\r\n\r\n\r\n\/*\r\n===========================================================\r\n UI\r\n===========================================================\r\n*\/\r\n\r\nwindow.showPage = function(page){\r\n\r\n    document\r\n        .querySelectorAll(\".page\")\r\n        .forEach(\r\n            x =>\r\n                x.classList.remove(\"active\")\r\n        );\r\n\r\n    const element =\r\n        document.getElementById(page);\r\n\r\n    if(element){\r\n\r\n        element.classList.add(\"active\");\r\n\r\n    }\r\n\r\n\r\n    if(page === \"transport\"){\r\n\r\n        loadTransports();\r\n\r\n    }\r\n\r\n\r\n    if(page === \"cabinet\"){\r\n\r\n        loadCabinet();\r\n\r\n    }\r\n\r\n\r\n    if(page === \"admin\"){\r\n\r\n        loadAdmin();\r\n\r\n    }\r\n\r\n\r\n    window.scrollTo({\r\n        top:0,\r\n        behavior:\"smooth\"\r\n    });\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n TOAST\r\n===========================================================\r\n*\/\r\n\r\nfunction toast(message){\r\n\r\n    const box =\r\n        document.getElementById(\"toast\");\r\n\r\n    box.textContent =\r\n        message;\r\n\r\n    box.classList.add(\"show\");\r\n\r\n    setTimeout(\r\n        () =>\r\n            box.classList.remove(\"show\"),\r\n        3500\r\n    );\r\n\r\n}\r\n\r\nwindow.toast = toast;\r\n\r\n\r\n\/*\r\n===========================================================\r\n NCALAYER\r\n===========================================================\r\n*\/\r\n\r\n\/*\r\n NCALayer WebSocket \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0442\u044b \u043f\u043e\u0440\u0442\u0442\u0430\u0440\u044b.\r\n*\/\r\n\r\nconst NCA_PORTS = [\r\n    13579,\r\n    13578,\r\n    13577,\r\n    13576,\r\n    13575\r\n];\r\n\r\n\r\nfunction ncaStatus(title,text){\r\n\r\n    const box =\r\n        document.getElementById(\"ncaStatus\");\r\n\r\n    box.classList.add(\"show\");\r\n\r\n    document\r\n        .getElementById(\"ncaStatusTitle\")\r\n        .textContent = title;\r\n\r\n    document\r\n        .getElementById(\"ncaStatusText\")\r\n        .textContent = text;\r\n\r\n}\r\n\r\n\r\nfunction connectNCALayer(){\r\n\r\n    return new Promise(\r\n        (resolve,reject) => {\r\n\r\n            let index = 0;\r\n\r\n\r\n            function tryPort(){\r\n\r\n                if(index >= NCA_PORTS.length){\r\n\r\n                    reject(\r\n                        new Error(\r\n                            \"NCALayer \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b\"\r\n                        )\r\n                    );\r\n\r\n                    return;\r\n\r\n                }\r\n\r\n\r\n                const port =\r\n                    NCA_PORTS[index++];\r\n\r\n\r\n                try{\r\n\r\n                    const ws =\r\n                        new WebSocket(\r\n                            `wss:\/\/127.0.0.1:${port}\/`\r\n                        );\r\n\r\n\r\n                    ws.onopen = () => {\r\n\r\n                        ncaSocket = ws;\r\n\r\n                        resolve(ws);\r\n\r\n                    };\r\n\r\n\r\n                    ws.onerror = () => {\r\n\r\n                        try{\r\n\r\n                            ws.close();\r\n\r\n                        }catch(e){}\r\n\r\n                        tryPort();\r\n\r\n                    };\r\n\r\n\r\n                    ws.onclose = () => {};\r\n\r\n                }catch(error){\r\n\r\n                    tryPort();\r\n\r\n                }\r\n\r\n            }\r\n\r\n\r\n            tryPort();\r\n\r\n        }\r\n    );\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n NCALAYER REQUEST\r\n===========================================================\r\n*\/\r\n\r\nfunction ncaRequest(\r\n    module,\r\n    method,\r\n    args\r\n){\r\n\r\n    return new Promise(\r\n        async (resolve,reject) => {\r\n\r\n            try{\r\n\r\n                const socket =\r\n                    ncaSocket ||\r\n                    await connectNCALayer();\r\n\r\n\r\n                const requestId =\r\n                    crypto.randomUUID();\r\n\r\n\r\n                const message = {\r\n\r\n                    module:module,\r\n\r\n                    method:method,\r\n\r\n                    args:args\r\n\r\n                };\r\n\r\n\r\n                const handler = event => {\r\n\r\n                    try{\r\n\r\n                        const data =\r\n                            JSON.parse(\r\n                                event.data\r\n                            );\r\n\r\n\r\n                        \/*\r\n                         NCALayer response\r\n                        *\/\r\n\r\n                        if(\r\n                            data &&\r\n                            (\r\n                                data.result !== undefined ||\r\n                                data.error !== undefined\r\n                            )\r\n                        ){\r\n\r\n                            socket.removeEventListener(\r\n                                \"message\",\r\n                                handler\r\n                            );\r\n\r\n\r\n                            if(\r\n                                data.error\r\n                            ){\r\n\r\n                                reject(\r\n                                    new Error(\r\n                                        typeof data.error ===\r\n                                        \"string\"\r\n                                        ?\r\n                                        data.error\r\n                                        :\r\n                                        JSON.stringify(\r\n                                            data.error\r\n                                        )\r\n                                    )\r\n                                );\r\n\r\n                            }else{\r\n\r\n                                resolve(\r\n                                    data.result\r\n                                );\r\n\r\n                            }\r\n\r\n                        }\r\n\r\n                    }catch(error){\r\n\r\n                        \/*\r\n                         \u041a\u0435\u0439\u0431\u0456\u0440 NCALayer \u043d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440\u044b\u043d\u0434\u0430\r\n                         response \u0431\u0430\u0441\u049b\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0442\u0430 \u043a\u0435\u043b\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.\r\n                        *\/\r\n\r\n                    }\r\n\r\n                };\r\n\r\n\r\n                socket.addEventListener(\r\n                    \"message\",\r\n                    handler\r\n                );\r\n\r\n\r\n                socket.send(\r\n                    JSON.stringify(message)\r\n                );\r\n\r\n\r\n            }catch(error){\r\n\r\n                reject(error);\r\n\r\n            }\r\n\r\n        }\r\n    );\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n \u042d\u0426\u049a \u0410\u0420\u049a\u042b\u041b\u042b \u041a\u0406\u0420\u0423\r\n===========================================================\r\n*\/\r\n\r\nwindow.loginWithEDS =\r\nasync function(){\r\n\r\n    const button =\r\n        document.getElementById(\r\n            \"edsLoginButton\"\r\n        );\r\n\r\n\r\n    button.disabled = true;\r\n\r\n    button.textContent =\r\n        \"\u23f3 NCALayer \u049b\u043e\u0441\u044b\u043b\u0443\u0434\u0430...\";\r\n\r\n\r\n    try{\r\n\r\n        ncaStatus(\r\n            \"NCALayer\",\r\n            \"NCALayer-\u0433\u0435 \u049b\u043e\u0441\u044b\u043b\u0443...\"\r\n        );\r\n\r\n\r\n        await connectNCALayer();\r\n\r\n\r\n        ncaStatus(\r\n            \"NCALayer \u049b\u043e\u0441\u044b\u043b\u0434\u044b\",\r\n            \"\u042d\u0426\u049a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u043b\u0430\u0434\u044b...\"\r\n        );\r\n\r\n\r\n        \/*\r\n         AUTH_RSA \/ AUTHENTICATION\r\n        *\/\r\n\r\n        const result =\r\n            await ncaRequest(\r\n                \"kz.gov.pki.knca.commonUtils\",\r\n                \"createCAdESFromBase64\",\r\n                [\r\n                    \"PKCS12\",\r\n                    \"AUTHENTICATION\",\r\n                    btoa(\r\n                        unescape(\r\n                            encodeURIComponent(\r\n                                JSON.stringify({\r\n                                    app:\r\n                                        \"QAZAQ_CARGO\",\r\n                                    timestamp:\r\n                                        Date.now(),\r\n                                    nonce:\r\n                                        crypto.randomUUID()\r\n                                })\r\n                            )\r\n                        )\r\n                    ),\r\n                    true\r\n                ]\r\n            );\r\n\r\n\r\n        \/*\r\n         result \u2014 CMS\/CAdES signature.\r\n         \r\n         \u041e\u043d\u044b production backend-\u043a\u0435 \u0436\u0456\u0431\u0435\u0440\u0443 \u043a\u0435\u0440\u0435\u043a.\r\n        *\/\r\n\r\n\r\n        ncaStatus(\r\n            \"\u042d\u0426\u049a \u0430\u043b\u044b\u043d\u0493\u0430\u043d\",\r\n            \"\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0442\u0435\u043a\u0441\u0435\u0440\u0456\u043b\u0443\u0434\u0435...\"\r\n        );\r\n\r\n\r\n        \/*\r\n         \u041d\u0410\u049a\u0422\u042b \u0416\u04ae\u0419\u0415\u0414\u0415:\r\n         \r\n         POST \/api\/eds\/login\r\n\r\n         {\r\n            signature: result\r\n         }\r\n\r\n         Backend:\r\n           1. CMS\/CAdES \u0442\u0435\u043a\u0441\u0435\u0440\u0435\u0434\u0456\r\n           2. \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0442\u044b \u0442\u0435\u043a\u0441\u0435\u0440\u0435\u0434\u0456\r\n           3. \u0418\u0418\u041d\/\u0411\u0418\u041d \u0430\u043b\u0430\u0434\u044b\r\n           4. \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043c\u0435\u0440\u0437\u0456\u043c\u0456\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0435\u0434\u0456\r\n           5. CRL\/OCSP \u0442\u0435\u043a\u0441\u0435\u0440\u0435\u0434\u0456\r\n           6. session\/JWT \u0431\u0435\u0440\u0435\u0434\u0456\r\n        *\/\r\n\r\n\r\n        \/*\r\n         DEMO:\r\n         \u0415\u0433\u0435\u0440 backend \u0436\u043e\u049b \u0431\u043e\u043b\u0441\u0430,\r\n         \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0442\u044b\u04a3 \u04e9\u0437\u0456\u043d \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0434\u0435\u043d \u0441\u0435\u043d\u0456\u043c\u0434\u0456\r\n         \u0442\u04af\u0440\u0434\u0435 \"verified\" \u0434\u0435\u043f \u049b\u0430\u0431\u044b\u043b\u0434\u0430\u043c\u0430\u0439\u043c\u044b\u0437.\r\n\r\n         \u0421\u043e\u043d\u0434\u044b\u049b\u0442\u0430\u043d demo \u0440\u0435\u0436\u0438\u043c\u0434\u0435 \u049b\u043e\u043b\u0442\u0430\u04a3\u0431\u0430\u043d\u044b\r\n         Firebase profile-\u043c\u0435\u043d \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0443\u0493\u0430\r\n         \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u043a\u04e9\u0440\u0441\u0435\u0442\u0435\u043c\u0456\u0437.\r\n        *\/\r\n\r\n\r\n        window.lastEDSSignature =\r\n            result;\r\n\r\n\r\n        document\r\n            .getElementById(\"certificateBox\")\r\n            .classList\r\n            .add(\"show\");\r\n\r\n\r\n        document\r\n            .getElementById(\"certSubject\")\r\n            .textContent =\r\n                \"\u042d\u0426\u049a \u049b\u043e\u043b\u0442\u0430\u04a3\u0431\u0430\u0441\u044b \u0430\u043b\u044b\u043d\u0434\u044b\";\r\n\r\n\r\n        toast(\r\n            \"\u042d\u0426\u049a \u049b\u043e\u043b \u049b\u043e\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0441\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u043b\u0434\u044b.\"\r\n        );\r\n\r\n\r\n        \/*\r\n         Production backend \u0431\u043e\u043b\u043c\u0430\u0441\u0430,\r\n         \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b login \u0436\u0430\u0441\u0430\u043c\u0430\u0439\u043c\u044b\u0437.\r\n        *\/\r\n\r\n        ncaStatus(\r\n            \"\u041a\u0435\u043b\u0435\u0441\u0456 \u049b\u0430\u0434\u0430\u043c\",\r\n            \"Backend \u042d\u0426\u049a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0443\u0456 \u043a\u0435\u0440\u0435\u043a.\"\r\n        );\r\n\r\n\r\n    }catch(error){\r\n\r\n        console.error(\r\n            \"NCALayer error:\",\r\n            error\r\n        );\r\n\r\n\r\n        ncaStatus(\r\n            \"\u049a\u0430\u0442\u0435\",\r\n            error.message ||\r\n            \"NCALayer-\u043c\u0435\u043d \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441 \u0431\u043e\u043b\u043c\u0430\u0434\u044b.\"\r\n        );\r\n\r\n\r\n        toast(\r\n            \"NCALayer \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u044b\u043d \u0442\u0435\u043a\u0441\u0435\u0440\u0456\u04a3\u0456\u0437.\"\r\n        );\r\n\r\n    }finally{\r\n\r\n        button.disabled = false;\r\n\r\n        button.textContent =\r\n            \"\ud83d\udd10 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443\";\r\n\r\n    }\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n EMAIL LOGIN\r\n===========================================================\r\n*\/\r\n\r\ndocument\r\n.getElementById(\"emailLoginForm\")\r\n.addEventListener(\r\n    \"submit\",\r\n    async event => {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        try{\r\n\r\n            const email =\r\n                document\r\n                .getElementById(\r\n                    \"emailLogin\"\r\n                )\r\n                .value;\r\n\r\n\r\n            const password =\r\n                document\r\n                .getElementById(\r\n                    \"passwordLogin\"\r\n                )\r\n                .value;\r\n\r\n\r\n            await signInWithEmailAndPassword(\r\n                auth,\r\n                email,\r\n                password\r\n            );\r\n\r\n\r\n            toast(\r\n                \"\u0416\u04af\u0439\u0435\u0433\u0435 \u043a\u0456\u0440\u0434\u0456\u04a3\u0456\u0437.\"\r\n            );\r\n\r\n\r\n            showPage(\"cabinet\");\r\n\r\n\r\n        }catch(error){\r\n\r\n            toast(\r\n                firebaseError(error)\r\n            );\r\n\r\n        }\r\n\r\n    }\r\n);\r\n\r\n\r\n\/*\r\n===========================================================\r\n REGISTER\r\n===========================================================\r\n*\/\r\n\r\ndocument\r\n.getElementById(\"registerForm\")\r\n.addEventListener(\r\n    \"submit\",\r\n    async event => {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        try{\r\n\r\n            const name =\r\n                document\r\n                .getElementById(\"regName\")\r\n                .value;\r\n\r\n            const company =\r\n                document\r\n                .getElementById(\"regCompany\")\r\n                .value;\r\n\r\n            const phone =\r\n                document\r\n                .getElementById(\"regPhone\")\r\n                .value;\r\n\r\n            const email =\r\n                document\r\n                .getElementById(\"regEmail\")\r\n                .value;\r\n\r\n            const password =\r\n                document\r\n                .getElementById(\"regPassword\")\r\n                .value;\r\n\r\n\r\n            const result =\r\n                await createUserWithEmailAndPassword(\r\n                    auth,\r\n                    email,\r\n                    password\r\n                );\r\n\r\n\r\n            const user =\r\n                result.user;\r\n\r\n\r\n            await setDoc(\r\n                doc(\r\n                    db,\r\n                    \"users\",\r\n                    user.uid\r\n                ),\r\n                {\r\n\r\n                    uid:\r\n                        user.uid,\r\n\r\n                    name:\r\n                        name,\r\n\r\n                    company:\r\n                        company,\r\n\r\n                    phone:\r\n                        phone,\r\n\r\n                    email:\r\n                        email,\r\n\r\n                    iin:\r\n                        \"\",\r\n\r\n                    role:\r\n                        \"user\",\r\n\r\n                    status:\r\n                        \"active\",\r\n\r\n                    authType:\r\n                        \"email\",\r\n\r\n                    createdAt:\r\n                        serverTimestamp()\r\n\r\n                }\r\n            );\r\n\r\n\r\n            toast(\r\n                \"\u0422\u0456\u0440\u043a\u0435\u043b\u0443 \u0441\u04d9\u0442\u0442\u0456 \u0430\u044f\u049b\u0442\u0430\u043b\u0434\u044b.\"\r\n            );\r\n\r\n\r\n            showPage(\"cabinet\");\r\n\r\n\r\n        }catch(error){\r\n\r\n            toast(\r\n                firebaseError(error)\r\n            );\r\n\r\n        }\r\n\r\n    }\r\n);\r\n\r\n\r\n\/*\r\n===========================================================\r\n AUTH STATE\r\n===========================================================\r\n*\/\r\n\r\nonAuthStateChanged(\r\n    auth,\r\n    async user => {\r\n\r\n        currentUser =\r\n            user;\r\n\r\n\r\n        if(user){\r\n\r\n            document\r\n                .getElementById(\r\n                    \"headerUser\"\r\n                )\r\n                .textContent =\r\n                    user.email;\r\n\r\n\r\n            document\r\n                .getElementById(\r\n                    \"headerLogin\"\r\n                )\r\n                .classList\r\n                .add(\"hidden\");\r\n\r\n\r\n            document\r\n                .getElementById(\r\n                    \"headerLogout\"\r\n                )\r\n                .classList\r\n                .remove(\"hidden\");\r\n\r\n\r\n            await loadProfile();\r\n\r\n        }else{\r\n\r\n            document\r\n                .getElementById(\r\n                    \"headerUser\"\r\n                )\r\n                .textContent =\r\n                    \"\u049a\u043e\u043d\u0430\u049b\";\r\n\r\n\r\n            document\r\n                .getElementById(\r\n                    \"headerLogin\"\r\n                )\r\n                .classList\r\n                .remove(\"hidden\");\r\n\r\n\r\n            document\r\n                .getElementById(\r\n                    \"headerLogout\"\r\n                )\r\n                .classList\r\n                .add(\"hidden\");\r\n\r\n\r\n            document\r\n                .getElementById(\r\n                    \"adminButton\"\r\n                )\r\n                .classList\r\n                .add(\"hidden\");\r\n\r\n        }\r\n\r\n\r\n        updateAddPage();\r\n\r\n    }\r\n);\r\n\r\n\r\n\/*\r\n===========================================================\r\n PROFILE\r\n===========================================================\r\n*\/\r\n\r\nasync function loadProfile(){\r\n\r\n    if(!currentUser)\r\n        return;\r\n\r\n\r\n    const ref =\r\n        doc(\r\n            db,\r\n            \"users\",\r\n            currentUser.uid\r\n        );\r\n\r\n\r\n    const snap =\r\n        await getDoc(ref);\r\n\r\n\r\n    if(snap.exists()){\r\n\r\n        currentProfile =\r\n            snap.data();\r\n\r\n    }else{\r\n\r\n        currentProfile = {\r\n\r\n            uid:\r\n                currentUser.uid,\r\n\r\n            email:\r\n                currentUser.email,\r\n\r\n            name:\r\n                \"\",\r\n\r\n            company:\r\n                \"\",\r\n\r\n            phone:\r\n                \"\",\r\n\r\n            iin:\r\n                \"\",\r\n\r\n            role:\r\n                \"user\",\r\n\r\n            status:\r\n                \"active\"\r\n\r\n        };\r\n\r\n\r\n        await setDoc(\r\n            ref,\r\n            currentProfile\r\n        );\r\n\r\n    }\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"profileIin\"\r\n        )\r\n        .value =\r\n            currentProfile.iin || \"\";\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"profileName\"\r\n        )\r\n        .value =\r\n            currentProfile.name || \"\";\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"profileCompany\"\r\n        )\r\n        .value =\r\n            currentProfile.company || \"\";\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"profilePhone\"\r\n        )\r\n        .value =\r\n            currentProfile.phone || \"\";\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"profileEmail\"\r\n        )\r\n        .value =\r\n            currentProfile.email ||\r\n            currentUser.email;\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"profileRole\"\r\n        )\r\n        .value =\r\n            currentProfile.role;\r\n\r\n\r\n    if(\r\n        currentProfile.role === \"admin\" ||\r\n        currentProfile.role === \"moderator\"\r\n    ){\r\n\r\n        document\r\n            .getElementById(\r\n                \"adminButton\"\r\n            )\r\n            .classList\r\n            .remove(\"hidden\");\r\n\r\n    }\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n SAVE PROFILE\r\n===========================================================\r\n*\/\r\n\r\nwindow.saveProfile =\r\nasync function(){\r\n\r\n    if(!currentUser)\r\n        return;\r\n\r\n\r\n    await updateDoc(\r\n        doc(\r\n            db,\r\n            \"users\",\r\n            currentUser.uid\r\n        ),\r\n        {\r\n\r\n            name:\r\n                document\r\n                .getElementById(\r\n                    \"profileName\"\r\n                )\r\n                .value,\r\n\r\n            company:\r\n                document\r\n                .getElementById(\r\n                    \"profileCompany\"\r\n                )\r\n                .value,\r\n\r\n            phone:\r\n                document\r\n                .getElementById(\r\n                    \"profilePhone\"\r\n                )\r\n                .value,\r\n\r\n            updatedAt:\r\n                serverTimestamp()\r\n\r\n        }\r\n    );\r\n\r\n\r\n    await loadProfile();\r\n\r\n\r\n    toast(\r\n        \"\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.\"\r\n    );\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n ADD TRANSPORT\r\n===========================================================\r\n*\/\r\n\r\ndocument\r\n.getElementById(\"transportForm\")\r\n.addEventListener(\r\n    \"submit\",\r\n    async event => {\r\n\r\n        event.preventDefault();\r\n\r\n\r\n        if(!currentUser){\r\n\r\n            showPage(\"login\");\r\n\r\n            return;\r\n\r\n        }\r\n\r\n\r\n        try{\r\n\r\n            await addDoc(\r\n                collection(\r\n                    db,\r\n                    \"transports\"\r\n                ),\r\n                {\r\n\r\n                    from:\r\n                        value(\"tFrom\"),\r\n\r\n                    to:\r\n                        value(\"tTo\"),\r\n\r\n                    date:\r\n                        value(\"tDate\"),\r\n\r\n                    body:\r\n                        value(\"tBody\"),\r\n\r\n                    weight:\r\n                        Number(\r\n                            value(\"tWeight\")\r\n                        ),\r\n\r\n                    volume:\r\n                        Number(\r\n                            value(\"tVolume\") || 0\r\n                        ),\r\n\r\n                    number:\r\n                        value(\"tNumber\"),\r\n\r\n                    price:\r\n                        Number(\r\n                            value(\"tPrice\") || 0\r\n                        ),\r\n\r\n                    currency:\r\n                        value(\"tCurrency\"),\r\n\r\n                    driver:\r\n                        value(\"tDriver\"),\r\n\r\n                    phone:\r\n                        value(\"tPhone\"),\r\n\r\n                    gps:\r\n                        value(\"tGps\"),\r\n\r\n                    adr:\r\n                        value(\"tAdr\"),\r\n\r\n                    description:\r\n                        value(\"tDescription\"),\r\n\r\n                    userId:\r\n                        currentUser.uid,\r\n\r\n                    userEmail:\r\n                        currentUser.email,\r\n\r\n                    userName:\r\n                        currentProfile?.name ||\r\n                        \"\",\r\n\r\n                    status:\r\n                        \"pending\",\r\n\r\n                    createdAt:\r\n                        serverTimestamp(),\r\n\r\n                    updatedAt:\r\n                        serverTimestamp()\r\n\r\n                }\r\n            );\r\n\r\n\r\n            document\r\n                .getElementById(\r\n                    \"transportForm\"\r\n                )\r\n                .reset();\r\n\r\n\r\n            toast(\r\n                \"\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f\u0493\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456.\"\r\n            );\r\n\r\n\r\n            showPage(\"cabinet\");\r\n\r\n\r\n        }catch(error){\r\n\r\n            toast(\r\n                firebaseError(error)\r\n            );\r\n\r\n        }\r\n\r\n    }\r\n);\r\n\r\n\r\n\/*\r\n===========================================================\r\n LOAD TRANSPORTS\r\n===========================================================\r\n*\/\r\n\r\nwindow.loadTransports =\r\nasync function(){\r\n\r\n    const snap =\r\n        await getDocs(\r\n            collection(\r\n                db,\r\n                \"transports\"\r\n            )\r\n        );\r\n\r\n\r\n    transports = [];\r\n\r\n\r\n    snap.forEach(\r\n        item => {\r\n\r\n            transports.push({\r\n\r\n                id:\r\n                    item.id,\r\n\r\n                ...item.data()\r\n\r\n            });\r\n\r\n        }\r\n    );\r\n\r\n\r\n    renderTransports(\r\n        transports.filter(\r\n            x =>\r\n                x.status ===\r\n                \"approved\"\r\n        )\r\n    );\r\n\r\n\r\n    updateStats();\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n SEARCH\r\n===========================================================\r\n*\/\r\n\r\nwindow.searchTransport =\r\nfunction(){\r\n\r\n    const from =\r\n        value(\r\n            \"searchFrom\"\r\n        ).toLowerCase();\r\n\r\n    const to =\r\n        value(\r\n            \"searchTo\"\r\n        ).toLowerCase();\r\n\r\n    const body =\r\n        value(\r\n            \"searchBody\"\r\n        );\r\n\r\n    const weight =\r\n        Number(\r\n            value(\r\n                \"searchWeight\"\r\n            ) || 0\r\n        );\r\n\r\n\r\n    const result =\r\n        transports.filter(\r\n            t => {\r\n\r\n                if(\r\n                    t.status !==\r\n                    \"approved\"\r\n                )\r\n                    return false;\r\n\r\n\r\n                if(\r\n                    from &&\r\n                    !String(\r\n                        t.from || \"\"\r\n                    )\r\n                    .toLowerCase()\r\n                    .includes(from)\r\n                )\r\n                    return false;\r\n\r\n\r\n                if(\r\n                    to &&\r\n                    !String(\r\n                        t.to || \"\"\r\n                    )\r\n                    .toLowerCase()\r\n                    .includes(to)\r\n                )\r\n                    return false;\r\n\r\n\r\n                if(\r\n                    body &&\r\n                    t.body !== body\r\n                )\r\n                    return false;\r\n\r\n\r\n                if(\r\n                    weight &&\r\n                    Number(\r\n                        t.weight || 0\r\n                    ) < weight\r\n                )\r\n                    return false;\r\n\r\n\r\n                return true;\r\n\r\n            }\r\n        );\r\n\r\n\r\n    renderTransports(result);\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n RENDER\r\n===========================================================\r\n*\/\r\n\r\nfunction renderTransports(data){\r\n\r\n    const list =\r\n        document.getElementById(\r\n            \"transportList\"\r\n        );\r\n\r\n\r\n    if(!data.length){\r\n\r\n        list.innerHTML = `\r\n            <div class=\"empty\">\r\n                <h3>\ud83d\ude9b \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b<\/h3>\r\n            <\/div>\r\n        `;\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    list.innerHTML =\r\n        data.map(\r\n            t => `\r\n\r\n            <div class=\"transport-card\">\r\n\r\n                <div class=\"route\">\r\n\r\n                    ${esc(t.from)}\r\n\r\n                    <span class=\"arrow\">\r\n                        \u2192\r\n                    <\/span>\r\n\r\n                    ${esc(t.to)}\r\n\r\n                <\/div>\r\n\r\n\r\n                <span\r\n                    class=\"status approved\">\r\n                    \u041e\u0434\u043e\u0431\u0440\u0435\u043d\u043e\r\n                <\/span>\r\n\r\n\r\n                <div class=\"price\"\r\n                    style=\"margin-top:15px\">\r\n\r\n                    ${number(t.price)}\r\n\r\n                    ${esc(t.currency)}\r\n\r\n                <\/div>\r\n\r\n\r\n                <div class=\"info-grid\">\r\n\r\n                    <div class=\"info-item\">\r\n\r\n                        <small>\r\n                            \u0414\u0430\u0442\u0430\r\n                        <\/small>\r\n\r\n                        <strong>\r\n                            ${esc(t.date)}\r\n                        <\/strong>\r\n\r\n                    <\/div>\r\n\r\n                    <div class=\"info-item\">\r\n\r\n                        <small>\r\n                            \u041a\u0443\u0437\u043e\u0432\r\n                        <\/small>\r\n\r\n                        <strong>\r\n                            ${esc(t.body)}\r\n                        <\/strong>\r\n\r\n                    <\/div>\r\n\r\n                    <div class=\"info-item\">\r\n\r\n                        <small>\r\n                            \u0416\u04af\u043a \u043a\u04e9\u0442\u0435\u0440\u0433\u0456\u0448\u0442\u0456\u043a\r\n                        <\/small>\r\n\r\n                        <strong>\r\n                            ${t.weight || 0} \u0442\r\n                        <\/strong>\r\n\r\n                    <\/div>\r\n\r\n                    <div class=\"info-item\">\r\n\r\n                        <small>\r\n                            \u041a\u04e9\u043b\u0435\u043c\r\n                        <\/small>\r\n\r\n                        <strong>\r\n                            ${t.volume || 0} \u043c\u00b3\r\n                        <\/strong>\r\n\r\n                    <\/div>\r\n\r\n                <\/div>\r\n\r\n\r\n                ${\r\n                    t.phone\r\n                    ?\r\n                    `\r\n                    <div class=\"actions\">\r\n\r\n                        <a\r\n                            class=\"btn btn-green\"\r\n                            href=\"tel:${esc(t.phone)}\">\r\n\r\n                            \ud83d\udcde ${esc(t.phone)}\r\n\r\n                        <\/a>\r\n\r\n                    <\/div>\r\n                    `\r\n                    :\r\n                    \"\"\r\n                }\r\n\r\n            <\/div>\r\n\r\n            `\r\n        )\r\n        .join(\"\");\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n CABINET\r\n===========================================================\r\n*\/\r\n\r\nasync function loadCabinet(){\r\n\r\n    if(!currentUser){\r\n\r\n        document\r\n            .getElementById(\r\n                \"cabinetGuest\"\r\n            )\r\n            .classList\r\n            .remove(\"hidden\");\r\n\r\n        document\r\n            .getElementById(\r\n                \"cabinetUser\"\r\n            )\r\n            .classList\r\n            .add(\"hidden\");\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"cabinetGuest\"\r\n        )\r\n        .classList\r\n        .add(\"hidden\");\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"cabinetUser\"\r\n        )\r\n        .classList\r\n        .remove(\"hidden\");\r\n\r\n\r\n    const snap =\r\n        await getDocs(\r\n            collection(\r\n                db,\r\n                \"transports\"\r\n            )\r\n        );\r\n\r\n\r\n    const mine = [];\r\n\r\n\r\n    snap.forEach(\r\n        item => {\r\n\r\n            const t =\r\n                item.data();\r\n\r\n\r\n            if(\r\n                t.userId ===\r\n                currentUser.uid\r\n            ){\r\n\r\n                mine.push({\r\n\r\n                    id:\r\n                        item.id,\r\n\r\n                    ...t\r\n\r\n                });\r\n\r\n            }\r\n\r\n        }\r\n    );\r\n\r\n\r\n    const list =\r\n        document\r\n        .getElementById(\r\n            \"myTransportList\"\r\n        );\r\n\r\n\r\n    if(!mine.length){\r\n\r\n        list.innerHTML = `\r\n            <div class=\"empty\">\r\n                \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0436\u043e\u049b.\r\n            <\/div>\r\n        `;\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    list.innerHTML =\r\n        mine.map(\r\n            t => `\r\n\r\n            <div\r\n                style=\"\r\n                border:1px solid #e5e7eb;\r\n                border-radius:10px;\r\n                padding:15px;\r\n                margin-bottom:10px\">\r\n\r\n                <strong>\r\n                    ${esc(t.from)}\r\n                    \u2192\r\n                    ${esc(t.to)}\r\n                <\/strong>\r\n\r\n                <br><br>\r\n\r\n                ${esc(t.date)}\r\n\r\n                \u00b7\r\n\r\n                ${esc(t.body)}\r\n\r\n                \u00b7\r\n\r\n                ${t.weight || 0} \u0442\r\n\r\n                <br><br>\r\n\r\n                <span\r\n                    class=\"status ${t.status}\">\r\n                    ${statusText(t.status)}\r\n                <\/span>\r\n\r\n                <div class=\"actions\">\r\n\r\n                    <button\r\n                        class=\"btn btn-red\"\r\n                        onclick=\"\r\n                        deleteTransport(\r\n                            '${t.id}'\r\n                        )\">\r\n\r\n                        \ud83d\uddd1 \u04e8\u0448\u0456\u0440\u0443\r\n\r\n                    <\/button>\r\n\r\n                <\/div>\r\n\r\n            <\/div>\r\n\r\n            `\r\n        )\r\n        .join(\"\");\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n DELETE TRANSPORT\r\n===========================================================\r\n*\/\r\n\r\nwindow.deleteTransport =\r\nasync function(id){\r\n\r\n    if(\r\n        !confirm(\r\n            \"\u04e8\u0448\u0456\u0440\u0443\u0433\u0435 \u0441\u0435\u043d\u0456\u043c\u0434\u0456\u0441\u0456\u0437 \u0431\u0435?\"\r\n        )\r\n    )\r\n        return;\r\n\r\n\r\n    const ref =\r\n        doc(\r\n            db,\r\n            \"transports\",\r\n            id\r\n        );\r\n\r\n\r\n    const snap =\r\n        await getDoc(ref);\r\n\r\n\r\n    if(\r\n        !snap.exists()\r\n    )\r\n        return;\r\n\r\n\r\n    if(\r\n        snap.data().userId !==\r\n        currentUser.uid\r\n    ){\r\n\r\n        toast(\r\n            \"\u0414\u043e\u0441\u0442\u0443\u043f \u0436\u043e\u049b.\"\r\n        );\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    await deleteDoc(ref);\r\n\r\n\r\n    toast(\r\n        \"\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u04e9\u0448\u0456\u0440\u0456\u043b\u0434\u0456.\"\r\n    );\r\n\r\n\r\n    loadCabinet();\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n ADMIN\r\n===========================================================\r\n*\/\r\n\r\nasync function loadAdmin(){\r\n\r\n    if(\r\n        !currentProfile ||\r\n        (\r\n            currentProfile.role !==\r\n            \"admin\" &&\r\n            currentProfile.role !==\r\n            \"moderator\"\r\n        )\r\n    ){\r\n\r\n        document\r\n            .getElementById(\r\n                \"adminDenied\"\r\n            )\r\n            .classList\r\n            .remove(\"hidden\");\r\n\r\n        document\r\n            .getElementById(\r\n                \"adminPanel\"\r\n            )\r\n            .classList\r\n            .add(\"hidden\");\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminDenied\"\r\n        )\r\n        .classList\r\n        .add(\"hidden\");\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminPanel\"\r\n        )\r\n        .classList\r\n        .remove(\"hidden\");\r\n\r\n\r\n    await loadAdminTransport();\r\n\r\n\r\n    if(\r\n        currentProfile.role ===\r\n        \"admin\"\r\n    ){\r\n\r\n        await loadAdminUsers();\r\n\r\n    }\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n ADMIN TRANSPORT\r\n===========================================================\r\n*\/\r\n\r\nasync function loadAdminTransport(){\r\n\r\n    const snap =\r\n        await getDocs(\r\n            collection(\r\n                db,\r\n                \"transports\"\r\n            )\r\n        );\r\n\r\n\r\n    transports = [];\r\n\r\n\r\n    snap.forEach(\r\n        item => {\r\n\r\n            transports.push({\r\n\r\n                id:\r\n                    item.id,\r\n\r\n                ...item.data()\r\n\r\n            });\r\n\r\n        }\r\n    );\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminTransports\"\r\n        )\r\n        .textContent =\r\n            transports.length;\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminPending\"\r\n        )\r\n        .textContent =\r\n            transports.filter(\r\n                x =>\r\n                    x.status ===\r\n                    \"pending\"\r\n            ).length;\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminApproved\"\r\n        )\r\n        .textContent =\r\n            transports.filter(\r\n                x =>\r\n                    x.status ===\r\n                    \"approved\"\r\n            ).length;\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminTransportTable\"\r\n        )\r\n        .innerHTML =\r\n        transports.map(\r\n            t => `\r\n\r\n            <tr>\r\n\r\n                <td>\r\n                    ${esc(t.from)}\r\n                    \u2192\r\n                    ${esc(t.to)}\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${esc(t.date)}\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${esc(t.body)}\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${t.weight || 0} \u0442\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${number(t.price)}\r\n                    ${esc(t.currency)}\r\n                <\/td>\r\n\r\n                <td>\r\n\r\n                    <span\r\n                        class=\"status ${t.status}\">\r\n\r\n                        ${statusText(t.status)}\r\n\r\n                    <\/span>\r\n\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${esc(t.userName)}\r\n                    <br>\r\n                    <small>\r\n                        ${esc(t.userEmail)}\r\n                    <\/small>\r\n                <\/td>\r\n\r\n                <td>\r\n\r\n                    <button\r\n                        class=\"btn btn-green\"\r\n                        onclick=\"\r\n                        moderate(\r\n                            '${t.id}',\r\n                            'approved'\r\n                        )\">\r\n\r\n                        \u2713\r\n\r\n                    <\/button>\r\n\r\n                    <button\r\n                        class=\"btn btn-red\"\r\n                        onclick=\"\r\n                        moderate(\r\n                            '${t.id}',\r\n                            'rejected'\r\n                        )\">\r\n\r\n                        \u2715\r\n\r\n                    <\/button>\r\n\r\n                    <button\r\n                        class=\"btn btn-gray\"\r\n                        onclick=\"\r\n                        moderate(\r\n                            '${t.id}',\r\n                            'blocked'\r\n                        )\">\r\n\r\n                        \ud83d\udeab\r\n\r\n                    <\/button>\r\n\r\n                <\/td>\r\n\r\n            <\/tr>\r\n\r\n            `\r\n        )\r\n        .join(\"\");\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n MODERATION\r\n===========================================================\r\n*\/\r\n\r\nwindow.moderate =\r\nasync function(id,status){\r\n\r\n    if(\r\n        !currentProfile ||\r\n        (\r\n            currentProfile.role !==\r\n            \"admin\" &&\r\n            currentProfile.role !==\r\n            \"moderator\"\r\n        )\r\n    ){\r\n\r\n        toast(\r\n            \"\u0414\u043e\u0441\u0442\u0443\u043f \u0436\u043e\u049b.\"\r\n        );\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    await updateDoc(\r\n        doc(\r\n            db,\r\n            \"transports\",\r\n            id\r\n        ),\r\n        {\r\n\r\n            status:\r\n                status,\r\n\r\n            moderatedBy:\r\n                currentUser.uid,\r\n\r\n            moderatedAt:\r\n                serverTimestamp()\r\n\r\n        }\r\n    );\r\n\r\n\r\n    toast(\r\n        \"\u0421\u0442\u0430\u0442\u0443\u0441 \u04e9\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0434\u0456.\"\r\n    );\r\n\r\n\r\n    loadAdminTransport();\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n ADMIN USERS\r\n===========================================================\r\n*\/\r\n\r\nasync function loadAdminUsers(){\r\n\r\n    const snap =\r\n        await getDocs(\r\n            collection(\r\n                db,\r\n                \"users\"\r\n            )\r\n        );\r\n\r\n\r\n    users = [];\r\n\r\n\r\n    snap.forEach(\r\n        item => {\r\n\r\n            users.push({\r\n\r\n                id:\r\n                    item.id,\r\n\r\n                ...item.data()\r\n\r\n            });\r\n\r\n        }\r\n    );\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminUsers\"\r\n        )\r\n        .textContent =\r\n            users.length;\r\n\r\n\r\n    document\r\n        .getElementById(\r\n            \"adminUsersTable\"\r\n        )\r\n        .innerHTML =\r\n        users.map(\r\n            u => `\r\n\r\n            <tr>\r\n\r\n                <td>\r\n                    ${esc(u.name)}\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${esc(u.iin)}\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${esc(u.email)}\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${esc(u.company)}\r\n                <\/td>\r\n\r\n                <td>\r\n                    ${esc(u.role)}\r\n                <\/td>\r\n\r\n                <td>\r\n\r\n                    <select\r\n                        onchange=\"\r\n                        changeRole(\r\n                            '${u.id}',\r\n                            this.value\r\n                        )\">\r\n\r\n                        <option\r\n                            value=\"user\"\r\n                            ${u.role === \"user\"\r\n                            ? \"selected\":\"\"\r\n                            }>\r\n                            user\r\n                        <\/option>\r\n\r\n                        <option\r\n                            value=\"moderator\"\r\n                            ${u.role === \"moderator\"\r\n                            ? \"selected\":\"\"\r\n                            }>\r\n                            moderator\r\n                        <\/option>\r\n\r\n                        <option\r\n                            value=\"admin\"\r\n                            ${u.role === \"admin\"\r\n                            ? \"selected\":\"\"\r\n                            }>\r\n                            admin\r\n                        <\/option>\r\n\r\n                    <\/select>\r\n\r\n                <\/td>\r\n\r\n            <\/tr>\r\n\r\n            `\r\n        )\r\n        .join(\"\");\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n ROLE\r\n===========================================================\r\n*\/\r\n\r\nwindow.changeRole =\r\nasync function(uid,role){\r\n\r\n    if(\r\n        !currentProfile ||\r\n        currentProfile.role !==\r\n        \"admin\"\r\n    ){\r\n\r\n        toast(\r\n            \"\u0422\u0435\u043a Admin \u04e9\u0437\u0433\u0435\u0440\u0442\u0435 \u0430\u043b\u0430\u0434\u044b.\"\r\n        );\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    if(\r\n        uid ===\r\n        currentUser.uid\r\n    ){\r\n\r\n        toast(\r\n            \"\u04e8\u0437\u0456\u04a3\u0456\u0437\u0434\u0456\u04a3 \u0440\u04e9\u043b\u0456\u04a3\u0456\u0437\u0434\u0456 \u04e9\u0437\u0433\u0435\u0440\u0442\u043f\u0435\u04a3\u0456\u0437.\"\r\n        );\r\n\r\n        return;\r\n\r\n    }\r\n\r\n\r\n    await updateDoc(\r\n        doc(\r\n            db,\r\n            \"users\",\r\n            uid\r\n        ),\r\n        {\r\n            role:\r\n                role\r\n        }\r\n    );\r\n\r\n\r\n    toast(\r\n        \"\u0420\u04e9\u043b \u04e9\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0434\u0456.\"\r\n    );\r\n\r\n\r\n    loadAdminUsers();\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n STATS\r\n===========================================================\r\n*\/\r\n\r\nasync function updateStats(){\r\n\r\n    try{\r\n\r\n        const tSnap =\r\n            await getDocs(\r\n                collection(\r\n                    db,\r\n                    \"transports\"\r\n                )\r\n            );\r\n\r\n\r\n        const uSnap =\r\n            await getDocs(\r\n                collection(\r\n                    db,\r\n                    \"users\"\r\n                )\r\n            );\r\n\r\n\r\n        const data = [];\r\n\r\n\r\n        tSnap.forEach(\r\n            x =>\r\n                data.push(\r\n                    x.data()\r\n                )\r\n        );\r\n\r\n\r\n        document\r\n            .getElementById(\r\n                \"totalTransport\"\r\n            )\r\n            .textContent =\r\n                data.length;\r\n\r\n\r\n        document\r\n            .getElementById(\r\n                \"approvedTransport\"\r\n            )\r\n            .textContent =\r\n                data.filter(\r\n                    x =>\r\n                        x.status ===\r\n                        \"approved\"\r\n                ).length;\r\n\r\n\r\n        document\r\n            .getElementById(\r\n                \"pendingTransport\"\r\n            )\r\n            .textContent =\r\n                data.filter(\r\n                    x =>\r\n                        x.status ===\r\n                        \"pending\"\r\n                ).length;\r\n\r\n\r\n        document\r\n            .getElementById(\r\n                \"totalUsers\"\r\n            )\r\n            .textContent =\r\n                uSnap.size;\r\n\r\n    }catch(error){\r\n\r\n        console.error(error);\r\n\r\n    }\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n ADD PAGE\r\n===========================================================\r\n*\/\r\n\r\nfunction updateAddPage(){\r\n\r\n    if(currentUser){\r\n\r\n        document\r\n            .getElementById(\r\n                \"transportForm\"\r\n            )\r\n            .classList\r\n            .remove(\"hidden\");\r\n\r\n        document\r\n            .getElementById(\r\n                \"addLoginMessage\"\r\n            )\r\n            .classList\r\n            .add(\"hidden\");\r\n\r\n    }else{\r\n\r\n        document\r\n            .getElementById(\r\n                \"transportForm\"\r\n            )\r\n            .classList\r\n            .add(\"hidden\");\r\n\r\n        document\r\n            .getElementById(\r\n                \"addLoginMessage\"\r\n            )\r\n            .classList\r\n            .remove(\"hidden\");\r\n\r\n    }\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n LOGOUT\r\n===========================================================\r\n*\/\r\n\r\nwindow.logout =\r\nasync function(){\r\n\r\n    await signOut(auth);\r\n\r\n    currentUser =\r\n        null;\r\n\r\n    currentProfile =\r\n        null;\r\n\r\n    showPage(\"home\");\r\n\r\n    toast(\r\n        \"\u0416\u04af\u0439\u0435\u0434\u0435\u043d \u0448\u044b\u049b\u0442\u044b\u04a3\u044b\u0437.\"\r\n    );\r\n\r\n};\r\n\r\n\r\n\/*\r\n===========================================================\r\n HELPERS\r\n===========================================================\r\n*\/\r\n\r\nfunction value(id){\r\n\r\n    return document\r\n        .getElementById(id)\r\n        .value\r\n        .trim();\r\n\r\n}\r\n\r\n\r\nfunction number(x){\r\n\r\n    return Number(\r\n        x || 0\r\n    ).toLocaleString(\r\n        \"ru-RU\"\r\n    );\r\n\r\n}\r\n\r\n\r\nfunction esc(value){\r\n\r\n    return String(\r\n        value ?? \"\"\r\n    )\r\n    .replaceAll(\r\n        \"&\",\r\n        \"&amp;\"\r\n    )\r\n    .replaceAll(\r\n        \"<\",\r\n        \"&lt;\"\r\n    )\r\n    .replaceAll(\r\n        \">\",\r\n        \"&gt;\"\r\n    )\r\n    .replaceAll(\r\n        '\"',\r\n        \"&quot;\"\r\n    )\r\n    .replaceAll(\r\n        \"'\",\r\n        \"&#039;\"\r\n    );\r\n\r\n}\r\n\r\n\r\nfunction statusText(status){\r\n\r\n    const map = {\r\n\r\n        pending:\r\n            \"\u041a\u04af\u0442\u0443\u0434\u0435\",\r\n\r\n        approved:\r\n            \"\u041e\u0434\u043e\u0431\u0440\u0435\u043d\u043e\",\r\n\r\n        rejected:\r\n            \"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e\",\r\n\r\n        blocked:\r\n            \"\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e\"\r\n\r\n    };\r\n\r\n    return map[status] ||\r\n        status;\r\n\r\n}\r\n\r\n\r\nfunction firebaseError(error){\r\n\r\n    const map = {\r\n\r\n        \"auth\/email-already-in-use\":\r\n            \"\u0411\u04b1\u043b Email \u0431\u04b1\u0440\u044b\u043d \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0435\u043d.\",\r\n\r\n        \"auth\/invalid-email\":\r\n            \"Email \u0434\u04b1\u0440\u044b\u0441 \u0435\u043c\u0435\u0441.\",\r\n\r\n        \"auth\/weak-password\":\r\n            \"\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u043a\u0435\u043c\u0456\u043d\u0434\u0435 6 \u0441\u0438\u043c\u0432\u043e\u043b.\",\r\n\r\n        \"auth\/invalid-credential\":\r\n            \"Email \u043d\u0435\u043c\u0435\u0441\u0435 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u04b1\u0440\u044b\u0441 \u0435\u043c\u0435\u0441.\",\r\n\r\n        \"permission-denied\":\r\n            \"Firebase Security Rules \u0440\u04b1\u049b\u0441\u0430\u0442 \u0431\u0435\u0440\u043c\u0435\u0434\u0456.\"\r\n\r\n    };\r\n\r\n\r\n    return map[\r\n        error.code\r\n    ] ||\r\n    error.message ||\r\n    \"\u0411\u0435\u043b\u0433\u0456\u0441\u0456\u0437 \u049b\u0430\u0442\u0435.\";\r\n\r\n}\r\n\r\n\r\n\/*\r\n===========================================================\r\n INITIAL\r\n===========================================================\r\n*\/\r\n\r\nloadTransports();\r\n\r\nupdateStats();\r\n\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-7e700a8 e-flex e-con-boxed e-con e-parent\" data-id=\"7e700a8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dc9167f elementor-widget elementor-widget-html\" data-id=\"dc9167f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\tfrom pathlib import Path\r\nimport zipfile, textwrap, os, json\r\n\r\nroot=Path(\"\/mnt\/data\/qazaq-cargo\")\r\n(root\/\"public\").mkdir(parents=True,exist_ok=True)\r\n(root\/\"src\").mkdir(exist_ok=True)\r\n\r\n(root\/\"package.json\").write_text(\"\"\"{\r\n  \"name\":\"qazaq-cargo\",\r\n  \"version\":\"1.0.0\",\r\n  \"private\":true,\r\n  \"scripts\":{\"start\":\"node server.js\",\"dev\":\"node --watch server.js\"},\r\n  \"dependencies\":{\r\n    \"dotenv\":\"^16.4.7\",\r\n    \"express\":\"^5.1.0\",\r\n    \"firebase-admin\":\"^13.5.0\",\r\n    \"express-rate-limit\":\"^8.0.1\"\r\n  }\r\n}\"\"\",encoding=\"utf-8\")\r\n\r\n(root\/\".env.example\").write_text(\"\"\"# SERVER\r\nPORT=3000\r\nNODE_ENV=development\r\n\r\n# WhatsApp Cloud API\r\nWHATSAPP_ACCESS_TOKEN=PASTE_META_ACCESS_TOKEN_HERE\r\nWHATSAPP_PHONE_NUMBER_ID=PASTE_PHONE_NUMBER_ID_HERE\r\nWHATSAPP_API_VERSION=v23.0\r\nWHATSAPP_SENDER_NUMBER=+77783727777\r\n\r\n# OTP\r\nOTP_TTL_SECONDS=300\r\nOTP_COOLDOWN_SECONDS=60\r\n\r\n# Firebase Admin\r\n# Recommended: put the JSON service account file outside public\/\r\nGOOGLE_APPLICATION_CREDENTIALS=.\/serviceAccountKey.json\r\nFIREBASE_PROJECT_ID=PASTE_FIREBASE_PROJECT_ID_HERE\r\n\r\n# First admin phone, digits only, e.g. 77783727777\r\nADMIN_PHONE=77783727777\r\n\"\"\",encoding=\"utf-8\")\r\n\r\n(root\/\"serviceAccountKey.json.example\").write_text(\"\"\"{\r\n  \"type\": \"service_account\",\r\n  \"project_id\": \"YOUR_PROJECT_ID\",\r\n  \"private_key_id\": \"YOUR_PRIVATE_KEY_ID\",\r\n  \"private_key\": \"-----BEGIN PRIVATE KEY-----\\\\\\\\nPASTE_PRIVATE_KEY\\\\\\\\n-----END PRIVATE KEY-----\\\\\\\\n\",\r\n  \"client_email\": \"firebase-adminsdk-xxxxx@YOUR_PROJECT_ID.iam.gserviceaccount.com\",\r\n  \"client_id\": \"YOUR_CLIENT_ID\",\r\n  \"auth_uri\": \"https:\/\/accounts.google.com\/o\/oauth2\/auth\",\r\n  \"token_uri\": \"https:\/\/oauth2.googleapis.com\/token\",\r\n  \"auth_provider_x509_cert_url\": \"https:\/\/www.googleapis.com\/oauth2\/v1\/certs\",\r\n  \"client_x509_cert_url\": \"PASTE_CLIENT_CERT_URL\"\r\n}\"\"\",encoding=\"utf-8\")\r\n\r\n(root\/\"server.js\").write_text(r\"\"\"require(\"dotenv\").config();\r\nconst path=require(\"path\");\r\nconst crypto=require(\"crypto\");\r\nconst express=require(\"express\");\r\nconst rateLimit=require(\"express-rate-limit\");\r\nconst {initializeApp,cert,getApps}=require(\"firebase-admin\/app\");\r\nconst {getFirestore,FieldValue}=require(\"firebase-admin\/firestore\");\r\n\r\nconst app=express();\r\nconst PORT=process.env.PORT||3000;\r\napp.use(express.json({limit:\"100kb\"}));\r\napp.use(express.static(path.join(__dirname,\"public\")));\r\n\r\nfunction initFirebase(){\r\n  if(getApps().length)return getFirestore();\r\n  const opts={projectId:process.env.FIREBASE_PROJECT_ID};\r\n  if(process.env.GOOGLE_APPLICATION_CREDENTIALS){\r\n    const fs=require(\"fs\");\r\n    const f=path.resolve(process.env.GOOGLE_APPLICATION_CREDENTIALS);\r\n    if(fs.existsSync(f)) opts.credential=cert(require(f));\r\n  }\r\n  initializeApp(opts);\r\n  return getFirestore();\r\n}\r\nlet db;\r\ntry{db=initFirebase()}catch(e){console.error(\"Firebase init error:\",e.message)}\r\n\r\nconst otpStore=new Map();\r\nconst sessions=new Map();\r\nconst sendLimiter=rateLimit({windowMs:15*60*1000,max:5,standardHeaders:true,legacyHeaders:false});\r\nconst verifyLimiter=rateLimit({windowMs:15*60*1000,max:15,standardHeaders:true,legacyHeaders:false});\r\n\r\nfunction digits(phone){return String(phone||\"\").replace(\/\\D\/g,\"\").replace(\/^8\/,\"7\")}\r\nfunction validPhone(p){return \/^7\\d{10}$\/.test(p)}\r\nfunction token(){return crypto.randomBytes(32).toString(\"hex\")}\r\nfunction requireDb(res){if(!db){res.status(503).json({error:\"Firebase not configured\"});return false}return true}\r\nfunction auth(req,res,next){\r\n const t=(req.headers.authorization||\"\").replace(\/^Bearer\\s+\/,\"\");\r\n const s=sessions.get(t);\r\n if(!s)return res.status(401).json({error:\"Unauthorized\"});\r\n req.user=s;req.sessionToken=t;next();\r\n}\r\nfunction admin(req,res,next){if(req.user.role!==\"admin\"&&req.user.role!==\"moderator\")return res.status(403).json({error:\"Admin only\"});next()}\r\n\r\nasync function sendWhatsAppText(to,text){\r\n const url=`https:\/\/graph.facebook.com\/${process.env.WHATSAPP_API_VERSION||\"v23.0\"}\/${process.env.WHATSAPP_PHONE_NUMBER_ID}\/messages`;\r\n const r=await fetch(url,{method:\"POST\",headers:{\r\n  \"Authorization\":`Bearer ${process.env.WHATSAPP_ACCESS_TOKEN}`,\r\n  \"Content-Type\":\"application\/json\"\r\n },body:JSON.stringify({messaging_product:\"whatsapp\",to,type:\"text\",text:{preview_url:false,body:text}})});\r\n const data=await r.json();\r\n if(!r.ok)throw new Error(data?.error?.message||\"WhatsApp API error\");\r\n return data;\r\n}\r\n\r\napp.get(\"\/api\/health\",(req,res)=>res.json({\r\n ok:true,\r\n firebase:!!db,\r\n whatsappConfigured:!!(process.env.WHATSAPP_ACCESS_TOKEN&&process.env.WHATSAPP_PHONE_NUMBER_ID),\r\n sender:process.env.WHATSAPP_SENDER_NUMBER||null\r\n}));\r\n\r\napp.post(\"\/api\/auth\/send-otp\",sendLimiter,async(req,res)=>{\r\n const phone=digits(req.body.phone);\r\n if(!validPhone(phone))return res.status(400).json({error:\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 +7 778 372 77 77\"});\r\n const old=otpStore.get(phone);\r\n if(old&&Date.now()-old.created<Number(process.env.OTP_COOLDOWN_SECONDS||60)*1000)\r\n   return res.status(429).json({error:\"\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043c\u0438\u043d\u0443\u0442\u0443\"});\r\n const code=String(crypto.randomInt(100000,1000000));\r\n otpStore.set(phone,{hash:crypto.createHash(\"sha256\").update(code).digest(\"hex\"),created:Date.now(),attempts:0});\r\n try{\r\n   if(!process.env.WHATSAPP_ACCESS_TOKEN||!process.env.WHATSAPP_PHONE_NUMBER_ID)\r\n     return res.status(503).json({error:\"WhatsApp Cloud API \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d. \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 .env\"});\r\n   await sendWhatsAppText(phone,`QAZAQ CARGO\\n\u0412\u0430\u0448 \u043a\u043e\u0434 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f: ${code}\\n\u041a\u043e\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 5 \u043c\u0438\u043d\u0443\u0442.`);\r\n   res.json({ok:true,message:\"\u041a\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0432 WhatsApp\"});\r\n }catch(e){\r\n   otpStore.delete(phone);\r\n   console.error(e);\r\n   res.status(502).json({error:e.message});\r\n }\r\n});\r\n\r\napp.post(\"\/api\/auth\/verify-otp\",verifyLimiter,async(req,res)=>{\r\n if(!requireDb(res))return;\r\n const phone=digits(req.body.phone),code=String(req.body.code||\"\").trim(),x=otpStore.get(phone);\r\n if(!validPhone(phone)||!x)return res.status(400).json({error:\"\u041a\u043e\u0434 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0438\u0441\u0442\u0451\u043a\"});\r\n if(Date.now()-x.created>Number(process.env.OTP_TTL_SECONDS||300)*1000)return res.status(400).json({error:\"\u041a\u043e\u0434 \u0438\u0441\u0442\u0451\u043a\"});\r\n if(x.attempts>=5)return res.status(429).json({error:\"\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a\"});\r\n x.attempts++;\r\n const hash=crypto.createHash(\"sha256\").update(code).digest(\"hex\");\r\n if(hash!==x.hash)return res.status(400).json({error:\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434\"});\r\n otpStore.delete(phone);\r\n const ref=db.collection(\"users\").doc(phone);\r\n const snap=await ref.get();\r\n let user=snap.exists?snap.data():{\r\n   id:phone,phone,name:\"\",company:\"\",iin:\"\",\r\n   role:phone===digits(process.env.ADMIN_PHONE)?\"admin\":\"user\",\r\n   createdAt:FieldValue.serverTimestamp()\r\n };\r\n await ref.set({...user,lastLoginAt:FieldValue.serverTimestamp()},{merge:true});\r\n const t=token();sessions.set(t,{id:phone,phone,role:user.role,name:user.name,company:user.company||\"\"});\r\n res.json({ok:true,token:t,user:{id:phone,phone,role:user.role,name:user.name,company:user.company||\"\"},needsProfile:!user.name});\r\n});\r\n\r\napp.put(\"\/api\/me\",auth,async(req,res)=>{\r\n if(!requireDb(res))return;\r\n const data={name:String(req.body.name||\"\").trim(),company:String(req.body.company||\"\").trim(),iin:String(req.body.iin||\"\").trim()};\r\n if(!data.name)return res.status(400).json({error:\"\u0418\u043c\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\"});\r\n await db.collection(\"users\").doc(req.user.id).set(data,{merge:true});\r\n Object.assign(req.user,data);\r\n res.json({ok:true,user:req.user});\r\n});\r\n\r\napp.post(\"\/api\/transports\",auth,async(req,res)=>{\r\n if(!requireDb(res))return;\r\n const b=req.body;\r\n if(!b.from||!b.to||!b.date||!b.body||!b.weight)return res.status(400).json({error:\"\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f\"});\r\n const ref=await db.collection(\"transports\").add({\r\n   from:String(b.from),to:String(b.to),date:String(b.date),body:String(b.body),\r\n   weight:Number(b.weight),volume:Number(b.volume||0),number:String(b.number||\"\"),\r\n   price:Number(b.price||0),currency:String(b.currency||\"\u0442\u0435\u043d\u0433\u0435\"),\r\n   phone:String(b.phone||req.user.phone),gps:String(b.gps||\"\u0416\u043e\u049b\"),\r\n   description:String(b.description||\"\"),userId:req.user.id,userName:req.user.name||\"\",\r\n   status:\"pending\",createdAt:FieldValue.serverTimestamp()\r\n });\r\n res.json({ok:true,id:ref.id});\r\n});\r\n\r\napp.get(\"\/api\/transports\",async(req,res)=>{\r\n if(!requireDb(res))return;\r\n let q=db.collection(\"transports\");\r\n if(req.query.status)q=q.where(\"status\",\"==\",String(req.query.status));\r\n const snap=await q.limit(200).get();\r\n const arr=snap.docs.map(d=>({id:d.id,...d.data()}));\r\n res.json({ok:true,items:arr});\r\n});\r\n\r\napp.get(\"\/api\/my-transports\",auth,async(req,res)=>{\r\n if(!requireDb(res))return;\r\n const snap=await db.collection(\"transports\").where(\"userId\",\"==\",req.user.id).limit(100).get();\r\n res.json({ok:true,items:snap.docs.map(d=>({id:d.id,...d.data()}))});\r\n});\r\n\r\napp.patch(\"\/api\/admin\/transports\/:id\",auth,admin,async(req,res)=>{\r\n if(!requireDb(res))return;\r\n const status=String(req.body.status||\"\");\r\n if(![\"approved\",\"rejected\",\"pending\"].includes(status))return res.status(400).json({error:\"Invalid status\"});\r\n await db.collection(\"transports\").doc(req.params.id).update({status,moderatedBy:req.user.id,moderatedAt:FieldValue.serverTimestamp()});\r\n res.json({ok:true});\r\n});\r\n\r\napp.get(\"\/api\/admin\/users\",auth,admin,async(req,res)=>{\r\n if(!requireDb(res))return;\r\n const snap=await db.collection(\"users\").limit(500).get();\r\n res.json({ok:true,items:snap.docs.map(d=>({id:d.id,...d.data()}))});\r\n});\r\n\r\napp.post(\"\/api\/logout\",auth,(req,res)=>{sessions.delete(req.sessionToken);res.json({ok:true})});\r\n\r\napp.get(\"*\",(req,res)=>res.sendFile(path.join(__dirname,\"public\",\"index.html\")));\r\napp.listen(PORT,()=>console.log(`QAZAQ CARGO http:\/\/localhost:${PORT}`));\r\n\"\"\",encoding=\"utf-8\")\r\n\r\n# Simple frontend\r\n(root\/\"public\/index.html\").write_text(r\"\"\"<!doctype html>\r\n<html lang=\"kk\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\r\n<title>QAZAQ CARGO<\/title>\r\n<style>\r\nbody{font-family:Arial;margin:0;background:#f4f6f8;color:#17202a}header{background:#111827;color:#fff;padding:15px 20px;display:flex;gap:20px;align-items:center;justify-content:space-between;flex-wrap:wrap}.logo{font-size:23px;font-weight:900;color:#f59e0b}.logo span{color:#fff}nav{display:flex;gap:5px;flex-wrap:wrap}button{border:0;border-radius:8px;padding:10px 14px;font-weight:700;cursor:pointer}.nav{background:transparent;color:#ddd}.primary{background:#f59e0b}.green{background:#16a34a;color:#fff}.dark{background:#111827;color:#fff}.gray{background:#e5e7eb}.red{background:#dc2626;color:#fff}.wrap{max-width:1200px;margin:auto;padding:25px}.page{display:none}.page.active{display:block}.hero,.card{background:#fff;border-radius:14px;padding:25px;margin-bottom:20px;box-shadow:0 3px 15px #0001}.hero{background:linear-gradient(135deg,#111827,#334155);color:#fff}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.field{display:flex;flex-direction:column;gap:6px}.full{grid-column:1\/-1}input,select,textarea{padding:11px;border:1px solid #d1d5db;border-radius:8px;font:inherit}textarea{min-height:90px}.actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:15px}.hidden{display:none!important}.status{padding:12px;background:#f3f4f6;border-radius:8px;margin-top:12px}.list{display:grid;grid-template-columns:repeat(2,1fr);gap:15px}.transport{background:#fff;padding:18px;border-radius:12px;border-left:5px solid #f59e0b}.route{font-size:20px;font-weight:900}.badge{display:inline-block;padding:4px 8px;border-radius:20px;font-size:12px;font-weight:700}.approved{background:#dcfce7;color:#166534}.pending{background:#fef3c7;color:#92400e}.rejected{background:#fee2e2;color:#991b1b}.toast{position:fixed;right:20px;bottom:20px;background:#111827;color:#fff;padding:14px;border-radius:8px;display:none}.toast.show{display:block}table{width:100%;border-collapse:collapse}th,td{padding:10px;border-bottom:1px solid #ddd;text-align:left}.table{overflow:auto}@media(max-width:800px){.grid,.list{grid-template-columns:1fr}}\r\n<\/style><\/head>\r\n<body>\r\n<header><div class=\"logo\">QAZAQ <span>CARGO<\/span><\/div><nav>\r\n<button class=\"nav\" onclick=\"show('home')\">\ud83c\udfe0 \u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442<\/button><button class=\"nav\" onclick=\"show('transport')\">\ud83d\ude9b \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442<\/button><button class=\"nav\" onclick=\"show('add')\">\u2795 \u049a\u043e\u0441\u0443<\/button><button class=\"nav\" onclick=\"show('cabinet')\">\ud83d\udc64 \u041a\u0430\u0431\u0438\u043d\u0435\u0442<\/button><button id=\"adminNav\" class=\"nav hidden\" onclick=\"show('admin')\">\ud83d\udee0 Admin<\/button><\/nav><div><span id=\"who\">\u049a\u043e\u043d\u0430\u049b<\/span> <button id=\"loginNav\" class=\"primary\" onclick=\"show('login')\">\u041a\u0456\u0440\u0443<\/button><button id=\"logoutNav\" class=\"gray hidden\" onclick=\"logout()\">\u0428\u044b\u0493\u0443<\/button><\/div><\/header>\r\n<main class=\"wrap\">\r\n<section id=\"home\" class=\"page active\"><div class=\"hero\"><h1>\ud83d\ude9b QAZAQ CARGO<\/h1><p>\u0416\u04af\u043a \u0436\u04d9\u043d\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b\u043d\u0430 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430.<\/p><button class=\"primary\" onclick=\"show('transport')\">\ud83d\udd0e \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0456\u0437\u0434\u0435\u0443<\/button><\/div><div class=\"card\"><h2>\ud83d\udcac WhatsApp \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0456\u0440\u043a\u0435\u043b\u0443<\/h2><p>\u042d\u0426\u049a\/NCALayer \u0436\u043e\u049b. OTP \u043a\u043e\u0434\u044b \u0442\u0456\u043a\u0435\u043b\u0435\u0439 WhatsApp-\u049b\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0435\u0434\u0456.<\/p><button class=\"green\" onclick=\"show('login')\">\ud83d\udcf1 WhatsApp \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443<\/button><\/div><\/section>\r\n<section id=\"login\" class=\"page\"><div class=\"card\"><h2>\ud83d\udcf1 WhatsApp OTP<\/h2><div class=\"field\"><label>\u0422\u0435\u043b\u0435\u0444\u043e\u043d<\/label><input id=\"phone\" placeholder=\"+7 778 372 77 77\"><\/div><div class=\"actions\"><button class=\"green\" onclick=\"sendOtp()\">\ud83d\udcac \u041a\u043e\u0434 \u0436\u0456\u0431\u0435\u0440\u0443<\/button><\/div><div id=\"verify\" class=\"hidden\"><br><div class=\"field\"><label>WhatsApp-\u0442\u0430 \u043a\u0435\u043b\u0433\u0435\u043d 6 \u0442\u0430\u04a3\u0431\u0430\u043b\u044b \u043a\u043e\u0434<\/label><input id=\"code\" maxlength=\"6\"><\/div><div class=\"actions\"><button class=\"primary\" onclick=\"verifyOtp()\">\u2705 \u0420\u0430\u0441\u0442\u0430\u0443<\/button><\/div><\/div><div id=\"loginStatus\" class=\"status hidden\"><\/div><\/div><div id=\"profile\" class=\"card hidden\"><h2>\ud83d\udc64 \u041f\u0440\u043e\u0444\u0438\u043b\u044c<\/h2><div class=\"grid\"><div class=\"field\"><label>\u0410\u0442\u044b-\u0436\u04e9\u043d\u0456 *<\/label><input id=\"name\"><\/div><div class=\"field\"><label>\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f<\/label><input id=\"company\"><\/div><div class=\"field\"><label>\u0418\u0418\u041d\/\u0411\u0418\u041d<\/label><input id=\"iin\"><\/div><\/div><button class=\"green\" onclick=\"saveProfile()\">\u0421\u0430\u049b\u0442\u0430\u0443<\/button><\/div><\/section>\r\n<section id=\"transport\" class=\"page\"><div class=\"card\"><h2>\ud83d\udd0e \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442<\/h2><div class=\"grid\"><div class=\"field\"><label>\u041e\u0442\u043a\u0443\u0434\u0430<\/label><input id=\"qf\"><\/div><div class=\"field\"><label>\u041a\u0443\u0434\u0430<\/label><input id=\"qt\"><\/div><div class=\"field\"><label>\u041a\u0443\u0437\u043e\u0432<\/label><select id=\"qb\"><option value=\"\">\u0411\u0430\u0440\u043b\u044b\u0493\u044b<\/option><option>\u0422\u0435\u043d\u0442<\/option><option>\u0420\u0435\u0444\u0440\u0438\u0436\u0435\u0440\u0430\u0442\u043e\u0440<\/option><option>\u0418\u0437\u043e\u0442\u0435\u0440\u043c<\/option><option>\u0411\u043e\u0440\u0442<\/option><option>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\u043e\u0437<\/option><\/select><\/div><\/div><button class=\"primary\" onclick=\"loadTrans()\">\ud83d\udd0e \u0406\u0437\u0434\u0435\u0443<\/button><\/div><div id=\"list\" class=\"list\"><\/div><\/section>\r\n<section id=\"add\" class=\"page\"><div class=\"card\"><h2>\u2795 \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u049b\u043e\u0441\u0443<\/h2><div id=\"addLogin\">\u0410\u043b\u0434\u044b\u043c\u0435\u043d WhatsApp \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0456\u04a3\u0456\u0437.<\/div><form id=\"form\" class=\"hidden\"><div class=\"grid\"><div class=\"field\"><label>\u041e\u0442\u043a\u0443\u0434\u0430 *<\/label><input id=\"from\" required><\/div><div class=\"field\"><label>\u041a\u0443\u0434\u0430 *<\/label><input id=\"to\" required><\/div><div class=\"field\"><label>\u0414\u0430\u0442\u0430 *<\/label><input id=\"date\" type=\"date\" required><\/div><div class=\"field\"><label>\u041a\u0443\u0437\u043e\u0432 *<\/label><select id=\"body\" required><option value=\"\">\u0422\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437<\/option><option>\u0422\u0435\u043d\u0442<\/option><option>\u0420\u0435\u0444\u0440\u0438\u0436\u0435\u0440\u0430\u0442\u043e\u0440<\/option><option>\u0418\u0437\u043e\u0442\u0435\u0440\u043c<\/option><option>\u0411\u043e\u0440\u0442<\/option><option>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\u043e\u0437<\/option><\/select><\/div><div class=\"field\"><label>\u0412\u0435\u0441, \u0442 *<\/label><input id=\"weight\" type=\"number\" step=\".1\" required><\/div><div class=\"field\"><label>\u041e\u0431\u044a\u0451\u043c, \u043c\u00b3<\/label><input id=\"volume\" type=\"number\"><\/div><div class=\"field\"><label>\u0413\u043e\u0441\u043d\u043e\u043c\u0435\u0440<\/label><input id=\"number\"><\/div><div class=\"field\"><label>\u0411\u0430\u0493\u0430<\/label><input id=\"price\" type=\"number\"><\/div><div class=\"field\"><label>\u0412\u0430\u043b\u044e\u0442\u0430<\/label><select id=\"currency\"><option>\u0442\u0435\u043d\u0433\u0435<\/option><option>USD<\/option><option>RUB<\/option><option>UZS<\/option><option>CNY<\/option><\/select><\/div><div class=\"field\"><label>\u0422\u0435\u043b\u0435\u0444\u043e\u043d<\/label><input id=\"truckPhone\"><\/div><div class=\"field\"><label>GPS<\/label><select id=\"gps\"><option>\u0418\u04d9<\/option><option>\u0416\u043e\u049b<\/option><\/select><\/div><div class=\"field full\"><label>\u0410\u049b\u043f\u0430\u0440\u0430\u0442<\/label><textarea id=\"desc\"><\/textarea><\/div><\/div><button class=\"primary\">\ud83d\ude9b \u0416\u0430\u0440\u0438\u044f\u043b\u0430\u0443<\/button><\/form><\/div><\/section>\r\n<section id=\"cabinet\" class=\"page\"><div class=\"card\"><h2>\ud83d\udc64 \u041a\u0430\u0431\u0438\u043d\u0435\u0442<\/h2><div id=\"cab\"><\/div><\/div><\/section>\r\n<section id=\"admin\" class=\"page\"><div class=\"card\"><h2>\ud83d\udee0 Admin Panel<\/h2><div id=\"adminStats\"><\/div><\/div><div class=\"card table\"><table><thead><tr><th>\u041c\u0430\u0440\u0448\u0440\u0443\u0442<\/th><th>\u0414\u0430\u0442\u0430<\/th><th>\u041a\u0443\u0437\u043e\u0432<\/th><th>\u0410\u0432\u0442\u043e\u0440<\/th><th>\u0421\u0442\u0430\u0442\u0443\u0441<\/th><th>\u04d8\u0440\u0435\u043a\u0435\u0442<\/th><\/tr><\/thead><tbody id=\"adminTable\"><\/tbody><\/table><\/div><\/section>\r\n<\/main><div id=\"toast\" class=\"toast\"><\/div>\r\n<script>\r\nlet token=localStorage.getItem(\"qc_token\")||\"\",user=JSON.parse(localStorage.getItem(\"qc_user\")||\"null\");\r\nconst $=id=>document.getElementById(id);\r\nconst esc=s=>String(s??\"\").replace(\/[&<>\"']\/g,m=>({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\"}[m]));\r\nfunction toast(s){$(\"toast\").textContent=s;$(\"toast\").classList.add(\"show\");setTimeout(()=>$(\"toast\").classList.remove(\"show\"),2600)}\r\nfunction show(id){document.querySelectorAll(\".page\").forEach(x=>x.classList.remove(\"active\"));$(id).classList.add(\"active\");if(id===\"transport\")loadTrans();if(id===\"cabinet\")cabinet();if(id===\"admin\")admin();ui()}\r\nfunction ui(){let on=!!user;$(\"who\").textContent=on?(user.name||user.phone):\"\u049a\u043e\u043d\u0430\u049b\";$(\"loginNav\").classList.toggle(\"hidden\",on);$(\"logoutNav\").classList.toggle(\"hidden\",!on);$(\"adminNav\").classList.toggle(\"hidden\",!(on&&[\"admin\",\"moderator\"].includes(user.role)));$(\"form\").classList.toggle(\"hidden\",!on);$(\"addLogin\").classList.toggle(\"hidden\",on)}\r\nasync function api(url,opt={}){opt.headers={...(opt.headers||{}),\"Content-Type\":\"application\/json\"};if(token)opt.headers.Authorization=\"Bearer \"+token;let r=await fetch(url,opt),d=await r.json();if(!r.ok)throw Error(d.error||\"\u049a\u0430\u0442\u0435\");return d}\r\nasync function sendOtp(){try{let d=await api(\"\/api\/auth\/send-otp\",{method:\"POST\",body:JSON.stringify({phone:$(\"phone\").value})});$(\"verify\").classList.remove(\"hidden\");$(\"loginStatus\").classList.remove(\"hidden\");$(\"loginStatus\").textContent=d.message;toast(\"\u041a\u043e\u0434 WhatsApp-\u049b\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456\")}catch(e){toast(e.message)}}\r\nasync function verifyOtp(){try{let d=await api(\"\/api\/auth\/verify-otp\",{method:\"POST\",body:JSON.stringify({phone:$(\"phone\").value,code:$(\"code\").value})});token=d.token;user=d.user;localStorage.setItem(\"qc_token\",token);localStorage.setItem(\"qc_user\",JSON.stringify(user));if(d.needsProfile)$(\"profile\").classList.remove(\"hidden\");else show(\"cabinet\");ui();toast(\"\u0421\u04d9\u0442\u0442\u0456 \u043a\u0456\u0440\u0434\u0456\u04a3\u0456\u0437\")}catch(e){toast(e.message)}}\r\nasync function saveProfile(){try{let d=await api(\"\/api\/me\",{method:\"PUT\",body:JSON.stringify({name:$(\"name\").value,company:$(\"company\").value,iin:$(\"iin\").value})});user=d.user;localStorage.setItem(\"qc_user\",JSON.stringify(user));$(\"profile\").classList.add(\"hidden\");show(\"cabinet\");toast(\"\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b\")}catch(e){toast(e.message)}}\r\nasync function logout(){try{await api(\"\/api\/logout\",{method:\"POST\"})}catch(e){}token=\"\";user=null;localStorage.clear();ui();show(\"home\")}\r\n$(\"form\").onsubmit=async e=>{e.preventDefault();try{await api(\"\/api\/transports\",{method:\"POST\",body:JSON.stringify({from:$(\"from\").value,to:$(\"to\").value,date:$(\"date\").value,body:$(\"body\").value,weight:$(\"weight\").value,volume:$(\"volume\").value,number:$(\"number\").value,price:$(\"price\").value,currency:$(\"currency\").value,phone:$(\"truckPhone\").value,gps:$(\"gps\").value,description:$(\"desc\").value})});e.target.reset();toast(\"\u041c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f\u0493\u0430 \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0434\u0456\");show(\"cabinet\")}catch(e){toast(e.message)}}\r\nasync function loadTrans(){try{let d=await api(\"\/api\/transports?status=approved\"),f=$(\"qf\").value.toLowerCase(),t=$(\"qt\").value.toLowerCase(),b=$(\"qb\").value;let a=d.items.filter(x=>(!f||x.from.toLowerCase().includes(f))&&(!t||x.to.toLowerCase().includes(t))&&(!b||x.body===b));$(\"list\").innerHTML=a.length?a.map(x=>`<div class=\"transport\"><div class=\"route\">${esc(x.from)} \u2192 ${esc(x.to)}<\/div><span class=\"badge approved\">\u041e\u0434\u043e\u0431\u0440\u0435\u043d\u043e<\/span><p>\ud83d\udcc5 ${esc(x.date)} \u00b7 \ud83d\ude9b ${esc(x.body)} \u00b7 \u2696\ufe0f ${x.weight} \u0442<\/p><h3>${Number(x.price||0).toLocaleString()} ${esc(x.currency)}<\/h3><a class=\"green\" style=\"padding:10px;color:#fff;text-decoration:none;border-radius:8px;display:inline-block\" target=\"_blank\" href=\"https:\/\/wa.me\/${String(x.phone||\"\").replace(\/\\D\/g,\"\")}\">\ud83d\udcac WhatsApp<\/a><\/div>`).join(\"\"):\"<div class='card'>\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.<\/div>\"}catch(e){toast(e.message)}}\r\nasync function cabinet(){if(!user){$(\"cab\").innerHTML=\"\u041a\u0456\u0440\u0443 \u049b\u0430\u0436\u0435\u0442.\";return}try{let d=await api(\"\/api\/my-transports\");$(\"cab\").innerHTML=`<h3>${esc(user.name||\"\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\")}<\/h3><p>\ud83d\udcf1 ${esc(user.phone)} \u00b7 \ud83c\udfe2 ${esc(user.company||\"\")}<\/p><h3>\u041c\u0435\u043d\u0456\u04a3 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0442\u0430\u0440\u044b\u043c<\/h3>`+(d.items.length?d.items.map(x=>`<div class=\"transport\"><b>${esc(x.from)} \u2192 ${esc(x.to)}<\/b><br>${esc(x.date)} \u00b7 ${esc(x.body)} \u00b7 ${x.weight} \u0442<br><span class=\"badge ${x.status}\">${esc(x.status)}<\/span><\/div>`).join(\"\"):\"\u0416\u043e\u049b\")}catch(e){toast(e.message)}}\r\nasync function admin(){if(!user||![\"admin\",\"moderator\"].includes(user.role))return;$(\"adminTable\").innerHTML=\"\u0416\u04af\u043a\u0442\u0435\u043b\u0443\u0434\u0435...\";try{let d=await api(\"\/api\/transports\"),a=d.items;$(\"adminStats\").textContent=`Users\/Transport: ${a.length} transport`;$(\"adminTable\").innerHTML=a.map(x=>`<tr><td>${esc(x.from)} \u2192 ${esc(x.to)}<\/td><td>${esc(x.date)}<\/td><td>${esc(x.body)}<\/td><td>${esc(x.userName)}<br>${esc(x.phone)}<\/td><td>${esc(x.status)}<\/td><td><button class=\"green\" onclick=\"mod('${x.id}','approved')\">\u2713<\/button> <button class=\"red\" onclick=\"mod('${x.id}','rejected')\">\u2715<\/button><\/td><\/tr>`).join(\"\")}catch(e){toast(e.message)}}\r\nasync function mod(id,status){try{await api(\"\/api\/admin\/transports\/\"+id,{method:\"PATCH\",body:JSON.stringify({status})});admin();toast(\"\u04e8\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0434\u0456\")}catch(e){toast(e.message)}}\r\nui();\r\n<\/script><\/body><\/html>\r\n\"\"\",encoding=\"utf-8\")\r\n\r\n(root\/\"README.md\").write_text(\"\"\"# QAZAQ CARGO \u2014 WhatsApp OTP + Firebase\/Firestore\r\n\r\n## 1. \u041e\u0440\u043d\u0430\u0442\u0443\r\n```bash\r\nnpm install\r\ncopy .env.example .env\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>QAZAQ CARGO \u2014 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u0456\u0440\u0443 QAZAQ CARGO \ud83c\udfe0 \u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442 \ud83d\ude9b \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u2795 \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u049b\u043e\u0441\u0443 \ud83d\udc64 \u041a\u0430\u0431\u0438\u043d\u0435\u0442 \ud83d\udee0 Admin \u049a\u043e\u043d\u0430\u049b \u041a\u0456\u0440\u0443 \u0428\u044b\u0493\u0443 \ud83d\ude9b QAZAQ CARGO \u049a\u0430\u0437\u0430\u049b\u0441\u0442\u0430\u043d \u0436\u04d9\u043d\u0435 \u0445\u0430\u043b\u044b\u049b\u0430\u0440\u0430\u043b\u044b\u049b \u0431\u0430\u0493\u044b\u0442\u0442\u0430\u0440 \u0431\u043e\u0439\u044b\u043d\u0448\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043f\u0435\u043d \u0436\u04af\u043a \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0430\u0442\u044b\u043d \u043e\u043d\u043b\u0430\u0439\u043d \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430. \ud83d\ude9b \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0456\u0437\u0434\u0435\u0443 \u2795 \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0436\u0430\u0440\u0438\u044f\u043b\u0430\u0443 \ud83d\udd10 \u042d\u0426\u049a \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u0430\u0443\u0456\u043f\u0441\u0456\u0437 \u043a\u0456\u0440\u0443 \u049a\u0430\u0437\u0430\u049b\u0441\u0442\u0430\u043d\u043d\u044b\u04a3 \u04b0\u043b\u0442\u0442\u044b\u049b \u043a\u0443\u04d9\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u0448\u044b \u043e\u0440\u0442\u0430\u043b\u044b\u0493\u044b\u043d\u044b\u04a3 \u042d\u0426\u049a-\u0441\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-19","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=\/wp\/v2\/pages\/19","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=19"}],"version-history":[{"count":10,"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=\/wp\/v2\/pages\/19\/revisions"}],"predecessor-version":[{"id":37,"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=\/wp\/v2\/pages\/19\/revisions\/37"}],"wp:attachment":[{"href":"https:\/\/tulpar-agro-logistics.kz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}