|
from flask import Flask, request, render_template_string, render_template, jsonify, Response |
|
import sqlite3 |
|
import os |
|
import random |
|
import requests |
|
import time |
|
import re |
|
import json |
|
import base64 |
|
import logging |
|
import csv |
|
import io |
|
from urllib.parse import quote |
|
|
|
from datetime import datetime |
|
import pytz |
|
|
|
from unidecode import unidecode |
|
|
|
api_key_sys = os.getenv('api_key_sys') |
|
|
|
gc_url_gru = os.getenv('gc_url_gru') |
|
|
|
gc_url_export = os.getenv('gc_url_export') |
|
|
|
start_up = os.getenv('start_up') |
|
|
|
gc_url = os.getenv('gc_url') |
|
gc_url_form = os.getenv('gc_url_form') |
|
gc_api = os.getenv('gc_api') |
|
|
|
wa_url = os.getenv('wa_url') |
|
wa_api_key = os.getenv('wa_api_key') |
|
wa_ak = os.getenv('ws_ak') |
|
ws_url_mes = "/sendMessage/" |
|
ws_url_ver = "/checkWhatsapp/" |
|
|
|
up_db = os.getenv('up_db') |
|
|
|
id_gru = os.getenv('id_gru') |
|
date_from = "2022-01-01" |
|
|
|
|
|
export_id = "" |
|
|
|
code_executed = False |
|
|
|
|
|
status = "active" |
|
|
|
|
|
|
|
current_curator_index = 0 |
|
verifikation_start = "1" |
|
curator_on_off = "0" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app = Flask(__name__, template_folder="./") |
|
app.config['DEBUG'] = True |
|
UPLOAD_FOLDER = 'static' |
|
logging.basicConfig(level=logging.DEBUG) |
|
if not os.path.exists(UPLOAD_FOLDER): |
|
os.makedirs(UPLOAD_FOLDER) |
|
|
|
DATABASES = ['data_gc.db', 'data1.db', 'data2.db', 'data3.db', 'data4.db', 'data5.db'] |
|
|
|
def init_db(db_name): |
|
conn = sqlite3.connect(db_name) |
|
cursor = conn.cursor() |
|
cursor.execute(''' |
|
CREATE TABLE IF NOT EXISTS contacts ( |
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
name TEXT NOT NULL, |
|
phone TEXT NOT NULL, |
|
email TEXT NOT NULL, |
|
vk_id TEXT, |
|
chat_id TEXT, |
|
ws_st TEXT, |
|
ws_stop TEXT, |
|
web_st INTEGER, |
|
fin_prog INTEGER, |
|
b_city TEXT, |
|
b_fin TEXT NOT NULL, |
|
b_ban TEXT, |
|
b_ign TEXT, |
|
b_baners TEXT, |
|
b_butt TEXT, |
|
b_mess TEXT, |
|
shop_st TEXT, |
|
curator TEXT, |
|
pr1 TEXT, |
|
pr2 TEXT, |
|
pr3 TEXT, |
|
pr4 TEXT, |
|
pr5 TEXT, |
|
gc_url TEXT, |
|
key_pr TEXT, |
|
n_con TEXT, |
|
canal TEXT, |
|
data_on TEXT, |
|
data_t TEXT, |
|
utm_source TEXT, |
|
utm_medium TEXT, |
|
utm_campaign TEXT, |
|
utm_term TEXT, |
|
utm_content TEXT, |
|
gcpc TEXT |
|
) |
|
''') |
|
conn.commit() |
|
conn.close() |
|
|
|
for db in DATABASES: |
|
init_db(db) |
|
|
|
|
|
template = { |
|
"username": "name", |
|
"phone": "phone", |
|
"email": "email", |
|
"city": "b_city", |
|
"finished": "b_fin", |
|
"ban": "b_ban", |
|
"ignore": "b_ign", |
|
"banners": "b_baners", |
|
"buttons": "b_butt", |
|
"messages": "b_mess" |
|
} |
|
|
|
mapping_template = { |
|
"username": "name", |
|
"phone": "phone", |
|
"email": "email", |
|
"city": "b_city", |
|
"finished": "b_fin", |
|
"ban": "b_ban", |
|
"ignore": "b_ign", |
|
"banners": "b_baners", |
|
"buttons": "b_butt", |
|
"messages": "b_mess" |
|
} |
|
|
|
|
|
|
|
|
|
mapping_template_cur = { |
|
'name': 'Name', |
|
'phone': 'Phone', |
|
'email': 'Email' |
|
} |
|
|
|
|
|
|
|
|
|
def fetch(url): |
|
try: |
|
response = requests.get(url) |
|
response.raise_for_status() |
|
print(f"GET запрос к {url} выполнен успешно.") |
|
return response.json() |
|
except requests.RequestException as e: |
|
print(f"Ошибка при выполнении GET запроса к {url}: {e}") |
|
return None |
|
|
|
|
|
def send_notification(url, data): |
|
try: |
|
response = requests.post(url, json=data) |
|
response.raise_for_status() |
|
print(f"POST запрос к {url} выполнен успешно.") |
|
return response.json() |
|
except requests.RequestException as e: |
|
print(f"Ошибка при выполнении POST запроса к {url}: {e}") |
|
return None |
|
|
|
|
|
def initialize_requests(): |
|
global code_executed, export_id |
|
print(f"Функция initialize_requests вызвана. start_up: {start_up}, code_executed: {code_executed}") |
|
|
|
if start_up == '1' and not code_executed: |
|
try: |
|
|
|
url_template = f"{gc_url_gru}/{id_gru}/users?key={gc_api}&created_at[from]={date_from}&status={status}" |
|
data = fetch(url_template) |
|
if data and data.get("success"): |
|
export_id = data.get("info", {}).get("export_id", "") |
|
print("Export ID:", export_id) |
|
|
|
|
|
notification_url = "https://skyauto.me/cllbck/217669590/29245685/bGZuMDRZZUpLZ3VJR2oxcC9CQmh0UT0?api=1&uid=535939344" |
|
notification_data = { |
|
"message": "Первый запрос был выполнен", |
|
"export_id": export_id |
|
} |
|
notification_response = send_notification(notification_url, notification_data) |
|
print("Ответ от сервера оповещения:", notification_response) |
|
|
|
code_executed = True |
|
else: |
|
raise Exception(f"Ошибка в ответе от сервера: {data.get('error_message') if data else 'Нет данных'}") |
|
except Exception as e: |
|
print(f"Ошибка: {e}") |
|
else: |
|
print("Системная переменная start_up не равна '1' или код уже выполнялся.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/export_user', methods=['GET']) |
|
def export_user(): |
|
try: |
|
export_id = request.args.get('export_id') |
|
if not export_id: |
|
raise Exception("export_id не найден в параметрах запроса") |
|
|
|
print(f"Получен export_id: {export_id}") |
|
|
|
|
|
third_url_template = f"{gc_url_export}/{export_id}?key={gc_api}" |
|
response = fetch(third_url_template) |
|
if response and response.get("success"): |
|
print("Ответ сервера:") |
|
print(response) |
|
return jsonify(response), 200 |
|
else: |
|
raise Exception(f"Ошибка в ответе от сервера: {response.get('error_message') if response else 'Нет данных'}") |
|
except Exception as e: |
|
print(f"Ошибка: {e}") |
|
return jsonify({"error": str(e)}), 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def send_second_request(export_id): |
|
if export_id is None: |
|
raise Exception("export_id is None") |
|
|
|
export_url_template = f"https://school.riverpsy.com/pl/api/account/exports/{export_id}?key=jqgxSMUnHWoKUcxF3MHSb77VUMk7HpFbO9SHnfVYwHtwqe1S81lqeKxrLPoSPWCephtYQuJwMFsCXEFmyByXdruDpDFgf6L7ij66K9ji0Kf2qAIwbTqEyJGB5MOHwyHl" |
|
try: |
|
response = requests.get(export_url_template) |
|
response.raise_for_status() |
|
return response.json() |
|
except requests.RequestException as e: |
|
raise Exception(f"Ошибка при выполнении запроса: {e}") |
|
|
|
def load_data_from_json(json_data): |
|
if 'info' not in json_data or 'items' not in json_data['info'] or 'fields' not in json_data['info']: |
|
raise ValueError("Invalid JSON structure") |
|
|
|
items = json_data['info']['items'] |
|
fields = json_data['info']['fields'] |
|
|
|
db = 'data_gc.db' |
|
conn = sqlite3.connect(db) |
|
cursor = conn.cursor() |
|
|
|
for item in items: |
|
user_data = dict(zip(fields, item)) |
|
|
|
user_data.setdefault('vk_id', '') |
|
user_data.setdefault('chat_id', '') |
|
user_data.setdefault('ws_st', '') |
|
user_data.setdefault('ws_stop', '') |
|
user_data.setdefault('web_st', '') |
|
user_data.setdefault('fin_prog', '') |
|
user_data.setdefault('b_city', '') |
|
user_data.setdefault('b_fin', '') |
|
user_data.setdefault('b_ban', '') |
|
user_data.setdefault('b_ign', '') |
|
user_data.setdefault('b_baners', '') |
|
user_data.setdefault('b_butt', '') |
|
user_data.setdefault('b_mess', '') |
|
user_data.setdefault('shop_st', '') |
|
user_data.setdefault('curator', '') |
|
user_data.setdefault('pr1', '') |
|
user_data.setdefault('pr2', '') |
|
user_data.setdefault('pr3', '') |
|
user_data.setdefault('pr4', '') |
|
user_data.setdefault('pr5', '') |
|
user_data.setdefault('gc_url', '') |
|
user_data.setdefault('key_pr', '') |
|
user_data.setdefault('n_con', '') |
|
user_data.setdefault('canal', '') |
|
user_data.setdefault('data_t', '') |
|
|
|
if 'Телефон' in user_data and user_data['Телефон'].startswith('+'): |
|
user_data['Телефон'] = user_data['Телефон'][1:] |
|
|
|
query = ''' |
|
INSERT INTO contacts ( |
|
name, phone, email, vk_id, chat_id, ws_st, ws_stop, web_st, fin_prog, b_city, b_fin, b_ban, b_ign, b_baners, b_butt, b_mess, shop_st, pr1, pr2, pr3, pr4, pr5, gc_url, curator, key_pr, n_con, canal, data_t |
|
) VALUES ( |
|
:Имя, :Телефон, :Email, :vk_id, :chat_id, :ws_st, :ws_stop, :web_st, :fin_prog, :b_city, :b_fin, :b_ban, :b_ign, :b_baners, :b_butt, :b_mess, :shop_st, :pr1, :pr2, :pr3, :pr4, :pr5, :gc_url, :curator, :key_pr, :n_con, :canal, :data_t |
|
) |
|
''' |
|
cursor.execute(query, user_data) |
|
|
|
conn.commit() |
|
conn.close() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/start', methods=['GET']) |
|
def start(): |
|
export_id = request.args.get('export_id') |
|
api_key_sys_control = request.args.get('api_sys') |
|
|
|
if export_id is None: |
|
return json.dumps({"error": "export_id is required"}), 400 |
|
|
|
if api_key_sys_control != api_key_sys: |
|
return json.dumps({"error": "Unauthorized access"}), 403 |
|
|
|
try: |
|
json_data = send_second_request(export_id) |
|
load_data_from_json(json_data) |
|
return "Data loaded successfully", 200 |
|
except Exception as e: |
|
return json.dumps({"error": str(e)}), 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
def randomize_message(template): |
|
def replace_placeholder(match): |
|
options = match.group(1).split('|') |
|
return random.choice(options) |
|
|
|
return re.sub(r'\{([^}]+)\}', replace_placeholder, template) |
|
|
|
def clean_phone_number(phone): |
|
if phone.startswith('+'): |
|
return phone[1:] |
|
return phone |
|
|
|
def send_message(chat_id, message): |
|
|
|
|
|
full_url = f"{wa_url}{wa_ak}{ws_url_mes}{wa_api_key}" |
|
payload = { |
|
"chatId": chat_id, |
|
"message": message |
|
} |
|
headers = { |
|
'Content-Type': 'application/json' |
|
} |
|
response = requests.request("POST", full_url, headers=headers, json=payload) |
|
try: |
|
response_json = response.json() |
|
except ValueError: |
|
response_json = {"error": "Invalid JSON response"} |
|
return response_json |
|
|
|
def check_and_send_mailings(mesage_db1, clean_db): |
|
try: |
|
results = [] |
|
for database in DATABASES: |
|
conn = sqlite3.connect(database) |
|
cursor = conn.cursor() |
|
cursor.execute('SELECT name, phone FROM contacts') |
|
contacts = cursor.fetchall() |
|
conn.close() |
|
|
|
for contact in contacts: |
|
name = contact[0] |
|
chat_id = f"{clean_phone_number(contact[1])}@c.us" |
|
message = randomize_message(mesage_db1) |
|
message = message.replace('[[nemes]]', name) |
|
send_result = send_message(chat_id, message) |
|
results.append({ |
|
"chat_id": chat_id, |
|
"message": message, |
|
"result": send_result |
|
}) |
|
|
|
if clean_db == '1': |
|
conn = sqlite3.connect(database) |
|
cursor = conn.cursor() |
|
cursor.execute('DELETE FROM contacts') |
|
conn.commit() |
|
conn.close() |
|
|
|
return jsonify({"status": "success", "results": results}), 200 |
|
except Exception as e: |
|
print(f"Error sending mailings: {e}") |
|
return jsonify({"status": "error", "message": str(e)}), 500 |
|
|
|
|
|
@app.route('/start_db', methods=['GET']) |
|
def start_mailings(): |
|
mesage_db1 = request.args.get('mesage') |
|
clean_db = request.args.get('clean_db') |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
|
|
if not mesage_db1: |
|
return "Parameter 'mesage' is required.", 400 |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
return check_and_send_mailings(mesage_db1, clean_db) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/data_gc') |
|
def show_data_gc(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
conn = sqlite3.connect('data_gc.db') |
|
cursor = conn.cursor() |
|
cursor.execute('SELECT name, phone, email FROM contacts') |
|
contacts = cursor.fetchall() |
|
cursor.execute('SELECT COUNT(*) FROM contacts') |
|
total_users = cursor.fetchone()[0] |
|
conn.close() |
|
|
|
return render_template('data_gc.html', contacts=contacts, total_users=total_users) |
|
except Exception as e: |
|
print(f"Error showing contacts: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
|
|
@app.route('/data_ras') |
|
def show_data_ras(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
conn = sqlite3.connect('data1.db') |
|
cursor = conn.cursor() |
|
cursor.execute('SELECT name, phone, email FROM contacts') |
|
contacts = cursor.fetchall() |
|
cursor.execute('SELECT COUNT(*) FROM contacts') |
|
total_users = cursor.fetchone()[0] |
|
conn.close() |
|
|
|
return render_template('data_ras.html', contacts=contacts, total_users=total_users) |
|
except Exception as e: |
|
print(f"Error showing contacts: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/data_gc_tab', methods=['GET']) |
|
def data_gc_tab(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('data_gc_tab.html') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/data_gc_tab_out', methods=['GET']) |
|
def data_gc_tab_out(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
conn = sqlite3.connect('data_gc.db') |
|
cursor = conn.cursor() |
|
cursor.execute(''' |
|
SELECT id, name, phone, email, vk_id, chat_id, ws_st, ws_stop, web_st, fin_prog, |
|
b_city, b_fin, b_ban, b_ign, b_baners, b_butt, b_mess, shop_st, curator, |
|
pr1, pr2, pr3, pr4, pr5, gc_url, key_pr, n_con, canal, data_on, data_t, utm_source, utm_medium, utm_campaign, utm_term, utm_content, gcpc |
|
FROM contacts |
|
''') |
|
contacts = cursor.fetchall() |
|
conn.close() |
|
|
|
contacts_json = [{ |
|
'id': contact[0], 'name': contact[1], 'phone': contact[2], 'email': contact[3], |
|
'vk_id': contact[4], 'chat_id': contact[5], 'ws_st': contact[6], 'ws_stop': contact[7], |
|
'web_st': contact[8], 'fin_prog': contact[9], 'b_city': contact[10], 'b_fin': contact[11], |
|
'b_ban': contact[12], 'b_ign': contact[13], 'b_baners': contact[14], 'b_butt': contact[15], |
|
'b_mess': contact[16], 'shop_st': contact[17], 'curator': contact[18], 'pr1': contact[19], |
|
'pr2': contact[20], 'pr3': contact[21], 'pr4': contact[22], 'pr5': contact[23], |
|
'gc_url': contact[24], 'key_pr': contact[25], 'n_con': contact[26], 'canal': contact[27],'data_on': contact[28], |
|
'data_t': contact[29],'utm_source': contact[30], 'utm_medium': contact[31], 'utm_campaign': contact[32], |
|
'utm_term': contact[33], 'utm_content': contact[34], 'gcpc': contact[34] |
|
} for contact in contacts] |
|
return jsonify(contacts_json), 200 |
|
except Exception as e: |
|
error_message = f"Error getting data from data_gc: {e}" |
|
print(error_message) |
|
return error_message, 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
forms = "formResponse" |
|
|
|
|
|
|
|
gog_url = "https://docs.google.com/forms/d/e/1FAIpQLSc-JbmXvgpgGq6KrkXsYSsfMACVMyIDnNqrHy6jImGeSRcpiQ/formResponse?usp=pp_url&entry.1556100878={name}&entry.1477412341={email}&entry.1634985541={phone}&entry.1736544219={vk_id}&entry.62153872={chat_id}&entry.1913752768={ws_st}&entry.1768186232={ws_stop}&entry.1198983592={web_st}&entry.994770784={fin_prog}&entry.910932310={b_city}&entry.1923801792={b_fin}&entry.2005444720={b_ban}&entry.741087361={b_ign}&entry.1316159837={b_baners}&entry.355123557={b_butt}&entry.395996312={b_mess}&entry.646571729={shop_st}&entry.578527800={curator}&entry.1936838964={pr1}&entry.1375537366={pr2}&entry.1249356084={pr3}&entry.752547226={pr4}&entry.704766458={pr5}&entry.1837661={gc_url}&entry.398837750={key_pr}&entry.225564240={n_con}&entry.1642320872={canal}&entry.1581826411={data_t}&entry.311131724={utm_source}&entry.1904279859={utm_medium}&entry.740234546={utm_campaign}&entry.880981295={utm_term}&entry.431306383={utm_content}" |
|
|
|
|
|
|
|
DATABASE_NAME = 'data_gc.db' |
|
def send_to_google_forms(user_data, gog_url): |
|
|
|
url = gog_url.format(**user_data) |
|
|
|
|
|
response = requests.post(url) |
|
|
|
if response.status_code == 200: |
|
logging.debug(f"Data sent to Google Forms successfully for user: {user_data.get('email')}") |
|
else: |
|
logging.error(f"Failed to send data to Google Forms for user: {user_data.get('email')}. Response: {response.text}") |
|
|
|
|
|
|
|
def update_or_insert_user(db_name, user_data, mapping_template, gog_url): |
|
|
|
conn = sqlite3.connect(db_name) |
|
cursor = conn.cursor() |
|
|
|
|
|
email = user_data.get('email') |
|
if not email: |
|
logging.error(f"User data missing email: {user_data}") |
|
return |
|
|
|
logging.debug(f"Processing user with email: {email}") |
|
|
|
|
|
cursor.execute("SELECT web_st, ws_st, b_mess FROM contacts WHERE email = ?", (email,)) |
|
user = cursor.fetchone() |
|
logging.debug(f"User found: {user}") |
|
|
|
current_web_st = user[0] if user else None |
|
current_ws_st = user[1] if user else None |
|
current_messages = user[2] if user else "" |
|
logging.debug(f"Current web_st: {current_web_st}, current_ws_st: {current_ws_st}, current_messages: {current_messages}") |
|
|
|
|
|
transformed_data = {} |
|
for json_key, db_column in mapping_template.items(): |
|
value = user_data.get(json_key, "") |
|
if isinstance(value, list): |
|
if all(isinstance(item, str) for item in value): |
|
transformed_data[db_column] = "; ".join(value) |
|
else: |
|
logging.error(f"Expected list of strings for key {json_key}, but got: {value}") |
|
transformed_data[db_column] = "" |
|
else: |
|
transformed_data[db_column] = str(value) |
|
logging.debug(f"Transformed data: {transformed_data}") |
|
|
|
|
|
required_fields = [ |
|
"vk_id", "chat_id", "ws_st", "ws_stop", "web_st", "fin_prog", |
|
"b_city", "b_fin", "b_ban", "b_ign", "b_baners", "b_butt", "b_mess", |
|
"shop_st", "curator", "pr1", "pr2", "pr3", "pr4", "pr5", "gc_url", |
|
"key_pr", "n_con", "canal", "data_on", "data_t", 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gcpc' |
|
] |
|
for field in required_fields: |
|
if field not in transformed_data: |
|
transformed_data[field] = "" |
|
logging.debug(f"Transformed data after adding required fields: {transformed_data}") |
|
|
|
|
|
if 'phone' in user_data: |
|
phone = user_data['phone'] |
|
if phone.startswith('+'): |
|
phone = phone[1:] |
|
transformed_data['phone'] = phone |
|
logging.debug(f"Transformed data after phone processing: {transformed_data}") |
|
|
|
|
|
no_overwrite_columns = ['ws_st', 'curator', 'data_t'] |
|
|
|
|
|
if current_ws_st is not None and current_ws_st != "": |
|
transformed_data['ws_st'] = current_ws_st |
|
else: |
|
transformed_data['ws_st'] = user_data.get('ws_st', "") |
|
|
|
if current_web_st is not None and current_web_st != "": |
|
transformed_data['web_st'] = int(current_web_st) + 1 |
|
else: |
|
transformed_data['web_st'] = 1 |
|
|
|
new_messages = transformed_data.get('b_mess', "") |
|
if current_messages: |
|
transformed_data['b_mess'] = current_messages + "; " + new_messages |
|
else: |
|
transformed_data['b_mess'] = new_messages |
|
logging.debug(f"Transformed data after message processing: {transformed_data}") |
|
|
|
|
|
if user: |
|
update_query = "UPDATE contacts SET " |
|
update_values = [] |
|
for column, value in transformed_data.items(): |
|
if column not in no_overwrite_columns: |
|
update_query += f"{column} = ?, " |
|
update_values.append(value) |
|
update_query = update_query.rstrip(", ") + " WHERE email = ?" |
|
update_values.append(email) |
|
logging.debug(f"Update query: {update_query} with values: {update_values}") |
|
cursor.execute(update_query, update_values) |
|
else: |
|
columns = ', '.join(transformed_data.keys()) |
|
placeholders = ', '.join('?' for _ in transformed_data) |
|
insert_query = f"INSERT INTO contacts ({columns}) VALUES ({placeholders})" |
|
insert_values = list(transformed_data.values()) |
|
logging.debug(f"Insert query: {insert_query} with values: {insert_values}") |
|
cursor.execute(insert_query, insert_values) |
|
|
|
conn.commit() |
|
|
|
|
|
cursor.execute("SELECT * FROM contacts WHERE email = ?", (email,)) |
|
updated_user = cursor.fetchone() |
|
updated_data = dict(zip([column[0] for column in cursor.description], updated_user)) |
|
|
|
conn.close() |
|
logging.debug(f"User with email {email} processed successfully") |
|
|
|
|
|
send_to_google_forms(updated_data, gog_url) |
|
|
|
|
|
|
|
|
|
|
|
@app.route('/send_request', methods=['POST']) |
|
def send_request(): |
|
token = request.form.get('token') |
|
min_date = request.form.get('minDate') |
|
type = request.form.get('type') |
|
url = f'https://online.bizon365.ru/api/v1/webinars/reports/getlist?minDate={min_date}&type={type}&limit=100' |
|
|
|
response = requests.get(url, headers={'X-Token': token}) |
|
|
|
if response.status_code == 200: |
|
data = response.json() |
|
webinar_ids = [item['webinarId'] for item in data['list']] |
|
return jsonify(webinar_ids) |
|
else: |
|
return jsonify({'error': 'Failed to fetch data from the API'}), response.status_code |
|
|
|
|
|
|
|
|
|
@app.route('/send_get_request', methods=['GET']) |
|
def send_get_request(): |
|
token = request.args.get('token') |
|
webinarId = request.args.get('webinarId') |
|
url = f'https://online.bizon365.ru/api/v1/webinars/reports/get?webinarId={webinarId}' |
|
|
|
try: |
|
response = requests.get(url, headers={'X-Token': token}) |
|
response.raise_for_status() |
|
data = response.json() |
|
|
|
if data is None or 'report' not in data: |
|
return jsonify({'error': 'No report data found'}), 500 |
|
|
|
report = data.get('report', {}) |
|
messages = data.get('messages', {}) |
|
|
|
if report is None: |
|
return jsonify({'error': 'No report data found in the response'}), 500 |
|
|
|
report_json_str = report.get('report', '{}') |
|
try: |
|
report_json = json.loads(report_json_str) |
|
except json.JSONDecodeError: |
|
report_json = {} |
|
|
|
messages_json_str = report.get('messages', '{}') |
|
try: |
|
messages_json = json.loads(messages_json_str) |
|
except json.JSONDecodeError: |
|
messages_json = {} |
|
|
|
users_meta = report_json.get('usersMeta', {}) |
|
|
|
processed_emails = set() |
|
for user_id, user_data in users_meta.items(): |
|
user_messages = messages_json.get(user_id, []) |
|
user_data['messages'] = user_messages |
|
email = user_data.get('email') |
|
if email and email not in processed_emails: |
|
update_or_insert_user(DATABASE_NAME, user_data, mapping_template, gog_url) |
|
processed_emails.add(email) |
|
|
|
return jsonify({'status': 'User data saved successfully'}) |
|
|
|
except requests.exceptions.RequestException as e: |
|
return jsonify({'error': f'API request failed: {str(e)}'}), 500 |
|
|
|
|
|
|
|
api_bz = "SkrIONpr3ByeSIuEaBhr1bB8u4aBhSJfH8uEpB2rk7rI_ETrn" |
|
|
|
|
|
@app.route('/webhookbz', methods=['POST']) |
|
def webhookbz(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
data = request.json |
|
webinar_id = data.get('webinarId') |
|
|
|
if not webinar_id: |
|
return jsonify({'error': 'webinarId is required'}), 400 |
|
url = f'https://online.bizon365.ru/api/v1/webinars/reports/get?webinarId={webinar_id}' |
|
|
|
response = requests.get(url, headers={'X-Token': api_bz}) |
|
|
|
|
|
if response.status_code == 200: |
|
data = response.json() |
|
|
|
report = data.get('report', {}) |
|
messages = data.get('messages', {}) |
|
|
|
report_json_str = report.get('report', '{}') |
|
try: |
|
report_json = json.loads(report_json_str) |
|
except json.JSONDecodeError: |
|
report_json = {} |
|
|
|
messages_json_str = report.get('messages', '{}') |
|
try: |
|
messages_json = json.loads(messages_json_str) |
|
except json.JSONDecodeError: |
|
messages_json = {} |
|
|
|
users_meta = report_json.get('usersMeta', {}) |
|
|
|
processed_emails = set() |
|
for user_id, user_data in users_meta.items(): |
|
user_messages = messages_json.get(user_id, []) |
|
user_data['messages'] = user_messages |
|
email = user_data.get('email') |
|
if email and email not in processed_emails: |
|
update_or_insert_user(DATABASE_NAME, user_data, mapping_template, gog_url) |
|
processed_emails.add(email) |
|
|
|
return jsonify({'status': 'User data saved successfully'}) |
|
else: |
|
return jsonify({'error': 'Failed to fetch data from the API'}), response.status_code |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/biz_v', methods=['GET']) |
|
def biz_v(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('biz_v.html') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/ver', methods=['GET']) |
|
def veref(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('ver.html') |
|
|
|
@app.route('/se_mes', methods=['GET']) |
|
def se_mes(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_mes.html') |
|
|
|
@app.route('/se_mes_im', methods=['GET']) |
|
def se_mes_im(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_mes_im.html') |
|
|
|
@app.route('/se_mes_ran', methods=['GET']) |
|
def se_mes_ran(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_mes_ran.html') |
|
|
|
@app.route('/se_mes_im_ran', methods=['GET']) |
|
def se_mes_im_ran(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_mes_im_ran.html') |
|
|
|
@app.route('/se_mes_im2', methods=['GET']) |
|
def se_mes_im2(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_mes_im2.html') |
|
|
|
@app.route('/se_mes_f', methods=['GET']) |
|
def se_mes_f(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_mes_f.html') |
|
|
|
@app.route('/up_gr', methods=['GET']) |
|
def up_gr(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('up_gr.html') |
|
|
|
@app.route('/up_user_gp', methods=['GET']) |
|
def up_user_gp(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('up_user_gp.html') |
|
|
|
@app.route('/del_user_gp', methods=['GET']) |
|
def del_user_gp(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('del_user_gp.html') |
|
|
|
@app.route('/up_ad', methods=['GET']) |
|
def up_ad(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('up_ad.html') |
|
|
|
@app.route('/del_ad', methods=['GET']) |
|
def del_ad(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('del_ad.html') |
|
|
|
@app.route('/se_opr', methods=['GET']) |
|
def se_opr(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_opr.html') |
|
|
|
@app.route('/online', methods=['GET']) |
|
def online(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('online.html') |
|
|
|
@app.route('/se_mes_f_gc', methods=['GET']) |
|
def se_mes_f_gc(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('se_mes_f_gc.html') |
|
|
|
|
|
|
|
|
|
@app.route('/bas_vk_tab', methods=['GET']) |
|
def bas_vk_otob(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('bas_vk_tab.html') |
|
|
|
|
|
|
|
@app.route('/pages_gen', methods=['GET']) |
|
def bas_pages_gen(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('pages_gen.html') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/total_users', methods=['GET']) |
|
def total_users(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
total_users_gc = 0 |
|
total_users_ras = 0 |
|
|
|
conn_gc = sqlite3.connect('data_gc.db') |
|
cursor_gc = conn_gc.cursor() |
|
cursor_gc.execute('SELECT COUNT(*) FROM contacts') |
|
total_users_gc = cursor_gc.fetchone()[0] |
|
conn_gc.close() |
|
|
|
conn_ras = sqlite3.connect('data1.db') |
|
cursor_ras = conn_ras.cursor() |
|
cursor_ras.execute('SELECT COUNT(*) FROM contacts') |
|
total_users_ras = cursor_ras.fetchone()[0] |
|
conn_ras.close() |
|
|
|
return jsonify({ |
|
"total_users_gc": total_users_gc, |
|
"total_users_ras": total_users_ras |
|
}), 200 |
|
except Exception as e: |
|
print(f"Error getting total users: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
|
|
@app.route('/all_users_gc', methods=['GET']) |
|
def all_users_gc(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
conn = sqlite3.connect('data_gc.db') |
|
cursor = conn.cursor() |
|
cursor.execute('SELECT name, phone, email FROM contacts') |
|
contacts = cursor.fetchall() |
|
conn.close() |
|
|
|
return jsonify(contacts), 200 |
|
except Exception as e: |
|
print(f"Error getting all users from data_gc: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
|
|
@app.route('/all_users_ras', methods=['GET']) |
|
def all_users_ras(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
conn = sqlite3.connect('data1.db') |
|
cursor = conn.cursor() |
|
cursor.execute('SELECT name, phone, email FROM contacts') |
|
contacts = cursor.fetchall() |
|
conn.close() |
|
|
|
return jsonify(contacts), 200 |
|
except Exception as e: |
|
print(f"Error getting all users from data_ras: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/gc_db_no_email', methods=['GET']) |
|
def gc_db_no_email(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
|
|
name_d = request.args.get('name', '') |
|
phone_d = request.args.get('phone', '') |
|
pr1_d = request.args.get('pr1', '') |
|
pr2_d = request.args.get('pr2', '') |
|
pr3_d = request.args.get('pr3', '') |
|
|
|
|
|
conn = sqlite3.connect('data_gc.db') |
|
cursor = conn.cursor() |
|
cursor.execute('SELECT email FROM contacts WHERE phone = ?', (phone_d,)) |
|
result = cursor.fetchone() |
|
email_d = result[0] if result else '' |
|
conn.close() |
|
|
|
|
|
json_data = { |
|
"user": { |
|
"email": email_d, |
|
"phone": phone_d, |
|
"first_name": name_d, |
|
"addfields": { |
|
"pr1": pr1_d, |
|
"pr2": pr2_d, |
|
"pr3": pr3_d |
|
} |
|
}, |
|
"system": { |
|
"refresh_if_exists": 1 |
|
}, |
|
"session": { |
|
"utm_source": "", |
|
"utm_medium": "", |
|
"utm_content": "", |
|
"utm_campaign": "", |
|
"utm_group": "", |
|
"gcpc": "", |
|
"gcao": "", |
|
"referer": "" |
|
} |
|
} |
|
|
|
|
|
json_str = json.dumps(json_data) |
|
params_d = base64.b64encode(json_str.encode('utf-8')).decode('utf-8') |
|
|
|
|
|
data = { |
|
'key': gc_api, |
|
'action': 'add', |
|
'params': params_d |
|
} |
|
|
|
|
|
response = requests.post(gc_url, data=data) |
|
|
|
|
|
return { |
|
'status_code': response.status_code, |
|
'response_body': response.text |
|
} |
|
except Exception as e: |
|
print(f"Error in gc_db_no_email: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
@app.route('/gc_db_email', methods=['GET']) |
|
def gc_db_email(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
|
|
name_d = request.args.get('name', '') |
|
email_d = request.args.get('email', '') |
|
phone_d = request.args.get('phone', '') |
|
pr1_d = request.args.get('pr1', '') |
|
pr2_d = request.args.get('pr2', '') |
|
pr3_d = request.args.get('pr3', '') |
|
|
|
|
|
json_data = { |
|
"user": { |
|
"email": email_d, |
|
"phone": phone_d, |
|
"first_name": name_d, |
|
"addfields": { |
|
"pr1": pr1_d, |
|
"pr2": pr2_d, |
|
"pr3": pr3_d |
|
} |
|
}, |
|
"system": { |
|
"refresh_if_exists": 1 |
|
}, |
|
"session": { |
|
"utm_source": "", |
|
"utm_medium": "", |
|
"utm_content": "", |
|
"utm_campaign": "", |
|
"utm_group": "", |
|
"gcpc": "", |
|
"gcao": "", |
|
"referer": "" |
|
} |
|
} |
|
|
|
|
|
json_str = json.dumps(json_data) |
|
params_d = base64.b64encode(json_str.encode('utf-8')).decode('utf-8') |
|
|
|
|
|
data = { |
|
'key': gc_api, |
|
'action': action_d, |
|
'params': params_d |
|
} |
|
|
|
|
|
response = requests.post(gc_url, data=data) |
|
|
|
|
|
return { |
|
'status_code': response.status_code, |
|
'response_body': response.text |
|
} |
|
except Exception as e: |
|
print(f"Error in gc_db_email: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
@app.route('/gc_forms', methods=['GET']) |
|
def gc_forms(): |
|
try: |
|
api_sys_control = request.args.get('api_sys') |
|
|
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
|
|
|
|
name_d = request.args.get('name', '') |
|
email_d = request.args.get('email', '') |
|
phone_d = request.args.get('phone', '') |
|
cod_pred = request.args.get('cod_pred', '') |
|
price = request.args.get('price', '') |
|
utm_source = request.args.get('utm_source', '') |
|
utm_medium = request.args.get('utm_medium', '') |
|
utm_content = request.args.get('utm_content', '') |
|
utm_campaign = request.args.get('utm_campaign', '') |
|
utm_group = request.args.get('utm_group', '') |
|
gcpc = request.args.get('gcpc', '') |
|
|
|
json_data = { |
|
"user": { |
|
"email": email_d, |
|
"phone": phone_d, |
|
"first_name": name_d, |
|
"addfields": { |
|
"pr1": "", |
|
"pr2": "", |
|
"pr3": "" |
|
} |
|
}, |
|
"system": { |
|
"refresh_if_exists": 1 |
|
}, |
|
"session": { |
|
"utm_source": utm_source, |
|
"utm_medium": utm_medium, |
|
"utm_content": utm_content, |
|
"utm_campaign": utm_campaign, |
|
"utm_group": utm_group, |
|
"gcpc": gcpc, |
|
"gcao": "", |
|
"referer": "" |
|
}, |
|
"deal":{ |
|
"offer_code": cod_pred, |
|
"deal_cost": price |
|
} |
|
} |
|
|
|
|
|
json_str = json.dumps(json_data) |
|
params_d = base64.b64encode(json_str.encode('utf-8')).decode('utf-8') |
|
|
|
|
|
data = { |
|
'key': gc_api, |
|
'action': action_d, |
|
'params': params_d |
|
} |
|
|
|
|
|
response = requests.post(gc_url_form, data=data) |
|
|
|
|
|
return { |
|
'status_code': response.status_code, |
|
'response_body': response.text |
|
} |
|
except Exception as e: |
|
print(f"Error in gc_db_email: {e}") |
|
return "Internal Server Error", 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
curators = ["Anna", "Ekaterina", "Ivan", "Maria", "Sergey", "Olga", "Alex", "Natalia", "Dmitry", "Elena"] |
|
|
|
|
|
mt_avp = { |
|
'name': 'Name', |
|
'phone': 'Phone', |
|
'email': 'Email' |
|
} |
|
|
|
mt_bhelp = { |
|
'name': 'name', |
|
'phone': 'phone', |
|
'email': 'email', |
|
'ad': 'ws_stop' |
|
} |
|
|
|
mt_gc = { |
|
'name': 'name', |
|
'phone': 'phone', |
|
'email': 'email', |
|
'ad': 'web_st' |
|
} |
|
|
|
mt_tl = { |
|
'name': 'name', |
|
'phone': 'phone', |
|
'email': 'email', |
|
'ad': 'ad_url' |
|
} |
|
|
|
mapp_templates = { |
|
'avp': mt_avp, |
|
'bhelp': mt_bhelp, |
|
'gc': mt_gc, |
|
'ad': mt_tl |
|
} |
|
|
|
DATABASE_NAME3 = 'data_gc.db' |
|
|
|
def add_or_update_contact(contact_data): |
|
conn = sqlite3.connect(DATABASE_NAME3) |
|
cursor = conn.cursor() |
|
|
|
email = contact_data.get('email') |
|
if not email: |
|
logging.error(f"Missing email in contact data: {contact_data}") |
|
return |
|
|
|
utc_now = datetime.utcnow() |
|
msk_tz = pytz.timezone('Europe/Moscow') |
|
msk_now = utc_now.replace(tzinfo=pytz.utc).astimezone(msk_tz) |
|
contact_data['data_t'] = msk_now.strftime('%Y-%m-%d %H:%M:%S') |
|
|
|
|
|
fields = [ |
|
'name', 'phone', 'email', 'vk_id', 'chat_id', 'ws_st', 'ws_stop', 'web_st', 'fin_prog', |
|
'b_city', 'b_fin', 'b_ban', 'b_ign', 'b_baners', 'b_butt', 'b_mess', 'shop_st', 'curator', |
|
'pr1', 'pr2', 'pr3', 'pr4', 'pr5', 'gc_url', 'key_pr', 'n_con', 'canal', 'data_on', 'data_t', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content' 'gcpc' |
|
] |
|
|
|
|
|
for field in fields: |
|
if field not in contact_data: |
|
contact_data[field] = '' |
|
|
|
placeholders = ", ".join([f"{field} = ?" for field in fields]) |
|
|
|
cursor.execute("SELECT id FROM contacts WHERE email = ?", (email,)) |
|
contact = cursor.fetchone() |
|
|
|
if contact: |
|
update_query = f"UPDATE contacts SET {placeholders} WHERE id = ?" |
|
cursor.execute(update_query, (*[contact_data[field] for field in fields], contact[0])) |
|
else: |
|
insert_query = f"INSERT INTO contacts ({', '.join(fields)}) VALUES ({', '.join(['?' for _ in fields])})" |
|
cursor.execute(insert_query, tuple(contact_data[field] for field in fields)) |
|
|
|
conn.commit() |
|
conn.close() |
|
|
|
|
|
|
|
@app.route('/add_data_ver_cur', methods=['GET']) |
|
def add_data_ver_cur(): |
|
global current_curator_index |
|
|
|
veref_on_off = request.args.get('ver', '0') |
|
curator_on_off = request.args.get('cur', '0') |
|
|
|
template_key = request.args.get('template_key', 'avp') |
|
mapping_template_cur = mapp_templates.get(template_key, mt_avp) |
|
|
|
user_data = {mapping_template_cur[key]: request.args.get(key, "") for key in mapping_template_cur} |
|
|
|
logging.debug(f"Received data: {user_data}") |
|
|
|
if curator_on_off == "1": |
|
user_data['curator'] = curators[current_curator_index] |
|
|
|
if veref_on_off == "true": |
|
phone_number = user_data.get('phone', '') |
|
if not phone_number: |
|
logging.error("Phone number is empty") |
|
return jsonify({'status': 'error', 'message': 'Phone number is empty'}), 400 |
|
|
|
phone_verification_response = verify_phone_number(phone_number) |
|
if phone_verification_response is not None: |
|
user_data['ws_st'] = phone_verification_response |
|
|
|
try: |
|
add_or_update_contact(user_data) |
|
if curator_on_off == "1": |
|
current_curator_index = (current_curator_index + 1) % len(curators) |
|
|
|
|
|
send_to_google_forms(user_data, gog_url) |
|
|
|
return jsonify({'status': 'success', 'message': f'User added with curator {user_data.get("curator", "not assigned")}'}) |
|
except Exception as e: |
|
logging.error(f"Error adding user: {e}") |
|
return jsonify({'status': 'error', 'message': str(e)}), 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DATABASE2 = 'data_gc.db' |
|
|
|
def verify_phone_number(phone_number): |
|
full_url_ver = f"{wa_url}{wa_ak}{ws_url_ver}{wa_api_key}" |
|
payload = {"phoneNumber": phone_number} |
|
headers = {'Content-Type': 'application/json'} |
|
response = requests.post(full_url_ver, headers=headers, json=payload) |
|
if response.status_code == 200: |
|
response_body = response.json() |
|
return response_body.get('existsWhatsapp', 'false') |
|
else: |
|
return "Error" |
|
|
|
def parse_csv_data(data): |
|
parsed_data = [] |
|
for item in data: |
|
for key, value in item.items(): |
|
headers = key.split(';') |
|
row = value.split(';') |
|
parsed_data.append(dict(zip(headers, row))) |
|
return parsed_data |
|
|
|
def clean_phone_number(phone_number): |
|
|
|
return re.sub(r'\D', '', phone_number) |
|
|
|
def insert_data(data, verify_phone, add_curator): |
|
global current_curator_index |
|
conn = sqlite3.connect(DATABASE2) |
|
cursor = conn.cursor() |
|
|
|
for row in data: |
|
name = row.get('Name', '') |
|
phone = row.get('Phone', '').lstrip('+') |
|
email = row.get('Email', '') |
|
data_t = row.get('Date', '').lstrip('"') |
|
|
|
|
|
phone = clean_phone_number(phone) |
|
|
|
cursor.execute("SELECT 1 FROM contacts WHERE email = ? OR phone = ?", (email, phone)) |
|
user_exists = cursor.fetchone() |
|
|
|
if user_exists: |
|
print(f"User with email {email} or phone {phone} already exists. Skipping insert.") |
|
continue |
|
|
|
if add_curator == "1": |
|
curator = curators[current_curator_index] |
|
current_curator_index = (current_curator_index + 1) % len(curators) |
|
else: |
|
curator = row.get('curator', '') |
|
|
|
if verify_phone == "1": |
|
ws_st = verify_phone_number(phone) |
|
else: |
|
ws_st = row.get('ws_st', '') |
|
|
|
columns = ['name', 'phone', 'email', 'vk_id', 'chat_id', 'ws_st', 'ws_stop', 'web_st', 'fin_prog', 'b_city', 'b_fin', 'b_ban', 'b_ign', 'b_baners', 'b_butt', 'b_mess', 'shop_st', 'curator', 'pr1', 'pr2', 'pr3', 'pr4', 'pr5', 'gc_url', 'key_pr', 'n_con', 'canal', 'data_on', 'data_t', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gcpc'] |
|
values = [name, phone, email, row.get('vk_id', ''), row.get('chat_id', ''), row.get('ws_st', ''), row.get('ws_stop', ''), row.get('web_st', 0), row.get('fin_prog', 0), row.get('b_city', ''), row.get('b_fin', ''), row.get('b_ban', ''), row.get('b_ign', ''), row.get('b_baners', ''), row.get('b_butt', ''), row.get('b_mess', ''), row.get('shop_st', ''), curator, row.get('pr1', ''), row.get('pr2', ''), row.get('pr3', ''), row.get('pr4', ''), row.get('pr5', ''), row.get('gc_url', ''), row.get('key_pr', ''), row.get('n_con', ''), row.get('canal', ''), row.get('data_on', ''), row.get('data_t', ''), row.get('utm_source', ''), row.get('utm_medium', ''), row.get('utm_campaign', ''), row.get('utm_term', ''), row.get('utm_content', ''), row.get('gcpc', '')] |
|
|
|
placeholders = ', '.join(['?' for _ in columns]) |
|
columns_str = ', '.join(columns) |
|
|
|
query = f''' |
|
INSERT INTO contacts ({columns_str}) |
|
VALUES ({placeholders}) |
|
''' |
|
|
|
try: |
|
cursor.execute(query, values) |
|
|
|
user_data = dict(zip(columns, values)) |
|
send_to_google_forms(user_data, gog_url) |
|
except Exception as e: |
|
print(f"Error inserting row: {row}") |
|
print(f"Error message: {str(e)}") |
|
conn.rollback() |
|
raise |
|
|
|
conn.commit() |
|
conn.close() |
|
|
|
@app.route('/upload_csv', methods=['POST']) |
|
def upload_csv(): |
|
if 'file' not in request.files: |
|
return jsonify({"error": "No file part"}), 400 |
|
file = request.files['file'] |
|
if file.filename == '': |
|
return jsonify({"error": "No selected file"}), 400 |
|
if file and file.filename.endswith('.csv'): |
|
stream = io.StringIO(file.stream.read().decode("UTF8"), newline=None) |
|
csv_input = csv.DictReader(stream) |
|
data = [row for row in csv_input] |
|
parsed_data = parse_csv_data(data) |
|
verify_phone = request.form.get('verify_phone', '0') |
|
add_curator = request.form.get('add_curator', '0') |
|
print(f"Verify Phone: {verify_phone}") |
|
print(f"Add Curator: {add_curator}") |
|
insert_data(parsed_data, verify_phone, add_curator) |
|
return jsonify({"message": "Data uploaded and inserted successfully"}) |
|
return jsonify({"error": "Invalid file format"}), 400 |
|
|
|
@app.route('/upl_csv', methods=['GET']) |
|
def se_upl_csv(): |
|
api_sys_control = request.args.get('api_sys') |
|
if api_sys_control != api_key_sys: |
|
return "EUR 22", 200 |
|
return render_template('upl_csv.html') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DATABASE = 'data_gc.db' |
|
|
|
|
|
def clean_phone_number_j(phone_number): |
|
return re.sub(r'\D', '', phone_number) |
|
|
|
|
|
def insert_data_j(data): |
|
conn = sqlite3.connect(DATABASE) |
|
cursor = conn.cursor() |
|
|
|
for row in data: |
|
name = row.get('name', '') |
|
phone = row.get('phone', '').lstrip('+') |
|
email = row.get('email', '') |
|
data_t = row.get('data_t', '').strip('"') |
|
|
|
|
|
phone = clean_phone_number_j(phone) |
|
|
|
cursor.execute("SELECT 1 FROM contacts WHERE email = ? OR phone = ?", (email, phone)) |
|
user_exists = cursor.fetchone() |
|
|
|
if user_exists: |
|
print(f"User with email {email} or phone {phone} already exists. Skipping insert.") |
|
continue |
|
|
|
columns = ['name', 'phone', 'email', 'vk_id', 'chat_id', 'ws_st', 'ws_stop', 'web_st', 'fin_prog', 'b_city', 'b_fin', 'b_ban', 'b_ign', 'b_baners', 'b_butt', 'b_mess', 'shop_st', 'curator', 'pr1', 'pr2', 'pr3', 'pr4', 'pr5', 'gc_url', 'key_pr', 'n_con', 'canal', 'data_on', 'data_t', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gcpc'] |
|
values = [name, phone, email, row.get('vk_id', ''), row.get('chat_id', ''), row.get('ws_st', ''), row.get('ws_stop', ''), row.get('web_st', 0), row.get('fin_prog', 0), row.get('b_city', ''), row.get('b_fin', ''), row.get('b_ban', ''), row.get('b_ign', ''), row.get('b_baners', ''), row.get('b_butt', ''), row.get('b_mess', ''), row.get('shop_st', ''), row.get('curator', ''), row.get('pr1', ''), row.get('pr2', ''), row.get('pr3', ''), row.get('pr4', ''), row.get('pr5', ''), row.get('gc_url', ''), row.get('key_pr', ''), row.get('n_con', ''), row.get('canal', ''), row.get('data_on', ''), row.get('data_t', ''), row.get('utm_source', ''), row.get('utm_medium', ''), row.get('utm_campaign', ''), row.get('utm_term', ''), row.get('utm_content', ''), row.get('gcpc', '')] |
|
|
|
placeholders = ', '.join(['?' for _ in columns]) |
|
columns_str = ', '.join(columns) |
|
|
|
query = f''' |
|
INSERT INTO contacts ({columns_str}) |
|
VALUES ({placeholders}) |
|
''' |
|
|
|
try: |
|
cursor.execute(query, values) |
|
except Exception as e: |
|
print(f"Error inserting row: {row}") |
|
print(f"Error message: {str(e)}") |
|
conn.rollback() |
|
continue |
|
|
|
conn.commit() |
|
conn.close() |
|
|
|
|
|
@app.route('/upload_json', methods=['POST']) |
|
def upload_json(): |
|
if 'file' not in request.files: |
|
return jsonify({"error": "No file part"}), 400 |
|
file = request.files['file'] |
|
if file.filename == '': |
|
return jsonify({"error": "No selected file"}), 400 |
|
if file and file.filename.endswith('.json'): |
|
data = json.load(file) |
|
insert_data_j(data) |
|
return jsonify({"message": "Data uploaded and inserted successfully"}) |
|
return jsonify({"error": "Invalid file format"}), 400 |
|
|
|
|
|
@app.route('/upl_json', methods=['GET']) |
|
def display_form(): |
|
return render_template('upload_json.html') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/gc_in', methods=['GET']) |
|
def add_data_gc_in(): |
|
global current_curator_index |
|
|
|
veref_on_off = request.args.get('ver', '0') |
|
curator_on_off = request.args.get('cur', '0') |
|
|
|
template_key = request.args.get('template_key', 'avp') |
|
mapping_template_cur = mapp_templates.get(template_key, mt_avp) |
|
|
|
user_data = {mapping_template_cur[key]: request.args.get(key, "") for key in mapping_template_cur} |
|
|
|
if curator_on_off == "1": |
|
user_data['curator'] = curators[current_curator_index] |
|
|
|
if veref_on_off == "1": |
|
phone_verification_response = verify_phone_number(user_data.get('phone', '')) |
|
if phone_verification_response is not None: |
|
user_data['ws_st'] = phone_verification_response |
|
|
|
try: |
|
add_or_update_contact(user_data) |
|
if curator_on_off == "1": |
|
current_curator_index = (current_curator_index + 1) % len(curators) |
|
return jsonify({'status': 'success', 'message': f'User added with curator {user_data.get("curator", "not assigned")}'}) |
|
except Exception as e: |
|
logging.error(f"Error adding user: {e}") |
|
return jsonify({'status': 'error', 'message': str(e)}), 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/biz_365_help_gl.js') |
|
def biz_365_glidge(): |
|
script_content = """ |
|
|
|
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Sweetalert2=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=Array(e);n<e;n++)o[n]=t[n];return o}function e(t,e,n){if("function"==typeof t?t===e:t.has(e))return arguments.length<3?e:n;throw new TypeError("Private element is not present on this object")}function n(t,e,n){return e=u(e),function(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,s()?Reflect.construct(e,n||[],u(t).constructor):e.apply(t,n))}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,n){return t.get(e(t,n))}function r(t,e,n){(function(t,e){if(e.has(t))throw new TypeError("Cannot initialize the same private elements twice on an object")})(t,e),e.set(t,n)}function a(t,e,n){return e&&function(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,p(o.key),o)}}(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t}function c(){return c="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(t,e,n){var o=function(t,e){for(;!{}.hasOwnProperty.call(t,e)&&null!==(t=u(t)););return t}(t,e);if(o){var i=Object.getOwnPropertyDescriptor(o,e);return i.get?i.get.call(arguments.length<3?t:n):i.value}},c.apply(null,arguments)}function u(t){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},u(t)}function s(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(s=function(){return!!t})()}function l(t,e){return l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},l(t,e)}function d(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var o,i,r,a,c=[],u=!0,s=!1;try{if(r=(n=n.call(t)).next,0===e);else for(;!(u=(o=r.call(n)).done)&&(c.push(o.value),c.length!==e);u=!0);}catch(t){s=!0,i=t}finally{try{if(!u&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(s)throw i}}return c}}(t,e)||v(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(e)||v(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var o=n.call(t,e);if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t,"string");return"symbol"==typeof e?e:e+""}function m(t){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},m(t)}function v(e,n){if(e){if("string"==typeof e)return t(e,n);var o={}.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?t(e,n):void 0}}var h={},g=function(t){return new Promise((function(e){if(!t)return e();var n=window.scrollX,o=window.scrollY;h.restoreFocusTimeout=setTimeout((function(){h.previousActiveElement instanceof HTMLElement?(h.previousActiveElement.focus(),h.previousActiveElement=null):document.body&&document.body.focus(),e()}),100),window.scrollTo(n,o)}))},y="swal2-",b=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","default-outline","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error"].reduce((function(t,e){return t[e]=y+e,t}),{}),w=["success","warning","info","question","error"].reduce((function(t,e){return t[e]=y+e,t}),{}),C="SweetAlert2:",A=function(t){return t.charAt(0).toUpperCase()+t.slice(1)},k=function(t){console.warn("".concat(C," ").concat("object"===m(t)?t.join(" "):t))},E=function(t){console.error("".concat(C," ").concat(t))},B=[],P=function(t){var e,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e='"'.concat(t,'" is deprecated and will be removed in the next major release.').concat(n?' Use "'.concat(n,'" instead.'):""),B.includes(e)||(B.push(e),k(e))},T=function(t){return"function"==typeof t?t():t},x=function(t){return t&&"function"==typeof t.toPromise},S=function(t){return x(t)?t.toPromise():Promise.resolve(t)},L=function(t){return t&&Promise.resolve(t)===t},O=function(){return document.body.querySelector(".".concat(b.container))},j=function(t){var e=O();return e?e.querySelector(t):null},M=function(t){return j(".".concat(t))},I=function(){return M(b.popup)},H=function(){return M(b.icon)},D=function(){return M(b.title)},q=function(){return M(b["html-container"])},V=function(){return M(b.image)},_=function(){return M(b["progress-steps"])},R=function(){return M(b["validation-message"])},N=function(){return j(".".concat(b.actions," .").concat(b.confirm))},F=function(){return j(".".concat(b.actions," .").concat(b.cancel))},U=function(){return j(".".concat(b.actions," .").concat(b.deny))},z=function(){return j(".".concat(b.loader))},K=function(){return M(b.actions)},W=function(){return M(b.footer)},Y=function(){return M(b["timer-progress-bar"])},Z=function(){return M(b.close)},$=function(){var t=I();if(!t)return[];var e=t.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(e).sort((function(t,e){var n=parseInt(t.getAttribute("tabindex")||"0"),o=parseInt(e.getAttribute("tabindex")||"0");return n>o?1:n<o?-1:0})),o=t.querySelectorAll('\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex="0"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n'),i=Array.from(o).filter((function(t){return"-1"!==t.getAttribute("tabindex")}));return f(new Set(n.concat(i))).filter((function(t){return pt(t)}))},J=function(){return Q(document.body,b.shown)&&!Q(document.body,b["toast-shown"])&&!Q(document.body,b["no-backdrop"])},X=function(){var t=I();return!!t&&Q(t,b.toast)},G=function(t,e){if(t.textContent="",e){var n=(new DOMParser).parseFromString(e,"text/html"),o=n.querySelector("head");o&&Array.from(o.childNodes).forEach((function(e){t.appendChild(e)}));var i=n.querySelector("body");i&&Array.from(i.childNodes).forEach((function(e){e instanceof HTMLVideoElement||e instanceof HTMLAudioElement?t.appendChild(e.cloneNode(!0)):t.appendChild(e)}))}},Q=function(t,e){if(!e)return!1;for(var n=e.split(/\s+/),o=0;o<n.length;o++)if(!t.classList.contains(n[o]))return!1;return!0},tt=function(t,e,n){if(function(t,e){Array.from(t.classList).forEach((function(n){Object.values(b).includes(n)||Object.values(w).includes(n)||Object.values(e.showClass||{}).includes(n)||t.classList.remove(n)}))}(t,e),e.customClass){var o=e.customClass[n];o&&("string"==typeof o||o.forEach?it(t,o):k("Invalid type of customClass.".concat(n,'! Expected string or iterable object, got "').concat(m(o),'"')))}},et=function(t,e){if(!e)return null;switch(e){case"select":case"textarea":case"file":return t.querySelector(".".concat(b.popup," > .").concat(b[e]));case"checkbox":return t.querySelector(".".concat(b.popup," > .").concat(b.checkbox," input"));case"radio":return t.querySelector(".".concat(b.popup," > .").concat(b.radio," input:checked"))||t.querySelector(".".concat(b.popup," > .").concat(b.radio," input:first-child"));case"range":return t.querySelector(".".concat(b.popup," > .").concat(b.range," input"));default:return t.querySelector(".".concat(b.popup," > .").concat(b.input))}},nt=function(t){if(t.focus(),"file"!==t.type){var e=t.value;t.value="",t.value=e}},ot=function(t,e,n){t&&e&&("string"==typeof e&&(e=e.split(/\s+/).filter(Boolean)),e.forEach((function(e){Array.isArray(t)?t.forEach((function(t){n?t.classList.add(e):t.classList.remove(e)})):n?t.classList.add(e):t.classList.remove(e)})))},it=function(t,e){ot(t,e,!0)},rt=function(t,e){ot(t,e,!1)},at=function(t,e){for(var n=Array.from(t.children),o=0;o<n.length;o++){var i=n[o];if(i instanceof HTMLElement&&Q(i,e))return i}},ct=function(t,e,n){n==="".concat(parseInt(n))&&(n=parseInt(n)),n||0===parseInt(n)?t.style.setProperty(e,"number"==typeof n?"".concat(n,"px"):n):t.style.removeProperty(e)},ut=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"flex";t&&(t.style.display=e)},st=function(t){t&&(t.style.display="none")},lt=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"block";t&&new MutationObserver((function(){ft(t,t.innerHTML,e)})).observe(t,{childList:!0,subtree:!0})},dt=function(t,e,n,o){var i=t.querySelector(e);i&&i.style.setProperty(n,o)},ft=function(t,e){e?ut(t,arguments.length>2&&void 0!==arguments[2]?arguments[2]:"flex"):st(t)},pt=function(t){return!(!t||!(t.offsetWidth||t.offsetHeight||t.getClientRects().length))},mt=function(t){return!!(t.scrollHeight>t.clientHeight)},vt=function(t){var e=window.getComputedStyle(t),n=parseFloat(e.getPropertyValue("animation-duration")||"0"),o=parseFloat(e.getPropertyValue("transition-duration")||"0");return n>0||o>0},ht=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=Y();n&&pt(n)&&(e&&(n.style.transition="none",n.style.width="100%"),setTimeout((function(){n.style.transition="width ".concat(t/1e3,"s linear"),n.style.width="0%"}),10))},gt=function(){return"undefined"==typeof window||"undefined"==typeof document},yt='\n <div aria-labelledby="'.concat(b.title,'" aria-describedby="').concat(b["html-container"],'" class="').concat(b.popup,'" tabindex="-1">\n <button type="button" class="').concat(b.close,'"></button>\n <ul class="').concat(b["progress-steps"],'"></ul>\n <div class="').concat(b.icon,'"></div>\n <img class="').concat(b.image,'" />\n <h2 class="').concat(b.title,'" id="').concat(b.title,'"></h2>\n <div class="').concat(b["html-container"],'" id="').concat(b["html-container"],'"></div>\n <input class="').concat(b.input,'" id="').concat(b.input,'" />\n <input type="file" class="').concat(b.file,'" />\n <div class="').concat(b.range,'">\n <input type="range" />\n <output></output>\n </div>\n <select class="').concat(b.select,'" id="').concat(b.select,'"></select>\n <div class="').concat(b.radio,'"></div>\n <label class="').concat(b.checkbox,'">\n <input type="checkbox" id="').concat(b.checkbox,'" />\n <span class="').concat(b.label,'"></span>\n </label>\n <textarea class="').concat(b.textarea,'" id="').concat(b.textarea,'"></textarea>\n <div class="').concat(b["validation-message"],'" id="').concat(b["validation-message"],'"></div>\n <div class="').concat(b.actions,'">\n <div class="').concat(b.loader,'"></div>\n <button type="button" class="').concat(b.confirm,'"></button>\n <button type="button" class="').concat(b.deny,'"></button>\n <button type="button" class="').concat(b.cancel,'"></button>\n </div>\n <div class="').concat(b.footer,'"></div>\n <div class="').concat(b["timer-progress-bar-container"],'">\n <div class="').concat(b["timer-progress-bar"],'"></div>\n </div>\n </div>\n').replace(/(^|\n)\s*/g,""),bt=function(){h.currentInstance.resetValidationMessage()},wt=function(t){var e,n=!!(e=O())&&(e.remove(),rt([document.documentElement,document.body],[b["no-backdrop"],b["toast-shown"],b["has-column"]]),!0);if(gt())E("SweetAlert2 requires document to initialize");else{var o=document.createElement("div");o.className=b.container,n&&it(o,b["no-transition"]),G(o,yt);var i,r,a,c,u,s,l,d,f,p="string"==typeof(i=t.target)?document.querySelector(i):i;p.appendChild(o),function(t){var e=I();e.setAttribute("role",t.toast?"alert":"dialog"),e.setAttribute("aria-live",t.toast?"polite":"assertive"),t.toast||e.setAttribute("aria-modal","true")}(t),function(t){"rtl"===window.getComputedStyle(t).direction&&it(O(),b.rtl)}(p),r=I(),a=at(r,b.input),c=at(r,b.file),u=r.querySelector(".".concat(b.range," input")),s=r.querySelector(".".concat(b.range," output")),l=at(r,b.select),d=r.querySelector(".".concat(b.checkbox," input")),f=at(r,b.textarea),a.oninput=bt,c.onchange=bt,l.onchange=bt,d.onchange=bt,f.oninput=bt,u.oninput=function(){bt(),s.value=u.value},u.onchange=function(){bt(),s.value=u.value}}},Ct=function(t,e){t instanceof HTMLElement?e.appendChild(t):"object"===m(t)?At(t,e):t&&G(e,t)},At=function(t,e){t.jquery?kt(e,t):G(e,t.toString())},kt=function(t,e){if(t.textContent="",0 in e)for(var n=0;n in e;n++)t.appendChild(e[n].cloneNode(!0));else t.appendChild(e.cloneNode(!0))},Et=function(){if(gt())return!1;var t=document.createElement("div");return void 0!==t.style.webkitAnimation?"webkitAnimationEnd":void 0!==t.style.animation&&"animationend"}(),Bt=function(t,e){var n=K(),o=z();n&&o&&(e.showConfirmButton||e.showDenyButton||e.showCancelButton?ut(n):st(n),tt(n,e,"actions"),function(t,e,n){var o=N(),i=U(),r=F();if(!o||!i||!r)return;Pt(o,"confirm",n),Pt(i,"deny",n),Pt(r,"cancel",n),function(t,e,n,o){if(!o.buttonsStyling)return void rt([t,e,n],b.styled);it([t,e,n],b.styled),o.confirmButtonColor&&(t.style.backgroundColor=o.confirmButtonColor,it(t,b["default-outline"]));o.denyButtonColor&&(e.style.backgroundColor=o.denyButtonColor,it(e,b["default-outline"]));o.cancelButtonColor&&(n.style.backgroundColor=o.cancelButtonColor,it(n,b["default-outline"]))}(o,i,r,n),n.reverseButtons&&(n.toast?(t.insertBefore(r,o),t.insertBefore(i,o)):(t.insertBefore(r,e),t.insertBefore(i,e),t.insertBefore(o,e)))}(n,o,e),G(o,e.loaderHtml||""),tt(o,e,"loader"))};function Pt(t,e,n){var o=A(e);ft(t,n["show".concat(o,"Button")],"inline-block"),G(t,n["".concat(e,"ButtonText")]||""),t.setAttribute("aria-label",n["".concat(e,"ButtonAriaLabel")]||""),t.className=b[e],tt(t,n,"".concat(e,"Button"))}var Tt=function(t,e){var n=O();n&&(!function(t,e){"string"==typeof e?t.style.background=e:e||it([document.documentElement,document.body],b["no-backdrop"])}(n,e.backdrop),function(t,e){if(!e)return;e in b?it(t,b[e]):(k('The "position" parameter is not valid, defaulting to "center"'),it(t,b.center))}(n,e.position),function(t,e){if(!e)return;it(t,b["grow-".concat(e)])}(n,e.grow),tt(n,e,"container"))};var xt={innerParams:new WeakMap,domCache:new WeakMap},St=["input","file","range","select","radio","checkbox","textarea"],Lt=function(t){if(t.input)if(qt[t.input]){var e=Ht(t.input);if(e){var n=qt[t.input](e,t);ut(e),t.inputAutoFocus&&setTimeout((function(){nt(n)}))}}else E("Unexpected type of input! Expected ".concat(Object.keys(qt).join(" | "),', got "').concat(t.input,'"'))},Ot=function(t,e){var n=I();if(n){var o=et(n,t);if(o)for(var i in function(t){for(var e=0;e<t.attributes.length;e++){var n=t.attributes[e].name;["id","type","value","style"].includes(n)||t.removeAttribute(n)}}(o),e)o.setAttribute(i,e[i])}},jt=function(t){if(t.input){var e=Ht(t.input);e&&tt(e,t,"input")}},Mt=function(t,e){!t.placeholder&&e.inputPlaceholder&&(t.placeholder=e.inputPlaceholder)},It=function(t,e,n){if(n.inputLabel){var o=document.createElement("label"),i=b["input-label"];o.setAttribute("for",t.id),o.className=i,"object"===m(n.customClass)&&it(o,n.customClass.inputLabel),o.innerText=n.inputLabel,e.insertAdjacentElement("beforebegin",o)}},Ht=function(t){var e=I();if(e)return at(e,b[t]||b.input)},Dt=function(t,e){["string","number"].includes(m(e))?t.value="".concat(e):L(e)||k('Unexpected type of inputValue! Expected "string", "number" or "Promise", got "'.concat(m(e),'"'))},qt={};qt.text=qt.email=qt.password=qt.number=qt.tel=qt.url=qt.search=qt.date=qt["datetime-local"]=qt.time=qt.week=qt.month=function(t,e){return Dt(t,e.inputValue),It(t,t,e),Mt(t,e),t.type=e.input,t},qt.file=function(t,e){return It(t,t,e),Mt(t,e),t},qt.range=function(t,e){var n=t.querySelector("input"),o=t.querySelector("output");return Dt(n,e.inputValue),n.type=e.input,Dt(o,e.inputValue),It(n,t,e),t},qt.select=function(t,e){if(t.textContent="",e.inputPlaceholder){var n=document.createElement("option");G(n,e.inputPlaceholder),n.value="",n.disabled=!0,n.selected=!0,t.appendChild(n)}return It(t,t,e),t},qt.radio=function(t){return t.textContent="",t},qt.checkbox=function(t,e){var n=et(I(),"checkbox");n.value="1",n.checked=Boolean(e.inputValue);var o=t.querySelector("span");return G(o,e.inputPlaceholder),n},qt.textarea=function(t,e){Dt(t,e.inputValue),Mt(t,e),It(t,t,e);return setTimeout((function(){if("MutationObserver"in window){var n=parseInt(window.getComputedStyle(I()).width);new MutationObserver((function(){if(document.body.contains(t)){var o,i=t.offsetWidth+(o=t,parseInt(window.getComputedStyle(o).marginLeft)+parseInt(window.getComputedStyle(o).marginRight));i>n?I().style.width="".concat(i,"px"):ct(I(),"width",e.width)}})).observe(t,{attributes:!0,attributeFilter:["style"]})}})),t};var Vt=function(t,e){var n=q();n&&(lt(n),tt(n,e,"htmlContainer"),e.html?(Ct(e.html,n),ut(n,"block")):e.text?(n.textContent=e.text,ut(n,"block")):st(n),function(t,e){var n=I();if(n){var o=xt.innerParams.get(t),i=!o||e.input!==o.input;St.forEach((function(t){var o=at(n,b[t]);o&&(Ot(t,e.inputAttributes),o.className=b[t],i&&st(o))})),e.input&&(i&&Lt(e),jt(e))}}(t,e))},_t=function(t,e){for(var n=0,o=Object.entries(w);n<o.length;n++){var i=d(o[n],2),r=i[0],a=i[1];e.icon!==r&&rt(t,a)}it(t,e.icon&&w[e.icon]),Ft(t,e),Rt(),tt(t,e,"icon")},Rt=function(){var t=I();if(t)for(var e=window.getComputedStyle(t).getPropertyValue("background-color"),n=t.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix"),o=0;o<n.length;o++)n[o].style.backgroundColor=e},Nt=function(t,e){if(e.icon||e.iconHtml){var n=t.innerHTML,o="";if(e.iconHtml)o=Ut(e.iconHtml);else if("success"===e.icon)o='\n <div class="swal2-success-circular-line-left"></div>\n <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n <div class="swal2-success-circular-line-right"></div>\n',n=n.replace(/ style=".*?"/g,"");else if("error"===e.icon)o='\n <span class="swal2-x-mark">\n <span class="swal2-x-mark-line-left"></span>\n <span class="swal2-x-mark-line-right"></span>\n </span>\n';else if(e.icon){o=Ut({question:"?",warning:"!",info:"i"}[e.icon])}n.trim()!==o.trim()&&G(t,o)}},Ft=function(t,e){if(e.iconColor){t.style.color=e.iconColor,t.style.borderColor=e.iconColor;for(var n=0,o=[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"];n<o.length;n++){dt(t,o[n],"background-color",e.iconColor)}dt(t,".swal2-success-ring","border-color",e.iconColor)}},Ut=function(t){return'<div class="'.concat(b["icon-content"],'">').concat(t,"</div>")},zt=function(t,e){var n=e.showClass||{};t.className="".concat(b.popup," ").concat(pt(t)?n.popup:""),e.toast?(it([document.documentElement,document.body],b["toast-shown"]),it(t,b.toast)):it(t,b.modal),tt(t,e,"popup"),"string"==typeof e.customClass&&it(t,e.customClass),e.icon&&it(t,b["icon-".concat(e.icon)])},Kt=function(t){var e=document.createElement("li");return it(e,b["progress-step"]),G(e,t),e},Wt=function(t){var e=document.createElement("li");return it(e,b["progress-step-line"]),t.progressStepsDistance&&ct(e,"width",t.progressStepsDistance),e},Yt=function(t,e){!function(t,e){var n=O(),o=I();if(n&&o){if(e.toast){ct(n,"width",e.width),o.style.width="100%";var i=z();i&&o.insertBefore(i,H())}else ct(o,"width",e.width);ct(o,"padding",e.padding),e.color&&(o.style.color=e.color),e.background&&(o.style.background=e.background),st(R()),zt(o,e)}}(0,e),Tt(0,e),function(t,e){var n=_();if(n){var o=e.progressSteps,i=e.currentProgressStep;o&&0!==o.length&&void 0!==i?(ut(n),n.textContent="",i>=o.length&&k("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),o.forEach((function(t,r){var a=Kt(t);if(n.appendChild(a),r===i&&it(a,b["active-progress-step"]),r!==o.length-1){var c=Wt(e);n.appendChild(c)}}))):st(n)}}(0,e),function(t,e){var n=xt.innerParams.get(t),o=H();if(o){if(n&&e.icon===n.icon)return Nt(o,e),void _t(o,e);if(e.icon||e.iconHtml){if(e.icon&&-1===Object.keys(w).indexOf(e.icon))return E('Unknown icon! Expected "success", "error", "warning", "info" or "question", got "'.concat(e.icon,'"')),void st(o);ut(o),Nt(o,e),_t(o,e),it(o,e.showClass&&e.showClass.icon)}else st(o)}}(t,e),function(t,e){var n=V();n&&(e.imageUrl?(ut(n,""),n.setAttribute("src",e.imageUrl),n.setAttribute("alt",e.imageAlt||""),ct(n,"width",e.imageWidth),ct(n,"height",e.imageHeight),n.className=b.image,tt(n,e,"image")):st(n))}(0,e),function(t,e){var n=D();n&&(lt(n),ft(n,e.title||e.titleText,"block"),e.title&&Ct(e.title,n),e.titleText&&(n.innerText=e.titleText),tt(n,e,"title"))}(0,e),function(t,e){var n=Z();n&&(G(n,e.closeButtonHtml||""),tt(n,e,"closeButton"),ft(n,e.showCloseButton),n.setAttribute("aria-label",e.closeButtonAriaLabel||""))}(0,e),Vt(t,e),Bt(0,e),function(t,e){var n=W();n&&(lt(n),ft(n,e.footer,"block"),e.footer&&Ct(e.footer,n),tt(n,e,"footer"))}(0,e);var n=I();"function"==typeof e.didRender&&n&&e.didRender(n)},Zt=function(){var t;return null===(t=N())||void 0===t?void 0:t.click()},$t=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),Jt=function(t){t.keydownTarget&&t.keydownHandlerAdded&&(t.keydownTarget.removeEventListener("keydown",t.keydownHandler,{capture:t.keydownListenerCapture}),t.keydownHandlerAdded=!1)},Xt=function(t,e){var n,o=$();if(o.length)return(t+=e)===o.length?t=0:-1===t&&(t=o.length-1),void o[t].focus();null===(n=I())||void 0===n||n.focus()},Gt=["ArrowRight","ArrowDown"],Qt=["ArrowLeft","ArrowUp"],te=function(t,e,n){t&&(e.isComposing||229===e.keyCode||(t.stopKeydownPropagation&&e.stopPropagation(),"Enter"===e.key?ee(e,t):"Tab"===e.key?ne(e):[].concat(Gt,Qt).includes(e.key)?oe(e.key):"Escape"===e.key&&ie(e,t,n)))},ee=function(t,e){if(T(e.allowEnterKey)){var n=et(I(),e.input);if(t.target&&n&&t.target instanceof HTMLElement&&t.target.outerHTML===n.outerHTML){if(["textarea","file"].includes(e.input))return;Zt(),t.preventDefault()}}},ne=function(t){for(var e=t.target,n=$(),o=-1,i=0;i<n.length;i++)if(e===n[i]){o=i;break}t.shiftKey?Xt(o,-1):Xt(o,1),t.stopPropagation(),t.preventDefault()},oe=function(t){var e=K(),n=N(),o=U(),i=F();if(e&&n&&o&&i){var r=[n,o,i];if(!(document.activeElement instanceof HTMLElement)||r.includes(document.activeElement)){var a=Gt.includes(t)?"nextElementSibling":"previousElementSibling",c=document.activeElement;if(c){for(var u=0;u<e.children.length;u++){if(!(c=c[a]))return;if(c instanceof HTMLButtonElement&&pt(c))break}c instanceof HTMLButtonElement&&c.focus()}}}},ie=function(t,e,n){T(e.allowEscapeKey)&&(t.preventDefault(),n($t.esc))},re={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap},ae=function(){Array.from(document.body.children).forEach((function(t){t.hasAttribute("data-previous-aria-hidden")?(t.setAttribute("aria-hidden",t.getAttribute("data-previous-aria-hidden")||""),t.removeAttribute("data-previous-aria-hidden")):t.removeAttribute("aria-hidden")}))},ce="undefined"!=typeof window&&!!window.GestureEvent,ue=function(){var t,e=O();e&&(e.ontouchstart=function(e){t=se(e)},e.ontouchmove=function(e){t&&(e.preventDefault(),e.stopPropagation())})},se=function(t){var e=t.target,n=O(),o=q();return!(!n||!o)&&(!le(t)&&!de(t)&&(e===n||!mt(n)&&e instanceof HTMLElement&&"INPUT"!==e.tagName&&"TEXTAREA"!==e.tagName&&(!mt(o)||!o.contains(e))))},le=function(t){return t.touches&&t.touches.length&&"stylus"===t.touches[0].touchType},de=function(t){return t.touches&&t.touches.length>1},fe=null,pe=function(t){null===fe&&(document.body.scrollHeight>window.innerHeight||"scroll"===t)&&(fe=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight="".concat(fe+function(){var t=document.createElement("div");t.className=b["scrollbar-measure"],document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e}(),"px"))};function me(t,e,n,o){X()?Ae(t,o):(g(n).then((function(){return Ae(t,o)})),Jt(h)),ce?(e.setAttribute("style","display:none !important"),e.removeAttribute("class"),e.innerHTML=""):e.remove(),J()&&(null!==fe&&(document.body.style.paddingRight="".concat(fe,"px"),fe=null),function(){if(Q(document.body,b.iosfix)){var t=parseInt(document.body.style.top,10);rt(document.body,b.iosfix),document.body.style.top="",document.body.scrollTop=-1*t}}(),ae()),rt([document.documentElement,document.body],[b.shown,b["height-auto"],b["no-backdrop"],b["toast-shown"]])}function ve(t){t=be(t);var e=re.swalPromiseResolve.get(this),n=he(this);this.isAwaitingPromise?t.isDismissed||(ye(this),e(t)):n&&e(t)}var he=function(t){var e=I();if(!e)return!1;var n=xt.innerParams.get(t);if(!n||Q(e,n.hideClass.popup))return!1;rt(e,n.showClass.popup),it(e,n.hideClass.popup);var o=O();return rt(o,n.showClass.backdrop),it(o,n.hideClass.backdrop),we(t,e,n),!0};function ge(t){var e=re.swalPromiseReject.get(this);ye(this),e&&e(t)}var ye=function(t){t.isAwaitingPromise&&(delete t.isAwaitingPromise,xt.innerParams.get(t)||t._destroy())},be=function(t){return void 0===t?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},t)},we=function(t,e,n){var o=O(),i=Et&&vt(e);"function"==typeof n.willClose&&n.willClose(e),i?Ce(t,e,o,n.returnFocus,n.didClose):me(t,o,n.returnFocus,n.didClose)},Ce=function(t,e,n,o,i){Et&&(h.swalCloseEventFinishedCallback=me.bind(null,t,n,o,i),e.addEventListener(Et,(function(t){t.target===e&&(h.swalCloseEventFinishedCallback(),delete h.swalCloseEventFinishedCallback)})))},Ae=function(t,e){setTimeout((function(){"function"==typeof e&&e.bind(t.params)(),t._destroy&&t._destroy()}))},ke=function(t){var e=I();if(e||new io,e=I()){var n=z();X()?st(H()):Ee(e,t),ut(n),e.setAttribute("data-loading","true"),e.setAttribute("aria-busy","true"),e.focus()}},Ee=function(t,e){var n=K(),o=z();n&&o&&(!e&&pt(N())&&(e=N()),ut(n),e&&(st(e),o.setAttribute("data-button-to-replace",e.className),n.insertBefore(o,e)),it([t,n],b.loading))},Be=function(t){return t.checked?1:0},Pe=function(t){return t.checked?t.value:null},Te=function(t){return t.files&&t.files.length?null!==t.getAttribute("multiple")?t.files:t.files[0]:null},xe=function(t,e){var n=I();if(n){var o=function(t){"select"===e.input?function(t,e,n){var o=at(t,b.select);if(!o)return;var i=function(t,e,o){var i=document.createElement("option");i.value=o,G(i,e),i.selected=Oe(o,n.inputValue),t.appendChild(i)};e.forEach((function(t){var e=t[0],n=t[1];if(Array.isArray(n)){var r=document.createElement("optgroup");r.label=e,r.disabled=!1,o.appendChild(r),n.forEach((function(t){return i(r,t[1],t[0])}))}else i(o,n,e)})),o.focus()}(n,Le(t),e):"radio"===e.input&&function(t,e,n){var o=at(t,b.radio);if(!o)return;e.forEach((function(t){var e=t[0],i=t[1],r=document.createElement("input"),a=document.createElement("label");r.type="radio",r.name=b.radio,r.value=e,Oe(e,n.inputValue)&&(r.checked=!0);var c=document.createElement("span");G(c,i),c.className=b.label,a.appendChild(r),a.appendChild(c),o.appendChild(a)}));var i=o.querySelectorAll("input");i.length&&i[0].focus()}(n,Le(t),e)};x(e.inputOptions)||L(e.inputOptions)?(ke(N()),S(e.inputOptions).then((function(e){t.hideLoading(),o(e)}))):"object"===m(e.inputOptions)?o(e.inputOptions):E("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(m(e.inputOptions)))}},Se=function(t,e){var n=t.getInput();n&&(st(n),S(e.inputValue).then((function(o){n.value="number"===e.input?"".concat(parseFloat(o)||0):"".concat(o),ut(n),n.focus(),t.hideLoading()})).catch((function(e){E("Error in inputValue promise: ".concat(e)),n.value="",ut(n),n.focus(),t.hideLoading()})))};var Le=function(t){var e=[];return t instanceof Map?t.forEach((function(t,n){var o=t;"object"===m(o)&&(o=Le(o)),e.push([n,o])})):Object.keys(t).forEach((function(n){var o=t[n];"object"===m(o)&&(o=Le(o)),e.push([n,o])})),e},Oe=function(t,e){return!!e&&e.toString()===t.toString()},je=void 0,Me=function(t,e){var n=xt.innerParams.get(t);if(n.input){var o=t.getInput(),i=function(t,e){var n=t.getInput();if(!n)return null;switch(e.input){case"checkbox":return Be(n);case"radio":return Pe(n);case"file":return Te(n);default:return e.inputAutoTrim?n.value.trim():n.value}}(t,n);n.inputValidator?Ie(t,i,e):o&&!o.checkValidity()?(t.enableButtons(),t.showValidationMessage(n.validationMessage||o.validationMessage)):"deny"===e?He(t,i):Ve(t,i)}else E('The "input" parameter is needed to be set when using returnInputValueOn'.concat(A(e)))},Ie=function(t,e,n){var o=xt.innerParams.get(t);t.disableInput(),Promise.resolve().then((function(){return S(o.inputValidator(e,o.validationMessage))})).then((function(o){t.enableButtons(),t.enableInput(),o?t.showValidationMessage(o):"deny"===n?He(t,e):Ve(t,e)}))},He=function(t,e){var n=xt.innerParams.get(t||je);(n.showLoaderOnDeny&&ke(U()),n.preDeny)?(t.isAwaitingPromise=!0,Promise.resolve().then((function(){return S(n.preDeny(e,n.validationMessage))})).then((function(n){!1===n?(t.hideLoading(),ye(t)):t.close({isDenied:!0,value:void 0===n?e:n})})).catch((function(e){return qe(t||je,e)}))):t.close({isDenied:!0,value:e})},De=function(t,e){t.close({isConfirmed:!0,value:e})},qe=function(t,e){t.rejectPromise(e)},Ve=function(t,e){var n=xt.innerParams.get(t||je);(n.showLoaderOnConfirm&&ke(),n.preConfirm)?(t.resetValidationMessage(),t.isAwaitingPromise=!0,Promise.resolve().then((function(){return S(n.preConfirm(e,n.validationMessage))})).then((function(n){pt(R())||!1===n?(t.hideLoading(),ye(t)):De(t,void 0===n?e:n)})).catch((function(e){return qe(t||je,e)}))):De(t,e)};function _e(){var t=xt.innerParams.get(this);if(t){var e=xt.domCache.get(this);st(e.loader),X()?t.icon&&ut(H()):Re(e),rt([e.popup,e.actions],b.loading),e.popup.removeAttribute("aria-busy"),e.popup.removeAttribute("data-loading"),e.confirmButton.disabled=!1,e.denyButton.disabled=!1,e.cancelButton.disabled=!1}}var Re=function(t){var e=t.popup.getElementsByClassName(t.loader.getAttribute("data-button-to-replace"));e.length?ut(e[0],"inline-block"):pt(N())||pt(U())||pt(F())||st(t.actions)};function Ne(){var t=xt.innerParams.get(this),e=xt.domCache.get(this);return e?et(e.popup,t.input):null}function Fe(t,e,n){var o=xt.domCache.get(t);e.forEach((function(t){o[t].disabled=n}))}function Ue(t,e){var n=I();if(n&&t)if("radio"===t.type)for(var o=n.querySelectorAll('[name="'.concat(b.radio,'"]')),i=0;i<o.length;i++)o[i].disabled=e;else t.disabled=e}function ze(){Fe(this,["confirmButton","denyButton","cancelButton"],!1)}function Ke(){Fe(this,["confirmButton","denyButton","cancelButton"],!0)}function We(){Ue(this.getInput(),!1)}function Ye(){Ue(this.getInput(),!0)}function Ze(t){var e=xt.domCache.get(this),n=xt.innerParams.get(this);G(e.validationMessage,t),e.validationMessage.className=b["validation-message"],n.customClass&&n.customClass.validationMessage&&it(e.validationMessage,n.customClass.validationMessage),ut(e.validationMessage);var o=this.getInput();o&&(o.setAttribute("aria-invalid","true"),o.setAttribute("aria-describedby",b["validation-message"]),nt(o),it(o,b.inputerror))}function $e(){var t=xt.domCache.get(this);t.validationMessage&&st(t.validationMessage);var e=this.getInput();e&&(e.removeAttribute("aria-invalid"),e.removeAttribute("aria-describedby"),rt(e,b.inputerror))}var Je={title:"",titleText:"",text:"",html:"",footer:"",icon:void 0,iconColor:void 0,iconHtml:void 0,template:void 0,toast:!1,animation:!0,showClass:{popup:"swal2-show",backdrop:"swal2-backdrop-show",icon:"swal2-icon-show"},hideClass:{popup:"swal2-hide",backdrop:"swal2-backdrop-hide",icon:"swal2-icon-hide"},customClass:{},target:"body",color:void 0,backdrop:!0,heightAuto:!0,allowOutsideClick:!0,allowEscapeKey:!0,allowEnterKey:!0,stopKeydownPropagation:!0,keydownListenerCapture:!1,showConfirmButton:!0,showDenyButton:!1,showCancelButton:!1,preConfirm:void 0,preDeny:void 0,confirmButtonText:"OK",confirmButtonAriaLabel:"",confirmButtonColor:void 0,denyButtonText:"No",denyButtonAriaLabel:"",denyButtonColor:void 0,cancelButtonText:"Cancel",cancelButtonAriaLabel:"",cancelButtonColor:void 0,buttonsStyling:!0,reverseButtons:!1,focusConfirm:!0,focusDeny:!1,focusCancel:!1,returnFocus:!0,showCloseButton:!1,closeButtonHtml:"×",closeButtonAriaLabel:"Close this dialog",loaderHtml:"",showLoaderOnConfirm:!1,showLoaderOnDeny:!1,imageUrl:void 0,imageWidth:void 0,imageHeight:void 0,imageAlt:"",timer:void 0,timerProgressBar:!1,width:void 0,padding:void 0,background:void 0,input:void 0,inputPlaceholder:"",inputLabel:"",inputValue:"",inputOptions:{},inputAutoFocus:!0,inputAutoTrim:!0,inputAttributes:{},inputValidator:void 0,returnInputValueOnDeny:!1,validationMessage:void 0,grow:!1,position:"center",progressSteps:[],currentProgressStep:void 0,progressStepsDistance:void 0,willOpen:void 0,didOpen:void 0,didRender:void 0,willClose:void 0,didClose:void 0,didDestroy:void 0,scrollbarPadding:!0},Xe=["allowEscapeKey","allowOutsideClick","background","buttonsStyling","cancelButtonAriaLabel","cancelButtonColor","cancelButtonText","closeButtonAriaLabel","closeButtonHtml","color","confirmButtonAriaLabel","confirmButtonColor","confirmButtonText","currentProgressStep","customClass","denyButtonAriaLabel","denyButtonColor","denyButtonText","didClose","didDestroy","footer","hideClass","html","icon","iconColor","iconHtml","imageAlt","imageHeight","imageUrl","imageWidth","preConfirm","preDeny","progressSteps","returnFocus","reverseButtons","showCancelButton","showCloseButton","showConfirmButton","showDenyButton","text","title","titleText","willClose"],Ge={allowEnterKey:void 0},Qe=["allowOutsideClick","allowEnterKey","backdrop","focusConfirm","focusDeny","focusCancel","returnFocus","heightAuto","keydownListenerCapture"],tn=function(t){return Object.prototype.hasOwnProperty.call(Je,t)},en=function(t){return-1!==Xe.indexOf(t)},nn=function(t){return Ge[t]},on=function(t){tn(t)||k('Unknown parameter "'.concat(t,'"'))},rn=function(t){Qe.includes(t)&&k('The parameter "'.concat(t,'" is incompatible with toasts'))},an=function(t){var e=nn(t);e&&P(t,e)};function cn(t){var e=I(),n=xt.innerParams.get(this);if(e&&!Q(e,n.hideClass.popup)){var o=un(t),i=Object.assign({},n,o);Yt(this,i),xt.innerParams.set(this,i),Object.defineProperties(this,{params:{value:Object.assign({},this.params,t),writable:!1,enumerable:!0}})}else k("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.")}var un=function(t){var e={};return Object.keys(t).forEach((function(n){en(n)?e[n]=t[n]:k("Invalid parameter to update: ".concat(n))})),e};function sn(){var t=xt.domCache.get(this),e=xt.innerParams.get(this);e?(t.popup&&h.swalCloseEventFinishedCallback&&(h.swalCloseEventFinishedCallback(),delete h.swalCloseEventFinishedCallback),"function"==typeof e.didDestroy&&e.didDestroy(),ln(this)):dn(this)}var ln=function(t){dn(t),delete t.params,delete h.keydownHandler,delete h.keydownTarget,delete h.currentInstance},dn=function(t){t.isAwaitingPromise?(fn(xt,t),t.isAwaitingPromise=!0):(fn(re,t),fn(xt,t),delete t.isAwaitingPromise,delete t.disableButtons,delete t.enableButtons,delete t.getInput,delete t.disableInput,delete t.enableInput,delete t.hideLoading,delete t.disableLoading,delete t.showValidationMessage,delete t.resetValidationMessage,delete t.close,delete t.closePopup,delete t.closeModal,delete t.closeToast,delete t.rejectPromise,delete t.update,delete t._destroy)},fn=function(t,e){for(var n in t)t[n].delete(e)},pn=Object.freeze({__proto__:null,_destroy:sn,close:ve,closeModal:ve,closePopup:ve,closeToast:ve,disableButtons:Ke,disableInput:Ye,disableLoading:_e,enableButtons:ze,enableInput:We,getInput:Ne,handleAwaitingPromise:ye,hideLoading:_e,rejectPromise:ge,resetValidationMessage:$e,showValidationMessage:Ze,update:cn}),mn=function(t,e,n){e.popup.onclick=function(){t&&(vn(t)||t.timer||t.input)||n($t.close)}},vn=function(t){return!!(t.showConfirmButton||t.showDenyButton||t.showCancelButton||t.showCloseButton)},hn=!1,gn=function(t){t.popup.onmousedown=function(){t.container.onmouseup=function(e){t.container.onmouseup=function(){},e.target===t.container&&(hn=!0)}}},yn=function(t){t.container.onmousedown=function(e){e.target===t.container&&e.preventDefault(),t.popup.onmouseup=function(e){t.popup.onmouseup=function(){},(e.target===t.popup||e.target instanceof HTMLElement&&t.popup.contains(e.target))&&(hn=!0)}}},bn=function(t,e,n){e.container.onclick=function(o){hn?hn=!1:o.target===e.container&&T(t.allowOutsideClick)&&n($t.backdrop)}},wn=function(t){return t instanceof Element||function(t){return"object"===m(t)&&t.jquery}(t)};var Cn=function(){if(h.timeout)return function(){var t=Y();if(t){var e=parseInt(window.getComputedStyle(t).width);t.style.removeProperty("transition"),t.style.width="100%";var n=e/parseInt(window.getComputedStyle(t).width)*100;t.style.width="".concat(n,"%")}}(),h.timeout.stop()},An=function(){if(h.timeout){var t=h.timeout.start();return ht(t),t}},kn=!1,En={};var Bn,Pn=function(t){for(var e=t.target;e&&e!==document;e=e.parentNode)for(var n in En){var o=e.getAttribute(n);if(o)return void En[n].fire({template:o})}},Tn=Object.freeze({__proto__:null,argsToParams:function(t){var e={};return"object"!==m(t[0])||wn(t[0])?["title","html","icon"].forEach((function(n,o){var i=t[o];"string"==typeof i||wn(i)?e[n]=i:void 0!==i&&E("Unexpected type of ".concat(n,'! Expected "string" or "Element", got ').concat(m(i)))})):Object.assign(e,t[0]),e},bindClickHandler:function(){En[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"data-swal-template"]=this,kn||(document.body.addEventListener("click",Pn),kn=!0)},clickCancel:function(){var t;return null===(t=F())||void 0===t?void 0:t.click()},clickConfirm:Zt,clickDeny:function(){var t;return null===(t=U())||void 0===t?void 0:t.click()},enableLoading:ke,fire:function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return function(t,e,n){if(s())return Reflect.construct.apply(null,arguments);var o=[null];return o.push.apply(o,e),new(t.bind.apply(t,o))}(this,e)},getActions:K,getCancelButton:F,getCloseButton:Z,getConfirmButton:N,getContainer:O,getDenyButton:U,getFocusableElements:$,getFooter:W,getHtmlContainer:q,getIcon:H,getIconContent:function(){return M(b["icon-content"])},getImage:V,getInputLabel:function(){return M(b["input-label"])},getLoader:z,getPopup:I,getProgressSteps:_,getTimerLeft:function(){return h.timeout&&h.timeout.getTimerLeft()},getTimerProgressBar:Y,getTitle:D,getValidationMessage:R,increaseTimer:function(t){if(h.timeout){var e=h.timeout.increase(t);return ht(e,!0),e}},isDeprecatedParameter:nn,isLoading:function(){var t=I();return!!t&&t.hasAttribute("data-loading")},isTimerRunning:function(){return!(!h.timeout||!h.timeout.isRunning())},isUpdatableParameter:en,isValidParameter:tn,isVisible:function(){return pt(I())},mixin:function(t){var e=function(e){function i(){return o(this,i),n(this,i,arguments)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&l(t,e)}(i,e),a(i,[{key:"_main",value:function(e,n){return(o="_main",r=this,a=c(u(i.prototype),o,r),function(t){return a.apply(r,t)})([e,Object.assign({},t,n)]);var o,r,a}}])}(this);return e},resumeTimer:An,showLoading:ke,stopTimer:Cn,toggleTimer:function(){var t=h.timeout;return t&&(t.running?Cn():An())}}),xn=function(){return a((function t(e,n){o(this,t),this.callback=e,this.remaining=n,this.running=!1,this.start()}),[{key:"start",value:function(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}},{key:"stop",value:function(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}},{key:"increase",value:function(t){var e=this.running;return e&&this.stop(),this.remaining+=t,e&&this.start(),this.remaining}},{key:"getTimerLeft",value:function(){return this.running&&(this.stop(),this.start()),this.remaining}},{key:"isRunning",value:function(){return this.running}}])}(),Sn=["swal-title","swal-html","swal-footer"],Ln=function(t){var e={};return Array.from(t.querySelectorAll("swal-param")).forEach((function(t){Vn(t,["name","value"]);var n=t.getAttribute("name"),o=t.getAttribute("value");n&&o&&("boolean"==typeof Je[n]?e[n]="false"!==o:"object"===m(Je[n])?e[n]=JSON.parse(o):e[n]=o)})),e},On=function(t){var e={};return Array.from(t.querySelectorAll("swal-function-param")).forEach((function(t){var n=t.getAttribute("name"),o=t.getAttribute("value");n&&o&&(e[n]=new Function("return ".concat(o))())})),e},jn=function(t){var e={};return Array.from(t.querySelectorAll("swal-button")).forEach((function(t){Vn(t,["type","color","aria-label"]);var n=t.getAttribute("type");n&&["confirm","cancel","deny"].includes(n)&&(e["".concat(n,"ButtonText")]=t.innerHTML,e["show".concat(A(n),"Button")]=!0,t.hasAttribute("color")&&(e["".concat(n,"ButtonColor")]=t.getAttribute("color")),t.hasAttribute("aria-label")&&(e["".concat(n,"ButtonAriaLabel")]=t.getAttribute("aria-label")))})),e},Mn=function(t){var e={},n=t.querySelector("swal-image");return n&&(Vn(n,["src","width","height","alt"]),n.hasAttribute("src")&&(e.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(e.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(e.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(e.imageAlt=n.getAttribute("alt")||void 0)),e},In=function(t){var e={},n=t.querySelector("swal-icon");return n&&(Vn(n,["type","color"]),n.hasAttribute("type")&&(e.icon=n.getAttribute("type")),n.hasAttribute("color")&&(e.iconColor=n.getAttribute("color")),e.iconHtml=n.innerHTML),e},Hn=function(t){var e={},n=t.querySelector("swal-input");n&&(Vn(n,["type","label","placeholder","value"]),e.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(e.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(e.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(e.inputValue=n.getAttribute("value")));var o=Array.from(t.querySelectorAll("swal-input-option"));return o.length&&(e.inputOptions={},o.forEach((function(t){Vn(t,["value"]);var n=t.getAttribute("value");if(n){var o=t.innerHTML;e.inputOptions[n]=o}}))),e},Dn=function(t,e){var n={};for(var o in e){var i=e[o],r=t.querySelector(i);r&&(Vn(r,[]),n[i.replace(/^swal-/,"")]=r.innerHTML.trim())}return n},qn=function(t){var e=Sn.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(t.children).forEach((function(t){var n=t.tagName.toLowerCase();e.includes(n)||k("Unrecognized element <".concat(n,">"))}))},Vn=function(t,e){Array.from(t.attributes).forEach((function(n){-1===e.indexOf(n.name)&&k(['Unrecognized attribute "'.concat(n.name,'" on <').concat(t.tagName.toLowerCase(),">."),"".concat(e.length?"Allowed attributes are: ".concat(e.join(", ")):"To set the value, use HTML within the element.")])}))},_n=function(t){var e=O(),n=I();"function"==typeof t.willOpen&&t.willOpen(n);var o=window.getComputedStyle(document.body).overflowY;Un(e,n,t),setTimeout((function(){Nn(e,n)}),10),J()&&(Fn(e,t.scrollbarPadding,o),function(){var t=O();Array.from(document.body.children).forEach((function(e){e.contains(t)||(e.hasAttribute("aria-hidden")&&e.setAttribute("data-previous-aria-hidden",e.getAttribute("aria-hidden")||""),e.setAttribute("aria-hidden","true"))}))}()),X()||h.previousActiveElement||(h.previousActiveElement=document.activeElement),"function"==typeof t.didOpen&&setTimeout((function(){return t.didOpen(n)})),rt(e,b["no-transition"])},Rn=function(t){var e=I();if(t.target===e&&Et){var n=O();e.removeEventListener(Et,Rn),n.style.overflowY="auto"}},Nn=function(t,e){Et&&vt(e)?(t.style.overflowY="hidden",e.addEventListener(Et,Rn)):t.style.overflowY="auto"},Fn=function(t,e,n){!function(){if(ce&&!Q(document.body,b.iosfix)){var t=document.body.scrollTop;document.body.style.top="".concat(-1*t,"px"),it(document.body,b.iosfix),ue()}}(),e&&"hidden"!==n&&pe(n),setTimeout((function(){t.scrollTop=0}))},Un=function(t,e,n){it(t,n.showClass.backdrop),n.animation?(e.style.setProperty("opacity","0","important"),ut(e,"grid"),setTimeout((function(){it(e,n.showClass.popup),e.style.removeProperty("opacity")}),10)):ut(e,"grid"),it([document.documentElement,document.body],b.shown),n.heightAuto&&n.backdrop&&!n.toast&&it([document.documentElement,document.body],b["height-auto"])},zn={email:function(t,e){return/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(t)?Promise.resolve():Promise.resolve(e||"Invalid email address")},url:function(t,e){return/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(t)?Promise.resolve():Promise.resolve(e||"Invalid URL")}};function Kn(t){!function(t){t.inputValidator||("email"===t.input&&(t.inputValidator=zn.email),"url"===t.input&&(t.inputValidator=zn.url))}(t),t.showLoaderOnConfirm&&!t.preConfirm&&k("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(t){(!t.target||"string"==typeof t.target&&!document.querySelector(t.target)||"string"!=typeof t.target&&!t.target.appendChild)&&(k('Target parameter is not valid, defaulting to "body"'),t.target="body")}(t),"string"==typeof t.title&&(t.title=t.title.split("\n").join("<br />")),wt(t)}var Wn=new WeakMap,Yn=function(){return a((function t(){if(o(this,t),r(this,Wn,void 0),"undefined"!=typeof window){Bn=this;for(var n=arguments.length,i=new Array(n),a=0;a<n;a++)i[a]=arguments[a];var c,u,s,l=Object.freeze(this.constructor.argsToParams(i));this.params=l,this.isAwaitingPromise=!1,c=Wn,u=this,s=this._main(Bn.params),c.set(e(c,u),s)}}),[{key:"_main",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(function(t){for(var e in!1===t.backdrop&&t.allowOutsideClick&&k('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),t)on(e),t.toast&&rn(e),an(e)}(Object.assign({},e,t)),h.currentInstance){var n=re.swalPromiseResolve.get(h.currentInstance),o=h.currentInstance.isAwaitingPromise;h.currentInstance._destroy(),o||n({isDismissed:!0}),J()&&ae()}h.currentInstance=Bn;var i=$n(t,e);Kn(i),Object.freeze(i),h.timeout&&(h.timeout.stop(),delete h.timeout),clearTimeout(h.restoreFocusTimeout);var r=Jn(Bn);return Yt(Bn,i),xt.innerParams.set(Bn,i),Zn(Bn,r,i)}},{key:"then",value:function(t){return i(Wn,this).then(t)}},{key:"finally",value:function(t){return i(Wn,this).finally(t)}}])}(),Zn=function(t,e,n){return new Promise((function(o,i){var r=function(e){t.close({isDismissed:!0,dismiss:e})};re.swalPromiseResolve.set(t,o),re.swalPromiseReject.set(t,i),e.confirmButton.onclick=function(){!function(t){var e=xt.innerParams.get(t);t.disableButtons(),e.input?Me(t,"confirm"):Ve(t,!0)}(t)},e.denyButton.onclick=function(){!function(t){var e=xt.innerParams.get(t);t.disableButtons(),e.returnInputValueOnDeny?Me(t,"deny"):He(t,!1)}(t)},e.cancelButton.onclick=function(){!function(t,e){t.disableButtons(),e($t.cancel)}(t,r)},e.closeButton.onclick=function(){r($t.close)},function(t,e,n){t.toast?mn(t,e,n):(gn(e),yn(e),bn(t,e,n))}(n,e,r),function(t,e,n){Jt(t),e.toast||(t.keydownHandler=function(t){return te(e,t,n)},t.keydownTarget=e.keydownListenerCapture?window:I(),t.keydownListenerCapture=e.keydownListenerCapture,t.keydownTarget.addEventListener("keydown",t.keydownHandler,{capture:t.keydownListenerCapture}),t.keydownHandlerAdded=!0)}(h,n,r),function(t,e){"select"===e.input||"radio"===e.input?xe(t,e):["text","email","number","tel","textarea"].some((function(t){return t===e.input}))&&(x(e.inputValue)||L(e.inputValue))&&(ke(N()),Se(t,e))}(t,n),_n(n),Xn(h,n,r),Gn(e,n),setTimeout((function(){e.container.scrollTop=0}))}))},$n=function(t,e){var n=function(t){var e="string"==typeof t.template?document.querySelector(t.template):t.template;if(!e)return{};var n=e.content;return qn(n),Object.assign(Ln(n),On(n),jn(n),Mn(n),In(n),Hn(n),Dn(n,Sn))}(t),o=Object.assign({},Je,e,n,t);return o.showClass=Object.assign({},Je.showClass,o.showClass),o.hideClass=Object.assign({},Je.hideClass,o.hideClass),!1===o.animation&&(o.showClass={backdrop:"swal2-noanimation"},o.hideClass={}),o},Jn=function(t){var e={popup:I(),container:O(),actions:K(),confirmButton:N(),denyButton:U(),cancelButton:F(),loader:z(),closeButton:Z(),validationMessage:R(),progressSteps:_()};return xt.domCache.set(t,e),e},Xn=function(t,e,n){var o=Y();st(o),e.timer&&(t.timeout=new xn((function(){n("timer"),delete t.timeout}),e.timer),e.timerProgressBar&&(ut(o),tt(o,e,"timerProgressBar"),setTimeout((function(){t.timeout&&t.timeout.running&&ht(e.timer)}))))},Gn=function(t,e){if(!e.toast)return T(e.allowEnterKey)?void(Qn(t)||to(t,e)||Xt(-1,1)):(P("allowEnterKey"),void eo())},Qn=function(t){var e,n=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=v(t))||e){n&&(t=n);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,a=!0,c=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){c=!0,r=t},f:function(){try{a||null==n.return||n.return()}finally{if(c)throw r}}}}(t.popup.querySelectorAll("[autofocus]"));try{for(n.s();!(e=n.n()).done;){var o=e.value;if(o instanceof HTMLElement&&pt(o))return o.focus(),!0}}catch(t){n.e(t)}finally{n.f()}return!1},to=function(t,e){return e.focusDeny&&pt(t.denyButton)?(t.denyButton.focus(),!0):e.focusCancel&&pt(t.cancelButton)?(t.cancelButton.focus(),!0):!(!e.focusConfirm||!pt(t.confirmButton))&&(t.confirmButton.focus(),!0)},eo=function(){document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};if("undefined"!=typeof window&&/^ru\b/.test(navigator.language)&&location.host.match(/\.(ru|su|by|xn--p1ai)$/)){var no=new Date,oo=localStorage.getItem("swal-initiation");oo?(no.getTime()-Date.parse(oo))/864e5>3&&setTimeout((function(){document.body.style.pointerEvents="none";var t=document.createElement("audio");t.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3",t.loop=!0,document.body.appendChild(t),setTimeout((function(){t.play().catch((function(){}))}),2500)}),500):localStorage.setItem("swal-initiation","".concat(no))}Yn.prototype.disableButtons=Ke,Yn.prototype.enableButtons=ze,Yn.prototype.getInput=Ne,Yn.prototype.disableInput=Ye,Yn.prototype.enableInput=We,Yn.prototype.hideLoading=_e,Yn.prototype.disableLoading=_e,Yn.prototype.showValidationMessage=Ze,Yn.prototype.resetValidationMessage=$e,Yn.prototype.close=ve,Yn.prototype.closePopup=ve,Yn.prototype.closeModal=ve,Yn.prototype.closeToast=ve,Yn.prototype.rejectPromise=ge,Yn.prototype.update=cn,Yn.prototype._destroy=sn,Object.assign(Yn,Tn),Object.keys(pn).forEach((function(t){Yn[t]=function(){var e;return Bn&&Bn[t]?(e=Bn)[t].apply(e,arguments):null}})),Yn.DismissReason=$t,Yn.version="11.12.4";var io=Yn;return io.default=io,io})),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2);"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,".swal2-popup.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.075),0 1px 2px rgba(0,0,0,.075),1px 2px 4px rgba(0,0,0,.075),1px 3px 8px rgba(0,0,0,.075),2px 4px 16px rgba(0,0,0,.075);pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{height:2em;margin:.5em;font-size:1em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-popup.swal2-toast .swal2-html-container{margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-popup.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:\"top-start top top-end\" \"center-start center center-end\" \"bottom-start bottom-center bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:rgba(0,0,0,.4)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:32em;max-width:100%;padding:0 0 1.25em;border:none;border-radius:5px;background:#fff;color:#545454;font-family:inherit;font-size:1rem}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:.8em 1em 0;color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;width:auto;margin:1.25em auto 0;padding:0}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1))}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2))}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border:0;border-radius:.25em;background:initial;background-color:#7066e0;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):focus-visible{box-shadow:0 0 0 3px rgba(112,102,224,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border:0;border-radius:.25em;background:initial;background-color:#dc3741;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):focus-visible{box-shadow:0 0 0 3px rgba(220,55,65,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border:0;border-radius:.25em;background:initial;background-color:#6e7881;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):focus-visible{box-shadow:0 0 0 3px rgba(110,120,129,.5)}div:where(.swal2-container) button:where(.swal2-styled).swal2-default-outline:focus-visible{box-shadow:0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid #eee;color:inherit;font-size:1em;text-align:center}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:5px;border-bottom-left-radius:5px}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:rgba(0,0,0,.2)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em}div:where(.swal2-container) button:where(.swal2-close){z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:color .1s,box-shadow .1s;border:none;border-radius:5px;background:rgba(0,0,0,0);color:#ccc;font-family:monospace;font-size:2.5em;cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:none;background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) .swal2-html-container{z-index:1;justify-content:center;margin:0;padding:1em 1.6em .3em;overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;word-wrap:break-word;word-break:break-word}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:border-color .1s,box-shadow .1s;border:1px solid #d9d9d9;border-radius:.1875em;background:rgba(0,0,0,0);box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(0,0,0,0);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:1px solid #b4dbed;outline:none;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:#fff}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:rgba(0,0,0,0);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:rgba(0,0,0,0);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:#fff;color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;border:0.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:#facea8;color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:#9de0f6;color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:#c9dae1;color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:swal2-show .3s}.swal2-hide{animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-show{0%{transform:scale(0.7)}45%{transform:scale(1.05)}80%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(0.5);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static !important}}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}"); |
|
""" |
|
return Response(script_content, mimetype='application/javascript') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/biz_365_help_1.js') |
|
def biz_365_bridge(): |
|
script_content = """ |
|
document.getElementById('supportButton').addEventListener('click', function() { |
|
Swal.fire({ |
|
title: 'Служба добра и заботы <br><span style="color: orange;">Ирина Дель Соль!</span>', |
|
html: ` |
|
<textarea id="supportInput" class="swal2-textarea" placeholder="Ваш вопрос"></textarea> |
|
`, |
|
showClass: { |
|
popup: 'animate__animated animate__fadeInUp animate__faster' |
|
}, |
|
hideClass: { |
|
popup: 'animate__animated animate__fadeOutDown animate__faster' |
|
}, |
|
confirmButtonText: 'Отправить', |
|
confirmButtonColor: '#079100', |
|
cancelButtonText: 'Закрыть', |
|
cancelButtonColor: '#ff0000', |
|
showCancelButton: true, |
|
showCloseButton: false, |
|
customClass: { |
|
confirmButton: 'swal2-confirm', |
|
cancelButton: 'swal2-cancel', |
|
textarea: 'swal2-textarea', |
|
popup: 'swal2-popup' |
|
}, |
|
preConfirm: () => { |
|
const question = Swal.getPopup().querySelector('#supportInput').value; |
|
if (!question) { |
|
Swal.showValidationMessage('Пожалуйста, введите ваш вопрос'); |
|
} |
|
return { question: question }; |
|
} |
|
}).then((result) => { |
|
if (result.isConfirmed) { |
|
const question = result.value.question; |
|
const encodedQuestion = encodeURIComponent(question); |
|
const whatsappUrl = `https://api.whatsapp.com/send?phone=${encodedPhone}&text=${encodedQuestion}`; |
|
window.open(whatsappUrl, '_blank'); |
|
} |
|
}); |
|
}); |
|
""" |
|
return Response(script_content, mimetype='application/javascript') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/biz_365_help_2.js') |
|
def biz_365_br2dge(): |
|
script_content = """ |
|
document.getElementById('supportButton').addEventListener('click', function() { |
|
Swal.fire({ |
|
title: '<img src="https://i.ibb.co/Vmdsys2/Screenshot-355.jpg" alt="Ирина Дель Соль"> <br> Служба добра и заботы <br><span style="color: orange;">Ирина Дель Соль!</span>', |
|
html: ` |
|
<textarea id="supportInput" class="swal2-textarea" placeholder="Ваш вопрос"></textarea> |
|
<br> |
|
<label> |
|
<input type="radio" name="phone" value="${encodedPhone1}" checked> |
|
Техподдержка Дмитрий |
|
</label> |
|
<br> |
|
<label> |
|
<input type="radio" name="phone" value="${encodedPhone2}"> |
|
Вопросы по обучению Алексей |
|
</label> |
|
`, |
|
showClass: { |
|
popup: 'animate__animated animate__fadeInUp animate__faster' |
|
}, |
|
hideClass: { |
|
popup: 'animate__animated animate__fadeOutDown animate__faster' |
|
}, |
|
confirmButtonText: 'Отправить', |
|
confirmButtonColor: '#079100', |
|
cancelButtonText: 'Закрыть', |
|
cancelButtonColor: '#ff0000', |
|
showCancelButton: true, |
|
showCloseButton: false, |
|
customClass: { |
|
confirmButton: 'swal2-confirm', |
|
cancelButton: 'swal2-cancel', |
|
textarea: 'swal2-textarea', |
|
popup: 'swal2-popup' |
|
}, |
|
preConfirm: () => { |
|
const question = Swal.getPopup().querySelector('#supportInput').value; |
|
const selectedPhone = Swal.getPopup().querySelector('input[name="phone"]:checked').value; |
|
if (!question) { |
|
Swal.showValidationMessage('Пожалуйста, введите ваш вопрос'); |
|
} |
|
return { question: question, phone: selectedPhone }; |
|
} |
|
}).then((result) => { |
|
if (result.isConfirmed) { |
|
const question = result.value.question; |
|
const selectedPhone = result.value.phone; |
|
const encodedQuestion = encodeURIComponent(question); |
|
const whatsappUrl = `https://api.whatsapp.com/send?phone=${selectedPhone}&text=${encodedQuestion}`; |
|
window.open(whatsappUrl, '_blank'); |
|
} |
|
}); |
|
}); |
|
""" |
|
return Response(script_content, mimetype='application/javascript') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/tl_help.js') |
|
def serve_vk_bridge(): |
|
script_content = """ |
|
function mySuccessFunction(form) { |
|
if (!form) return; |
|
if (form instanceof jQuery) { |
|
form = form.get(0); |
|
} |
|
|
|
var obj = {}; |
|
var inputs = form.elements; |
|
Array.prototype.forEach.call(inputs, function(input) { |
|
if (input.type === 'radio') { |
|
if (input.checked) obj[input.name] = input.value; |
|
} else { |
|
obj[input.name] = input.value; |
|
} |
|
}); |
|
|
|
var email = obj["Email"] || ""; |
|
var phone = obj["Phone"] || ""; |
|
var name = obj["Name"] || ""; |
|
console.log("name:", name); |
|
console.log("email:", email); |
|
console.log("phone:", phone); |
|
|
|
var urlParams = new URLSearchParams(window.location.search); |
|
var utm_source = urlParams.get('utm_source') || "0"; |
|
var utm_medium = urlParams.get('utm_medium') || "0"; |
|
var utm_campaign = urlParams.get('utm_campaign') || "0"; |
|
var utm_content = urlParams.get('utm_content') || "0"; |
|
var utm_term = urlParams.get('utm_term') || "0"; |
|
var gcpc = urlParams.get('gcpc') || "0"; |
|
var redirectUrl; |
|
if (form.id === formId1) { |
|
redirectUrl = new URL(redirectUrl1); |
|
} else if (form.id === formId2) { |
|
redirectUrl = new URL(redirectUrl2); |
|
} else if (form.id === formId3) { |
|
redirectUrl = new URL(redirectUrl3); |
|
} else { |
|
console.error('Неизвестный ID формы:', form.id); |
|
return; |
|
} |
|
var queryString = '?ups=' + encodeURIComponent(ups); |
|
queryString += '&name=' + encodeURIComponent(name); |
|
queryString += '&email=' + encodeURIComponent(email); |
|
queryString += '&phone=' + encodeURIComponent(phone); |
|
queryString += '&utm_source=' + encodeURIComponent(utm_source); |
|
queryString += '&utm_medium=' + encodeURIComponent(utm_medium); |
|
queryString += '&utm_campaign=' + encodeURIComponent(utm_campaign); |
|
queryString += '&utm_content=' + encodeURIComponent(utm_content); |
|
queryString += '&utm_term=' + encodeURIComponent(utm_term); |
|
queryString += '&gcpc=' + encodeURIComponent(gcpc); |
|
console.log('Сформированный URL:', redirectUrl.toString() + queryString); |
|
window.open(redirectUrl.toString() + queryString, '_blank'); |
|
} |
|
if (document.readyState !== 'loading') { |
|
us_sendFormAfterSuccess(); |
|
} else { |
|
document.addEventListener('DOMContentLoaded', us_sendFormAfterSuccess); |
|
} |
|
function us_sendFormAfterSuccess() { |
|
var forms = document.querySelectorAll('.js-form-proccess'); |
|
Array.prototype.forEach.call(forms, function(form) { |
|
form.addEventListener('tildaform:aftersuccess', function(e) { |
|
e.preventDefault(); |
|
mySuccessFunction(form); |
|
}); |
|
}); |
|
} |
|
""" |
|
return Response(script_content, mimetype='application/javascript') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
initialize_requests() |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860))) |