[
{
"id": 22166,
"label": "Nome do app",
"name": "APP_NAME",
"value": "DTunnel VPN",
"type": "STRING",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22167,
"label": "Logo do app",
"name": "APP_LOGO",
"value": null,
"type": "IMAGE",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22168,
"label": "Imagem de fundo",
"name": "APP_BACKGROUND_IMAGE",
"value": null,
"type": "IMAGE",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22169,
"label": "Tipo do fundo do app",
"name": "APP_BACKGROUND_TYPE",
"value": {
"options": [
{
"label": "Imagem",
"value": "IMAGE"
},
{
"label": "Cor",
"value": "COLOR"
}
],
"selected": "COLOR"
},
"type": "SELECT",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22170,
"label": "Cor de fundo",
"name": "APP_BACKGROUND_COLOR",
"value": "#080e16c7",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22171,
"label": "Cor do card inicial",
"name": "APP_CARD_COLOR",
"value": "#1d242e73",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22172,
"label": "Raio do card inicial",
"name": "APP_CARD_RADIUS",
"value": 20,
"type": "INTEGER",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22173,
"label": "Cor do card de status",
"name": "APP_CARD_STATUS_COLOR",
"value": "#1d242e73",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22174,
"label": "Raio do card de status",
"name": "APP_CARD_STATUS_RADIUS",
"value": 25,
"type": "INTEGER",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22175,
"label": "Cor do card de configurações",
"name": "APP_CARD_CONFIG_COLOR",
"value": "#1D1D1D",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22176,
"label": "Cor do fundo dos dialogs",
"name": "APP_DIALOG_BACKGROUND_COLOR",
"value": "#1D1D1D",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22177,
"label": "Cor do fundo do dialog de log",
"name": "APP_DIALOG_LOGGER_COLOR",
"value": "#1D1D1D",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22178,
"label": "Cor das bordas",
"name": "APP_BORDER_COLOR",
"value": "#1d242e73",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22179,
"label": "Cor dos inputs",
"name": "APP_INPUT_COLOR",
"value": "#1d242e73",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22180,
"label": "Raio dos inputs",
"name": "APP_INPUT_RADIUS",
"value": 25,
"type": "INTEGER",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22181,
"label": "Cor dos textos",
"name": "APP_TEXT_COLOR",
"value": "#FFFFFFFF",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22182,
"label": "Cor dos botões",
"name": "APP_BUTTON_COLOR",
"value": "#1d242e73",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22183,
"label": "Raio dos botões",
"name": "APP_BUTTON_RADIUS",
"value": 25,
"type": "INTEGER",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22184,
"label": "Cor dos icones",
"name": "APP_ICON_COLOR",
"value": "#FFFFFFFF",
"type": "COLOR",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22185,
"label": "Exibir modo de conexão",
"name": "APP_SHOW_CONNECTION_MODE",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22871,
"label": "Atualizar automaticamente as configurações ao lançar uma atualização.",
"name": "APP_CONFIG_AUTO_UPDATE",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22186,
"label": "Iniciar o app automaticamente ao reiniciar o dispositivo",
"name": "APP_AUTO_START",
"value": false,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22187,
"label": "Usar limiter de conexão",
"name": "APP_CONNECTION_LIMITER",
"value": false,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22188,
"label": "Usar botão de atualizações",
"name": "APP_BTN_UPDATE_ENABLED",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22189,
"label": "Usar botão de registros",
"name": "APP_BTN_LOGGER_ENABLED",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22190,
"label": "Usar botão de pagina webview",
"name": "APP_BTN_PAGE_ENABLED",
"value": false,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22191,
"label": "Ativar dialog de erros",
"name": "APP_DIALOG_ERROR_ENABLED",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22192,
"label": "Ativar dialog de checkuser",
"name": "APP_CHECKUSER_DIALOG_ENABLED",
"value": false,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22193,
"label": "Ativar toast de sucesso",
"name": "APP_SUCCESS_TOAST_ENABLED",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22194,
"label": "Ativar toast de erro",
"name": "APP_ERROR_TOAST_ENABLED",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22195,
"label": "Usar layout webview",
"name": "APP_LAYOUT_WEBVIEW_ENABLED",
"value": true,
"type": "BOOLEAN",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22196,
"label": "Mensagem",
"name": "APP_MESSAGE",
"value": null,
"type": "TEXT",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22197,
"label": "URL de atualização do aplicativo",
"name": "APP_UPDATE_URL",
"value": null,
"type": "URL",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22198,
"label": "Tipo de mensagem",
"name": "APP_MESSAGE_TYPE",
"value": {
"options": [
{
"label": "Alerta",
"value": "ALERT"
},
{
"label": "Informação",
"value": "INFO"
},
{
"label": "Boas vindas",
"value": "WELCOME"
},
{
"label": "Sem mensagem",
"value": "NONE"
}
],
"selected": "NONE"
},
"type": "SELECT",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22199,
"label": "LAYOUT WEBVIEW (POR SUA CONTA E RISCO)",
"name": "APP_LAYOUT_WEBVIEW",
"value": "<!DOCTYPE html>\n<html lang=\"pt-BR\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <script src=\"https://kit.fontawesome.com/64d58efce2.js\" crossorigin=\"anonymous\"></script>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css\">\n <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css\">\n <link rel=\"stylesheet\" href=\"https://guardianofc.github.io/css/bootstrap.min.css\">\n <script type=\"text/javascript\"\n src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js\"\n integrity=\"sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe\"\n crossorigin=\"anonymous\"></script>\n <title>Guardian</title>\n <style>\n @import url(\"https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700;800&display=swap\");\n\n :root {\n\n /*Editar background*/\n --bg: #fff;\n --bg-img: url(https://i.ibb.co/7CmBMvW/20230801-223921.png);\n\n /*Editar o modal*/\n --btn-modal: #0000003f;\n --btn-modal-border: 20px;\n --modal-shadow: #052453;\n --modal-bg: #052453;\n --config-color: #0000003f;\n --category-color: #0000003f;\n --text-color: #ffffff;\n\n /*Editar os títulos e container*/\n --title: #fff;\n --title-2: #fff;\n --container-linear: linear-gradient(-45deg, #04befe 0%, #04befe 100%);\n\n /*Editar a box (user/password)*/\n --box-color: #052453;\n --box-text: #fff;\n --box-border: 20px;\n --box-icon: #052453;\n --box-typing: #fff;\n\n /*Editar os ícones*/\n --icon: #fff;\n --icon-border: 50px;\n --icon-border-color: 1px solid #fff;\n --icon-pressed: #aaa;\n\n /*Editar os botão start*/\n --btn-color: #04befe;\n --btn-border: 50px;\n --btn-text: #fff;\n --btn-pressed: #04befe;\n --btn-transparent: 2px solid #fff;\n }\n\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n body,\n input {\n font-family: \"Poppins\", sans-serif;\n }\n\n .container {\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 100vw;\n\n\n\n position: relative;\n /*background: var(--bg-img) center center / cover rgb(32, 32, 32);*/\n background: var(--bg-img) center center / cover rgb(32, 32, 32);\n overflow: hidden;\n }\n\n .forms-container {\n position: absolute;\n width: 100%;\n height: 100vh;\n top: -3%;\n left: 0;\n }\n\n .signin-signup {\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n left: 75%;\n width: 50%;\n transition: 1s 0.7s ease-in-out;\n display: grid;\n grid-template-columns: 1fr;\n z-index: 5;\n }\n\n form {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n padding: 0rem 5rem;\n transition: all 0.2s 0.7s;\n overflow: hidden;\n grid-column: 1 / 2;\n grid-row: 1 / 2;\n }\n\n form.sign-up-form {\n opacity: 0;\n z-index: 1;\n }\n\n form.sign-in-form {\n z-index: 2;\n }\n\n .title {\n font-size: 1.5rem;\n color: var(--title);\n margin-bottom: 10px;\n }\n\n .bg-input {\n\n width: 100%;\n background-color: transparent;\n margin: 10px 0;\n height: 55px;\n border-radius: var(--box-border);\n border: 3px solid #fff;\n grid-template-columns: 15% 85%;\n padding: 0 0.4rem;\n\n }\n\n input {\n width: 100%;\n background: transparent;\n border: none;\n outline: none;\n color: var(--box-typing);\n line-height: 1;\n font-weight: 600;\n font-size: 1.1rem;\n }\n\n .bg-input i.icon {\n color: var(--box-icon);\n }\n\n .bg-input input::placeholder {\n color: #fff;\n font-weight: 500;\n }\n\n .social-text {\n color: #fff;\n padding: 0.7rem 0;\n font-size: 1rem;\n }\n\n .social-media {\n display: flex;\n justify-content: center;\n }\n\n .social-icon {\n height: 46px;\n width: 46px;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0 0.45rem;\n color: var(--icon);\n border-radius: var(--icon-border);\n border: var(--icon-border-color);\n text-decoration: none;\n font-size: 1.1rem;\n transition: 0.3s;\n }\n\n .social-icon:hover {\n color: var(--icon-pressed);\n border-color: var(--icon-pressed);\n }\n\n .btn {\n width: 150px;\n\n border: none;\n outline: none;\n height: 49px;\n border-radius: var(--btn-border);\n color: var(--btn-text);\n text-transform: uppercase;\n font-weight: 600;\n margin: 20px 0;\n cursor: pointer;\n transition: 0.5s;\n }\n\n .btn:hover {\n background-color: var(--btn-pressed);\n }\n\n .panels-container {\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n }\n\n .container:before {\n content: \"\";\n position: absolute;\n height: 2000px;\n width: 2000px;\n top: -10%;\n right: 48%;\n transform: translateY(-50%);\n background-image: var(--container-linear);\n /*background-color: var(container-color)*/\n transition: 1.8s ease-in-out;\n border-radius: 50%;\n z-index: 6;\n }\n\n .image {\n width: 100%;\n transition: transform 1.1s ease-in-out;\n transition-delay: 0.4s;\n }\n\n .panel {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n justify-content: space-around;\n text-align: center;\n z-index: 6;\n }\n\n .left-panel {\n pointer-events: all;\n padding: 3rem 17% 2rem 12%;\n }\n\n .right-panel {\n pointer-events: none;\n padding: 3rem 12% 2rem 17%;\n }\n\n .panel .content {\n color: var(--title-2);\n transition: transform 0.9s ease-in-out;\n transition-delay: 0.6s;\n }\n\n .panel h3 {\n font-weight: 600;\n line-height: 1;\n font-size: 1.5rem;\n }\n\n .panel p {\n font-size: 0.95rem;\n padding: 0.7rem 0;\n }\n\n .btn.transparent {\n margin: 0;\n background: none;\n border: var(--btn-transparent);\n width: 130px;\n height: 41px;\n font-weight: 600;\n font-size: 0.8rem;\n }\n\n .right-panel .image,\n .right-panel .content {\n transform: translateX(800px);\n }\n\n .container.sign-up-mode:before {\n transform: translate(100%, -50%);\n right: 52%;\n }\n\n .container.sign-up-mode .left-panel .image,\n .container.sign-up-mode .left-panel .content {\n transform: translateX(-800px);\n }\n\n .container.sign-up-mode .signin-signup {\n left: 25%;\n }\n\n .container.sign-up-mode form.sign-up-form {\n opacity: 1;\n z-index: 2;\n }\n\n .container.sign-up-mode form.sign-in-form {\n opacity: 0;\n z-index: 1;\n }\n\n .container.sign-up-mode .right-panel .image,\n .container.sign-up-mode .right-panel .content {\n transform: translateX(0%);\n }\n\n .container.sign-up-mode .left-panel {\n pointer-events: none;\n }\n\n .container.sign-up-mode .right-panel {\n pointer-events: all;\n }\n\n @media (max-width: 870px) {\n .container {\n min-height: 800px;\n height: 100vh;\n }\n\n .signin-signup {\n width: 100%;\n top: 95%;\n transform: translate(-50%, -100%);\n transition: 1s 0.8s ease-in-out;\n }\n\n .signin-signup,\n .container.sign-up-mode .signin-signup {\n left: 50%;\n }\n\n .panels-container {\n grid-template-columns: 1fr;\n grid-template-rows: 1fr 2fr 1fr;\n }\n\n .panel {\n flex-direction: row;\n justify-content: space-around;\n align-items: center;\n padding: 2.5rem 8%;\n grid-column: 1 / 2;\n }\n\n .right-panel {\n grid-row: 3 / 4;\n }\n\n .left-panel {\n grid-row: 1 / 2;\n }\n\n .image {\n width: 200px;\n transition: transform 0.9s ease-in-out;\n transition-delay: 0.6s;\n }\n\n .panel .content {\n padding-right: 15%;\n transition: transform 0.9s ease-in-out;\n transition-delay: 0.8s;\n }\n\n .panel h3 {\n font-size: 1.2rem;\n }\n\n .panel p {\n font-size: 0.7rem;\n padding: 0.5rem 0;\n }\n\n .btn.transparent {\n width: 110px;\n height: 35px;\n margin-top: 5px;\n margin-bottom: 15px;\n font-size: 0.7rem;\n }\n\n .container:before {\n width: 1500px;\n height: 1500px;\n transform: translateX(-50%);\n left: 30%;\n bottom: 68%;\n right: initial;\n top: initial;\n transition: 2s ease-in-out;\n }\n\n .container.sign-up-mode:before {\n transform: translate(-50%, 100%);\n bottom: 32%;\n right: initial;\n }\n\n .container.sign-up-mode .left-panel .image,\n .container.sign-up-mode .left-panel .content {\n transform: translateY(-300px);\n }\n\n .container.sign-up-mode .right-panel .image,\n .container.sign-up-mode .right-panel .content {\n transform: translateY(0px);\n }\n\n .right-panel .image,\n .right-panel .content {\n transform: translateY(300px);\n }\n\n .container.sign-up-mode .signin-signup {\n top: 5%;\n transform: translate(-50%, 0);\n }\n }\n\n @media (max-width: 570px) {\n form {\n padding: 0 1.5rem;\n }\n\n .image {\n display: none;\n }\n\n .panel .content {\n padding: 0.5rem 1rem;\n }\n\n .container {\n padding: 1.5rem;\n }\n\n .container:before {\n bottom: 72%;\n left: 50%;\n }\n\n .container.sign-up-mode:before {\n bottom: 28%;\n left: 50%;\n }\n }\n\n .modal {\n backdrop-filter: blur(5px);\n -webkit-backdrop-filter: blur(5px);\n }\n\n .modal-content {\n border: none;\n background: var(--modal-bg);\n box-shadow: 0 5px 10px var(--modal-shadow);\n color: var(--text-color);\n }\n\n .modal-dialog {\n padding: 0 0.5rem;\n }\n\n .bg-category {\n background: var(--category-color);\n }\n\n .bg-config {\n background: var(--config-color);\n }\n\n .bt {\n width: 150px;\n background-color: var(--btn-modal);\n border: none;\n outline: none;\n height: 49px;\n border-radius: var(--btn-modal-border);\n text-transform: uppercase;\n font-weight: 600;\n margin: 10px 0;\n cursor: pointer;\n transition: 0.5s;\n }\n\n .d-flex {\n margin: 10px 15px;\n\n justify-content: center;\n align-items: center;\n }\n\n .ms-2 {\n margin-left: 0.5rem;\n }\n\n .btn {\n\n background: linear-gradient(-45deg, #052453, #052453);\n background-size: 400% 400%;\n animation: gradient 10s ease infinite;\n }\n\n @keyframes gradient {\n 0% {\n background-position: 0% 50%;\n }\n\n 50% {\n background-position: 100% 50%;\n }\n\n 100% {\n background-position: 0% 50%;\n }\n }\n\n .container:before {\n\n background: linear-gradient(70deg, #052453, #094299);\n background-size: 100% 100%;\n\n }\n\n @keyframes gradient {\n 0% {\n background-position: 0% 50%;\n }\n\n 50% {\n background-position: 100% 50%;\n }\n\n 100% {\n background-position: 0% 50%;\n }\n }\n\n .titulo {\n margin-top: 10px;\n }\n\n h4 {\n font-size: 1rem;\n }\n\n .img {\n margin: -90px;\n }\n </style>\n</head>\n\n<body>\n <div class=\"container\">\n <div class=\"forms-container\">\n <div class=\"signin-signup\">\n <form class=\"sign-in-form\">\n <div class=\"img\">\n <img src=\"https://i.ibb.co/KN6Hfsv/20230803-112442.png\" alt=\"\"\n style=\"width: 260px; height: 260px;\">\n </div>\n <div class=\"d-flex gap-2 justify-content-center align-items-center bg-input\" id=\"config-area\">\n <i class=\"icon fa fa-cogs\"></i>\n <input type=\"text\" placeholder=\"CONFIG.\" disabled id=\"config\">\n <i class=\"icon fa fa-angle-double-down\"></i>\n </div>\n <div class=\"d-flex gap-2 justify-content-center align-items-center bg-input\">\n <i class=\"icon fa fa-user\"></i>\n <input type=\"text\" placeholder=\"Nome de usuario\" id=\"username\">\n </div>\n <div class=\"d-flex gap-2 justify-content-center align-items-center bg-input\">\n <i class=\"icon fa fa-lock\"></i>\n <input type=\"text\" placeholder=\"Senha\" id=\"password\">\n <i class=\"icon fa fa-eye\"\n onclick=\"password.type==`text`?password.type = `password`:password.type = `text`\"></i>\n </div>\n <div class=\"d-flex gap-2 justify-content-center align-items-center bg-input\">\n <i class=\"icon fa fa-lock\"></i>\n <input type=\"text\" placeholder=\"V2ray UUID\" id=\"uuid\">\n <i class=\"icon fa fa-eye\"\n onclick=\"uuid.type==`text`?uuid.type = `password`:uuid.type = `text`\"></i>\n </div>\n <button type=\"button\" class=\"btn solid\" id=\"start-stop\">INICIAR</button>\n <p class=\"social-text\" id=\"state\" style=\"color: #fff;\"></p>\n <div class=\"social-media\">\n <a class=\"social-icon\" id=\"sync\" onclick=\"DtStartAppUpdate.execute()\">\n <i class=\"bi bi-arrow-repeat\"></i>\n </a>\n <a class=\"social-icon\" id=\"logger\">\n <i class=\"bi bi-file-earmark-text\"></i>\n </a>\n <a class=\"social-icon\" id=\"checkUser\" onclick=\"DtStartCheckUser.execute()\">\n <i class=\"bi bi-calendar2-day\"></i>\n </a>\n </div>\n </form>\n <form class=\"sign-up-form\">\n <h2 class=\"title\">DESFRUTE</h2>\n <p class=\"social-text\">Aqui estão algumas ferramentas úteis</p>\n <div class=\"social-media\">\n <a class=\"social-icon\" data-bs-target=\"#speedTestModal\" data-bs-toggle=\"modal\">\n <i class=\"bi bi-speedometer\"></i>\n </a>\n <a class=\"social-icon\" onclick=\"DtIgnoreBatteryOptimizations.execute()\">\n <i class=\"bi bi-battery-full\"></i>\n </a>\n <a class=\"social-icon\" onclick=\"toggleHotSpot()\">\n <i id=\"hotspotIcon\" class=\"bi bi-wifi\"></i>\n </a>\n <a class=\"social-icon\" onclick=\"DtStartWebViewActivity.execute('https://spacez.pshnet.online')\">\n <i class=\"bi bi-globe\"></i>\n </a>\n <a class=\"social-icon\" onclick=\"DtCleanApp.execute()\">\n <i class=\"bi bi-trash3\"></i>\n </a>\n </div>\n </form>\n </div>\n </div>\n <div class=\"panels-container\">\n <div class=\"panel left-panel\">\n <div class=\"content\">\n <span class=\"bi bi-wifi\" id=\"name\"> TIM:</span>\n <span id=\"ip\">127.0.0.1</span>\n <h3 class=\"titulo\">Mais Ferramentas</h3>\n <button class=\"btn transparent\" id=\"sign-up-btn\">\n <i class=\"bi bi-gear\"></i>\n </button>\n <div class=\"d-flex\">\n <h4 class=\"bi bi-person ms-2\" id=\"total\">00</h4>\n </div>\n </div>\n <img src=\"https://i.ibb.co/n7nq1cv/20230803-112150.png\" class=\"image\" alt=\"\" />\n </div>\n <div class=\"panel right-panel\">\n <div class=\"content\">\n <h3>VOLTE PARA HOME</h3>\n <p>\n <i class=\"bi bi-arrow-down-circle-fill\"></i>\n </p>\n <button class=\"btn transparent bi bi-house\" id=\"sign-in-btn\">\n </button>\n </div>\n <img src=\"https://i.imgur.com/bqqPxCH.png\" class=\"image\" alt=\"\" />\n </div>\n </div>\n </div>\n <div class=\"modal fade\" id=\"checkUserModal\">\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content rounded-3 shadow\">\n <div class=\"modal-header border-bottom-0 pb-0\">\n <h1 class=\"modal-title fs-5 chk-title text-light\"></h1>\n <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"modal\"\n aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body text-center\">\n <p class=\"fs-5 mb-0 chk-message text-light\"></p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal fade\" id=\"errorModal\">\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content rounded-3 shadow\">\n <div class=\"modal-header border-bottom-0 pb-0\">\n <h1 class=\"modal-title fs-5 err-title text-light\"></h1>\n <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"modal\"\n aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body text-center\">\n <p class=\"fs-5 mb-0 err-message text-light\"></p>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal fade\" id=\"loggerModal\">\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content rounded-3 shadow\">\n <div class=\"modal-body p-1 text-center\">\n <ul class=\"list-group bg-transparent overflow-y-auto logger-content\" style=\"max-height: 600px;\">\n </ul>\n </div>\n <div class=\"modal-footer flex-nowrap p-0\">\n <button type=\"button\" class=\"bt btn-lg btn-dark text-light w-100 clear-logger\">LIMPAR</button>\n <button type=\"button\" class=\"bt btn-lg btn-dark text-light w-100\"\n data-bs-dismiss=\"modal\">FECHAR</button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal fade\" id=\"configModal\">\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content rounded-3 shadow\">\n <div class=\"modal-header border-bottom-0 pb-0\">\n <h1 class=\"modal-title fs-5 text-white\">CONFIGURAÇÕES</h1>\n <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"modal\"\n aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body p-1 text-center\">\n <ul class=\"list-group bg-transparent overflow-y-auto config-body\" style=\"max-height: 600px;\">\n <li class=\"list-group-item bg-transparent text-white border-0\">\n <p>CATEGORIA</p>\n <ul class=\"list-group bg-transparent overflow-y-auto text-start\">\n <li\n class=\"list-group-item d-flex bg-transparent text-white border-0 border-bottom rounded-0\">\n <img src=\"https://cdn-icons-png.flaticon.com/512/3686/3686811.png\" width=\"40\"\n height=\"40\">\n <div class=\"d-flex flex-column ms-2 w-100\">\n <span>CONFIG 01</span>\n <span>DESC 01</span>\n </div>\n <div class=\"d-flex flex-column ms-2 w-100\">\n <span class=\"text-end\">CONFIG_MODE</span>\n </div>\n </li>\n </ul>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"modal fade\" id=\"speedTestModal\">\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content rounded-3 shadow\">\n <div class=\"modal-header border-bottom-0 py-3\">\n <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"modal\"\n aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body ratio rounded-bottom-3\" style=\"height: 600px;\">\n <div class=\"spinner d-flex w-100 h-100 align-items-center justify-content-center\">\n <div class=\"spinner-border text-light p-5\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <iframe class=\"rounded-bottom-3\" id=\"speedFrame\"></iframe>\n </div>\n </div>\n </div>\n </div>\n <script>\n const sign_in_btn = document.querySelector(\"#sign-in-btn\");\n const sign_up_btn = document.querySelector(\"#sign-up-btn\");\n const container = document.querySelector(\".container\");\n\n sign_up_btn.addEventListener(\"click\", () => {\n container.classList.add(\"sign-up-mode\");\n });\n\n sign_in_btn.addEventListener(\"click\", () => {\n container.classList.remove(\"sign-up-mode\");\n });\n </script>\n <script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/toastify-js\"></script>\n <script>\n const configArea = document.querySelector('#config-area')\n const config = document.querySelector('#config')\n const username = document.querySelector('#username')\n const password = document.querySelector('#password')\n const uuid = document.querySelector('#uuid')\n const logger = document.querySelector('#logger')\n\n const startStopVpn = document.querySelector('#start-stop')\n const stateStatus = document.querySelector('#state')\n\n const loggerModal = new bootstrap.Modal(document.querySelector('#loggerModal'))\n const checkUserModal = new bootstrap.Modal(document.querySelector('#checkUserModal'))\n const errorModal = new bootstrap.Modal(document.querySelector('#errorModal'))\n const configModal = new bootstrap.Modal(document.querySelector('#configModal'))\n\n const clearLogger = document.querySelector('.clear-logger')\n\n const speedTestModal = new bootstrap.Modal(document.querySelector('#speedTestModal'))\n\n const toggleHotSpot = () => {\n const hotSpotStatus = window?.DtGetStatusHotSpotService?.execute() ?? 'STOPPED';\n hotSpotStatus == 'RUNNING' ? stopHotSpot() : startHotSpot();\n }\n const startHotSpot = () => DtStartHotSpotService.execute();\n const stopHotSpot = () => DtStopHotSpotService.execute();\n\n configArea.addEventListener('click', e => showConfigsModal())\n username.addEventListener('input', e => DtUsername.set(e.target.value))\n password.addEventListener('input', e => DtPassword.set(e.target.value))\n uuid.addEventListener('input', e => DtUuid.set(e.target.value))\n\n logger.addEventListener('click', e => loggerModal.show())\n\n startStopVpn.addEventListener('click', (e) => {\n if (DtGetVpnState.execute() != 'DISCONNECTED') {\n DtExecuteVpnStop.execute()\n } else {\n DtExecuteVpnStart.execute()\n }\n })\n clearLogger.addEventListener('click', () => DtClearLogs.execute())\n\n speedTestModal._element.addEventListener('shown.bs.modal', () => {\n const iframe = document.querySelector('#speedFrame');\n if (!iframe.src) {\n iframe.src = 'https://fast.com'\n iframe.addEventListener('load', () => {\n mp3Modal._element.querySelector('.spinner').classList.add('d-none')\n })\n }\n })\n speedTestModal._element.addEventListener('hide.bs.modal', () => {\n const iframe = document.querySelector('#speedFrame');\n iframe.src = '';\n })\n\n Object.defineProperty(String.prototype, 't', {\n value: function t() {\n return window?.DtTranslateText?.execute('' + this) ?? '' + this\n },\n writable: true,\n configurable: true,\n })\n\n const dtConfigClickListener = () => {\n const data = JSON.parse(window?.DtGetDefaultConfig?.execute() || `{ \"auth\": {\"username\": \"\"} }`)\n const isV2ray = data?.mode?.toLowerCase()?.startsWith('v2ray');\n\n config.placeholder = data.name ?? 'Escolha um servidor';\n username.parentElement.style.setProperty('display', !data?.auth?.username && !isV2ray ? 'flex' : 'none', 'important')\n password.parentElement.style.setProperty('display', !data?.auth?.password && !isV2ray ? 'flex' : 'none', 'important')\n uuid.parentElement.style.setProperty('display', !data?.auth?.v2ray_uuid && isV2ray ? 'flex' : 'none', 'important')\n }\n\n const dtVpnStateListener = state => {\n const isRunning = state != 'DISCONNECTED';\n\n stateStatus.innerHTML = ('LBL_STATE_' + state).t()\n startStopVpn.innerHTML = isRunning ? 'LBL_BTN_STOP'.t() : 'LBL_BTN_START'.t()\n\n if (isRunning) {\n username.setAttribute('readonly', 'true')\n password.setAttribute('readonly', 'true')\n } else {\n username.removeAttribute('readonly')\n password.removeAttribute('readonly')\n }\n\n if (state == 'CONNECTING') dtShowSuccessToastListener('Conectado...')\n\n }\n\n const dtCheckUserStartedListener = () => {\n const data = JSON.parse(window?.DtGetDefaultConfig?.execute() || `{}`)\n const isV2ray = data?.mode?.toLowerCase()?.startsWith('v2ray');\n if (isV2ray) return;\n\n const html = `\n <div class=\"d-flex justify-content-center\">\n <div class=\"spinner-border p-4\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n `\n\n checkUserModal._element.querySelector('.chk-title').textContent = 'CHECK USER'\n checkUserModal._element.querySelector('.chk-message').innerHTML = html;\n checkUserModal.show()\n }\n\n const dtCheckUserModelListener = model => {\n const data = JSON.parse(model ?? `{\"username\": \"test\"}`)\n const html = `\n <div class=\"d-flex flex-column text-white\">\n <span>USUÁRIO:<br><font color=\"#00BFFFF\"><u>${data.username}</u></font></span>\n <span>VALIDADE:<br><font color=\"#00BFFFF\">${data.expiration_date}</font></span>\n <span>DIAS RESTANTES:<br><font color=\"#00BFFFF\">${data.expiration_days}</font></span>\n <span>CONEXÕES:<br><font color=\"#00BFFFF\"> ${data.count_connections}</font></span><br>\n </div>\n `\n\n checkUserModal._element.querySelector('.chk-title').textContent = ''\n checkUserModal._element.querySelector('.chk-message').innerHTML = html;\n checkUserModal.show()\n }\n\n const dtMessageErrorListener = message => {\n const data = JSON.parse(message)\n errorModal._element.querySelector('.err-title').textContent = data.title;\n errorModal._element.querySelector('.err-message').innerHTML = data.content;\n errorModal.show()\n }\n\n const dtOnNewLogListener = () => {\n const mock = [];\n for (let i = 0; i < 30; i++) {\n mock.push({ 'TIME': 'MESSAGE ' + i })\n }\n\n const log = window?.DtGetLogs?.execute() || JSON.stringify(mock)\n const data = JSON.parse(log)\n\n let content = '';\n data.forEach(item => {\n content += '<li class=\"list-group-item bg-transparent p-0 border-0 text-start ms-2 text-wrap\" style=\"font-size: 12px; color: var(--text-color);\">';\n content += Object.keys(item)[0] + \" \" + item[Object.keys(item)]\n content += '</li>';\n })\n\n loggerModal._element.querySelector('.logger-content').innerHTML = content;\n const listGroup = loggerModal._element.querySelector('.list-group')\n listGroup.scrollTo(0, listGroup.scrollHeight)\n }\n\n const dtVpnStartedSuccessListener = () => dtShowSuccessToastListener('Conectado com sucesso')\n\n const dtVpnStoppedSuccessListener = () => dtShowSuccessToastListener('Desconectado com sucesso')\n\n const dtShowSuccessToastListener = text => {\n Toastify({\n text: text,\n close: true,\n style: {\n background: 'linear-gradient(to right, #00b09b, #96c93d)',\n marginTop: '35px',\n textAlign: 'center',\n alignItems: 'center',\n justifyContent: 'center',\n }\n }).showToast()\n }\n\n const dtShowErrorToastListener = text => {\n Toastify({\n text: text,\n close: true,\n style: {\n background: 'linear-gradient(to right, #ff5c33, #e69900)',\n marginTop: '35px',\n\n }\n }).showToast()\n }\n\n const showConfigsModal = () => {\n const mock = '[{\"sorter\":6,\"color\":\"#6D08041C\",\"name\":\"CONFIG\",\"id\":1393,\"items\":[{\"mode\":\"V2RAY - VLESS\",\"sorter\":4,\"tlsVersion\":\"TLSv1.2\",\"name\":\"CONFIG 01\",\"icon\":\"https://cdn-icons-png.flaticon.com/512/8187/8187143.png\",\"id\":11803,\"status\":\"ACTIVE\"},{\"mode\":\"SSH_DIRECT\",\"sorter\":2,\"tlsVersion\":\"TLSv1.2\",\"name\":\"CONFIG 02\",\"icon\":\"https://cdn-icons-png.flaticon.com/512/8187/8187143.png\",\"id\":28627,\"status\":\"ACTIVE\"},{\"mode\":\"OVPN_PROXY\",\"sorter\":23,\"tlsVersion\":\"TLSv1.2\",\"name\":\"CONFIG 03\",\"icon\":\"https://cdn-icons-png.flaticon.com/512/8187/8187143.png\",\"id\":30001,\"status\":\"ACTIVE\"}]},{\"sorter\":2,\"color\":\"#6D08041C\",\"name\":\"CONFIG 2\",\"id\":1846,\"items\":[{\"mode\":\"SSH_PROXY\",\"sorter\":1,\"tlsVersion\":\"TLSv1.2\",\"name\":\"CONFIG 01\",\"icon\":\"https://cdn-icons-png.flaticon.com/512/8187/8187143.png\",\"id\":26295,\"status\":\"ACTIVE\"}]},{\"sorter\":4,\"color\":\"#80000000\",\"name\":\"CONFIG 3\",\"id\":3310,\"items\":[{\"mode\":\"SSH_PROXY\",\"sorter\":1,\"tlsVersion\":\"TLSv1.2\",\"name\":\"CONFIG. TEST\",\"icon\":\"https://cdn-icons-png.flaticon.com/512/8187/8187143.png\",\"id\":29997,\"status\":\"ACTIVE\"},{\"mode\":\"OVPN_PROXY\",\"sorter\":1,\"tlsVersion\":\"TLSv1.2\",\"name\":\"CONFIG. TEST 2\",\"icon\":\"https://cdn-icons-png.flaticon.com/512/8187/8187143.png\",\"id\":29998,\"status\":\"ACTIVE\"}]}]'\n const data = JSON.parse(window?.DtGetConfigs?.execute() || mock)\n\n data.sort((a, b) => a.sorter - b.sorter)\n data.forEach(item => item.items.sort((a, b) => a.sorter - b.sorter))\n\n const body = configModal._element.querySelector('.config-body')\n body.innerHTML = ''\n\n data.forEach(category => {\n const categoryElement = document.createElement('li')\n categoryElement.className = 'list-group-item bg-transparent border-0 mb-1 rounded-1 px-1'\n categoryElement.style.color = 'var(--text-color)'\n categoryElement.innerHTML = `<span class=\"fw-bold w-100 d-block p-1 rounded-1 mb-1 bg-category\">${category.name}</span>`\n\n const configUlElement = document.createElement('ul')\n configUlElement.className = 'list-group overflow-y-auto'\n\n category.items.forEach(item => {\n const configElement = document.createElement('li')\n configElement.className = 'list-group-item d-flex border-0 bg-config rounded-2 px-1 py-2 mb-1'\n configElement.style.color = 'var(--text-color)'\n configElement.innerHTML = `\n <img src=\"${item.icon}\" width=\"40\" height=\"40\">\n <div class=\"text-start d-flex flex-column ms-2 w-100 text-truncate\">\n <span class=\"fw-bold text-uppercase\" style=\"font-size: 0.8rem;\">${item.name}</span>\n <span class=\"fst-italic fw-bold text-uppercase\" style=\"font-size: 0.7rem;\">${item.description || ''}</span>\n </div>\n <div class=\"d-flex flex-column ms-2\">\n \n </div>\n </li>\n `\n configElement.addEventListener('click', e => {\n window?.DtSetConfig?.execute(item.id)\n configModal.hide()\n })\n configUlElement.appendChild(configElement)\n })\n\n categoryElement.appendChild(configUlElement)\n body.appendChild(categoryElement)\n })\n\n configModal.show()\n }\n\n username.value = window?.DtUsername?.get() ?? ''\n password.value = window?.DtPassword?.get() ?? ''\n uuid.value = window?.DtUuid?.get() ?? ''\n\n username.placeholder = 'LBL_USERNAME'.t()\n password.placeholder = 'LBL_PASSWORD'.t()\n uuid.placeholder = 'LBL_UUID'.t()\n\n dtOnNewLogListener()\n dtVpnStateListener(window?.DtGetVpnState?.execute() ?? 'DISCONNECTED')\n dtConfigClickListener()\n\n console.log('DTunnel layout ready!🚀')\n </script>\n <script>\n class AndroidMock {\n static getLocalIP() {\n return '192.168.0.1';\n }\n\n static getConfig() {\n return JSON.stringify({\n urlCheckUser: 'http://209.14.70.14:5454/checkUser'\n });\n }\n\n static getNetworkName() {\n return 'REDE';\n }\n\n static openRadioInfo() {\n console.log('openRadioInfo');\n }\n }\n </script>\n <script>\n function showLocalIP(android) {\n console.log(android.getNetworkName());\n document.getElementById('name').innerHTML = ' ' + android.getNetworkName() + ':';\n document.getElementById('ip').innerHTML = android.getLocalIP();\n\n setInterval(() => {\n document.getElementById('name').innerHTML =\n ' ' + android.getNetworkName() + ':';\n document.getElementById('ip').innerHTML = android.getLocalIP();\n }, 2000)\n }\n\n function showCheckUser(android) {\n const config = JSON.parse(window?.DtGetDefaultConfig?.execute() ?? android.getConfig());\n\n const urlCheckUser = new URL(config.urlCheckUser);\n urlCheckUser.protocol = 'ws:';\n const socket = new WebSocket(urlCheckUser);\n socket.onopen = function (e) {\n socket.send(JSON.stringify({\n action: 'all',\n data: {}\n }));\n };\n\n socket.onmessage = function (event) {\n const data = JSON.parse(event.data);\n if (data.total === undefined)\n return;\n\n const total = data.total;\n document.getElementById('total').innerHTML = ' ' + String(total).padStart(2, '0');\n socket.close();\n };\n }\n\n window.onload = function () {\n const android = window.Android || AndroidMock;\n showLocalIP(android);\n showCheckUser(android);\n }\n </script>\n</body>\n\n</html>",
"type": "HTML",
"status": "INACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22200,
"label": "ANDROID WEBVIEW (POR SUA CONTA E RISCO)",
"name": "APP_SUPPORT_BUTTON",
"value": null,
"type": "HTML",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
},
{
"id": 22201,
"label": "PAGINA WEBVIEW (POR SUA CONTA E RISCO)",
"name": "APP_WEB_VIEW",
"value": null,
"type": "HTML",
"status": "ACTIVE",
"user_id": "d37036c7-833d-4246-8b45-c0ce6e8daaa2"
}
]